OSDN Git Service

NP_admin 0.1.9
[nucleus-jp/nucleus-plugins.git] / NP_admin / trunk / skins / admin / javascript / edit.js
diff --git a/NP_admin/trunk/skins/admin/javascript/edit.js b/NP_admin/trunk/skins/admin/javascript/edit.js
new file mode 100644 (file)
index 0000000..c21fbf6
--- /dev/null
@@ -0,0 +1,348 @@
+/**\r
+  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
+  * Copyright (C) 2002-2007 The Nucleus Group\r
+  *\r
+  * This program is free software; you can redistribute it and/or\r
+  * modify it under the terms of the GNU General Public License\r
+  * as published by the Free Software Foundation; either version 2\r
+  * of the License, or (at your option) any later version.\r
+  * (see nucleus/documentation/index.html#license for more info)\r
+  *\r
+  * This file contains functions to allow adding items from inside the weblog.\r
+  * Also contains code to avoid submitting form data twice.\r
+  *\r
+  * $Id: edit.js 1116 2007-02-03 08:24:29Z kimitake $\r
+  * $NucleusJP: edit.js,v 1.6 2007/02/04 06:28:45 kimitake Exp $\r
+  */\r
+\r
+var nucleusConvertBreaks = true;\r
+var nucleusMediaPopupURL = '';\r
+var nucleusMediaURL = 'media/';\r
+var nucleusAuthorId = 0;\r
+var scrollTop = -1;\r
+\r
+function setConvertBreaks(newval) {    nucleusConvertBreaks = newval; }\r
+function setMediaUrl(url) { nucleusMediaURL = url; }\r
+function setAuthorId(id) { nucleusAuthorId = id; }\r
+\r
+function preview(id, value) {\r
+       elem = document.getElementById(id);\r
+       if (!elem) return;\r
+\r
+       var preview = nucleusConvertBreaks ? str_replace("\n","<br />",value)+"&#160;" : value+"&#160;";\r
+\r
+       // expand the media commands (without explicit collection)\r
+       preview = preview.replace(/\<\%image\(([^\/\|]*)\|([^\|]*)\|([^\|]*)\|([^)]*)\)\%\>/g,"<img src='"+nucleusMediaURL+nucleusAuthorId+"/$1' width='$2' height='$3' alt=\"$4\" />");\r
+\r
+       // expand the media commands (with collection)\r
+       preview = preview.replace(/\<\%image\(([^\|]*)\|([^\|]*)\|([^\|]*)\|([^)]*)\)\%\>/g,"<img src='"+nucleusMediaURL+"$1' width='$2' height='$3' alt=\"$4\" />");\r
+       preview = preview.replace(/\<\%popup\(([^\|]*)\|([^\|]*)\|([^\|]*)\|([^)]*)\)\%\>/g,"<a href='' onclick='if (event &amp;&amp; event.preventDefault) event.preventDefault(); alert(\"popup image\"); return false;' title='popup'>$4</a>");\r
+       preview = preview.replace(/\<\%media\(([^\|]*)\|([^)]*)\)\%\>/g,"<a href='' title='media link'>$2</a>");\r
+\r
+       elem.innerHTML = preview;\r
+}\r
+\r
+function showedit() {\r
+       prevval = document.getElementById('edit').style.display;\r
+       if (prevval == "block")\r
+               newval = "none";\r
+       else\r
+               newval = "block";\r
+       document.getElementById('edit').style.display = newval;\r
+\r
+       if (newval == "block")\r
+               updAllPreviews();\r
+}\r
+\r
+function updAllPreviews() {\r
+       updPreview('title');\r
+       updPreview('body');\r
+       updPreview('more');\r
+}\r
+\r
+function isEditVisible() {\r
+       var editform = document.getElementById('edit');\r
+       if (!editform) return true;\r
+       var prevval = editform.style.display;\r
+       return (prevval == "none") ? false : true;\r
+}\r
+\r
+function updPreview(id) {\r
+       // don't update when preview is hidden\r
+       if (!isEditVisible()) return;\r
+\r
+       var inputField = document.getElementById('input' + id);\r
+       if (!inputField) return;\r
+       preview('prev' + id, inputField.value);\r
+}\r
+\r
+// replace a in s by b (taken from milov.nl)\r
+function str_replace(a, b, s)\r
+{\r
+       if (a == b || !s.length || !a.length) return s;\r
+       if ((p=s.indexOf(a)) == -1) { return s; }\r
+       else { ns = s.substring(0,p) + b + s.substring(p+a.length,s.length); }\r
+       return (s.indexOf(a) != -1) ? str_replace(a, b, ns) : ns;\r
+}\r
+\r
+function shortCuts() {\r
+       if (!event || (event.ctrlKey != true)) return;\r
+\r
+       switch (event.keyCode) {\r
+               case 1:\r
+                       ahrefThis(); break; // ctrl-shift-a\r
+               case 2:\r
+                       boldThis(); break; // ctrl-shift-b\r
+               case 9:\r
+                       italicThis(); break; // ctrl-shift-i\r
+               case 13:\r
+                       addMedia(); break; // ctrl-shift-m\r
+               default:\r
+                       return;\r
+       }\r
+       return;\r
+}\r
+\r
+function cutThis() { execAndUpdate('cut'); }\r
+function copyThis() { execAndUpdate('copy'); }\r
+function pasteThis() { execAndUpdate('paste'); }\r
+function boldThis() { insertAroundCaret('<b>','</b>'); }\r
+function italicThis() { insertAroundCaret('<i>','</i>'); }\r
+function leftThis() { insertAroundCaret('<div class="leftbox">','</div>'); }\r
+function rightThis() { insertAroundCaret('<div class="rightbox">','</div>'); }\r
+function alignleftThis() { insertAroundCaret('<div style="text-align: left">','</div>'); }\r
+function alignrightThis() { insertAroundCaret('<div style="text-align: right">','</div>'); }\r
+function aligncenterThis() { insertAroundCaret('<div style="text-align: center">','</div>'); }\r
+\r
+\r
+function ahrefThis() {\r
+       if (document.selection)\r
+               strSelection = document.selection.createRange().text;\r
+       else\r
+               strSelection = '';\r
+\r
+       strHref = prompt("Create a link to:","http://");\r
+       if (strHref == null) return;\r
+\r
+       var textpre = "<a href=\"" + strHref.replace(/&/g,'&amp;') + "\">";\r
+       insertAroundCaret(textpre, "</a>");\r
+}\r
+\r
+function execAndUpdate(action) {\r
+       lastSelected.caretPos.execCommand(action);\r
+       updAllPreviews();\r
+}\r
+\r
+\r
+var nonie_FormType = 'body';\r
+\r
+// Add media to new item\r
+function addMedia() {\r
+\r
+       var mediapopup = window.open(nucleusMediaPopupURL + 'media.php','name',\r
+               'status=yes,toolbar=no,scrollbars=yes,resizable=yes,width=500,height=450,top=0,left=0');\r
+\r
+       return;\r
+}\r
+\r
+\r
+function setMediaPopupURL(url) {\r
+       nucleusMediaPopupURL = url;\r
+}\r
+\r
+function includeImage(collection, filename, type, width, height) {\r
+       if (isCaretEmpty()) {\r
+               text = prompt("Text to display ?","");\r
+       } else {\r
+               text = getCaretText();\r
+       }\r
+\r
+       // add collection name when not private collection (or editing a message that's not your)\r
+       var fullName;\r
+       if (isNaN(collection) || (nucleusAuthorId != collection)) {\r
+               fullName = collection + '/' + filename;\r
+       } else {\r
+               fullName = filename;\r
+       }\r
+\r
+\r
+       var replaceBy;\r
+       switch(type) {\r
+               case 'popup':\r
+                       replaceBy = '<%popup(' +  fullName + '|'+width+'|'+height+'|' + text +')%>';\r
+                       break;\r
+               case 'inline':\r
+               default:\r
+                       replaceBy = '<%image(' +  fullName + '|'+width+'|'+height+'|' + text +')%>';\r
+       }\r
+\r
+       insertAtCaret(replaceBy);\r
+       updAllPreviews();\r
+\r
+}\r
+\r
+\r
+function includeOtherMedia(collection, filename) {\r
+       if (isCaretEmpty()) {\r
+               text = prompt("Text to display ?","");\r
+       } else {\r
+               text = getCaretText();\r
+       }\r
+\r
+       // add collection name when not private collection (or editing a message that's not your)\r
+       var fullName;\r
+       if (isNaN(collection) || (nucleusAuthorId != collection)) {\r
+               fullName = collection + '/' + filename;\r
+       } else {\r
+               fullName = filename;\r
+       }\r
+\r
+       var replaceBy = '<%media(' +  fullName + '|' + text +')%>';\r
+\r
+       insertAtCaret(replaceBy);\r
+       updAllPreviews();\r
+}\r
+\r
+\r
+\r
+// function to prevent submitting form data twice\r
+var submitcount=0;\r
+function checkSubmit() {\r
+       if (submitcount == 0) {\r
+               submitcount++;\r
+               return true;\r
+       } else {\r
+               return false;\r
+       }\r
+}\r
+\r
+\r
+// code to store the caret (cursor) position of a text field/text area\r
+// taken from javascript.faqts and modified\r
+// http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130\r
+\r
+// stores the caret\r
+var lastSelected, lastCaretPos;\r
+function storeCaret (textEl) {\r
+\r
+       // store caret\r
+       if (textEl.createTextRange) \r
+               //textEl.caretPos = document.selection.createRange().duplicate();\r
+               lastCaretPos = document.selection.createRange().duplicate();\r
+\r
+       // also store lastselectedelement\r
+       lastSelected = textEl;\r
+       \r
+       nonie_FormType = textEl.name;\r
+\r
+       scrollTop = textEl.scrollTop;\r
+}\r
+\r
+//var lastSelected;\r
+\r
+// inserts text at caret (overwriting selection)\r
+function insertAtCaret (text) {\r
+       var textEl = lastSelected;\r
+       if (textEl && textEl.createTextRange && lastCaretPos) {\r
+               var caretPos = lastCaretPos;\r
+               caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;\r
+       } else if (!document.all && document.getElementById) {\r
+               mozReplace(document.getElementById('input' + nonie_FormType), text);                            \r
+               if(scrollTop>-1) {\r
+                       document.getElementById('input' + nonie_FormType).scrollTop = scrollTop;\r
+               }\r
+       } else if (textEl) {\r
+               textEl.value  += text;\r
+       } else {\r
+               document.getElementById('input' + nonie_FormType).value += text;                \r
+               if(scrollTop>-1) {\r
+                       document.getElementById('input' + nonie_FormType).scrollTop = scrollTop;\r
+               }\r
+       }\r
+       updAllPreviews();\r
+}\r
+\r
+// inserts a tag around the selected text\r
+function insertAroundCaret (textpre, textpost) {\r
+       var textEl = lastSelected;\r
+       \r
+       if (textEl && textEl.createTextRange && lastCaretPos) {\r
+               var caretPos = lastCaretPos;\r
+               caretPos.text = textpre + caretPos.text + textpost;\r
+       } else if (!document.all && document.getElementById) {\r
+               mozWrap(document.getElementById('input' + nonie_FormType), textpre, textpost);          \r
+               if(scrollTop>-1) {\r
+                       document.getElementById('input' + nonie_FormType).scrollTop = scrollTop;\r
+               }\r
+       } else {\r
+               document.getElementById('input' + nonie_FormType).value += textpre + textpost;\r
+               if(scrollTop>-1) {\r
+                       document.getElementById('input' + nonie_FormType).scrollTop = scrollTop;\r
+               }\r
+       }\r
+\r
+       updAllPreviews();\r
+}\r
+\r
+/* some methods to get things working in Mozilla as well */\r
+function mozWrap(txtarea, lft, rgt) {\r
+       var selLength = txtarea.textLength;\r
+       var selStart = txtarea.selectionStart;\r
+       var selEnd = txtarea.selectionEnd;\r
+       if (selEnd==1 || selEnd==2) selEnd=selLength;\r
+       var s1 = (txtarea.value).substring(0,selStart);\r
+       var s2 = (txtarea.value).substring(selStart, selEnd)\r
+       var s3 = (txtarea.value).substring(selEnd, selLength);\r
+       txtarea.value = s1 + lft + s2 + rgt + s3;\r
+}\r
+function mozReplace(txtarea, newText) {\r
+       var selLength = txtarea.textLength;\r
+       var selStart = txtarea.selectionStart;\r
+       var selEnd = txtarea.selectionEnd;\r
+       if (selEnd==1 || selEnd==2) selEnd=selLength;\r
+       var s1 = (txtarea.value).substring(0,selStart);\r
+       var s2 = (txtarea.value).substring(selStart, selEnd)\r
+       var s3 = (txtarea.value).substring(selEnd, selLength);\r
+       txtarea.value = s1 + newText + s3;\r
+}\r
+function mozSelectedText() {\r
+       var txtarea = document.getElementById('input' + nonie_FormType);\r
+       var selLength = txtarea.textLength;\r
+       var selStart = txtarea.selectionStart;\r
+       var selEnd = txtarea.selectionEnd;\r
+       if (selEnd==1 || selEnd==2) selEnd=selLength;\r
+       return (txtarea.value).substring(selStart, selEnd);\r
+}\r
+\r
+function getCaretText() {\r
+       if (!document.all && document.getElementById)\r
+               return mozSelectedText();\r
+       else\r
+               return lastCaretPos.text;\r
+}\r
+\r
+function isCaretEmpty() {\r
+       if (lastSelected && lastSelected.createTextRange && lastCaretPos)\r
+               return (lastCaretPos.text == '');\r
+       else if (!document.all && document.getElementById)\r
+               return (mozSelectedText() == '');\r
+       else\r
+               return true;\r
+}\r
+\r
+function BtnHighlight(el) {\r
+       with(el.style){\r
+               borderLeft="1px solid gray";\r
+               borderRight="1px solid #e9e9e9";\r
+               borderTop="1px solid gray";\r
+               borderBottom="1px solid #e9e9e9";\r
+       }\r
+}\r
+\r
+function BtnNormal(el) {\r
+       with(el.style){\r
+               padding="3px";\r
+               border="1px solid #dddddd";\r
+       }\r
+}\r
+\r