OSDN Git Service

merged 3.2 code
[nucleus-jp/nucleus-jp-ancient.git] / euc / nucleus / bookmarklet.php
1 <?php\r
2 /**\r
3   * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/) \r
4   * Copyright (C) 2002-2005 The Nucleus Group\r
5   *\r
6   * This program is free software; you can redistribute it and/or\r
7   * modify it under the terms of the GNU General Public License\r
8   * as published by the Free Software Foundation; either version 2\r
9   * of the License, or (at your option) any later version.\r
10   * (see nucleus/documentation/index.html#license for more info)\r
11   *\r
12   * This script allows adding items to Nucleus through bookmarklets. The member must be logged in\r
13   * in order to use this.\r
14   *\r
15   * $Id: bookmarklet.php,v 1.3 2005-03-16 08:04:14 kimitake Exp $\r
16   * $NucleusJP: bookmarklet.php,v 1.4 2005/03/15 08:24:16 kimitake Exp $\r
17   */\r
18 \r
19 // bookmarklet is part of admin area (might need XML-RPC)\r
20 $CONF = array();\r
21 $CONF['UsingAdminArea'] = 1;\r
22 \r
23 // include all classes and config data \r
24 include('../config.php');\r
25 \r
26 $action = requestVar('action');\r
27 \r
28 if ($action == 'contextmenucode') {\r
29         bm_doContextMenuCode();\r
30         exit;\r
31 }\r
32 \r
33 if (!$member->isLoggedIn()) {\r
34         bm_loginAndPassThrough();\r
35         exit;\r
36 }\r
37 \r
38 // on successfull login\r
39 if (($action == 'login') && ($member->isLoggedIn()))\r
40         $action = requestVar('nextaction');\r
41 if ($action == '')\r
42         $action = 'add';\r
43         \r
44 sendContentType('application/xhtml+xml', 'bookmarklet-'.$action);       \r
45 \r
46 // check ticket\r
47 $action = strtolower($action);\r
48 $aActionsNotToCheck = array('login', 'add', 'edit');\r
49 if (!in_array($action, $aActionsNotToCheck))\r
50 {\r
51         if (!$manager->checkTicket())\r
52                 bm_doError(_ERROR_BADTICKET);\r
53\r
54 \r
55 \r
56 // find out what to do\r
57 switch ($action) {\r
58         case 'additem':\r
59                 bm_doAddItem();         // adds the item for real\r
60                 break;\r
61         case 'edit':\r
62                 bm_doEditForm();        // shows the edit item form\r
63                 break;\r
64         case 'edititem':                // edits the item for real\r
65                 bm_doEditItem();\r
66                 break;\r
67         case 'login':                   // on login, 'action' gets changed to 'nextaction'\r
68                 bm_doError('Something went wrong');\r
69                 break;\r
70         case 'add':\r
71         default:\r
72                 bm_doShowForm();        // shows the fill in form\r
73                 break;\r
74 }\r
75         \r
76 function bm_doAddItem() {\r
77         global $member, $manager, $CONF;\r
78         \r
79         $manager->loadClass('ITEM');\r
80         $result = ITEM::createFromRequest();\r
81         \r
82         if ($result['status'] == 'error')\r
83                 bm_doError($result['message']);\r
84 \r
85         $blogid = getBlogIDFromItemID($result['itemid']);\r
86         $blog =& $manager->getBlog($blogid);\r
87         \r
88         if ($result['status'] == 'newcategory') {\r
89                 $message = '¥¢¥¤¥Æ¥à¤ÏÄɲ䵤졢¿·¤·¤¤¥«¥Æ¥´¥ê¡¼¤¬ºîÀ®¤µ¤ì¤Þ¤·¤¿¡£ <a href="index.php?action=categoryedit&amp;blogid='.$blogid.'&amp;catid='.$result['catid'].'" onclick="if (event &amp;&amp; event.preventDefault) event.preventDefault(); window.open(this.href); return false;" title="Opens in new window">¤³¤³¤ò¥¯¥ê¥Ã¥¯¤·¤Æ¥«¥Æ¥´¥ê¡¼¤Î̾Á°¤ÈÀâÌÀ¤òÊÔ½¸¤·¤Æ¤¯¤À¤µ¤¤¡£</a>';\r
90                 $extrahead = '';\r
91         } elseif ((postVar('actiontype') == 'addnow') && $blog->pingUserland()) {\r
92                 $message = '¥¢¥¤¥Æ¥à¤ÎÄɲäËÀ®¸ù¤·¤Þ¤·¤¿¡£¸½ºßweblogs.com¤Ëping¤òÁ÷¤Ã¤Æ¤¤¤Þ¤¹¡£¤·¤Ð¤é¤¯¤Î´Ö¤ªÂÔ¤Á¤¯¤À¤µ¤¤...';\r
93                 $extrahead = '<meta http-equiv="refresh" content="1; url=index.php?action=sendping&amp;blogid=' . $blogid . '" />';\r
94         } else {\r
95                 $message = _ITEM_ADDED;\r
96                 $extrahead = '';\r
97         }\r
98         \r
99         bm_message(_ITEM_ADDED, _ITEM_ADDED, $message,$extrahead);\r
100 }\r
101 \r
102 function bm_doEditItem() {\r
103         global $member, $manager, $CONF;\r
104         \r
105         $itemid         = intRequestVar('itemid');\r
106         $catid          = postVar('catid');\r
107         \r
108         // only allow if user is allowed to alter item\r
109         if (!$member->canUpdateItem($itemid, $catid))\r
110                 bm_doError(_ERROR_DISALLOWED);\r
111 \r
112         $body           = postVar('body');\r
113         $title          = postVar('title');\r
114         $more           = postVar('more');\r
115         $closed         = intPostVar('closed');\r
116         $actiontype = postVar('actiontype');\r
117         \r
118         // redirect to admin area on delete (has delete confirmation)\r
119         if ($actiontype == 'delete') {\r
120                 redirect('index.php?action=itemdelete&itemid='.$itemid);\r
121                 exit;   \r
122         }\r
123         \r
124         // create new category if needed (only on edit/changedate)\r
125         if (strstr($catid,'newcat')) {\r
126                 // get blogid \r
127                 list($blogid) = sscanf($catid,"newcat-%d");\r
128 \r
129                 // create\r
130                 $blog =& $manager->getBlog($blogid);\r
131                 $catid = $blog->createNewCategory();\r
132 \r
133                 // show error when sth goes wrong\r
134                 if (!$catid) \r
135                         bm_doError('Could not create new category');\r
136         } \r
137 \r
138         // only edit action is allowed for bookmarklet edit\r
139         switch ($actiontype) {\r
140                 case 'changedate':\r
141                         $publish = 1;\r
142                         $wasdraft = 0;\r
143                         $timestamp = mktime(postVar('hour'), postVar('minutes'), 0, postVar('month'), postVar('day'), postVar('year'));\r
144                         break;\r
145                 case 'edit':\r
146                         $publish = 1;\r
147                         $wasdraft = 0;\r
148                         $timestamp = 0;\r
149                         break;\r
150                 default:\r
151                         bm_doError('Something went wrong');\r
152         }\r
153         \r
154         // update item for real\r
155         ITEM::update($itemid, $catid, $title, $body, $more, $closed, $wasdraft, $publish, $timestamp);\r
156         \r
157         // show success message\r
158         if ($catid != intPostVar('catid'))\r
159                 bm_message(_ITEM_UPDATED, _ITEM_UPDATED, '¥¢¥¤¥Æ¥à¤ÏÄɲ䵤졢¿·¤·¤¤¥«¥Æ¥´¥ê¡¼¤¬ºîÀ®¤µ¤ì¤Þ¤·¤¿¡£<a href="index.php?action=categoryedit&amp;blogid='.$blog->getID().'&amp;catid='.$catid.'" onclick="if (event &amp;&amp; event.preventDefault) event.preventDefault(); window.open(this.href); return false;" title="Opens in new window">¤³¤³¤ò¥¯¥ê¥Ã¥¯¤·¤Æ¥«¥Æ¥´¥ê¡¼¤Î̾Á°¤ÈÀâÌÀ¤òÊÔ½¸¤·¤Æ¤¯¤À¤µ¤¤¡£</a>', '');\r
160         else\r
161                 bm_message(_ITEM_UPDATED, _ITEM_UPDATED, _ITEM_UPDATED, '');\r
162 }\r
163 \r
164 function bm_loginAndPassThrough() {\r
165 \r
166         $blogid = intRequestVar('blogid');\r
167         $log_text = requestVar('logtext');\r
168         $log_link = requestVar('loglink');\r
169         $log_linktitle = requestVar('loglinktitle');\r
170         \r
171         ?>\r
172 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
173         <html xmlns="http://www.w3.org/1999/xhtml">\r
174         <head>\r
175                 <meta http-equiv="Content-Type" content="text/html; charset=<?php echo _CHARSET ?>" />\r
176                 <title>Nucleus</title>\r
177                 <?php bm_style(); ?>\r
178         </head>\r
179         <body>\r
180         <h1><?php echo _LOGIN_PLEASE?></h1>\r
181         \r
182         <form method="post" action="bookmarklet.php">\r
183         <p>\r
184                 <input name="action" value="login" type="hidden" />\r
185                 <input name="blogid" value="<?php echo  htmlspecialchars($blogid) ?>" type="hidden" />\r
186                 <input name="logtext" value="<?php echo  htmlspecialchars($log_text) ?>" type="hidden" />\r
187                 <input name="loglink" value="<?php echo  htmlspecialchars($log_link) ?>" type="hidden" />\r
188                 <input name="loglinktitle" value="<?php echo  htmlspecialchars($log_linktitle) ?>" type="hidden" />\r
189                 <?php echo _LOGINFORM_NAME?>:\r
190                 <br /><input name="login" />\r
191                 <br /><?php echo _LOGINFORM_PWD?>:\r
192                 <br /><input name="password" type="password" />\r
193                 <br /><br />\r
194                 <br /><input type="submit" value="<?php echo _LOGIN?>" />\r
195         </p>\r
196         </form>\r
197         <p><a href="bookmarklet.php" onclick="window.close();"><?php echo _POPUP_CLOSE?></a></p>\r
198         </body>\r
199         </html>\r
200         <?php\r
201 }\r
202 \r
203 function bm_doShowForm() {\r
204         global $member;\r
205         \r
206         $blogid = intRequestVar('blogid');\r
207         $log_text = trim(requestVar('logtext'));\r
208         $log_link = requestVar('loglink');\r
209         $log_linktitle = requestVar('loglinktitle');\r
210 \r
211         $log_text = uniDecode($log_text,_CHARSET);\r
212         $log_linktitle = uniDecode($log_linktitle,_CHARSET);\r
213         \r
214         if (!BLOG::existsID($blogid))\r
215                 bm_doError(_ERROR_NOSUCHBLOG);\r
216 \r
217         if (!$member->isTeamMember($blogid))\r
218                 bm_doError(_ERROR_NOTONTEAM);\r
219         \r
220         $logje = '';\r
221         if ($log_text)\r
222                 $logje .= '<blockquote><div>"' . htmlspecialchars($log_text) .'"</div></blockquote>' . "\n";\r
223         if (!$log_linktitle)\r
224                 $log_linktitle = $log_link;\r
225         if ($log_link) \r
226                 $logje .= '<a href="'. htmlspecialchars($log_link) . '">'. htmlspecialchars($log_linktitle).'</a>';\r
227                 \r
228 \r
229         $item['body'] = $logje;\r
230         $item['title'] = htmlspecialchars($log_linktitle);\r
231 \r
232         $factory = new PAGEFACTORY($blogid);\r
233         $factory->createAddForm('bookmarklet',$item);\r
234 }\r
235 \r
236 function bm_doEditForm() {\r
237         global $member, $manager;\r
238         \r
239         $itemid = intRequestVar('itemid');\r
240         \r
241         if (!$manager->existsItem($itemid, 0, 0)) \r
242                 bm_doError(_ERROR_NOSUCHITEM);\r
243                 \r
244         if (!$member->canAlterItem($itemid))\r
245                 bm_doError(_ERROR_DISALLOWED);\r
246                 \r
247         $item =& $manager->getItem($itemid,1,1);\r
248         $blog =& $manager->getBlog(getBlogIDFromItemID($itemid));\r
249         \r
250         $manager->notify('PrepareItemForEdit', array('item' => &$item));\r
251 \r
252         if ($blog->convertBreaks()) {\r
253                 $item['body'] = removeBreaks($item['body']);\r
254                 $item['more'] = removeBreaks($item['more']);\r
255         }\r
256 \r
257         $formfactory = new PAGEFACTORY($blog->getID());\r
258         $formfactory->createEditForm('bookmarklet',$item);              \r
259 \r
260 }\r
261 \r
262 function bm_doError($msg) {\r
263         bm_message(_ERROR,_ERRORMSG,$msg);\r
264         die;\r
265 }\r
266 \r
267 function bm_message($title, $head, $msg, $extrahead = '') {\r
268         ?>\r
269 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
270         <html xmlns="http://www.w3.org/1999/xhtml">\r
271         <head>\r
272                 <meta http-equiv="Content-Type" content="text/html; charset=<?php echo _CHARSET ?>" />\r
273                 <title><?php echo  $title ?></title>\r
274                 <?php bm_style(); ?>\r
275                 <?php echo $extrahead?>\r
276         </head>\r
277         <body>\r
278         <h1><?php echo  $head ?></h1>\r
279         <p><?php echo  $msg ?></p>\r
280         <p><a href="bookmarklet.php" onclick="window.close();"><?php echo _POPUP_CLOSE?></a></p>\r
281         </body>\r
282         </html>\r
283         \r
284         <?php }\r
285 \r
286 function bm_style() {\r
287         echo '<link rel="stylesheet" type="text/css" href="styles/bookmarklet.css" />';\r
288         echo '<link rel="stylesheet" type="text/css" href="styles/addedit.css" />';     \r
289 }\r
290 \r
291 function bm_doContextMenuCode() {\r
292         global $CONF;\r
293         ?>\r
294 <script type="text/javascript" defer="defer">\r
295 doc=external.menuArguments.document;\r
296 lt=escape(doc.selection.createRange().text);\r
297 loglink=escape(external.menuArguments.location.href);\r
298 loglinktitle=escape(doc.title);\r
299 wingm=window.open('<?php echo $CONF['AdminURL']?>bookmarklet.php?blogid=<?php echo intGetVar('blogid')?>&logtext='+lt+'&loglink='+loglink+'&loglinktitle='+loglinktitle,'nucleusbm','scrollbars=yes,width=600,height=500,left=10,top=10,status=yes,resizable=yes');\r
300 wingm.focus();\r
301 </script>       \r
302         <?php\r
303 }\r
304 \r
305 function uniDecode($str,$charcode){\r
306   $text = preg_replace_callback("/%u[0-9A-Za-z]{4}/",toUtf8,$str);\r
307   return mb_convert_encoding($text, $charcode, 'UTF-8');\r
308 }\r
309 function toUtf8($ar){\r
310   foreach($ar as $val){\r
311     $val = intval(substr($val,2),16);\r
312     if($val < 0x7F){        // 0000-007F\r
313         $c .= chr($val);\r
314     }elseif($val < 0x800) { // 0080-0800\r
315         $c .= chr(0xC0 | ($val / 64));\r
316         $c .= chr(0x80 | ($val % 64));\r
317     }else{                // 0800-FFFF\r
318         $c .= chr(0xE0 | (($val / 64) / 64));\r
319         $c .= chr(0x80 | (($val / 64) % 64));\r
320         $c .= chr(0x80 | ($val % 64));\r
321     }\r
322   }\r
323   return $c;\r
324 }\r
325 \r
326 ?>\r