Commit d832de18632f8b34518f0a14518023d831966d37

Authored by Edmar Moretti
1 parent 47bad912

--no commit message

classesjs/cpaint/JSON/json.js
@@ -1,377 +0,0 @@ @@ -1,377 +0,0 @@
1 -/*  
2 -Copyright (c) 2005 JSON.org  
3 -  
4 -Permission is hereby granted, free of charge, to any person obtaining a copy  
5 -of this software and associated documentation files (the "Software"), to deal  
6 -in the Software without restriction, including without limitation the rights  
7 -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  
8 -copies of the Software, and to permit persons to whom the Software is  
9 -furnished to do so, subject to the following conditions:  
10 -  
11 -The Software shall be used for Good, not Evil.  
12 -  
13 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  
14 -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  
15 -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE  
16 -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
17 -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  
18 -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE  
19 -SOFTWARE.  
20 -*/  
21 -  
22 -Array.prototype.______array = '______array';  
23 -  
24 -var JSON = {  
25 - org: 'http://www.JSON.org',  
26 - copyright: '(c)2005 JSON.org',  
27 - license: 'http://www.crockford.com/JSON/license.html',  
28 -  
29 - stringify: function (arg) {  
30 - var c, i, l, s = '', v;  
31 - var numeric = true;  
32 -  
33 - switch (typeof arg) {  
34 - case 'object':  
35 - if (arg) {  
36 - if (arg.______array == '______array') {  
37 - // do a test whether all array keys are numeric  
38 - for (i in arg) {  
39 - if (i != '______array'  
40 - && (isNaN(i)  
41 - || !isFinite(i))) {  
42 - numeric = false;  
43 - break;  
44 - }  
45 - }  
46 -  
47 - if (numeric == true) {  
48 - for (i = 0; i < arg.length; ++i) {  
49 - if (typeof arg[i] != 'undefined') {  
50 - v = this.stringify(arg[i]);  
51 - if (s) {  
52 - s += ',';  
53 - }  
54 - s += v;  
55 - } else {  
56 - s += ',null';  
57 - }  
58 - }  
59 - return '[' + s + ']';  
60 - } else {  
61 - for (i in arg) {  
62 - if (i != '______array') {  
63 - v = arg[i];  
64 - if (typeof v != 'undefined' && typeof v != 'function') {  
65 - v = this.stringify(v);  
66 - if (s) {  
67 - s += ',';  
68 - }  
69 - s += this.stringify(i) + ':' + v;  
70 - }  
71 - }  
72 - }  
73 - // return as object  
74 - return '{' + s + '}';  
75 - }  
76 - } else if (typeof arg.toString != 'undefined') {  
77 - for (i in arg) {  
78 - v = arg[i];  
79 - if (typeof v != 'undefined' && typeof v != 'function') {  
80 - v = this.stringify(v);  
81 - if (s) {  
82 - s += ',';  
83 - }  
84 - s += this.stringify(i) + ':' + v;  
85 - }  
86 - }  
87 - return '{' + s + '}';  
88 - }  
89 - }  
90 - return 'null';  
91 - case 'number':  
92 - return isFinite(arg) ? String(arg) : 'null';  
93 - case 'string':  
94 - l = arg.length;  
95 - s = '"';  
96 - for (i = 0; i < l; i += 1) {  
97 - c = arg.charAt(i);  
98 - if (c >= ' ') {  
99 - if (c == '\\' || c == '"') {  
100 - s += '\\';  
101 - }  
102 - s += c;  
103 - } else {  
104 - switch (c) {  
105 - case '\b':  
106 - s += '\\b';  
107 - break;  
108 - case '\f':  
109 - s += '\\f';  
110 - break;  
111 - case '\n':  
112 - s += '\\n';  
113 - break;  
114 - case '\r':  
115 - s += '\\r';  
116 - break;  
117 - case '\t':  
118 - s += '\\t';  
119 - break;  
120 - default:  
121 - c = c.charCodeAt();  
122 - s += '\\u00' + Math.floor(c / 16).toString(16) +  
123 - (c % 16).toString(16);  
124 - }  
125 - }  
126 - }  
127 - return s + '"';  
128 - case 'boolean':  
129 - return String(arg);  
130 - default:  
131 - return 'null';  
132 - }  
133 - },  
134 - parse: function (text) {  
135 - var at = 0;  
136 - var ch = ' ';  
137 -  
138 - function error(m) {  
139 - throw {  
140 - name: 'JSONError',  
141 - message: m,  
142 - at: at - 1,  
143 - text: text  
144 - };  
145 - }  
146 -  
147 - function next() {  
148 - ch = text.charAt(at);  
149 - at += 1;  
150 - return ch;  
151 - }  
152 -  
153 - function white() {  
154 - while (ch != '' && ch <= ' ') {  
155 - next();  
156 - }  
157 - }  
158 -  
159 - function str() {  
160 - var i, s = '', t, u;  
161 -  
162 - if (ch == '"') {  
163 -outer: while (next()) {  
164 - if (ch == '"') {  
165 - next();  
166 - return s;  
167 - } else if (ch == '\\') {  
168 - switch (next()) {  
169 - case 'b':  
170 - s += '\b';  
171 - break;  
172 - case 'f':  
173 - s += '\f';  
174 - break;  
175 - case 'n':  
176 - s += '\n';  
177 - break;  
178 - case 'r':  
179 - s += '\r';  
180 - break;  
181 - case 't':  
182 - s += '\t';  
183 - break;  
184 - case 'u':  
185 - u = 0;  
186 - for (i = 0; i < 4; i += 1) {  
187 - t = parseInt(next(), 16);  
188 - if (!isFinite(t)) {  
189 - break outer;  
190 - }  
191 - u = u * 16 + t;  
192 - }  
193 - s += String.fromCharCode(u);  
194 - break;  
195 - default:  
196 - s += ch;  
197 - }  
198 - } else {  
199 - s += ch;  
200 - }  
201 - }  
202 - }  
203 - error("Bad string");  
204 - }  
205 -  
206 - function arr() {  
207 - var a = [];  
208 -  
209 - if (ch == '[') {  
210 - next();  
211 - white();  
212 - if (ch == ']') {  
213 - next();  
214 - return a;  
215 - }  
216 - while (ch) {  
217 - a.push(val());  
218 - white();  
219 - if (ch == ']') {  
220 - next();  
221 - return a;  
222 - } else if (ch != ',') {  
223 - break;  
224 - }  
225 - next();  
226 - white();  
227 - }  
228 - }  
229 - error("Bad array");  
230 - }  
231 -  
232 - function obj() {  
233 - var k, o = {};  
234 -  
235 - if (ch == '{') {  
236 - next();  
237 - white();  
238 - if (ch == '}') {  
239 - next();  
240 - return o;  
241 - }  
242 - while (ch) {  
243 - k = str();  
244 - white();  
245 - if (ch != ':') {  
246 - break;  
247 - }  
248 - next();  
249 - o[k] = val();  
250 - white();  
251 - if (ch == '}') {  
252 - next();  
253 - return o;  
254 - } else if (ch != ',') {  
255 - break;  
256 - }  
257 - next();  
258 - white();  
259 - }  
260 - }  
261 - error("Bad object");  
262 - }  
263 -  
264 - function assoc() {  
265 - var k, a = [];  
266 -  
267 - if (ch == '<') {  
268 - next();  
269 - white();  
270 - if (ch == '>') {  
271 - next();  
272 - return a;  
273 - }  
274 - while (ch) {  
275 - k = str();  
276 - white();  
277 - if (ch != ':') {  
278 - break;  
279 - }  
280 - next();  
281 - a[k] = val();  
282 - white();  
283 - if (ch == '>') {  
284 - next();  
285 - return a;  
286 - } else if (ch != ',') {  
287 - break;  
288 - }  
289 - next();  
290 - white();  
291 - }  
292 - }  
293 - error("Bad associative array");  
294 - }  
295 -  
296 - function num() {  
297 - var n = '', v;  
298 - if (ch == '-') {  
299 - n = '-';  
300 - next();  
301 - }  
302 - while (ch >= '0' && ch <= '9') {  
303 - n += ch;  
304 - next();  
305 - }  
306 - if (ch == '.') {  
307 - n += '.';  
308 - while (next() && ch >= '0' && ch <= '9') {  
309 - n += ch;  
310 - }  
311 - }  
312 - if (ch == 'e' || ch == 'E') {  
313 - n += 'e';  
314 - next();  
315 - if (ch == '-' || ch == '+') {  
316 - n += ch;  
317 - next();  
318 - }  
319 - while (ch >= '0' && ch <= '9') {  
320 - n += ch;  
321 - next();  
322 - }  
323 - }  
324 - v = +n;  
325 - if (!isFinite(v)) {  
326 - error("Bad number");  
327 - } else {  
328 - return v;  
329 - }  
330 - }  
331 -  
332 - function word() {  
333 - switch (ch) {  
334 - case 't':  
335 - if (next() == 'r' && next() == 'u' && next() == 'e') {  
336 - next();  
337 - return true;  
338 - }  
339 - break;  
340 - case 'f':  
341 - if (next() == 'a' && next() == 'l' && next() == 's' &&  
342 - next() == 'e') {  
343 - next();  
344 - return false;  
345 - }  
346 - break;  
347 - case 'n':  
348 - if (next() == 'u' && next() == 'l' && next() == 'l') {  
349 - next();  
350 - return null;  
351 - }  
352 - break;  
353 - }  
354 - error("Syntax error");  
355 - }  
356 -  
357 - function val() {  
358 - white();  
359 - switch (ch) {  
360 - case '{':  
361 - return obj();  
362 - case '[':  
363 - return arr();  
364 - case '<':  
365 - return assoc();  
366 - case '"':  
367 - return str();  
368 - case '-':  
369 - return num();  
370 - default:  
371 - return ch >= '0' && ch <= '9' ? num() : word();  
372 - }  
373 - }  
374 -  
375 - return val();  
376 - }  
377 -};  
classesjs/cpaint/JSON/json2.php
@@ -1,663 +0,0 @@ @@ -1,663 +0,0 @@
1 -<?php  
2 -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */  
3 -  
4 -/**  
5 -* Converts to and from JSON format.  
6 -*  
7 -* JSON (JavaScript Object Notation) is a lightweight data-interchange  
8 -* format. It is easy for humans to read and write. It is easy for machines  
9 -* to parse and generate. It is based on a subset of the JavaScript  
10 -* Programming Language, Standard ECMA-262 3rd Edition - December 1999.  
11 -* This feature can also be found in Python. JSON is a text format that is  
12 -* completely language independent but uses conventions that are familiar  
13 -* to programmers of the C-family of languages, including C, C++, C#, Java,  
14 -* JavaScript, Perl, TCL, and many others. These properties make JSON an  
15 -* ideal data-interchange language.  
16 -*  
17 -* This package provides a simple encoder and decoder for JSON notation. It  
18 -* is intended for use with client-side Javascript applications that make  
19 -* use of HTTPRequest to perform server communication functions - data can  
20 -* be encoded into JSON notation for use in a client-side javascript, or  
21 -* decoded from incoming Javascript requests. JSON format is native to  
22 -* Javascript, and can be directly eval()'ed with no further parsing  
23 -* overhead  
24 -*  
25 -* All strings should be in ASCII or UTF-8 format!  
26 -*  
27 -* LICENSE: Redistribution and use in source and binary forms, with or  
28 -* without modification, are permitted provided that the following  
29 -* conditions are met: Redistributions of source code must retain the  
30 -* above copyright notice, this list of conditions and the following  
31 -* disclaimer. Redistributions in binary form must reproduce the above  
32 -* copyright notice, this list of conditions and the following disclaimer  
33 -* in the documentation and/or other materials provided with the  
34 -* distribution.  
35 -*  
36 -* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED  
37 -* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF  
38 -* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN  
39 -* NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,  
40 -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,  
41 -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS  
42 -* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND  
43 -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR  
44 -* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE  
45 -* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH  
46 -* DAMAGE.  
47 -*  
48 -* @category  
49 -* @package Services_JSON  
50 -* @author Michal Migurski <mike-json@teczno.com>  
51 -* @author Matt Knapp <mdknapp[at]gmail[dot]com>  
52 -* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>  
53 -* @copyright 2005 Michal Migurski  
54 -* @license http://www.opensource.org/licenses/bsd-license.php  
55 -* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198  
56 -*/  
57 -  
58 -/**  
59 -* Marker constant for Services_JSON::decode(), used to flag stack state  
60 -*/  
61 -define('SERVICES_JSON_SLICE', 1);  
62 -  
63 -/**  
64 -* Marker constant for Services_JSON::decode(), used to flag stack state  
65 -*/  
66 -define('SERVICES_JSON_IN_STR', 2);  
67 -  
68 -/**  
69 -* Marker constant for Services_JSON::decode(), used to flag stack state  
70 -*/  
71 -define('SERVICES_JSON_IN_ARR', 4);  
72 -  
73 -/**  
74 -* Marker constant for Services_JSON::decode(), used to flag stack state  
75 -*/  
76 -define('SERVICES_JSON_IN_OBJ', 8);  
77 -  
78 -/**  
79 -* Marker constant for Services_JSON::decode(), used to flag stack state  
80 -*/  
81 -define('SERVICES_JSON_IN_CMT', 16);  
82 -  
83 -/**  
84 -* Behavior switch for Services_JSON::decode()  
85 -*/  
86 -define('SERVICES_JSON_LOOSE_TYPE', 10);  
87 -  
88 -/**  
89 -* Behavior switch for Services_JSON::decode()  
90 -*/  
91 -define('SERVICES_JSON_STRICT_TYPE', 11);  
92 -  
93 -/**  
94 -* Converts to and from JSON format.  
95 -*  
96 -* Brief example of use:  
97 -*  
98 -* <code>  
99 -* // create a new instance of Services_JSON  
100 -* $json = new Services_JSON();  
101 -*  
102 -* // convert a complexe value to JSON notation, and send it to the browser  
103 -* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));  
104 -* $output = $json->encode($value);  
105 -*  
106 -* print($output);  
107 -* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]  
108 -*  
109 -* // accept incoming POST data, assumed to be in JSON notation  
110 -* $input = file_get_contents('php://input', 1000000);  
111 -* $value = $json->decode($input);  
112 -* </code>  
113 -*/  
114 -class Services_JSON  
115 -{  
116 - /**  
117 - * constructs a new JSON instance  
118 - *  
119 - * @param int $use object behavior: when encoding or decoding,  
120 - * be loose or strict about object/array usage  
121 - *  
122 - * possible values:  
123 - * - SERVICES_JSON_STRICT_TYPE: strict typing, default.  
124 - * "{...}" syntax creates objects in decode().  
125 - * - SERVICES_JSON_LOOSE_TYPE: loose typing.  
126 - * "{...}" syntax creates associative arrays in decode().  
127 - */  
128 - function Services_JSON($use = SERVICES_JSON_STRICT_TYPE)  
129 - {  
130 - $this->use = $use;  
131 - }  
132 -  
133 - /**  
134 - * convert a string from one UTF-16 char to one UTF-8 char  
135 - *  
136 - * Normally should be handled by mb_convert_encoding, but  
137 - * provides a slower PHP-only method for installations  
138 - * that lack the multibye string extension.  
139 - *  
140 - * @param string $utf16 UTF-16 character  
141 - * @return string UTF-8 character  
142 - * @access private  
143 - */  
144 - function utf162utf8($utf16)  
145 - {  
146 - // oh please oh please oh please oh please oh please  
147 - if(function_exists('mb_convert_encoding'))  
148 - return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');  
149 -  
150 - $bytes = (ord($utf16{0}) << 8) | ord($utf16{1});  
151 -  
152 - switch(true) {  
153 - case ((0x7F & $bytes) == $bytes):  
154 - // this case should never be reached, because we are in ASCII range  
155 - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
156 - return chr(0x7F & $bytes);  
157 -  
158 - case (0x07FF & $bytes) == $bytes:  
159 - // return a 2-byte UTF-8 character  
160 - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
161 - return chr(0xC0 | (($bytes >> 6) & 0x1F))  
162 - . chr(0x80 | ($bytes & 0x3F));  
163 -  
164 - case (0xFFFF & $bytes) == $bytes:  
165 - // return a 3-byte UTF-8 character  
166 - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
167 - return chr(0xE0 | (($bytes >> 12) & 0x0F))  
168 - . chr(0x80 | (($bytes >> 6) & 0x3F))  
169 - . chr(0x80 | ($bytes & 0x3F));  
170 - }  
171 -  
172 - // ignoring UTF-32 for now, sorry  
173 - return '';  
174 - }  
175 -  
176 - /**  
177 - * convert a string from one UTF-8 char to one UTF-16 char  
178 - *  
179 - * Normally should be handled by mb_convert_encoding, but  
180 - * provides a slower PHP-only method for installations  
181 - * that lack the multibye string extension.  
182 - *  
183 - * @param string $utf8 UTF-8 character  
184 - * @return string UTF-16 character  
185 - * @access private  
186 - */  
187 - function utf82utf16($utf8)  
188 - {  
189 - // oh please oh please oh please oh please oh please  
190 - if(function_exists('mb_convert_encoding'))  
191 - return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');  
192 -  
193 - switch(strlen($utf8)) {  
194 - case 1:  
195 - // this case should never be reached, because we are in ASCII range  
196 - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
197 - return $utf8; //$ut8  
198 -  
199 - case 2:  
200 - // return a UTF-16 character from a 2-byte UTF-8 char  
201 - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
202 - return chr(0x07 & (ord($utf8{0}) >> 2))  
203 - . chr((0xC0 & (ord($utf8{0}) << 6))  
204 - | (0x3F & ord($utf8{1})));  
205 -  
206 - case 3:  
207 - // return a UTF-16 character from a 3-byte UTF-8 char  
208 - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
209 - return chr((0xF0 & (ord($utf8{0}) << 4))  
210 - | (0x0F & (ord($utf8{1}) >> 2)))  
211 - . chr((0xC0 & (ord($utf8{1}) << 6))  
212 - | (0x7F & ord($utf8{2})));  
213 - }  
214 -  
215 - // ignoring UTF-32 for now, sorry  
216 - return '';  
217 - }  
218 -  
219 - /**  
220 - * encodes an arbitrary variable into JSON format  
221 - *  
222 - * @param mixed $var any number, boolean, string, array, or object to be encoded.  
223 - * see argument 1 to Services_JSON() above for array-parsing behavior.  
224 - * if var is a strng, note that encode() always expects it  
225 - * to be in ASCII or UTF-8 format!  
226 - *  
227 - * @return string JSON string representation of input var  
228 - * @access public  
229 - */  
230 - function encode($var)  
231 - {  
232 - switch (gettype($var)) {  
233 - case 'boolean':  
234 - return $var ? 'true' : 'false';  
235 -  
236 - case 'NULL':  
237 - return 'null';  
238 -  
239 - case 'integer':  
240 - return (int) $var;  
241 -  
242 - case 'double':  
243 - case 'float':  
244 - return (float) $var;  
245 -  
246 - case 'string':  
247 - $arg = $var;  
248 - $l = strlen($var);  
249 - $s = '"';  
250 -  
251 - for ($i = 0; $i < $l; $i++) {  
252 - $c = $var{$i};  
253 -  
254 - if (ord($c) >= ord(' ')) {  
255 -  
256 - if ($c == '\\'  
257 - || $c == '"') {  
258 -  
259 - $s .= '\\';  
260 - }  
261 - $s .= $c;  
262 -  
263 - } else {  
264 -  
265 - switch ($c) {  
266 -  
267 - case '\b':  
268 - $s .= '\\b';  
269 - break;  
270 -  
271 - case '\f':  
272 - $s .= '\\f';  
273 - break;  
274 -  
275 - case '\n':  
276 - $s .= '\\n';  
277 - break;  
278 -  
279 - case '\r':  
280 - $s .= '\\r';  
281 - break;  
282 -  
283 - case '\t':  
284 - $s .= '\\t';  
285 - break;  
286 -  
287 - default:  
288 - $s .= '\u00' . sprintf('%02x', ord($c));  
289 - }  
290 - }  
291 - }  
292 - return $s . '"';  
293 - break;  
294 -  
295 -  
296 - case 'array':  
297 - /*  
298 - * As per JSON spec if any array key is not an integer  
299 - * we must treat the the whole array as an object. We  
300 - * also try to catch a sparsely populated associative  
301 - * array with numeric keys here because some JS engines  
302 - * will create an array with empty indexes up to  
303 - * max_index which can cause memory issues and because  
304 - * the keys, which may be relevant, will be remapped  
305 - * otherwise.  
306 - *  
307 - * As per the ECMA and JSON specification an object may  
308 - * have any string as a property. Unfortunately due to  
309 - * a hole in the ECMA specification if the key is a  
310 - * ECMA reserved word or starts with a digit the  
311 - * parameter is only accessible using ECMAScript's  
312 - * bracket notation.  
313 - */  
314 -  
315 - // treat as a JSON object  
316 - if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {  
317 - return "{/*Array*/" .  
318 - join(',', array_map(array($this, 'name_value'),  
319 - array_keys($var),  
320 - array_values($var)))  
321 - . '}';  
322 - }  
323 -  
324 - // treat it like a regular array  
325 - return '[' . join(',', array_map(array($this, 'encode'), $var)) . ']';  
326 -  
327 - case 'object':  
328 - $vars = get_object_vars($var);  
329 - return '{' .  
330 - join(',', array_map(array($this, 'name_value'),  
331 - array_keys($vars),  
332 - array_values($vars)))  
333 - . '}';  
334 -  
335 - default:  
336 - return '';  
337 - }  
338 - }  
339 -  
340 - /**  
341 - * array-walking function for use in generating JSON-formatted name-value pairs  
342 - *  
343 - * @param string $name name of key to use  
344 - * @param mixed $value reference to an array element to be encoded  
345 - *  
346 - * @return string JSON-formatted name-value pair, like '"name":value'  
347 - * @access private  
348 - */  
349 - function name_value($name, $value)  
350 - {  
351 - return $this->encode(strval($name)) . ':' . $this->encode($value);  
352 - }  
353 -  
354 - /**  
355 - * reduce a string by removing leading and trailing comments and whitespace  
356 - *  
357 - * @param $str string string value to strip of comments and whitespace  
358 - *  
359 - * @return string string value stripped of comments and whitespace  
360 - * @access private  
361 - */  
362 - function reduce_string($str)  
363 - {  
364 - $str = preg_replace(array(  
365 -  
366 - // eliminate single line comments in '// ...' form  
367 - '#^\s*//(.+)$#m',  
368 -  
369 - // eliminate multi-line comments in '/* ... */' form, at start of string  
370 - '#^\s*/\*(.+)\*/#Us',  
371 -  
372 - // eliminate multi-line comments in '/* ... */' form, at end of string  
373 - '#/\*(.+)\*/\s*$#Us'  
374 -  
375 - ), '', $str);  
376 -  
377 - // eliminate extraneous space  
378 - return trim($str);  
379 - }  
380 -  
381 - /**  
382 - * decodes a JSON string into appropriate variable  
383 - *  
384 - * @param string $str JSON-formatted string  
385 - *  
386 - * @return mixed number, boolean, string, array, or object  
387 - * corresponding to given JSON input string.  
388 - * See argument 1 to Services_JSON() above for object-output behavior.  
389 - * Note that decode() always returns strings  
390 - * in ASCII or UTF-8 format!  
391 - * @access public  
392 - */  
393 - function decode($str)  
394 - {  
395 - $imarray = false;  
396 - $str = $this->reduce_string($str);  
397 -  
398 - switch (strtolower($str)) {  
399 - case 'true':  
400 - return true;  
401 -  
402 - case 'false':  
403 - return false;  
404 -  
405 - case 'null':  
406 - return null;  
407 -  
408 - default:  
409 - if (is_numeric($str)) {  
410 - // Lookie-loo, it's a number  
411 -  
412 - // This would work on its own, but I'm trying to be  
413 - // good about returning integers where appropriate:  
414 - // return (float)$str;  
415 -  
416 - // Return float or int, as appropriate  
417 - return ((float)$str == (integer)$str)  
418 - ? (integer)$str  
419 - : (float)$str;  
420 -  
421 - } elseif (preg_match('/^("|\').+(\1)$/s', $str, $m) && $m[1] == $m[2]) {  
422 - // STRINGS RETURNED IN UTF-8 FORMAT  
423 - $delim = substr($str, 0, 1);  
424 - $chrs = substr($str, 1, -1);  
425 - $utf8 = '';  
426 - $strlen_chrs = strlen($chrs);  
427 -  
428 - for ($c = 0; $c < $strlen_chrs; ++$c) {  
429 -  
430 - $substr_chrs_c_2 = substr($chrs, $c, 2);  
431 - $ord_chrs_c = ord($chrs{$c});  
432 -  
433 - switch (true) {  
434 - case $substr_chrs_c_2 == '\b':  
435 - $utf8 .= chr(0x08);  
436 - ++$c;  
437 - break;  
438 - case $substr_chrs_c_2 == '\t':  
439 - $utf8 .= chr(0x09);  
440 - ++$c;  
441 - break;  
442 - case $substr_chrs_c_2 == '\n':  
443 - $utf8 .= chr(0x0A);  
444 - ++$c;  
445 - break;  
446 - case $substr_chrs_c_2 == '\f':  
447 - $utf8 .= chr(0x0C);  
448 - ++$c;  
449 - break;  
450 - case $substr_chrs_c_2 == '\r':  
451 - $utf8 .= chr(0x0D);  
452 - ++$c;  
453 - break;  
454 -  
455 - case $substr_chrs_c_2 == '\\"':  
456 - case $substr_chrs_c_2 == '\\\'':  
457 - case $substr_chrs_c_2 == '\\\\':  
458 - case $substr_chrs_c_2 == '\\/':  
459 - if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||  
460 - ($delim == "'" && $substr_chrs_c_2 != '\\"')) {  
461 - $utf8 .= $chrs{++$c};  
462 - }  
463 - break;  
464 -  
465 - case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):  
466 - // single, escaped unicode character  
467 - $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))  
468 - . chr(hexdec(substr($chrs, ($c + 4), 2)));  
469 - $utf8 .= $this->utf162utf8($utf16);  
470 - $c += 5;  
471 - break;  
472 -  
473 - case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):  
474 - $utf8 .= $chrs{$c};  
475 - break;  
476 -  
477 - case ($ord_chrs_c & 0xE0) == 0xC0:  
478 - // characters U-00000080 - U-000007FF, mask 110XXXXX  
479 - //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
480 - $utf8 .= substr($chrs, $c, 2);  
481 - ++$c;  
482 - break;  
483 -  
484 - case ($ord_chrs_c & 0xF0) == 0xE0:  
485 - // characters U-00000800 - U-0000FFFF, mask 1110XXXX  
486 - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
487 - $utf8 .= substr($chrs, $c, 3);  
488 - $c += 2;  
489 - break;  
490 -  
491 - case ($ord_chrs_c & 0xF8) == 0xF0:  
492 - // characters U-00010000 - U-001FFFFF, mask 11110XXX  
493 - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
494 - $utf8 .= substr($chrs, $c, 4);  
495 - $c += 3;  
496 - break;  
497 -  
498 - case ($ord_chrs_c & 0xFC) == 0xF8:  
499 - // characters U-00200000 - U-03FFFFFF, mask 111110XX  
500 - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
501 - $utf8 .= substr($chrs, $c, 5);  
502 - $c += 4;  
503 - break;  
504 -  
505 - case ($ord_chrs_c & 0xFE) == 0xFC:  
506 - // characters U-04000000 - U-7FFFFFFF, mask 1111110X  
507 - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8  
508 - $utf8 .= substr($chrs, $c, 6);  
509 - $c += 5;  
510 - break;  
511 -  
512 - }  
513 -  
514 - }  
515 -  
516 - return $utf8;  
517 -  
518 - } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {  
519 - // array, or object notation  
520 -  
521 - if ($str{0} == '[') {  
522 - $stk = array(SERVICES_JSON_IN_ARR);  
523 - $arr = array();  
524 - } else {  
525 - if ($str{1} == '/' && $str{2} == '*' && $str{3} == 'A')  
526 - {  
527 - $stk = array(SERVICES_JSON_IN_OBJ);  
528 - $obj = array();  
529 -  
530 - }  
531 - else  
532 - {  
533 - if ($this->use == SERVICES_JSON_LOOSE_TYPE) {  
534 - $stk = array(SERVICES_JSON_IN_OBJ);  
535 - $obj = array();  
536 -  
537 - } else {  
538 - $stk = array(SERVICES_JSON_IN_OBJ);  
539 - $obj = new stdClass();  
540 - }  
541 - }  
542 - }  
543 -  
544 - array_push($stk, array('what' => SERVICES_JSON_SLICE,  
545 - 'where' => 0,  
546 - 'delim' => false));  
547 -  
548 - $chrs = substr($str, 1, -1);  
549 - $chrs = $this->reduce_string($chrs);  
550 -  
551 - if ($chrs == '') {  
552 - if (reset($stk) == SERVICES_JSON_IN_ARR) {  
553 - return $arr;  
554 -  
555 - } else {  
556 - return $obj;  
557 -  
558 - }  
559 - }  
560 -  
561 - //print("\nparsing {$chrs}\n");  
562 -  
563 - $strlen_chrs = strlen($chrs);  
564 -  
565 - for ($c = 0; $c <= $strlen_chrs; ++$c) {  
566 -  
567 - $top = end($stk);  
568 - $substr_chrs_c_2 = substr($chrs, $c, 2);  
569 -  
570 - if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {  
571 - // found a comma that is not inside a string, array, etc.,  
572 - // OR we've reached the end of the character list  
573 - $slice = substr($chrs, $top['where'], ($c - $top['where']));  
574 - array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));  
575 - //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");  
576 -  
577 - if (reset($stk) == SERVICES_JSON_IN_ARR) {  
578 - // we are in an array, so just push an element onto the stack  
579 - array_push($arr, $this->decode($slice));  
580 -  
581 - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {  
582 - // we are in an object, so figure  
583 - // out the property name and set an  
584 - // element in an associative array,  
585 - // for now  
586 - if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {  
587 - // "name":value pair  
588 - $key = $this->decode($parts[1]);  
589 - $val = $this->decode($parts[2]);  
590 -  
591 - if ($this->use == SERVICES_JSON_LOOSE_TYPE || is_array($obj)) {  
592 - $obj[$key] = $val;  
593 - } else {  
594 - $obj->$key = $val;  
595 - }  
596 - } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {  
597 - // name:value pair, where name is unquoted  
598 - $key = $parts[1];  
599 - $val = $this->decode($parts[2]);  
600 - if ($this->use == SERVICES_JSON_LOOSE_TYPE|| is_array($obj)) {  
601 - $obj[$key] = $val;  
602 - } else {  
603 - $obj->$key = $val;  
604 - }  
605 - }  
606 -  
607 - }  
608 -  
609 - } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {  
610 - // found a quote, and we are not inside a string  
611 - array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));  
612 - //print("Found start of string at {$c}\n");  
613 -  
614 - } elseif (($chrs{$c} == $top['delim']) &&  
615 - ($top['what'] == SERVICES_JSON_IN_STR) &&  
616 - (($chrs{$c - 1} != '\\') ||  
617 - ($chrs{$c - 1} == '\\' && $chrs{$c - 2} == '\\'))) {  
618 - // found a quote, we're in a string, and it's not escaped  
619 - array_pop($stk);  
620 - //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");  
621 -  
622 - } elseif (($chrs{$c} == '[') &&  
623 - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {  
624 - // found a left-bracket, and we are in an array, object, or slice  
625 - array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));  
626 - //print("Found start of array at {$c}\n");  
627 -  
628 - } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {  
629 - // found a right-bracket, and we're in an array  
630 - array_pop($stk);  
631 - //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");  
632 -  
633 - } elseif (($chrs{$c} == '{') &&  
634 - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {  
635 - // found a left-brace, and we are in an array, object, or slice  
636 - array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));  
637 - //print("Found start of object at {$c}\n");  
638 -  
639 - } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {  
640 - // found a right-brace, and we're in an object  
641 - array_pop($stk);  
642 -  
643 - //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");  
644 -  
645 - }  
646 -  
647 - }  
648 -  
649 - if (reset($stk) == SERVICES_JSON_IN_ARR) {  
650 - return $arr;  
651 -  
652 - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {  
653 - return $obj;  
654 -  
655 - }  
656 -  
657 - }  
658 - }  
659 - }  
660 -  
661 -}  
662 -  
663 -?>  
664 \ No newline at end of file 0 \ No newline at end of file
classesjs/cpaint/JSON/testsuite.php
@@ -1,351 +0,0 @@ @@ -1,351 +0,0 @@
1 -<?php  
2 -/**  
3 -* The content of this file is (c) 2003-2005 digital media center GmbH  
4 -* All rights reserved  
5 -*  
6 -* JSON parser / generator test  
7 -*  
8 -* @package JSON  
9 -* @access public  
10 -* @copyright (c) 2003-2005 digital media center GmbH, all rights reserved  
11 -* @author Dominique Stender <dst@dmc.de>  
12 -*/  
13 -  
14 -//---- includes ----------------------------------------------------------------  
15 - /**  
16 - * @include JSON  
17 - */  
18 - require_once('../json.php');  
19 -  
20 -//---- class -------------------------------------------------------------------  
21 - class MyObj {  
22 - var $id = '';  
23 - var $name = '';  
24 - var $attribs = array("first",'4');  
25 -  
26 - function setId($id) {  
27 - $this->id = $id;  
28 - }  
29 -  
30 - function getId() {  
31 - return $this->id;  
32 - }  
33 -  
34 - function setName($name) {  
35 - $this->name = $name;  
36 - }  
37 -  
38 - function getName() {  
39 - return $this->name;  
40 - }  
41 - }  
42 -  
43 -//---- variables ---------------------------------------------------------------  
44 - $JSON = new JSON();  
45 - $myObj = new MyObj();  
46 -  
47 -//---- logic -------------------------------------------------------------------  
48 - /* initialize object */  
49 - $myObj->setId('Äl' . chr(18) . "ie\nn");  
50 - $myObj->setName('objectName');  
51 - array_push($myObj->attribs, 'øfirst');  
52 - array_push($myObj->attribs, 'second');  
53 - array_push($myObj->attribs, 3);  
54 -  
55 - /* create JSON representation */  
56 - $jsonStr = $JSON->stringify($myObj);  
57 -  
58 -//---- clean-up ----------------------------------------------------------------  
59 -//---- content -----------------------------------------------------------------  
60 -  
61 -?><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">  
62 -<head>  
63 - <title>JSON parser test</title>  
64 - <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />  
65 - <script type="text/javascript" src="json.js"></script>  
66 - <script type="text/javascript">  
67 -JSON.arrayObj = new Array();  
68 -JSON.parse2 = function (text)  
69 -{  
70 - var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null|\/\*Array\*\/)\s*/,  
71 - token,  
72 - operator;  
73 -  
74 - function error(m, t) {  
75 - throw {  
76 - name: 'JSONError',  
77 - message: m,  
78 - text: t || operator || token  
79 - };  
80 - }  
81 -  
82 - function next() {  
83 - if (text) {  
84 - var t = p.exec(text);  
85 - if (t) {  
86 -  
87 - if (t[2]) {  
88 - token = null;  
89 - operator = t[2];  
90 - } else {  
91 - operator = null;  
92 - if(t[1].search (/^\/\*Array\*\/$/g) > -1)  
93 - {  
94 - token = function(){};  
95 - }  
96 - else  
97 - {  
98 - try {  
99 - token = eval(t[1]);  
100 - } catch (e) {  
101 - error("Bad token", t[1]);  
102 - }  
103 - }  
104 - }  
105 - text = text.substring(t[0].length);  
106 - } else {  
107 - error("Unrecognized token", text);  
108 - }  
109 - } else {  
110 - token = operator = undefined;  
111 - }  
112 - }  
113 -  
114 -  
115 - function arr() {  
116 - var a = [];  
117 -  
118 - next();  
119 - if (operator == ']') {  
120 - next();  
121 - return a;  
122 - }  
123 - for (;;) {  
124 - a.push(val());  
125 - switch (operator) {  
126 - case ']':  
127 - next();  
128 - return a;  
129 - case ',':  
130 - next();  
131 - break;  
132 - default:  
133 - error("Missing ']'");  
134 - }  
135 - }  
136 - }  
137 -  
138 - function obj() {  
139 - var k, o = {};  
140 -  
141 - next();  
142 - if (operator == '}') {  
143 - next();  
144 - return o;  
145 - }  
146 - if (typeof(token) == 'function')  
147 - {  
148 - o = [];  
149 - next();  
150 - }  
151 - for (;;)  
152 - {  
153 -  
154 -  
155 - if (operator ||typeof token != 'string') {  
156 - error("Missing key");  
157 - }  
158 - k = token;  
159 - next();  
160 -  
161 - if (operator != ':') {  
162 - error("Missing ':'");  
163 - }  
164 -  
165 - next();  
166 - o[k] = val();  
167 -  
168 - switch (operator) {  
169 - case '}':  
170 - next();  
171 - return o;  
172 - case ',':  
173 - next();  
174 - break;  
175 - case '#':  
176 - next();  
177 - break;  
178 - default:  
179 - error("Missing '}'");  
180 - }  
181 - }  
182 - }  
183 -  
184 - function val() {  
185 - switch (operator) {  
186 - case '{':  
187 - return obj();  
188 - case '[':  
189 - return arr();  
190 - default:  
191 - if (operator !== null) {  
192 - error("Missing value");  
193 - }  
194 - var t = token;  
195 - next();  
196 - return t;  
197 - }  
198 - }  
199 - next();  
200 - return val();  
201 -};  
202 -  
203 -JSON.stringify2 = function(arg)  
204 -{  
205 - var jsonstring = [];  
206 - var b = this;  
207 - function add(str)  
208 - {  
209 - jsonstring[jsonstring.length] = str;  
210 - }  
211 - function validObj(obj)  
212 - {  
213 - if (typeof(obj) != 'undefined' && typeof(obj) != 'function')  
214 - {  
215 - return true;  
216 - }  
217 - return false;  
218 - }  
219 - function recurse(obj, prefix)  
220 - {  
221 - switch (typeof(obj))  
222 - {  
223 - case 'object':  
224 - if (obj)  
225 - {  
226 - var first = true;  
227 - if (obj.constructor == b.arrayObj.constructor)  
228 - {  
229 - add('{/*Array*/');  
230 - //add ('{');  
231 - }  
232 - else  
233 - {  
234 - add ('{');  
235 - }  
236 - for (prop in obj)  
237 - {  
238 - if (validObj(obj[prop]))  
239 - {  
240 - if (!first)  
241 - {  
242 - add(',');  
243 - }  
244 - recurse(prop);  
245 - add(':');  
246 - recurse (obj[prop]);  
247 - first =false;  
248 - }  
249 - }  
250 - return add ('}');  
251 - }  
252 - return add('null');  
253 - break;  
254 - case 'number':  
255 - return add(isFinite(obj) ? String(obj) : 'null');  
256 - break;  
257 - case 'string':  
258 - l = obj.length;  
259 - add('"');  
260 - for (i = 0; i < l; i += 1) {  
261 - c = obj.charAt(i);  
262 - if (c >= ' ') {  
263 - if (c == '\\' || c == '"') {  
264 - add('\\');  
265 - }  
266 - add(c);  
267 - } else {  
268 - switch (c) {  
269 - case '\b':  
270 - add('\\b');  
271 - break;  
272 - case '\f':  
273 - add('\\f');  
274 - break;  
275 - case '\n':  
276 - add('\\n');  
277 - break;  
278 - case '\r':  
279 - add('\\r');  
280 - break;  
281 - case '\t':  
282 - add('\\t');  
283 - break;  
284 - default:  
285 - c = c.charCodeAt();  
286 - add('\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16));  
287 - }  
288 - }  
289 - }  
290 - return add('"');  
291 - break;  
292 - case 'boolean':  
293 - return add(String(obj));  
294 - break;  
295 - default:  
296 - return add('null');  
297 - break;  
298 - }  
299 - }  
300 - recurse(arg);  
301 - return jsonstring.join('');  
302 -};  
303 - </script>  
304 -</head>  
305 -<body>  
306 - <?php echo 'php JSONstr: ' . $jsonStr . "<br />\n"; ?>  
307 - <script type="text/javascript">  
308 - <!--  
309 - /* print JSON representation */  
310 - var jsonStr = '<?php echo addslashes($jsonStr); ?>';  
311 -  
312 - document.write('JavaScript JSONstr: ' + jsonStr);  
313 -  
314 - /* create another object from jsonStr */  
315 - try  
316 - {  
317 - var myObj2 = JSON.parse(jsonStr);  
318 -  
319 - var myObj3 = JSON.parse2(jsonStr);  
320 -  
321 -  
322 - /* test the clone */  
323 - document.write('<br /><br />Original JSON implementation');  
324 - document.write('<br />id: ' + myObj2.id);  
325 - document.write('<br />name: ' + myObj2.name);  
326 -  
327 - for (var i = 0; i < myObj2.attribs.length; i++) {  
328 - document.write('<br />attrib[' + i + ']: ' + myObj2.attribs[i]);  
329 - }  
330 - document.write('<br /><br />new JSON implementation');  
331 - document.write('<br />id: ' + myObj3.id);  
332 - document.write('<br />name: ' + myObj3.name);  
333 -  
334 - for (var i = 0; i < myObj3.attribs.length; i++) {  
335 - document.write('<br />attrib[' + i + ']: ' + myObj3.attribs[i]);  
336 - }  
337 -  
338 - /* convert newline to JSON */  
339 - var nl = "\n" + String.fromCharCode(18);  
340 - document.write('<br /><br /> Original JSON <br />newline as JSON: ' + JSON.stringify(nl));  
341 - document.write('<br /><br /> New JSON <br />newline as JSON: ' + JSON.stringify2(nl));  
342 -  
343 - //-->  
344 -}  
345 - catch(e)  
346 - {  
347 - alert(e.message);  
348 - }  
349 - </script>  
350 -</body>  
351 -</html>  
352 \ No newline at end of file 0 \ No newline at end of file
classesjs/cpaint/JSON/testsuite2.php
@@ -1,413 +0,0 @@ @@ -1,413 +0,0 @@
1 -<?php  
2 -  
3 -// New TestSuite  
4 -//---- includes ----------------------------------------------------------------  
5 - /**  
6 - * @include JSON  
7 - */  
8 - require_once('../json.php');  
9 - require_once('json2.php');  
10 -  
11 -// ----- PHP Test Objects  
12 -class object1  
13 -{  
14 - var $firstattr = 'firstvalue';  
15 - var $foreignchars = "Äø\r\n";  
16 - var $regarray = array("item1", "item2");  
17 - var $assocarray = array("item1"=>"value1", "item2"=>"value2");  
18 - var $boolean = true;  
19 - var $integer = 5;  
20 - var $float = 1.12;  
21 - var $innerobject;  
22 - function object1()  
23 - {  
24 - $this->innerobject = new object2();  
25 - }  
26 -}  
27 -class object2  
28 -{  
29 - var $firstattr = 'firstvalue';  
30 - var $secondattr = 'secondvalue';  
31 -}  
32 -//---- variables ---------------------------------------------------------------  
33 - $JSON = new JSON();  
34 - $object1 = new object1();  
35 - $JSON2 = new Services_JSON();  
36 - $submitted = false;  
37 -//---- logic -------------------------------------------------------------------  
38 - $origjsonstring = $JSON->stringify($object1);  
39 - $newjsonstring = $JSON2->encode($object1);  
40 - $origjson = $_REQUEST["origjson"];  
41 - if (!empty($origjson))  
42 - {  
43 - $origjsonprintr = $JSON->parse(stripslashes($origjson));  
44 - $submitted = true;  
45 - }  
46 - else  
47 - {  
48 - $origjsonprintr = "Not submitted";  
49 - }  
50 - $newjson = $_REQUEST["newjson"];  
51 - if (!empty($newjson))  
52 - {  
53 - $newjsonprintr = $JSON2->decode(stripslashes($newjson));  
54 - }  
55 - else  
56 - {  
57 - $newjsonprintr = "Not submitted";  
58 - }  
59 -  
60 -//---- content -----------------------------------------------------------------  
61 -?>  
62 -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">  
63 -<head>  
64 - <title>JSON parser test</title>  
65 - <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />  
66 - <script type="text/javascript" src="json.js"></script>  
67 - <script type="text/javascript">  
68 -JSON.arrayObj = new Array();  
69 -JSON.parse2 = function (text)  
70 -{  
71 - var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null|\/\*Array\*\/)\s*/,  
72 - token,  
73 - operator;  
74 -  
75 - function error(m, t) {  
76 - throw {  
77 - name: 'JSONError',  
78 - message: m,  
79 - text: t || operator || token  
80 - };  
81 - }  
82 -  
83 - function next() {  
84 - if (text) {  
85 - var t = p.exec(text);  
86 - if (t) {  
87 -  
88 - if (t[2]) {  
89 - token = null;  
90 - operator = t[2];  
91 - } else {  
92 - operator = null;  
93 - if(t[1].search (/^\/\*Array\*\/$/g) > -1)  
94 - {  
95 - token = function(){};  
96 - }  
97 - else  
98 - {  
99 - try {  
100 - token = eval(t[1]);  
101 - } catch (e) {  
102 - error("Bad token", t[1]);  
103 - }  
104 - }  
105 - }  
106 - text = text.substring(t[0].length);  
107 - } else {  
108 - error("Unrecognized token", text);  
109 - }  
110 - } else {  
111 - token = operator = undefined;  
112 - }  
113 - }  
114 -  
115 -  
116 - function arr() {  
117 - var a = [];  
118 -  
119 - next();  
120 - if (operator == ']') {  
121 - next();  
122 - return a;  
123 - }  
124 - for (;;) {  
125 - a.push(val());  
126 - switch (operator) {  
127 - case ']':  
128 - next();  
129 - return a;  
130 - case ',':  
131 - next();  
132 - break;  
133 - default:  
134 - error("Missing ']'");  
135 - }  
136 - }  
137 - }  
138 -  
139 - function obj() {  
140 - var k, o = {};  
141 -  
142 - next();  
143 - if (operator == '}') {  
144 - next();  
145 - return o;  
146 - }  
147 - if (typeof(token) == 'function')  
148 - {  
149 - o = [];  
150 - next();  
151 - }  
152 - for (;;)  
153 - {  
154 -  
155 -  
156 - if (operator ||typeof token != 'string') {  
157 - error("Missing key");  
158 - }  
159 - k = token;  
160 - next();  
161 -  
162 - if (operator != ':') {  
163 - error("Missing ':'");  
164 - }  
165 -  
166 - next();  
167 - o[k] = val();  
168 -  
169 - switch (operator) {  
170 - case '}':  
171 - next();  
172 - return o;  
173 - case ',':  
174 - next();  
175 - break;  
176 - case '#':  
177 - next();  
178 - break;  
179 - default:  
180 - error("Missing '}'");  
181 - }  
182 - }  
183 - }  
184 -  
185 - function val() {  
186 - switch (operator) {  
187 - case '{':  
188 - return obj();  
189 - case '[':  
190 - return arr();  
191 - default:  
192 - if (operator !== null) {  
193 - error("Missing value");  
194 - }  
195 - var t = token;  
196 - next();  
197 - return t;  
198 - }  
199 - }  
200 - next();  
201 - return val();  
202 -};  
203 -  
204 -JSON.stringify2 = function(arg)  
205 -{  
206 - var jsonstring = [];  
207 - var b = this;  
208 - function add(str)  
209 - {  
210 - jsonstring[jsonstring.length] = str;  
211 - }  
212 - function validObj(obj)  
213 - {  
214 - if (typeof(obj) != 'undefined' && typeof(obj) != 'function')  
215 - {  
216 - return true;  
217 - }  
218 - return false;  
219 - }  
220 - function recurse(obj, prefix)  
221 - {  
222 - switch (typeof(obj))  
223 - {  
224 - case 'object':  
225 - if (obj)  
226 - {  
227 - var first = true;  
228 - if (obj.constructor == b.arrayObj.constructor)  
229 - {  
230 - add('{/*Array*/');  
231 - //add ('{');  
232 - }  
233 - else  
234 - {  
235 - add ('{');  
236 - }  
237 - for (prop in obj)  
238 - {  
239 - if (validObj(obj[prop]))  
240 - {  
241 - if (!first)  
242 - {  
243 - add(',');  
244 - }  
245 - recurse(prop);  
246 - add(':');  
247 - recurse (obj[prop]);  
248 - first =false;  
249 - }  
250 - }  
251 - return add ('}');  
252 - }  
253 - return add('null');  
254 - break;  
255 - case 'number':  
256 - return add(isFinite(obj) ? String(obj) : 'null');  
257 - break;  
258 - case 'string':  
259 - l = obj.length;  
260 - add('"');  
261 - for (i = 0; i < l; i += 1) {  
262 - c = obj.charAt(i);  
263 - if (c >= ' ') {  
264 - if (c == '\\' || c == '"') {  
265 - add('\\');  
266 - }  
267 - add(c);  
268 - } else {  
269 - switch (c) {  
270 - case '\b':  
271 - add('\\b');  
272 - break;  
273 - case '\f':  
274 - add('\\f');  
275 - break;  
276 - case '\n':  
277 - add('\\n');  
278 - break;  
279 - case '\r':  
280 - add('\\r');  
281 - break;  
282 - case '\t':  
283 - add('\\t');  
284 - break;  
285 - default:  
286 - c = c.charCodeAt();  
287 - add('\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16));  
288 - }  
289 - }  
290 - }  
291 - return add('"');  
292 - break;  
293 - case 'boolean':  
294 - return add(String(obj));  
295 - break;  
296 - default:  
297 - return add('null');  
298 - break;  
299 - }  
300 - }  
301 - recurse(arg);  
302 - return jsonstring.join('');  
303 -};  
304 - </script>  
305 -</head>  
306 -<body>  
307 - <table width="100%">  
308 - <tr>  
309 - <td>  
310 - <table width="100%">  
311 - <caption>Original JSON PHP/Javascript</caption>  
312 - <tr>  
313 - <td>  
314 - Original PHP object (print_r)  
315 - <textarea rows="5" cols="50"><?php echo print_r($object1); ?></textarea>  
316 - </td>  
317 - </tr>  
318 - <tr>  
319 - <td>Result of PHP Stringify<br /><textarea rows="5" cols="50"><?php echo ($origjsonstring); ?></textarea></td>  
320 - </tr>  
321 - <tr>  
322 - <td>Did it Convert to a Javascript Object origjsobj ?<br />  
323 - <script>  
324 - try  
325 - {  
326 - var origjsobj = JSON.parse('<?php echo addslashes($origjsonstring); ?>');  
327 - document.write('Successful');  
328 - }  
329 - catch(e)  
330 - {  
331 - document.write('Failed');  
332 - document.write(' Original Parse Failed with this error "' + e.message + '"');  
333 - }  
334 - </script>  
335 - <br /><button onclick="s=document.body.appendChild(document.createElement('script'));s.id='sst';s.language='javascript';void(s.src='http://snmp-dev.cableaz.com/beta/print_r_0_3.js');">Invoke Print_R</button>  
336 - </td>  
337 - </tr>  
338 - <tr>  
339 - <td>Result of Javascript Stringify<br />  
340 - <script>  
341 - var origjsstr = JSON.stringify(origjsobj);  
342 - document.write('<textarea rows="5" cols="50">' + origjsstr + '</textarea>');  
343 - </script>  
344 - </td>  
345 - </tr>  
346 - <tr>  
347 - <td>  
348 - Result of Conversion Back to PHP object (print_r)  
349 - <textarea rows="5" cols="50"><?php echo print_r($origjsonprintr); ?></textarea>  
350 - </td>  
351 - </tr>  
352 - </table>  
353 - </td>  
354 - <td>  
355 - <table width="100%">  
356 - <caption>New JSON PHP/Javascript</caption>  
357 - <tr>  
358 - <td>  
359 - Original PHP object (print_r)  
360 - <textarea rows="5" cols="50"><?php echo print_r($object1); ?></textarea>  
361 - </td>  
362 - </tr>  
363 - <tr>  
364 - <td>Result of PHP Stringify<br /><textarea rows="5" cols="50"><?php echo ($newjsonstring); ?></textarea></td>  
365 - </tr>  
366 - <tr>  
367 - <td>Did it Convert to a Javascript Object newjsobj ?<br />  
368 - <script>  
369 - try  
370 - {  
371 - var newjsobj = JSON.parse2('<?php echo addslashes($newjsonstring); ?>');  
372 - document.write('Successful');  
373 - }  
374 - catch(e)  
375 - {  
376 - document.write('Failed');  
377 - document.write(' New Parse Failed with this error "' + e.message + '"');  
378 - }  
379 - </script>  
380 - <br /><button onclick="s=document.body.appendChild(document.createElement('script'));s.id='sst';s.language='javascript';void(s.src='http://snmp-dev.cableaz.com/beta/print_r_0_3.js');">Invoke Print_R</button>  
381 - </td>  
382 - </tr>  
383 - <tr>  
384 - <td>Result of Javascript Stringify<br />  
385 - <script>  
386 - var newjsstr = JSON.stringify2(newjsobj);  
387 - document.write('<textarea rows="5" cols="50">' + newjsstr + '</textarea>');  
388 - </script>  
389 - </td>  
390 - </tr>  
391 - <tr>  
392 - <td>  
393 - Result of Conversion Back to PHP object (print_r)  
394 - <textarea rows="5" cols="50"><?php echo print_r($newjsonprintr); ?></textarea>  
395 - </td>  
396 - </tr>  
397 - </table>  
398 - </td>  
399 - </table>  
400 -<form method="GET" action="testsuite2.php" id="hiddenform">  
401 - <script>  
402 - document.write ('<input name="origjson" type="hidden" value=\'' + origjsstr + '\' />');  
403 - document.write ('<input name="newjson" type="hidden" value=\'' + newjsstr + '\' />');  
404 - <?php  
405 - if (!$submitted)  
406 - {  
407 - echo "document.getElementById('hiddenform').submit();";  
408 - }  
409 - ?>  
410 - </script>  
411 -</form>  
412 -</body>  
413 -</html>  
414 \ No newline at end of file 0 \ No newline at end of file
classesjs/cpaint/changelog.txt
@@ -1,134 +0,0 @@ @@ -1,134 +0,0 @@
1 -CPAINT changelog  
2 -  
3 -//---- v2.0.3 (Released Feburary 8, 2006) --------------------------  
4 -- PHP: nixed potential security hole with invalid response types  
5 - (Thanks to James Bercegay)  
6 -  
7 -//---- v2.0.2 (Released January 20, 2006) --------------------------  
8 -- JS: check HTTP response code and throw an error if request was  
9 - not accepted by server. (thanks gloomyandy)  
10 -- JS: allowing the underscore in node names.  
11 -- JS: added support for the passing of arrays and objects to the  
12 - backend.  
13 -- JS: added X-Powered-By request header.  
14 -- JS: node names, attribute names and -values from backend are now  
15 - expected to be valid ISO-8859-1.  
16 -- JS: fixed wrong initialization of the data property to int zero in  
17 - class cpaint_result_object.  
18 -- JS: removed unneccessary setter() methods from internal classes  
19 - to reduce size.  
20 -- JS: added debugging level cp.set_debug(-1) to suppress errors.  
21 -- JS: fixed type conversion issue where non-empty, pure whitespace  
22 - strings where interpreted as numbers.  
23 -- JS: fixed problem with callback being called twice.  
24 - (thanks to Lance Rushing)  
25 -- JS: fixed problem with URLs with existing GET parameters.  
26 - (thanks to Nelson Antunes)  
27 -- JS / PHP: added support for JSON as response type.  
28 -- JS / PHP: added support for E4X as response type.  
29 -- PHP: added cpaint::unregister()  
30 -- PHP: added cpaint::get_response_type();  
31 -- PHP: removed a bug in JSON library that prevented the generation of valid JSON  
32 - when including a leading zero character.  
33 -- PHP: Removed unneccessary unescaping of parameters in proxy script.  
34 -- PHP: added support for array and object parameters from JavaScript (JSON!).  
35 -- PHP: added X-Powered-By response header.  
36 -- PHP: removed encoding of node names, attribute names and attribute  
37 - values to UTF-8 if possible. those values must now be valid  
38 - ISO-8859-1.  
39 -- PHP: removed output buffer to make it possible to include backend  
40 - and frontend in the same file.  
41 -- PHP: fixed error output (a function was called...) when no  
42 - parameters where sent to CPAINT indicating a function call, thus  
43 - making it possible to include backend and frontend in the same file  
44 - (thanks S. Alexandre M. Lemaire)  
45 -- PHP: added backend debugger code to main source tree & documentation.  
46 -- PHP: secured proxy utility (see documentation).  
47 -- PHP: added backend configuration file (for proxy security and future use)  
48 -- ASP: removed from distribution to focus on PHP and other ports.  
49 -  
50 -//---- v2.0.1 (Released September 5, 2005) --------------------------  
51 -- JS: added the returning of plain-text response when using XML|OBJECT  
52 - response type as second parameter to user-defined callback function  
53 - (thanks Gunther)  
54 -- JS: added cpaint.capable property to determine AJAX-compatible  
55 - browsers  
56 -- JS: cleaned up CPAINT parameters when not using CPAINT API w/ proxy  
57 -- PHP: fixed callability of object methods (thanks Markus Wolf)  
58 -- PHP: fixed HTTP authentication in proxy file  
59 -- ASP: improved security regarding incoming function arguments  
60 -  
61 -//---- v2.0 (Released August 20, 2005) ------------------------------  
62 -- completely rewrote the JavaScript frontend.  
63 - - 100% OOP approach.  
64 - - completely configurable through setter methods.  
65 - - support for syncronized calls (SJAX?) ;-).  
66 - - automatic XML parsing into JavaScript document structure if  
67 - response_type='object'.  
68 - - support for arbitrary character sets, including non-printable  
69 - characters.  
70 - - automatic detection and conversion of numeric data into  
71 - integers / floats.  
72 - - unified use of call() for local and remote targets.  
73 - - can now use frontend to retrieve static files or backend  
74 - functions not implemented with CPAINT  
75 - - use of a single (persistent) connection for multiple calls.  
76 - - XML to JavaScript parser is able to parse any XML structure now.  
77 - - support for XML attributes.  
78 - - added find_item_by_type() to cpaint_result_object.  
79 - - added get_attribute(), set_attribute() to cpaint_result_object.  
80 - - improved debugging, added debuglevels 1, 2. see set_debug()  
81 -  
82 -- completely rewrote the PHP and ASP backends.  
83 - - 100% OOP approach.  
84 - - protection against remote code-execution.  
85 - - support for object methods as callable functions.  
86 - - nested XML support through composite pattern.  
87 - - arbitrary XML structure creation support.  
88 - - support for arbitrary character sets.  
89 - - replaced remote code-execution blacklisting approach of v1.3-SP  
90 - with whitelisting through cpaint.register().  
91 - - changed XML name convention. Attributes and tagnames are send  
92 - as-is, not in uppercase.  
93 -  
94 -- improved readability of the ASP and PHP proxy utilities.  
95 - - fixed GET requests.  
96 - - proxy now uses attributenames identical to the CPAINT backend  
97 - itself whenever possible.  
98 - - added support for target ports other than 80.  
99 - - added support for Basic Authentication.  
100 - - completely redesigned and rewritten documentation!  
101 -  
102 -//---- v1.3-SP2 (Released August 16, 2005) --------------------------  
103 -- improved the remote-code execution fix.  
104 -  
105 -//---- v1.3-SP (Released August 15, 2005) ---------------------------  
106 -- fixed a remote code-execution vulnerability on the backend by  
107 - adding a blacklist test on the function name passed by the  
108 - frontend.  
109 -  
110 -//---- v1.3 (Released July 10, 2005) --------------------------------  
111 -- rewrote cpaint_parse_ajax_xml() to be able to parse arbitrary XML.  
112 -- added bugfix from v1.01 to cpaint_get_remote_file() as well.  
113 -  
114 -//---- v1.2 (Released June 20, 2005) --------------------------------  
115 -- added method cpaint_parse_ajax_xml() to the JavaScript frontend for  
116 - primitive XML to JavaScript transformation of response data.  
117 -  
118 -//---- v1.01 (Released June 16, 2005) -------------------------------  
119 -- bugfix regarding Unicode character encoding in cpaint_call().  
120 -  
121 -//---- v1.0 (Released June 13, 2005) --------------------------------  
122 -- added support for XML/DOM document object returns.  
123 -- added support for XML on the backend.  
124 -- added proxy files for accessing remote functions & data.  
125 -- greatly improved documentation & examples.  
126 -- code stablized  
127 -- development effort moved to SourceForge.Net  
128 -  
129 -//---- Pre-1.0 Releases and Dates -----------------------------------  
130 -- v0.7 - released June 8, 2005  
131 -- v0.5 & 0.6 - released June 6, 2005  
132 -- v0.4 - released June 3, 2005  
133 -- v0.2 & 0.3 - released June 2, 2005  
134 -- v0.1 - released May 31, 2005 (first release)  
classesjs/cpaint/cpaint2.backend-debugger.php
@@ -1,104 +0,0 @@ @@ -1,104 +0,0 @@
1 -<?  
2 -/*  
3 - CPAINT Backend Debug Interface  
4 -  
5 - released under the terms of the GPL  
6 - see http://www.fsf.org/licensing/licenses/gpl.txt for details  
7 -  
8 - @package CPAINT  
9 - @access public  
10 - @author Paul Sullivan <wiley14@gmail.com>  
11 - @author Stephan Tijink <stijink@googlemail.com>  
12 - @copyright Copyright (c) 2005-2006 Paul Sullivan - http://sf.net/projects/cpaint  
13 - @version 2.0.3  
14 -*/  
15 -  
16 -if (!(isset($_REQUEST["cpaint_function"]))) {  
17 - $debug_html_start = '  
18 - <html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  
19 - <title>CPAINT Debug Interface</title>  
20 - <style type="text/css">body { background-color: #9999CC; margin-top: 0px; }  
21 - .style3 { font-family: Arial, Helvetica, sans-serif; font-size: 12px; }  
22 - .style4 { font-size: 20px; color: #FFFFFF; font-family: Arial, Helvetica, sans-serif;}  
23 - .style5 { font-size: 16px; color: #FFFFFF; font-family: Arial, Helvetica, sans-serif; font-weight: bold; }  
24 - .style6 { font-size: 12px; color: #FFFFFF; font-family: Arial, Helvetica, sans-serif; font-weight: bold; }  
25 - div, iframe { margin: 0px; border: 1px solid #9999CC; }  
26 - </style>  
27 - <script type="text/javascript">  
28 - function showForm(divId) {  
29 - if (document.getElementById(divId).style.display == "block") {  
30 - document.getElementById(divId).style.display = "none";  
31 - } else {  
32 - document.getElementById(divId).style.display = "block";  
33 - }  
34 - }  
35 - </script>  
36 - </head>  
37 - <body>  
38 - <table width="100%" border="0" cellspacing="0" cellpadding="0">  
39 - <tr><td bgcolor="#9999CC"><div align="justify"><span class="style4">CPAINT Debug Interface</span></div></td></tr>  
40 - <tr><td bgcolor="#9999CC"><div align="justify"><span class="style6" style="color:#FFFFFF;">backend filename: '.$_SERVER["SCRIPT_NAME"].'</span></div></td></tr>  
41 - <tr><td height="10" bgcolor="#9999CC" class="style3"></td></tr>  
42 - <tr><td height="10" bgcolor="#9999CC" class="style3"></td></tr>  
43 - <tr><td bgcolor="#FFFFFF" class="style3"><blockquote>';  
44 - $debug_html_end = "</blockquote></td></tr></table><br><iframe name=\"results\" class=\"style3\" width=\"100%\" height=\"100%\" scrolling=\"yes\" allowtransparency=\"false\" style=\"background-color: #FFFFFF\"></iframe></body></html>";  
45 -  
46 - // get function names and function variables/values  
47 - $functionArray = getCallableCode();  
48 -  
49 - $debug_body = "";  
50 - if (count($functionArray) > 0) {  
51 - foreach ($functionArray as $func_name=>$func_variables) {  
52 - $debug_body = $debug_body . "<form method=\"get\" target=\"results\"><a href=\"javascript:showForm('" . $func_name . "_form');\">" . $func_name . "</a><div id=\"" . $func_name . "_form\" style=\"display: none;\">";  
53 -  
54 - $debug_body = $debug_body . '<table border="0">';  
55 - if ( count($func_variables) > 0) {  
56 - foreach ($func_variables as $var_name=>$var_preset) {  
57 - $debug_body = $debug_body . '<tr><td class="style3">Parameter (<strong>$'.$var_name.'</strong>):</td><td><input type="text" name="cpaint_argument[]"></td>';  
58 - if (strlen($var_preset) > 0) { $debug_body = $debug_body . "<td class=\"style3\"> &nbsp; default value is <strong>".$var_preset." &nbsp;</strong></td>"; }  
59 - $debug_body = $debug_body . '</tr>';  
60 - }  
61 - }  
62 - $debug_body = $debug_body . "<tr><td class=\"style3\">Response Type:</td><td><select name=\"cpaint_response_type\"><option>TEXT</option><option>XML</option><option>OBJECT</option></select></td></tr>";  
63 - $debug_body = $debug_body . "<tr><td colspan=\"3\"><input type=\"hidden\" name=\"cpaint_function\" value=\"" . $func_name . "\"><input type=\"submit\"></td></tr></table></div></form>";  
64 - }  
65 - }  
66 -  
67 - print($debug_html_start . $debug_body . $debug_html_end);  
68 - die();  
69 -}  
70 -  
71 -function getCallableCode() {  
72 - $scriptName = $_SERVER['SCRIPT_FILENAME'];  
73 - $fileLines = file($scriptName);  
74 - for ($i=0; $i < sizeof($fileLines); $i++) {  
75 - $line = trim($fileLines[$i]);  
76 - if (substr($line, 0, 9) == "FUNCTION " || substr($line,0,9) == "function ") {  
77 - $match[] = $line;  
78 - }  
79 - }  
80 - for ($i = 0; $i < sizeof($match); $i++) {  
81 - $line = str_replace("function ", "", $match[$i]);  
82 - $line = str_replace("FUNCTION ", "", $line);  
83 - $line = str_replace("{", "", $line);  
84 - $parts = explode("(", $line);  
85 - $func_name = trim($parts[0]);  
86 -  
87 - $Tempargs = explode(")", $parts[1]);  
88 - $args = explode(",", $Tempargs[0]);  
89 - $argSize = sizeof($args);  
90 -  
91 - // check args for preset values  
92 - if ($argSize > 0) {  
93 - foreach ($args as $arg) {  
94 - $arg = trim ($arg);  
95 - $varArray = explode ("=", $arg);  
96 - $var_name = trim (str_replace ("$", "", $varArray["0"]));  
97 - $var_value = trim ($varArray["1"]);  
98 - $resultArray[$func_name][$var_name] = $var_value;  
99 - }  
100 - }  
101 - }  
102 - return $resultArray;  
103 -}  
104 -?>  
105 \ No newline at end of file 0 \ No newline at end of file
classesjs/cpaint/cpaint2.config.php
@@ -1,35 +0,0 @@ @@ -1,35 +0,0 @@
1 -<?  
2 -/**  
3 -* CPAINT (Cross-Platform Asynchronous INterface Toolkit)  
4 -*  
5 -* http://sf.net/projects/cpaint  
6 -*  
7 -* released under the terms of the GPL  
8 -* see http://www.fsf.org/licensing/licenses/gpl.txt for details  
9 -*  
10 -* $Id$  
11 -* $Log$  
12 -*  
13 -* Configuration file for backend scripts, including proxy  
14 -*  
15 -* @package CPAINT  
16 -* @author Paul Sullivan <wiley14@gmail.com>  
17 -* @author Dominique Stender <dstender@st-webdevelopment.de>  
18 -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint  
19 -* @version 2.0.3  
20 -*/  
21 -  
22 -//---- proxy settings ----------------------------------------------------------  
23 - $cpaint2_config["proxy.security.use_whitelist"] = true;  
24 - // Use the whitelist for allowed URLs?  
25 -  
26 -//---- proxy security whitelist ------------------------------------------------  
27 - /* whitelist data should be added to the variable $cpaint2_proxy_whitelist[]  
28 - example: $cpaint2_proxy_whitelist[] = "example.com/test.php";  
29 - - or -  
30 - example: $cpaint2_proxy_whitelist[] = "example.com";  
31 - ** Omit http:// and https:// from the URL **  
32 - */  
33 - $cpaint2_proxy_whitelist[] = $_SERVER['HTTP_HOST']; // this server  
34 -  
35 -?>  
36 \ No newline at end of file 0 \ No newline at end of file
classesjs/cpaint/cpaint2.inc.compressed.js
@@ -1,116 +0,0 @@ @@ -1,116 +0,0 @@
1 -function cpaint(){this.version='2.0.3';var config=new Array();config['debugging']=-1;config['proxy_url']='';config['transfer_mode']='GET';config['async']=true;config['response_type']='OBJECT';config['persistent_connection']=false;config['use_cpaint_api']=true;var stack_count=0;this.capable=test_ajax_capability();this.set_debug=function(){if(typeof arguments[0]=='boolean'){if(arguments[0]===true){config['debugging']=1;}else{config['debugging']=0;}}else if(typeof arguments[0]=='number'){config['debugging']=Math.round(arguments[0]);}}  
2 -this.set_proxy_url=function(){if(typeof arguments[0]=='string'){config['proxy_url']=arguments[0];}}  
3 -this.set_transfer_mode=function(){if(arguments[0].toUpperCase()=='GET'||arguments[0].toUpperCase()=='POST'){config['transfer_mode']=arguments[0].toUpperCase();}}  
4 -this.set_async=function(){if(typeof arguments[0]=='boolean'){config['async']=arguments[0];}}  
5 -this.set_response_type=function(){if(arguments[0].toUpperCase()=='TEXT'||arguments[0].toUpperCase()=='XML'||arguments[0].toUpperCase()=='OBJECT'||arguments[0].toUpperCase()=='E4X'||arguments[0].toUpperCase()=='JSON'){config['response_type']=arguments[0].toUpperCase();}}  
6 -this.set_persistent_connection=function(){if(typeof arguments[0]=='boolean'){config['persistent_connection']=arguments[0];}}  
7 -this.set_use_cpaint_api=function(){if(typeof arguments[0]=='boolean'){config['use_cpaint_api']=arguments[0];}}  
8 -function test_ajax_capability(){var cpc=new cpaint_call(0,config,this.version);return cpc.test_ajax_capability();}  
9 -this.call=function(){var use_stack=-1;if(config['persistent_connection']==true&&__cpaint_stack[0]!=null){switch(__cpaint_stack[0].get_http_state()){case-1:use_stack=0;debug('no XMLHttpObject object to re-use for persistence, creating new one later',2);break;case 4:use_stack=0  
10 -debug('re-using the persistent connection',2);break;default:debug('the persistent connection is in use - skipping this request',2);}}else if(config['persistent_connection']==true){use_stack=0;__cpaint_stack[use_stack]=new cpaint_call(use_stack,config,this.version);debug('no cpaint_call object available for re-use, created new one',2);}else{use_stack=stack_count;__cpaint_stack[use_stack]=new cpaint_call(use_stack,config,this.version);debug('no cpaint_call object created new one',2);}  
11 -if(use_stack!=-1){__cpaint_stack[use_stack].set_client_callback(arguments[2]);if(config['proxy_url']!=''){__cpaint_stack[use_stack].call_proxy(arguments);}else{__cpaint_stack[use_stack].call_direct(arguments);}  
12 -stack_count++;debug('stack size: '+__cpaint_stack.length,2);}}  
13 -var debug=function(message,debug_level){var prefix='[CPAINT Debug] ';if(debug_level<1){prefix='[CPAINT Error] ';}  
14 -if(config['debugging']>=debug_level){alert(prefix+message);}if (message.search("error") > 1){client_callback("", message);}}}  
15 -var __cpaint_stack=new Array();var __cpaint_transformer=new cpaint_transformer();function cpaint_call(){var version=arguments[2];var config=new Array();config['debugging']=arguments[1]['debugging'];config['proxy_url']=arguments[1]['proxy_url'];config['transfer_mode']=arguments[1]['transfer_mode'];config['async']=arguments[1]['async'];config['response_type']=arguments[1]['response_type'];config['persistent_connection']=arguments[1]['persistent_connection'];config['use_cpaint_api']=arguments[1]['use_cpaint_api'];var httpobj=false;var client_callback;var stack_id=arguments[0];this.set_client_callback=function(){if(typeof arguments[0]=='function'){client_callback=arguments[0];}}  
16 -this.get_http_state=function(){var return_value=-1;if(typeof httpobj=='object'){return_value=httpobj.readyState;}  
17 -return return_value;}  
18 -this.call_direct=function(call_arguments){var url=call_arguments[0];var remote_method=call_arguments[1];var querystring='';var i=0;if(url=='SELF'){url=document.location.href;}  
19 -if(config['use_cpaint_api']==true){for(i=3;i<call_arguments.length;i++){if((typeof call_arguments[i]=='string'&&call_arguments[i]!=''&&call_arguments[i].search(/^\s+$/g)==-1)&&!isNaN(call_arguments[i])&&isFinite(call_arguments[i])){querystring+='&cpaint_argument[]='+encodeURIComponent(JSON.stringify(Number(call_arguments[i])));}else{querystring+='&cpaint_argument[]='+encodeURIComponent(JSON.stringify(call_arguments[i]));}}  
20 -querystring+='&cpaint_response_type='+config['response_type'];if(config['transfer_mode']=='GET'){if(url.indexOf('?')!=-1){url=url+'&cpaint_function='+remote_method+querystring;}else{url=url+'?cpaint_function='+remote_method+querystring;}}else{querystring='cpaint_function='+remote_method+querystring;}}else{for(i=3;i<call_arguments.length;i++){if(i==3){querystring+=encodeURIComponent(call_arguments[i]);}else{querystring+='&'+encodeURIComponent(call_arguments[i]);}}  
21 -if(config['transfer_mode']=='GET'){url=url+querystring;}}  
22 -get_connection_object();debug('opening connection to "'+url+'"',1);httpobj.open(config['transfer_mode'],url,config['async']);if(config['transfer_mode']=='POST'){try{httpobj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');}catch(cp_err){debug('POST cannot be completed due to incompatible browser. Use GET as your request method.',0);}}  
23 -httpobj.setRequestHeader('X-Powered-By','CPAINT v'+version+' :: http://sf.net/projects/cpaint');httpobj.onreadystatechange=callback;if(config['transfer_mode']=='GET'){httpobj.send(null);}else{debug('sending query: '+querystring,1);httpobj.send(querystring);}  
24 -if(config['async']==true){callback();}}  
25 -this.call_proxy=function(call_arguments){var proxyscript=config['proxy_url'];var url=call_arguments[0];var remote_method=call_arguments[1];var querystring='';var i=0;var querystring_argument_prefix='cpaint_argument[]=';if(config['use_cpaint_api']==false){querystring_argument_prefix='';}  
26 -for(i=3;i<call_arguments.length;i++){if(config['use_cpaint_api']==true){if((typeof call_arguments[i]=='string'&&call_arguments[i]!=''&&call_arguments[i].search(/^\s+$/g)==-1)&&!isNaN(call_arguments[i])&&isFinite(call_arguments[i])){querystring+=encodeURIComponent(querystring_argument_prefix+JSON.stringify(Number(call_arguments[i]))+'&');}else{querystring+=encodeURIComponent(querystring_argument_prefix+JSON.stringify(call_arguments[i])+'&');}}else{querystring+=encodeURIComponent(querystring_argument_prefix+call_arguments[i]+'&');}}  
27 -if(config['use_cpaint_api']==true){querystring+=encodeURIComponent('&cpaint_function='+remote_method);querystring+=encodeURIComponent('&cpaint_responsetype='+config['response_type']);}  
28 -if(config['transfer_mode']=='GET'){proxyscript+='?cpaint_remote_url='+encodeURIComponent(url)  
29 -+'&cpaint_remote_query='+querystring  
30 -+'&cpaint_remote_method='+config['transfer_mode']  
31 -+'&cpaint_response_type='+config['response_type'];}else{querystring='cpaint_remote_url='+encodeURIComponent(url)  
32 -+'&cpaint_remote_query='+querystring  
33 -+'&cpaint_remote_method='+config['transfer_mode']  
34 -+'&cpaint_response_type='+config['response_type'];}  
35 -get_connection_object();debug('opening connection to proxy "'+proxyscript+'"',1);httpobj.open(config['transfer_mode'],proxyscript,config['async']);if(config['transfer_mode']=='POST'){try{httpobj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');}catch(cp_err){debug('POST cannot be completed due to incompatible browser. Use GET as your request method.',0);}}  
36 -httpobj.setRequestHeader('X-Powered-By','CPAINT v'+version);httpobj.onreadystatechange=callback;if(config['transfer_mode']=='GET'){httpobj.send(null);}else{debug('sending query: '+querystring,1);httpobj.send(querystring);}  
37 -if(config['async']==false){callback();}}  
38 -this.test_ajax_capability=function(){return get_connection_object();}  
39 -var get_connection_object=function(){var return_value=false;var new_connection=false;if(config['persistent_connection']==false){debug('Using new connection object',1);new_connection=true;}else{debug('Using shared connection object.',1);if(typeof httpobj!='object'){debug('Getting new persistent connection object.',1);new_connection=true;}}  
40 -if(new_connection==true){try{httpobj=new XMLHttpRequest();}catch(e1){try{httpobj=new ActiveXObject('Msxml2.XMLHTTP');}catch(e){try{httpobj=new ActiveXObject('Microsoft.XMLHTTP');}catch(oc){httpobj=null;}}}  
41 -if(!httpobj){debug('Could not create connection object',0);}else{return_value=true;}}  
42 -if(httpobj.readyState!=4){httpobj.abort();}  
43 -return return_value;}  
44 -var callback=function(){var response=null;if(httpobj.readyState==4&&httpobj.status==200){debug(httpobj.responseText,1);debug('using response type '+config['response_type'],2);switch(config['response_type']){case'XML':debug(httpobj.responseXML,2);response=__cpaint_transformer.xml_conversion(httpobj.responseXML);break;case'OBJECT':response=__cpaint_transformer.object_conversion(httpobj.responseXML);break;case'TEXT':response=__cpaint_transformer.text_conversion(httpobj.responseText);break;case'E4X':response=__cpaint_transformer.e4x_conversion(httpobj.responseText);break;case'JSON':response=__cpaint_transformer.json_conversion(httpobj.responseText);break;default:debug('invalid response type \''+response_type+'\'',0);}  
45 -if(response!=null&&typeof client_callback=='function'){client_callback(response,httpobj.responseText);}  
46 -remove_from_stack();}else if(httpobj.readyState==4&&httpobj.status!=200){debug('invalid HTTP response code \''+Number(httpobj.status)+'\'',0);client_callback("", "erro");}}  
47 -var remove_from_stack=function(){if(typeof stack_id=='number'&&__cpaint_stack[stack_id]&&config['persistent_connection']==false){__cpaint_stack[stack_id]=null;}}  
48 -var debug=function(message,debug_level){var prefix='[CPAINT Debug] ';if(config['debugging']<1){prefix='[CPAINT Error] ';if (message.search("error") > 1){client_callback("", message);}}  
49 -if(config['debugging']>=debug_level){alert(prefix+message);}}}  
50 -function cpaint_transformer(){this.object_conversion=function(xml_document){var return_value=new cpaint_result_object();var i=0;var firstNodeName='';if(typeof xml_document=='object'&&xml_document!=null){for(i=0;i<xml_document.childNodes.length;i++){if(xml_document.childNodes[i].nodeType==1){firstNodeName=xml_document.childNodes[i].nodeName;break;}}  
51 -var ajax_response=xml_document.getElementsByTagName(firstNodeName);return_value[firstNodeName]=new Array();for(i=0;i<ajax_response.length;i++){var tmp_node=create_object_structure(ajax_response[i]);tmp_node.id=ajax_response[i].getAttribute('id')  
52 -return_value[firstNodeName].push(tmp_node);}}else{debug('received invalid XML response',0);}  
53 -return return_value;}  
54 -this.xml_conversion=function(xml_document){return xml_document;}  
55 -this.text_conversion=function(text){return decode(text);}  
56 -this.e4x_conversion=function(text){text=text.replace(/^\<\?xml[^>]+\>/,'');return new XML(text);}  
57 -this.json_conversion=function(text){return JSON.parse(text);}  
58 -var create_object_structure=function(stream){var return_value=new cpaint_result_object();var node_name='';var i=0;var attrib=0;if(stream.hasChildNodes()==true){for(i=0;i<stream.childNodes.length;i++){node_name=stream.childNodes[i].nodeName;node_name=node_name.replace(/[^a-zA-Z0-9_]*/g,'');if(typeof return_value[node_name]!='object'){return_value[node_name]=new Array();}  
59 -if(stream.childNodes[i].nodeType==1){var tmp_node=create_object_structure(stream.childNodes[i]);for(attrib=0;attrib<stream.childNodes[i].attributes.length;attrib++){tmp_node.set_attribute(stream.childNodes[i].attributes[attrib].nodeName,stream.childNodes[i].attributes[attrib].nodeValue);}  
60 -return_value[node_name].push(tmp_node);}else if(stream.childNodes[i].nodeType==3){return_value.data=decode(String(stream.firstChild.data));}}}  
61 -return return_value;}  
62 -var decode=function(rawtext){var plaintext='';var i=0;var c1=0;var c2=0;var c3=0;var u=0;var t=0;while(i<rawtext.length){if(rawtext.charAt(i)=='\\'&&rawtext.charAt(i+1)=='u'){u=0;for(j=2;j<6;j+=1){t=parseInt(rawtext.charAt(i+j),16);if(!isFinite(t)){break;}  
63 -u=u*16+t;}  
64 -plaintext+=String.fromCharCode(u);i+=6;}else{plaintext+=rawtext.charAt(i);i++;}}  
65 -if(plaintext!=''&&plaintext.search(/^\s+$/g)==-1&&!isNaN(plaintext)&&isFinite(plaintext)){plaintext=Number(plaintext);}  
66 -return plaintext;}}  
67 -function cpaint_result_object(){this.id=0;this.data='';var __attributes=new Array();this.find_item_by_id=function(){var return_value=null;var type=arguments[0];var id=arguments[1];var i=0;if(this[type]){for(i=0;i<this[type].length;i++){if(this[type][i].get_attribute('id')==id){return_value=this[type][i];break;}}}  
68 -return return_value;}  
69 -this.get_attribute=function(){var return_value=null;var id=arguments[0];if(typeof __attributes[id]!='undefined'){return_value=__attributes[id];}  
70 -return return_value;}  
71 -this.set_attribute=function(){__attributes[arguments[0]]=arguments[1];}}  
72 -Array.prototype.______array='______array';var JSON={org:'http://www.JSON.org',copyright:'(c)2005 JSON.org',license:'http://www.crockford.com/JSON/license.html',stringify:function(arg){var c,i,l,s='',v;var numeric=true;switch(typeof arg){case'object':if(arg){if(arg.______array=='______array'){for(i in arg){if(i!='______array'&&(isNaN(i)||!isFinite(i))){numeric=false;break;}}  
73 -if(numeric==true){for(i=0;i<arg.length;++i){if(typeof arg[i]!='undefined'){v=this.stringify(arg[i]);if(s){s+=',';}  
74 -s+=v;}else{s+=',null';}}  
75 -return'['+s+']';}else{for(i in arg){if(i!='______array'){v=arg[i];if(typeof v!='undefined'&&typeof v!='function'){v=this.stringify(v);if(s){s+=',';}  
76 -s+=this.stringify(i)+':'+v;}}}  
77 -return'{'+s+'}';}}else if(typeof arg.toString!='undefined'){for(i in arg){v=arg[i];if(typeof v!='undefined'&&typeof v!='function'){v=this.stringify(v);if(s){s+=',';}  
78 -s+=this.stringify(i)+':'+v;}}  
79 -return'{'+s+'}';}}  
80 -return'null';case'number':return isFinite(arg)?String(arg):'null';case'string':l=arg.length;s='"';for(i=0;i<l;i+=1){c=arg.charAt(i);if(c>=' '){if(c=='\\'||c=='"'){s+='\\';}  
81 -s+=c;}else{switch(c){case'\b':s+='\\b';break;case'\f':s+='\\f';break;case'\n':s+='\\n';break;case'\r':s+='\\r';break;case'\t':s+='\\t';break;default:c=c.charCodeAt();s+='\\u00'+Math.floor(c/16).toString(16)+  
82 -(c%16).toString(16);}}}  
83 -return s+'"';case'boolean':return String(arg);default:return'null';}},parse:function(text){var at=0;var ch=' ';function error(m){throw{name:'JSONError',message:m,at:at-1,text:text};}  
84 -function next(){ch=text.charAt(at);at+=1;return ch;}  
85 -function white(){while(ch!=''&&ch<=' '){next();}}  
86 -function str(){var i,s='',t,u;if(ch=='"'){outer:while(next()){if(ch=='"'){next();return s;}else if(ch=='\\'){switch(next()){case'b':s+='\b';break;case'f':s+='\f';break;case'n':s+='\n';break;case'r':s+='\r';break;case't':s+='\t';break;case'u':u=0;for(i=0;i<4;i+=1){t=parseInt(next(),16);if(!isFinite(t)){break outer;}  
87 -u=u*16+t;}  
88 -s+=String.fromCharCode(u);break;default:s+=ch;}}else{s+=ch;}}}  
89 -error("Bad string");}  
90 -function arr(){var a=[];if(ch=='['){next();white();if(ch==']'){next();return a;}  
91 -while(ch){a.push(val());white();if(ch==']'){next();return a;}else if(ch!=','){break;}  
92 -next();white();}}  
93 -error("Bad array");}  
94 -function obj(){var k,o={};if(ch=='{'){next();white();if(ch=='}'){next();return o;}  
95 -while(ch){k=str();white();if(ch!=':'){break;}  
96 -next();o[k]=val();white();if(ch=='}'){next();return o;}else if(ch!=','){break;}  
97 -next();white();}}  
98 -error("Bad object");}  
99 -function assoc(){var k,a=[];if(ch=='<'){next();white();if(ch=='>'){next();return a;}  
100 -while(ch){k=str();white();if(ch!=':'){break;}  
101 -next();a[k]=val();white();if(ch=='>'){next();return a;}else if(ch!=','){break;}  
102 -next();white();}}  
103 -error("Bad associative array");}  
104 -function num(){var n='',v;if(ch=='-'){n='-';next();}  
105 -while(ch>='0'&&ch<='9'){n+=ch;next();}  
106 -if(ch=='.'){n+='.';while(next()&&ch>='0'&&ch<='9'){n+=ch;}}  
107 -if(ch=='e'||ch=='E'){n+='e';next();if(ch=='-'||ch=='+'){n+=ch;next();}  
108 -while(ch>='0'&&ch<='9'){n+=ch;next();}}  
109 -v=+n;if(!isFinite(v)){error("Bad number");}else{return v;}}  
110 -function word(){switch(ch){case't':if(next()=='r'&&next()=='u'&&next()=='e'){next();return true;}  
111 -break;case'f':if(next()=='a'&&next()=='l'&&next()=='s'&&next()=='e'){next();return false;}  
112 -break;case'n':if(next()=='u'&&next()=='l'&&next()=='l'){next();return null;}  
113 -break;}  
114 -error("Syntax error");}  
115 -function val(){white();switch(ch){case'{':return obj();case'[':return arr();case'<':return assoc();case'"':return str();case'-':return num();default:return ch>='0'&&ch<='9'?num():word();}}  
116 -return val();}};  
117 \ No newline at end of file 0 \ No newline at end of file
classesjs/cpaint/cpaint2.inc.js
@@ -1,1429 +0,0 @@ @@ -1,1429 +0,0 @@
1 -/**  
2 -* CPAINT - Cross-Platform Asynchronous INterface Toolkit  
3 -*  
4 -* http://sf.net/projects/cpaint  
5 -*  
6 -* released under the terms of the LGPL  
7 -* see http://www.fsf.org/licensing/licenses/lgpl.txt for details  
8 -*  
9 -* @package CPAINT  
10 -* @access public  
11 -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint  
12 -* @author Paul Sullivan <wiley14@gmail.com>  
13 -* @author Dominique Stender <dstender@st-webdevelopment.de>  
14 -* @author Stephan Tijink <stijink@googlemail.com>  
15 -* @version 2.0.3  
16 -*/  
17 -function cpaint() {  
18 - /**  
19 - * CPAINT version  
20 - *  
21 - * @access protected  
22 - * @var string version  
23 - */  
24 - this.version = '2.0.3';  
25 -  
26 - /**  
27 - * configuration options both for this class but also for the cpaint_call() objects.  
28 - *  
29 - * @access protected  
30 - * @var array config  
31 - */  
32 - var config = new Array();  
33 - config['debugging'] = -1;  
34 - config['proxy_url'] = '';  
35 - config['transfer_mode'] = 'GET';  
36 - config['async'] = true;  
37 - config['response_type'] = 'OBJECT';  
38 - config['persistent_connection'] = false;  
39 - config['use_cpaint_api'] = true;  
40 -  
41 - /**  
42 - * maintains the next free index in the stack  
43 - *  
44 - * @access protected  
45 - * @var integer stack_count  
46 - */  
47 - var stack_count = 0;  
48 -  
49 - /**  
50 - * property returns whether or not the browser is AJAX capable  
51 - *  
52 - * @access public  
53 - * @return boolean  
54 - */  
55 - this.capable = test_ajax_capability();  
56 -  
57 - /**  
58 - * switches debug mode on/off.  
59 - *  
60 - * @access public  
61 - * @param boolean debug debug flag  
62 - * @return void  
63 - */  
64 - this.set_debug = function() {  
65 -  
66 - if (typeof arguments[0] == 'boolean') {  
67 - if (arguments[0] === true) {  
68 - config['debugging'] = 1;  
69 -  
70 - } else {  
71 - config['debugging'] = 0;  
72 - }  
73 -  
74 - } else if (typeof arguments[0] == 'number') {  
75 - config['debugging'] = Math.round(arguments[0]);  
76 - }  
77 - }  
78 -  
79 - /**  
80 - * defines the URL of the proxy script.  
81 - *  
82 - * @access public  
83 - * @param string proxy_url URL of the proxyscript to connect  
84 - * @return void  
85 - */  
86 - this.set_proxy_url = function() {  
87 -  
88 - if (typeof arguments[0] == 'string') {  
89 -  
90 - config['proxy_url'] = arguments[0];  
91 - }  
92 - }  
93 -  
94 - /**  
95 - * sets the transfer_mode (GET|POST).  
96 - *  
97 - * @access public  
98 - * @param string transfer_mode transfer_mode  
99 - * @return void  
100 - */  
101 - this.set_transfer_mode = function() {  
102 -  
103 - if (arguments[0].toUpperCase() == 'GET'  
104 - || arguments[0].toUpperCase() == 'POST') {  
105 -  
106 - config['transfer_mode'] = arguments[0].toUpperCase();  
107 - }  
108 - }  
109 -  
110 - /**  
111 - * sets the flag whether or not to use asynchronous calls.  
112 - *  
113 - * @access public  
114 - * @param boolean async syncronization flag  
115 - * @return void  
116 - */  
117 - this.set_async = function() {  
118 -  
119 - if (typeof arguments[0] == 'boolean') {  
120 - config['async'] = arguments[0];  
121 - }  
122 - }  
123 -  
124 - /**  
125 - * defines the response type.  
126 - *  
127 - * allowed values are:  
128 - * TEXT = raw text response  
129 - * XML = raw XMLHttpObject  
130 - * OBJECT = parsed JavaScript object structure from XMLHttpObject  
131 - *  
132 - * the default is OBJECT.  
133 - *  
134 - * @access public  
135 - * @param string response_type response type  
136 - * @return void  
137 - */  
138 - this.set_response_type = function() {  
139 -  
140 - if (arguments[0].toUpperCase() == 'TEXT'  
141 - || arguments[0].toUpperCase() == 'XML'  
142 - || arguments[0].toUpperCase() == 'OBJECT'  
143 - || arguments[0].toUpperCase() == 'E4X'  
144 - || arguments[0].toUpperCase() == 'JSON') {  
145 -  
146 - config['response_type'] = arguments[0].toUpperCase();  
147 - }  
148 - }  
149 -  
150 - /**  
151 - * sets the flag whether or not to use a persistent connection.  
152 - *  
153 - * @access public  
154 - * @param boolean persistent_connection persistance flag  
155 - * @return void  
156 - */  
157 - this.set_persistent_connection = function() {  
158 -  
159 - if (typeof arguments[0] == 'boolean') {  
160 - config['persistent_connection'] = arguments[0];  
161 - }  
162 - }  
163 -  
164 -  
165 - /**  
166 - * sets the flag whether or not to use the cpaint api on the backend.  
167 - *  
168 - * @access public  
169 - * @param boolean cpaint_api api_flag  
170 - * @return void  
171 - */  
172 - this.set_use_cpaint_api = function() {  
173 - if (typeof arguments[0] == 'boolean') {  
174 - config['use_cpaint_api'] = arguments[0];  
175 - }  
176 - }  
177 -  
178 - /**  
179 - * tests whether one of the necessary implementations  
180 - * of the XMLHttpRequest class are available  
181 - *  
182 - * @access protected  
183 - * @return boolean  
184 - */  
185 - function test_ajax_capability() {  
186 - var cpc = new cpaint_call(0, config, this.version);  
187 - return cpc.test_ajax_capability();  
188 - }  
189 -  
190 - /**  
191 - * takes the arguments supplied and triggers a call to the CPAINT backend  
192 - * based on the settings.  
193 - *  
194 - * upon response cpaint_call.callback() will automatically be called  
195 - * to perform post-processing operations.  
196 - *  
197 - * @access public  
198 - * @param string url remote URL to call  
199 - * @param string remote_method remote method to call  
200 - * @param object client_callback client side callback method to deliver the remote response to. do NOT supply a string!  
201 - * @param mixed argN remote parameters from now on  
202 - * @return void  
203 - */  
204 - this.call = function() {  
205 - var use_stack = -1;  
206 -  
207 - if (config['persistent_connection'] == true  
208 - && __cpaint_stack[0] != null) {  
209 -  
210 - switch (__cpaint_stack[0].get_http_state()) {  
211 - case -1:  
212 - // no XMLHttpObject object has already been instanciated  
213 - // create new object and configure it  
214 - use_stack = 0;  
215 - debug('no XMLHttpObject object to re-use for persistence, creating new one later', 2);  
216 - break;  
217 -  
218 - case 4:  
219 - // object is ready for a new request, no need to do anything  
220 - use_stack = 0  
221 - debug('re-using the persistent connection', 2);  
222 - break;  
223 -  
224 - default:  
225 - // connection is currently in use, don't do anything  
226 - debug('the persistent connection is in use - skipping this request', 2);  
227 - }  
228 -  
229 - } else if (config['persistent_connection'] == true) {  
230 - // persistent connection is active, but no object has been instanciated  
231 - use_stack = 0;  
232 - __cpaint_stack[use_stack] = new cpaint_call(use_stack, config, this.version);  
233 - debug('no cpaint_call object available for re-use, created new one', 2);  
234 -  
235 - } else {  
236 - // no connection persistance  
237 - use_stack = stack_count;  
238 - __cpaint_stack[use_stack] = new cpaint_call(use_stack, config, this.version);  
239 - debug('no cpaint_call object created new one', 2);  
240 - }  
241 -  
242 - // configure cpaint_call if allowed to  
243 - if (use_stack != -1) {  
244 - __cpaint_stack[use_stack].set_client_callback(arguments[2]);  
245 -  
246 - // distribute according to proxy use  
247 - if (config['proxy_url'] != '') {  
248 - __cpaint_stack[use_stack].call_proxy(arguments);  
249 -  
250 - } else {  
251 - __cpaint_stack[use_stack].call_direct(arguments);  
252 - }  
253 -  
254 - // increase stack counter  
255 - stack_count++;  
256 - debug('stack size: ' + __cpaint_stack.length, 2);  
257 - }  
258 - }  
259 -  
260 - /**  
261 - * debug method  
262 - *  
263 - * @access protected  
264 - * @param string message the message to debug  
265 - * @param integer debug_level debug level at which the message appears  
266 - * @return void  
267 - */  
268 - var debug = function(message, debug_level) {  
269 - var prefix = '[CPAINT Debug] ';  
270 -  
271 - if (debug_level < 1) {  
272 - prefix = '[CPAINT Error] ';  
273 - }  
274 -  
275 - if (config['debugging'] >= debug_level) {  
276 - alert(prefix + message);  
277 - }  
278 - }  
279 -}  
280 -  
281 -/**  
282 -* internal FIFO stack of cpaint_call() objects.  
283 -*  
284 -* @access protected  
285 -* @var array __cpaint_stack  
286 -*/  
287 -var __cpaint_stack = new Array();  
288 -  
289 -/**  
290 -* local instance of cpaint_transformer  
291 -* MSIE is unable to handle static classes... sheesh.  
292 -*  
293 -* @access public  
294 -* @var object __cpaint_transformer  
295 -*/  
296 -var __cpaint_transformer = new cpaint_transformer();  
297 -  
298 -/**  
299 -* transport agent class  
300 -*  
301 -* creates the request object, takes care of the response, handles the  
302 -* client callback. Is configured by the cpaint() object.  
303 -*  
304 -* @package CPAINT  
305 -* @access public  
306 -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint  
307 -* @author Dominique Stender <dstender@st-webdevelopment.de>  
308 -* @author Paul Sullivan <wiley14@gmail.com>  
309 -* @param integer stack_id stack Id in cpaint  
310 -* @param array config configuration array for this call  
311 -* @param string version CPAINT API version  
312 -*/  
313 -function cpaint_call() {  
314 - /**  
315 - * CPAINT version  
316 - *  
317 - * @access protected  
318 - * @var string version  
319 - */  
320 - var version = arguments[2];  
321 -  
322 - /**  
323 - * configuration options both for this class objects.  
324 - *  
325 - * @access protected  
326 - * @var array config  
327 - */  
328 - var config = new Array();  
329 - config['debugging'] = arguments[1]['debugging'];  
330 - config['proxy_url'] = arguments[1]['proxy_url'];  
331 - config['transfer_mode'] = arguments[1]['transfer_mode'];  
332 - config['async'] = arguments[1]['async'];  
333 - config['response_type'] = arguments[1]['response_type'];  
334 - config['persistent_connection'] = arguments[1]['persistent_connection'];  
335 - config['use_cpaint_api'] = arguments[1]['use_cpaint_api'];  
336 -  
337 - /**  
338 - * XMLHttpObject used for this request.  
339 - *  
340 - * @access protected  
341 - * @var object httpobj  
342 - */  
343 - var httpobj = false;  
344 -  
345 - /**  
346 - * client callback function.  
347 - *  
348 - * @access public  
349 - * @var function client_callback  
350 - */  
351 - var client_callback;  
352 -  
353 - /**  
354 - * stores the stack Id within the cpaint object  
355 - *  
356 - * @access protected  
357 - * @var stack_id  
358 - */  
359 - var stack_id = arguments[0];  
360 -  
361 - /**  
362 - * sets the client callback function.  
363 - *  
364 - * @access public  
365 - * @param function client_callback the client callback function  
366 - * @return void  
367 - */  
368 - this.set_client_callback = function() {  
369 -  
370 - if (typeof arguments[0] == 'function') {  
371 - client_callback = arguments[0];  
372 - }  
373 - }  
374 -  
375 - /**  
376 - * returns the ready state of the internal XMLHttpObject  
377 - *  
378 - * if no such object was set up already, -1 is returned  
379 - *  
380 - * @access public  
381 - * @return integer  
382 - */  
383 - this.get_http_state = function() {  
384 - var return_value = -1;  
385 -  
386 - if (typeof httpobj == 'object') {  
387 - return_value = httpobj.readyState;  
388 - }  
389 -  
390 - return return_value;  
391 - }  
392 -  
393 - /**  
394 - * internal method for remote calls to the local server without use of the proxy script.  
395 - *  
396 - * @access public  
397 - * @param array call_arguments array of arguments initially passed to cpaint.call()  
398 - * @return void  
399 - */  
400 - this.call_direct = function(call_arguments) {  
401 - var url = call_arguments[0];  
402 - var remote_method = call_arguments[1];  
403 - var querystring = '';  
404 - var i = 0;  
405 -  
406 - // correct link to self  
407 - if (url == 'SELF') {  
408 - url = document.location.href;  
409 - }  
410 -  
411 - if (config['use_cpaint_api'] == true) {  
412 - // backend uses cpaint api  
413 - // pass parameters to remote method  
414 - for (i = 3; i < call_arguments.length; i++) {  
415 -  
416 - if ((typeof call_arguments[i] == 'string'  
417 - && call_arguments[i] != ''  
418 - && call_arguments[i].search(/^\s+$/g) == -1)  
419 - && !isNaN(call_arguments[i])  
420 - && isFinite(call_arguments[i])) {  
421 - // numerical value, convert it first  
422 - querystring += '&cpaint_argument[]=' + encodeURIComponent(JSON.stringify(Number(call_arguments[i])));  
423 -  
424 - } else {  
425 - querystring += '&cpaint_argument[]=' + encodeURIComponent(JSON.stringify(call_arguments[i]));  
426 - }  
427 - }  
428 -  
429 - // add response type to querystring  
430 - querystring += '&cpaint_response_type=' + config['response_type'];  
431 -  
432 - // build header  
433 - if (config['transfer_mode'] == 'GET') {  
434 -  
435 - if(url.indexOf('?') != -1) {  
436 - url = url + '&cpaint_function=' + remote_method + querystring;  
437 -  
438 - } else {  
439 - url = url + '?cpaint_function=' + remote_method + querystring;  
440 - }  
441 -  
442 - } else {  
443 - querystring = 'cpaint_function=' + remote_method + querystring;  
444 - }  
445 -  
446 - } else {  
447 - // backend does not use cpaint api  
448 - // pass parameters to remote method  
449 - for (i = 3; i < call_arguments.length; i++) {  
450 -  
451 - if (i == 3) {  
452 - querystring += encodeURIComponent(call_arguments[i]);  
453 -  
454 - } else {  
455 - querystring += '&' + encodeURIComponent(call_arguments[i]);  
456 - }  
457 - }  
458 -  
459 - // build header  
460 - if (config['transfer_mode'] == 'GET') {  
461 - url = url + querystring;  
462 - }  
463 - }  
464 -  
465 - // open connection  
466 - get_connection_object();  
467 -  
468 - // open connection to remote target  
469 - debug('opening connection to "' + url + '"', 1);  
470 - httpobj.open(config['transfer_mode'], url, config['async']);  
471 -  
472 - // send "urlencoded" header if necessary (if POST)  
473 - if (config['transfer_mode'] == 'POST') {  
474 -  
475 - try {  
476 - httpobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
477 -  
478 - } catch (cp_err) {  
479 - debug('POST cannot be completed due to incompatible browser. Use GET as your request method.', 0);  
480 - }  
481 - }  
482 -  
483 - // make ourselves known  
484 - httpobj.setRequestHeader('X-Powered-By', 'CPAINT v' + version + ' :: http://sf.net/projects/cpaint');  
485 -  
486 - // callback handling for asynchronous calls  
487 - httpobj.onreadystatechange = callback;  
488 -  
489 - // send content  
490 - if (config['transfer_mode'] == 'GET') {  
491 - httpobj.send(null);  
492 -  
493 - } else {  
494 - debug('sending query: ' + querystring, 1);  
495 - httpobj.send(querystring);  
496 - }  
497 -  
498 - if (config['async'] == true) {  
499 - // manual callback handling for synchronized calls  
500 - callback();  
501 - }  
502 - }  
503 -  
504 - /**  
505 - * internal method for calls to remote servers through the proxy script.  
506 - *  
507 - * @access public  
508 - * @param array call_arguments array of arguments passed to cpaint.call()  
509 - * @return void  
510 - */  
511 - this.call_proxy = function(call_arguments) {  
512 - var proxyscript = config['proxy_url'];  
513 - var url = call_arguments[0];  
514 - var remote_method = call_arguments[1];  
515 - var querystring = '';  
516 - var i = 0;  
517 -  
518 - var querystring_argument_prefix = 'cpaint_argument[]=';  
519 -  
520 - // pass parameters to remote method  
521 - if (config['use_cpaint_api'] == false) {  
522 - // when not talking to a CPAINT backend, don't prefix arguments  
523 - querystring_argument_prefix = '';  
524 - }  
525 -  
526 - for (i = 3; i < call_arguments.length; i++) {  
527 -  
528 - if (config['use_cpaint_api'] == true) {  
529 -  
530 - if ((typeof call_arguments[i] == 'string'  
531 - && call_arguments[i] != ''  
532 - && call_arguments[i].search(/^\s+$/g) == -1)  
533 - && !isNaN(call_arguments[i])  
534 - && isFinite(call_arguments[i])) {  
535 - // numerical value, convert it first  
536 - querystring += encodeURIComponent(querystring_argument_prefix + JSON.stringify(Number(call_arguments[i])) + '&');  
537 -  
538 - } else {  
539 - querystring += encodeURIComponent(querystring_argument_prefix + JSON.stringify(call_arguments[i]) + '&');  
540 - }  
541 -  
542 - } else {  
543 - // no CPAINT in the backend  
544 - querystring += encodeURIComponent(querystring_argument_prefix + call_arguments[i] + '&');  
545 - }  
546 - }  
547 -  
548 - if (config['use_cpaint_api'] == true) {  
549 - // add remote function name to querystring  
550 - querystring += encodeURIComponent('&cpaint_function=' + remote_method);  
551 -  
552 - // add response type to querystring  
553 - querystring += encodeURIComponent('&cpaint_responsetype=' + config['response_type']);  
554 - }  
555 -  
556 - // build header  
557 - if (config['transfer_mode'] == 'GET') {  
558 - proxyscript += '?cpaint_remote_url=' + encodeURIComponent(url)  
559 - + '&cpaint_remote_query=' + querystring  
560 - + '&cpaint_remote_method=' + config['transfer_mode']  
561 - + '&cpaint_response_type=' + config['response_type'];  
562 -  
563 - } else {  
564 - querystring = 'cpaint_remote_url=' + encodeURIComponent(url)  
565 - + '&cpaint_remote_query=' + querystring  
566 - + '&cpaint_remote_method=' + config['transfer_mode']  
567 - + '&cpaint_response_type=' + config['response_type'];  
568 - }  
569 -  
570 - // open connection  
571 - get_connection_object();  
572 -  
573 - // open connection to remote target  
574 - debug('opening connection to proxy "' + proxyscript + '"', 1);  
575 - httpobj.open(config['transfer_mode'], proxyscript, config['async']);  
576 -  
577 - // send "urlencoded" header if necessary (if POST)  
578 - if (config['transfer_mode'] == 'POST') {  
579 -  
580 - try {  
581 - httpobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
582 -  
583 - } catch (cp_err) {  
584 - debug('POST cannot be completed due to incompatible browser. Use GET as your request method.', 0);  
585 - }  
586 - }  
587 -  
588 - httpobj.setRequestHeader('X-Powered-By', 'CPAINT v' + version);  
589 -  
590 - // callback handling for asynchronous calls  
591 - httpobj.onreadystatechange = callback;  
592 -  
593 - // send content  
594 - if (config['transfer_mode'] == 'GET') {  
595 - httpobj.send(null);  
596 -  
597 - } else {  
598 - debug('sending query: ' + querystring, 1);  
599 - httpobj.send(querystring);  
600 - }  
601 -  
602 - if (config['async'] == false) {  
603 - // manual callback handling for synchronized calls  
604 - callback();  
605 - }  
606 - }  
607 -  
608 - this.test_ajax_capability = function() {  
609 - return get_connection_object();  
610 - }  
611 -  
612 - /**  
613 - * creates a new connection object.  
614 - *  
615 - * @access protected  
616 - * @return boolean  
617 - */  
618 - var get_connection_object = function() {  
619 - var return_value = false;  
620 - var new_connection = false;  
621 -  
622 - // open new connection only if necessary  
623 - if (config['persistent_connection'] == false) {  
624 - // no persistance, create a new object every time  
625 - debug('Using new connection object', 1);  
626 - new_connection = true;  
627 -  
628 - } else {  
629 - // persistent connection object, only open one if no object exists  
630 - debug('Using shared connection object.', 1);  
631 -  
632 - if (typeof httpobj != 'object') {  
633 - debug('Getting new persistent connection object.', 1);  
634 - new_connection = true;  
635 - }  
636 - }  
637 -  
638 - if (new_connection == true) {  
639 -  
640 - try {  
641 - httpobj = new XMLHttpRequest();  
642 - } catch (e1) {  
643 -  
644 - try {  
645 - httpobj = new ActiveXObject('Msxml2.XMLHTTP');  
646 -  
647 - } catch (e) {  
648 -  
649 - try {  
650 - httpobj = new ActiveXObject('Microsoft.XMLHTTP');  
651 -  
652 - } catch (oc) {  
653 - httpobj = null;  
654 - }  
655 - }  
656 - }  
657 -  
658 -  
659 - if (!httpobj) {  
660 - debug('Could not create connection object', 0);  
661 -  
662 - } else {  
663 - return_value = true;  
664 - }  
665 - }  
666 -  
667 - if (httpobj.readyState != 4) {  
668 - httpobj.abort();  
669 - }  
670 -  
671 - return return_value;  
672 - }  
673 -  
674 - /**  
675 - * internal callback function.  
676 - *  
677 - * will perform some consistency checks (response code, NULL value testing)  
678 - * and if response_type = 'OBJECT' it will automatically call  
679 - * cpaint_call.parse_ajax_xml() to have a JavaScript object structure generated.  
680 - *  
681 - * after all that is done the client side callback function will be called  
682 - * with the generated response as single value.  
683 - *  
684 - * @access protected  
685 - * @return void  
686 - */  
687 - var callback = function() {  
688 - var response = null;  
689 -  
690 - if (httpobj.readyState == 4  
691 - && httpobj.status == 200) {  
692 -  
693 - debug(httpobj.responseText, 1);  
694 - debug('using response type ' + config['response_type'], 2);  
695 -  
696 - // fetch correct response  
697 - switch (config['response_type']) {  
698 - case 'XML':  
699 - debug(httpobj.responseXML, 2);  
700 - response = __cpaint_transformer.xml_conversion(httpobj.responseXML);  
701 - break;  
702 -  
703 - case 'OBJECT':  
704 - response = __cpaint_transformer.object_conversion(httpobj.responseXML);  
705 - break;  
706 -  
707 - case 'TEXT':  
708 - response = __cpaint_transformer.text_conversion(httpobj.responseText);  
709 - break;  
710 -  
711 - case 'E4X':  
712 - response = __cpaint_transformer.e4x_conversion(httpobj.responseText);  
713 - break;  
714 -  
715 - case 'JSON':  
716 - response = __cpaint_transformer.json_conversion(httpobj.responseText);  
717 - break;  
718 -  
719 - default:  
720 - debug('invalid response type \'' + response_type + '\'', 0);  
721 - }  
722 -  
723 - // call client side callback  
724 - if (response != null  
725 - && typeof client_callback == 'function') {  
726 - client_callback(response, httpobj.responseText);  
727 - }  
728 - // remove ourselves from the stack  
729 - remove_from_stack();  
730 -  
731 - } else if (httpobj.readyState == 4  
732 - && httpobj.status != 200) {  
733 - // HTTP error of some kind  
734 - debug('invalid HTTP response code \'' + Number(httpobj.status) + '\'', 0);  
735 - //client_callback("", "erro");  
736 - }  
737 - }  
738 -  
739 - /**  
740 - * removes an entry from the stack  
741 - *  
742 - * @access protected  
743 - * @return void  
744 - */  
745 - var remove_from_stack = function() {  
746 - // remove only if everything is okay and we're not configured as persistent connection  
747 - if (typeof stack_id == 'number'  
748 - && __cpaint_stack[stack_id]  
749 - && config['persistent_connection'] == false) {  
750 -  
751 - __cpaint_stack[stack_id] = null;  
752 - }  
753 - }  
754 -  
755 - /**  
756 - * debug method  
757 - *  
758 - * @access protected  
759 - * @param string message the message to debug  
760 - * @param integer debug_level debug level at which the message appears  
761 - * @return void  
762 - */  
763 - var debug = function(message, debug_level) {  
764 - var prefix = '[CPAINT Debug] ';  
765 -  
766 - if (config['debugging'] < 1) {  
767 - prefix = '[CPAINT Error] ';  
768 - }  
769 -  
770 - if (config['debugging'] >= debug_level) {  
771 - alert(prefix + message);  
772 - }  
773 - if (message.search("error") > 1){client_callback("", message);}  
774 - }  
775 -}  
776 -  
777 -/**  
778 -* CPAINT transformation object  
779 -*  
780 -* @package CPAINT  
781 -* @access public  
782 -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint  
783 -* @author Paul Sullivan <wiley14@gmail.com>  
784 -* @author Dominique Stender <dstender@st-webdevelopment.de>  
785 -*/  
786 -function cpaint_transformer() {  
787 -  
788 - /**  
789 - * will take a XMLHttpObject and generate a JavaScript  
790 - * object structure from it.  
791 - *  
792 - * is internally called by cpaint_call.callback() if necessary.  
793 - * will call cpaint_call.create_object_structure() to create nested object structures.  
794 - *  
795 - * @access public  
796 - * @param object xml_document a XMLHttpObject  
797 - * @return object  
798 - */  
799 - this.object_conversion = function(xml_document) {  
800 - var return_value = new cpaint_result_object();  
801 - var i = 0;  
802 - var firstNodeName = '';  
803 -  
804 - if (typeof xml_document == 'object'  
805 - && xml_document != null) {  
806 -  
807 - // find the first element node - for MSIE the <?xml?> node is the very first...  
808 - for (i = 0; i < xml_document.childNodes.length; i++) {  
809 -  
810 - if (xml_document.childNodes[i].nodeType == 1) {  
811 - firstNodeName = xml_document.childNodes[i].nodeName;  
812 - break;  
813 - }  
814 - }  
815 -  
816 - var ajax_response = xml_document.getElementsByTagName(firstNodeName);  
817 -  
818 - return_value[firstNodeName] = new Array();  
819 -  
820 - for (i = 0; i < ajax_response.length; i++) {  
821 - var tmp_node = create_object_structure(ajax_response[i]);  
822 - tmp_node.id = ajax_response[i].getAttribute('id')  
823 - return_value[firstNodeName].push(tmp_node);  
824 - }  
825 -  
826 - } else {  
827 - debug('received invalid XML response', 0);  
828 - }  
829 -  
830 - return return_value;  
831 - }  
832 -  
833 - /**  
834 - * performs the necessary conversions for the XML response type  
835 - *  
836 - * @access public  
837 - * @param object xml_document a XMLHttpObject  
838 - * @return object  
839 - */  
840 - this.xml_conversion = function(xml_document) {  
841 - return xml_document;  
842 - }  
843 -  
844 - /**  
845 - * performs the necessary conversions for the TEXT response type  
846 - *  
847 - * @access public  
848 - * @param string text the response text  
849 - * @return string  
850 - */  
851 - this.text_conversion = function(text) {  
852 - return decode(text);  
853 - }  
854 -  
855 - /**  
856 - * performs the necessary conversions for the E4X response type  
857 - *  
858 - * @access public  
859 - * @param string text the response text  
860 - * @return string  
861 - */  
862 - this.e4x_conversion = function(text) {  
863 - // remove <?xml ?>tag  
864 - text = text.replace(/^\<\?xml[^>]+\>/, '');  
865 - return new XML(text);  
866 - }  
867 -  
868 - /**  
869 - * performs the necessary conversions for the JSON response type  
870 - *  
871 - * @access public  
872 - * @param string text the response text  
873 - * @return string  
874 - */  
875 - this.json_conversion = function(text) {  
876 - return JSON.parse(text);  
877 - }  
878 -  
879 - /**  
880 - * this method takes a HTML / XML node object and creates a  
881 - * JavaScript object structure from it.  
882 - *  
883 - * @access public  
884 - * @param object stream a node in the XML structure  
885 - * @return object  
886 - */  
887 - var create_object_structure = function(stream) {  
888 - var return_value = new cpaint_result_object();  
889 - var node_name = '';  
890 - var i = 0;  
891 - var attrib = 0;  
892 -  
893 - if (stream.hasChildNodes() == true) {  
894 - for (i = 0; i < stream.childNodes.length; i++) {  
895 -  
896 - node_name = stream.childNodes[i].nodeName;  
897 - node_name = node_name.replace(/[^a-zA-Z0-9_]*/g, '');  
898 -  
899 - // reset / create subnode  
900 - if (typeof return_value[node_name] != 'object') {  
901 - return_value[node_name] = new Array();  
902 - }  
903 -  
904 - if (stream.childNodes[i].nodeType == 1) {  
905 - var tmp_node = create_object_structure(stream.childNodes[i]);  
906 -  
907 - for (attrib = 0; attrib < stream.childNodes[i].attributes.length; attrib++) {  
908 - tmp_node.set_attribute(stream.childNodes[i].attributes[attrib].nodeName, stream.childNodes[i].attributes[attrib].nodeValue);  
909 - }  
910 -  
911 - return_value[node_name].push(tmp_node);  
912 -  
913 - } else if (stream.childNodes[i].nodeType == 3) {  
914 - return_value.data = decode(String(stream.firstChild.data));  
915 - }  
916 - }  
917 - }  
918 -  
919 - return return_value;  
920 - }  
921 -  
922 - /**  
923 - * converts an encoded text back to viewable characters.  
924 - *  
925 - * @access public  
926 - * @param string rawtext raw text as provided by the backend  
927 - * @return mixed  
928 - */  
929 - var decode = function(rawtext) {  
930 - var plaintext = '';  
931 - var i = 0;  
932 - var c1 = 0;  
933 - var c2 = 0;  
934 - var c3 = 0;  
935 - var u = 0;  
936 - var t = 0;  
937 -  
938 - // remove special JavaScript encoded non-printable characters  
939 - while (i < rawtext.length) {  
940 - if (rawtext.charAt(i) == '\\'  
941 - && rawtext.charAt(i + 1) == 'u') {  
942 -  
943 - u = 0;  
944 -  
945 - for (j = 2; j < 6; j += 1) {  
946 - t = parseInt(rawtext.charAt(i + j), 16);  
947 -  
948 - if (!isFinite(t)) {  
949 - break;  
950 - }  
951 - u = u * 16 + t;  
952 - }  
953 -  
954 - plaintext += String.fromCharCode(u);  
955 - i += 6;  
956 -  
957 - } else {  
958 - plaintext += rawtext.charAt(i);  
959 - i++;  
960 - }  
961 - }  
962 -  
963 - // convert numeric data to number type  
964 - if (plaintext != ''  
965 - && plaintext.search(/^\s+$/g) == -1  
966 - && !isNaN(plaintext)  
967 - && isFinite(plaintext)) {  
968 -  
969 - plaintext = Number(plaintext);  
970 - }  
971 -  
972 - return plaintext;  
973 - }  
974 -}  
975 -  
976 -/**  
977 -* this is the basic prototype for a cpaint node object  
978 -* as used in cpaint_call.parse_ajax_xml()  
979 -*  
980 -* @package CPAINT  
981 -* @access public  
982 -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint  
983 -* @author Paul Sullivan <wiley14@gmail.com>  
984 -* @author Dominique Stender <dstender@st-webdevelopment.de>  
985 -*/  
986 -function cpaint_result_object() {  
987 - this.id = 0;  
988 - this.data = '';  
989 - var __attributes = new Array();  
990 -  
991 - /**  
992 - * Returns a subnode with the given type and id.  
993 - *  
994 - * @access public  
995 - * @param string type The type of the subnode. Equivalent to the XML tag name.  
996 - * @param string id The id of the subnode. Equivalent to the XML tag names id attribute.  
997 - * @return object  
998 - */  
999 - this.find_item_by_id = function() {  
1000 - var return_value = null;  
1001 - var type = arguments[0];  
1002 - var id = arguments[1];  
1003 - var i = 0;  
1004 -  
1005 - if (this[type]) {  
1006 -  
1007 - for (i = 0; i < this[type].length; i++) {  
1008 -  
1009 - if (this[type][i].get_attribute('id') == id) {  
1010 - return_value = this[type][i];  
1011 - break;  
1012 - }  
1013 - }  
1014 - }  
1015 -  
1016 - return return_value;  
1017 - }  
1018 -  
1019 - /**  
1020 - * retrieves the value of an attribute.  
1021 - *  
1022 - * @access public  
1023 - * @param string name name of the attribute  
1024 - * @return mixed  
1025 - */  
1026 - this.get_attribute = function() {  
1027 - var return_value = null;  
1028 - var id = arguments[0];  
1029 -  
1030 - if (typeof __attributes[id] != 'undefined') {  
1031 - return_value = __attributes[id];  
1032 - }  
1033 -  
1034 - return return_value;  
1035 - }  
1036 -  
1037 - /**  
1038 - * assigns a value to an attribute.  
1039 - *  
1040 - * if that attribute does not exist it will be created.  
1041 - *  
1042 - * @access public  
1043 - * @param string name name of the attribute  
1044 - * @param string value value of the attribute  
1045 - * @return void  
1046 - */  
1047 - this.set_attribute = function() {  
1048 - __attributes[arguments[0]] = arguments[1];  
1049 - }  
1050 -}  
1051 -  
1052 -  
1053 -/*  
1054 -Copyright (c) 2005 JSON.org  
1055 -  
1056 -Permission is hereby granted, free of charge, to any person obtaining a copy  
1057 -of this software and associated documentation files (the "Software"), to deal  
1058 -in the Software without restriction, including without limitation the rights  
1059 -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  
1060 -copies of the Software, and to permit persons to whom the Software is  
1061 -furnished to do so, subject to the following conditions:  
1062 -  
1063 -The Software shall be used for Good, not Evil.  
1064 -  
1065 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  
1066 -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  
1067 -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE  
1068 -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
1069 -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  
1070 -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE  
1071 -SOFTWARE.  
1072 -*/  
1073 -  
1074 -Array.prototype.______array = '______array';  
1075 -  
1076 -var JSON = {  
1077 - org: 'http://www.JSON.org',  
1078 - copyright: '(c)2005 JSON.org',  
1079 - license: 'http://www.crockford.com/JSON/license.html',  
1080 -  
1081 - stringify: function (arg) {  
1082 - var c, i, l, s = '', v;  
1083 - var numeric = true;  
1084 -  
1085 - switch (typeof arg) {  
1086 - case 'object':  
1087 - if (arg) {  
1088 - if (arg.______array == '______array') {  
1089 - // do a test whether all array keys are numeric  
1090 - for (i in arg) {  
1091 - if (i != '______array'  
1092 - && (isNaN(i)  
1093 - || !isFinite(i))) {  
1094 - numeric = false;  
1095 - break;  
1096 - }  
1097 - }  
1098 -  
1099 - if (numeric == true) {  
1100 - for (i = 0; i < arg.length; ++i) {  
1101 - if (typeof arg[i] != 'undefined') {  
1102 - v = this.stringify(arg[i]);  
1103 - if (s) {  
1104 - s += ',';  
1105 - }  
1106 - s += v;  
1107 - } else {  
1108 - s += ',null';  
1109 - }  
1110 - }  
1111 - return '[' + s + ']';  
1112 - } else {  
1113 - for (i in arg) {  
1114 - if (i != '______array') {  
1115 - v = arg[i];  
1116 - if (typeof v != 'undefined' && typeof v != 'function') {  
1117 - v = this.stringify(v);  
1118 - if (s) {  
1119 - s += ',';  
1120 - }  
1121 - s += this.stringify(i) + ':' + v;  
1122 - }  
1123 - }  
1124 - }  
1125 - // return as object  
1126 - return '{' + s + '}';  
1127 - }  
1128 - } else if (typeof arg.toString != 'undefined') {  
1129 - for (i in arg) {  
1130 - v = arg[i];  
1131 - if (typeof v != 'undefined' && typeof v != 'function') {  
1132 - v = this.stringify(v);  
1133 - if (s) {  
1134 - s += ',';  
1135 - }  
1136 - s += this.stringify(i) + ':' + v;  
1137 - }  
1138 - }  
1139 - return '{' + s + '}';  
1140 - }  
1141 - }  
1142 - return 'null';  
1143 - case 'number':  
1144 - return isFinite(arg) ? String(arg) : 'null';  
1145 - case 'string':  
1146 - l = arg.length;  
1147 - s = '"';  
1148 - for (i = 0; i < l; i += 1) {  
1149 - c = arg.charAt(i);  
1150 - if (c >= ' ') {  
1151 - if (c == '\\' || c == '"') {  
1152 - s += '\\';  
1153 - }  
1154 - s += c;  
1155 - } else {  
1156 - switch (c) {  
1157 - case '\b':  
1158 - s += '\\b';  
1159 - break;  
1160 - case '\f':  
1161 - s += '\\f';  
1162 - break;  
1163 - case '\n':  
1164 - s += '\\n';  
1165 - break;  
1166 - case '\r':  
1167 - s += '\\r';  
1168 - break;  
1169 - case '\t':  
1170 - s += '\\t';  
1171 - break;  
1172 - default:  
1173 - c = c.charCodeAt();  
1174 - s += '\\u00' + Math.floor(c / 16).toString(16) +  
1175 - (c % 16).toString(16);  
1176 - }  
1177 - }  
1178 - }  
1179 - return s + '"';  
1180 - case 'boolean':  
1181 - return String(arg);  
1182 - default:  
1183 - return 'null';  
1184 - }  
1185 - },  
1186 - parse: function (text) {  
1187 - var at = 0;  
1188 - var ch = ' ';  
1189 -  
1190 - function error(m) {  
1191 - throw {  
1192 - name: 'JSONError',  
1193 - message: m,  
1194 - at: at - 1,  
1195 - text: text  
1196 - };  
1197 - }  
1198 -  
1199 - function next() {  
1200 - ch = text.charAt(at);  
1201 - at += 1;  
1202 - return ch;  
1203 - }  
1204 -  
1205 - function white() {  
1206 - while (ch != '' && ch <= ' ') {  
1207 - next();  
1208 - }  
1209 - }  
1210 -  
1211 - function str() {  
1212 - var i, s = '', t, u;  
1213 -  
1214 - if (ch == '"') {  
1215 -outer: while (next()) {  
1216 - if (ch == '"') {  
1217 - next();  
1218 - return s;  
1219 - } else if (ch == '\\') {  
1220 - switch (next()) {  
1221 - case 'b':  
1222 - s += '\b';  
1223 - break;  
1224 - case 'f':  
1225 - s += '\f';  
1226 - break;  
1227 - case 'n':  
1228 - s += '\n';  
1229 - break;  
1230 - case 'r':  
1231 - s += '\r';  
1232 - break;  
1233 - case 't':  
1234 - s += '\t';  
1235 - break;  
1236 - case 'u':  
1237 - u = 0;  
1238 - for (i = 0; i < 4; i += 1) {  
1239 - t = parseInt(next(), 16);  
1240 - if (!isFinite(t)) {  
1241 - break outer;  
1242 - }  
1243 - u = u * 16 + t;  
1244 - }  
1245 - s += String.fromCharCode(u);  
1246 - break;  
1247 - default:  
1248 - s += ch;  
1249 - }  
1250 - } else {  
1251 - s += ch;  
1252 - }  
1253 - }  
1254 - }  
1255 - error("Bad string");  
1256 - }  
1257 -  
1258 - function arr() {  
1259 - var a = [];  
1260 -  
1261 - if (ch == '[') {  
1262 - next();  
1263 - white();  
1264 - if (ch == ']') {  
1265 - next();  
1266 - return a;  
1267 - }  
1268 - while (ch) {  
1269 - a.push(val());  
1270 - white();  
1271 - if (ch == ']') {  
1272 - next();  
1273 - return a;  
1274 - } else if (ch != ',') {  
1275 - break;  
1276 - }  
1277 - next();  
1278 - white();  
1279 - }  
1280 - }  
1281 - error("Bad array");  
1282 - }  
1283 -  
1284 - function obj() {  
1285 - var k, o = {};  
1286 -  
1287 - if (ch == '{') {  
1288 - next();  
1289 - white();  
1290 - if (ch == '}') {  
1291 - next();  
1292 - return o;  
1293 - }  
1294 - while (ch) {  
1295 - k = str();  
1296 - white();  
1297 - if (ch != ':') {  
1298 - break;  
1299 - }  
1300 - next();  
1301 - o[k] = val();  
1302 - white();  
1303 - if (ch == '}') {  
1304 - next();  
1305 - return o;  
1306 - } else if (ch != ',') {  
1307 - break;  
1308 - }  
1309 - next();  
1310 - white();  
1311 - }  
1312 - }  
1313 - error("Bad object");  
1314 - }  
1315 -  
1316 - function assoc() {  
1317 - var k, a = [];  
1318 -  
1319 - if (ch == '<') {  
1320 - next();  
1321 - white();  
1322 - if (ch == '>') {  
1323 - next();  
1324 - return a;  
1325 - }  
1326 - while (ch) {  
1327 - k = str();  
1328 - white();  
1329 - if (ch != ':') {  
1330 - break;  
1331 - }  
1332 - next();  
1333 - a[k] = val();  
1334 - white();  
1335 - if (ch == '>') {  
1336 - next();  
1337 - return a;  
1338 - } else if (ch != ',') {  
1339 - break;  
1340 - }  
1341 - next();  
1342 - white();  
1343 - }  
1344 - }  
1345 - error("Bad associative array");  
1346 - }  
1347 -  
1348 - function num() {  
1349 - var n = '', v;  
1350 - if (ch == '-') {  
1351 - n = '-';  
1352 - next();  
1353 - }  
1354 - while (ch >= '0' && ch <= '9') {  
1355 - n += ch;  
1356 - next();  
1357 - }  
1358 - if (ch == '.') {  
1359 - n += '.';  
1360 - while (next() && ch >= '0' && ch <= '9') {  
1361 - n += ch;  
1362 - }  
1363 - }  
1364 - if (ch == 'e' || ch == 'E') {  
1365 - n += 'e';  
1366 - next();  
1367 - if (ch == '-' || ch == '+') {  
1368 - n += ch;  
1369 - next();  
1370 - }  
1371 - while (ch >= '0' && ch <= '9') {  
1372 - n += ch;  
1373 - next();  
1374 - }  
1375 - }  
1376 - v = +n;  
1377 - if (!isFinite(v)) {  
1378 - error("Bad number");  
1379 - } else {  
1380 - return v;  
1381 - }  
1382 - }  
1383 -  
1384 - function word() {  
1385 - switch (ch) {  
1386 - case 't':  
1387 - if (next() == 'r' && next() == 'u' && next() == 'e') {  
1388 - next();  
1389 - return true;  
1390 - }  
1391 - break;  
1392 - case 'f':  
1393 - if (next() == 'a' && next() == 'l' && next() == 's' &&  
1394 - next() == 'e') {  
1395 - next();  
1396 - return false;  
1397 - }  
1398 - break;  
1399 - case 'n':  
1400 - if (next() == 'u' && next() == 'l' && next() == 'l') {  
1401 - next();  
1402 - return null;  
1403 - }  
1404 - break;  
1405 - }  
1406 - error("Syntax error");  
1407 - }  
1408 -  
1409 - function val() {  
1410 - white();  
1411 - switch (ch) {  
1412 - case '{':  
1413 - return obj();  
1414 - case '[':  
1415 - return arr();  
1416 - case '<':  
1417 - return assoc();  
1418 - case '"':  
1419 - return str();  
1420 - case '-':  
1421 - return num();  
1422 - default:  
1423 - return ch >= '0' && ch <= '9' ? num() : word();  
1424 - }  
1425 - }  
1426 -  
1427 - return val();  
1428 - }  
1429 -};  
classesjs/cpaint/cpaint2.inc.php
@@ -1,941 +0,0 @@ @@ -1,941 +0,0 @@
1 -<?php  
2 -/**  
3 -* CPAINT - Cross-Platform Asynchronous INterface Toolkit  
4 -*  
5 -* http://sf.net/projects/cpaint  
6 -*  
7 -* released under the terms of the LGPL  
8 -* see http://www.fsf.org/licensing/licenses/lgpl.txt for details  
9 -*  
10 -* @package CPAINT  
11 -* @author Paul Sullivan <wiley14@gmail.com>  
12 -* @author Dominique Stender <dstender@st-webdevelopment.de>  
13 -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint  
14 -* @version 2.0.3  
15 -*/  
16 -  
17 -//---- includes ----------------------------------------------------------------  
18 - /**  
19 - * @include JSON  
20 - */  
21 - require_once(dirname(__FILE__) . '/json.php');  
22 -  
23 - /**  
24 - * @include config  
25 - */  
26 - require_once("cpaint2.config.php");  
27 -  
28 -//---- variables ---------------------------------------------------------------  
29 - $GLOBALS['__cpaint_json'] = new JSON();  
30 -  
31 -//---- error reporting ---------------------------------------------------------  
32 - error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);  
33 -  
34 -//---- classes -----------------------------------------------------------------  
35 - /**  
36 - * cpaint base class.  
37 - *  
38 - * @package CPAINT  
39 - * @access public  
40 - * @author Paul Sullivan <wiley14@gmail.com>  
41 - * @author Dominique Stender <dstender@st-webdevelopment.de>  
42 - * @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint  
43 - * @version 2.0.3  
44 - */  
45 - class cpaint {  
46 - /**  
47 - * version number  
48 - *  
49 - * @access private  
50 - * @var string $version  
51 - */  
52 - var $version = '2.0.3';  
53 -  
54 - /**  
55 - * response type.  
56 - *  
57 - * @access protected  
58 - * @var string $response_type  
59 - */  
60 - var $response_type;  
61 -  
62 - /**  
63 - * the basenode ajaxResponse.  
64 - *  
65 - * @access protected  
66 - * @var object $basenode  
67 - */  
68 - var $basenode;  
69 -  
70 - /**  
71 - * list of registered methods available through the CPAINT API  
72 - *  
73 - * @access protected  
74 - * @var array $api_functions  
75 - */  
76 - var $api_functions;  
77 -  
78 - /**  
79 - * list of registered complex types used in the CPAINT API  
80 - *  
81 - * @access protected  
82 - * @var array $api_datatypes  
83 - */  
84 - var $api_datatypes;  
85 -  
86 - /**  
87 - * whether or not the CPAINT API generates a WSDL when called with ?wsdl querystring  
88 - *  
89 - * @access private  
90 - * @var boolean $use_wsdl  
91 - */  
92 - var $use_wsdl;  
93 -  
94 - /**  
95 - * PHP4 constructor.  
96 - *  
97 - * @access public  
98 - * @return void  
99 - */  
100 - function cpaint() {  
101 - $this->__construct();  
102 - }  
103 -  
104 - /**  
105 - * PHP 5 constructor.  
106 - *  
107 - * @access public  
108 - * @return void  
109 - * @todo -o"Dominique Stender" -ccpaint implement a better debugging  
110 - */  
111 - function __construct() {  
112 - // initialize properties  
113 - $this->basenode = new cpaint_node();  
114 - $this->basenode->set_name('ajaxResponse');  
115 - $this->basenode->set_attribute('id', '');  
116 - $this->basenode->set_encoding('UTF-8');  
117 -  
118 - $this->response_type = 'TEXT';  
119 - $this->api_functions = array();  
120 - $this->api_datatypes = array();  
121 - $this->use_wsdl = true;  
122 -  
123 - $this->complex_type(array(  
124 - 'name' => 'cpaintResponseType',  
125 - 'type' => 'restriction', // (restriction|complex|list)  
126 - 'base_type' => 'string', // scalar type of all values, e.g. 'string', for type = (restriction|list) only  
127 - 'values' => array( // for type = 'restriction' only: list of allowed values  
128 - 'XML', 'TEXT', 'OBJECT', 'E4X', 'JSON',  
129 - ),  
130 - )  
131 - );  
132 - $this->complex_type(array(  
133 - 'name' => 'cpaintDebugLevel',  
134 - 'type' => 'restriction',  
135 - 'base_type' => 'long',  
136 - 'values' => array(  
137 - -1, 0, 1, 2  
138 - ),  
139 - )  
140 - );  
141 - $this->complex_type(array(  
142 - 'name' => 'cpaintDebugMessage',  
143 - 'type' => 'list',  
144 - 'base_type' => 'string',  
145 - )  
146 - );  
147 -  
148 - $this->complex_type(array(  
149 - 'name' => 'cpaintRequestHead',  
150 - 'type' => 'complex',  
151 - 'struct' => array(  
152 - 0 => array('name' => 'functionName', 'type' => 'string'),  
153 - 1 => array('name' => 'responseType', 'type' => 'cpaintResponseType'),  
154 - 2 => array('name' => 'debugLevel', 'type' => 'cpaintDebugLevel'),  
155 - ),  
156 - )  
157 - );  
158 -  
159 - $this->complex_type(array(  
160 - 'name' => 'cpaintResponseHead',  
161 - 'type' => 'complex',  
162 - 'struct' => array(  
163 - 0 => array('name' => 'success', 'type' => 'boolean'),  
164 - 1 => array('name' => 'debugger', 'type' => 'cpaintDebugMessage'),  
165 - ),  
166 - )  
167 - );  
168 -  
169 - // determine response type  
170 - if (isset($_REQUEST['cpaint_response_type'])) {  
171 - $this->response_type = htmlentities(strip_tags(strtoupper((string) $_REQUEST['cpaint_response_type'])));  
172 - } // end: if  
173 - }  
174 -  
175 - /**  
176 - * calls the user function responsible for this specific call.  
177 - *  
178 - * @access public  
179 - * @param string $input_encoding input data character encoding, default is UTF-8  
180 - * @return void  
181 - */  
182 - function start($input_encoding = 'UTF-8') {  
183 - $user_function = '';  
184 - $arguments = array();  
185 -  
186 - // work only if there is no API version request  
187 - if (!isset($_REQUEST['api_query'])  
188 - && !isset($_REQUEST['wsdl'])) {  
189 - $this->basenode->set_encoding($input_encoding);  
190 -  
191 - if ($_REQUEST['cpaint_function'] != '') {  
192 - $user_function = $_REQUEST['cpaint_function'];  
193 - if(@$_REQUEST['cpaint_argument'])  
194 - $arguments = $_REQUEST['cpaint_argument'];  
195 - else  
196 - $arguments = array();  
197 - }  
198 -  
199 - // perform character conversion on every argument  
200 - foreach ($arguments as $key => $value) {  
201 -  
202 - if (get_magic_quotes_gpc() == true) {  
203 - $value = stripslashes($value);  
204 - } // end: if  
205 -  
206 - // convert from JSON string  
207 - $arguments[$key] = $GLOBALS['__cpaint_json']->parse($value);  
208 - } // end: foreach  
209 -  
210 - $arguments = cpaint_transformer::decode_array($arguments, $this->basenode->get_encoding());  
211 -  
212 - if (is_array($this->api_functions[$user_function])  
213 - && is_callable($this->api_functions[$user_function]['call'])) {  
214 - // a valid API function is to be called  
215 - call_user_func_array($this->api_functions[$user_function]['call'], $arguments);  
216 - } else if ($user_function != '') {  
217 - // desired function is not registered as API function  
218 - $this->basenode->set_data('[CPAINT] A function name was passed that is not allowed to execute on this server.');  
219 - }  
220 - } // end: if  
221 - }  
222 -  
223 - /**  
224 - * generates and prints the response based on response type supplied by the frontend.  
225 - *  
226 - * @access public  
227 - * @return void  
228 - */  
229 - function return_data() {  
230 - // send appropriate headers to avoid caching  
231 - header('Expires: Fri, 14 Mar 1980 20:53:00 GMT');  
232 - header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');  
233 - header('Cache-Control: no-cache, must-revalidate');  
234 - header('Pragma: no-cache');  
235 - header('X-Powered-By: CPAINT v' . $this->version . '/PHP v' . phpversion());  
236 -  
237 - // work only if there is no API version request  
238 -  
239 - if (!isset($_REQUEST['api_query'])  
240 - && !isset($_REQUEST['wsdl'])) {  
241 - // trigger generation of response  
242 - switch (trim($this->response_type)) {  
243 -  
244 - case 'TEXT':  
245 - header('Content-type: text/plain; charset=' . cpaint_transformer::find_output_charset($this->basenode->get_encoding()));  
246 - echo cpaint_transformer::toString($this->basenode);  
247 - break;  
248 -  
249 - case 'JSON':  
250 - header('Content-type: text/plain; charset=' . cpaint_transformer::find_output_charset($this->basenode->get_encoding()));  
251 - echo cpaint_transformer::toJSON($this->basenode);  
252 - break;  
253 -  
254 - case 'OBJECT':  
255 - case 'E4X':  
256 - case 'XML':  
257 - header('Content-type: text/xml; charset=' . cpaint_transformer::find_output_charset($this->basenode->get_encoding()));  
258 - echo '<?xml version="1.0" encoding="' . cpaint_transformer::find_output_charset($this->basenode->get_encoding()) . '"?>'  
259 - . cpaint_transformer::toXML($this->basenode);  
260 - break;  
261 -  
262 - default:  
263 - echo 'ERROR: invalid response type \'' . $this->response_type . '\'';  
264 - } // end: switch  
265 -  
266 - } elseif (isset($_REQUEST['api_query'])) {  
267 - // API version request  
268 - header('Content-type: text/plain; charset=ISO-8859-1');  
269 - echo 'CPAINT v' . $this->version . '/PHP v' . phpversion();  
270 -  
271 - } elseif ($this->use_wsdl == true  
272 - && isset($_REQUEST['wsdl'])) {  
273 -  
274 - if (is_file(dirname(__FILE__) . '/cpaint2.wsdl.php')  
275 - && is_readable(dirname(__FILE__) . '/cpaint2.wsdl.php')) {  
276 -  
277 - require_once(dirname(__FILE__) . '/cpaint2.wsdl.php');  
278 -  
279 - if (class_exists('cpaint_wsdl')) {  
280 - // create new instance of WSDL library  
281 - $wsdl = new cpaint_wsdl();  
282 -  
283 - // build WSDL info  
284 - header('Content-type: text/xml; charset=UTF-8');  
285 - echo $wsdl->generate($this->api_functions, $this->api_datatypes);  
286 -  
287 - } else {  
288 - header('Content-type: text/plain; charset=ISO-8859-1');  
289 - echo 'WSDL generator is unavailable';  
290 - } // end: if  
291 -  
292 - } else {  
293 - header('Content-type: text/plain; charset=ISO-8859-1');  
294 - echo 'WSDL generator is unavailable';  
295 - } // end: if  
296 - } // end: if  
297 - }  
298 -  
299 - /**  
300 - * registers a new function or method as part of the CPAINT API  
301 - *  
302 - * @access public  
303 - * @param mixed $func function name, array(&$object, 'function_name') or array('class', 'function_name')  
304 - * @param array $input function input parameters (not yet used by CPAINT and subject to change)  
305 - * @param array $output function output format (not yed used by CPAINT and subject to change)  
306 - * @param string $comment description of the functionality  
307 - * @return boolean  
308 - */  
309 - function register($func, $input = array(), $output = array(), $comment = '') {  
310 - $return_value = false;  
311 - $input = (array) $input;  
312 - $output = (array) $output;  
313 - $comment = (string) $comment;  
314 -  
315 - if (is_array($func)  
316 - && (is_object($func[0]) || is_string($func[0]))  
317 - && is_string($func[1])  
318 - && is_callable($func)) {  
319 -  
320 - // calling a method of an object  
321 - $this->api_functions[$func[1]] = array(  
322 - 'call' => $func,  
323 - 'input' => $input,  
324 - 'output' => $output,  
325 - 'comment' => $comment,  
326 - );  
327 - $return_value = true;  
328 -  
329 - } elseif (is_string($func)) {  
330 - // calling a standalone function  
331 - $this->api_functions[$func] = array(  
332 - 'call' => $func,  
333 - 'input' => $input,  
334 - 'output' => $output,  
335 - 'comment' => $comment,  
336 - );  
337 - $return_value = true;  
338 - } // end: if  
339 -  
340 - return $return_value;  
341 - }  
342 -  
343 -  
344 -  
345 - /**  
346 - * unregisters a function that is currently part of the CPAINT API.  
347 - *  
348 - * proves useful when the same set of functions is to be used in the  
349 - * frontend and in some kind of administration environment. you might  
350 - * want to unregister a few (admin) functions for the frontend in this  
351 - * case.  
352 - *  
353 - * @access public  
354 - * @param string $func function name  
355 - * @return boolean  
356 - */  
357 - function unregister($func) {  
358 - $retval = false;  
359 -  
360 - if (is_array($this->api_functions[$func])) {  
361 - unset($this->api_functions[$func]);  
362 - } // end: if  
363 -  
364 - return $retval;  
365 - }  
366 -  
367 -  
368 -  
369 - /**  
370 - * registers a complex data type  
371 - *  
372 - * @access public  
373 - * @param array $schema schema definition for the complex type  
374 - * @return boolean  
375 - */  
376 - function complex_type($schema) {  
377 - $return_value = false;  
378 - $schema = (array) $schema;  
379 -  
380 - if ($schema['name'] != ''  
381 - && in_array($schema['type'], array('restriction', 'complex', 'list'))) {  
382 -  
383 - $this->api_datatypes[] = $schema;  
384 - $return_value = true;  
385 - } // end: if  
386 -  
387 - return $return_value;  
388 - }  
389 -  
390 - /**  
391 - * switches the generation of WSDL on/off. default is on  
392 - *  
393 - * @access public  
394 - * @param boolean $state state of WSDL generation  
395 - * @return void  
396 - */  
397 - function use_wsdl($state) {  
398 - $this->use_wsdl = (boolean) $state;  
399 - }  
400 -  
401 - /**  
402 - * adds a new subnode to the basenode.  
403 - *  
404 - * will return a reference to it for further processing.  
405 - *  
406 - * @access public  
407 - * @param string $nodename name of the new node  
408 - * @param string $id id of the new node  
409 - * @return object  
410 - */  
411 - function &add_node($nodename, $id = '') {  
412 - return $this->basenode->add_node($nodename, $id);  
413 - }  
414 -  
415 - /**  
416 - * assigns textual data to the basenode.  
417 - *  
418 - * @access public  
419 - * @param mixed $data data to assign to this node  
420 - * @return void  
421 - */  
422 - function set_data($data) {  
423 - $this->basenode->set_data($data);  
424 - }  
425 -  
426 - /**  
427 - * returns the data assigned to the basenode.  
428 - *  
429 - * @access public  
430 - * @return mixed  
431 - */  
432 - function get_data() {  
433 - return $this->basenode->get_data();  
434 - }  
435 -  
436 - /**  
437 - * sets the id property of the basenode.  
438 - *  
439 - * @deprecated deprecated since version 2.0.0  
440 - * @access public  
441 - * @param string $id the id  
442 - * @return void  
443 - */  
444 - function set_id($id) {  
445 - $this->basenode->set_attribute('id', $id);  
446 - }  
447 -  
448 - /**  
449 - * gets the id property of the basenode.  
450 - *  
451 - * @deprecated deprecated since version 2.0.0  
452 - * @access public  
453 - * @return string  
454 - */  
455 - function get_id() {  
456 - return $this->basenode->get_attribute('id');  
457 - }  
458 -  
459 - /**  
460 - * adds a new attribute to the basenode.  
461 - *  
462 - * @access public  
463 - * @param string $name attribute name  
464 - * @param mixed $value attribute value  
465 - * @return void  
466 - */  
467 - function set_attribute($name, $value) {  
468 - $this->basenode->set_attribute($name, $value);  
469 - }  
470 -  
471 - /**  
472 - * retrieves an attribute of the basenode by name.  
473 - *  
474 - * @access public  
475 - * @param string $name attribute name  
476 - * @return string  
477 - */  
478 - function get_attribute($name) {  
479 - return $this->basenode->get_attributes($name);  
480 - }  
481 -  
482 - /**  
483 - * set name property of the basenode.  
484 - *  
485 - * @access public  
486 - * @param string $name the name  
487 - * @return void  
488 - */  
489 - function set_name($name) {  
490 - $this->basenode->set_name($name);  
491 - }  
492 -  
493 - /**  
494 - * get name property of the basenode.  
495 - *  
496 - * @access public  
497 - * @return string  
498 - */  
499 - function get_name() {  
500 - return $this->basenode->get_name();  
501 - }  
502 -  
503 -  
504 -  
505 - /**  
506 - * returns the response type as requested by the client  
507 - *  
508 - * @access public  
509 - * @return string  
510 - */  
511 - function get_response_type() {  
512 - return $this->response_type;  
513 - }  
514 -  
515 - }  
516 -  
517 - /**  
518 - * a cpaint data node. Data nodes are used to build up the response.  
519 - *  
520 - * @package CPAINT  
521 - * @access public  
522 - * @author Dominique Stender <dstender@st-webdevelopment.de>  
523 - * @copyright 2005-2006 (Dominique Stender); All rights reserved  
524 - * @version 2.0.3  
525 - */  
526 - class cpaint_node {  
527 - /**  
528 - * array of subnodes.  
529 - *  
530 - * @access public  
531 - * @var array $composites  
532 - */  
533 - var $composites;  
534 -  
535 - /**  
536 - * node attributes.  
537 - *  
538 - * @access public  
539 - * @var array $attributes  
540 - */  
541 - var $attributes;  
542 -  
543 - /**  
544 - * name of this node.  
545 - *  
546 - * @access public  
547 - * @var string $nodename  
548 - */  
549 - var $nodename;  
550 -  
551 - /**  
552 - * textual data of this node.  
553 - *  
554 - * @access public  
555 - * @var string $data  
556 - */  
557 - var $data;  
558 -  
559 - /**  
560 - * character encoding for input data  
561 - *  
562 - * @access private  
563 - * @var $input_encoding  
564 - */  
565 - var $input_encoding;  
566 -  
567 - /**  
568 - * PHP4 constructor.  
569 - *  
570 - * @package CPAINT  
571 - * @access public  
572 - * @return void  
573 - */  
574 - function cpaint_node() {  
575 - $this->__construct();  
576 - }  
577 -  
578 - /**  
579 - * PHP 5 constructor.  
580 - *  
581 - * @access public  
582 - * @return void  
583 - */  
584 - function __construct() {  
585 - // initialize properties  
586 - $this->composites = array();  
587 - $this->attributes = array();  
588 - $this->data = '';  
589 -  
590 - $this->set_encoding('UTF-8');  
591 - $this->set_name('');  
592 - $this->set_attribute('id', '');  
593 - }  
594 -  
595 - /**  
596 - * adds a new subnode to this node.  
597 - *  
598 - * will return a reference to it for further processing.  
599 - *  
600 - * @access public  
601 - * @param string $nodename name of the new node  
602 - * @param string $id id of the new node  
603 - * @return object  
604 - */  
605 - function &add_node($nodename, $id = '') {  
606 - $composites = count($this->composites);  
607 -  
608 - // create new node  
609 - $this->composites[$composites] =& new cpaint_node();  
610 - $this->composites[$composites]->set_name($nodename);  
611 - $this->composites[$composites]->set_attribute('id', $id);  
612 - $this->composites[$composites]->set_encoding($this->input_encoding);  
613 -  
614 - return $this->composites[$composites];  
615 - }  
616 -  
617 - /**  
618 - * assigns textual data to this node.  
619 - *  
620 - * @access public  
621 - * @param mixed $data data to assign to this node  
622 - * @return void  
623 - */  
624 - function set_data($data) {  
625 - $this->data = $data;  
626 - }  
627 -  
628 - /**  
629 - * returns the textual data assigned to this node.  
630 - *  
631 - * @access public  
632 - * @return mixed  
633 - */  
634 - function get_data() {  
635 - return $this->data;  
636 - }  
637 -  
638 - /**  
639 - * sets the id property of this node.  
640 - *  
641 - * @deprecated deprecated since version 2.0.0  
642 - * @access public  
643 - * @param string id the id  
644 - * @return void  
645 - */  
646 - function set_id($id) {  
647 - if ($id != '') {  
648 - $this->set_attribute('id', $id);  
649 - } // end: if  
650 - }  
651 -  
652 - /**  
653 - * returns the id property if this node.  
654 - *  
655 - * @deprecated deprecated since version 2.0.0  
656 - * @access public  
657 - * @return string  
658 - */  
659 - function get_id() {  
660 - return $this->get_attribute('id');  
661 - }  
662 -  
663 - /**  
664 - * adds a new attribute to this node.  
665 - *  
666 - * @access public  
667 - * @param string $name attribute name  
668 - * @param mixed $value attribute value  
669 - * @return void  
670 - */  
671 - function set_attribute($name, $value) {  
672 - $this->attributes[$name] = (string) $value;  
673 - }  
674 -  
675 - /**  
676 - * retrieves an attribute by name.  
677 - *  
678 - * @access public  
679 - * @param string $name attribute name  
680 - * @return string  
681 - */  
682 - function get_attribute($name) {  
683 - return $this->attributes[$name];  
684 - }  
685 -  
686 - /**  
687 - * set name property.  
688 - *  
689 - * @access public  
690 - * @param string $name the name  
691 - * @return void  
692 - */  
693 - function set_name($name) {  
694 - $this->nodename = (string) $name;  
695 - }  
696 -  
697 - /**  
698 - * get name property.  
699 - *  
700 - * @access public  
701 - * @return string  
702 - */  
703 - function get_name() {  
704 - return $this->nodename;  
705 - }  
706 -  
707 - /**  
708 - * sets the character encoding for this node  
709 - *  
710 - * @access public  
711 - * @param string $encoding character encoding  
712 - * @return void  
713 - */  
714 - function set_encoding($encoding) {  
715 - $this->input_encoding = strtoupper((string) $encoding);  
716 - }  
717 -  
718 - /**  
719 - * returns the character encoding for this node  
720 - *  
721 - * @access public  
722 - * @return string  
723 - */  
724 - function get_encoding() {  
725 - return $this->input_encoding;  
726 - }  
727 - }  
728 -  
729 - /**  
730 - * static class of output transformers.  
731 - *  
732 - * @package CPAINT  
733 - * @access public  
734 - * @author Dominique Stender <dstender@st-webdevelopment.de>  
735 - * @copyright 2003-2006 (Dominique Stender); All rights reserved  
736 - * @version 2.0.3  
737 - */  
738 - class cpaint_transformer {  
739 - /**  
740 - * toString method, used to generate response of type TEXT.  
741 - * will perform character transformation according to parameters.  
742 - *  
743 - * @access public  
744 - * @param object $node a cpaint_node object  
745 - * @return string  
746 - */  
747 - function toString(&$node) {  
748 - $return_value = '';  
749 -  
750 - foreach ($node->composites as $composite) {  
751 - $return_value .= cpaint_transformer::toString($composite);  
752 - }  
753 -  
754 - $return_value .= cpaint_transformer::encode($node->get_data(), $node->get_encoding());  
755 -  
756 - return $return_value;  
757 - }  
758 -  
759 - /**  
760 - * XML response generator.  
761 - * will perform character transformation according to parameters.  
762 - *  
763 - * @access public  
764 - * @param object $node a cpaint_node object  
765 - * @return string  
766 - */  
767 - function toXML(&$node) {  
768 - $return_value = '<' . $node->get_name();  
769 -  
770 - // handle attributes  
771 - foreach ($node->attributes as $name => $value) {  
772 - if ($value != '') {  
773 - $return_value .= ' ' . $name . '="' . $node->get_attribute($name) . '"';  
774 - }  
775 - } // end: foreach  
776 -  
777 - $return_value .= '>';  
778 -  
779 - // handle subnodes  
780 - foreach ($node->composites as $composite) {  
781 - $return_value .= cpaint_transformer::toXML($composite);  
782 - }  
783 -  
784 - $return_value .= cpaint_transformer::encode($node->get_data(), $node->get_encoding())  
785 - . '</' . $node->get_name() . '>';  
786 -  
787 - return $return_value;  
788 - }  
789 -  
790 - /**  
791 - * JSON response generator.  
792 - * will perform character transformation according to parameters.  
793 - *  
794 - * @access public  
795 - * @param object $node a cpaint_node object  
796 - * @return string  
797 - */  
798 - function toJSON($node) {  
799 - $return_value = '';  
800 - $JSON_node = new stdClass();  
801 -  
802 - // handle attributes  
803 - $JSON_node->attributes = $node->attributes;  
804 -  
805 - // handle subnodes  
806 - foreach ($node->composites as $composite) {  
807 -  
808 - if (!is_array($JSON_node->{$composite->nodename})) {  
809 - $JSON_node->{$composite->nodename} = array();  
810 - } // end: if  
811 -  
812 - // we need to parse the JSON object again to avoid multiple encoding  
813 - $JSON_node->{$composite->nodename}[] = $GLOBALS['__cpaint_json']->parse(cpaint_transformer::toJSON($composite));  
814 - }  
815 -  
816 - // handle data  
817 - $JSON_node->data = $node->data;  
818 -  
819 - return $GLOBALS['__cpaint_json']->stringify($JSON_node);  
820 - }  
821 -  
822 - /**  
823 - * performs conversion to JavaScript-safe UTF-8 characters  
824 - *  
825 - * @access public  
826 - * @param string $data data to convert  
827 - * @param string $encoding character encoding  
828 - * @return string  
829 - */  
830 - function encode($data, $encoding) {  
831 - // convert string  
832 - if (function_exists('iconv')) {  
833 - // iconv is by far the most flexible approach, try this first  
834 - $return_value = iconv($encoding, 'UTF-8', $data);  
835 -  
836 - } elseif ($encoding == 'ISO-8859-1') {  
837 - // for ISO-8859-1 we can use utf8-encode()  
838 - $return_value = utf8_encode($data);  
839 -  
840 - } else {  
841 - // give up. if UTF-8 data was supplied everything is fine!  
842 - $return_value = $data;  
843 - } /* end: if */  
844 -  
845 - // now encode non-printable characters  
846 - for ($i = 0; $i < 32; $i++) {  
847 - $return_value = str_replace(chr($i), '\u00' . sprintf('%02x', $i), $return_value);  
848 - } // end: for  
849 -  
850 - // encode <, >, and & respectively for XML sanity  
851 - $return_value = str_replace(chr(0x26), '\u0026', $return_value);  
852 - $return_value = str_replace(chr(0x3c), '\u003c', $return_value);  
853 - $return_value = str_replace(chr(0x3e), '\u003e', $return_value);  
854 -  
855 - return $return_value;  
856 - }  
857 -  
858 - /**  
859 - * performs conversion from JavaScript encodeURIComponent() string (UTF-8) to  
860 - * the charset in use.  
861 - *  
862 - * @access public  
863 - * @param string $data data to convert  
864 - * @param string $encoding character encoding  
865 - * @return string  
866 - */  
867 - function decode($data, $encoding) {  
868 - // convert string  
869 -  
870 - if (is_string($data)) {  
871 - if (function_exists('iconv')) {  
872 - // iconv is by far the most flexible approach, try this first  
873 - $return_value = iconv('UTF-8', $encoding, $data);  
874 -  
875 - } elseif ($encoding == 'ISO-8859-1') {  
876 - // for ISO-8859-1 we can use utf8-decode()  
877 - $return_value = utf8_decode($data);  
878 -  
879 - } else {  
880 - // give up. if data was supplied in the correct format everything is fine!  
881 - $return_value = $data;  
882 - } // end: if  
883 -  
884 - } else {  
885 - // non-string value  
886 - $return_value = $data;  
887 - } // end: if  
888 -  
889 - return $return_value;  
890 - }  
891 -  
892 - /**  
893 - * decodes a (nested) array of data from UTF-8 into the configured character set  
894 - *  
895 - * @access public  
896 - * @param array $data data to convert  
897 - * @param string $encoding character encoding  
898 - * @return array  
899 - */  
900 - function decode_array($data, $encoding) {  
901 - $return_value = array();  
902 -  
903 - foreach ($data as $key => $value) {  
904 -  
905 - if (!is_array($value)) {  
906 - $return_value[$key] = cpaint_transformer::decode($value, $encoding);  
907 -  
908 - } else {  
909 - $return_value[$key] = cpaint_transformer::decode_array($value, $encoding);  
910 - }  
911 - }  
912 -  
913 - return $return_value;  
914 - }  
915 -  
916 - /**  
917 - * determines the output character set  
918 - * based on input character set  
919 - *  
920 - * @access public  
921 - * @param string $encoding character encoding  
922 - * @return string  
923 - */  
924 - function find_output_charset($encoding) {  
925 - $return_value = 'UTF-8';  
926 -  
927 - if (function_exists('iconv')  
928 - || $encoding == 'UTF-8'  
929 - || $encoding == 'ISO-8859-1') {  
930 -  
931 - $return_value = 'UTF-8';  
932 -  
933 - } else {  
934 - $return_value = $encoding;  
935 - } // end: if  
936 -  
937 - return $return_value;  
938 - }  
939 - }  
940 -  
941 -?>  
942 \ No newline at end of file 0 \ No newline at end of file
classesjs/cpaint/cpaint2.proxy.php
@@ -1,117 +0,0 @@ @@ -1,117 +0,0 @@
1 -<?php  
2 -/**  
3 -* CPAINT (Cross-Platform Asynchronous INterface Toolkit)  
4 -*  
5 -* http://sf.net/projects/cpaint  
6 -*  
7 -* released under the terms of the GPL  
8 -* see http://www.fsf.org/licensing/licenses/gpl.txt for details  
9 -*  
10 -*  
11 -* proxy script to pass request on to remote servers  
12 -*  
13 -* @package CPAINT  
14 -* @author Paul Sullivan <wiley14@gmail.com>  
15 -* @author Dominique Stender <dstender@st-webdevelopment.de>  
16 -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint  
17 -* @version 2.0.3  
18 -*/  
19 -  
20 -//---- includes ----------------------------------------------------------------  
21 - /**  
22 - * @include config  
23 - */  
24 - require_once("cpaint2.config.php");  
25 -  
26 -//---- main code ---------------------------------------------------------------  
27 -  
28 - error_reporting (E_ALL ^ E_NOTICE ^ E_WARNING);  
29 - set_time_limit(0);  
30 -  
31 - if ($_REQUEST['cpaint_remote_url'] != "") {  
32 - $cp_remote_url = urldecode($_REQUEST['cpaint_remote_url']);  
33 - $cp_remote_method = urldecode($_REQUEST['cpaint_remote_method']);  
34 - $cp_remote_query = urldecode($_REQUEST['cpaint_remote_query']);  
35 - $cp_response_type = strtoupper($_REQUEST['cpaint_response_type']);  
36 - }  
37 -  
38 - // propagate XML header if necessary  
39 - if ($cp_response_type == 'XML'  
40 - || $cp_response_type == 'OBJECT') {  
41 - header("Content-type: text/xml");  
42 - }  
43 -  
44 - // transfer mode specifics  
45 - if ($cp_remote_method == 'GET') {  
46 - $cp_remote_url .= '?' . $cp_remote_query;  
47 - $cp_request_body = '';  
48 -  
49 - // prepare parameters  
50 - $url_parts = parse_url($cp_remote_url);  
51 -  
52 - // build basic header  
53 - $cp_request_header = 'GET ' . $url_parts['path'] . '?' . str_replace(' ', '+', $url_parts['query']) . " HTTP/1.0\r\n"  
54 - . "Host: " . $url_parts['host'] . "\r\n";  
55 -  
56 - } elseif ($cp_remote_method == 'POST') {  
57 - $cp_request_body = '&' . $cp_remote_query;  
58 -  
59 - // prepare parameters  
60 - $url_parts = parse_url($cp_remote_url);  
61 -  
62 - // check against whitelist  
63 - if ($cpaint2_config["proxy.security.use_whitelist"] == true) {  
64 - $url_allowed = false;  
65 - foreach($cpaint2_proxy_whitelist as $whitelistURL) {  
66 - $whiteList_parts = parse_url("http://" . $whitelistURL);  
67 - $url_parts_temp = parse_url("http://" . $cp_remote_url);  
68 - if (array_key_exists("path", $whiteList_parts)) {  
69 - if ((strtolower($whiteList_parts["path"]) == strtolower($url_parts_temp["path"])) && (strtolower($whiteList_parts["host"]) == strtolower($url_parts_temp["host"]))) $url_allowed = true;  
70 - } else { // no path, check only host  
71 - if (strtolower($whiteList_parts["host"]) == strtolower($url_parts_temp["host"])) $url_allowed = true;  
72 - }  
73 - }  
74 - if ($url_allowed == false) die("[CPAINT] The host or script cannot be accessed through this proxy.");  
75 - }  
76 -  
77 - // build basic header  
78 - $cp_request_header = 'POST ' . $url_parts['path'] . " HTTP/1.0\r\n"  
79 - . "Host: " . $url_parts['host'] . "\r\n"  
80 - . "Content-Type: application/x-www-form-urlencoded\r\n";  
81 - }  
82 -  
83 - // add port if none exists  
84 - if (!isset($url_parts['port'])) {  
85 - $url_parts['port'] = 80;  
86 - }  
87 -  
88 - // add content-length header  
89 - $cp_request_header .= "Content-Length: " . strlen($cp_request_body) . "\r\n";  
90 -  
91 - // add authentication to header if necessary  
92 - if ($url_parts['user'] != '') {  
93 - $cp_request_header .= 'Authorization: Basic ' . base64_encode($url_parts['user'] . ':' . $url_parts['pass']) . "\r\n";  
94 - }  
95 -  
96 - // open connection  
97 - $cp_socket = @fsockopen($url_parts['host'], $url_parts['port'], $error, $errstr, 10);  
98 -  
99 - if ($cp_socket !== false) {  
100 - // send headers  
101 - @fwrite($cp_socket, $cp_request_header . "\r\n\r\n");  
102 -  
103 - // send body if necessary  
104 - if ($cp_request_body != '') {  
105 - @fwrite($cp_socket, $cp_request_body . "\r\n");  
106 - }  
107 -  
108 - while (!feof($cp_socket)) {  
109 - $http_data = $http_data . fgets($cp_socket);  
110 - }  
111 -  
112 - list($http_headers, $http_body) = split("\r\n\r\n", $http_data, 2);  
113 - echo($http_body);  
114 - @fclose($cp_socket);  
115 - }  
116 -  
117 -?>  
118 \ No newline at end of file 0 \ No newline at end of file
classesjs/cpaint/json.php
@@ -1,580 +0,0 @@ @@ -1,580 +0,0 @@
1 -<?php  
2 -/**  
3 -* The content of this file is (c) 2003-2005 digital media center GmbH  
4 -* All rights reserved  
5 -*  
6 -* a JSON parser / generator.  
7 -* implemented as 100% compatible port of the original JSON parser  
8 -* by Douglas Crockford on http://www.JSON.org.  
9 -*  
10 -* @package JSON  
11 -* @access public  
12 -* @copyright Copyright (c) 2005-2006 Dominique Stender - http://sf.net/projects/cpaint  
13 -* @license http://www.crockford.com/JSON/license.html  
14 -* @author Dominique Stender <dstender@st-webdevelopment.de>  
15 -* @version 1.0.1  
16 -*/  
17 -  
18 -  
19 -  
20 - /**  
21 - * a JSON parser / generator  
22 - *  
23 - * @access public  
24 - * @author Dominique Stender <dst@dmc.de>  
25 - * @version 1.0.1  
26 - */  
27 - class JSON {  
28 - /**  
29 - * line counter  
30 - *  
31 - * @access private  
32 - * @var integer $at  
33 - */  
34 - var $at = 0;  
35 -  
36 - /**  
37 - *  
38 - * @access private  
39 - * @var string $ch  
40 - */  
41 - var $ch = ' ';  
42 -  
43 - /**  
44 - * JSON representation  
45 - *  
46 - * @access private  
47 - * @var string $text  
48 - */  
49 - var $text = '';  
50 -  
51 - /**  
52 - * takes an arbitrary PHP data structure and generates a valid JSON representation from it  
53 - *  
54 - * @param mixed $arg an arbitrary PHP data structure  
55 - * @access public  
56 - * @return string  
57 - * @version 1.0.1 fixed tests whether $s has content by using strlen(). this enables the user to use 0 as very first character  
58 - */  
59 - function stringify($arg) {  
60 - $returnValue = '';  
61 - $c = '';  
62 - $i = '';  
63 - $l = '';  
64 - $s = '';  
65 - $v = '';  
66 - $numeric = true;  
67 -  
68 - switch (gettype($arg)) {  
69 -  
70 - case 'array':  
71 - // do a test whether all array keys are numeric  
72 - foreach ($arg as $i => $v) {  
73 - if (!is_numeric($i)) {  
74 - $numeric = false;  
75 - break;  
76 - }  
77 - }  
78 -  
79 - if ($numeric) {  
80 -  
81 - foreach ($arg as $i => $v) {  
82 - if (strlen($s) > 0) {  
83 - $s .= ',';  
84 - }  
85 -  
86 - $s .= $this->stringify($arg[$i]);  
87 - } // end: foreach  
88 -  
89 - $returnValue = '[' . $s . ']';  
90 -  
91 - } else {  
92 - // associative array  
93 - foreach ($arg as $i => $v) {  
94 - if (strlen($s) > 0) {  
95 - $s .= ',';  
96 - }  
97 - $s .= $this->stringify($i) . ':' . $this->stringify($arg[$i]);  
98 - }  
99 - // return as object  
100 - $returnValue = '{' . $s . '}';  
101 - }  
102 - break;  
103 -  
104 - case 'object':  
105 -  
106 - foreach (get_object_vars($arg) as $i => $v) {  
107 - $v = $this->stringify($v);  
108 -  
109 - if (strlen($s) > 0) {  
110 - $s .= ',';  
111 - }  
112 -  
113 - $s .= $this->stringify($i) . ':' . $v;  
114 - }  
115 -  
116 - $returnValue = '{' . $s . '}';  
117 - break;  
118 -  
119 - case 'integer':  
120 - case 'double':  
121 - $returnValue = is_numeric($arg) ? (string) $arg : 'null';  
122 - break;  
123 -  
124 - case 'string':  
125 - $l = strlen($arg);  
126 - $s = '"';  
127 -  
128 - for ($i = 0; $i < $l; $i++) {  
129 - $c = $arg{$i};  
130 -  
131 - if (ord($c) >= ord(' ')) {  
132 -  
133 - if ($c == '\\'  
134 - || $c == '"') {  
135 -  
136 - $s .= '\\';  
137 - }  
138 - $s .= $c;  
139 -  
140 - } else {  
141 -  
142 - switch ($c) {  
143 -  
144 - case '\b':  
145 - $s .= '\\b';  
146 - break;  
147 -  
148 - case '\f':  
149 - $s .= '\\f';  
150 - break;  
151 -  
152 - case '\n':  
153 - $s .= '\\n';  
154 - break;  
155 -  
156 - case '\r':  
157 - $s .= '\\r';  
158 - break;  
159 -  
160 - case '\t':  
161 - $s .= '\\t';  
162 - break;  
163 -  
164 - default:  
165 - $s .= '\u00' . sprintf('%02x', ord($c));  
166 - }  
167 - }  
168 - }  
169 - $returnValue = $s . '"';  
170 - break;  
171 -  
172 - case 'boolean':  
173 - $returnValue = (string) $arg;  
174 - break;  
175 -  
176 - default:  
177 - $returnValue = 'null';  
178 - }  
179 -  
180 - return $returnValue;  
181 - }  
182 -  
183 -  
184 - /**  
185 - * parses the given string into a PHP data structure  
186 - *  
187 - * @param string $text JSON data representation  
188 - * @access public  
189 - * @return mixed  
190 - */  
191 - function parse($text) {  
192 - $this->at = 0;  
193 - $this->ch = ' ';  
194 - $this->text = $text;  
195 -  
196 - return $this->val();  
197 - }  
198 -  
199 - /**  
200 - * triggers a PHP_ERROR  
201 - *  
202 - * @access private  
203 - * @param string $m error message  
204 - * @return void  
205 - */  
206 - function error($m) {  
207 - trigger_error($m . ' at offset ' . $this->at . ': ' . $this->text, E_USER_ERROR);  
208 - }  
209 -  
210 - /**  
211 - * returns the next character of a JSON string  
212 - *  
213 - * @access private  
214 - * @return string  
215 - */  
216 - function next() {  
217 - $this->ch = $this->text{$this->at};  
218 - $this->at++;  
219 - return $this->ch;  
220 - }  
221 -  
222 - /**  
223 - * handles whitespace and comments  
224 - *  
225 - * @access private  
226 - * @return void  
227 - */  
228 - function white() {  
229 -  
230 - while ($this->ch != ''  
231 - && ord($this->ch) <= ord(' ')) {  
232 -  
233 - $this->next();  
234 - }  
235 - }  
236 -  
237 - /**  
238 - * handles strings  
239 - *  
240 - * @access private  
241 - * @return void  
242 - */  
243 - function str() {  
244 - $i = '';  
245 - $s = '';  
246 - $t = '';  
247 - $u = '';  
248 -  
249 - if ($this->ch == '"') {  
250 -  
251 - while ($this->next() !== null) {  
252 -  
253 - if ($this->ch == '"') {  
254 - $this->next();  
255 - return $s;  
256 -  
257 - } elseif ($this->ch == '\\') {  
258 -  
259 - switch ($this->next()) {  
260 - case 'b':  
261 - $s .= '\b';  
262 - break;  
263 -  
264 - case 'f':  
265 - $s .= '\f';  
266 - break;  
267 -  
268 - case 'n':  
269 - $s .= '\n';  
270 - break;  
271 -  
272 - case 'r':  
273 - $s .= '\r';  
274 - break;  
275 -  
276 - case 't':  
277 - $s .= '\t';  
278 - break;  
279 -  
280 - case 'u':  
281 - $u = 0;  
282 -  
283 - for ($i = 0; $i < 4; $i += 1) {  
284 - $t = (integer) sprintf('%01c', hexdec($this->next()));  
285 -  
286 - if (!is_numeric($t)) {  
287 - break 2;  
288 - }  
289 - $u = $u * 16 + $t;  
290 - }  
291 -  
292 - $s .= chr($u);  
293 - break;  
294 -  
295 - default:  
296 - $s .= $this->ch;  
297 - }  
298 - } else {  
299 - $s .= $this->ch;  
300 - }  
301 - }  
302 - }  
303 -  
304 - $this->error('Bad string');  
305 - }  
306 -  
307 - /**  
308 - * handless arrays  
309 - *  
310 - * @access private  
311 - * @return void  
312 - */  
313 - function arr() {  
314 - $a = array();  
315 -  
316 - if ($this->ch == '[') {  
317 - $this->next();  
318 - $this->white();  
319 -  
320 - if ($this->ch == ']') {  
321 - $this->next();  
322 - return $a;  
323 - }  
324 -  
325 - while ($this->ch) {  
326 - array_push($a, $this->val());  
327 - $this->white();  
328 -  
329 - if ($this->ch == ']') {  
330 - $this->next();  
331 - return $a;  
332 -  
333 - } elseif ($this->ch != ',') {  
334 - break;  
335 - }  
336 -  
337 - $this->next();  
338 - $this->white();  
339 - }  
340 -  
341 - $this->error('Bad array');  
342 - }  
343 - }  
344 -  
345 - /**  
346 - * handles objects  
347 - *  
348 - * @access public  
349 - * @return void  
350 - */  
351 - function obj() {  
352 - $k = '';  
353 - $o = new stdClass();  
354 -  
355 - if ($this->ch == '{') {  
356 - $this->next();  
357 - $this->white();  
358 -  
359 - if ($this->ch == '}') {  
360 - $this->next();  
361 - return $o;  
362 - }  
363 -  
364 - while ($this->ch) {  
365 - $k = $this->str();  
366 - $this->white();  
367 -  
368 - if ($this->ch != ':') {  
369 - break;  
370 - }  
371 -  
372 - $this->next();  
373 - $o->$k = $this->val();  
374 - $this->white();  
375 -  
376 - if ($this->ch == '}') {  
377 - $this->next();  
378 - return $o;  
379 -  
380 - } elseif ($this->ch != ',') {  
381 - break;  
382 - }  
383 -  
384 - $this->next();  
385 - $this->white();  
386 - }  
387 - }  
388 -  
389 - $this->error('Bad object');  
390 - }  
391 -  
392 - /**  
393 - * handles objects  
394 - *  
395 - * @access public  
396 - * @return void  
397 - */  
398 - function assoc() {  
399 - $k = '';  
400 - $a = array();  
401 -  
402 - if ($this->ch == '<') {  
403 - $this->next();  
404 - $this->white();  
405 -  
406 - if ($this->ch == '>') {  
407 - $this->next();  
408 - return $a;  
409 - }  
410 -  
411 - while ($this->ch) {  
412 - $k = $this->str();  
413 - $this->white();  
414 -  
415 - if ($this->ch != ':') {  
416 - break;  
417 - }  
418 -  
419 - $this->next();  
420 - $a[$k] = $this->val();  
421 - $this->white();  
422 -  
423 - if ($this->ch == '>') {  
424 - $this->next();  
425 - return $a;  
426 -  
427 - } elseif ($this->ch != ',') {  
428 - break;  
429 - }  
430 -  
431 - $this->next();  
432 - $this->white();  
433 - }  
434 - }  
435 -  
436 - $this->error('Bad associative array');  
437 - }  
438 -  
439 - /**  
440 - * handles numbers  
441 - *  
442 - * @access private  
443 - * @return void  
444 - */  
445 - function num() {  
446 - $n = '';  
447 - $v = '';  
448 -  
449 - if ($this->ch == '-') {  
450 - $n = '-';  
451 - $this->next();  
452 - }  
453 -  
454 - while ($this->ch >= '0'  
455 - && $this->ch <= '9') {  
456 -  
457 - $n .= $this->ch;  
458 - $this->next();  
459 - }  
460 -  
461 - if ($this->ch == '.') {  
462 - $n .= '.';  
463 -  
464 - while ($this->next()  
465 - && $this->ch >= '0'  
466 - && $this->ch <= '9') {  
467 -  
468 - $n .= $this->ch;  
469 - }  
470 - }  
471 -  
472 - if ($this->ch == 'e'  
473 - || $this->ch == 'E') {  
474 -  
475 - $n .= 'e';  
476 - $this->next();  
477 -  
478 - if ($this->ch == '-'  
479 - || $this->ch == '+') {  
480 -  
481 - $n .= $this->ch;  
482 - $this->next();  
483 - }  
484 -  
485 - while ($this->ch >= '0'  
486 - && $this->ch <= '9') {  
487 -  
488 - $n .= $this->ch;  
489 - $this->next();  
490 - }  
491 - }  
492 -  
493 - $v += $n;  
494 -  
495 - if (!is_numeric($v)) {  
496 - $this->error('Bad number');  
497 -  
498 - } else {  
499 - return $v;  
500 - } // end: if  
501 - }  
502 -  
503 - /**  
504 - * handles words  
505 - *  
506 - * @access private  
507 - * @return mixed  
508 - */  
509 - function word() {  
510 - switch ($this->ch) {  
511 -  
512 - case 't':  
513 -  
514 - if ($this->next() == 'r'  
515 - && $this->next() == 'u'  
516 - && $this->next() == 'e') {  
517 -  
518 - $this->next();  
519 - return true;  
520 - }  
521 - break;  
522 -  
523 - case 'f':  
524 - if ($this->next() == 'a'  
525 - && $this->next() == 'l'  
526 - && $this->next() == 's'  
527 - && $this->next() == 'e') {  
528 -  
529 - $this->next();  
530 - return false;  
531 - }  
532 - break;  
533 -  
534 - case 'n':  
535 - if ($this->next() == 'u'  
536 - && $this->next() == 'l'  
537 - && $this->next() == 'l') {  
538 -  
539 - $this->next();  
540 - return null;  
541 - }  
542 - break;  
543 - }  
544 -  
545 - $this->error('Syntax error');  
546 - }  
547 -  
548 - /**  
549 - * generic value handler  
550 - *  
551 - * @access private  
552 - * @return mixed  
553 - */  
554 - function val() {  
555 - $this->white();  
556 -  
557 - switch ($this->ch) {  
558 -  
559 - case '{':  
560 - return $this->obj();  
561 -  
562 - case '[':  
563 - return $this->arr();  
564 -  
565 - case '<':  
566 - return $this->assoc();  
567 -  
568 - case '"':  
569 - return $this->str();  
570 -  
571 - case '-':  
572 - return $this->num();  
573 -  
574 - default:  
575 - return ($this->ch >= '0' && $this->ch <= '9') ? $this->num() : $this->word();  
576 - }  
577 - }  
578 - }  
579 -  
580 -?>  
581 \ No newline at end of file 0 \ No newline at end of file