public bool LoadPrivateData()
        {
            string[] args = Environment.GetCommandLineArgs();
            foreach (var arg in args.Select(a => a.ToLower()))
            {
                if (arg.StartsWith("projectid=")) ProjectId = Convert.ToInt32(arg.Replace("projectid=", ""));
                if (arg.StartsWith("storyid=")) StoryId = Convert.ToInt32(arg.Replace("storyid=", ""));
            }
            if (ProjectId == 0 || StoryId == 0)
            {
                MessageBox.Show("ProjectId and StoryId are both required.");
                return false;
            }

            // Load the config
            Config config = new Config();
            try
            {
                config = PivotalUtils.GetConfig(baseDir + configFileName);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }

            // Get the password if it is not set
            if (string.IsNullOrEmpty(config.Password))
            {
                if (PasswordBox("Password Required", "PivotalTracker Password:"******"GrindstonPivotalLink unable to run without password.");
                        return false;
                    }
                }
                else
                {
                    MessageBox.Show("GrindstonPivotalLink unable to run without password.");
                    return false;
                }
            }

            try
            {
                token = PivotalUtils.GetPivotalTrackerUserToken(config.Email, config.Password);
            }
            catch (Exception)
            {
                MessageBox.Show("Unable to retrieve user token.");
                return false;
            }

            // Get story node and populate private story object
            XmlNode storyNode = new XmlDocument();
            try
            {
                storyNode = PivotalUtils.GetStoryNode(token, ProjectId, StoryId);
                story = PivotalUtils.GetStoryFromStoryNode(storyNode);
            }
            catch (Exception)
            {
                MessageBox.Show("Unable to retireve story data from PivotalTracker.");
                return false;
            }

            // Get comments from story node and build private comments string
            try
            {
                var listComments = PivotalUtils.GetCommentsFromStoryNode(storyNode);
                var sbComments = new StringBuilder();
                if (listComments.Count > 0)
                {
                    foreach (var comment in listComments)
                    {
                        sbComments.AppendLine(string.Concat(comment.timestamp.ToShortTimeString(), " - ", comment.author));
                        sbComments.AppendLine(comment.text);
                        sbComments.AppendLine();
                    }
                }
                else
                {
                    sbComments.AppendLine("No comments found.");
                }
                comments = sbComments.ToString();
            }
            catch (Exception)
            {
                comments = "Unable to retrieve story comments from PivotalTracker.";
            }

            // Set the form tasks
            try
            {
                tasks = PivotalUtils.GetStoryTasks(token, ProjectId, StoryId);
            }
            catch (Exception)
            {
                MessageBox.Show("Unable to retrieve story tasks from PivotalTracker.");
                return false;
            }

            // Set up the story owner
            try
            {
                var authenticityToken = string.Empty;
                var sessionCookie = PivotalUtils.GetPivotalTrackerSessionCookie(config.Email, config.Password, out authenticityToken);
                owners = PivotalUtils.GetUserIds(ref sessionCookie);
            }
            catch (Exception)
            {
                MessageBox.Show("Unable to retrieve potential story owners from PivotalTracker.");
                return false;
            }

            return true;
        }
 public static XmlElement CreateTaskElement(XmlDocument xmlDoc, string projectName, Story story, string batchFilePath)
 {
     var element = xmlDoc.CreateElement("task");
     element.SetAttribute("name", story.name);
     if (story.dateTimeCompleted != DateTime.MinValue)
         element.SetAttribute("complete", story.dateTimeCompleted.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.ffK"));
     element.SetAttribute("dueAlerted", "False");
     element.SetAttribute("estimateAlerted", "False");
     var customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "id");
     customValue.SetAttribute("value", story.id.ToString());
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "Type");
     customValue.SetAttribute("value", story.type);
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "Url");
     customValue.SetAttribute("value", story.url);
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "Update");
     customValue.SetAttribute("value", batchFilePath);
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "State");
     customValue.SetAttribute("value", story.state);
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "Status");
     customValue.SetAttribute("value", story.status);
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "Project");
     customValue.SetAttribute("value", projectName);
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "Labels");
     customValue.SetAttribute("value", story.labels);
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "Owner");
     customValue.SetAttribute("value", story.owner);
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "Filter");
     customValue.SetAttribute("value", story.filter);
     element.AppendChild(customValue);
     customValue = xmlDoc.CreateElement("customValue");
     customValue.SetAttribute("name", "Order");
     customValue.SetAttribute("value", story.order.ToString());
     element.AppendChild(customValue);
     return element;
 }