Index: trunk/extensions/Drafts/Drafts.classes.php |
— | — | @@ -10,6 +10,12 @@ |
11 | 11 | |
12 | 12 | /* Static Functions */ |
13 | 13 | |
| 14 | + /** |
| 15 | + * Counts the number of existing drafts for a specific user |
| 16 | + * @return Number of drafts which match condition parameters |
| 17 | + * @param object $title[optional] Title of article, defaults to all articles |
| 18 | + * @param integer $userID[optional] ID of user, defaults to current user |
| 19 | + */ |
14 | 20 | public static function num( |
15 | 21 | &$title = null, |
16 | 22 | $userID = null |
— | — | @@ -39,6 +45,10 @@ |
40 | 46 | return $dbr->selectField( 'drafts', 'count(*)', $where, __METHOD__ ); |
41 | 47 | } |
42 | 48 | |
| 49 | + /** |
| 50 | + * Removes drafts which have not been modified for a period of time defined |
| 51 | + * by $wgDraftsLifeSpan |
| 52 | + */ |
43 | 53 | public static function clean() { |
44 | 54 | global $egDraftsLifeSpan; |
45 | 55 | // Get database connection |
— | — | @@ -48,12 +58,42 @@ |
49 | 59 | // Removes expired drafts from database |
50 | 60 | $dbw->delete( 'drafts', |
51 | 61 | array( |
52 | | - 'draft_savetime < ' . $dbw->addQuotes( $dbw->timestamp( $cutoff ) ) |
| 62 | + 'draft_savetime < ' . |
| 63 | + $dbw->addQuotes( $dbw->timestamp( $cutoff ) ) |
53 | 64 | ), |
54 | 65 | __METHOD__ |
55 | 66 | ); |
56 | 67 | } |
57 | 68 | |
| 69 | + /** |
| 70 | + * Re-titles drafts which point to a particlar article, as a response to the |
| 71 | + * article being moved. |
| 72 | + */ |
| 73 | + public static function move( |
| 74 | + $oldTitle, |
| 75 | + $newTitle |
| 76 | + ) { |
| 77 | + // Get database connection |
| 78 | + $dbw = wfGetDB( DB_MASTER ); |
| 79 | + // Updates title and namespace of drafts upon moving |
| 80 | + $dbw->update( 'drafts', |
| 81 | + array( |
| 82 | + 'draft_namespace' => $newTitle->getNamespace(), |
| 83 | + 'draft_title' => $newTitle->getDBKey() |
| 84 | + ), |
| 85 | + array( |
| 86 | + 'draft_page' => $newTitle->getArticleId() |
| 87 | + ), |
| 88 | + __METHOD__ |
| 89 | + ); |
| 90 | + } |
| 91 | + |
| 92 | + /** |
| 93 | + * Gets a list of existing drafts for a specific user |
| 94 | + * @return |
| 95 | + * @param object $title[optional] Title of article, defaults to all articles |
| 96 | + * @param integer $userID[optional] ID of user, defaults to current user |
| 97 | + */ |
58 | 98 | public static function get( |
59 | 99 | $title = null, |
60 | 100 | $userID = null |
— | — | @@ -75,7 +115,6 @@ |
76 | 116 | $where['draft_page'] = $pageId; |
77 | 117 | } else { |
78 | 118 | // Adds new page information to conditions |
79 | | - $where['draft_page'] = 0; // page not created yet |
80 | 119 | $where['draft_namespace'] = $title->getNamespace(); |
81 | 120 | $where['draft_title'] = $title->getDBKey(); |
82 | 121 | } |
— | — | @@ -98,19 +137,25 @@ |
99 | 138 | $drafts[] = Draft::newFromRow( $row ); |
100 | 139 | } |
101 | 140 | } |
102 | | - // Returns array of matching drafts or null id there were none |
| 141 | + // Returns array of matching drafts or null if there were none |
103 | 142 | return count( $drafts ) ? $drafts : null; |
104 | 143 | } |
105 | 144 | |
| 145 | + /** |
| 146 | + * Outputs a table of existing drafts |
| 147 | + * @return Number of drafts in the table |
| 148 | + * @param object $title[optional] Title of article, defaults to all articles |
| 149 | + * @param integer $userID[optional] ID of user, defaults to current user |
| 150 | + */ |
106 | 151 | public static function display( |
107 | 152 | &$title = null, |
108 | | - $user = null |
| 153 | + $userID = null |
109 | 154 | ) { |
110 | 155 | global $wgOut, $wgRequest, $wgUser, $wgLang; |
111 | 156 | // Gets draftID |
112 | 157 | $currentDraft = Draft::newFromID( $wgRequest->getIntOrNull( 'draft' ) ); |
113 | 158 | // Output HTML for list of drafts |
114 | | - $drafts = Drafts::get( $title, $user ); |
| 159 | + $drafts = Drafts::get( $title, $userID ); |
115 | 160 | if ( count( $drafts ) > 0 ) { |
116 | 161 | global $egDraftsLifeSpan; |
117 | 162 | // Internationalization |
— | — | @@ -164,8 +209,8 @@ |
165 | 210 | // Get article title text |
166 | 211 | $htmlTitle = $draft->getTitle()->getEscapedText(); |
167 | 212 | // Build Article Load link |
168 | | - $urlLoad = $draft->getTitle()->getFullUrl( 'action=edit&draft=' . |
169 | | - urlencode( $draft->getID() ) |
| 213 | + $urlLoad = $draft->getTitle()->getFullUrl( |
| 214 | + 'action=edit&draft=' . urlencode( $draft->getID() ) |
170 | 215 | ); |
171 | 216 | // Build discard link |
172 | 217 | $urlDiscard = SpecialPage::getTitleFor( 'Drafts' )->getFullUrl( |
— | — | @@ -282,6 +327,12 @@ |
283 | 328 | |
284 | 329 | /* Static Functions */ |
285 | 330 | |
| 331 | + /** |
| 332 | + * Creates a new Draft object from a draft ID |
| 333 | + * @return New Draft object |
| 334 | + * @param integer $id ID of draft |
| 335 | + * @param boolean $autoload[optional] Whether to load draft information |
| 336 | + */ |
286 | 337 | public static function newFromID( |
287 | 338 | $id, |
288 | 339 | $autoload = true |
— | — | @@ -289,12 +340,19 @@ |
290 | 341 | return new Draft( $id, $autoload ); |
291 | 342 | } |
292 | 343 | |
| 344 | + /** |
| 345 | + * Creates a new Draft object from a database row |
| 346 | + * @return New Draft object |
| 347 | + * @param array $row Database row to create Draft object with |
| 348 | + */ |
293 | 349 | public static function newFromRow( |
294 | 350 | $row |
295 | 351 | ) { |
296 | 352 | $draft = new Draft( $row['draft_id'], false ); |
297 | 353 | $draft->setToken( $row['draft_token'] ); |
298 | | - $draft->setTitle( Title::makeTitle( $row['draft_namespace'], $row['draft_title'] ) ); |
| 354 | + $draft->setTitle( |
| 355 | + Title::makeTitle( $row['draft_namespace'], $row['draft_title'] ) |
| 356 | + ); |
299 | 357 | $draft->setSection( $row['draft_section'] ); |
300 | 358 | $draft->setStartTime( $row['draft_starttime'] ); |
301 | 359 | $draft->setEditTime( $row['draft_edittime'] ); |
— | — | @@ -306,113 +364,203 @@ |
307 | 365 | return $draft; |
308 | 366 | } |
309 | 367 | |
310 | | - public static function newToken() { |
311 | | - return wfGenerateToken(); |
312 | | - } |
313 | | - |
314 | 368 | /* Properties */ |
315 | 369 | |
| 370 | + /** |
| 371 | + * @return Whether draft exists in database |
| 372 | + */ |
316 | 373 | public function exists() { |
317 | 374 | return $this->exists; |
318 | 375 | } |
319 | 376 | |
| 377 | + /** |
| 378 | + * @return Draft ID |
| 379 | + */ |
320 | 380 | public function getID() { |
321 | 381 | return $this->id; |
322 | 382 | } |
323 | 383 | |
| 384 | + /** |
| 385 | + * @return Edit token |
| 386 | + */ |
| 387 | + public function getToken() { |
| 388 | + return $this->token; |
| 389 | + } |
| 390 | + |
| 391 | + /** |
| 392 | + * Sets the edit token, like one generated by wfGenerateToken() |
| 393 | + * @param string $token |
| 394 | + */ |
324 | 395 | public function setToken( |
325 | 396 | $token |
326 | 397 | ) { |
327 | 398 | $this->token = $token; |
328 | 399 | } |
329 | | - public function getToken() { |
330 | | - return $this->token; |
| 400 | + |
| 401 | + /** |
| 402 | + * @return User ID of draft creator |
| 403 | + */ |
| 404 | + public function getUserID() { |
| 405 | + return $this->userID; |
331 | 406 | } |
332 | | - |
333 | | - public function getUserID( |
| 407 | + |
| 408 | + /** |
| 409 | + * Sets user ID of draft creator |
| 410 | + * @param integer $userID |
| 411 | + */ |
| 412 | + public function setUserID( |
334 | 413 | $userID |
335 | 414 | ) { |
336 | 415 | $this->userID = $userID; |
337 | 416 | } |
338 | | - public function setUserID() { |
339 | | - return $this->userID; |
340 | | - } |
341 | 417 | |
| 418 | + /** |
| 419 | + * @return Title of article of draft |
| 420 | + */ |
342 | 421 | public function getTitle() { |
343 | 422 | return $this->title; |
344 | 423 | } |
| 424 | + |
| 425 | + /** |
| 426 | + * Sets title of article of draft |
| 427 | + * @param object $title |
| 428 | + */ |
345 | 429 | public function setTitle( |
346 | 430 | $title |
347 | 431 | ) { |
348 | 432 | $this->title = $title; |
349 | 433 | } |
350 | 434 | |
| 435 | + /** |
| 436 | + * @return Section of the article of draft |
| 437 | + */ |
351 | 438 | public function getSection() { |
352 | 439 | return $this->section; |
353 | 440 | } |
| 441 | + |
| 442 | + /** |
| 443 | + * Sets section of the article of draft |
| 444 | + * @param integer $section |
| 445 | + */ |
354 | 446 | public function setSection( |
355 | 447 | $section |
356 | 448 | ) { |
357 | 449 | $this->section = $section; |
358 | 450 | } |
359 | 451 | |
| 452 | + /** |
| 453 | + * @return Time when draft of the article started |
| 454 | + */ |
360 | 455 | public function getStartTime() { |
361 | 456 | return $this->starttime; |
362 | 457 | } |
| 458 | + |
| 459 | + /** |
| 460 | + * Sets time when draft of the article started |
| 461 | + * @param string $starttime |
| 462 | + */ |
363 | 463 | public function setStartTime( |
364 | 464 | $starttime |
365 | 465 | ) { |
366 | 466 | $this->starttime = $starttime; |
367 | 467 | } |
368 | 468 | |
| 469 | + /** |
| 470 | + * @return Time of most recent revision of article when this draft started |
| 471 | + */ |
369 | 472 | public function getEditTime() { |
370 | 473 | return $this->edittime; |
371 | 474 | } |
| 475 | + |
| 476 | + /** |
| 477 | + * Sets time of most recent revision of article when this draft started |
| 478 | + * @param string $edittime |
| 479 | + */ |
372 | 480 | public function setEditTime( |
373 | 481 | $edittime |
374 | 482 | ) { |
375 | 483 | $this->edittime = $edittime; |
376 | 484 | } |
377 | 485 | |
| 486 | + /** |
| 487 | + * @return Time when draft was last modified |
| 488 | + */ |
378 | 489 | public function getSaveTime() { |
379 | 490 | return $this->savetime; |
380 | 491 | } |
| 492 | + |
| 493 | + /** |
| 494 | + * Sets time when draft was last modified |
| 495 | + * @param string $savetime |
| 496 | + */ |
381 | 497 | public function setSaveTime( |
382 | 498 | $savetime |
383 | 499 | ) { |
384 | 500 | $this->savetime = $savetime; |
385 | 501 | } |
386 | 502 | |
| 503 | + /** |
| 504 | + * @return Scroll position of editor when draft was last modified |
| 505 | + */ |
387 | 506 | public function getScrollTop() { |
388 | 507 | return $this->scrolltop; |
389 | 508 | } |
| 509 | + |
| 510 | + /** |
| 511 | + * Sets scroll position of editor when draft was last modified |
| 512 | + * @param integer $scrolltop |
| 513 | + */ |
390 | 514 | public function setScrollTop( |
391 | 515 | $scrolltop |
392 | 516 | ) { |
393 | 517 | $this->scrolltop = $scrolltop; |
394 | 518 | } |
395 | 519 | |
| 520 | + /** |
| 521 | + * @return Text of draft version of article |
| 522 | + */ |
396 | 523 | public function getText() { |
397 | 524 | return $this->text; |
398 | 525 | } |
| 526 | + |
| 527 | + /** |
| 528 | + * Sets text of draft version of article |
| 529 | + * @param string $text |
| 530 | + */ |
399 | 531 | public function setText( |
400 | 532 | $text |
401 | 533 | ) { |
402 | 534 | $this->text = $text; |
403 | 535 | } |
404 | 536 | |
| 537 | + /** |
| 538 | + * @return Summary of changes |
| 539 | + */ |
405 | 540 | public function getSummary() { |
406 | 541 | return $this->summary; |
407 | 542 | } |
| 543 | + |
| 544 | + /** |
| 545 | + * Sets summary of changes |
| 546 | + * @param string $summary |
| 547 | + */ |
408 | 548 | public function setSummary( |
409 | 549 | $summary |
410 | 550 | ) { |
411 | 551 | $this->summary = $summary; |
412 | 552 | } |
413 | 553 | |
| 554 | + /** |
| 555 | + * @return Whether edit is considdered to be a minor change |
| 556 | + */ |
414 | 557 | public function getMinorEdit() { |
415 | 558 | return $this->minoredit; |
416 | 559 | } |
| 560 | + |
| 561 | + /** |
| 562 | + * Sets whether edit is considdered to be a minor change |
| 563 | + * @param boolean $minoredit |
| 564 | + */ |
417 | 565 | public function setMinorEdit( |
418 | 566 | $minoredit |
419 | 567 | ) { |
— | — | @@ -421,6 +569,11 @@ |
422 | 570 | |
423 | 571 | /* Functions */ |
424 | 572 | |
| 573 | + /** |
| 574 | + * Generic constructor |
| 575 | + * @param integer $id[optional] ID to use |
| 576 | + * @param boolean $autoload[optional] Whether to load from database |
| 577 | + */ |
425 | 578 | public function __construct( |
426 | 579 | $id = null, |
427 | 580 | $autoload = true |
— | — | @@ -433,7 +586,10 @@ |
434 | 587 | $this->load(); |
435 | 588 | } |
436 | 589 | } |
437 | | - |
| 590 | + |
| 591 | + /** |
| 592 | + * Selects draft row from database and populates object properties |
| 593 | + */ |
438 | 594 | private function load() { |
439 | 595 | global $wgUser; |
440 | 596 | // Checks if the ID of the draft was set |
— | — | @@ -480,7 +636,10 @@ |
481 | 637 | // Updates state |
482 | 638 | $this->exists = true; |
483 | 639 | } |
484 | | - |
| 640 | + |
| 641 | + /** |
| 642 | + * Inserts or updates draft row in database |
| 643 | + */ |
485 | 644 | public function save() { |
486 | 645 | global $wgUser, $wgRequest; |
487 | 646 | // Gets database connection |
— | — | @@ -541,7 +700,11 @@ |
542 | 701 | // Returns success |
543 | 702 | return true; |
544 | 703 | } |
545 | | - |
| 704 | + |
| 705 | + /** |
| 706 | + * Deletes draft row from database |
| 707 | + * @param integer $user[optional] User ID, defaults to current user ID |
| 708 | + */ |
546 | 709 | public function discard( |
547 | 710 | $user = null |
548 | 711 | ) { |
— | — | @@ -550,7 +713,7 @@ |
551 | 714 | $user = $user === null ? $wgUser : $user; |
552 | 715 | // Gets database connection |
553 | 716 | $dbw = wfGetDB( DB_MASTER ); |
554 | | - // Deletes draft from database (verifying propper user to avoid hacking!) |
| 717 | + // Deletes draft from database verifying propper user to avoid hacking! |
555 | 718 | $dbw->delete( 'drafts', |
556 | 719 | array( |
557 | 720 | 'draft_id' => $this->id, |
Index: trunk/extensions/Drafts/Drafts.pages.php |
— | — | @@ -6,11 +6,13 @@ |
7 | 7 | * @ingroup Extensions |
8 | 8 | */ |
9 | 9 | |
10 | | -// Drafts Special Page |
11 | 10 | class DraftsPage extends SpecialPage { |
12 | 11 | |
13 | 12 | /* Functions */ |
14 | 13 | |
| 14 | + /** |
| 15 | + * Generic constructor |
| 16 | + */ |
15 | 17 | public function __construct() { |
16 | 18 | // Initialize special page |
17 | 19 | SpecialPage::SpecialPage( 'Drafts' ); |
— | — | @@ -18,7 +20,11 @@ |
19 | 21 | wfLoadExtensionMessages( 'Drafts' ); |
20 | 22 | } |
21 | 23 | |
22 | | - public function execute( $par ) { |
| 24 | + /** |
| 25 | + * Executes special page rendering and data processing |
| 26 | + * @param string $sub MediaWiki supplied sub-page path |
| 27 | + */ |
| 28 | + public function execute( $sub ) { |
23 | 29 | global $wgRequest, $wgOut, $wgUser; |
24 | 30 | // Begin output |
25 | 31 | $this->setHeaders(); |
Index: trunk/extensions/Drafts/Drafts.php |
— | — | @@ -18,7 +18,7 @@ |
19 | 19 | |
20 | 20 | // Check environment |
21 | 21 | if ( !defined( 'MEDIAWIKI' ) ) { |
22 | | - echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" ); |
| 22 | + echo( "This is an extension to MediaWiki and cannot be run standalone.\n" ); |
23 | 23 | die( - 1 ); |
24 | 24 | } |
25 | 25 | |
— | — | @@ -70,6 +70,9 @@ |
71 | 71 | // Register article save hook |
72 | 72 | $wgHooks['ArticleSaveComplete'][] = 'DraftHooks::discard'; |
73 | 73 | |
| 74 | +// Updates namespaces and titles of drafts to new locations after moves |
| 75 | +$wgHooks['SpecialMovepageAfterMove'][] = 'DraftHooks::move'; |
| 76 | + |
74 | 77 | // Register controls hook |
75 | 78 | $wgHooks['EditPageBeforeEditButtons'][] = 'DraftHooks::controls'; |
76 | 79 | |
Index: trunk/extensions/Drafts/Drafts.hooks.php |
— | — | @@ -6,20 +6,36 @@ |
7 | 7 | * @ingroup Extensions |
8 | 8 | */ |
9 | 9 | |
10 | | -// Drafts hooks |
11 | 10 | class DraftHooks { |
| 11 | + |
| 12 | + /* Static Functions */ |
| 13 | + |
12 | 14 | /** |
| 15 | + * SpecialMovepageAfterMove hook |
| 16 | + */ |
| 17 | + public static function move( |
| 18 | + $this, |
| 19 | + $ot, |
| 20 | + $nt |
| 21 | + ) { |
| 22 | + // Update all drafts of old article to new article for all users |
| 23 | + Drafts::move( $ot, $nt ); |
| 24 | + // Continue |
| 25 | + return true; |
| 26 | + } |
| 27 | + |
| 28 | + /** |
13 | 29 | * ArticleSaveComplete hook |
14 | 30 | */ |
15 | 31 | public static function discard( |
16 | | - &$article, |
17 | | - &$user, |
18 | | - &$text, |
19 | | - &$summary, |
20 | | - &$m, |
21 | | - &$watchthis, |
22 | | - &$section, |
23 | | - &$flags, |
| 32 | + $article, |
| 33 | + $user, |
| 34 | + $text, |
| 35 | + $summary, |
| 36 | + $m, |
| 37 | + $watchthis, |
| 38 | + $section, |
| 39 | + $flags, |
24 | 40 | $rev |
25 | 41 | ) { |
26 | 42 | global $wgRequest; |
— | — | @@ -38,7 +54,7 @@ |
39 | 55 | * Load draft... |
40 | 56 | */ |
41 | 57 | public static function loadForm( |
42 | | - &$editpage |
| 58 | + $editpage |
43 | 59 | ) { |
44 | 60 | global $wgUser, $wgRequest, $wgOut, $wgTitle, $wgLang; |
45 | 61 | // Check permissions |
— | — | @@ -58,7 +74,8 @@ |
59 | 75 | if ( $wgRequest->getVal( 'action' ) == 'submit' && |
60 | 76 | $wgUser->editToken() == $wgRequest->getText( 'wpEditToken' ) ) |
61 | 77 | { |
62 | | - // If the draft wasn't specified in the url, try using a form-submitted one |
| 78 | + // If the draft wasn't specified in the url, try using a |
| 79 | + // form-submitted one |
63 | 80 | if ( !$draft->exists() ) { |
64 | 81 | $draft = Draft::newFromID( |
65 | 82 | $wgRequest->getIntOrNull( 'wpDraftID' ) |
— | — | @@ -120,14 +137,14 @@ |
121 | 138 | |
122 | 139 | /** |
123 | 140 | * EditFilter hook |
124 | | - * Intercept the saving of an article to detect if the submission was from the non-javascript |
125 | | - * save draft button |
| 141 | + * Intercept the saving of an article to detect if the submission was from |
| 142 | + * the non-javascript save draft button |
126 | 143 | */ |
127 | 144 | public static function interceptSave( |
128 | 145 | $editor, |
129 | 146 | $text, |
130 | 147 | $section, |
131 | | - &$error |
| 148 | + $error |
132 | 149 | ) { |
133 | 150 | global $wgRequest; |
134 | 151 | // Don't save if the save draft button caused the submit |
— | — | @@ -144,8 +161,8 @@ |
145 | 162 | * Add draft saving controls |
146 | 163 | */ |
147 | 164 | public static function controls( |
148 | | - &$editpage, |
149 | | - &$buttons |
| 165 | + $editpage, |
| 166 | + $buttons |
150 | 167 | ) { |
151 | 168 | global $wgUser, $wgTitle, $wgRequest; |
152 | 169 | global $egDraftsAutoSaveWait, $egDraftsAutoSaveTimeout; |
— | — | @@ -210,7 +227,7 @@ |
211 | 228 | array( |
212 | 229 | 'type' => 'hidden', |
213 | 230 | 'name' => 'wpDraftToken', |
214 | | - 'value' => Draft::newToken() |
| 231 | + 'value' => wfGenerateToken() |
215 | 232 | ) |
216 | 233 | ); |
217 | 234 | $buttons['savedraft'] .= Xml::element( 'input', |
Index: trunk/extensions/Drafts/Drafts.js |
— | — | @@ -19,6 +19,10 @@ |
20 | 20 | |
21 | 21 | /* Functions */ |
22 | 22 | |
| 23 | + /** |
| 24 | + * Sets the state of the draft |
| 25 | + * @param {String} newState |
| 26 | + */ |
23 | 27 | this.setState = function( |
24 | 28 | newState |
25 | 29 | ) { |
— | — | @@ -50,10 +54,16 @@ |
51 | 55 | } |
52 | 56 | } |
53 | 57 | |
| 58 | + /** |
| 59 | + * Gets the state of the draft |
| 60 | + */ |
54 | 61 | this.getState = function() { |
55 | 62 | return state; |
56 | 63 | } |
57 | 64 | |
| 65 | + /** |
| 66 | + * Sends draft data to server to be saved |
| 67 | + */ |
58 | 68 | this.save = function() { |
59 | 69 | // Checks if a save is already taking place |
60 | 70 | if ( state == 'saving' ) { |
— | — | @@ -94,6 +104,9 @@ |
95 | 105 | clearTimeout( timer ); |
96 | 106 | } |
97 | 107 | |
| 108 | + /** |
| 109 | + * Updates the user interface to represent being out of sync with the server |
| 110 | + */ |
98 | 111 | this.change = function() { |
99 | 112 | // Sets state to changed |
100 | 113 | self.setState( 'changed' ); |
— | — | @@ -111,6 +124,9 @@ |
112 | 125 | } |
113 | 126 | } |
114 | 127 | |
| 128 | + /** |
| 129 | + * Initializes the user interface |
| 130 | + */ |
115 | 131 | this.initialize = function() { |
116 | 132 | // Cache edit form reference |
117 | 133 | form = document.editform; |
— | — | @@ -145,6 +161,10 @@ |
146 | 162 | } |
147 | 163 | } |
148 | 164 | |
| 165 | + /** |
| 166 | + * Responds to the server after a save request has been handled |
| 167 | + * @param {Object} request |
| 168 | + */ |
149 | 169 | this.respond = function( |
150 | 170 | request |
151 | 171 | ) { |