nothing = function() {
 //does NOTHING
};

var AJAXLibrary = { }

AJAXLibrary.Bind = function(object, method)
{
 return function () { method.apply(object, arguments) }
};
AJAXLibrary.PadLeft = function(str, len, c) {
    var out = str;
    for(var i = str.length; i < len; i++)
        out = c + out;
    return out;
};
AJAXLibrary.PadRight = function(str, len, c)
{
    var out = str;
    for(var i = str.length; i < len; i++)
        out = out + c;
    return out;
};

AJAXLibrary.Text = {};

AJAXLibrary.Text.StringBuilder = function(baseString)
{
    this.strings = [];
    this.length = 0;

    if(baseString)
    {
        this.length += baseString.length;
        this.strings.push(baseString);
    }
};

AJAXLibrary.Text.StringBuilder.prototype.Append = function(str)
{
    if(str != null)
    {
        this.length += str.length;
        this.strings.push(str);
    }
    return this;
};

AJAXLibrary.Text.StringBuilder.prototype.toString = function()
{
    return this.strings.join("");
};

AJAXLibrary.Text.StringBuilder.prototype.Clear = function ()
{
    this.length = 0;
    this.strings.length = 0;
};

AJAXLibrary.Text.StringBuilder.prototype.AppendFormat = function(format, params_)
{
    this.Append(AJAXLibrary.Text._Format(arguments));
    return this;
};

AJAXLibrary.Text.Format = function(format, params_)
{
    return AJAXLibrary.Text._Format(arguments);
};

AJAXLibrary.Text._Format = function(params_)
{
    var sb = new AJAXLibrary.Text.StringBuilder();

    var start = 0;
    var pOpen = 0, pClose = 0, ind = -1;
    var format = params_[0];

    while(start < format.length && pOpen >= 0) {
        pOpen = format.indexOf("{", start);

        if(pOpen == -1)
            sb.Append(format.substring(start));
        else {
            sb.Append(format.substring(start, pOpen));

            pClose = format.indexOf("}", pOpen);

            ind = parseInt(format.substring(pOpen + 1, pClose));

            sb.Append(params_[ind + 1]);

            start = pClose + 1;
        }
    }

    return sb.toString();
};

AJAXLibrary.ltrim = function(xstr) {
    if(xstr && xstr != null) {
        var str = xstr;
        while (str.substring(0,1) == ' ')
            str = str.substring(1, str.length);

        return str;
    } else 
        return xstr;
};

AJAXLibrary.rtrim = function(xstr)
{
    if(xstr && xstr != null) {
        var str = xstr;
        while (str.substring(str.length-1, str.length) == ' ')
            str = str.substring(0,str.length-1);
        return str;
    } else 
        return xstr;
};

AJAXLibrary.trim = function(xstr) { return AJAXLibrary.ltrim(AJAXLibrary.rtrim(xstr)); };

AJAXLibrary.LiteralToString = function(obj) {
    if(typeof(obj) == "string")
        return AJAXLibrary.Text.Format("\"{0}\"", obj);
    else if (typeof(obj) == "number" || typeof(obj) == "boolean")
        return obj.toString();
    else if (typeof(obj) == "object") {
        var sb = new AJAXLibrary.Text.StringBuilder();
        for(var field in obj) {
            var value = AJAXLibrary.LiteralToString(obj[field]);
            if(value.length > 0)
            {
                if(sb.length > 0)
                    sb.Append(",");
                sb.Append(field).Append(":").Append(value);
            }
        }
        return AJAXLibrary.Text.Format("{0}{1}{2}", "{", sb, "}");
    }
};

AJAXSettings = { PurgeTags : true, DefaultTimeOutMs : 5000 };

function ajax(op, params, handler, timeoutMs)
{
    var _timeout = typeof(timeoutMs) != "undefined" ? timeoutMs : AJAXSettings.DefaultTimeOutMs;
    
    var qs = new AJAXLibrary.Text.StringBuilder();
    var id = AJAXHandlers._newId()
    qs.Append("rand=").Append(Math.random()).Append("&op=").Append(op).Append("&hid=").Append(id);
    for(var f in params) {
        qs.Append("&").Append(f).Append("=").Append(escape(AJAXLibrary.LiteralToString(params[f])));
    }
    
    var request = new AJAXRequest(id, qs.toString(), handler);
    if(qs.length > 900)
        request._SendMultipart(_timeout);
    else
        request._Send(_timeout);
    return request;
};



AJAXRequestStatus = { InternalError : -2, TimeOut : -1, Initialized : 0, InProgress : 1, Completed : 2 };

AJAXRequest = function(id, qs, handler) {
    this._id = id;
    this._qs = qs;
    this._handler = handler;
    this.Status = AJAXRequestStatus.Initialized;
    this.Response = {};
};

AJAXRequest.prototype._HandleTimeOut = function() {
    this.Status = AJAXRequestStatus.TimeOut;
    this._Handle.apply(this, arguments);
};

AJAXRequest.prototype._HandleResult = function() {
    this.Status = AJAXRequestStatus.Completed;
    this._Handle.apply(this, arguments);
};

AJAXRequest.prototype._HandleInternalError = function(message) {
    this.Status = AJAXRequestStatus.InternalError;
    if(typeof(Debug) != "undefined" && typeof(Debug.WriteFormat) != "undefined")
        Debug.WriteFormat("Error Encountered: \"{0}\"", message)
    this._Handle.apply(this, []);
}

AJAXRequest.prototype._Handle = function() {
    //make a local copy of the handler and empty 
    var _handler = this._handler;
    this._handler = function () { };
    
    if(arguments.length > 0)
        this.Response = arguments[0];
    
    if(typeof(_handler) == "function")
    {
        //invoke the handler with this object
        _handler(this);
    }
    
    AJAXHandlers.RemoveHandler(this._id);
};
AJAXRequest.prototype.CleanUp= function() {
    if(AJAXSettings.PurgeTags == true)
    {
        setTimeout(AJAXLibrary.Bind(this, function () {
            document.getElementsByTagName("head")[0].removeChild(this.tag);
            this.tag = void(0);
        }), 1);
    } else
        this.tag = void(0);

    this._handler = null;
};  

AJAXRequest.prototype._Send = function(_timeout) {
    AJAXHandlers[this._id] = this;
    this.tag = document.createElement("script");
    this.tag.type = "text/javascript";
    this.tag.src = jsmxUri + "?" + this._qs;
    this.startMs = (new Date()).getMilliseconds();
    
    var head = document.getElementsByTagName("head")[0]
    setTimeout(AJAXLibrary.Bind(this.tag, function() { head.appendChild(this); }), 1);
    this.Status = AJAXRequestStatus.InProgress;
    
    var fn = AJAXLibrary.Bind(this, function() { if (this.Status != 2) this._HandleTimeOut(); });
    setTimeout(fn, _timeout);
};

AJAXRequest.prototype._SendMultipart = function(_timeout) {
    var data = escape(this._qs);
    
    var mpr = new AJAXRequest();
    
};

AJAXHandlers = { 
    _nextId : 0,
    _newId : function() {  AJAXHandlers._nextId++; return "h" + (AJAXHandlers._nextId-1).toString(); },
    RemoveHandler : function(id) { AJAXHandlers[id].CleanUp(); AJAXHandlers[id] = null; },
    Handler : function(id) { 
        if(AJAXHandlers[id] && AJAXHandlers[id] != null) 
            return AJAXLibrary.Bind(AJAXHandlers[id], AJAXHandlers[id]._HandleResult); 
        else
            return function() { };
    },
    InternalErrorHandler : function(id) {
        if(AJAXHandlers[id] && AJAXHandlers[id] != null) 
            return AJAXLibrary.Bind(AJAXHandlers[id], AJAXHandlers[id]._HandleInternalError); 
        else
            return function() { };
    }
};

var jsmxUri = "AccountAJAX.jsmx";
AccountAJAX = {};
AccountAJAX.ReinstateService = function (handler, periodicBillingItemId, timeoutMs) { ajax('ReinstateService', {periodicBillingItemId:periodicBillingItemId}, handler); };
AccountAJAX.CancelService = function (handler, periodicBillingItemId, timeoutMs) { ajax('CancelService', {periodicBillingItemId:periodicBillingItemId}, handler); };
AccountAJAX.GetPotentiallyAffectedConferences = function (handler, periodicBillingItemId, timeoutMs) { ajax('GetPotentiallyAffectedConferences', {periodicBillingItemId:periodicBillingItemId}, handler); };
AccountAJAX.RemoveUserOfferSelection = function (handler, uosId, timeoutMs) { ajax('RemoveUserOfferSelection', {uosId:uosId}, handler); };
AccountAJAX.PendingUnCancel = function (handler, uosId, timeoutMs) { ajax('PendingUnCancel', {uosId:uosId}, handler); };
AccountAJAX.GetEvernoteAuthorizationUri = function (handler, parentJavascriptForCallback, deniedCallback, timeoutMs) { ajax('GetEvernoteAuthorizationUri', {parentJavascriptForCallback:parentJavascriptForCallback, deniedCallback:deniedCallback}, handler); };
AccountAJAX.GetFacebookAuthorizationUri = function (handler, parentJavascriptForCallback, popup, timeoutMs) { ajax('GetFacebookAuthorizationUri', {parentJavascriptForCallback:parentJavascriptForCallback, popup:popup}, handler); };
AccountAJAX.GetTwitterAuthorizationUri = function (handler, parentJavascriptForCallback, timeoutMs) { ajax('GetTwitterAuthorizationUri', {parentJavascriptForCallback:parentJavascriptForCallback}, handler); };
AccountAJAX.GetConferenceSocialAppReminderTextLength = function (handler, wsConfId, template, timeoutMs) { ajax('GetConferenceSocialAppReminderTextLength', {wsConfId:wsConfId, template:template}, handler); };
AccountAJAX.GetConferenceSocialAppReminderTextLength1 = function (handler, template, timeoutMs) { ajax('GetConferenceSocialAppReminderTextLength1', {template:template}, handler); };
AccountAJAX.RemoveSocial = function (handler, timeoutMs) { ajax('RemoveSocial', {}, handler); };
AccountAJAX.AddSocial = function (handler, timeoutMs) { ajax('AddSocial', {}, handler); };

