You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2009/08/06 04:24:14 UTC

svn commit: r801499 - /wicket/sandbox/ivaynberg/wicket-ajax-multipart/src/main/java/org/apache/wicket/ajax/wicket-ajax.js

Author: ivaynberg
Date: Thu Aug  6 02:24:14 2009
New Revision: 801499

URL: http://svn.apache.org/viewvc?rev=801499&view=rev
Log:
WICKET-2420: first pass on multipart ajax support, so far only firefox seems to work ok
Issue: WICKET-2420

Modified:
    wicket/sandbox/ivaynberg/wicket-ajax-multipart/src/main/java/org/apache/wicket/ajax/wicket-ajax.js

Modified: wicket/sandbox/ivaynberg/wicket-ajax-multipart/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
URL: http://svn.apache.org/viewvc/wicket/sandbox/ivaynberg/wicket-ajax-multipart/src/main/java/org/apache/wicket/ajax/wicket-ajax.js?rev=801499&r1=801498&r2=801499&view=diff
==============================================================================
--- wicket/sandbox/ivaynberg/wicket-ajax-multipart/src/main/java/org/apache/wicket/ajax/wicket-ajax.js (original)
+++ wicket/sandbox/ivaynberg/wicket-ajax-multipart/src/main/java/org/apache/wicket/ajax/wicket-ajax.js Thu Aug  6 02:24:14 2009
@@ -1046,9 +1046,20 @@
 		return this.request.post(body);
 	},
 
+	// Submits a form using ajax
+	submitFormById: function(formId, submitButton) {
+		var form = Wicket.$(formId);
+		if (form == null || typeof (form) == "undefined")
+			Wicket.Log.error("Wicket.Ajax.Call.submitFormById: Trying to submit form with id '"+formId+"' that is not in document.");
+		return this.submitForm(form, submitButton);
+	},
+	
 	// Submits a form using ajax.
 	// This method serializes a form and sends it as POST body.
 	submitForm: function(form, submitButton) {
+	    if (this.handleMultipart(form)) {
+	    	return true;
+	    }
 	    var body = function() {
 	    	var s = Wicket.Form.serialize(form);
 	    	if (submitButton != null) {
@@ -1058,13 +1069,59 @@
 	    }
 	    return this.request.post(body);
 	},
-	
-	// Submits a form using ajax
-	submitFormById: function(formId, submitButton) {
-		var form = Wicket.$(formId);
-		if (form == null || typeof (form) == "undefined")
-			Wicket.Log.error("Wicket.Ajax.Call.submitFormById: Trying to submit form with id '"+formId+"' that is not in document.");
-		return this.submitForm(form, submitButton);
+
+	// If the form contains multipart content this function will post 
+	// the form using an iframe instead of the regular ajax call
+	// and bridge the output - transparently making this work  as if it was an ajax call
+	handleMultipart: function (form) {
+		
+	 	if (form.enctype!="multipart/form-data") {
+	 		// not handled, return false
+	 		return false;
+	 	}
+			
+		var originalFormAction=form.action;
+		var originalFormTarget=form.target;
+		
+		var iframe=document.createElement("iframe");
+		
+		//iframe.style.width="600px";
+		//iframe.style.height="300px";
+		iframe.style.display="none";
+		iframe.style.visibility="hidden";
+		
+		iframe.name="wicket-submit-"+Math.random(); // TODO make sure this is unique
+		iframe.id=iframe.name;
+		iframe.onload=this.handleMultipartComplete.bind(this);
+		
+		document.body.appendChild(iframe);
+		
+		// reconfigure the form
+		form.target=iframe.name;
+		form.action=this.request.url;
+
+		//submit the form into the iframe, response will be handled by the onload callback
+		form.submit();
+
+		// handled, restore state and return true
+		form.action=originalFormAction;
+		form.target=originalFormTarget;
+		
+ 		return true;
+ 	},
+ 
+ 	// Completes the multipart ajax handling started via handleMultipart()
+	handleMultipartComplete: function (event) {
+		var iframe=event.target;
+
+		// process the response
+		this.loadedCallback(iframe.contentWindow.document);
+
+		// stop the event
+		if (event.stopPropagation) { event.stopPropagation(); } else {event.cancelBubble=true;}
+
+		// remove the iframe
+		document.body.removeChild(iframe);
 	},
 	
 	// Processes the response