git-svn-id: svn://euphorik.ch/pompage@45 02bbb61a-6d21-0410-aba0-cb053bdfd66a
[pompage.git] / doc / webdeveloper / dashboard / edit_html.js
diff --git a/doc/webdeveloper/dashboard/edit_html.js b/doc/webdeveloper/dashboard/edit_html.js
new file mode 100644 (file)
index 0000000..a8bed74
--- /dev/null
@@ -0,0 +1,252 @@
+var webdeveloper_editHTMLIntervalId      = null;
+var webdeveloper_editHTMLOldHTML         = null;
+var webdeveloper_editHTMLSelectedTab     = 0;
+var webdeveloper_editHTMLUpdateFrequency = 500;
+
+// Applies the HTML
+function webdeveloper_applyHTML()
+{
+    var contentBody = webdeveloper_getDocumentBodyElement(webdeveloper_getContentDocument());
+    var newHTML     = document.getElementById("webdeveloper-edit-html-text-box").value;
+
+    // If the content body is set and the new HTML is not the same as the old HTML
+    if(contentBody && newHTML != webdeveloper_editHTMLOldHTML)
+    {
+        contentBody.innerHTML        = newHTML;
+        webdeveloper_editHTMLOldHTML = newHTML;
+    }
+}
+
+// Clear the HTML
+function webdeveloper_clearHTML()
+{
+    document.getElementById("webdeveloper-edit-html-text-box").value = "";
+}
+
+// Reinitializes the dashboard when the page changes
+function webdeveloper_editHTMLContentPageLoad(event)
+{
+    var eventTarget = event.target;
+
+    // Try to get the original target
+    try
+    {
+        var originalTarget = event.originalTarget;
+
+        // If the page is the target and the URI matches
+        if(originalTarget && eventTarget && eventTarget.contentDocument && eventTarget.hasAttribute && eventTarget.hasAttribute("id") && eventTarget.getAttribute("id").toLowerCase() == "content" && originalTarget.documentURI == eventTarget.contentDocument.documentURI)
+        {
+            // If the page is generated
+            if(originalTarget.documentURI == "about:blank")
+            {
+                window.clearInterval(webdeveloper_editHTMLIntervalId);
+                window.setTimeout(webdeveloper_retrieveHTML, 1000);
+                window.setTimeout(webdeveloper_updateHTML, 1000);
+            }
+            else
+            {
+                webdeveloper_retrieveHTML();
+            }
+        }
+    }
+    catch(exception)
+    {
+        // Do nothing
+    }
+}
+
+// Handles a browser tab being selected
+function webdeveloper_editHTMLMainTabSelect(event)
+{
+    var browser     = window.top.getBrowser();
+    var selectedTab = browser.mTabBox.selectedIndex;
+
+    // If the selected tab is different
+    if(selectedTab != webdeveloper_editHTMLSelectedTab)
+    {
+        browser.browsers[webdeveloper_editHTMLSelectedTab].contentDocument.location.reload(false);
+
+        webdeveloper_editHTMLSelectedTab = selectedTab;
+
+        webdeveloper_retrieveHTML();
+    }
+}
+
+// Initializes the edit HTML dashboard
+function webdeveloper_initializeEditHTML()
+{
+    var mainTabBox   = window.top.getBrowser().mTabBox;
+    var textBox      = document.getElementById("webdeveloper-edit-html-text-box");
+    var textBoxStyle = "";
+
+    webdeveloper_editHTMLSelectedTab     = mainTabBox.selectedIndex;
+    webdeveloper_editHTMLUpdateFrequency = webdeveloper_getIntegerPreference("webdeveloper.edit.update.frequency", true);
+
+    document.getElementById("webdeveloper-search-dashboard-text").addEventListener("keypress", webdeveloper_searchTextKeyPress, false);
+    mainTabBox.addEventListener("select", webdeveloper_editHTMLMainTabSelect, false);
+    window.top.addEventListener("load", webdeveloper_editHTMLContentPageLoad, true);
+
+    // If the edit CSS background color preference is set
+    if(webdeveloper_isPreferenceSet("webdeveloper.edit.color.background"))
+    {
+        textBoxStyle += "background-color: " + webdeveloper_getStringPreference("webdeveloper.edit.color.background", true) + " !important; ";
+    }
+
+    // If the edit CSS text color preference is set
+    if(webdeveloper_isPreferenceSet("webdeveloper.edit.color.text"))
+    {
+        textBoxStyle += "color: " + webdeveloper_getStringPreference("webdeveloper.edit.color.text", true) + " !important; ";
+    }
+
+    // If the edit CSS font preference is set
+    if(webdeveloper_isPreferenceSet("webdeveloper.edit.font.size"))
+    {
+        textBoxStyle += "font-size: " + webdeveloper_getIntegerPreference("webdeveloper.edit.font.size", true) + "px !important; ";
+    }
+
+    textBox.setAttribute("style", textBoxStyle.trim());
+
+    webdeveloper_retrieveHTML();
+    webdeveloper_updateHTML();
+}
+
+// Resets the edited HTML
+function webdeveloper_resetHTML()
+{
+    window.top.BrowserReload();
+}
+
+// Retrieves the HTML
+function webdeveloper_retrieveHTML()
+{
+    var contentBody = webdeveloper_getDocumentBodyElement(webdeveloper_getContentDocument());
+    var textBox     = document.getElementById("webdeveloper-edit-html-text-box");
+
+    // If the content body is set
+    if(contentBody)
+    {
+        textBox.value = contentBody.innerHTML;
+    }
+
+    webdeveloper_applyHTML();
+}
+
+// Saves the HTML
+function webdeveloper_saveHTML()
+{
+    var contentDocument = webdeveloper_getContentDocument();
+    var filePicker      = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
+    var result          = null;
+    var stringBundle    = document.getElementById("webdeveloper-string-bundle");
+    var url             = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURL);
+
+    url.spec                    = contentDocument.documentURI;
+    filePicker.defaultExtension = url.fileExtension;
+    filePicker.defaultString    = url.fileName;
+
+    filePicker.init(window, stringBundle.getString("webdeveloper_saveHTML"), filePicker.modeSave);
+
+    result = filePicker.show();
+
+    // If the user selected a file
+    if(result == filePicker.returnOK || result == filePicker.returnReplace)
+    {
+        var file                       = filePicker.file;
+        var webBrowserPersistInterface = Components.interfaces.nsIWebBrowserPersist;
+        var webBrowserPersist          = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(webBrowserPersistInterface);
+
+        webBrowserPersist.persistFlags = webBrowserPersistInterface.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION | webBrowserPersistInterface.PERSIST_FLAGS_FROM_CACHE | webBrowserPersistInterface.PERSIST_FLAGS_REPLACE_EXISTING_FILES;
+
+        // If the file does not exist
+        if(!file.exists())
+        {
+            file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 00644);
+        }
+
+        webBrowserPersist.saveDocument(contentDocument, file, null, contentDocument.contentType, webBrowserPersistInterface.ENCODE_FLAGS_ENCODE_BASIC_ENTITIES, 0);
+    }
+}
+
+// Searches the HTML
+function webdeveloper_searchHTML()
+{
+    var searchText = document.getElementById("webdeveloper-search-dashboard-text").value;
+
+    // If the search text is set
+    if(searchText)
+    {
+        document.getElementById("webdeveloper-edit-html-text-box").focus();
+
+        // If the search failed to find a match
+        if(!window.find(searchText, false, false, true, false, false, false))
+        {
+            document.getElementById("webdeveloper-edit-html-text-box").setSelectionRange(0, 0);
+            window.find(searchText, false, false, true, false, false, false);
+        }
+    }
+}
+
+// Searches the HTML when the enter key is pressed
+function webdeveloper_searchTextKeyPress(event)
+{
+    var keyCode = event.keyCode;
+
+    // If the key code is set and is 13
+    if(keyCode && keyCode == 13)
+    {
+        webdeveloper_searchHTML();
+    }
+}
+
+// Unloads edit HTML
+function webdeveloper_unloadEditHTML()
+{
+    var browser    = window.top.getBrowser();
+    var mainTabBox = browser.mTabBox;
+
+    webdeveloper_editHTMLOldHTML = null;
+
+    window.clearInterval(webdeveloper_editHTMLIntervalId);
+
+    // Try to remove the event listener
+    try
+    {
+        document.getElementById("webdeveloper-search-dashboard-text").removeEventListener("keypress", webdeveloper_searchTextKeyPress, false);
+    }
+    catch(exception)
+    {
+        // Do nothing
+    }
+
+    // Try to remove the event listener
+    try
+    {
+        mainTabBox.removeEventListener("select", webdeveloper_editHTMLMainTabSelect, false);
+    }
+    catch(exception)
+    {
+        // Do nothing
+    }
+
+    // Try to remove the event listener
+    try
+    {
+        window.top.removeEventListener("load", webdeveloper_editHTMLContentPageLoad, true);
+    }
+    catch(exception)
+    {
+        // Do nothing
+    }
+
+    window.top.BrowserReload();
+}
+
+// Updates the HTML
+function webdeveloper_updateHTML()
+{
+    // If the update frequency is greater than 0
+    if(webdeveloper_editHTMLUpdateFrequency > 0)
+    {
+        webdeveloper_editHTMLIntervalId = window.setInterval(webdeveloper_applyHTML, webdeveloper_editHTMLUpdateFrequency);
+    }
+}
\ No newline at end of file