root/tags/stable/phptagengine.js.php

Revision 20 (checked in by svn, 2 years ago)

creating 1.0 and stable tags

Line 
1 <?php
2
3 // Copyright (c) 2006-2007 Alex King. All rights reserved.
4 // http://alexking.org/projects/php-tag-engine
5 //
6 // Released under the LGPL license
7 // http://www.opensource.org/licenses/lgpl-license.php
8 //
9 // **********************************************************************
10 // This program is distributed in the hope that it will be useful, but
11 // WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 // **********************************************************************
14
15 ini_set('display_errors', '0');
16 ini_set('error_reporting', E_PARSE);
17
18 /**
19  * The JavaScript for PHP Tag Engine
20  *
21  * Includes the AJAX code and sets the strings for localization
22  *
23  * @package phptagengine
24  */
25
26 $pte_js = true;
27
28 require_once('phptagengine.class.inc.php');
29 require_once('phptagengine.config.inc.php');
30
31 if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
32         $if_modified_since = preg_replace('/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']);
33        
34         $config = filemtime('phptagengine.config.inc.php');
35         $language = filemtime('languages/'.$pte->language.'.inc.php');
36         if ($config > $language) {
37                 $mtime = $config;
38         }
39         else {
40                 $mtime = $language;
41         }
42         $gmdate_mod = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
43        
44         if ($if_modified_since == $gmdate_mod) {
45                 header("HTTP/1.0 304 Not Modified");
46                 exit;
47         }
48         header("Last-Modified: $gmdate_mod");
49 }
50
51 @ob_start('ob_gzhandler');
52
53 header("Content-type: text/javascript");
54 header('Expires: '.gmdate('D, d M Y H:i:s', time()+24*60*60) . ' GMT');
55
56 if ($pte->yac) {
57         foreach ($pte->yac_files as $file) {
58                 readfile('yui/'.$file);
59         }
60 }
61
62 ?>
63
64 // Copyright (c) 2006 Alex King. All rights reserved.
65 // http://www.alexking.org/software/phptagengine/
66 //
67 // Released under the LGPL license
68 // http://www.opensource.org/licenses/lgpl-license.php
69 //
70 // **********************************************************************
71 // This program is distributed in the hope that it will be useful, but
72 // WITHOUT ANY WARRANTY; without even the implied warranty of
73 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
74 // **********************************************************************
75
76 var pte = {
77         req : false
78         , ajax_handler : '<?php print($pte->ajax_handler); ?>'
79         , tag_browse_url : '<?php print($pte->tag_browse_url); ?>'
80         , strings : {}
81         , show_remove_links : <?php if ($pte->show_remove_links) { print('true'); } else { print('false'); } ?>
82         , edit_button_display : '<?php print($pte->edit_button_display); ?>'
83         , edit_button_image_url : '<?php print($pte->edit_button_image_url); ?>'
84         , delete_button_display : '<?php print($pte->delete_button_display); ?>'
85         , delete_button_image_url : '<?php print($pte->delete_button_image_url); ?>'
86 }
87
88 <?php
89 // put language strings into the JS scope
90 foreach ($pte->strings as $k => $v) {
91         print('pte.strings["'.$k.'"] = "'.$pte->slash($v).'";'."\n");
92 }
93 ?>
94
95 pte.pipe = function(url, handler, content) {
96         if (typeof content == 'undefined') {
97                 content = '';
98         }
99         pte.req = false;
100         if (window.XMLHttpRequest) {
101 // branch for native XMLHttpRequest object
102                 try {
103                         pte.req = new XMLHttpRequest();
104                 }
105                 catch(e) {
106                         pte.req = false;
107                 }
108         }
109         else if (window.ActiveXObject) {
110 // branch for IE/Windows ActiveX version
111                 try {
112                         pte.req = new ActiveXObject("Msxml2.XMLHTTP");
113                 }
114                 catch(e) {
115                         try {
116                                 pte.req = new ActiveXObject("Microsoft.XMLHTTP");
117                         }
118                         catch(e) {
119                                 pte.req = false;
120                         }
121                 }
122         }
123         if (pte.req) {
124 // debug
125 // prompt('piping:', url);
126                 pte.req.onreadystatechange = handler;
127                 pte.req.open("GET", url, true);
128                 pte.req.send(content);
129         }
130 }
131
132 pte.save_tags = function(user, item, tags, type) {
133         pte.item_tag_view(item, 'saving');
134         var url = this.ajax_handler + '?pte_action=save_tags'
135                 + '&user=' + encodeURIComponent(user)
136                 + '&item=' + encodeURIComponent(item)
137                 + '&tags=' + encodeURIComponent(tags)
138                 + '&type=' + encodeURIComponent(type)
139                 ;
140         pte.pipe(url, pte.save_tags_handler);
141 }
142
143 pte.save_tags_handler = function() {
144         if (pte.req.readyState == 4) {
145                 if (pte.req.status == 200) {
146                         var result = pte.req.responseXML.getElementsByTagName('result')[0];
147                         if (result.getAttribute('success') == 'y' && result.getAttribute('action') == 'save_tags') {
148                                 var tags = result.getElementsByTagName('tags')[0].firstChild.nodeValue;
149                                 var item = result.getAttribute('item');
150                                
151                                 var tags_node = document.getElementById('pte_tags_list_' + item);
152                                 tags_node.innerHTML = '';
153
154                                 if (tags == '') {
155                                         pte.clear_tags_display(item);
156                                 }
157                                 else {
158                                         document.getElementById('pte_tags_edit_field_' + item).value = tags + ' ';
159                                         if (tags.indexOf(' ') != -1) {
160                                                 tags = tags.split(' ');
161                                         }
162                                         else {
163                                                 tags = new Array(tags);
164                                         }
165                                         if (tags.length > 0) {
166                                                 var tag_nodes = pte.create_tag_nodes(tags, result);
167                                                 for (var i = 0; i < tag_nodes.length; i++) {
168                                                         tags_node.appendChild(tag_nodes[i]);
169                                                 }
170                                         }
171                                 }
172                                 tags_node.appendChild(pte.create_edit_node(item));
173                                 
174                                 pte.item_tag_view(item, 'view');
175                         }
176                         else {
177 // TODO
178 alert('Error saving tags: ' + pte.req.responseText);
179                         }
180                 }
181         }
182 }
183
184 pte.remove_tag = function(item, tag, type) {
185         var url = pte.ajax_handler + '?pte_action=remove_tag&item=' + encodeURIComponent(item)
186                 + '&tag=' + encodeURIComponent(tag) + '&type=' + encodeURIComponent(type);
187         pte.pipe(url, pte.remove_tag_handler);
188 }
189
190 pte.remove_tag_handler = function() {
191         if (pte.req.readyState == 4) {
192                 if (pte.req.status == 200) {
193                         var result = pte.req.responseXML.getElementsByTagName('result')[0];
194                         if (result.getAttribute('success') == 'y' && result.getAttribute('action') == 'remove_tag') {
195                                 var item = result.getAttribute('item');
196                                 var tag = result.getElementsByTagName('tag')[0].firstChild.nodeValue;
197                                 var parent = document.getElementById('pte_tags_list_' + item);
198                                 var child = document.getElementById('pte_tag_' + item + '_' + tag);
199                                 parent.removeChild(child);
200                         }
201                 }
202         }
203 }
204
205 pte.edit_tag = function(tag) {
206         var url = pte.ajax_handler + '?pte_action=edit_tag&tag=' + encodeURIComponent(tag);
207         pte.pipe(url, pte.edit_tag_handler);
208 }
209
210 pte.edit_tag_handler = function() {
211         if (pte.req.readyState == 4) {
212                 if (pte.req.status == 200) {
213                         var result = pte.req.responseXML.getElementsByTagName('result')[0];
214                         if (result.getAttribute('success') == 'y' && result.getAttribute('action') == 'edit_tag') {
215                                 var old_tag = result.getElementsByTagName('old_tag')[0].firstChild.nodeValue;
216                                 var new_tag = result.getElementsByTagName('new_tag')[0].firstChild.nodeValue;
217                                 var old_tag_node = document.getElementById('pte_tag_' + old_tag);
218                                 var new_tag_node = document.getElementById('pte_tag_' + new_tag);
219                                 if (new_tag_node) {
220                                         old_tag_node.parentNode.removeChild(old_tag_node);
221                                 }
222                                 else if (old_tag_node) {
223                                         old_tag_node.id = 'pte_tag_' + new_tag;
224                                         old_tag_node.getElementsByTagName['a'][0].innerHTML = new_tag;
225                                 }
226                         }
227                 }
228         }
229 }
230
231 pte.delete_tag = function(tag) {
232         var url = pte.ajax_handler + '?pte_action=delete_tag&tag=' + encodeURIComponent(tag);
233         pte.pipe(url, pte.delete_tag_handler);
234 }
235
236 pte.delete_tag_handler = function() {
237         if (pte.req.readyState == 4) {
238                 if (pte.req.status == 200) {
239                         var result = pte.req.responseXML.getElementsByTagName('result')[0];
240                         if (result.getAttribute('success') == 'y' && result.getAttribute('action') == 'delete_tag') {
241                                 var tag = result.getElementsByTagName('tag')[0].firstChild.nodeValue;
242                                 var tag_node = document.getElementById('pte_tag_' + tag);
243                                 if (tag_node) {
244                                         tag_node.parentNode.removeChild(tag_node);
245                                 }
246                         }
247                 }
248         }
249 }
250
251 pte.create_tag_nodes = function(tags, result) {
252         var tag_nodes = new Array();
253         var item = result.getAttribute('item');
254         var type = result.getAttribute('type');
255         for (var i = 0; i < tags.length; i++) {
256                 var tag_link = document.createElement('a');
257                 tag_link.innerHTML = tags[i];
258                 tag_link.href = pte.get_tag_browse_url(tags[i], result.getAttribute('type'));
259
260                 var tag_node = document.createElement('li');
261                 tag_node.id = 'pte_tag_' + item + '_' + tags[i];
262                 tag_node.appendChild(tag_link);
263                 tag_node.appendChild(document.createTextNode(' '));
264
265                 if (pte.show_remove_links) {
266                         var remove_link = document.createElement('a');
267                         remove_link.innerHTML = pte.button_display('delete');
268                         remove_link.href = "javascript:void(pte.remove_tag('" + item + "', '" + tags[i] + "', '" + type + "'));";
269                         tag_node.appendChild(remove_link);
270                 }
271
272                 tag_nodes.push(tag_node);
273         }
274         return tag_nodes;
275 }
276
277 pte.get_tag_browse_url = function(tag, type) {
278         var url = pte.tag_browse_url.replace('<tag>', tag);
279         return url.replace('<type>', type);
280 }
281
282 pte.item_tag_view = function(item, display) {
283         document.getElementById('pte_tags_list_' + item).style.display = 'none';
284         document.getElementById('pte_tags_edit_' + item).style.display = 'none';
285         document.getElementById('pte_tags_saving_' + item).style.display = 'none';
286         switch (display) {
287                 case 'view':
288                         display = 'list';
289                 case 'edit':
290                 case 'saving':
291                         document.getElementById('pte_tags_' + display + '_' + item).style.display = 'inline';
292                         if (display == 'edit') {
293                                 document.getElementById('pte_tags_edit_field_' + item).focus();
294                         }
295                         break;
296         }
297 }
298
299 pte.clear_tags_display = function(item) {
300 // clear view
301         var tags = document.getElementById('pte_tags_list_' + item);
302         tags.innerHTML = '';
303         banner = document.createElement('li');
304         banner.innerHTML = pte.strings['data_none'];
305         tags.appendChild(banner);
306         pte.item_tag_view(item, 'view');
307 // clear edit
308         document.getElementById('pte_tags_edit_field_' + item).value = '';
309 }
310
311 pte.button_display = function(type) {
312         var display = '';
313         switch (type) {
314                 case 'edit':
315                         var scase = pte.edit_button_display;
316                         var url = pte.edit_button_image_url;
317                         break;
318                 case 'delete':
319                         var scase = pte.delete_button_display;
320                         var url = pte.delete_button_image_url;
321                         break;
322                 default:
323                         return display;
324         }
325         switch (scase) {
326                 case 'text':
327                         if (pte.strings['action_' + type + '_text_icon']) {
328                                 display = pte.strings['action_' + type + '_text_icon'];
329                         }
330                         else {
331                                 display = pte.strings['action_' + type];
332                         }
333                         break;
334                 case 'image':
335                         display = '<img src="' + url + '" alt="' + pte.slash(pte.strings['action_' + type], '"') + '" class="pte_button_' + type + '" />';
336                         break;
337         }
338         return display;
339 }
340
341 pte.create_edit_node = function(item) {
342         var edit_link = document.createElement('a');
343         edit_link.innerHTML = '[' + pte.button_display('edit') + ']';
344         edit_link.href = "javascript:void(pte.item_tag_view('" + item + "', 'edit'));";
345
346         var edit_node = document.createElement('li');
347         edit_node.className = 'pte_edit';
348         edit_node.appendChild(edit_link);
349
350         return edit_node;
351 }
352
353 pte.slash = function(str, escape) {
354         return str.replace(escape, '\\' + escape);
355 }
356
Note: See TracBrowser for help on using the browser.