/* * ***** BEGIN LICENSE BLOCK ***** * Version: ZAPL 1.1 * * The contents of this file are subject to the Zimbra AJAX Public * License Version 1.1 ("License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.zimbra.com/license * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is: Zimbra AJAX Toolkit. * * The Initial Developer of the Original Code is Zimbra, Inc. * Portions created by Zimbra are Copyright (C) 2005 Zimbra, Inc. * All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** */ /** * Resets the AjxPost object. * @constructor * @class * This singleton class makes an HTTP POST to the server and receives the response, passing returned data * to a callback. The form should be within an IFRAME, which can then be filled by the callback as * appropriate. This class is used to upload files from the client browser to the server using the file * upload feature of POST. * * @author Conrad Damon */ function AjxPost() { this._container = null; this._callback = null; } AjxPost._reqIds = 0; AjxPost._outStandingRequests = new Object(); /** * Submits the form. * * @param container the IFRAME element that holds the form * @param callback function to return to after the HTTP response is received * @param formId DOM ID of the form */ AjxPost.prototype.execute = function(container, callback, formId, optionalTimeout) { this._container = container; this._callback = callback; var doc = AjxEnv.isIE ? container.Document : container.contentDocument; var form = doc.getElementById(formId); var req = new AjxPostRequest(form, doc); var failureAction = new AjxTimedAction(); failureAction.method = this._onFailure; failureAction.obj = this; failureAction.params.add(req.id); var timeout = optionalTimeout? optionalTimeout: 5000; AjxPost._outStandingRequests[req.id] = req; req.send(failureAction, timeout); } AjxPost.prototype._onFailure = function (reqId){ var req = AjxPost._outStandingRequests[reqId]; req.cancel(); delete AjxPost._outStandingRequests[reqId]; if (this._callback) { this._callback.run([404]); this._callback = null; } } /** * Processes the HTTP response from the form post. The server needs to make sure this function is * called and passed the appropriate args. Something like the following should do the trick: * * out.println(""); * * * @param status an HTTP status * @param id the id for any attachments that were uploaded */ AjxPost.prototype.loaded = function(status, reqId, id) { var req = AjxPost._outStandingRequests[reqId]; if (req && !req.hasBeenCancelled()) { req.cancelTimeout(); } delete AjxPost._outStandingRequests[reqId]; if (this._callback) { this._callback.run([status, id]); this._callback = null; } }; function AjxPostRequest (form, doc) { this.id = AjxPost._reqIds++; this._cancelled = false; this._form = form; var inp = doc.createElement('input'); inp.type = "hidden"; inp.name = "requestId"; inp.value = this.id; //var input = Dwt.parseHtmlFragment(""); this._form.appendChild(inp); } AjxPostRequest.prototype.send = function (failureAction, timeout) { // Not sure what a fair timeout is for uploads, so for now, // we won't have a failed callback. //this._timeoutId = AjxTimedAction.scheduleAction(failureAction, timeout); this._form.submit(); }; AjxPostRequest.prototype.hasBeenCancelled = function () { return this._cancelled; }; AjxPostRequest.prototype.cancelTimeout = function () { AjxTimedAction.cancelAction(this._timeoutId); }; AjxPostRequest.prototype.cancel = function (){ this._canceled = true; };