[ Index ] |
PHP Cross Reference of Eventum |
[Summary view] [Print] [Text view]
1 <!-- 2 // @(#) $Id: global.js 3336 2007-06-13 09:26:06Z glen $ 3 var today = new Date(); 4 var expires = new Date(today.getTime() + (56 * 86400000)); 5 6 function addFileRow(element_name, field_name) 7 { 8 if (document.all) { 9 var fileTable = document.all[element_name]; 10 } else if (!document.all && document.getElementById) { 11 var fileTable = document.getElementById(element_name); 12 } 13 if (!fileTable) { 14 return; 15 } 16 rows = fileTable.rows.length; 17 18 // check if last box is empty and if it is, don't add another 19 if (document.all) { 20 var last_field = document.all[field_name + '_' + rows]; 21 } else if (!document.all && document.getElementById) { 22 var last_field = document.getElementById(field_name + '_' + rows); 23 } 24 if (last_field && last_field.value == '') { 25 return; 26 } 27 28 newRow = fileTable.insertRow(rows); 29 cell = newRow.insertCell(0); 30 if (document.all) { 31 cell.innerHTML = '<input id="' + field_name + '_' + (rows+1) + '" class="shortcut" size="40" type="file" name="' + field_name + '" onChange="javascript:addFileRow(\'' + element_name + '\', \'' + field_name + '\');">'; 32 } else { 33 var input = document.createElement('INPUT'); 34 input.setAttribute('type', 'file'); 35 input.name = field_name; 36 input.className = 'shortcut'; 37 input.size = 40; 38 input.onchange = new Function('addFileRow(\'' + element_name + '\', \'' + field_name + '\');'); 39 input.id = field_name + '_' + (rows+1); 40 cell.appendChild(input); 41 } 42 } 43 44 function inArray(value, stack) 45 { 46 for (var i = 0; i < stack.length; i++) { 47 if (stack[i] == value) { 48 return true; 49 } 50 } 51 return false; 52 } 53 54 function getEmailFromAddress(str) 55 { 56 var first_pos = str.lastIndexOf('<'); 57 var second_pos = str.lastIndexOf('>'); 58 if ((first_pos != -1) && (second_pos != -1)) { 59 return str.substring(first_pos+1, second_pos); 60 } else { 61 return str; 62 } 63 } 64 65 function closeAndRefresh() 66 { 67 opener.location.href = opener.location; 68 window.close(); 69 } 70 71 function str_replace(s, srch, rplc) 72 { 73 var tmp = s; 74 var tmp_before = new String(); 75 var tmp_after = new String(); 76 var tmp_output = new String(); 77 var int_before = 0; 78 var int_after = 0; 79 80 while (tmp.toUpperCase().indexOf(srch.toUpperCase()) > -1) { 81 int_before = tmp.toUpperCase().indexOf(srch.toUpperCase()); 82 tmp_before = tmp.substring(0, int_before); 83 tmp_output = tmp_output + tmp_before; 84 tmp_output = tmp_output + rplc; 85 int_after = tmp.length - srch.length + 1; 86 tmp = tmp.substring(int_before + srch.length); 87 } 88 89 return tmp_output + tmp; 90 } 91 92 function displayFixedWidth(element_name) 93 { 94 var el = getPageElement(element_name); 95 // only do this for mozilla 96 if (is_nav6up) { 97 var content = el.innerHTML; 98 el.innerHTML = '<pre>' + str_replace(content, "<br>", '') + '</pre>'; 99 el.className = ''; 100 } 101 el.style.fontFamily = 'Mono, Monaco, Courier New, Courier'; 102 el.style.whiteSpace = 'pre'; 103 } 104 105 function showSelections(form_name, field_name) 106 { 107 var f = getForm(form_name); 108 var field = getFormElement(f, field_name); 109 var selections = getSelectedItems(field); 110 var selected_names = new Array(); 111 for (var i = 0; i < selections.length; i++) { 112 selected_names.push(selections[i].text); 113 } 114 var display_div = getPageElement('selection_' + field_name); 115 display_div.innerHTML = 'Current Selections: ' + selected_names.join(', '); 116 } 117 118 function replaceWords(str, original, replacement) 119 { 120 var lines = str.split("\n"); 121 for (var i = 0; i < lines.length; i++) { 122 lines[i] = replaceWordsOnLine(lines[i], original, replacement); 123 } 124 return lines.join("\n"); 125 } 126 127 function replaceWordsOnLine(str, original, replacement) 128 { 129 var words = str.split(' '); 130 for (var i = 0; i < words.length; i++) { 131 words[i] = words[i].replace(/^\s*/, '').replace(/\s*$/, ''); 132 if (words[i] == original) { 133 words[i] = replacement; 134 } 135 } 136 return words.join(' '); 137 } 138 139 function checkSpelling(form_name, field_name) 140 { 141 var features = 'width=420,height=400,top=30,left=30,resizable=yes,scrollbars=yes,toolbar=no,location=no,menubar=no,status=no'; 142 var popupWin = window.open('spell_check.php?form_name=' + form_name + '&field_name=' + field_name, '_spellChecking', features); 143 popupWin.focus(); 144 } 145 146 function updateTimeFields(form_name, year_field, month_field, day_field, hour_field, minute_field, date) 147 { 148 var f = getForm(form_name); 149 if (typeof date == 'undefined') { 150 date = new Date(); 151 } 152 selectOption(f, month_field, padDateValue(date.getMonth()+1)); 153 selectOption(f, day_field, padDateValue(date.getDate())); 154 selectOption(f, year_field, date.getFullYear()); 155 selectOption(f, hour_field, padDateValue(date.getHours())); 156 // minutes need special case due the 5 minute granularity 157 var minutes = Math.floor(date.getMinutes() / 5) * 5; 158 selectOption(f, minute_field, padDateValue(minutes)); 159 } 160 161 function padDateValue(str) 162 { 163 if (str.length == 1) { 164 str = '0' + str; 165 } 166 return str; 167 } 168 169 function resizeTextarea(page_name, form_name, field_name, change) 170 { 171 var f = getForm(form_name); 172 var field = getFormElement(f, field_name); 173 field.cols = field.cols + change; 174 var cookie_name = 'textarea_' + page_name + '_' + field_name; 175 setCookie(cookie_name, field.cols, expires); 176 } 177 178 function removeOptionByValue(f, field_name, value) 179 { 180 var field = getFormElement(f, field_name); 181 for (var i = 0; i < field.options.length; i++) { 182 if (field.options[i].value == value) { 183 field.options[i] = null; 184 } 185 } 186 } 187 188 function getTotalCheckboxes(f, field_name) 189 { 190 var total = 0; 191 for (var i = 0; i < f.elements.length; i++) { 192 if (f.elements[i].name == field_name) { 193 total++; 194 } 195 } 196 return total; 197 } 198 199 function getTotalCheckboxesChecked(f, field_name) 200 { 201 var total = 0; 202 for (var i = 0; i < f.elements.length; i++) { 203 if ((f.elements[i].name == field_name) && (f.elements[i].checked)) { 204 total++; 205 } 206 } 207 return total; 208 } 209 210 function hideComboBoxes(except_field) 211 { 212 for (var i = 0; i < document.forms.length; i++) { 213 for (var y = 0; y < document.forms[i].elements.length; y++) { 214 if (((document.forms[i].elements[y].type == 'select-one') || 215 (document.forms[i].elements[y].type == 'select-multiple')) && 216 (document.forms[i].elements[y].name != except_field) && 217 (document.forms[i].elements[y].name != 'lookup') && 218 (document.forms[i].elements[y].name != 'lookup[]')) { 219 document.forms[i].elements[y].style.visibility = 'hidden'; 220 } 221 } 222 } 223 } 224 225 function showComboBoxes() 226 { 227 for (var i = 0; i < document.forms.length; i++) { 228 for (var y = 0; y < document.forms[i].elements.length; y++) { 229 if (((document.forms[i].elements[y].type == 'select-one') || 230 (document.forms[i].elements[y].type == 'select-multiple')) && 231 (document.forms[i].elements[y].name != 'lookup') && 232 (document.forms[i].elements[y].name != 'lookup[]')) { 233 document.forms[i].elements[y].style.visibility = 'visible'; 234 } 235 } 236 } 237 } 238 239 function getOverlibContents(options, target_form, target_field, is_multiple) 240 { 241 hideComboBoxes(target_field); 242 var html = '<form name="overlib_form" onSubmit="javascript:return lookupOption(this, \'' + target_form + '\', \'' + target_field + '\');">' + options + '<br /><input name="search" class="lookup_field_overlib" type="text" size="24" value="paste or start typing here" onBlur="javascript:this.value=\'paste or start typing here\';" onFocus="javascript:this.value=\'\';" onKeyUp="javascript:lookupField(this.form, this, \'lookup'; 243 if ((is_multiple != null) && (is_multiple == true)) { 244 html += '[]'; 245 } 246 html += '\');"><input class="button_overlib" type="submit" value="Lookup"><br />' 247 + '<input type="text" name="id_number" size="24" class="lookup_field_overlib" value="id #" onFocus="javascript:this.value=\'\';">' 248 + '<input type="button" class="button_overlib" value="Add By ID" onClick="lookupByID(document.forms[\'overlib_form\'].id_number, \'' + target_form + '\', \'' + target_field + '\')"></form>'; 249 return html; 250 } 251 252 function getFillInput(options, target_form, target_field) 253 { 254 hideComboBoxes(target_field); 255 return '<form onSubmit="javascript:return fillInput(this, \'' + target_form + '\', \'' + target_field + '\');">' + options + '<input class="button_overlib" type="submit" value="Lookup"><br><input name="search" class="lookup_field_overlib" type="text" size="24" value="paste or start typing here" onBlur="javascript:this.value=\'paste or start typing here\';" onFocus="javascript:this.value=\'\';" onKeyUp="javascript:lookupField(this.form, this, \'lookup\');"></form>'; 256 } 257 258 function lookupOption(f, target_form, target_field) 259 { 260 var w = document; 261 for (var i = 0; i < w.forms.length; i++) { 262 if (w.forms[i].name == target_form) { 263 var test = getFormElement(f, 'lookup'); 264 if (!test) { 265 var field = getFormElement(f, 'lookup[]'); 266 var target = getFormElement(getForm(target_form), target_field); 267 clearSelectedOptions(target); 268 selectOptions(w.forms[i], target_field, getSelectedItems(field)); 269 } else { 270 options = getSelectedOption(f, 'lookup'); 271 if (options == -1) { 272 return false; 273 } 274 selectOption(w.forms[i], target_field, options); 275 } 276 nd(); 277 showComboBoxes(); 278 break; 279 } 280 } 281 return false; 282 } 283 284 function lookupByID(field, target_form, target_field) 285 { 286 if (!isNumberOnly(field.value)) { 287 alert('Please enter numbers only'); 288 } else { 289 // try to find value in targer field. 290 target_obj = document.forms[target_form].elements[target_field]; 291 found = false; 292 for (i = 0;i<target_obj.options.length; i++) { 293 if (target_obj.options[i].value == field.value) { 294 found = true; 295 target_obj.options[i].selected = true; 296 } 297 } 298 if (found == false) { 299 alert('ID #' + field.value + ' was not found'); 300 } else { 301 field.value = ''; 302 // check if we should call "showSelection" 303 if (document.getElementById('selection_' + target_field) != null) { 304 showSelections(target_form, target_field) 305 } 306 } 307 } 308 return false; 309 } 310 311 function fillInput(f, target_form, target_field) 312 { 313 var exists = getFormElement(f, 'lookup'); 314 var target_f = getForm(target_form); 315 if (!exists) { 316 var field = getFormElement(f, 'lookup[]'); 317 var target_field = getFormElement(target_f, target_field); 318 target_field.value = ''; 319 var values = getValues(getSelectedItems(field)); 320 target_field.value = values.join('; '); 321 errorDetails(target_f, target_field, false); 322 } else { 323 var field_value = getSelectedOption(f, 'lookup'); 324 var field = getFormElement(target_f, target_field); 325 field.value = field_value; 326 errorDetails(target_f, target_field, false); 327 } 328 nd(); 329 showComboBoxes(); 330 return false; 331 } 332 333 function lookupField(f, search_field, field_name, callbacks) 334 { 335 var search = search_field.value; 336 if (isWhitespace(search)) { 337 return false; 338 } 339 var target_field = getFormElement(f, field_name); 340 if (!target_field) { 341 target_field = getFormElement(f, field_name + '[]'); 342 } 343 for (var i = 0; i < target_field.options.length; i++) { 344 var value = target_field.options[i].text.toUpperCase(); 345 if (target_field.type == 'select-multiple') { 346 // if we are targetting a multiple select box, then unselect everything 347 // before selecting the matched option 348 if (startsWith(value, search.toUpperCase())) { 349 clearSelectedOptions(target_field); 350 target_field.options[i].selected = true; 351 // handle calling any callbacks 352 if (callbacks != null) { 353 for (var y = 0; y < callbacks.length; y++) { 354 eval(callbacks[y] + ';'); 355 } 356 } 357 return true; 358 } 359 } else { 360 // normal drop-down boxes will search across the option value, and 361 // not just the beginning of it (e.g. '*hello*' instead of 'hello*') 362 if (value.indexOf(search.toUpperCase()) != -1) { 363 target_field.options[i].selected = true; 364 // handle calling any callbacks 365 if (callbacks != null) { 366 for (var y = 0; y < callbacks.length; y++) { 367 eval(callbacks[y] + ';'); 368 } 369 } 370 return true; 371 } 372 } 373 } 374 target_field.selectedIndex = 0; 375 } 376 377 function clearSelectedOptions(field) 378 { 379 for (var i = 0; i < field.options.length; i++) { 380 field.options[i].selected = false; 381 } 382 } 383 384 function selectAllOptions(f, field_name) 385 { 386 var field = getFormElement(f, field_name); 387 for (var y = 0; y < field.options.length; y++) { 388 field.options[y].selected = true; 389 } 390 } 391 392 function selectOptions(f, field_name, values) 393 { 394 var field = getFormElement(f, field_name); 395 for (var i = 0; i < values.length; i++) { 396 for (var y = 0; y < field.options.length; y++) { 397 if (field.options[y].value == values[i].value) { 398 field.options[y].selected = true; 399 } 400 } 401 } 402 } 403 404 function selectOption(f, field_name, value) 405 { 406 field = getFormElement(f, field_name); 407 for (var i = 0; i < field.options.length; i++) { 408 if (field.options[i].value == value) { 409 field.options[i].selected = true; 410 return true; 411 } 412 } 413 } 414 415 function setHiddenFieldValue(f, field_name, value) 416 { 417 var field = getFormElement(f, field_name); 418 field.value = value; 419 } 420 421 function getForm(form_name) 422 { 423 for (var i = 0; i < document.forms.length; i++) { 424 if (document.forms[i].name == form_name) { 425 return document.forms[i]; 426 } 427 } 428 } 429 430 function getPageElement(id) 431 { 432 if (document.getElementById) { 433 return document.getElementById(id); 434 } else if (document.all) { 435 return document.all[id]; 436 } 437 } 438 439 function getOpenerPageElement(name) 440 { 441 if (window.opener.document.getElementById) { 442 return window.opener.document.getElementById(name); 443 } else if (window.opener.document.all) { 444 return window.opener.document.all[name]; 445 } 446 } 447 448 function getFormElement(f, field_name, num) 449 { 450 var elements = document.getElementsByName(field_name); 451 var y = 0; 452 for (var i = 0; i < elements.length; i++) { 453 if (f != elements[i].form) { 454 continue; 455 } 456 if (num != null) { 457 if (y == num) { 458 return elements[i]; 459 } 460 y++; 461 } else { 462 return elements[i]; 463 } 464 } 465 return false; 466 } 467 468 function getSelectedItems(field) 469 { 470 var selected = new Array(); 471 for (var i = 0; i < field.options.length; i++) { 472 if (field.options[i].selected) { 473 selected[selected.length] = field.options[i]; 474 } 475 } 476 return selected; 477 } 478 479 function getSelectedOptionValues(f, field_name) 480 { 481 var field = getFormElement(f, field_name); 482 var selected = new Array(); 483 for (var i = 0; i < field.options.length; i++) { 484 if (field.options[i].selected) { 485 selected[selected.length] = field.options[i].value; 486 } 487 } 488 return selected; 489 } 490 491 function removeAllOptions(f, field_name) 492 { 493 var field = getFormElement(f, field_name); 494 if (field.options.length > 0) { 495 field.options[0] = null; 496 removeAllOptions(f, field_name); 497 } 498 } 499 500 function getValues(list) 501 { 502 var values = new Array(); 503 for (var i = 0; i < list.length; i++) { 504 values[values.length] = list[i].value; 505 } 506 return values; 507 } 508 509 function optionExists(field, option) 510 { 511 for (var i = 0; i < field.options.length; i++) { 512 if (field.options[i].text == option.text) { 513 return true; 514 } 515 } 516 return false; 517 } 518 519 function addOptions(f, field_name, options) 520 { 521 var field = getFormElement(f, field_name); 522 for (var i = 0; i < options.length; i++) { 523 if (!optionExists(field, options[i])) { 524 field.options.length = field.options.length + 1; 525 field.options[field.options.length-1].text = options[i].text; 526 field.options[field.options.length-1].value = options[i].value; 527 } 528 } 529 } 530 531 function replaceParam(str, param, new_value) 532 { 533 if (str.indexOf("?") == -1) { 534 return param + "=" + new_value; 535 } else { 536 var pieces = str.split("?"); 537 var params = pieces[1].split("&"); 538 var new_params = new Array(); 539 for (var i = 0; i < params.length; i++) { 540 if (params[i].indexOf(param + "=") == 0) { 541 params[i] = param + "=" + new_value; 542 } 543 new_params[i] = params[i]; 544 } 545 // check if the parameter doesn't exist on the URL 546 if ((str.indexOf("?" + param + "=") == -1) && (str.indexOf("&" + param + "=") == -1)) { 547 new_params[new_params.length] = param + "=" + new_value; 548 } 549 return new_params.join("&"); 550 } 551 } 552 553 function checkRadio(form_name, field_name, num) 554 { 555 var f = getForm(form_name); 556 var field = getFormElement(f, field_name, num); 557 if (!field.disabled) { 558 field.checked = true; 559 } 560 } 561 562 function toggleCheckbox(form_name, field_name, num) 563 { 564 var f = getForm(form_name); 565 var checkbox = getFormElement(f, field_name, num); 566 if (checkbox.disabled) { 567 return false; 568 } 569 if (checkbox.checked) { 570 checkbox.checked = false; 571 } else { 572 checkbox.checked = true; 573 } 574 } 575 576 var toggle = 'off'; 577 function toggleSelectAll(f, field_name) 578 { 579 for (var i = 0; i < f.elements.length; i++) { 580 if (f.elements[i].disabled) { 581 continue; 582 } 583 if (f.elements[i].name == field_name) { 584 if (toggle == 'off') { 585 f.elements[i].checked = true; 586 } else { 587 f.elements[i].checked = false; 588 } 589 } 590 } 591 if (toggle == 'off') { 592 toggle = 'on'; 593 } else { 594 toggle = 'off'; 595 } 596 } 597 598 function getCookies() 599 { 600 var t = new Array(); 601 var pieces = new Array(); 602 var cookies = new Object(); 603 if (document.cookie) { 604 t = document.cookie.split(';'); 605 for (var i = 0; i < t.length; i++) { 606 pieces = t[i].split('='); 607 eval('cookies.' + pieces[0].replace('[', '_').replace(']', '_') + ' = "' + pieces[1] + '";'); 608 } 609 return cookies; 610 } 611 } 612 613 function isElementVisible(element) 614 { 615 if ((!element.style.display) || (element.style.display == getDisplayStyle())) { 616 return true; 617 } else { 618 return false; 619 } 620 } 621 622 function toggleVisibility(title, create_cookie, use_inline) 623 { 624 var element = getPageElement(title + '1'); 625 if (isElementVisible(element)) { 626 var new_style = 'none'; 627 } else { 628 var new_style = getDisplayStyle(use_inline); 629 } 630 var i = 1; 631 while (1) { 632 element = getPageElement(title + i); 633 if (!element) { 634 break; 635 } 636 element.style.display = new_style; 637 i++; 638 } 639 // if any elements were found, then... 640 if (i > 1) { 641 var link_element = getPageElement(title + '_link'); 642 if (link_element) { 643 if (new_style == 'none') { 644 link_element.innerHTML = 'show'; 645 link_element.title = 'show details about this section'; 646 } else { 647 link_element.innerHTML = 'hide'; 648 link_element.title = 'hide details about this section'; 649 } 650 } 651 } 652 if (((create_cookie == null) || (create_cookie == false)) && (create_cookie != undefined)) { 653 return false; 654 } else { 655 setCookie('visibility_' + title, new_style, expires); 656 } 657 } 658 659 function changeVisibility(title, visibility, use_inline) 660 { 661 var element = getPageElement(title); 662 if (visibility) { 663 var new_style = getDisplayStyle(use_inline); 664 } else { 665 var new_style = 'none'; 666 } 667 element.style.display = new_style; 668 } 669 670 function getDisplayStyle(use_inline) 671 { 672 // kind of hackish, but it works perfectly with IE6 and Mozilla 1.1 673 if (is_ie5up) { 674 if (use_inline == true) { 675 return 'inline'; 676 } else { 677 return 'block'; 678 } 679 } else { 680 return ''; 681 } 682 } 683 684 function getCookie(name) 685 { 686 var start = document.cookie.indexOf(name+"="); 687 var len = start+name.length+1; 688 if ((!start) && (name != document.cookie.substring(0,name.length))) return null; 689 if (start == -1) return null; 690 var end = document.cookie.indexOf(";",len); 691 if (end == -1) end = document.cookie.length; 692 return unescape(document.cookie.substring(len,end)); 693 } 694 695 function setCookie(name, value, expires, path, domain, secure) 696 { 697 document.cookie = name + "=" +escape(value) + 698 ( (expires) ? ";expires=" + expires.toGMTString() : "") + 699 ( (path) ? ";path=" + path : "") + 700 ( (domain) ? ";domain=" + domain : "") + 701 ( (secure) ? ";secure" : ""); 702 } 703 704 function openHelp(rel_url, topic) 705 { 706 var width = 500; 707 var height = 450; 708 var w_offset = 30; 709 var h_offset = 30; 710 var location = 'top=' + h_offset + ',left=' + w_offset + ','; 711 if (screen.width) { 712 location = 'top=' + h_offset + ',left=' + (screen.width - (width + w_offset)) + ','; 713 } 714 var features = 'width=' + width + ',height=' + height + ',' + location + 'resizable=yes,scrollbars=yes,toolbar=no,location=no,menubar=no,status=no'; 715 var helpWin = window.open(rel_url + 'help.php?topic=' + topic, '_help', features); 716 helpWin.focus(); 717 } 718 719 function selectOnlyValidOption(selectObj) 720 { 721 if (selectObj.selectedIndex < 1) { 722 if (selectObj.length == 1) { 723 selectObj.selectedIndex = 0; 724 return; 725 } 726 if (selectObj.length <= 2 && selectObj.options[0].value == -1) { 727 selectObj.selectedIndex = 1; 728 return; 729 } 730 } 731 } 732 733 // this method will confirm that you want the window to close 734 var checkClose = false; 735 var closeConfirmMessage = 'Do you want to close this window?'; 736 function handleClose() 737 { 738 if (checkClose == true) { 739 return closeConfirmMessage; 740 } else { 741 return; 742 } 743 } 744 745 function checkWindowClose(msg) 746 { 747 if (msg == false) { 748 checkClose = false; 749 } else { 750 checkClose = true; 751 closeConfirmMessage = msg; 752 } 753 } 754 755 // Replace special characters MS uses for quotes with normal versions 756 function replaceSpecialCharacters(e) 757 { 758 var s = new String(e.value); 759 var newString = ''; 760 var thisChar; 761 var charCode; 762 for (i = 0; i < s.length; i++) { 763 thisChar = s.charAt(i); 764 charCode = s.charCodeAt(i); 765 if ((charCode == 8220) || (charCode == 8221)) { 766 thisChar = '"'; 767 } else if (charCode == 8217) { 768 thisChar = "'"; 769 } else if (charCode == 8230) { 770 thisChar = "..."; 771 } else if (charCode == 8226) { 772 thisChar = "*"; 773 } else if (charCode == 8211) { 774 thisChar = "-"; 775 } 776 newString = newString + thisChar; 777 } 778 e.value = newString; 779 } 780 781 782 function getEventTarget(e) 783 { 784 var targ; 785 if (!e) var e = window.event; 786 if (e.target) targ = e.target; 787 else if (e.srcElement) targ = e.srcElement; 788 if (targ.nodeType == 3) // defeat Safari bug 789 targ = targ.parentNode; 790 791 return targ; 792 } 793 //-->
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Dec 19 21:21:33 2007 | Cross-referenced by PHPXref 0.7 |