mypackage_wrt/ForumPostForm.js
changeset 42 20be4dd42b12
child 44 48bcd0bbc1ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mypackage_wrt/ForumPostForm.js	Fri Apr 30 15:01:03 2010 +0100
@@ -0,0 +1,347 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+var allowRetry = true;
+function ForumPostForm(aParentView, forumid) {
+	ListView.prototype.init.call(this, null, null);
+	this.previousView = aParentView;
+	this.forumid = forumid;
+	
+	// add the banner / 'title bar' - avoids the caption bug
+	var titleBar = new NavigationButton(null, "titlebar.png", "New thread in " + aParentView.feedName);
+	titleBar.setEnabled(false);
+	this.addControl(titleBar);
+	
+	// add topic name textfield
+	this.topicNameTf = new TextField('threadPostTopic', "Topic title", "");
+	this.addControl(this.topicNameTf);
+	
+	// add content textarea
+	this.contentTa = new TextArea('threadPostContent', "Message", "", 6);
+	this.addControl(this.contentTa);
+	
+	var self = this;
+
+    // post button
+    this.postButton = new FormButton(null, "Submit");
+    this.postButton.addEventListener("ActionPerformed", function(){
+		isHideNotifications = false;
+		login( function(){
+			submitNewTopic(
+				self.topicNameTf.getText(), // title
+				self.contentTa.getText(), // message
+				self.forumid, // forumid
+				function() { self.goBack();uiManager.currentView.update(true);}
+				);
+			});
+		});
+    this.addControl(this.postButton);
+    
+    // cancel settings button
+    this.cancelButton = new FormButton(null, "Cancel");
+    this.cancelButton.addEventListener("ActionPerformed", function(){self.goBack();});
+    this.addControl(this.cancelButton);
+	
+}
+
+ForumPostForm.prototype = new ListView(null, null);
+
+
+function ForumReplyForm(aParentView, threadid, postid, parentTitle) {
+	ListView.prototype.init.call(this, null, null);
+	this.previousView = aParentView;
+	this.threadid = threadid;
+	this.postid = postid;
+	this.parentTitle = parentTitle;
+	
+	// add the banner / 'title bar' - avoids the caption bug
+	var titleBar = new NavigationButton(null, "titlebar.png", "Reply to " + parentTitle);
+	titleBar.setEnabled(false);
+	this.addControl(titleBar);
+	
+	// add topic name textfield
+	this.topicNameTf = new TextField('threadPostTopic', "Title", "");
+	this.addControl(this.topicNameTf);
+	
+	// add content textarea
+	this.contentTa = new TextArea('threadPostContent', "Message", "", 6);
+	this.addControl(this.contentTa);
+	
+	var self = this;
+
+    // post button
+    this.postButton = new FormButton(null, "Submit");
+    this.postButton.addEventListener("ActionPerformed", function(){
+		isHideNotifications = false;
+		login(
+		function(){
+			submitNewReply(self.topicNameTf.getText(), // title
+			 self.contentTa.getText(), // message
+			 self.threadid, // threadid
+			 self.postid, // threadid
+			 function(){
+				self.goBack();
+				uiManager.currentView.update(true);
+			});
+		});
+	});
+    this.addControl(this.postButton);
+    
+    // cancel settings button
+    this.cancelButton = new FormButton(null, "Cancel");
+    this.cancelButton.addEventListener("ActionPerformed", function(){self.goBack();});
+    this.addControl(this.cancelButton);
+	
+}
+
+ForumReplyForm.prototype = new ListView(null, null);
+
+
+// Submitting a new to vBulletin is somewhat complex. There appears to be
+// no XML based interface so we have to go through the usual web posting
+// procedure. So, first we must be logged in. Then, we must request forums
+// home page to get bbsessionhash cookie. Next, we request the form,
+// to collect required security information (securitytoken etc) from the form.
+// If all goes well, we can now post a message.
+
+var submitUrlContent = null;
+var submitUrlHttpReq = null;
+var submitCallback = null;
+var submitTitle = null;
+var submitContent = null;
+var submitForumId = null;
+var submitThreadId = null;
+var submitPostId = null;
+var submitCallback = null;
+var reply = false;
+
+// Initiates the submission process by requesting the form
+function submitNewTopic(title, content, forumid, callback){
+	uiManager.showNotification(-1, "wait", "Submitting...", -1);
+	isHideNotifications = false;
+
+	// Dealing with vBulletin nastiness...
+	
+	// ensure we have all the cookies we need
+	var vbCookieGet = new Ajax();
+	var vburl = symbianOrgBaseUrl + "/forum/";
+	vbCookieGet.open('GET', vburl, false);
+	vbCookieGet.send(null);
+
+	// Now we have to harvest some info from the post form. 	
+	submitUrlHttpReq = new Ajax();
+	var self = this;
+	submitTitle = title;
+	submitContent = content;
+	submitForumId = forumid;
+	submitThreadId = null;
+	submitPostId = null;
+	submitCallback = callback;
+    submitUrlHttpReq.onreadystatechange = submitFormReady;
+	reply = false;
+	
+	var url = symbianOrgBaseUrl + "/forum/newthread.php?do=newthread&f=" + forumid;
+	submitUrlHttpReq.open('GET', url, true);
+	submitUrlHttpReq.send(null);
+}
+
+// Initiates the submission process by requesting the form
+function submitNewReply(title, content, threadid, postid, callback){
+	uiManager.showNotification(-1, "wait", "Submitting...", -1);
+	isHideNotifications = false;
+	
+	// Dealing with vBulletin nastiness...
+	
+	// ensure we have all the cookies we need
+	var vbCookieGet = new Ajax();
+	var vburl = symbianOrgBaseUrl + "/forum/";
+	vbCookieGet.open('GET', vburl, false);
+	vbCookieGet.send(null);
+
+	// Now we have to harvest some info from the post form. 	
+	submitUrlHttpReq = new Ajax();
+	var self = this;
+	submitTitle = title;
+	submitContent = content;
+	submitForumId = null;
+	submitThreadId = threadid;
+	submitPostId = postid;
+	submitCallback = callback;
+    submitUrlHttpReq.onreadystatechange = submitFormReady;
+	reply = true;
+	
+	var url = symbianOrgBaseUrl + "/forum/newreply.php?do=newreply&noquote=1&p=" + postid;
+	submitUrlHttpReq.open('GET', url, true);
+	submitUrlHttpReq.send(null);
+}
+
+
+var forumPostHarvestString_loggedinuser = "name=\"loggedinuser\" value=\"";
+var forumPostHarvestString_poststarttime = "name=\"poststarttime\" value=\"";		
+var forumPostHarvestString_posthash = "name=\"posthash\" value=\"";		
+var forumPostHarvestString_securitytoken = "name=\"securitytoken\" value=\"";		
+		
+// Form has been received, extract important info
+function submitFormReady(){
+	uiManager.showNotification(-1, "wait", "Submitting...", -1);
+	isHideNotifications = false;
+    if (submitUrlHttpReq.readyState == 4) {
+        // attempt to get response status
+        var responseStatus = null;
+        try {
+            responseStatus = submitUrlHttpReq.status;
+        } catch (noStatusException) {}
+        
+		
+		var content = submitUrlHttpReq.responseText;
+		checkForSecurityToken("submitFormReady", content);
+
+		// this is what we need to hardvest
+		var forumPostSecurityToken, forumPostHash, forumPostStartTime, forumPostLoggedInUser;
+		
+		if ( content.indexOf(forumPostHarvestString_loggedinuser) == -1 ) {
+			uiManager.showNotification(5000, "warning", "Submit failed.");	
+		} else {
+			forumPostLoggedInUser = extractFormField(content, forumPostHarvestString_loggedinuser);
+			forumPostStartTime = extractFormField(content, forumPostHarvestString_poststarttime);
+			forumPostHash = extractFormField(content, forumPostHarvestString_posthash);
+			forumPostSecurityToken = extractFormField(content, forumPostHarvestString_securitytoken);
+			
+			if (forumPostSecurityToken == null || forumPostSecurityToken.length < 5) {
+				if (!allowRetry) {
+					uiManager.showNotification(3000, "warning", "Failed, please try again...");
+				}
+				else {
+				    // workaround for a vBulletin bug, restart the process...
+					isHideNotifications = true;
+					login( function(){
+						if (reply) {
+							submitNewReply(submitTitle, // title
+							 submitContent, // message
+							 submitThreadId, // threadid
+							 submitPostId, // threadid
+							 submitCallback);
+						}
+						else {
+							submitNewTopic(submitTitle, // title
+								 submitContent, // message
+								 submitForumId, // forumid
+								 submitCallback);
+						}
+					});
+					// avoid loop
+					allowRetry = false;
+				}
+			} else {
+				doSubmitPost(submitTitle, submitContent, submitForumId, submitCallback, forumPostSecurityToken, forumPostHash, forumPostStartTime, forumPostLoggedInUser);
+			}
+		}
+    }
+}
+
+// Send a POST request with our post information
+function doSubmitPost(title, message, forumid, callback, 
+			forumPostSecurityToken, forumPostHash, forumPostStartTime, forumPostLoggedInUser){
+	uiManager.showNotification(-1, "wait", "Submitting...", -1);
+	isHideNotifications = false;
+	var url = null;
+	var parameters = null;
+	
+	if (reply) {
+		// posting a reply to an article
+		url = symbianOrgNewReplyUrl + "do=postreply&t=" + submitThreadId;
+		parameters = "title=" + title + "&message=" + message +
+		"&wysiwyg=0&iconid=0&s=&securitytoken=" + forumPostSecurityToken +
+		"&do=postreply" +
+		"&t=" + submitThreadId + "&p=" + submitPostId + 
+		"&specifiedpost=0" +
+		"&posthash" + forumPostHash +
+		"&poststarttime=" + forumPostStartTime +
+		"&loggedinuser=" + forumPostLoggedInUser +
+		"&multiquoteempty=&sbutton=Submit+Reply&parseurl=1&emailupdate=9999&rating=0";
+	} else {
+		// posting a new thread
+		url = symbianOrgNewThreadUrl + "do=postthread&f=" + forumid;
+		parameters = "do=postthread&f=" + forumid + "&subject=" + title + "&message=" + message +
+		"&wysiwyg=0&taglist=&iconid=0&s=&securitytoken=" + forumPostSecurityToken +
+		"&posthash" + forumPostHash +
+		"&poststarttime=" + forumPostStartTime +
+		"&loggedinuser=" + forumPostLoggedInUser +
+		"&sbutton=Submit+New+Thread&parseurl=1&emailupdate=9999&polloptions=4";
+	}
+	
+	submitUrlHttpReq = new Ajax();
+    submitUrlHttpReq.onreadystatechange = submitComplete;
+    // initiate the request
+	submitUrlHttpReq.open('POST', url, true);
+	submitUrlHttpReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+	submitUrlHttpReq.setRequestHeader("Content-length", parameters.length);
+	submitUrlHttpReq.setRequestHeader("Connection", "close");
+	submitUrlHttpReq.send(parameters);
+}
+
+// Response to our POST has been received, analyse the result
+function submitComplete(){
+    if (submitUrlHttpReq.readyState == 4) {
+		// attempt to get response status
+		var responseStatus = null;
+		try {
+			responseStatus = submitUrlHttpReq.status;
+		} 
+		catch (noStatusException) {
+		}
+		var content = submitUrlHttpReq.responseText;
+		if ( content.indexOf(submitTitle) == -1 ) {
+			uiManager.showNotification(3000, "warning", "Posting failed.");	
+		} else {
+			uiManager.showNotification(3000, "warning", "Please wait...");	
+			if ( submitCallback != null ) {
+				submitCallback.call();
+			}
+		}
+	}	
+}
+
+// Test weather page HTML contains a login form. This is useful in
+// being able to tell weather a login has been successfull, or if
+// we received login prompt instead of XML at any point.
+function isLoginPrompt (text) {
+	return text.indexOf("<title>Sign in</title>") != -1;
+}
+
+// Stores the current view, then shows the settings dialog
+// so that once settings dialog is closed, we go back to current screen
+function promptForPassword() {
+		if (uiManager.currentView == settings) {
+			settings.previousView = home;
+		}
+		else {
+			settings.previousView = uiManager.currentView;
+		}
+		uiManager.hideNotification();
+		settings.show();
+}
+
+function extractFormField(content, harvestString){
+	var startind = content.indexOf(harvestString);
+	if ( startind == -1 ) {
+		return null;
+	}
+	startind += harvestString.length;
+	var endind = content.indexOf("\"", startind);
+	return content.substring(startind, endind);
+}
+
+function checkForSecurityToken(where, content) {
+//	var stpos = content.indexOf("securitytoken");
+//	if ( stpos == -1 ) {
+//		var test = content.substring(stpos , stpos + 100);
+//		alert("securityToken not found in " + where + " : "+ test);
+//	}
+}