//////// SocketServer.js //////////
function SocketServer()
{
    // properties
    this.serverip = "127.0.0.1";
    this.serverport = "15432";
    // method definitions, here in the object to make them private:
    function processQueue()
    {
        var blogtype = preferences.blogtype.value;
        var hostname = preferences.bloghost.value;
        var blogurl = preferences.blogurl.value;
        var blogip = preferences.blogserverip.value;
        var blogserverport = preferences.blogserverport.value;
        var stringCmd = "nohup Resources/BlogPost/Perls/processqueue.pl blogtype=" + blogtype + " bloghost=" + hostname + " blogurl=" + blogurl + " blogip=" + blogip + " blogserverport=" + blogserverport + " >/tmp/processqueue.stdout 2>/tmp/processqueue.stderr &";
        var ret = runCommand(stringCmd);
    }
    function startServer()
    {
        var ret = runCommand("nohup Resources/BlogPost/SocketServer/socketserver >/tmp/socketserver.stdout 2>/tmp/socketserver.stderr &");
    }
    function stopServer()
    {
	var url = new URL();
        var ret = url.fetch("http://" + this.serverip + ":" + this.serverport + "/stopserver/");
	if (ret == "DECREMENT")
	{
	    //alert("BlogPost Widget released hold on the socketserver (others retain hold, so server is still running).");
	}
	else
	{
	    //alert("BlogPost Widget shut down the socketserver.");
	}
    }
    // message is escaped, blogurl, title, link, author are escaped
    // unneeded params can be the string NULL
    function sendBlog(appkey, blogid, user, pass, title, link, author, message, blogtype, bloghost, blogurl, blogserverip, blogserverport)
    {
	var url = new URL();
	var blogcommand;
        if (blogtype == "blogger") { blogcommand = "blog-xmlrpc-post"; }
        else if (blogtype == "metaweblog") { blogcommand = "metablog-xmlrpc-post"; }
        else { alert("sendBlog failed with no known blogtype: " + blogtype); return; }
        var ret = url.fetch("http://" + this.serverip + ":" + this.serverport + "/" + blogcommand + "/" + bloghost + "/" + blogurl + "/" + blogserverip + "/" + blogserverport + "/?appkey=" + appkey + "&blogid=" + blogid + "&user=" + user + "&pass=" + pass + "&message=" + message + "&title=" + title + "&link=" + link + "&author=" + author);
	if ((ret.indexOf("-") == 0) || (ret.indexOf("1") == 0) || (ret.indexOf("2") == 0))
	{
		ret = ret.substr(0,3);
		var regexStr = / |\n/g;
		ret = ret.replace(regexStr, "");
	}
	//alert("sendblogret:" + ret);
	if ((ret.indexOf("Exception") >= 0) || (ret.indexOf("Error") >= 0))
	{
	   return "-2";
	}
	else if (ret.indexOf("success") >= 0) // if it wasn't an error, it was a success
	{
	   return "1";
	}
	else // unless it was a response code
	{
	   return ret;
	}
    }
    function getErrortext(errCode)
    {
	var regexStr = /\n/g;
	errCode = errCode.replace(regexStr, "");
	//alert("errcode+" + errCode);
        if ((errCode == "-1") || (errCode == "-1\n"))
	{
	    return "Offline queue of your Blog message was not successful.";
	}
	else if ((errCode == "-2") || (errCode == "-2\n"))
	{
	    return "The socketserver failed critically.  It could have been that Blogger gave a response indicating that you set invalid data -- wrong username, wrong password, wrong BlogID, wrong appkey.  If you have verified this information is correct, try restarting it by closing all Widgets that use it, and when all are closed, open them again.";
	}
	else if ((errCode == "-3") || (errCode == "-3\n"))
	{
	    return "The guestpost.pl script failed critically.  It could have been that Blogger gave a response indicating that you set invalid data -- wrong username, wrong password, wrong BlogID, wrong appkey.  If you have verified this information is correct, please send an email to 0@zeroaltitude.org explaining as well as you can what was going on when you got this failure.";
	}
	else if ((errCode == "-4") || (errCode == "-4\n"))
	{
	    return "There was no Blog APPKEY set in your preferences for this post.  Please set that value, and try again.";
	}
	else if ((errCode == "-5") || (errCode == "-5\n"))
	{
	    return "There was no Blog ID set in your preferences for this post.  Please set that value, and try again.";
	}
	else if ((errCode == "-6") || (errCode == "-6\n"))
	{
	    return "There was no Blog UserID set in your preferences for this post.  Please set that value, and try again.";
	}
	else if ((errCode == "-7") || (errCode == "-7\n"))
	{
	    return "There was no Blog Password set in your preferences for this post.  Please set that value, and try again.";
	}
	else if ((errCode == "-8") || (errCode == "-8\n"))
	{
	    return "There was no message sent with this post.  Please make sure to type your message before posting.";
	}
	else if ((errCode == "-9") || (errCode == "-9\n"))
	{
	    return "You sent no command!  How did you do that!";
	}
	else if ((errCode == "-10") || (errCode == "-10\n"))
	{
	    return "You sent no command data!  How did you do that!";
	}
	else if ((errCode == "-11") || (errCode == "-11\n"))
	{
	    return "You sent a command I've never heard of!  How did you do that!";
	}
	else if ((errCode == "-12") || (errCode == "-12\n"))
	{
	    return "You sent a method I've never heard of!  How did you do that!";
	}
	else if ((errCode == "-13") || (errCode == "-13\n"))
	{
	    return "Some Blog data was missing, either the APPKEY, BlogID, Blog username, Blog password or a message.  Make sure to set all of your Blog preferences and try again!";
	}
        else if ((errCode == "-14") || (errCode == "-14\n"))
        {
            return "There was no known blogtype specified.  Re-run the Expert Wizard (set your Blog Username to blank, and restart the Widget).";
        }
        else
        {
            return errCode;
        }
    }
    // methods
    this.startServer = startServer;
    this.stopServer = stopServer;
    this.sendBlog = sendBlog;
    this.processQueue = processQueue;
    this.getErrortext = getErrortext;
}
//////// end SocketServer.js ////////

//////// wizards forms //////////////
function expertBloggingForm1()
{
       // blogging form
       var formfields = new Array();
       formfields[0] = new FormField();
       formfields[0].name = "blogid";
       formfields[0].type = "text";
       formfields[0].title = "BlogID:";
       formfields[0].description = "This is where you enter your blogger.com BlogID.  Your BlogID can be discovered by visiting your Blog editing form at blogger.com, and looking at the very end of the URL in your browser's location bar while you are editing it.  It will look something like ?blogid=####.  Those numbers are your BlogID!  Enter them here!";
       formfields[0].defaultValue = preferences.blogid.value;
       formfields[1] = new FormField();
       formfields[1].name = "uname";
       formfields[1].type = "text";
       formfields[1].title = "Username:";
       formfields[1].description = "This is where you enter your blogger.com username.  Your username is the name you use to log into blogger.com.  Enter that here!";
       formfields[1].defaultValue = preferences.uname.value;
       formfields[2] = new FormField();
       formfields[2].name = "pword";
       formfields[2].type = "text";
       formfields[2].title = "Password:";
       formfields[2].description = "This is where you enter your blogger.com password.  Your password is the one you use to log into blogger.com.  Enter that here!";
       formfields[2].defaultValue = preferences.pword.value;

       formfields[3] = new FormField();
       formfields[3].name = "blogtype";
       formfields[3].type = "text";
       formfields[3].title = "Blog Type:";
       formfields[3].description = "This is where you enter the type of blog you will be interacting with.  There are two kinds of blogs: 'blogger' and 'metaweblog'.  Blogger weblogs use the Blogger API.  Blogger and movableType are both 'blogger' type blogs.  Other weblogs use the metaWeblog API; an example of such is Manilasites.  You have to know the API your blogging tool uses to get this answer right.  For Blogger, movableType and any other Blogger API weblog, type 'blogger' here.  For any, including Manila, that use the metaWeblog API, type 'metaweblog' here.";
       formfields[3].defaultValue = preferences.blogtype.value;

       formfields[4] = new FormField();
       formfields[4].name = "bloghost";
       formfields[4].type = "text";
       formfields[4].title = "Blogger Hostname:";
       formfields[4].description = "This is where you enter the hostname of the server that hosts the Blogger or metaWeblog API handling script.  Blogger's host is plant.blogger.com.  Others, such as movableType, have a hostname dependent on where you, the end-user, installed your blogging tool.  You have to know what you're doing to get this right.  Type 'plant.blogger.com' here if you use Blogger.  Otherwise, type in the hostname of the server that hosts your blogging tool (this is probably something like SERVERNAME in http://SERVERNAME/YOUR_BLOG/BLOG.HTML).";
       formfields[4].defaultValue = preferences.bloghost.value;

       var results = new Array();
       results = form(formfields, 'BlogPost', 'Next', 'Cancel');
       return results;
}
function expertBloggingForm2()
{
       var formfields = new Array();
       formfields[0] = new FormField();
       formfields[0].name = "blogurl";
       formfields[0].type = "text";
       formfields[0].title = "Blog API URL:";
       formfields[0].description = "This is where you enter the path to the script that handles API calls for your blogging tool.  For Blogger, this is '/api/RPC2'.  It varies widely for other tools.  You have to know the URL to the Blogger XML-RPC handler script (or metaWeblog XML-RPC handler script) for your individual system.  Type '/api/RPC2' here if you use Blogger.  Type the path to your individual API handler if not Blogger.";
       formfields[0].defaultValue = preferences.blogurl.value;

       formfields[1] = new FormField();
       formfields[1].name = "blogserverip";
       formfields[1].type = "text";
       formfields[1].title = "Blog Server IP Address:";
       formfields[1].description = "Enter the IP address to the server that hosts your blogging tool.  For Blogger users, this is '216.34.7.188'.  It varies for others.  You have to know what you're doing here.";
       formfields[1].defaultValue = preferences.blogserverip.value;

       formfields[2] = new FormField();
       formfields[2].name = "blogserverport";
       formfields[2].type = "text";
       formfields[2].title = "Blog Server Port:";
       formfields[2].description = "This is the port that your webserver is listening on for the server that hosts your blogging tool.  In almost every case, this is '80', the HTTP default port.  If the URL to your blogging API tool has an explicit port in it, like http://SERVER:PORT/URL/TO/API, then put that PORT here.  Almost everybody says '80' here.";
       formfields[2].defaultValue = preferences.blogserverport.value;

       formfields[3] = new FormField();
       formfields[3].name = "linkurl";
       formfields[3].type = "text";
       formfields[3].title = "Link URL:";
       formfields[3].description = "This is the link to your personal blog where you are publishing entries.  Put whatever URL you like to publish for this blog, here.  Useful only in conjunction with metaWeblog API blogs.  Others may leave this blank.";
       formfields[3].defaultValue = preferences.linkurl.value;

       formfields[4] = new FormField();
       formfields[4].name = "author";
       formfields[4].type = "text";
       formfields[4].title = "Author:";
       formfields[4].description = "This is the default author listed for your blog entries.  Put a name you go by on your blog here.  Useful only in conjunction with metaWeblog API blogs.  Others may leave this blank."; 
       formfields[4].defaultValue = preferences.author.value;

       var results = new Array();
       results = form(formfields, 'BlogPost', 'Next', 'Cancel');
       return results;
}
function expressBloggingForm()
{
       preferences.blogtype.value = 'blogger';
       preferences.bloghost.value = 'plant.blogger.com';
       preferences.blogserverip.value = '216.34.7.188';
       preferences.blogserverport.value = '80';
       preferences.blogurl.value = '/api/RPC2';
       // blogging form
       var formfields = new Array();
       formfields[0] = new FormField();
       formfields[0].name = "blogid";
       formfields[0].type = "text";
       formfields[0].title = "BlogID:";
       formfields[0].description = "This is where you enter your blogger.com BlogID.  Your BlogID can be discovered by visiting your Blog editing form at blogger.com, and looking at the very end of the URL in your browser's location bar while you are editing it.  It will look something like ?blogid=####.  Those numbers are your BlogID!  Enter them here!";
       formfields[0].defaultValue = preferences.blogid.value;
       formfields[1] = new FormField();
       formfields[1].name = "uname";
       formfields[1].type = "text";
       formfields[1].title = "Username:";
       formfields[1].description = "This is where you enter your blogger.com username.  Your username is the name you use to log into blogger.com.  Enter that here!";
       formfields[1].defaultValue = preferences.uname.value;
       formfields[2] = new FormField();
       formfields[2].name = "pword";
       formfields[2].type = "text";
       formfields[2].title = "Password:";
       formfields[2].description = "This is where you enter your blogger.com password.  Your password is the one you use to log into blogger.com.  Enter that here!";
       formfields[2].defaultValue = preferences.pword.value;
       var results = new Array();
       results = form(formfields, 'BlogPost', 'Next', 'Cancel');
       return results;
}
function lookAndFeelForm()
{
           // look and feel form
           var formfields2 = new Array();
           formfields2[0] = new FormField();
           formfields2[0].name = "windowopacitypref";
           formfields2[0].type = "text";
           formfields2[0].title = "Window Opacity:";
           formfields2[0].description = "This setting specifies the base opacity of the window that displays the BlogPost Widget.  Setting this value to 0 effectively makes the Widget invisible, while setting this value to 255 makes the window not transparent at all.";
           formfields2[0].defaultValue = preferences.windowopacitypref.value;
           formfields2[1] = new FormField();
           formfields2[1].name = "imageopacitypref";
           formfields2[1].type = "text";
           formfields2[1].title = "Image Opacity:";
           formfields2[1].description = "This setting specifies the opacity of the background image that displays the BlogPost Widget.  Setting this value to 0 effectively makes the image invisible, while setting this value to 255 makes the image not transparent at all.";
           formfields2[1].defaultValue = preferences.imageopacitypref.value;
           formfields2[2] = new FormField();
           formfields2[2].name = "textopacitypref";
           formfields2[2].type = "text";
           formfields2[2].title = "Text Opacity:";
           formfields2[2].description = "This setting specifies the opacity of the 'blogger' and 'PostBlog' text that displays the BlogPost Widget.  Setting this value to 0 effectively makes the text invisible, while setting this value to 255 makes the text not transparent at all.";
           formfields2[2].defaultValue = preferences.textopacitypref.value;

           var results2 = new Array();
           results2 = form(formfields2, 'BlogPost', 'Next', 'Cancel');
           return results2;
}
function autoupdateForm()
{
           // autoupdate form
           var formfields3 = new Array();
           formfields3[0] = new FormField();
           formfields3[0].name = "getver";
           formfields3[0].type = "checkbox";
           formfields3[0].title = "Auto-update:";
           formfields3[0].description = "Checking here will cause BlogPost to check for new version every time the Widget loads.";
           formfields3[0].defaultValue = preferences.getver.value;
           var results3 = new Array();
           results3 = form(formfields3, 'BlogPost', 'Next', 'Cancel');
           return results3;
}
function fancyPostForm()
{
           // fancy posts form
           var formfields4 = new Array();
           formfields4[0] = new FormField();
           formfields4[0].name = "fancypost";
           formfields4[0].type = "checkbox";
           formfields4[0].title = "Fancy-posts:";
           formfields4[0].description = "Checking here will cause BlogPost to use a web browser as your form for text input of your new Blog messages, instead of the more limited Konfabulator text field.  The drawback is that it takes a little bit of time to open a browser, and you have to close the browser when you're done.";
           formfields4[0].defaultValue = preferences.fancypost.value;
           formfields4[1] = new FormField();
           formfields4[1].name = "browserpref";
           formfields4[1].type = "text";
           formfields4[1].title = "Fancy-post browser:";
           formfields4[1].description = "By default, BlogPost uses Internet Explorer.  Type 'Safari' here to use Safari instead, if you have Safari installed.  More browsers will be supported in the future.  Leave this blank to use Internet Explorer.";
           formfields4[1].defaultValue = preferences.browserpref.value;
           var results4 = new Array();
           results4 = form(formfields4, 'BlogPost', 'Next', 'Cancel');
           return results4;
}
function socketServerForm()
{
           // socketserver form
           var formfields5 = new Array();
           formfields5[0] = new FormField();
           formfields5[0].name = "socketserver";
           formfields5[0].type = "checkbox";
           formfields5[0].title = "Socketserver:";
           formfields5[0].description = "Checking here will cause BlogPost to use its own internal socketserver to perform Blog posts, rather than using an external script.  You should select this option unless you have a specific reason not to.";
           formfields5[0].defaultValue = preferences.socketserver.value;
           var results5 = new Array();
           results5 = form(formfields5, 'BlogPost', 'Next', 'Cancel');
           return results5;
}
/////////////////////////////////////

var loaded = 0;

main_window.opacity = preferences.windowopacitypref.value;
postwindow.opacity = preferences.imageopacitypref.value;
BlogLabel.opacity = preferences.textopacitypref.value;

var getver = preferences.getver.value;
var version_major   = 1;
var version_minor   = 2;
var version_trivial = 0;
if (getver)
{
   var url = new URL();
   //var versionstr = url.fetch("http://www.zeroaltitude.org/BlogPost/VERSION.txt");
   var versionstr = runCommand("Resources/BlogPost/Perls/getver.pl");
   var newre = /\n|\r/;
   versionstr = versionstr.replace(newre, "");
   // parse
   var verarray = versionstr.split('.'); // three elements
   if ((parseInt(verarray[0]) > version_major) || (parseInt(verarray[1]) > version_minor) || 
       (parseInt(verarray[2]) > version_trivial))
   {
       // prompt regarding getting new version
       var ret = alert("There is a new version of BlogPost! (your version: " + version_major + "." + version_minor + 
             "." + version_trivial + ", new version: " + versionstr + ")", "Get new version", "Remind me next time", 
             "Stop reminding me!");
       if (ret == 1)
       {
           var ret = runCommand("Resources/BlogPost/Perls/getnewver.pl");
           if (ret) 
           { 
               var closeme = alert("Your version of BlogPost has been updated!  Restart the Widget!", 
                                   "Close the Widget", 
                                   "I know what I'm doing: Do not close me yet!"); 
               if (closeme == 1)
               {
                    closeWidget();
               }
           }
           else
	   {
               alert("runCommand did not return 1: " + ret);
           }
       }
       else if (ret == 2)
       {
           // do nothing
       }
       else if (ret == 3)
       {
           preferences.getver.value = 0;
       }
       else
       {
           alert("Error!  Unknown response: " + ret);
       }
   }
}

var blogid = preferences.blogid.value;
var blogus = preferences.uname.value;
var blogpw = preferences.pword.value;
if ((!blogid) || (!blogus) || (!blogpw))
{
   var configret = alert("Welcome to BlogPost!  BlogPost supports many different weblogging systems.  However, in order for BlogPost to work with some of the more exotic systems, you need to provide a greater amount of technical information.  If you will be using a blogger.com weblog, you do not need any extra information to get going with BlogPost -- blogger is therefore the best choice for users who do not want to go through the extra hassle of learning the extra technical information.  For such users, you should select the Express Wizard below.  You will need to set your BlogID, Blogger username and Blogger password in order to start posting!  If you have your blog elsewhere, you can still use BlogPost for any blogging system that supports the Blogger API or the metaWeblog API.  But you will need to provide BlogPost with additional information.  If this describes you, chose the Expert Wizard.  Have fun!\n\nNote: the Preferences panel does NOT expose all of the preferences needed to set up a non-blogger weblog.  The Expert Wizard is the only way.  If you need to run that wizard again, set your Blog Username to '' (an empty setting) in the preferences panel, then restart this Widget.", "Open preferences menu", "Express Wizard", "Expert Wizard");
   if (configret == 1)
   {
       showWidgetPreferences();
   }
   else if (configret == 2)
   {
       alert("Welcome to the Express Configuration Wizard!  I am going to ask you a few questions to get you started using BlogPost.  Click 'Next' to continue.", "Next");
       var results;
 
       results = expressBloggingForm();

       if (results == null)
       {
           // do nothing
       }
       else
       {
           preferences.blogid.value = results[0];
           preferences.uname.value  = results[1];
           preferences.pword.value  = results[2]; 

	   var results2;
           results2 = lookAndFeelForm();
           
           if (results2 == null) 
           {
               // do nothing
           }
           else
           {
               preferences.windowopacitypref.value = results2[0];
               preferences.imageopacitypref.value = results2[1];
               preferences.textopacitypref.value = results2[2];

	       var results3;
               results3 = autoupdateForm();

               if (results3 == null)
               {
                   // do nothing
               }
               else
               {
                   if (results3[0])
                   {
                        preferences.getver.value = 1;
                   }
                   
	           var results4;
                   results4 = fancyPostForm(); 
 
                   if (results4 == null)
                   {
                       // do nothing
                   }
                   else
                   {
                       if (results4[1])
                       {
                           preferences.browserpref.value = results4[1];
                       }
                       if (results4[0] == 1)
                       {
                           preferences.fancypost.value = 1;
                       }
                       else
                       {
                           preferences.fancypost.value = 0;

			   var results5;
                           results5 = socketServerForm();
                       }
                       alert("Wizard completed!  Have fun using BlogPost!");
                   }
               }
           }
       }
   }
   else
   {
       alert("Welcome to the Expert Configuration Wizard!  I am going to ask you a few questions to get you started using BlogPost.  You sort of have to know a bit to get through this wizard.  Hopefully I'll soon have a webpage up to help make matters easier.  Click 'Next' to continue.", "Next");
       var results;
 
       results = expertBloggingForm1();

       if (results == null)
       {
           // do nothing
       }
       else
       {
           preferences.blogid.value = results[0];
           preferences.uname.value  = results[1];
           preferences.pword.value  = results[2]; 
           preferences.blogtype.value  = results[3]; 
           preferences.bloghost.value  = results[4]; 
           var resultsn;

           resultsn = expertBloggingForm2();
           if (resultsn == null)
           {
               // do nothing
           }
           else
           {
              preferences.blogurl.value  = resultsn[0]; 
              preferences.blogserverip.value  = resultsn[1]; 
              preferences.blogserverport.value  = resultsn[2]; 
              if (resultsn[3]) { preferences.linkurl.value  = resultsn[3]; }
              if (resultsn[4]) { preferences.author.value  = resultsn[4]; }

	   var results2;
           results2 = lookAndFeelForm();
           
           if (results2 == null) 
           {
               // do nothing
           }
           else
           {
               preferences.windowopacitypref.value = results2[0];
               preferences.imageopacitypref.value = results2[1];
               preferences.textopacitypref.value = results2[2];

	       var results3;
               results3 = autoupdateForm();

               if (results3 == null)
               {
                   // do nothing
               }
               else
               {
                   if (results3[0])
                   {
                        preferences.getver.value = 1;
                   }
                   
	           var results4;
                   results4 = fancyPostForm(); 
 
                   if (results4 == null)
                   {
                       // do nothing
                   }
                   else
                   {
                       if (results4[1])
                       {
                           preferences.browserpref.value = results4[1];
                       }
                       if (results4[0] == 1)
                       {
                           preferences.fancypost.value = 1;
                       }
                       else
                       {
                           preferences.fancypost.value = 0;

			   var results5;
                           results5 = socketServerForm();
                       }
                       alert("Wizard completed!  Have fun using BlogPost!");
                   }
               }
           }
       }
   }
   }
}

var ssObj = new SocketServer();
var sproc = ssObj.processQueue();
var sload = ssObj.startServer();
