/// <summary>
        /// Main Method (Entry point to the program).
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            /// instantiate a code settings object.
            CodeSettings cs = new CodeSettings();
            cs.QuoteObjectLiteralProperties = true;
            cs.PreserveImportantComments = false;

            /// Extract the bookmarklet wrapper javascript from the js wrapper file.
            /// This file is the defines the bookmarklet javascript entry point and wraps each bookmarklet within this javascript.
            string bookmarkletMainJSWrapper = System.IO.File.ReadAllText(Properties.Settings.Default.BookmarkletMainJSWrapper);

            /// Read all the HTML Template file for adding the bookmarklets as links into.
            string htmlTemplate = System.IO.File.ReadAllText(Properties.Settings.Default.BookmarkletHtmlTemplate);

            string importableTemplate = System.IO.File.ReadAllText(Properties.Settings.Default.BookmarkletHtmlImportableTemplate);

            /// A list of all the bookarklets from the bookmarklets folder
            List<Bookmarklet> bookmarklets = new List<Bookmarklet>();

            #region Load all bookmarklets
            /// For each bookmarklet js in the bookmarklets folder
            foreach (string file in System.IO.Directory.GetFiles(Properties.Settings.Default.BookmarkletsFolder))
            {
                /// get the file info
                FileInfo fi = new FileInfo(file);

                // if the file is not a js file skip
                if (fi.Extension.ToLower() != ".js")
                {
                    continue;
                }

                /// Instantite the bookmarklet object populating all the properties
                Bookmarklet bookmarklet = new Bookmarklet();

                bookmarklet.Name = fi.Name.Replace(".js", "");

                bookmarklet.javascript = System.IO.File.ReadAllText(file);

                /// Extract the bookmarklet info from the xml documentation notation
                int firstIndex = bookmarklet.javascript.IndexOf("<BookmarkletInfo>");
                int lastindex = bookmarklet.javascript.LastIndexOf("</BookmarkletInfo>") + ("</BookmarkletInfo>").Length;
                if (firstIndex > 0)
                {
                    string bookmarkletInfo = bookmarklet.javascript.Substring(firstIndex, lastindex - firstIndex);
                    XDocument doc = XDocument.Parse(bookmarkletInfo);
                    var nameNode = doc.XPathSelectElement("/BookmarkletInfo/Name");
                    if (nameNode != null)
                    {
                        bookmarklet.Name = nameNode.Value.ToString().Trim();
                    }

                    var descriptionNode = doc.XPathSelectElement("/BookmarkletInfo/Description");
                    if (descriptionNode != null)
                    {
                        bookmarklet.Description = InnerXml(descriptionNode).Trim();
                    }
                }
                /// update the bookmarklet javascript by inserting it into the main wrapper js
                /// witha  replace of "//[[Bookmarklet-Code-Inserted-Here]]" with the bookmarklet javascript
                bookmarklet.javascript = bookmarkletMainJSWrapper.Replace("//[[Bookmarklet-Code-Inserted-Here]]", bookmarklet.javascript);

                // add it to the list of bookmarklets.
                bookmarklets.Add(bookmarklet);
            }

            #endregion Load all bookmarklets

            #region output all bookmarklets into the html output file based on the template.
            string bookmarkletHtml = "";
            string bookmarkletImport = "";
            ///Instantiate a minifer instance
            Minifier minifier = new Microsoft.Ajax.Utilities.Minifier();

            foreach (var bookmarklet in bookmarklets)
            {
                //bookmarkletHtml += "<a href='javascript:" + HttpUtility.JavaScriptStringEncode(jsMinifer.Compress(kvp.Value)) + "'>" + kvp.Key + "</a>" + Environment.NewLine;
                bookmarkletHtml += "<p>";
                /// append the bookmarklet js minified.  Replace all ' with \\' to escape any js quotes.
                bookmarkletHtml += "<a href=\"javascript:" + minifier.MinifyJavaScript(bookmarklet.javascript, cs).Replace("'", "\\'").Replace("\"", "'") + "\">" + bookmarklet.Name + "</a>" + Environment.NewLine;
                if (!string.IsNullOrEmpty(bookmarklet.Description))
                {
                    bookmarkletHtml += "<br/>";
                    bookmarkletHtml += bookmarklet.Description;
                }
                bookmarkletHtml += "</p>";

                /// append the bookmarklet js minified.  Replace all ' with \\' to escape any js quotes.
                bookmarkletImport += "\t\t<DT><A HREF=\"javascript:" + minifier.MinifyJavaScript(bookmarklet.javascript, cs).Replace("'", "\\'").Replace("\"", "'") + "\">" + bookmarklet.Name + "</A>" + Environment.NewLine;

            }

            string html = htmlTemplate.Replace("<!--Bookmarklets-->", bookmarkletHtml);
            /// write the results to the html output file
            File.WriteAllText(Properties.Settings.Default.BookmarkletHtmlOutput, html);

            html = importableTemplate.Replace("<!--Bookmarklets-->", bookmarkletImport);
            /// write the results to the html output file
            File.WriteAllText(Properties.Settings.Default.BookmarkletImportOutput, html);

            #endregion output all bookmarklets into the html output file based on the template.
        }
        /// <summary>
        /// Main Method (Entry point to the program).
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            /// instantiate a code settings object.
            CodeSettings cs = new CodeSettings();

            cs.QuoteObjectLiteralProperties = true;
            cs.PreserveImportantComments    = false;

            /// Extract the bookmarklet wrapper javascript from the js wrapper file.
            /// This file is the defines the bookmarklet javascript entry point and wraps each bookmarklet within this javascript.
            string bookmarkletMainJSWrapper = System.IO.File.ReadAllText(Properties.Settings.Default.BookmarkletMainJSWrapper);

            /// Read all the HTML Template file for adding the bookmarklets as links into.
            string htmlTemplate = System.IO.File.ReadAllText(Properties.Settings.Default.BookmarkletHtmlTemplate);

            string importableTemplate = System.IO.File.ReadAllText(Properties.Settings.Default.BookmarkletHtmlImportableTemplate);

            /// A list of all the bookarklets from the bookmarklets folder
            List <Bookmarklet> bookmarklets = new List <Bookmarklet>();

            #region Load all bookmarklets
            /// For each bookmarklet js in the bookmarklets folder
            foreach (string file in System.IO.Directory.GetFiles(Properties.Settings.Default.BookmarkletsFolder))
            {
                /// get the file info
                FileInfo fi = new FileInfo(file);

                // if the file is not a js file skip
                if (fi.Extension.ToLower() != ".js")
                {
                    continue;
                }

                /// Instantite the bookmarklet object populating all the properties
                Bookmarklet bookmarklet = new Bookmarklet();

                bookmarklet.Name = fi.Name.Replace(".js", "");

                bookmarklet.javascript = System.IO.File.ReadAllText(file);


                /// Extract the bookmarklet info from the xml documentation notation
                int firstIndex = bookmarklet.javascript.IndexOf("<BookmarkletInfo>");
                int lastindex  = bookmarklet.javascript.LastIndexOf("</BookmarkletInfo>") + ("</BookmarkletInfo>").Length;
                if (firstIndex > 0)
                {
                    string    bookmarkletInfo = bookmarklet.javascript.Substring(firstIndex, lastindex - firstIndex);
                    XDocument doc             = XDocument.Parse(bookmarkletInfo);
                    var       nameNode        = doc.XPathSelectElement("/BookmarkletInfo/Name");
                    if (nameNode != null)
                    {
                        bookmarklet.Name = nameNode.Value.ToString().Trim();
                    }

                    var descriptionNode = doc.XPathSelectElement("/BookmarkletInfo/Description");
                    if (descriptionNode != null)
                    {
                        bookmarklet.Description = InnerXml(descriptionNode).Trim();
                    }
                }
                /// update the bookmarklet javascript by inserting it into the main wrapper js
                /// witha  replace of "//[[Bookmarklet-Code-Inserted-Here]]" with the bookmarklet javascript
                bookmarklet.javascript = bookmarkletMainJSWrapper.Replace("//[[Bookmarklet-Code-Inserted-Here]]", bookmarklet.javascript);

                // add it to the list of bookmarklets.
                bookmarklets.Add(bookmarklet);
            }

            #endregion Load all bookmarklets


            #region output all bookmarklets into the html output file based on the template.
            string bookmarkletHtml   = "";
            string bookmarkletImport = "";
            ///Instantiate a minifer instance
            Minifier minifier = new Microsoft.Ajax.Utilities.Minifier();

            foreach (var bookmarklet in bookmarklets)
            {
                //bookmarkletHtml += "<a href='javascript:" + HttpUtility.JavaScriptStringEncode(jsMinifer.Compress(kvp.Value)) + "'>" + kvp.Key + "</a>" + Environment.NewLine;
                bookmarkletHtml += "<p>";
                /// append the bookmarklet js minified.  Replace all ' with \\' to escape any js quotes.
                bookmarkletHtml += "<a href=\"javascript:" + minifier.MinifyJavaScript(bookmarklet.javascript, cs).Replace("'", "\\'").Replace("\"", "'") + "\">" + bookmarklet.Name + "</a>" + Environment.NewLine;
                if (!string.IsNullOrEmpty(bookmarklet.Description))
                {
                    bookmarkletHtml += "<br/>";
                    bookmarkletHtml += bookmarklet.Description;
                }
                bookmarkletHtml += "</p>";

                /// append the bookmarklet js minified.  Replace all ' with \\' to escape any js quotes.
                bookmarkletImport += "\t\t<DT><A HREF=\"javascript:" + minifier.MinifyJavaScript(bookmarklet.javascript, cs).Replace("'", "\\'").Replace("\"", "'") + "\">" + bookmarklet.Name + "</A>" + Environment.NewLine;
            }

            string html = htmlTemplate.Replace("<!--Bookmarklets-->", bookmarkletHtml);
            /// write the results to the html output file
            File.WriteAllText(Properties.Settings.Default.BookmarkletHtmlOutput, html);

            html = importableTemplate.Replace("<!--Bookmarklets-->", bookmarkletImport);
            /// write the results to the html output file
            File.WriteAllText(Properties.Settings.Default.BookmarkletImportOutput, html);

            #endregion output all bookmarklets into the html output file based on the template.
        }