eggification.
[Epoz.git] / Products / Epoz / epoz / epoz_core / epoz_redirect.js.dtml
diff --git a/Products/Epoz/epoz/epoz_core/epoz_redirect.js.dtml b/Products/Epoz/epoz/epoz_core/epoz_redirect.js.dtml
new file mode 100644 (file)
index 0000000..b76cb71
--- /dev/null
@@ -0,0 +1,260 @@
+// This script allow to use several Epoz WYSIWYG fields.
+// Copyright (C) 2005 Benoît PIN <mailto:pin@cri.ensmp.fr>
+
+var IFramePrefix = "Iframe_";
+var IFramePrefixLength = IFramePrefix.length;
+var DocPrefix = "doc_";
+var DocPrefixLength = DocPrefix.length;
+var CheckBoxPrefix = "CB_";
+var CheckBoxPrefixLength = CheckBoxPrefix.length;
+var ToolBarPrefix = "ToolBar_";
+var ToolBarPrefixLength = ToolBarPrefix.length;
+
+
+function redirectEpoz(iframe) {
+       if(EpozElement) {
+               if (EpozElement == iframe)
+                       return;
+               changeBorderStyle(EpozElement, "dashed");
+               unwrapEpozVariables();
+       }
+
+       // update Epoz variables        
+       wrapEpozVariables(iframe);
+
+       //cosmetic      
+       changeBorderStyle(EpozElement, "solid");
+       EpozElement.contentWindow.focus();
+}
+
+
+function wrapEpozVariables(iframe) {
+       try {
+               fieldId = iframe.contentWindow.document.id.slice(DocPrefixLength);
+       }
+       catch (e) {
+               // maybe not an epoz iframe
+               return false;
+       }
+       
+       iframe.id = Epoz ;
+       EpozElement=iframe;
+       EpozTextArea = document.getElementById(fieldId);
+       toolBar = document.getElementById(ToolBarPrefix + fieldId);
+       toolBar.id = "EpozToolbar";
+       checkBox = document.getElementById(CheckBoxPrefix + fieldId);
+       checkBox.id = "EpozViewMode";
+       return true;
+}
+
+
+function unwrapEpozVariables() {
+       if (!EpozElement) // no redirection happens yet.
+               return;
+       fieldId = EpozElement.contentWindow.document.id.slice(DocPrefixLength);
+       
+       EpozElement.id = IFramePrefix + fieldId;
+       toolBar = document.getElementById("EpozToolbar");
+       toolBar.id = ToolBarPrefix + fieldId;
+       checkBox = document.getElementById("EpozViewMode");
+       checkBox.id = CheckBoxPrefix + fieldId;
+}
+
+
+
+// Initialization functions
+
+if (!formDatas) {
+       var formDatas = new Array();
+}
+
+function InitIframe(name, data, path, toolbox, style, button, css, customcss, charset, pageurl) {
+    form_name = name;
+    form_data = data;
+    form_path = path;
+    form_toolbox = toolbox;
+    form_area_style = style;
+    form_button_style = button;
+    form_css = css;
+    form_customcss = customcss;
+    form_charset = charset;
+    form_pageurl = pageurl;
+    
+    var richText;
+
+    if (browser.isIE55 || browser.isIE6up) {
+        // Mac-IE doesn't support RichText-Edit at the moment
+        if (browser.isMac) {
+            CreateTextarea();
+            richText = false;
+        } else {
+            CreateEpoz();
+            richText = true;
+        }
+    }
+    else if (browser.isGecko) {
+        //check to see if midas is enabled
+        try {
+            // Just a few cleanups for Mozilla
+
+            form_data = form_data.replace(/<strong>/ig,'<b>');
+            form_data = form_data.replace(/<strong(\s[^>]*)>/ig,'<b$1>');
+            form_data = form_data.replace(/<\/strong>/ig,'</b>');
+
+            form_data = form_data.replace(/<em>/ig,'<i>');
+            form_data = form_data.replace(/<em(\s[^>]*)>/ig,'<i$1>');
+            form_data = form_data.replace(/<\/em>/ig,'</i>');
+
+            CreateEpoz();
+            richText = true;
+        } catch (e) {
+          CreateTextarea();
+          richText = false;
+        }
+    }
+    else {
+        CreateTextarea();
+        richText = false;
+    }
+    
+    if (richText) {
+           // change iframe id
+           formDatas[name] = form_data;
+           var iframe = document.getElementById(Epoz);
+           iframe.id = IFramePrefix + name;
+           
+           // change EpozToolbar id
+           var toolBar = document.getElementById("EpozToolbar");
+           toolBar.id = ToolBarPrefix + name;
+           
+           // Retrieve the switch HTML mode checkbox and change id and onclick function.
+           nodes = iframe.parentNode.nextSibling.nextSibling.childNodes;
+           var i;
+           for (i=0 ; i<nodes.length ; i++ ) {
+               if (nodes[i].nodeType == 1 && nodes[i].nodeName == 'INPUT')
+                       break;
+           }
+               var checkbox = nodes[i];
+               checkbox.id = CheckBoxPrefix + name;
+               
+           changeBorderStyle(iframe, "dashed");
+    }
+}
+
+
+
+function HandleEpozRedirect() {
+    if (browser.isIE55 || browser.isIE6up) {
+       iframe = event.srcElement;
+    }
+    else if (browser.isGecko) {
+       iframe = this;
+    }
+       redirectEpoz(iframe);
+}
+
+function redirectAndSwitchViewMode(checkbox) {
+    if (checkbox.id != "EpozViewMode") {    // Otherwise, EpozElement already targets the good field.
+       var iframe = document.getElementById(IFramePrefix + checkbox.id.slice(CheckBoxPrefixLength));
+               redirectEpoz(iframe);
+       }
+       SwitchViewMode(checkbox.checked);
+}
+
+
+// cosmetics
+function changeBorderStyle(ob, borderStyle) {
+       s = ob.style;
+       s.borderBottomStyle = borderStyle;
+       s.borderLeftStyle = borderStyle;
+       s.borderRightStyle = borderStyle;
+       s.borderTopStyle = borderStyle;
+}
+
+// « overloads »
+
+function InitDocument(iframe) {
+    fieldId = iframe.id.slice(IFramePrefixLength);
+    var data = formDatas[fieldId];
+    delete formDatas[fieldId];
+    ta = document.getElementById(fieldId);
+    iframe.contentWindow.document.body.innerHTML = data;
+    ta.value = data;
+    iframe.contentWindow.document.id = DocPrefix + fieldId;
+       addListener(iframe, "click", HandleEpozRedirect);
+       form = retrieveForm(ta);
+       form.onsubmit=SyncEpoz;
+       if (browser.isGecko) {
+               scriptExpr = 'EnableDesignMode("' + iframe.id + '");';
+               window.setTimeout(scriptExpr, 10);
+       }
+}
+
+
+function SyncEpoz() {
+    if (document.getElementsByTagName)
+        var iframes = document.getElementsByTagName("IFRAME");
+    else if (document.all)
+        var iframes = document.all.tags("IFRAME");
+    
+
+    for (var i=0;i<iframes.length;i++) {
+        
+       unwrapEpozVariables();
+       if(!wrapEpozVariables(iframes[i]))
+                       continue;
+
+           var html = TidyHTML(GetHTML());
+           
+           // strip trailing whitespace    
+           html = (html.replace(/^\s*/,'')).replace(/\s*$/,'');
+       
+           // remove single br left by Firefox / Mozilla
+           if (html=="<br />" || html=="<br>" || html=="<p></p>") {
+               html = "";
+           }
+           form_name = EpozElement.contentWindow.document.id.slice(DocPrefixLength);
+           document.getElementById(form_name).value = html;
+       }
+        
+}
+
+function EnableDesignMode(iframeId) {
+       iframe = document.getElementById(iframeId);
+       try {
+           iframe.contentDocument.designMode = "on";
+           iframe.contentWindow.document.addEventListener("keypress", HandleKeyboardEvent, true);
+       } catch (e) {
+               scriptExpr = 'EnableDesignMode("' + iframeId + '");';
+           setTimeout(scriptExpr, 10);
+       }
+}
+
+
+
+//utils
+
+function retrieveForm(baseOb){
+       var pn = baseOb.parentNode;
+       
+       while (pn != document) {
+               if (pn.nodeName == 'FORM')
+                       break;
+               else {
+                       pn = pn.parentNode;
+               }
+       }
+       return pn;
+}
+
+
+function addListener(ob, eventName, functionReference){
+    if (browser.isIE55 || browser.isIE6up) {
+       eventName = "on" + eventName;
+       ob.attachEvent(eventName, functionReference);
+    }
+    else if (browser.isGecko) {
+       ob.addEventListener(eventName, functionReference, false);
+    }
+
+}
\ No newline at end of file