/[libdata]/trunk/admin/include/scribe_application.php
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/admin/include/scribe_application.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 72 - (hide annotations)
Thu Mar 18 20:33:37 2004 UTC (20 years, 1 month ago) by dpavlin
File size: 98569 byte(s)
changes made in version 2.00

1 dpavlin 18 <?php
2     /**********************************************************
3     Function Library: scribe_application.php
4 dpavlin 72 Original Author: Paul Bramscher <brams006@umn.edu>
5     Last Modified: 03.16.2004
6 dpavlin 18 ***********************************************************
7     Comments:
8     This library brings together all of the SQL actions in
9     the CLPS system. Note that it occasionally relies
10     on app_controls.php and other libraries as well, but these
11     are specific to CLPS.
12     ***********************************************************
13 dpavlin 72 Table of Contents:
14 dpavlin 18 assignPageStaff
15     assignStaffCoordinator
16     copyPasteElement
17     deleteCopyBuffer
18     deleteCoursePers
19     deleteElement
20     deletePage
21     deletePageConfirm
22     deletePageStaff
23     displayTOC
24     elementDown
25     elementMultiFormat
26     elementSize
27     elementUp
28     getMaxIndent
29     insertCoursePers
30     insertScribeLabel
31     insertScribeLocation
32     insertScribeResource
33     insertScribeRQS
34     insertScribeRQSLink
35     insertScribeService
36     insertScribeStaff
37     pageLoadStats
38     pageTemplate
39     pageTemplateConfirm
40     parentIs
41     parentProbe
42     pasteElement
43     populateGenArray
44     scribePublish
45     scribeUnpublish
46     sibProbeElder
47     sibProbeYounger
48     toggleTOCDisplay
49     toggleTOCWrap
50     toggleURLDisplay
51     toggleUpDisplay
52     toggleUpText
53     updatePageDebug
54     updatePageHeader
55     updatePageTitleStyle
56     updateScribeCourse
57     updateScribeCourseConcat
58     updateScribeElement
59     updateScribeHeader
60     updateScribeStyle
61     updateScribeUpdate
62     youngerProbe
63     **********************************************************/
64    
65    
66    
67     /**********************************************************
68     Function: assignPageStaff
69     Author: Paul Bramscher
70 dpavlin 72 Last Modified: 03.03.2004
71 dpavlin 18 ***********************************************************
72     Purpose:
73     Assigns staffpersons (possibly multiple) to a given page
74     and calls the page edit mode back again.
75     **********************************************************/
76 dpavlin 72 function assignPageStaff($page_id, $staff_id_array) {
77 dpavlin 18
78     // For all staff in the array
79     for ($subscript = 0; $subscript < sizeof($staff_id_array); $subscript++ ) {
80    
81     // Check to make sure that the staff isn't already assigned
82     $sql = "SELECT * FROM page_staff where page_id = " . $page_id .
83     " AND staff_id = " . $staff_id_array[$subscript];
84 dpavlin 72 $rs = xx_tryquery($sql);
85 dpavlin 42 if (xx_num_rows($rs) == 0) {
86 dpavlin 18
87     $sql = "INSERT INTO page_staff (page_id, staff_id) VALUES ("
88     . $page_id
89     . ", "
90     . $staff_id_array[$subscript]
91 dpavlin 72 . ")";
92     xx_tryquery($sql);
93 dpavlin 18
94     } // staff not already assigned
95    
96     } // array of staff id's
97    
98     // Call the PageScribe back
99     header("Location: scribe.phtml?page_id=" . $page_id . "&cmd=pagestaff");
100    
101     } // function
102    
103    
104     /**********************************************************
105     Function: assignStaffCoordinator
106     Author: Paul Bramscher
107 dpavlin 72 Last Modified: 03.03.2004
108 dpavlin 18 ***********************************************************
109     Purpose:
110     Assigns a single staff coordinator to a given page and
111     calls the page edit mode back again.
112     **********************************************************/
113 dpavlin 72 function assignStaffCoordinator($page_id, $staff_coordinator) {
114 dpavlin 18
115     $sql = "UPDATE page SET staff_coordinator = "
116     . $staff_coordinator
117     . " WHERE page_id = "
118     . $page_id;
119    
120 dpavlin 72 xx_tryquery ($sql);
121     header("Location: scribe.phtml?page_id=" . $page_id);
122 dpavlin 18 }
123    
124    
125     /**********************************************************
126     Function: copyPasteElement
127     Author: Paul Bramscher
128 dpavlin 72 Last Modified: 03.03.2004
129 dpavlin 18 ***********************************************************
130     Purpose:
131     Copies the supplied element id and descendants (if picked)
132     and inserts them into the user's copy/paste buffer. Any
133     previously copied data is replaced.
134     **********************************************************/
135 dpavlin 72 function copyPasteElement($page_id, $place_array_HTML, $copysingle, $sess_staff_id){
136 dpavlin 18
137     // Split by comma separated values
138     $place_array = split(",", $place_array_HTML);
139    
140     // Break apart place array
141     $element_id = $place_array[0];
142     $element_order = $place_array[1];
143     $indent_level = $place_array[2];
144     $parent_id = $place_array[3];
145     $position = $place_array[4];
146    
147     // First, we delete any previously cut elements from the pastebuffer table
148     $sql = "DELETE FROM pastebuffer WHERE paste_staff_id = "
149     . $sess_staff_id;
150 dpavlin 72 xx_tryquery($sql);
151 dpavlin 18
152     // Element is a parent, and user is copying that element only.
153     if ($copysingle == 1) {
154     $end_element_order = $element_order;
155    
156     }
157    
158     // Copy parent and all descendants. Determine the block of affected rows
159     else {
160    
161     // End order flags
162     $end_found = 0;
163     $end_element_order = $element_order;
164     $last_element_order = $element_order;
165    
166     $sql = "SELECT element_id, indent_level, element_order FROM element where page_id = "
167     . $page_id
168     . " AND element_order > "
169     . $element_order
170     . " ORDER BY element_order";
171 dpavlin 72 $rs = xx_tryquery($sql);
172 dpavlin 18
173     // Check for indent level
174 dpavlin 72 while (($row = xx_fetch_array ($rs, xx_ASSOC)) && ($end_found == 0)) {
175 dpavlin 18
176     $probe_element_id = $row["element_id"];
177     $probe_indent_level = $row["indent_level"];
178     $probe_element_order = $row["element_order"];
179    
180     if ($probe_indent_level <= $indent_level) {
181     $end_element_order = $last_element_order;
182     $end_found = 1;
183     }
184     else $end_element_order = $probe_element_order;
185     $last_element_order = $probe_element_order;
186     //printf("probed element: %d<BR>", $probe_element_id);
187     //printf("probed indent: %d<BR>", $probe_indent_level);
188    
189     } // end of affected elements to copy
190    
191     } // determine last descendant to copy
192    
193     /*
194     Select the block of affected elements and insert them into the pastebuffer table
195     */
196     $sql = "INSERT INTO pastebuffer (
197     paste_staff_id,
198     parent_id,
199     resource_id,
200     location_id,
201     service_id,
202     staff_id,
203     subject_id,
204     indent_level,
205     label,
206     label_url,
207     element_descr,
208     element_size,
209     element_order)
210     SELECT
211     staff.staff_id AS paste_staff_id,
212     parent_id,
213     resource_id,
214     location_id,
215     service_id,
216     element.staff_id,
217     subject_id,
218     indent_level,
219     label,
220     label_url,
221     element_descr,
222     element_size,
223     element_order
224     FROM element, staff
225     WHERE staff.staff_id = "
226     . $sess_staff_id
227     . " AND page_id = "
228     . $page_id
229     . " AND element_order >="
230     . $element_order
231     . " AND element_order <="
232     . $end_element_order
233     . " ORDER BY element_order";
234    
235 dpavlin 72 xx_tryquery($sql);
236 dpavlin 18 header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
237    
238     } // end function
239    
240    
241     /**********************************************************
242     Function: deleteCopyBuffer
243     Author: Paul Bramscher
244 dpavlin 72 Last Modified: 03.03.2004
245 dpavlin 18 ***********************************************************
246     Purpose:
247     Clears the user's copy/paste buffer.
248     **********************************************************/
249 dpavlin 72 function deleteCopyBuffer($page_id, $paste_staff_id){
250 dpavlin 18
251     $sql = "DELETE from pastebuffer WHERE paste_staff_id = "
252     . $paste_staff_id;
253 dpavlin 72 xx_tryquery($sql);
254 dpavlin 18 header("Location: scribe.phtml?page_id=". $page_id);
255     }
256    
257    
258     /**********************************************************
259     Function: deleteCoursePers
260     Author: Paul Bramscher
261 dpavlin 72 Last Modified: 03.03.2004
262 dpavlin 18 ***********************************************************
263     Purpose:
264     Deletes the supplied personnel id from the course.
265     **********************************************************/
266 dpavlin 72 function deleteCoursePers($course_id, $page_id, $personnel_id){
267 dpavlin 18
268     // Build the sql.
269     $sql = "DELETE from course_personnel WHERE personnel_id = "
270     . $personnel_id
271     . " AND course_id = "
272     . $course_id;
273 dpavlin 72 xx_tryquery($sql);
274 dpavlin 18 header("Location: scribe.phtml?page_id=". $page_id);
275     }
276    
277    
278     /**********************************************************
279     Function: deleteElement
280     Author: Paul Bramscher
281 dpavlin 72 Last Modified: 03.03.2004
282 dpavlin 18 ***********************************************************
283     Purpose:
284     Deletes the supplied element id. Depending on user selection,
285     all descendants are also deleted, or else promoted to the
286     generation of the deleted parent.
287    
288     This function also deletes references to the affected element,
289     and any removed descendants, from the libstats statistics
290     table.
291     **********************************************************/
292 dpavlin 72 function deleteElement($page_id, $place_array_HTML, $promote){
293 dpavlin 18
294     // Split by comma separated values
295     $place_array = split(",", $place_array_HTML);
296    
297     // Break apart place array
298     $element_id = $place_array[0];
299     $element_order = $place_array[1];
300     $indent_level = $place_array[2];
301     $parent_id = $place_array[3];
302     $position = $place_array[4];
303    
304    
305     /* Incoming promote parameters
306     0: no children
307     1: children present, promote them
308     2: children present, delete them
309     */
310    
311    
312     /********************************************************
313     ** Item is singular, no children. Simple delete case. **
314     ********************************************************/
315    
316     if ($promote == 0) {
317    
318     // First delete the element
319     $sql = "DELETE from element WHERE page_id = "
320     . $page_id
321     . " AND element_id = "
322     . $element_id;
323 dpavlin 72 xx_tryquery($sql);
324 dpavlin 18
325     // Next, update the order of the remainders
326 dpavlin 72 $sql = "UPDATE element SET element_order = element_order - 1 WHERE page_id = "
327     . $page_id
328     . " AND element_order > "
329     . $element_order;
330     xx_tryquery($sql);
331 dpavlin 18
332     // Last, delete the element reference from the stats database
333 dpavlin 72 $sql = "DELETE from libstats.elementstats WHERE page_id = "
334     . $page_id
335     . " AND element_id = "
336     . $element_id;
337     xx_tryquery($sql);
338 dpavlin 18
339 dpavlin 72 // Done, return to page
340     if ($position > 2) $new_pos = $position - 1;
341     else $new_pos = 1;
342     header("Location: scribe.phtml?page_id=". $page_id . "#p" . $new_pos);
343 dpavlin 18
344     } // end simple delete
345    
346    
347     /*************************************
348     ** Delete element, promote children **
349     *************************************/
350    
351     else if ($promote == 1) {
352    
353     // Success flag
354     $success = 1;
355    
356     // Intialize first descendant indent level to proper value
357     $desc_indent_level = $indent_level + 1;
358    
359     /*
360     First, we need to march through the records, starting at the
361     first child. We need to decrease all indent levels by one. When
362     we arrive at an indent level equal to the parent's, it is a sibling
363     (of the parent) and we stop.
364     */
365    
366     $sql = "SELECT element_id, parent_id, indent_level, element_order FROM element WHERE page_id = "
367     . $page_id
368     . " AND element_order > "
369     . $element_order
370     . " ORDER BY element_order";
371 dpavlin 72 $rs = xx_tryquery($sql);
372 dpavlin 18
373     // Check for and promote all descendants
374 dpavlin 72 while (($row = xx_fetch_array ($rs, xx_ASSOC)) && ($desc_indent_level > $indent_level)) {
375 dpavlin 18 $desc_element_id = $row["element_id"];
376     $desc_parent_id = $row["parent_id"];
377     $desc_indent_level = $row["indent_level"];
378    
379     // We've found a descendant, alter the indent level
380     if ($desc_indent_level > $indent_level) {
381     $promote_sql = "UPDATE element SET indent_level = indent_level - 1 WHERE page_id = "
382     . $page_id
383     . " AND element_id = "
384     . $desc_element_id;
385 dpavlin 72 xx_tryquery($promote_sql);
386 dpavlin 18
387     } // end of check for one descendant
388    
389    
390     /*
391     Reset the parent ID on the immediate first-generation children.
392     Note that at this point they have the same indent level as their
393     parent in the database, but differ here in PHP.
394     */
395    
396     if ($desc_indent_level == $indent_level + 1) {
397    
398     $newparent_sql = "UPDATE element SET parent_id = "
399     . $parent_id
400     . " WHERE page_id = "
401     . $page_id
402     . " AND element_id = "
403     . $desc_element_id;
404 dpavlin 72 xx_tryquery($newparent_sql);
405 dpavlin 18
406     } // end check for first generation children
407    
408     } // end check for all descendants
409    
410     // Next, delete the parent
411 dpavlin 72 $parent_sql = "DELETE FROM element WHERE element_id = "
412     . $element_id;
413     xx_tryquery($parent_sql);
414    
415     // Increment the deleted counter to include the parent
416     $num_desc++;
417 dpavlin 18
418     // Next, update the order of the remainders
419 dpavlin 72 $order_sql = "UPDATE element SET element_order = element_order - 1 WHERE page_id = "
420     . $page_id
421     . " AND element_order > "
422     . $element_order;
423     xx_tryquery($order_sql);
424 dpavlin 18
425     // Last, delete the (parent) element reference from the stats database
426 dpavlin 72 $sql = "DELETE from libstats.elementstats WHERE page_id = "
427     . $page_id
428     . " AND element_id = "
429     . $element_id;
430     xx_tryquery($sql);
431 dpavlin 18
432 dpavlin 72 // Done, return to page
433     if ($position > 2) $new_pos = $position - 1;
434     else $new_pos = 1;
435     header("Location: scribe.phtml?page_id=". $page_id . "#p" . $new_pos);
436 dpavlin 18
437     } // end delete and promote
438    
439    
440     /********************************
441     ** Delete element and children **
442     ********************************/
443    
444    
445     else if ($promote == 2) {
446    
447     // Intialize first descendant indent level to proper value
448     $desc_indent_level = $indent_level + 1;
449     $num_desc = 0;
450    
451     /* First, we need to march through the records, starting at the
452     first child, and purge any with an indent level equal to or
453     greater than the first child. When we reach an indent level
454     equal to the parent, we are now dealing with a sibling (of
455     the parent) and stop. It may possible to do this recursively,
456     but it might involve more SQL's and probably represent less
457     clear logic.
458     */
459    
460     $sql = "SELECT element_id, parent_id, indent_level, element_order FROM element WHERE page_id = "
461     . $page_id
462     . " AND element_order > "
463     . $element_order
464     . " ORDER BY element_order";
465 dpavlin 72 $rs = xx_tryquery($sql);
466 dpavlin 18
467     // Check for and delete all descendants
468 dpavlin 72 while (($row = xx_fetch_array ($rs, xx_ASSOC)) && ($desc_indent_level > $indent_level)) {
469 dpavlin 18 $desc_element_id = $row["element_id"];
470     $desc_parent_id = $row["parent_id"];
471     $desc_indent_level = $row["indent_level"];
472    
473     // We've found a descendant, delete it
474     if ($desc_indent_level > $indent_level) {
475     $delete_sql = "DELETE FROM element WHERE element_id = "
476 dpavlin 72 . $desc_element_id;
477     xx_tryquery($delete_sql);
478 dpavlin 18
479 dpavlin 72 // Increment the deleted descendant counter
480     $num_desc++;
481    
482 dpavlin 18 } // end of check for one descendant
483    
484     // Delete this (descendant) element reference from the stats database
485 dpavlin 72 $sql = "DELETE from libstats.elementstats WHERE page_id = "
486     . $page_id
487     . " AND element_id = "
488     . $desc_element_id;
489     xx_tryquery($sql);
490 dpavlin 18
491     } // end check for all descendants
492    
493     // Delete the parent itself
494 dpavlin 72 $parent_sql = "DELETE FROM element WHERE element_id = "
495     . $element_id;
496     xx_tryquery($parent_sql);
497 dpavlin 18
498 dpavlin 72 // Increment the deleted counter to include the parent
499     $num_desc++;
500 dpavlin 18
501     // Next, update the order of the remainders
502 dpavlin 72 $order_sql = "UPDATE element SET element_order = element_order - "
503     . $num_desc
504     . " WHERE page_id = "
505     . $page_id
506     . " AND element_order > "
507     . $element_order;
508     xx_tryquery($order_sql);
509 dpavlin 18
510     // Last, delete the (parent) element reference from the stats database
511 dpavlin 72 $sql = "DELETE from libstats.elementstats WHERE page_id = "
512     . $page_id
513     . " AND element_id = "
514     . $element_id;
515     xx_tryquery($sql);
516 dpavlin 18
517 dpavlin 72 // Done, return to page
518     if ($position > 2) $new_pos = $position - 1;
519     else $new_pos = 1;
520     header("Location: scribe.phtml?page_id=". $page_id . "#p" . $new_pos);
521 dpavlin 18
522     } // end delete parent and children
523    
524     } // end function
525    
526    
527     /**********************************************************
528     Function: deletePage
529     Author: Paul Bramscher
530 dpavlin 72 Last Modified: 03.16.2004
531 dpavlin 18 ***********************************************************
532     Purpose:
533     Deletes the supplied page id. In doing so, elements,
534     assigned page staff, course information, assigned course
535     personnel, and the page itself are deleted.
536    
537     This function also deletes any references to the supplied
538     page id in the libstats database, including element-level
539     and overall page statistics.
540     **********************************************************/
541 dpavlin 72 function deletePage($page_id){
542 dpavlin 18
543     // Load globals
544     include("global_vars.php");
545    
546     // Include the page header
547     include ($GLOBAL_ADMIN_INC."scribe_header.phtml");
548    
549 dpavlin 72 // HTML header
550 dpavlin 18 printf("<html>\n");
551     printf("<head>\n");
552     printf("<title>PageScribe: Deleting page...</title>\n");
553     printf("<link rel=\"stylesheet\" href=\"%s\" type=\"text/css\">\n", $GLOBAL_ADMIN_CSS);
554 dpavlin 72 printf("</head>\n");
555 dpavlin 18
556 dpavlin 72 msgTableOpen(1, "Deleting Page (ID# " . $page_id . ")");
557     printf("<b>Messages:</b><br>\n");
558 dpavlin 18
559     // Purge all
560     if ($page_id > 0) {
561    
562     // Initialize
563     $course_id = 0;
564    
565     // First identify whether this is a CourseLib page. If so, collect the course id.
566     $sql = "SELECT course_id FROM course WHERE page_id = "
567     . $page_id;
568    
569 dpavlin 72 $rs = xx_tryquery($sql);
570     $row = xx_fetch_array ($rs, xx_ASSOC);
571 dpavlin 18
572     // Collect the access information
573     $course_id = $row["course_id"];
574    
575     // Delete all elements first
576     $sql = "DELETE from element WHERE page_id =" . $page_id;
577 dpavlin 72 if (xx_tryquery ($sql)) printf("Removed this page's elements.<BR>\n");
578 dpavlin 18
579 dpavlin 72 // Delete course information, if any
580     $sql = "DELETE from course WHERE page_id =" . $page_id;
581     if (xx_tryquery ($sql)) printf("Removed course information (if any).<BR>\n");
582 dpavlin 18
583     // Delete assigned course personnel, if any
584 dpavlin 72 if ($course_id > 0) {
585 dpavlin 18
586     $sql = "DELETE from course_personnel WHERE course_id =" . $course_id;
587 dpavlin 72 if (xx_tryquery ($sql)) printf("Removed assigned course personnel (if any).<BR>\n");
588 dpavlin 18 }
589    
590     // Delete assigned staff, if any
591 dpavlin 72 $sql = "DELETE from page_staff WHERE page_id =" . $page_id;
592     if (xx_tryquery ($sql)) printf("Removed assigned staff (if any).<BR>\n");
593 dpavlin 18
594     // Delete assigned subjects, if any
595 dpavlin 72 $sql = "DELETE from sub_page WHERE page_id =" . $page_id;
596     if (xx_tryquery ($sql)) printf("Removed assigned subjects (if any).<BR>\n");
597 dpavlin 18
598     // Delete element statistics, if any
599 dpavlin 72 $sql = "DELETE from libstats.elementstats WHERE page_id =" . $page_id;
600     if (xx_tryquery ($sql)) printf("Removed page's element statistics (if any).<BR>\n");
601 dpavlin 18
602     // Delete page overall statistics, if any
603 dpavlin 72 $sql = "DELETE from libstats.pagestats WHERE page_id =" . $page_id;
604     if (xx_tryquery ($sql)) printf("Removed page's overall statistics (if any).<BR>\n");
605 dpavlin 18
606     // Delete the page information
607 dpavlin 72 $sql = "DELETE from page WHERE page_id =" . $page_id;
608     if (xx_tryquery ($sql)) printf("Removed page successfully.");
609 dpavlin 18
610     }
611 dpavlin 72 else printf("Scribe page not found.");
612 dpavlin 18
613 dpavlin 72 printf("<br><br>\n");
614     msgTableClose();
615 dpavlin 18
616     // Link to return to admin console
617 dpavlin 72 adminReturn("");
618 dpavlin 18
619     // Include the footer
620     include ($GLOBAL_ADMIN_INC."scribe_footer.phtml");
621     }
622    
623    
624     /**********************************************************
625     Function: deletePageConfirm
626     Author: Paul Bramscher
627 dpavlin 72 Last Modified: 03.16.2004
628 dpavlin 18 ***********************************************************
629     Purpose:
630     Confirm prompt to delete the supplied page id.
631     **********************************************************/
632 dpavlin 72 function deletePageConfirm($page_id){
633 dpavlin 18
634     // Load globals
635     include ("global_vars.php");
636    
637     // Make sure we have a valid integer type
638     $page_id = (int) $page_id;
639    
640     // Include the page header
641     include ($GLOBAL_ADMIN_INC."scribe_header.phtml");
642    
643 dpavlin 72 // HTML header
644 dpavlin 18 printf("<html>\n");
645     printf("<head>\n");
646     printf("<title>PageScribe: Delete Page?</title>\n");
647     printf("<link rel=\"stylesheet\" href=\"%s\" type=\"text/css\">\n", $GLOBAL_ADMIN_CSS);
648 dpavlin 72 printf("</head>\n");
649 dpavlin 18
650 dpavlin 72 msgTableOpen(1, "Delete Page (ID# " . $page_id . ")?");
651 dpavlin 18
652     // Check to see if its possible
653 dpavlin 72 $exists = existsRow("page", "page_id", $page_id);
654 dpavlin 18 if ($exists > 0){
655    
656     // Lookup the title & author
657 dpavlin 72 $page_title = lookupField("page", "page_id", $page_id, "page_title");
658     printf("<b>Page Title:</b> %s<br><br>\n ", $page_title);
659     printf("This will permanently remove the page and its various assignments from the system.<br><br>\n");
660 dpavlin 18
661     // Form to draw the delete button
662     printf("<form method = \"POST\" action = \"scribe_transaction.phtml\" >\n");
663     printf("<input type = \"Hidden\" name = \"transaction\" value = \"deletePage\" >\n");
664     printf("<input type = \"Hidden\" name = \"page_id\" value = \"%d\" >\n", $page_id);
665     printf("<center>\n");
666    
667     // Interior table
668     printf("<table border=\"0\">\n");
669    
670     printf("<tr><td>\n");
671     printf("<input type =\"Submit\" value=\"Delete!\">\n");
672     printf("</center>\n");
673     printf("</form>\n");
674     printf("</td>\n");
675    
676     // Cancel button
677     printf("<td>\n");
678     printf("<form method=\"POST\" action=\"scribe.phtml?page_id=%d\">\n", $page_id);
679     printf("<input type=\"hidden\" name=\"cmd\" value=\"\">\n");
680     printf("<input type=\"submit\" value=\"Cancel\">\n");
681     printf("</form>\n");
682     printf("</td></tr>\n");
683    
684     // Close interior table
685     printf("</table>\n");
686     }
687    
688 dpavlin 72 // Failed
689     else if ($exists < 1) printf ("Page not found. Operation cancelled.<br><br>\n");
690 dpavlin 18
691 dpavlin 72 msgTableClose();
692 dpavlin 18
693     // Link to return to admin console
694     adminReturn("");
695    
696     // Include the footer
697     include ($GLOBAL_ADMIN_INC."scribe_footer.phtml");
698     }
699    
700    
701     /**********************************************************
702     Function: deletePageStaff
703     Author: Paul Bramscher
704 dpavlin 72 Last Modified: 03.03.2004
705 dpavlin 18 ***********************************************************
706     Purpose:
707     Delete a staffperson (possibly multiple) associated with
708     the supplied page id.
709     **********************************************************/
710 dpavlin 72 function deletePageStaff($page_id, $staff_list_array){
711 dpavlin 18
712     for ($element = 0; $element < sizeof($staff_list_array); $element++) {
713     $sql = "DELETE FROM page_staff where page_id = " . $page_id .
714 dpavlin 72 " AND staff_id = " . $staff_list_array[$element];
715 dpavlin 18
716 dpavlin 72 xx_tryquery($sql);
717 dpavlin 18 }
718    
719     // Call the PageScribe page back
720     header("Location: scribe.phtml?page_id=" . $page_id . "&cmd=pagestaff");
721     }
722    
723    
724     /**********************************************************
725     Function: displayTOC
726     Author: Paul Bramscher
727 dpavlin 72 Last Modified: 03.03.2004
728 dpavlin 18 ***********************************************************
729     Purpose:
730     Generates and displays a table of contents (TOC) for the
731     supplied page id. This is done dynamically, and uses
732     root-level elements on the given page.
733    
734     This function allows for the optional display of a
735     two-column table of contents, split at the midpoint
736     (rounded up for odd numbers of root elements).
737     **********************************************************/
738 dpavlin 72 function displayTOC($page_id, $wrap_toc) {
739 dpavlin 18
740     // Calculate number of elements
741     $sql = "SELECT COUNT(*) as num_elements FROM element WHERE indent_level < 1 AND page_id = "
742     . $page_id;
743 dpavlin 72 $rs = xx_tryquery($sql);
744     $row = xx_fetch_array ($rs, xx_ASSOC);
745 dpavlin 18 $num_elements = $row["num_elements"];
746    
747     // Calculate midpoint element
748     if ($num_elements > 0) $midpoint = ceil($num_elements / 2);
749     else $midpoint = 0;
750    
751     if ($num_elements > 0) {
752    
753     // Retrieve all elements on that page
754     $sql = "SELECT
755     e.element_id,
756     e.label,
757     r.resource_id,
758     r.title,
759     l.location_id,
760     l.location,
761     v.service_id,
762     v.service,
763     s.staff_id,
764     s.last_name,
765     s.first_name,
766     b.subject_id,
767     b.subject
768    
769     FROM
770     page p
771     LEFT JOIN element e using (page_id)
772     LEFT JOIN resource r on e.resource_id = r.resource_id
773     LEFT JOIN location l on e.location_id = l.location_id
774     LEFT JOIN service v on e.service_id = v.service_id
775     LEFT JOIN staff s on e.staff_id = s.staff_id
776     LEFT JOIN subject b on e.subject_id = b.subject_id
777    
778     WHERE
779     p.page_id = "
780     . $page_id
781     . " AND e.indent_level < 1 ORDER BY e.element_order";
782    
783 dpavlin 72 $rs = xx_tryquery($sql);
784 dpavlin 18
785     // Build a general ToC anchor
786     printf("<a name=\"toc\"></a>\n");
787     printf("<b>Table of Contents:</b><br>\n");
788     printf("<table>\n");
789    
790     // Build the (single) row
791     printf("<tr>\n");
792    
793     // Populate the left cell
794     printf("<td valign=\"top\"><ul>\n");
795    
796     $row_num = 0;
797    
798 dpavlin 72 while ($row = xx_fetch_array ($rs, xx_ASSOC)) {
799 dpavlin 18
800     // Check for the midpoint
801     if ($wrap_toc == 1)
802     if ($row_num == $midpoint) {
803    
804     // Close the ul tag & table cell
805     printf("</ul>\n");
806     printf("</td>\n");
807    
808     // Start a new one
809     printf("<td valign=\"top\">\n");
810     printf("<ul>\n");
811    
812     }
813    
814     // General
815     $element_id = $row["element_id"];
816    
817     // Resource
818     $resource_id = $row["resource_id"];
819     $title = $row["title"];
820    
821     // Label/unique
822     $label = $row["label"];
823    
824     // Location
825     $location_id = $row["location_id"];
826     $location = $row["location"];
827    
828     // Service
829     $service_id = $row["service_id"];
830     $service = $row["service"];
831    
832     // Staff
833     $staff_id = $row["staff_id"];
834     $last_name = $row["last_name"];
835     $first_name = $row["first_name"];
836    
837     // Subject
838     $subject_id = $row["subject_id"];
839     $subject = $row["subject"];
840    
841     // Determine what sort of element it is
842     $toc_label = "";
843     if ($resource_id > 0) $toc_label = $title;
844     else if (strlen($label) > 0) $toc_label = $label;
845     else if ($location_id > 0) $toc_label = $location;
846     else if ($service_id > 0) $toc_label = $service;
847     else if ($staff_id > 0) $toc_label = $first_name . " " . $last_name;
848     else if ($subject_id > 0) $toc_label = $subject;
849    
850     // Last-minute error check
851     if (strlen($toc_label) > 0) printf("<li><a href=\"#toc%d\">%s</a></li>\n", $element_id, $toc_label);
852    
853     $row_num++;
854    
855     } // end elements
856    
857     // Close things
858     printf("</ul>\n");
859     printf("</td></tr></table><br>\n");
860    
861    
862     } // at least one item on this page
863     }
864    
865    
866     /**********************************************************
867     Function: elementDown
868     Author: Paul Bramscher
869 dpavlin 72 Last Modified: 03.04.2004
870 dpavlin 18 ***********************************************************
871     Incoming:
872     $element_id Element to move down
873     $page_id Page the element is location on
874     $position Position on the page
875     ***********************************************************
876     Outgoing:
877     None
878     ***********************************************************
879     Purpose:
880     Moves a selected element (and any descendants) down to the
881     position of the next youngest sibling. The sibling (and
882     any of its descendants are moved up). The main challenge in
883     the algorithm is the final shuffling phase since it's not
884     possible move affected elements down, and then move the
885     other affected elements up -- since they are selected by
886     their order and duplicate positions will be created this
887     way. Therefore, they are moved and written individually
888     within the same recordset. One alternative would be to
889     assign the "down set" temporary orders, over the current
890     maximum, move the "up set" up, then re-assign the "down set"
891     to its position. With the next iteration, perhaps...
892     **********************************************************/
893    
894 dpavlin 72 function elementDown($element_id, $page_id, $position) {
895 dpavlin 18
896     // Get information about the element to move down
897     $sql = "SELECT indent_level, parent_id, element_order FROM element WHERE page_id = "
898     . $page_id
899     . " AND element_id = "
900     . $element_id;
901 dpavlin 72 $rs = xx_tryquery($sql);
902     $row = xx_fetch_array ($rs, xx_ASSOC);
903 dpavlin 18 $down_indent_level = $row["indent_level"];
904     $down_element_order = $row["element_order"];
905    
906     // Identify information about the element to move up
907     $sql = "SELECT element_id, element_order, indent_level FROM element WHERE page_id = "
908     . $page_id
909     . " AND indent_level = "
910     . $down_indent_level
911     . " AND element_order > "
912     . $down_element_order
913     . " ORDER BY element_order";
914    
915 dpavlin 72 $rs = xx_tryquery($sql);
916     $row = xx_fetch_array ($rs, xx_ASSOC);
917 dpavlin 18 $up_element_id = $row["element_id"];
918     $up_element_order = $row["element_order"];
919    
920     /*
921     Determine number of affected children to move down. Note that we count the
922     number of elements from the starting position with an indent level of greater
923     than the starting indent level (they are descendents) up to the position of the
924     first younger sibling. Then we add the element itself.
925     */
926    
927     $sql = "SELECT COUNT(*) as down_num FROM element WHERE page_id = "
928     . $page_id
929     . " AND element_order > "
930     . $down_element_order
931     . " AND indent_level > "
932     . $down_indent_level
933     . " AND element_order < "
934     . $up_element_order;
935    
936 dpavlin 72 $rs = xx_tryquery($sql);
937     $row = xx_fetch_array ($rs, xx_ASSOC);
938 dpavlin 18 $down_num = $row["down_num"];
939    
940     // Add the element itself
941     $down_num++;
942    
943     /*
944     Determine number of elements which will be moved up. Note that we need to
945     probe until we hit the next sibling or older generation element.
946     */
947    
948     $sql = "SELECT element_id, indent_level, element_order FROM element WHERE page_id = "
949     . $page_id
950     . " AND element_order > "
951     . $up_element_order
952     . " ORDER BY element_order";
953    
954 dpavlin 72 $rs = xx_tryquery($sql);
955 dpavlin 18
956     // Flag to determine the end of this element's lineage
957     $lineage = 1;
958    
959     /*
960     Initialize the last affected element to be the next sibling. It may be overwritten
961     the sibling's last descendant (if any).
962     */
963    
964     $stop_element_order = $up_element_order;
965     $stop_element_id = $up_element_id;
966    
967     // Number of descendants
968     $up_num = 0;
969    
970     /*
971     March through the list looking for all descendants. Take note of the last
972     descendant affected by a move.
973     */
974    
975 dpavlin 72 while (($row = xx_fetch_array ($rs, xx_ASSOC)) && $lineage == 1) {
976 dpavlin 18 $desc_element_id = $row["element_id"];
977     $desc_indent_level = $row["indent_level"];
978     $desc_element_order = $row["element_order"];
979    
980     if ($desc_indent_level > $down_indent_level) {
981     $up_num++;
982     $stop_element_id = $desc_element_id;
983     $stop_element_order = $desc_element_order;
984     }
985     else {
986     $lineage = 0;
987     }
988     }
989    
990     // Add the younger sibling itself
991     $up_num++;
992    
993     // Flag to determine whether to move down (1) or up (0)
994     $move_down = 1;
995    
996     // Begin the update process. Create a recordset of all affected elements.
997     $sql = "SELECT element_id, indent_level, element_order FROM element WHERE page_id = "
998     . $page_id
999     . " AND element_order >= "
1000     . $down_element_order
1001     . " AND element_order <= "
1002     . $stop_element_order
1003     . " ORDER BY element_order";
1004 dpavlin 72 $rs = xx_tryquery($sql);
1005 dpavlin 18
1006 dpavlin 72 while ($row = xx_fetch_array ($rs, xx_ASSOC)) {
1007 dpavlin 18 $mod_element_id = $row["element_id"];
1008     $mod_indent_level = $row["indent_level"];
1009     $mod_element_order = $row["element_order"];
1010    
1011     /*
1012     When we've moved the selected elements down, we switch operations and move
1013     the others up.
1014     */
1015    
1016     if ($mod_element_id == $up_element_id) $move_down = 0;
1017    
1018     if ($move_down == 1) {
1019     $new_order = $mod_element_order + $up_num;
1020     //printf("move element %d down %d spaces -- %d<BR>", $mod_element_id, $up_num, $new_order);
1021     }
1022     else {
1023     $new_order = $mod_element_order - $down_num;
1024     //printf("move element %d up %d spaces -- %d<BR>", $mod_element_id, $down_num, $new_order);
1025     }
1026    
1027     $mod_sql = "UPDATE element SET element_order = "
1028     . $new_order
1029     . " WHERE page_id = "
1030     . $page_id
1031     . " AND element_id = "
1032     . $mod_element_id;
1033 dpavlin 72 xx_tryquery($mod_sql);
1034 dpavlin 18
1035     } // all affected elements
1036    
1037     /*
1038     Note: This part is somewhat a kludge. It typically comes out close,
1039     but not exact due to the latest scribe engine. Should do some more
1040     refinement here.
1041    
1042     Position is calculated by N + 2(N - 1) where N = element position.
1043     We also need to add (3X - 1) of the downset, where X is the number of
1044     children moved up.
1045     */
1046    
1047     // Position is calculated by N + 2(N - 1) where N = element position.
1048     // We also need to add the number of elements Z * 3.
1049     $position = $position + (3 * $up_num);
1050    
1051     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1052    
1053     }
1054    
1055 dpavlin 72
1056 dpavlin 18 /**********************************************************
1057     Function: elementMultiFormat
1058     Author: Paul Bramscher
1059 dpavlin 72 Last Modified: 03.03.2004
1060 dpavlin 18 ***********************************************************
1061     Incoming:
1062     $auto_font_style Corresponds to 0-5 CSS style styles
1063     $auto_indent_level Indent level upon which to apply
1064     the changes.
1065     $page_id Affected CourseLib/PageScribe page
1066     ***********************************************************
1067     Outgoing:
1068     None
1069     ***********************************************************
1070     Purpose:
1071     Performs a sweep-style format, changing all elements at a
1072     particular indent level to the selected size on the
1073     supplied page id.
1074     **********************************************************/
1075 dpavlin 72 function elementMultiFormat($auto_element_size, $auto_indent_level, $page_id){
1076 dpavlin 18
1077     // Build the SQL
1078     $sql = "UPDATE element SET element_size = "
1079     . $auto_element_size
1080     . " WHERE page_id = "
1081     . $page_id
1082     . " AND indent_level = "
1083     . $auto_indent_level;
1084 dpavlin 72 xx_tryquery($sql);
1085     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1086 dpavlin 18
1087     }
1088    
1089    
1090     /**********************************************************
1091     Function: elementSize
1092     Author: Paul Bramscher
1093 dpavlin 72 Last Modified: 03.03.2004
1094 dpavlin 18 ***********************************************************
1095     Incoming:
1096     $element_id Element to perform decrease on
1097     $page_id Page the element is location on
1098     $position Position on the page
1099     $size Value 1-5 of the element size to
1100     utilize.
1101     ***********************************************************
1102     Outgoing:
1103     None
1104     ***********************************************************
1105     Purpose:
1106     Changes the size code for the specified element. Values
1107     less than 1 are treated as 0, greater than 5 is treated as
1108     5. This function is meant to deprecate the elementIncrease()
1109     and elementDecrease() pair of functions.
1110     **********************************************************/
1111 dpavlin 72 function elementSize($element_id, $page_id, $position, $size){
1112 dpavlin 18
1113     // Error trap
1114     if ($size < 1) $size = 0;
1115     if ($size > 5) $size = 5;
1116    
1117     $sql = "UPDATE element SET element_size = "
1118     . $size
1119     . " WHERE page_id = "
1120     . $page_id
1121     . " AND element_id = "
1122     . $element_id;
1123 dpavlin 72 xx_tryquery($sql);
1124     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1125 dpavlin 18 }
1126    
1127    
1128     /**********************************************************
1129     Function: elementUp
1130     Author: Paul Bramscher
1131 dpavlin 72 Last Modified: 03.03.2004
1132 dpavlin 18 ***********************************************************
1133     Incoming:
1134     $element_id Element to move up
1135     $page_id Page the element is location on
1136     $position Position on the page
1137     ***********************************************************
1138     Outgoing:
1139     None
1140     ***********************************************************
1141     Purpose:
1142     Similar to elementDown, but differs since the user-selected
1143     element is the "up set" rather than the "down set". See
1144     comments under elementDown for further information.
1145     **********************************************************/
1146 dpavlin 72 function elementUp($element_id, $page_id, $position) {
1147 dpavlin 18
1148     // Get information about the element to move up
1149     $sql = "SELECT indent_level, parent_id, element_order FROM element WHERE page_id = "
1150     . $page_id
1151     . " AND element_id = "
1152     . $element_id;
1153 dpavlin 72 $rs = xx_tryquery($sql);
1154     $row = xx_fetch_array ($rs, xx_ASSOC);
1155 dpavlin 18 $up_indent_level = $row["indent_level"];
1156     $up_element_order = $row["element_order"];
1157    
1158     // Identify information about the element which will move down
1159     $sql = "SELECT element_id, element_order, indent_level FROM element WHERE page_id = "
1160     . $page_id
1161     . " AND indent_level = "
1162     . $up_indent_level
1163     . " AND element_order < "
1164     . $up_element_order
1165     . " ORDER BY element_order DESC";
1166    
1167 dpavlin 72 $rs = xx_tryquery($sql);
1168     $row = xx_fetch_array ($rs, xx_ASSOC);
1169 dpavlin 18 $down_element_id = $row["element_id"];
1170     $down_element_order = $row["element_order"];
1171    
1172     /*
1173     Determine number of affected children to move down. Note that we count the
1174     number of elements from the starting position with an indent level of greater
1175     than the starting indent level (they are descendents) up to the position of the
1176     first younger sibling. Then we add the element itself.
1177     */
1178    
1179     $sql = "SELECT COUNT(*) as down_num FROM element WHERE page_id = "
1180     . $page_id
1181     . " AND element_order > "
1182     . $down_element_order
1183     . " AND indent_level > "
1184     . $up_indent_level
1185     . " AND element_order < "
1186     . $up_element_order;
1187    
1188 dpavlin 72 $rs = xx_tryquery($sql);
1189     $row = xx_fetch_array ($rs, xx_ASSOC);
1190 dpavlin 18 $down_num = $row["down_num"];
1191    
1192     // Add the element itself
1193     $down_num++;
1194    
1195     /*
1196     Determine number of elements which will be moved up. Note that we need to
1197     probe until we hit the next sibling or older generation element.
1198     */
1199    
1200     $sql = "SELECT element_id, indent_level, element_order FROM element WHERE page_id = "
1201     . $page_id
1202     . " AND element_order > "
1203     . $up_element_order
1204     . " ORDER BY element_order";
1205 dpavlin 72 $rs = xx_tryquery($sql);
1206 dpavlin 18
1207     // Flag to determine the end of this element's lineage
1208     $lineage = 1;
1209    
1210     /*
1211     Initialize the last affected element to be the next sibling. It may be overwritten
1212     the sibling's last descendant (if any).
1213     */
1214    
1215     $stop_element_order = $up_element_order;
1216     $stop_element_id = $up_element_id;
1217    
1218     // Number of descendants
1219     $up_num = 0;
1220    
1221     /*
1222     March through the list looking for all descendants. Take note of the last
1223     descendant affected by a move.
1224     */
1225    
1226 dpavlin 72 while (($row = xx_fetch_array ($rs, xx_ASSOC)) && $lineage == 1) {
1227 dpavlin 18 $desc_element_id = $row["element_id"];
1228     $desc_indent_level = $row["indent_level"];
1229     $desc_element_order = $row["element_order"];
1230    
1231     if ($desc_indent_level > $up_indent_level) {
1232     $up_num++;
1233     $stop_element_id = $desc_element_id;
1234     $stop_element_order = $desc_element_order;
1235     }
1236     else {
1237     $lineage = 0;
1238     }
1239     }
1240    
1241     // Add the younger sibling itself
1242     $up_num++;
1243    
1244     // Flag to determine whether to move down (1) or up (0)
1245     $move_down = 1;
1246    
1247     // Begin the update process. Create a recordset of all affected elements.
1248     $sql = "SELECT element_id, indent_level, element_order FROM element WHERE page_id = "
1249     . $page_id
1250     . " AND element_order >= "
1251     . $down_element_order
1252     . " AND element_order <= "
1253     . $stop_element_order
1254     . " ORDER BY element_order";
1255 dpavlin 72 $rs = xx_tryquery($sql);
1256 dpavlin 18
1257 dpavlin 72 while ($row = xx_fetch_array ($rs, xx_ASSOC)) {
1258 dpavlin 18 $mod_element_id = $row["element_id"];
1259     $mod_indent_level = $row["indent_level"];
1260     $mod_element_order = $row["element_order"];
1261    
1262     /*
1263     When we've moved the selected elements down, we switch operations and move
1264     the others up.
1265     */
1266    
1267     if ($mod_element_id == $element_id) $move_down = 0;
1268    
1269     if ($move_down == 1) {
1270     $new_order = $mod_element_order + $up_num;
1271     //printf("move element %d down %d spaces -- %d<BR>", $mod_element_id, $up_num, $new_order);
1272     }
1273     else {
1274     $new_order = $mod_element_order - $down_num;
1275     //printf("move element %d up %d spaces -- %d<BR>", $mod_element_id, $down_num, $new_order);
1276     }
1277    
1278     $mod_sql = "UPDATE element SET element_order = "
1279     . $new_order
1280     . " WHERE page_id = "
1281     . $page_id
1282     . " AND element_id = "
1283     . $mod_element_id;
1284 dpavlin 72 xx_tryquery($mod_sql);
1285 dpavlin 18
1286     } // all affected elements
1287    
1288     // Position is calculated by N + 2(N - 1) where N = element position.
1289     $position = $down_element_order + (2 * $down_element_order - 1);
1290    
1291     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1292    
1293     }
1294    
1295    
1296     /**********************************************************
1297     Function: getMaxIndent
1298     Author: Paul Bramscher
1299 dpavlin 72 Last Modified: 03.03.2004
1300 dpavlin 18 ***********************************************************
1301     Purpose:
1302     Return the maximum indent level for the supplied page id.
1303     **********************************************************/
1304 dpavlin 72 function getMaxIndent($page_id){
1305 dpavlin 18
1306     // Initialize
1307     $max_indent = 0;
1308    
1309     // Build the query
1310     $sql = "SELECT MAX(indent_level) AS max_indent FROM element WHERE page_id = "
1311     . $page_id;
1312    
1313 dpavlin 72 $rs = xx_tryquery($sql);
1314     $row = xx_fetch_array ($rs, xx_ASSOC);
1315 dpavlin 18 $max_indent = $row["max_indent"];
1316    
1317     return $max_indent;
1318     }
1319    
1320    
1321     /**********************************************************
1322     Function: insertCoursePers
1323     Author: Paul Bramscher
1324 dpavlin 72 Last Modified: 03.03.2004
1325 dpavlin 18 ***********************************************************
1326     Purpose:
1327     Associates the incoming personnel information with the
1328     supplied course id. Note that the incoming may be one of
1329     three types of personnel: a library staff person, a faculty
1330     member (existing or newly created on the fly), or a
1331     non-indexed TA.
1332     **********************************************************/
1333 dpavlin 72 function insertCoursePers($course_id, $faculty_id,
1334 dpavlin 18 $page_id, $pers_email, $pers_firstname, $pers_lastname,
1335     $pers_type, $pers_account, $staff_id, $stafftitle_id){
1336    
1337     // Error flag
1338     $err_code = 0;
1339    
1340     // Incoming was library staff
1341     if ($staff_id > 1) {
1342     $sql = "INSERT INTO course_personnel (course_id, stafftitle_id, staff_id) VALUES ("
1343     . $course_id
1344     . ", "
1345     . $stafftitle_id
1346     . ", "
1347     . $staff_id
1348     . ")";
1349    
1350     }
1351    
1352     // Incoming was faculty
1353     else if ($faculty_id > 1) {
1354     $sql = "INSERT INTO course_personnel (course_id, stafftitle_id, faculty_id) VALUES ("
1355     . $course_id
1356     . ", "
1357     . $stafftitle_id
1358     . ", "
1359     . $faculty_id
1360     . ")";
1361    
1362     }
1363    
1364     // Incoming was a new faculty member
1365     else if (strlen($pers_lastname) > 0 && $pers_type == "faculty") {
1366    
1367     // Check for uniqueness
1368     $faculty_name_display = $pers_firstname . " " . $pers_lastname;
1369 dpavlin 72 $exists_id = existsFaculty($pers_firstname, $pers_lastname);
1370 dpavlin 18
1371     if ($exists_id > 0) {
1372     $err_code = 1;
1373     $err_msg = "Failed. '" . $faculty_name_display . "' already exists in the Faculty table. Faculty firstname + lastname must be unique.";
1374     }
1375    
1376     // So long as there are no errors
1377     if ($err_code < 1) {
1378    
1379     // Clean up strings
1380     if (strlen($pers_lastname) > 0) $pers_lastname = textInmySQL($pers_lastname);
1381     if (strlen($pers_firstname) > 0) $pers_firstname = textInmySQL($pers_firstname);
1382     if (strlen($pers_email) > 0) $pers_email = textInmySQL($pers_email);
1383     if (strlen($pers_account) > 0) $pers_account = textInmySQL($pers_account);
1384    
1385     // Insert into the faculty table
1386     $sql = "INSERT INTO faculty (faculty_lastname, faculty_firstname, faculty_account, faculty_email) VALUES ('"
1387     . $pers_lastname
1388     . "', '"
1389     . $pers_firstname
1390     . "', '"
1391     . $pers_account
1392     . "', '"
1393     . $pers_email
1394     . "')";
1395 dpavlin 72 xx_tryquery($sql);
1396     $new_faculty_id = xx_insert_id();
1397 dpavlin 18
1398     // Now, build the SQL for the insert into course_personnel
1399     $sql = "INSERT INTO course_personnel (course_id, stafftitle_id, faculty_id) VALUES ("
1400     . $course_id
1401     . ", "
1402     . $stafftitle_id
1403     . ", "
1404     . $new_faculty_id
1405     . ")";
1406    
1407     }
1408     }
1409    
1410     // Incoming was a lowly TA or "other". Don't index these, plop them into the course_personnel table
1411     else if (strlen($pers_lastname) > 0 && $pers_type == "other") {
1412    
1413     // Clean up strings
1414     if (strlen($pers_lastname) > 0) $pers_lastname = textInmySQL($pers_lastname);
1415     if (strlen($pers_firstname) > 0) $pers_firstname = textInmySQL($pers_firstname);
1416     if (strlen($pers_email) > 0) $pers_email = textInmySQL($pers_email);
1417     if (strlen($pers_account) > 0) $pers_account = textInmySQL($pers_account);
1418    
1419     $sql = "INSERT INTO course_personnel (course_id, stafftitle_id, pers_lastname, pers_firstname, pers_account, pers_email) VALUES ("
1420     . $course_id
1421     . ", "
1422     . $stafftitle_id
1423     . ", '"
1424     . $pers_lastname
1425     . "', '"
1426     . $pers_firstname
1427     . "', '"
1428     . $pers_account
1429     . "', '"
1430     . $pers_email
1431     . "')";
1432     }
1433    
1434     // Must have at least a last name. Send them back to the page.
1435     else header("Location: scribe.phtml?page_id=" . $page_id);
1436    
1437    
1438     // Proceed if there are no error messages
1439     if ($err_code == 0) {
1440 dpavlin 72 xx_tryquery($sql);
1441 dpavlin 18
1442     // Done. Call the PageScribe page back
1443     header("Location: scribe.phtml?page_id=" . $page_id . "#coursePers");
1444    
1445     }
1446    
1447     else {
1448    
1449     // Page header
1450     require_once ($GLOBAL_ADMIN_INC."scribe_header.phtml");
1451    
1452 dpavlin 72 printf("<center><h3>Adding Course Personnel...</h3>\n");
1453 dpavlin 18
1454     // Table
1455     printf("<table width = \"60%%\" border = \"3\" cellpadding =\"4\" class=\"backLight\">\n");
1456 dpavlin 72 printf("<tr><td>\n");
1457     printf("<b>Messages:</b><br>\n");
1458 dpavlin 18 printf("%s", $err_msg);
1459 dpavlin 72 printf("<br><br></td></tr></table>\n");
1460 dpavlin 18 printf("</center>\n");
1461    
1462     // Page footer
1463     require_once ($GLOBAL_ADMIN_INC."scribe_footer.phtml");
1464    
1465     }
1466    
1467     }
1468    
1469    
1470     /**********************************************************
1471     Function: insertScribeLabel
1472     Author: Paul Bramscher
1473 dpavlin 72 Last Modified: 03.03.2004
1474 dpavlin 18 ***********************************************************
1475     Purpose:
1476     Inserts a "label" or free-text type PageScribe element onto
1477     a PageScribe page.
1478     **********************************************************/
1479 dpavlin 72 function insertScribeLabel($element_descr, $label, $label_url, $place_array_HTML, $page_id){
1480 dpavlin 18
1481     // Clean up strings
1482     $element_descr = textInmySQL($element_descr);
1483     $label = textInmySQL($label);
1484    
1485     // Problem flag
1486     $problem = 0;
1487    
1488     // Protect against blank label
1489     if (strlen($label) < 1) {
1490     $problem = 1;
1491     }
1492    
1493     // No problems
1494     if ($problem == 0) {
1495    
1496     // Error check
1497     if ($label_url == "http://") $label_url = "";
1498    
1499     // Split by comma separated values
1500     $place_array = split(",", $place_array_HTML);
1501    
1502     // Break apart place array
1503     $prev_element_id = $place_array[0];
1504     $prev_element_order = $place_array[1];
1505     $prev_indent_level = $place_array[2];
1506     // $parent_id = $place_array[3];
1507     $position = $place_array[4];
1508    
1509     // First probe for the new parent_id
1510 dpavlin 72 $parent_id = parentProbe($page_id, $prev_element_order, $prev_indent_level);
1511 dpavlin 18
1512     // Next, bump all of the following items down by one
1513     $sql = "UPDATE element SET element_order = element_order + 1 WHERE page_id = "
1514     . $page_id . " AND element_order >= " . $prev_element_order;
1515 dpavlin 72 xx_tryquery($sql);
1516 dpavlin 18
1517     // Next insert the new label
1518     $sql = "INSERT INTO element (page_id, label, label_url, element_descr, element_order, indent_level,parent_id) VALUES ("
1519     . $page_id . ", '"
1520     . $label . "', '"
1521     . $label_url . "', '"
1522     . $element_descr . "', "
1523     . $prev_element_order . ", "
1524     . $prev_indent_level . ", "
1525 dpavlin 72 . $parent_id . ")";
1526     xx_tryquery($sql);
1527 dpavlin 18 }
1528    
1529     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1530     }
1531    
1532    
1533     /**********************************************************
1534     Function: insertScribeLocation
1535     Author: Paul Bramscher
1536 dpavlin 72 Last Modified: 03.03.2004
1537 dpavlin 18 ***********************************************************
1538     Purpose:
1539     Inserts location type element onto a PageScribe page.
1540     **********************************************************/
1541 dpavlin 72 function insertScribeLocation($location_id, $place_array_HTML, $page_id){
1542 dpavlin 18
1543     // Error checking
1544     if ($location_id > 0) {
1545    
1546     // Split by comma separated values
1547     $place_array = split(",", $place_array_HTML);
1548    
1549     // Break apart place array
1550     $prev_element_id = $place_array[0];
1551     $prev_element_order = $place_array[1];
1552     $prev_indent_level = $place_array[2];
1553     // $parent_id = $place_array[3];
1554     $position = $place_array[4];
1555    
1556     // First probe for the new parent_id
1557 dpavlin 72 $parent_id = parentProbe($page_id, $prev_element_order, $prev_indent_level);
1558 dpavlin 18
1559     // Next, bump all of the following items down by one
1560     $sql = "UPDATE element SET element_order = element_order + 1 WHERE page_id = "
1561     . $page_id . " AND element_order >= " . $prev_element_order;
1562 dpavlin 72 xx_tryquery($sql);
1563 dpavlin 18
1564     // Next insert the new location
1565     $sql = "INSERT INTO element (page_id, location_id, element_order, indent_level,parent_id) VALUES ("
1566     . $page_id . ", "
1567     . $location_id . ", "
1568     . $prev_element_order . ", "
1569     . $prev_indent_level . ", "
1570     . $parent_id . ")";
1571 dpavlin 72 xx_tryquery($sql);
1572 dpavlin 18
1573     }
1574    
1575     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1576     }
1577    
1578    
1579     /**********************************************************
1580     Function: insertScribeResource
1581     Author: Paul Bramscher
1582 dpavlin 72 Last Modified: 03.03.2004
1583 dpavlin 18 ***********************************************************
1584     Purpose:
1585     Inserts a resource type element onto a PageScribe page.
1586     **********************************************************/
1587 dpavlin 72 function insertScribeResource($place_array_HTML, $resource_id, $page_id){
1588 dpavlin 18
1589     // Error checking
1590     if ($resource_id > 0) {
1591    
1592     // Split by comma separated values
1593     $place_array = split(",", $place_array_HTML);
1594    
1595     // Break apart place array
1596     $prev_element_id = $place_array[0];
1597     $prev_element_order = $place_array[1];
1598     $prev_indent_level = $place_array[2];
1599     // $parent_id = $place_array[3];
1600     $position = $place_array[4];
1601    
1602     // First probe for the new parent_id
1603 dpavlin 72 $parent_id = parentProbe($page_id, $prev_element_order, $prev_indent_level);
1604 dpavlin 18
1605     // Next, bump all of the following items down by one
1606     $sql = "UPDATE element SET element_order = element_order + 1 WHERE page_id = "
1607     . $page_id . " AND element_order >= " . $prev_element_order;
1608 dpavlin 72 xx_tryquery($sql);
1609 dpavlin 18
1610     // Next insert the new resource
1611     $sql = "INSERT INTO element (page_id, resource_id, element_order, indent_level,parent_id) VALUES ("
1612     . $page_id . ", "
1613     . $resource_id . ", "
1614     . $prev_element_order . ", "
1615     . $prev_indent_level . ", "
1616     . $parent_id . ")";
1617 dpavlin 72 xx_tryquery($sql);
1618 dpavlin 18
1619     }
1620    
1621     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1622     }
1623    
1624    
1625     /**********************************************************
1626     Function: insertScribeRQS
1627     Author: Paul Bramscher
1628 dpavlin 72 Last Modified: 03.03.2004
1629 dpavlin 18 ***********************************************************
1630     Purpose:
1631     This function performs the "RQS harvest". For the supplied
1632     subject id, collect all of the resources and insert them
1633     as elements onto a PageScribe page.
1634     **********************************************************/
1635 dpavlin 72 function insertScribeRQS($place_array_HTML, $subject_id, $page_id){
1636 dpavlin 18
1637     // Error checking
1638     if ($subject_id > 0) {
1639    
1640     // Split by comma separated values
1641     $place_array = split(",", $place_array_HTML);
1642    
1643     // Break apart place array
1644     $prev_element_id = $place_array[0];
1645     $prev_element_order = $place_array[1];
1646     $prev_indent_level = $place_array[2];
1647     // $parent_id = $place_array[3];
1648     $position = $place_array[4];
1649    
1650     // First probe for the new parent_id
1651 dpavlin 72 $parent_id = parentProbe($page_id, $prev_element_order, $prev_indent_level);
1652 dpavlin 18
1653     // Identify the number of new elements to add
1654     $sql = "SELECT COUNT(*) as num_rqs from res_sub_infotype WHERE subject_id = " . $subject_id;
1655 dpavlin 72 $rs = xx_tryquery($sql);
1656     $row = xx_fetch_array ($rs, xx_ASSOC);
1657 dpavlin 18
1658     // Pull out the possible display values
1659     $num_rqs = $row["num_rqs"];
1660    
1661     // Continue if num_rqs > 0. If the RQS+ page was empty, skip all of this.
1662     if ($num_rqs > 0) {
1663    
1664     // Next, bump all of the following items down by the number of incoming
1665     $sql = "UPDATE element SET element_order = element_order + "
1666     . $num_rqs
1667     . " WHERE page_id = "
1668     . $page_id . " AND element_order >= " . $prev_element_order;
1669 dpavlin 72 xx_tryquery($sql);
1670 dpavlin 18
1671     // Cycle through the resources
1672     $sql = "SELECT rsi.resource_id, r.title
1673     FROM res_sub_infotype rsi
1674     LEFT JOIN resource r using (resource_id)
1675     WHERE subject_id = " . $subject_id .
1676     " ORDER BY r.title";
1677    
1678 dpavlin 72 $rs = xx_tryquery($sql);
1679     while ($row = xx_fetch_array ($rs, xx_ASSOC)) {
1680 dpavlin 18
1681     // Fetch resource
1682     $resource_id = $row["resource_id"];
1683    
1684     // Next insert the culled resource
1685     $i_sql = "INSERT INTO element (page_id, resource_id, element_order, indent_level,parent_id) VALUES ("
1686     . $page_id . ", "
1687     . $resource_id . ", "
1688     . $prev_element_order . ", "
1689     . $prev_indent_level . ", "
1690     . $parent_id . ")";
1691 dpavlin 72 xx_tryquery($i_sql);
1692 dpavlin 18
1693     // Increment element order
1694     $prev_element_order++;
1695    
1696     } // for all resources on RQS page
1697    
1698     } // rqs+ page was not empty
1699    
1700     }
1701    
1702     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1703    
1704     }
1705    
1706    
1707     /**********************************************************
1708     Function: insertScribeRQSLink
1709     Author: Paul Bramscher
1710 dpavlin 72 Last Modified: 03.03.2004
1711 dpavlin 18 ***********************************************************
1712     Purpose:
1713     Inserts an RQS subject page element onto a PageScribe page.
1714     **********************************************************/
1715 dpavlin 72 function insertScribeRQSLink($place_array_HTML, $subject_id, $page_id){
1716 dpavlin 18
1717     // Error checking
1718     if ($subject_id > 0) {
1719    
1720     // Split by comma separated values
1721     $place_array = split(",", $place_array_HTML);
1722    
1723     // Break apart place array
1724     $prev_element_id = $place_array[0];
1725     $prev_element_order = $place_array[1];
1726     $prev_indent_level = $place_array[2];
1727     // $parent_id = $place_array[3];
1728     $position = $place_array[4];
1729    
1730     // First probe for the new parent_id
1731 dpavlin 72 $parent_id = parentProbe($page_id, $prev_element_order, $prev_indent_level);
1732 dpavlin 18
1733     // Next, bump all of the following items down by one
1734     $sql = "UPDATE element SET element_order = element_order + 1 WHERE page_id = "
1735     . $page_id . " AND element_order >= " . $prev_element_order;
1736 dpavlin 72 xx_tryquery($sql);
1737 dpavlin 18
1738     // Next insert the new resource
1739     $sql = "INSERT INTO element (page_id, subject_id, element_order, indent_level,parent_id) VALUES ("
1740     . $page_id . ", "
1741     . $subject_id . ", "
1742     . $prev_element_order . ", "
1743     . $prev_indent_level . ", "
1744     . $parent_id . ")";
1745 dpavlin 72 xx_tryquery($sql);
1746 dpavlin 18
1747     }
1748    
1749     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1750     }
1751    
1752    
1753     /**********************************************************
1754     Function: insertScribeService
1755     Author: Paul Bramscher
1756 dpavlin 72 Last Modified: 03.03.2004
1757 dpavlin 18 ***********************************************************
1758     Purpose:
1759     Inserts a service type element onto a PageScribe page.
1760     **********************************************************/
1761 dpavlin 72 function insertScribeService($place_array_HTML, $page_id, $service_id){
1762 dpavlin 18
1763     // Error checking
1764     if ($service_id > 0) {
1765    
1766     // Split by comma separated values
1767     $place_array = split(",", $place_array_HTML);
1768    
1769     // Break apart place array
1770     $prev_element_id = $place_array[0];
1771     $prev_element_order = $place_array[1];
1772     $prev_indent_level = $place_array[2];
1773     // $parent_id = $place_array[3];
1774     $position = $place_array[4];
1775    
1776     // First probe for the new parent_id
1777 dpavlin 72 $parent_id = parentProbe($page_id, $prev_element_order, $prev_indent_level);
1778 dpavlin 18
1779     // Next, bump all of the following items down by one
1780     $sql = "UPDATE element SET element_order = element_order + 1 WHERE page_id = "
1781     . $page_id . " AND element_order >= " . $prev_element_order;
1782 dpavlin 72 xx_tryquery($sql);
1783 dpavlin 18
1784     // Next insert the new service
1785     $sql = "INSERT INTO element (page_id, service_id, element_order, indent_level,parent_id) VALUES ("
1786     . $page_id . ", "
1787     . $service_id . ", "
1788     . $prev_element_order . ", "
1789     . $prev_indent_level . ", "
1790     . $parent_id . ")";
1791 dpavlin 72 xx_tryquery($sql);
1792 dpavlin 18
1793     }
1794    
1795     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1796     }
1797    
1798    
1799     /**********************************************************
1800     Function: insertScribeStaff
1801     Author: Paul Bramscher
1802 dpavlin 72 Last Modified: 03.03.2004
1803 dpavlin 18 ***********************************************************
1804     Purpose:
1805     Inserts a staffperson as an element on a PageScribe page.
1806     **********************************************************/
1807 dpavlin 72 function insertScribeStaff($place_array_HTML, $staff_id, $page_id){
1808 dpavlin 18
1809     // Split by comma separated values
1810     $place_array = split(",", $place_array_HTML);
1811    
1812     // Break apart place array
1813     $prev_element_id = $place_array[0];
1814     $prev_element_order = $place_array[1];
1815     $prev_indent_level = $place_array[2];
1816     // $parent_id = $place_array[3];
1817     $position = $place_array[4];
1818    
1819     // First probe for the new parent_id
1820 dpavlin 72 $parent_id = parentProbe($page_id, $prev_element_order, $prev_indent_level);
1821 dpavlin 18
1822     // Next, bump all of the following items down by one
1823     $sql = "UPDATE element SET element_order = element_order + 1 WHERE page_id = "
1824     . $page_id . " AND element_order >= " . $prev_element_order;
1825 dpavlin 72 xx_tryquery($sql);
1826 dpavlin 18
1827     // Next insert the new staff
1828     $sql = "INSERT INTO element (page_id, staff_id, element_order, indent_level,parent_id) VALUES ("
1829     . $page_id . ", "
1830     . $staff_id . ", "
1831     . $prev_element_order . ", "
1832     . $prev_indent_level . ", "
1833     . $parent_id . ")";
1834 dpavlin 72 xx_tryquery($sql);
1835 dpavlin 18
1836     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
1837     }
1838    
1839    
1840     /**********************************************************
1841     Function: pageLoadStats
1842     Author: Paul Bramscher
1843 dpavlin 72 Last Modified: 03.03.2004
1844 dpavlin 18 ***********************************************************
1845     Purpose:
1846     Logs a statistical entry for a PageScribe/CourseLib page
1847     load. Page id, date, and IP address are currently logged.
1848     It would be relatively trivial to add other fields,
1849     such as browser type, refer URL, etc. both to the database
1850     and this function here. However, care must be taken so
1851     that the database doesn't grow too large. Currently there
1852     exists no automatic mechanism to purge or archive stats.
1853     **********************************************************/
1854 dpavlin 72 function pageLoadStats($page_id){
1855 dpavlin 18
1856     // Add a row for page usage
1857    
1858     // Fetch user ip
1859     $user_ip = $GLOBALS["REMOTE_ADDR"];
1860    
1861     // Do the stat stuff here
1862     $sql = "INSERT INTO libstats.pagestats (
1863     page_id,
1864     visit_date,
1865     user_ip) VALUES ("
1866     . $page_id
1867     . ", now(), '"
1868     . $user_ip
1869     . "')";
1870 dpavlin 72 xx_tryquery($sql);
1871 dpavlin 18
1872     }
1873    
1874    
1875     /**********************************************************
1876     Function: pageTemplate
1877     Author: Paul Bramscher
1878 dpavlin 72 Last Modified: 03.03.2004
1879 dpavlin 18 ***********************************************************
1880     Purpose:
1881     Performs the clone or copy page functionality. Note that
1882     the new title is "Copy of:" prefixed to the previous page
1883     title. Also, not all parameters are copied. Specifically,
1884     those relating to permissions must be set independently.
1885    
1886     This function could probably be cleaned up for efficiency.
1887     The biggest challenge is in handling the parent-child
1888     relationships on the new page. While the abstract structure
1889     remains the same, the pointers to specific element id's
1890     on the new page are all new and must be calculated on the
1891     fly.
1892     **********************************************************/
1893 dpavlin 72 function pageTemplate($page_id, $sess_staff_id, $sess_staff_account){
1894 dpavlin 18
1895     // First copy the page elements
1896     $sql = "SELECT * FROM page WHERE page_id = "
1897     . $page_id;
1898 dpavlin 72 $rs = xx_tryquery($sql);
1899     $row = xx_fetch_array ($rs, xx_ASSOC);
1900 dpavlin 18
1901     // Fetch results
1902     $style_id = $row["style_id"];
1903     $pagetype_id = $row["pagetype_id"];
1904     $page_title = $row["page_title"];
1905     $pagetitle_style = $row["pagetitle_style"];
1906     $display_toc = $row["display_toc"];
1907     $wrap_toc = $row["wrap_toc"];
1908     $display_up = $row["display_up"];
1909     $up_text = $row["up_text"];
1910    
1911     // Handle possible nulls
1912     if ($display_toc < 1) $display_toc = "NULL";
1913     if ($wrap_toc < 1) $wrap_toc = "NULL";
1914     if ($display_up < 1) $display_up = "NULL";
1915     if ($pagetitle_style < 1) $pagetitle_style = "NULL";
1916    
1917     // Clean up strings
1918     $page_title = textInmySQL($page_title);
1919     if (strlen($up_text) > 0) $up_text = textInmySQL($up_text);
1920    
1921     // Create new page insert statement
1922    
1923    
1924     $sql = "INSERT INTO page
1925     (date_created,
1926     account_created,
1927     staff_coordinator,
1928     style_id,
1929     pagetype_id,
1930     page_title,
1931     pagetitle_style,
1932     display_toc,
1933     wrap_toc,
1934     display_up,
1935     up_text)
1936     VALUES (
1937     now(), '"
1938     . $sess_staff_account
1939     . "', "
1940     . $sess_staff_id
1941     . ", "
1942     . $style_id
1943     . ", "
1944     . $pagetype_id
1945     . ", 'Copy of: "
1946     . $page_title
1947     . "', "
1948     . $pagetitle_style
1949     . ", "
1950     . $display_toc
1951     . ", "
1952     . $wrap_toc
1953     . ", "
1954     . $display_up
1955     . ", '"
1956     . $up_text
1957     . "')";
1958    
1959 dpavlin 72 xx_tryquery($sql);
1960     $new_page_id = xx_insert_id();
1961 dpavlin 18
1962     // If a new stub was created, and this happens to be a course page, get the course id.
1963     if ($new_page_id > 0 && $pagetype_id == 3) {
1964 dpavlin 72 $course_id = lookupfield("course", "page_id", $page_id, "course_id");
1965 dpavlin 18 }
1966    
1967    
1968     if ($course_id > 0 && $new_page_id > 0) {
1969    
1970     // Copy the course elements
1971     $sql = "SELECT * FROM course WHERE page_id = "
1972     . $page_id;
1973 dpavlin 72 $rs = xx_tryquery($sql);
1974     $row = xx_fetch_array ($rs, xx_ASSOC);
1975 dpavlin 18
1976     // Fetch results
1977     $coursesub_id = $row["coursesub_id"];
1978     $course_num = $row["course_num"];
1979     $course_section = $row["course_section"];
1980     $course_concat = $row["course_concat"];
1981     $term_id = $row["term_id"];
1982     $course_year = $row["course_year"];
1983     $campus_id = $row["campus_id"];
1984     $courseheader = $row["courseheader"];
1985     $introheader1 = $row["introheader1"];
1986     $intromessage1 = $row["intromessage1"];
1987     $introheader2 = $row["introheader2"];
1988     $intromessage2 = $row["intromessage2"];
1989    
1990     // Cleanup
1991     $course_num = textInmySQL($course_num);
1992     $course_section = textInmySQL($course_section);
1993     $course_concat = textInmySQL($course_concat);
1994     $course_year = textInmySQL($course_year);
1995     $courseheader = textInmySQL($courseheader);
1996     $introheader1 = textInmySQL($introheader1);
1997     $intromessage1 = textInmySQL($intromessage1);
1998     $introheader2 = textInmySQL($introheader2);
1999     $intromessage2 = textInmySQL($intromessage2);
2000    
2001     // Cleanup for null or numeric values
2002     if ($coursesub_id < 1) $coursesub_id = 0;
2003     if ($term_id < 1) $term_id = 0;
2004     if ($campus_id < 1) $campus_id = 0;
2005    
2006    
2007     // Create new course insert statement
2008    
2009    
2010     $sql = "INSERT INTO course
2011     (page_id,
2012     coursesub_id,
2013     course_num,
2014     course_section,
2015     course_concat,
2016     term_id,
2017     course_year,
2018     campus_id,
2019     courseheader,
2020     introheader1,
2021     intromessage1,
2022     introheader2,
2023     intromessage2)
2024     VALUES ( " .
2025     $new_page_id . ", " .
2026     $coursesub_id . ", '" .
2027     $course_num . "', '" .
2028     $course_section . "', 'Copy: " .
2029     $course_concat . "'," .
2030     $term_id . ", '" .
2031     $course_year . "', " .
2032     $campus_id . ", '" .
2033     $courseheader . "', '" .
2034     $introheader1 . "', '" .
2035     $intromessage1 . "', '" .
2036     $introheader2 . "', '" .
2037     $intromessage2 . "')";
2038    
2039 dpavlin 72 xx_tryquery($sql);
2040    
2041 dpavlin 18 } // was a CourseScribe type page
2042    
2043     // Next, copy all elements
2044     // This is not the most efficient method, but it works for now.
2045    
2046    
2047     $sql = "SELECT * FROM element WHERE page_id = "
2048     . $page_id
2049     . " ORDER BY element_id";
2050    
2051 dpavlin 72 $rs = xx_tryquery($sql);
2052     while ($row = xx_fetch_array ($rs, xx_ASSOC)) {
2053 dpavlin 18
2054     // Fetch previous values
2055     $element_id = $row["element_id"];
2056     $parent_id = $row["parent_id"];
2057     $resource_id = $row["resource_id"];
2058     $location_id = $row["location_id"];
2059     $service_id = $row["service_id"];
2060     $staff_id = $row["staff_id"];
2061     $subject_id = $row["subject_id"];
2062     $label = $row["label"];
2063     $label_url = $row["label_url"];
2064     $element_descr = $row["element_descr"];
2065     $element_size = $row["element_size"];
2066     $element_order = $row["element_order"];
2067     $indent_level = $row["indent_level"];
2068    
2069     // Cleanup for null or numeric values
2070     if ($parent_id < 1) $parent_id = 0;
2071     if ($resource_id < 1) $resource_id = "NULL";
2072     if ($location_id < 1) $location_id = "NULL";
2073     if ($service_id < 1) $service_id = "NULL";
2074     if ($staff_id < 1 ) $staff_id = "NULL";
2075     if ($subject_id < 1 ) $subject_id = "NULL";
2076     if ($element_size < 1) $element_size = "NULL";
2077     if ($indent_level < 1) $indent_level = 0;
2078    
2079     // Cleanup for text values
2080     if (strlen($label) > 0) $label = textInmySQL($label);
2081     if (strlen($label_url) > 0) $label_url = textInmySQL($label_url);
2082     if (strlen($element_descr) > 0) $element_descr = textInmySQL($element_descr);
2083    
2084     // Calculate the new parent if needed
2085 dpavlin 72 if ($parent_id > 0) $parent_id = parentProbe($new_page_id, $element_order, $indent_level);
2086 dpavlin 18
2087     // Insert the element onto the new page
2088     $clone_sql = "INSERT INTO element (
2089     page_id,
2090     parent_id,
2091     resource_id,
2092     location_id,
2093     service_id,
2094     staff_id,
2095     subject_id,
2096     label,
2097     label_url,
2098     element_descr,
2099     element_size,
2100     element_order,
2101     indent_level)
2102     VALUES (" .
2103     $new_page_id . ", " .
2104     $parent_id . ", " .
2105     $resource_id . ", " .
2106     $location_id . ", " .
2107     $service_id . ", " .
2108     $staff_id . ", " .
2109     $subject_id . ", '" .
2110     $label . "', '" .
2111     $label_url . "', '" .
2112     $element_descr . "', " .
2113     $element_size . ", " .
2114     $element_order . ", " .
2115     $indent_level . ")";
2116    
2117     // Execute the query
2118 dpavlin 72 xx_tryquery($clone_sql);
2119 dpavlin 18
2120     }
2121    
2122     header("Location: scribe.phtml?page_id=" . $new_page_id);
2123    
2124     }
2125    
2126    
2127     /**********************************************************
2128     Function: pageTemplateConfirm
2129     Author: Paul Bramscher
2130 dpavlin 72 Last Modified: 03.03.2004
2131 dpavlin 18 ***********************************************************
2132     Purpose:
2133     Prompts the author that he/she is about to template a
2134     page.
2135     **********************************************************/
2136 dpavlin 72 function pageTemplateConfirm($page_id, $sess_staff_id, $sess_staff_account){
2137 dpavlin 18
2138     // Load globals
2139     include("global_vars.php");
2140    
2141     // Include the page header
2142     include ($GLOBAL_ADMIN_INC."scribe_header.phtml");
2143    
2144     // HTML headers
2145     printf("<html>\n");
2146     printf("<head>\n");
2147     printf("<title>%s: Confirm Clone & Load</title>\n", $GLOBAL_SYS_NAME);
2148     printf("<link rel=\"stylesheet\" href=\"%s\" type=\"text/css\">\n", $GLOBAL_ADMIN_CSS);
2149 dpavlin 72 printf("</head>\n");
2150 dpavlin 18
2151     // Table
2152     printf("<center>\n");
2153     printf("<table width = \"60%%\" border = \"1\" cellpadding =\"4\" class=\"backLight\">\n");
2154     printf("<tr><td class=\"cellPlain\">\n");
2155     printf("Confirm Clone & Load");
2156     printf("</td></tr>\n");
2157 dpavlin 72 printf("<tr><td>\n");
2158 dpavlin 18
2159     // Collect information
2160     $sql = "SELECT
2161     p.page_title,
2162     s.first_name,
2163     s.last_name,
2164     s.staff_email
2165     FROM
2166     page p,
2167     staff s
2168     WHERE
2169     p.page_id = "
2170     . $page_id
2171     . " AND p.staff_coordinator = s.staff_id";
2172    
2173 dpavlin 72 $rs = xx_tryquery($sql);
2174     $row = xx_fetch_array ($rs, xx_ASSOC);
2175 dpavlin 18
2176     $page_title = strip_tags($row["page_title"]);
2177     $first_name = $row["first_name"];
2178     $last_name = $row["last_name"];
2179     $staff_email = $row["staff_email"];
2180     $staff_name = $first_name . " " . $last_name;
2181    
2182 dpavlin 72 printf("<b>Page Title: </b>%s<br>\n", $page_title);
2183     printf("<b>Coordinator: </b>%s <a href=\"mailto:%s\">%s</a><br><br>\n", $staff_name, $staff_email, $staff_email);
2184 dpavlin 18 printf("Before cloning this page, please consider seeking permission from and/or giving ");
2185     printf("attribution to the page author(s) of the original work.<br><br>\n");
2186    
2187     // Button to continue
2188     printf("<form method=\"POST\" action=\"scribe_transaction.phtml\">\n");
2189     printf("<input type=\"hidden\" name =\"transaction\" value = \"pageTemplate\">\n");
2190     printf("<input type=\"hidden\" name =\"page_id\" value = \"%d\">\n", $page_id);
2191     printf("<input type=\"hidden\" name =\"sess_staff_account\" value = \"%d\">\n", $sess_staff_account);
2192     printf("<input type=\"hidden\" name =\"sess_staff_id\" value = \"%d\">\n", $sess_staff_id);
2193     printf("<center><input type=\"submit\" value=\"Continue\"></center>\n");
2194 dpavlin 72 printf("<br><br></td></tr></table>\n");
2195 dpavlin 18
2196     // Link to return to admin console
2197     adminReturn("");
2198    
2199     printf("</center>\n");
2200    
2201     // Include the footer
2202     include ($GLOBAL_ADMIN_INC."scribe_footer.phtml");
2203     }
2204    
2205    
2206     /**********************************************************
2207     Function: parentIs
2208     Author: Paul Bramscher
2209 dpavlin 72 Last Modified: 03.03.2004
2210 dpavlin 18 ***********************************************************
2211     Purpose:
2212     Tests the supplied element to determine whether it has any
2213     children.
2214     **********************************************************/
2215 dpavlin 72 function parentIs($element_id, $page_id){
2216 dpavlin 18
2217     // First initialize the number of children
2218     $num_children = 0;
2219    
2220     $sql = "SELECT COUNT(*) AS num_children FROM element where page_id = "
2221     . $page_id
2222     . " AND parent_id = "
2223     . $element_id;
2224 dpavlin 72 $rs = xx_tryquery($sql);
2225     $row = xx_fetch_array ($rs, xx_ASSOC);
2226 dpavlin 18 $num_children = $row["num_children"];
2227    
2228     return $num_children;
2229     }
2230    
2231    
2232     /**********************************************************
2233     Function: parentProbe
2234     Author: Paul Bramscher
2235 dpavlin 72 Last Modified: 03.03.2004
2236 dpavlin 18 ***********************************************************
2237     Purpose:
2238     Probes for a parent (if not a root-level element) of the
2239     supplied element order. For example, what is the parent
2240     of the Nth element on page M? The parent is calculated by
2241     looking for the first previous element with an indent
2242     (generation) level of precisely one less.
2243     **********************************************************/
2244 dpavlin 72 function parentProbe($page_id, $prev_element_order, $prev_indent_level){
2245 dpavlin 18
2246     // If the item's indent level is 0, it is its own parent. Return 0.
2247     if ($prev_indent_level < 1) $parent_id = 0;
2248    
2249     // Otherwise, probe for the parent
2250     else {
2251    
2252     /* Build the SQL. We know that the parent must appear earlier in the
2253     list, so we limit the SQL to same or previous elements for efficiency. */
2254    
2255     $sql = "SELECT * FROM element WHERE page_id = "
2256     . $page_id
2257     . " AND element_order < "
2258     . $prev_element_order
2259     . " ORDER BY element_order DESC";
2260    
2261     // Found parent tag
2262     $found = 0;
2263    
2264 dpavlin 72 $rs = xx_tryquery($sql);
2265     while (($row = xx_fetch_array ($rs, xx_ASSOC)) && $found == 0) {
2266 dpavlin 18
2267     /* Cycle through the list, looking for the first item with an indent
2268     of less. */
2269     $element_id = $row["element_id"];
2270     $indent_level = $row["indent_level"];
2271    
2272     // Probe for parent.
2273     if ($indent_level == ($prev_indent_level - 1)) {
2274     $parent_id = $element_id;
2275     $found = 1;
2276     }
2277    
2278     }
2279     }
2280    
2281     // Just in case there was a problem probing
2282     if ($parent_id < 1) $parent_id = 0;
2283    
2284     return $parent_id;
2285     }
2286    
2287    
2288     /**********************************************************
2289     Function: pasteElement
2290     Author: Paul Bramscher
2291 dpavlin 72 Last Modified: 03.11.2004
2292 dpavlin 18 ***********************************************************
2293     Purpose:
2294     Copies the user's copy/paste buffer onto the supplied
2295     PageScribe/CourseScribe page at the specified position.
2296     This sort of logic required a fair amount of coffee to
2297     work out.
2298     **********************************************************/
2299 dpavlin 72 function pasteElement($element_order, $indent_level, $page_id, $position, $sess_staff_id) {
2300 dpavlin 18
2301     // Debug mode: 0=off, 1=on.
2302     $debug = 0;
2303    
2304     if ($debug == 1) {
2305 dpavlin 72 printf("<h3>Element Paste - Debug Mode</h3><br>\n");
2306     printf("On page id: %d<br>\n", $page_id);
2307     printf("It will go in order #%d<br>\n", $element_order);
2308     printf("Afterwards you'll return to pos: %d<br>\n", $position);
2309 dpavlin 18 }
2310    
2311    
2312     // First determine number of elements in buffer
2313     $sql = "SELECT COUNT(*) as buffer_size FROM pastebuffer WHERE paste_staff_id = "
2314     . $sess_staff_id
2315     . " ORDER BY element_order";
2316 dpavlin 72 $rs = xx_tryquery($sql);
2317     $row = xx_fetch_array ($rs, xx_ASSOC);
2318 dpavlin 18 $buffer_size = $row["buffer_size"];
2319    
2320 dpavlin 72 if ($debug == 1) printf("Number of elements in buffer: %s<br>\n", $buffer_size);
2321 dpavlin 18
2322    
2323     // Determine parent ID of first pasted element
2324     $sql = "SELECT element_id from element WHERE page_id = "
2325     . $page_id
2326     . " AND element_order = "
2327     . $element_order;
2328 dpavlin 72 $rs = xx_tryquery($sql);
2329     $row = xx_fetch_array ($rs, xx_ASSOC);
2330 dpavlin 18 $adjust_parent_id = $row["element_id"];
2331    
2332     if ($debug == 1) printf("Parent of first element will be: %d<BR>", $adjust_parent_id);
2333    
2334    
2335     // Next bump down all elements after the affected element
2336     $sql = "UPDATE element set element_order = element_order + "
2337     . $buffer_size
2338     . " WHERE page_id = "
2339     . $page_id
2340     . " AND element_order >= "
2341     . $element_order;
2342    
2343 dpavlin 72 if ($debug == 1) printf("bump down sql was: %s<br>\n", $sql);
2344 dpavlin 18
2345 dpavlin 72 xx_tryquery($sql);
2346 dpavlin 18
2347     // Select from the paste buffer
2348     $sql = "SELECT * FROM pastebuffer WHERE paste_staff_id = "
2349     . $sess_staff_id
2350     . " ORDER BY element_order";
2351 dpavlin 72 $rs = xx_tryquery($sql);
2352 dpavlin 18
2353     // row count
2354     $row_num = 0;
2355    
2356 dpavlin 72 while ($row = xx_fetch_array ($rs, xx_ASSOC)) {
2357 dpavlin 18
2358     // Load copy-paste buffer elements
2359     $copy_indent_level = $row["indent_level"];
2360     $copy_parent_id = $row["parent_id"];
2361     $copy_resource_id = $row["resource_id"];
2362     $copy_location_id = $row["location_id"];
2363     $copy_service_id = $row["service_id"];
2364     $copy_staff_id = $row["staff_id"];
2365     $copy_subject_id = $row["subject_id"];
2366     $copy_label = $row["label"];
2367     $copy_label_url = $row["label_url"];
2368     $copy_element_descr = $row["element_descr"];
2369     $copy_element_size = $row["element_size"];
2370     $copy_element_order = $row["element_order"];
2371    
2372     // Initialize as necessary -- all values must be set
2373     if ($copy_indent_level <1) $copy_indent_level = 0;
2374     if ($copy_parent_id < 1) $copy_parent_id = 0;
2375     if ($copy_resource_id < 1) $copy_resource_id = "NULL";
2376     if ($copy_location_id < 1) $copy_location_id = "NULL";
2377     if ($copy_service_id < 1) $copy_service_id = "NULL";
2378     if ($copy_subject_id < 1) $copy_subject_id = "NULL";
2379     if ($copy_staff_id < 1) $copy_staff_id = "NULL";
2380     if ($copy_element_size < 1) $copy_element_size = "NULL";
2381     if ($copy_element_order < 1) $copy_element_order = 1;
2382    
2383     // Clean up text type entries for insertion
2384     $copy_label = textInmySQL($copy_label);
2385     $copy_label_url = textInmySQL($copy_label_url);
2386     $copy_element_descr = textInmySQL($copy_element_descr);
2387    
2388     // Determine the New W0rld 0rder
2389     $adjust_element_order = $element_order + $row_num;
2390    
2391     /*
2392     Determine relative indent level. If this is the first item,
2393     it will adopt the same indent level as the incoming indent level.
2394     Everything else will be relative to it.
2395     */
2396    
2397     if ($row_num == 0) {
2398     $adjust_indent_level = $indent_level;
2399     }
2400    
2401     // The copied item is a child
2402     else if ($copy_indent_level > $last_copy_indent_level) $adjust_indent_level = $last_adjust_indent_level + 1;
2403    
2404     // The copied item was older
2405     else if ($copy_indent_level < $last_copy_indent_level) $adjust_indent_level = $last_adjust_indent_level - 1;
2406    
2407     // Else the copied item was a sibling of the last inserted item
2408     else $adjust_indent_level = $last_adjust_indent_level;
2409    
2410     // Determine parent for all but the first item
2411 dpavlin 72 $adjust_parent_id = parentProbe($page_id, $adjust_element_order, $adjust_indent_level);
2412 dpavlin 18
2413     // Debugging
2414     if ($debug == 1) {
2415 dpavlin 72 printf("new position start indent:<br>\n");
2416 dpavlin 18 printf("last copy indent: %d, ", $last_copy_indent_level);
2417 dpavlin 72 printf("this copy indent: %d<br>\n", $copy_indent_level);
2418 dpavlin 18 printf("last adjust indent: %d, ", $last_adjust_indent_level);
2419 dpavlin 72 printf("this adjust indent: %d<br>\n", $adjust_indent_level);
2420 dpavlin 18
2421     }
2422    
2423     // Build the paste SQL
2424     $p_sql = "INSERT INTO element (
2425     page_id,
2426     indent_level,
2427     parent_id,
2428     resource_id,
2429     location_id,
2430     service_id,
2431     staff_id,
2432     subject_id,
2433     label,
2434     label_url,
2435     element_descr,
2436     element_size,
2437     element_order) VALUES ("
2438     . $page_id
2439     . ", "
2440     . $adjust_indent_level
2441     . ", "
2442     . $adjust_parent_id
2443     . ", "
2444     . $copy_resource_id
2445     . ", "
2446     . $copy_location_id
2447     . ", "
2448     . $copy_service_id
2449     . ", "
2450     . $copy_staff_id
2451     . ", "
2452     . $copy_subject_id
2453     . ", '"
2454     . $copy_label
2455     . "', '"
2456     . $copy_label_url
2457     . "', '"
2458     . $copy_element_descr
2459     . "', "
2460     . $copy_element_size
2461     . ", "
2462     . $adjust_element_order
2463     . ")";
2464    
2465     // Debugging
2466 dpavlin 72 if ($debug == 1) printf("insert sql was: %s<br>\n", $p_sql);
2467 dpavlin 18
2468     // Perform the write
2469 dpavlin 72 xx_tryquery($p_sql);
2470     $paste_element_id = xx_insert_id();
2471 dpavlin 18
2472     // Debugging
2473     if ($debug == 1) {
2474 dpavlin 72 printf("insert sql was: %s<br>\n", $p_sql);
2475     printf("<b>inserted id was: %d</b><br>\n", $paste_element_id);
2476     printf("<b>adjust parent was: %d</b><br>\n", $adjust_parent_id);
2477     printf("<b>adjust order was: %d</b><br><br>\n", $adjust_element_order);
2478 dpavlin 18 }
2479    
2480     // Track some variables
2481     $last_copy_indent_level = $copy_indent_level;
2482     $last_adjust_indent_level = $adjust_indent_level;
2483     $row_num++;
2484    
2485     } // Done pasting all elements
2486    
2487     if ($debug == 0) header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
2488     }
2489    
2490    
2491     /**********************************************************
2492     Function: populateGenArray
2493     Author: Paul Bramscher
2494 dpavlin 72 Last Modified: 03.03.2004
2495 dpavlin 18 ***********************************************************
2496     Purpose:
2497     Builds an array from 0 (unused empty placeholder) to N,
2498     where N is the number of elements on the page, ordered by
2499     the element order. Each element in the array holds the
2500     indent level (generation) of the page element. The array
2501     is created outside the function. This function modifies
2502     and returns it.
2503     **********************************************************/
2504 dpavlin 72 function populateGenArray(&$genArray, $page_id) {
2505 dpavlin 18
2506     // Initialize the 0th (unused) array element
2507     $genArray[0] = 0;
2508    
2509     // Load the page element structure into the array
2510     $sql = "SELECT element_order, indent_level
2511     FROM element
2512     WHERE page_id = "
2513     . $page_id
2514     . " ORDER BY element_order";
2515 dpavlin 72 $rs = xx_tryquery($sql);
2516 dpavlin 18
2517     // Start populating generation array subscript [1]
2518     $rowcount = 1;
2519    
2520 dpavlin 72 while ($row = xx_fetch_array ($rs, xx_ASSOC)) {
2521 dpavlin 18
2522     // Fetch values
2523     $element_order = $row["element_order"];
2524     $indent_level = $row["indent_level"];
2525    
2526     // Just in case
2527     if ($indent_level < 0) $indent_level = 0;
2528     if ($element_order < 0) $element_order = 0;
2529    
2530     array_push($genArray, $indent_level);
2531    
2532     $rowcount++;
2533     }
2534    
2535     return $genArray;
2536     }
2537    
2538    
2539     /**********************************************************
2540     Function: scribePublish
2541     Author: Paul Bramscher
2542 dpavlin 72 Last Modified: 03.11.2004
2543 dpavlin 18 ***********************************************************
2544     Purpose:
2545     Performs the PageScribe/CourseLib page publish functionality.
2546     Note that in addition to flipping the published field in the
2547     page table to 1 (TRUE), it also opens a socket to the dynamic
2548     URL for the page, sucks down all page source in 4k blocks,
2549     then concatenates them into the pageHTML field in the page
2550     table. This creates a static snapshot of the page, which
2551     requires only a single SQL to dump the entire output of the
2552     page. Use that URL (displayed on the scribe.phtml authoring
2553     page for published pages) if there are concerns about page load
2554     performance issues with the fully dynamic version.
2555     **********************************************************/
2556 dpavlin 72 function scribePublish($page_id) {
2557 dpavlin 18
2558    
2559     /*
2560     First determine whether the current page is (a) a courselib page and
2561     (b) is missing a course subject/department. If so, this page cannot
2562     be published.
2563     */
2564    
2565     // Initialize
2566     $coursesub_id = 0;
2567     $pagetype_id = 0;
2568    
2569     // Build the SQL
2570     $sql = "SELECT
2571     c.coursesub_id,
2572     p.pagetype_id
2573     FROM course c, page p
2574     WHERE p.page_id = "
2575     . $page_id
2576     . " AND p.page_id = c.page_id";
2577    
2578     // printf("sql was: %s", $sql);
2579    
2580 dpavlin 72 $rs = xx_tryquery($sql);
2581     $row = xx_fetch_array ($rs, xx_ASSOC);
2582 dpavlin 18 $coursesub_id = $row["coursesub_id"];
2583     $pagetype_id = $row["pagetype_id"];
2584    
2585     // This was a courselib page missing a course/department subject
2586     // Note that coursesub_id of 1 = N/A, so we don't want this value either.
2587     if ($coursesub_id < 2 && $pagetype_id == 3) {
2588    
2589     // Load globals
2590     include("global_vars.php");
2591    
2592     // Include the page header
2593     include ($GLOBAL_ADMIN_INC."scribe_header.phtml");
2594    
2595     // HTML headers
2596     printf("<html>\n");
2597     printf("<head>\n");
2598     printf("<title>%s: Missing Information</title>\n", $GLOBAL_SYS_NAME);
2599     printf("<link rel=\"stylesheet\" href=\"%s\" type=\"text/css\">\n", $GLOBAL_ADMIN_CSS);
2600 dpavlin 72 printf("</head>\n");
2601 dpavlin 18
2602     // Draw form heading
2603     printf("<center><h3>%s: Missing Information</h3>\n", $GLOBAL_SYS_NAME);
2604    
2605     // Table
2606     printf("<table width = \"60%%\" border = \"1\" cellpadding =\"4\" class=\"backLight\">\n");
2607 dpavlin 72 printf("<tr><td>\n");
2608     printf("<b>Messages:</b><br>\n");
2609 dpavlin 18 printf("CourseLib pages may not be published without a course designator. ");
2610     printf("This is a required field -- please go back and select a course designator. ");
2611 dpavlin 72 printf("If one does not apply, this should probably be a PageScribe page instead.<br><br>\n");
2612 dpavlin 18
2613     printf("</td></tr></table>\n");
2614    
2615    
2616     // Link to return to admin console
2617     adminReturn("");
2618    
2619     printf("</center>\n");
2620    
2621     // Include the footer
2622     include ($GLOBAL_ADMIN_INC."scribe_footer.phtml");
2623     }
2624    
2625     // Page may be published
2626     else {
2627    
2628     /*
2629     Uncomment this portion if the static page functionality is desired.
2630     PFB: 06-23-2003
2631    
2632     // Load globals
2633     include ("global_vars.php");
2634    
2635     // Test URL to snapshot
2636     $page_loc = $GLOBAL_SCRIBE_URL . "page.phtml?page_id=" . $page_id;
2637    
2638     // Clear out existing published information
2639     // This is important, also, to get rid of a NULL value before performing a CONCAT below.
2640     $sql = "UPDATE page set pageHTML = '' WHERE page_id = " . $page_id;
2641 dpavlin 72 xx_tryquery($sql);
2642 dpavlin 18
2643     // Open the filepointer for a screen dump
2644     $fp = fopen ($page_loc, "r");
2645    
2646     // Open failed
2647     if (!$fp) {
2648     echo "$errstr ($errno)<br>\n";
2649     }
2650     // Continue as long as there's data
2651     else {
2652     fputs ($fp, "GET / HTTP/1.0\r\nHost: %s\r\n\r\n", $page_loc);
2653     while (!feof($fp)) {
2654    
2655     // Fetch the stream
2656     $iostream = fgets ($fp,4096);
2657    
2658     // Replace single quotes with two single quotes
2659     $iostream_fix = ereg_replace("'","''",$iostream);
2660    
2661     // Concatenate the stream into the pageHTML field
2662     $sql = "UPDATE page set pageHTML = CONCAT(pageHTML,'" . $iostream_fix . "') WHERE page_id = " . $page_id;
2663 dpavlin 72 xx_tryquery($sql);
2664 dpavlin 18 }
2665    
2666     // Close up the open file pointer
2667     fclose ($fp);
2668    
2669     // Set published flag to 1
2670     $sql = "UPDATE page set published = '1' WHERE page_id = " . $page_id;
2671 dpavlin 72 xx_tryquery($sql);
2672 dpavlin 18
2673     } // end open file pointer
2674    
2675 dpavlin 72 end of comment-out */
2676 dpavlin 18
2677     /*********************************************************************
2678     ** Comment out this portion if static page functionality is desired **
2679     *********************************************************************/
2680    
2681     // Set published flag to 1
2682     $sql = "UPDATE page set published = '1' WHERE page_id = " . $page_id;
2683 dpavlin 72 xx_tryquery($sql);
2684 dpavlin 18
2685     /***********************
2686     ** End of comment-out **
2687     ***********************/
2688    
2689     header("Location: scribe.phtml?page_id=" . $page_id);
2690    
2691     }
2692    
2693     } // end function
2694    
2695    
2696     /**********************************************************
2697     Function: scribeUnpublish
2698     Author: Paul Bramscher
2699 dpavlin 72 Last Modified: 03.03.2004
2700 dpavlin 18 ***********************************************************
2701     Purpose:
2702     Unpublishes the supplied page id. Note that we set both
2703     the pageHTML to NULL and flip the published flag back to
2704     0 (FALSE).
2705     **********************************************************/
2706 dpavlin 72 function scribeUnpublish($page_id) {
2707 dpavlin 18
2708     // Build the SQL
2709     $sql = "UPDATE page SET pageHTML = NULL, published = '0' WHERE page_id =" . $page_id;
2710 dpavlin 72 xx_tryquery($sql);
2711 dpavlin 18
2712     header("Location: scribe.phtml?page_id=" . $page_id);
2713     }
2714    
2715    
2716     /**********************************************************
2717     Function: sibProbeElder
2718     Author: Paul Bramscher
2719     Last Modified: 06.30.2003
2720     ***********************************************************
2721     Purpose:
2722     Probes the generational array for an elder sibling. If
2723     found, the function returns TRUE (1). Note that there is
2724     an optimizing exit condition, namely that if the probed
2725     element's indent level is less than the current indent
2726     level, we've already reached a parent and thus quit
2727     probing early.
2728     **********************************************************/
2729     function sibProbeElder($genArray, $page_id, $place_array){
2730    
2731     // Break apart place array
2732     $element_id = $place_array[0];
2733     $element_order = $place_array[1];
2734     $indent_level = $place_array[2];
2735     //$parent_id = $place_array[3];
2736     //$position = $place_array[4];
2737    
2738     // Initialize finding an elder sibling to FALSE
2739     $elder = 0;
2740    
2741     if ($element_order > 1) {
2742    
2743     // Initialize more things
2744     $probe = $element_order - 1;
2745     $continue = 1;
2746    
2747     while ($elder == 0 && $continue == 1 && $probe >= 1) {
2748    
2749     if ($genArray[$probe] == $indent_level) $elder = 1;
2750     else if ($genArray[$probe] < $indent_level) $continue = 0;
2751    
2752     $probe--;
2753     }
2754     }
2755    
2756     return $elder;
2757     }
2758    
2759    
2760     /**********************************************************
2761     Function: sibProbeYounger
2762     Author: Paul Bramscher
2763     Last Modified: 06.30.2003
2764     ***********************************************************
2765     Purpose:
2766     Probes the generational array for a younger sibling. If
2767     found, the function returns TRUE (1). Note that there is
2768     an optimizing exit condition, namely that if the probed
2769     element's indent level is less than the current indent
2770     level, we've already reached a parent (of a separate nuclear
2771     family) and thus quit probing early.
2772     **********************************************************/
2773     function sibProbeYounger($genArray, $page_id, $place_array){
2774    
2775     // Break apart place array
2776     $element_id = $place_array[0];
2777     $element_order = $place_array[1];
2778     $indent_level = $place_array[2];
2779     //$parent_id = $place_array[3];
2780     //$position = $place_array[4];
2781    
2782     // Initialize finding a younger sibling to FALSE
2783     $younger = 0;
2784    
2785     if ($element_order < sizeof($genArray)) {
2786    
2787     // Initialize more things
2788     $probe = $element_order + 1;
2789     $continue = 1;
2790    
2791     while ($younger == 0 && $continue == 1 && $probe <= sizeof($genArray)) {
2792    
2793     if ($genArray[$probe] == $indent_level) $younger = 1;
2794     else if ($genArray[$probe] < $indent_level) $continue = 0;
2795    
2796     $probe++;
2797     }
2798     }
2799    
2800     return $younger;
2801     }
2802    
2803    
2804     /**********************************************************
2805     Function: toggleTOCDisplay
2806     Author: Paul Bramscher
2807 dpavlin 72 Last Modified: 03.03.2004
2808 dpavlin 18 ***********************************************************
2809     Purpose:
2810     Flips the flag to 1 (TRUE) or 0 (FALSE) for the display
2811     of the PageScribe/CourseLib table of contents. This
2812     ToC is autogenerated and includes the root elements on the
2813     page.
2814     **********************************************************/
2815 dpavlin 72 function toggleTOCDisplay($display_toc, $page_id) {
2816 dpavlin 18
2817     $sql = "UPDATE page SET display_toc = "
2818     . $display_toc
2819     . " WHERE page_id = "
2820     . $page_id;
2821 dpavlin 72 xx_tryquery($sql);
2822 dpavlin 18
2823     // Call the PageScribe page back
2824     header("Location: scribe.phtml?page_id=" . $page_id);
2825     }
2826    
2827    
2828     /**********************************************************
2829     Function: toggleTOCWrap
2830     Author: Paul Bramscher
2831 dpavlin 72 Last Modified: 03.03.2004
2832 dpavlin 18 ***********************************************************
2833     Purpose:
2834     Flips the flag to 1 (TRUE) or 0 (FALSE) for the wrapping
2835     of the PageScribe/CourseLib table of contents. This
2836     ToC is autogenerated and includes the root elements on the
2837     page. The wrap results in a two-column view of the ToC.
2838     **********************************************************/
2839 dpavlin 72 function toggleTOCWrap($page_id, $wrap_toc) {
2840 dpavlin 18
2841     $sql = "UPDATE page SET wrap_toc = "
2842     . $wrap_toc
2843     . " WHERE page_id = "
2844     . $page_id;
2845 dpavlin 72 xx_tryquery($sql);
2846 dpavlin 18
2847     // Call the PageScribe page back
2848     header("Location: scribe.phtml?page_id=" . $page_id);
2849     }
2850    
2851    
2852     /**********************************************************
2853     Function: toggleUpDisplay
2854     Author: Paul Bramscher
2855 dpavlin 72 Last Modified: 03.03.2004
2856 dpavlin 18 ***********************************************************
2857     Purpose:
2858     Toggles the display of the [return to top] text on the
2859     supplied page id before each new root element. If there
2860     is currently no value in the up_text field (i.e. the user
2861     has never saved anything previously), then this function
2862     will also insert a preliminary value as passed from the
2863     default string setting on the scribe authoring page.
2864     **********************************************************/
2865 dpavlin 72 function toggleUpDisplay($display_up, $page_id, $up_text) {
2866 dpavlin 18
2867     // Collect some data on the current up text
2868 dpavlin 72 $current_up_text = lookupField("page", "page_id", $page_id, "up_text");
2869 dpavlin 18
2870     // Toggle the flag to TRUE or FALSE
2871     $sql = "UPDATE page SET display_up = "
2872     . $display_up
2873     . " WHERE page_id = "
2874     . $page_id;
2875 dpavlin 72 xx_tryquery($sql);
2876 dpavlin 18
2877     /* If the current up_text is blank, and the user has
2878     toggled ON, then insert the default wording. */
2879     if ($display_up == 1 && strlen($current_up_text) < 1) {
2880     $sql = "UPDATE page SET up_text = '"
2881     . $up_text
2882     . "' WHERE page_id = "
2883     . $page_id;
2884 dpavlin 72 xx_tryquery($sql);
2885 dpavlin 18 }
2886    
2887     // Call the PageScribe page back
2888     header("Location: scribe.phtml?page_id=" . $page_id);
2889     }
2890    
2891    
2892     /**********************************************************
2893     Function: toggleUpText
2894     Author: Paul Bramscher
2895 dpavlin 72 Last Modified: 03.03.2004
2896 dpavlin 18 ***********************************************************
2897     Purpose:
2898     Changes the [return to top] text for the supplied page id,
2899     on a given page id before each new root element.
2900     **********************************************************/
2901 dpavlin 72 function toggleUpText($page_id, $up_text) {
2902 dpavlin 18
2903     // Clean the string
2904     $up_text = textInmySQL($up_text);
2905    
2906     // Make the change
2907     $sql = "UPDATE page SET up_text = '"
2908     . $up_text
2909     . "' WHERE page_id = "
2910     . $page_id;
2911 dpavlin 72 xx_tryquery($sql);
2912 dpavlin 18
2913     // Call the PageScribe page back
2914     header("Location: scribe.phtml?page_id=" . $page_id);
2915     }
2916    
2917    
2918     /**********************************************************
2919     Function: toggleURLDisplay
2920     Author: Paul Bramscher
2921 dpavlin 72 Last Modified: 03.03.2004
2922 dpavlin 18 ***********************************************************
2923     Purpose:
2924     This function updates the display_urls field in the
2925     page table. When set to 1 (TRUE), URL's are diplayed
2926     during the PageScribe edit mode.
2927    
2928     Previously, we used this flag to create pages for which the
2929     URL's ought to be displayed or surpressed to the user
2930     (not merely the page author). However, with the creation
2931     of the "printer friendly version" of a page, which
2932     automatically displays URL's, the utility here is lessened.
2933     Still, it might be useful for an author to see his/her
2934     URL's in edit mode for a quick visual inspection without
2935     having to resort to the user interface.
2936     **********************************************************/
2937 dpavlin 72 function toggleURLDisplay($display_urls, $page_id) {
2938 dpavlin 18
2939     // Build the SQL
2940     $sql = "UPDATE page SET display_urls = "
2941     . $display_urls
2942     . " WHERE page_id = "
2943     . $page_id;
2944 dpavlin 72 xx_tryquery($sql);
2945 dpavlin 18
2946     // Call the PageScribe page back
2947     header("Location: scribe.phtml?page_id=" . $page_id);
2948     }
2949    
2950     /**********************************************************
2951     Function: updatePageDebug
2952     Author: Paul Bramscher
2953 dpavlin 72 Last Modified: 03.03.2004
2954 dpavlin 18 ***********************************************************
2955     Purpose:
2956     Updates the flag for page debug to 1 (TRUE) or 0 (FALSE).
2957 dpavlin 72
2958     Notes: This is not currently used. Potentially we could
2959     utilize this flag when TRUE, to run the debugger every
2960     time a page is loaded.
2961 dpavlin 18 **********************************************************/
2962 dpavlin 72 function updatePageDebug($page_debug, $page_id) {
2963 dpavlin 18
2964     $sql = "UPDATE page SET page_debug = "
2965     . $page_debug
2966     . " WHERE page_id = "
2967     . $page_id;
2968 dpavlin 72 xx_tryquery($sql);
2969 dpavlin 18
2970     // Call the PageScribe page back
2971     header("Location: scribe.phtml?page_id=" . $page_id);
2972     }
2973    
2974    
2975     /**********************************************************
2976     Function: updatePageHeader
2977     Author: Paul Bramscher
2978 dpavlin 72 Last Modified: 03.03.2004
2979 dpavlin 18 ***********************************************************
2980     Purpose:
2981 dpavlin 72 Updates the supplied page id's pageheader
2982 dpavlin 18 **********************************************************/
2983 dpavlin 72 function updatePageHeader($page_id, $pageheader) {
2984 dpavlin 18
2985     // Clean up
2986     if (strlen($pageheader) > 0) $pageheader = textInmySQL($pageheader);
2987    
2988     $sql = "UPDATE page SET pageheader = '"
2989     . $pageheader
2990     . "' WHERE page_id = "
2991     . $page_id;
2992 dpavlin 72 xx_tryquery($sql);
2993 dpavlin 18
2994     // Call the PageScribe page back
2995     header("Location: scribe.phtml?page_id=" . $page_id);
2996     }
2997    
2998    
2999     /**********************************************************
3000     Function: updatePageTitleStyle
3001     Author: Paul Bramscher
3002 dpavlin 72 Last Modified: 03.03.2004
3003 dpavlin 18 ***********************************************************
3004     Purpose:
3005     Updates the style class for the supplied page_id
3006     **********************************************************/
3007 dpavlin 72 function updatePageTitleStyle($page_id, $pagetitle_style) {
3008 dpavlin 18
3009     $sql = "UPDATE page SET pagetitle_style = "
3010     . $pagetitle_style
3011     . " WHERE page_id = "
3012     . $page_id;
3013 dpavlin 72 xx_tryquery($sql);
3014 dpavlin 18
3015     // Call the PageScribe page back
3016     header("Location: scribe.phtml?page_id=" . $page_id);
3017     }
3018    
3019    
3020     /**********************************************************
3021     Function: updateScribeCourse
3022     Author: Paul Bramscher
3023 dpavlin 72 Last Modified: 03.03.2004
3024 dpavlin 18 ***********************************************************
3025     Purpose:
3026     Updates the supplied field and value for the course id.
3027     The concatenated course title is also updated, in case
3028     there were modifications which affect the title
3029     (subject, designator, or section).
3030     **********************************************************/
3031 dpavlin 72 function updateScribeCourse($course_id, $field_name, $field_value, $page_id) {
3032 dpavlin 18
3033     // Clean up for entry
3034     if (strlen($field_value) > 0) $field_value = textInmySQL($field_value);
3035    
3036     // Determine whether this is an existing course or a new one
3037     if ($course_id > 0) {
3038    
3039     // Build the SQL. Key on both course_id and page_id for safety sake.
3040     $sql = "UPDATE course SET "
3041     . $field_name
3042     . " = '"
3043     . $field_value
3044     . "' WHERE course_id = "
3045     . $course_id
3046     . " AND page_id = "
3047     . $page_id;
3048 dpavlin 72 xx_tryquery($sql);
3049 dpavlin 18
3050    
3051     }
3052    
3053     // New course
3054     else {
3055     $sql = "INSERT INTO course ('"
3056     . $field_name
3057     . "', page_id) VALUES ('"
3058     . $field_value
3059     . "', "
3060     . $page_id
3061     . ")";
3062    
3063 dpavlin 72 xx_tryquery($sql);
3064     $course_id = xx_insert_id();
3065 dpavlin 18
3066     }
3067 dpavlin 72 updateScribeCourseConcat($course_id, $page_id);
3068 dpavlin 18 }
3069    
3070     /**********************************************************
3071     Function: updateScribeCourseConcat
3072     Author: Paul Bramscher
3073 dpavlin 72 Last Modified: 03.03.2004
3074 dpavlin 18 ***********************************************************
3075     Purpose:
3076     This function updates a CourseLib course title of the
3077     supplied page id and course id. This course title is a
3078     concatenation of the course subject + designator +
3079     section (if provided). This was done because there was a
3080     problem in sorting multiple fields with our version of
3081     mySQL. We needed to present a completely ordered list of
3082     courses -- not merely by course subject.
3083     **********************************************************/
3084 dpavlin 72 function updateScribeCourseConcat($course_id, $page_id) {
3085 dpavlin 18
3086     // Fetch course related information
3087     $sql = "SELECT
3088     p.page_title,
3089     c.course_num,
3090     c.course_section,
3091     s.coursesub_id,
3092     s.coursesub
3093     FROM
3094     course c
3095     LEFT JOIN page p using (page_id)
3096     LEFT JOIN coursesub s on c.coursesub_id = s.coursesub_id
3097    
3098     WHERE
3099     course_id = " . $course_id;
3100    
3101 dpavlin 72 $rs = xx_tryquery($sql);
3102     $row = xx_fetch_array ($rs, xx_ASSOC);
3103 dpavlin 18
3104     $page_title = $row["page_title"];
3105     $coursesub_id = $row["coursesub_id"];
3106     $coursesub = $row["coursesub"];
3107     $course_num = $row["course_num"];
3108     $course_section = $row["course_section"];
3109    
3110     // Initialize
3111     $course_concat = "";
3112    
3113     // So long as the course subject is not N/A
3114     // if ($coursesub_id > 1) $course_concat = $coursesub . " ";
3115     if ($coursesub_id > 1) $course_concat = $coursesub;
3116    
3117     //if (strlen($course_num) > 1) $course_concat = $course_concat . $course_num . " ";
3118     //$course_concat = $course_concat . $page_title . " ";
3119    
3120     if (strlen($course_num) > 1) $course_concat = $course_concat . " " . $course_num . ": ";
3121     else $course_concat = $course_concat . " ";
3122     $course_concat = $course_concat . $page_title . " ";
3123    
3124     if (strlen($course_section) > 1) $course_concat = $course_concat . $course_section . " ";
3125    
3126     // Clean up
3127     $course_concat = textInmySQL($course_concat);
3128    
3129     // Update the concatenated title into the course table
3130     $sql = "UPDATE course SET course_concat = '"
3131     . $course_concat
3132     . "' WHERE course_id = "
3133     . $course_id;
3134 dpavlin 72 xx_tryquery($sql);
3135 dpavlin 18
3136     header("Location: scribe.phtml?page_id=" . $page_id);
3137    
3138     }
3139    
3140     /**********************************************************
3141     Function: updateScribeElement
3142     Author: Paul Bramscher
3143 dpavlin 72 Last Modified: 03.03.2004
3144 dpavlin 18 ***********************************************************
3145     Purpose:
3146     Updates a PageScribe element. This function handles the
3147     updating of text or label type elements, their url's and
3148     descriptions -- as well as customized descriptions for
3149     any other element type.
3150     **********************************************************/
3151 dpavlin 72 function updateScribeElement($element_descr,
3152 dpavlin 18 $element_id, $label, $label_flag, $label_url, $page_id, $position) {
3153    
3154     // Problem flagging
3155     $problem = 0;
3156    
3157     // Clean up strings
3158     if (strlen($element_descr) > 0) $element_descr = textInmySQL($element_descr);
3159     if (strlen($label) > 0) $label = textInmySQL($label);
3160     if (strlen($label_url) > 0) $label_url = textInmySQL($label_url);
3161    
3162     // Protection against no url supplied
3163     if ($label_url == "http://") $label_url = "";
3164    
3165     /*
3166     Protection against a blank label. If this element type is a label, some text
3167     must be supplied.
3168     */
3169    
3170     if ($label_flag == 1 && strlen($label) < 1) {
3171     $problem = 1;
3172     printf("Error. You must provide a text label if you wish it to be on the page.<br>\n");
3173     }
3174    
3175    
3176     // If no problems
3177     if ($problem == 0) {
3178    
3179     /*
3180     First handle text-label type elements. It is assumed they
3181     are all non-default descriptions.
3182     */
3183    
3184     if ($label_flag == 1) {
3185     // Build the SQL
3186     $sql = "UPDATE element SET element_descr = '"
3187     . $element_descr
3188     . "', label = '"
3189     . $label
3190     . "', label_url = '"
3191     . $label_url
3192     . "' WHERE page_id ="
3193     . $page_id
3194     . " AND element_id = "
3195     . $element_id;
3196 dpavlin 72 xx_tryquery($sql);
3197 dpavlin 18
3198    
3199     }
3200    
3201     /*
3202     This is a non- text-label element, and the user changed the default description.
3203     */
3204    
3205     else if ($label_flag == 0 && strlen($element_descr) > 0) {
3206    
3207     // Build the SQL
3208     $sql = "UPDATE element SET element_descr = '"
3209     . $element_descr
3210     . "' WHERE page_id ="
3211     . $page_id
3212     . " AND element_id = "
3213     . $element_id;
3214 dpavlin 72 xx_tryquery($sql);
3215 dpavlin 18
3216     }
3217    
3218     /*
3219     This is a non- text-label element. The user cleared everything out.
3220     Dump the unique description. By doing this, the page-rendering interfaces
3221     will revert to the default description for the element.
3222     */
3223    
3224     else if ($label_flag == 0 && strlen($element_descr) == 0) {
3225    
3226     // Build the SQL
3227     $sql = "UPDATE element SET element_descr = NULL WHERE page_id = "
3228     . $page_id
3229     . " AND element_id = "
3230     . $element_id;
3231 dpavlin 72 xx_tryquery($sql);
3232 dpavlin 18
3233     }
3234    
3235     header("Location: scribe.phtml?page_id=" . $page_id . "#p" . $position);
3236    
3237     } // no problems
3238    
3239     }
3240    
3241    
3242     /**********************************************************
3243     Function: updateScribeHeader
3244     Author: Paul Bramscher
3245 dpavlin 72 Last Modified: 03.03.2004
3246 dpavlin 18 ***********************************************************
3247     Purpose:
3248     Updates the page title for the supplied page id.
3249     **********************************************************/
3250 dpavlin 72 function updateScribeHeader($course_id, $page_id, $page_title, $pagetype_id) {
3251 dpavlin 18
3252     // Clean up strings
3253     $page_title = textInmySQL($page_title);
3254    
3255     // Build the SQL
3256     $sql = "UPDATE page SET page_title = '"
3257     . $page_title
3258     . "' WHERE page_id ="
3259     . $page_id;
3260 dpavlin 72 xx_tryquery($sql);
3261 dpavlin 18
3262     // Update the concatenated course title if this is a course page
3263 dpavlin 72 if ($pagetype_id == 3) updateScribeCourseConcat($course_id, $page_id);
3264 dpavlin 18
3265     header("Location: scribe.phtml?page_id=" . $page_id);
3266    
3267     }
3268    
3269    
3270     /**********************************************************
3271     Function: updateScribeStyle
3272     Author: Paul Bramscher
3273 dpavlin 72 Last Modified: 03.03.2004
3274 dpavlin 18 ***********************************************************
3275     Purpose:
3276     Changes the style definition for the supplied page id.
3277     **********************************************************/
3278 dpavlin 72 function updateScribeStyle($page_id, $style_id) {
3279 dpavlin 18
3280     // Build the SQL
3281     $sql = "UPDATE page SET style_id = "
3282     . $style_id
3283     . " WHERE page_id ="
3284     . $page_id;
3285 dpavlin 72 xx_tryquery($sql);
3286 dpavlin 18
3287     header("Location: scribe.phtml?page_id=" . $page_id);
3288     }
3289    
3290    
3291     /**********************************************************
3292     Function: updateScribeUpdate
3293     Author: Paul Bramscher
3294 dpavlin 72 Last Modified: 03.03.2004
3295 dpavlin 18 ***********************************************************
3296     Purpose:
3297     Modifies the PageScribe/CourseLib page "last updated"
3298     field.
3299     **********************************************************/
3300 dpavlin 72 function updateScribeUpdate($page_id, $sess_staff_account) {
3301 dpavlin 18
3302     $sql = "UPDATE page SET date_modified = now(), account_modified ='"
3303     . $sess_staff_account
3304     . "' WHERE page_id = "
3305     . $page_id;
3306 dpavlin 72 xx_tryquery($sql);
3307 dpavlin 18 }
3308    
3309    
3310     /**********************************************************
3311     Function: youngerProbe
3312     Author: Paul Bramscher
3313     Last Modified: 10.29.2002
3314     ***********************************************************
3315     Incoming:
3316     $page_id ID of the page involved
3317     $place_array Variables related to the last element
3318     displayed.
3319     $rs Record set with cursor position.
3320     ***********************************************************
3321     Outgoing:
3322     $younger Returns 0 if next element is not
3323     younger, 1 if it is.
3324     ***********************************************************
3325     Purpose:
3326     Starts out with the cursor pointing at the next element in
3327     the recordset. Examines the value of its indent level and
3328     determines whether it is older or younger than the previous
3329     element. If younger, it returns a 1. If not, returns a 0.
3330    
3331     Note that we need some range checking. $element_order
3332     represents the order 1 to N of the elements on a page,
3333     whereas the cursor sits at positions 0 to (N - 1). Thus,
3334     we need to make sure we never check beyond the limit of
3335     the number of rows. After the check, we need to move the
3336     cursor back to $element_order - 1. This would correspond to
3337     the cursor row it was originally sitting at coming into the
3338     function.
3339     **********************************************************/
3340     function youngerProbe($page_id, $place_array, $rs){
3341    
3342     // Break apart place array
3343     $element_id = $place_array[0];
3344     $element_order = $place_array[1];
3345     $indent_level = $place_array[2];
3346     //$parent_id = $place_array[3];
3347     //$position = $place_array[4];
3348    
3349     // Younger found
3350     $younger = 0;
3351    
3352 dpavlin 42 if ($element_order <= xx_num_rows($rs)) {
3353 dpavlin 18
3354 dpavlin 42 $row = xx_fetch_array ($rs);
3355 dpavlin 18 $probe_indent_level = $row["indent_level"];
3356     $probe_element_id = $row["element_id"];
3357    
3358     /*
3359     printf("<BR>this element: %d, this indent: %d<BR>", $element_id, $indent_level);
3360     printf("probed element: %d, probed indent: %d<BR>", $probe_element_id, $probe_indent_level);
3361     printf("order was: %d<br>", $element_order);
3362     */
3363    
3364     if ($probe_indent_level > $indent_level) $younger = 1;
3365 dpavlin 42 if ($element_order <= xx_num_rows($rs)) xx_data_seek($rs, $element_order - 1);
3366 dpavlin 18
3367     }
3368    
3369     return $younger;
3370    
3371     }
3372 dpavlin 72 ?>

  ViewVC Help
Powered by ViewVC 1.1.26