cvs: pearweb /public_html package-search.php /public_html/gifs calendar.gif tri-back.gif tri.gif /public_html/javascript/calendar calendar.css
calendar.js /public_html/javascript/xbApi xbApi.common.js xbApi.dom.js xbApi.ie.js xbApi.loader.js xbApi.ns4.js /templates package-search.html
| From: | Richard Heyes | Date: | Sun, 26 May 2002 22:58:12 +0000 |
| Subject: | cvs: pearweb /public_html package-search.php /public_html/gifs calendar.gif tri-back.gif tri.gif /public_html/javascript/calendar calendar.css calendar.js /public_html/javascript/xbApi xbApi.common.js xbApi.dom.js xbApi.ie.js xbApi.loader.js xbApi.ns4.js /templates package-search.html |
||
| Groups: | php.pear.cvs | ||
| Request: | Send a blank email to pear-cvs+get-4115@lists.php.net to get a copy of this message | ||
richard Sun May 26 18:58:12 2002 EDT
Added files:
/pearweb/templates package-search.html
/pearweb/public_html/gifs tri-back.gif tri.gif calendar.gif
/pearweb/public_html/javascript/calendar calendar.css calendar.js
/pearweb/public_html/javascript/xbApi xbApi.common.js xbApi.dom.js
xbApi.ie.js xbApi.loader.js
xbApi.ns4.js
Modified files:
/pearweb/public_html package-search.php
Log:
* Updated package search with release options. Not quite finished,
still needs to retain the search values when displaying the results.
Index: pearweb/public_html/package-search.php diff -u pearweb/public_html/package-search.php:1.13 pearweb/public_html/package-search.php:1.14 --- pearweb/public_html/package-search.php:1.13 Wed May 22 16:48:48 2002 +++ pearweb/public_html/package-search.php Sun May 26 18:58:11 2002 @@ -1,131 +1,176 @@ <?php -require_once "HTML/Form.php"; +/** +* Filename.......: package-search.php +* Project........: PEAR Website +* Last Modified..: $Date: 2002/05/26 22:58:11 $ +* CVS Revision...: $Revision: 1.14 $ +* +* Searches for packages matching various user definable +* criteria including: +* o Name +* o Maintainer +* o Category +* o Release date (on/before/after) +*/ + $template_dir = dirname(dirname(__FILE__)) . '/templates/'; + require_once "HTML/Form.php"; + +/** +* Setup code for the form +*/ + $form = new HTML_Form($_SERVER['PHP_SELF']); + +/** +* Months for released date dropdowns +*/ + $months[1] = 'January'; + $months[2] = 'February'; + $months[3] = 'March'; + $months[4] = 'April'; + $months[5] = 'May'; + $months[6] = 'June'; + $months[7] = 'July'; + $months[8] = 'August'; + $months[9] = 'September'; + $months[10] = 'October'; + $months[11] = 'November'; + $months[12] = 'December'; + +/** +* Used for the Match: radio buttons +*/ + $bool_and_checked = !isset($_GET['bool']) || $_GET['bool'] == "AND" ? 'checked="checked"' : ''; + $bool_or_checked = @$_GET['bool'] == "OR" ? 'checked="checked"' : ''; -$form = new HTML_Form($_SERVER['PHP_SELF']); +/** +* Code to fetch the current category list +*/ + $category_rows = $dbh->getAll('SELECT id, name FROM categories ORDER BY name', DB_FETCHMODE_ASSOC); /** - * TODO - * - More stuff to search on, eg summary, version - */ - -response_header("Package search"); -echo '<h1>Package search</h1>'; - -$bb = new Borderbox("Search options"); -?> - -<form action="<?php echo $_SERVER['PHP_SELF']?>" method="GET"> -<table border="0"> -<tr> - <td>Package name:</td> - <td valign="middle"> - <?php $form->displayText("pkg_name", @$_GET['pkg_name']); ?> - </td> - <td>Match: - <?php $form->displayRadio("bool", "AND", (@$_GET['bool'] == "AND" || !isset($_GET['bool']))); ?> - All words - <?php $form->displayRadio("bool", "OR", (@$_GET['bool'] == "OR")); ?> - Any word - </td> -</tr> -<tr> - <td>Maintainer:</td> - <td><?php $form->displayText("pkg_maintainer", @$_GET['pkg_maintainer']); ?></td> -</tr> -<tr> - <td>Category:</td> - <td> -<?php -$sth = $dbh->query('SELECT id, name FROM categories ORDER BY name'); - -$rows = array("" => ""); - -while ($row = $sth->fetchRow(DB_FETCHMODE_ASSOC)) { - $rows[$row['id']] = $row['name']; -} - -$form->displaySelect("pkg_category", $rows, @$_GET['pkg_category']); -?> - </td> -</tr> -<tr> - <td> </td> - <td><input type="submit" name="submit" value="Search" /></td> -</tr> -</table> -</form> - -<?php -$bb->end(); - -/*************************************** -** Is form submitted? Do search and show -** results. -***************************************/ - -if(!empty($_GET)) { - $dbh->setFetchmode(DB_FETCHMODE_ASSOC); - $where = array(); - $bool = @$_GET['bool'] == 'AND' ? ' AND ' : ' OR '; - - // Build package name part of query - if(!empty($_GET['pkg_name'])) { - $searchwords = preg_split('/\s+/', $_GET['pkg_name']); - for($i=0; $i<count($searchwords); $i++) { - $searchwords[$i] = "name LIKE '%".addslashes($searchwords[$i])."%'"; - } - $where[] = '('.implode($bool, $searchwords).')'; - } - - // Build maintainer part of query - if(!empty($_GET['pkg_maintainer'])) { - $where[] = "handle LIKE '%".addslashes($_GET['pkg_maintainer'])."%'"; - } - - // Build category part of query - if(!empty($_GET['pkg_category'])) { - $where[] = "category = '".addslashes($_GET['pkg_category'])."'"; - } - - // Compose query and execute - $where = !empty($where) ? 'AND '.implode(' AND ', $where) : ''; - $sql = "SELECT p.id, p.name, p.category, p.summary FROM packages p, maintains m WHERE p.id = m.package " . $where . " GROUP BY p.id ORDER BY p.name"; - $result = $dbh->query($sql); - - // Print any results - if (($numrows = $result->numRows()) > 0) { - - // Paging - include_once('Pager/Pager.php'); - $params['itemData'] = range(0, $numrows - 1); - $pager =& new Pager($params); - list($from, $to) = $pager->getOffsetByPageId(); - $links = $pager->getLinks('<nobr><< Prev</nobr>', '<nobr>Next >></nobr>'); - - // Row number - $rownum = $from - 1; - - echo "<br /><br />\n"; - - // Title of borderbox - $title_html = '<table border="0" width="100%" cellspacing="0" cellpadding="0"><tr>'; - $title_html .= '<td align="left" width="1">' . $links['back'] . '</td>'; - $title_html .= '<td>Search results (' . $from . ' - ' . $to . ' of ' . $numrows . ')</td>'; - $title_html .= '<td align="right" width="1">' . $links['next'] . '</td></tr></table>'; - - $bb = new Borderbox($title_html); - - while ($result->fetchInto($row, DB_FETCHMODE_ASSOC, $rownum++) AND $rownum <= $to) { - echo ' <dt><a href="package-info.php?pacid='.$row['id'].'">'.$row['name'].'</a></dt>'; - echo ' <dd>'.$row['summary'].'</dd>'; - echo ' <br /><br />'; - } - - $bb->end(); - } else { - echo '<p><strong>No results found</strong></p>'; - } -} +* Fetch list of users/maintainers +*/ + $users = $dbh->getAll('SELECT handle, name FROM users ORDER BY name', DB_FETCHMODE_ASSOC); + for ($i=0; $i<count($users); $i++) { + if (empty($users[$i]['name'])) { + $users[$i]['name'] = $users[$i]['handle']; + } + } -response_footer(); +/** +* Is form submitted? Do search and show +* results. +*/ + if (!empty($_GET)) { + $dbh->setFetchmode(DB_FETCHMODE_ASSOC); + $where = array(); + $bool = @$_GET['bool'] == 'AND' ? ' AND ' : ' OR '; + + // Build package name part of query + if (!empty($_GET['pkg_name'])) { + $searchwords = preg_split('/\s+/', $_GET['pkg_name']); + for ($i=0; $i<count($searchwords); $i++) { + $searchwords[$i] = sprintf("name LIKE '%%%s%%'", addslashes($searchwords[$i])); + } + $where[] = '(' . implode($bool, $searchwords) . ')'; + } + + // Build maintainer part of query + if (!empty($_GET['pkg_maintainer'])) { + $where[] = sprintf("handle LIKE '%%%s%%'", addslashes($_GET['pkg_maintainer'])); + } + + // Build category part of query + if (!empty($_GET['pkg_category'])) { + $where[] = sprintf("category = '%s'", addslashes($_GET['pkg_category'])); + } + + /** + * Any release date checking? + */ + $release_join = ''; + // RELEASED_ON + if (!empty($_GET['released_on_year']) AND !empty($_GET['released_on_month']) AND !empty($_GET['released_on_day'])) { + $release_join = ', releases r'; + $where[] = "p.id = r.package"; + $where[] = sprintf("DATE_FORMAT(r.releasedate, '%%Y-%%m-%%d') = '%04d-%02d-%02d'", + (int)$_GET['released_on_year'], + (int)$_GET['released_on_month'], + (int)$_GET['released_on_day']); + } else { + // RELEASED_BEFORE + if (!empty($_GET['released_before_year']) AND !empty($_GET['released_before_month']) AND !empty($_GET['released_before_day'])) { + $release_join = ', releases r'; + $where[] = "p.id = r.package"; + $where[] = sprintf("DATE_FORMAT(r.releasedate, '%%Y-%%m-%%d') <= '%04d-%02d-%02d'", + (int)$_GET['released_before_year'], + (int)$_GET['released_before_month'], + (int)$_GET['released_before_day']); + } + + // RELEASED_SINCE + if (!empty($_GET['released_since_year']) AND !empty($_GET['released_since_month']) AND !empty($_GET['released_since_day'])) { + $release_join = ', releases r'; + $where[] = "p.id = r.package"; + $where[] = sprintf("DATE_FORMAT(r.releasedate, '%%Y-%%m-%%d') >= '%04d-%02d-%02d'", + (int)$_GET['released_since_year'], + (int)$_GET['released_since_month'], + (int)$_GET['released_since_day']); + } + } + + // Compose query and execute + $where = !empty($where) ? 'AND '.implode(' AND ', $where) : ''; + $sql = "SELECT p.id, + p.name, + p.category, + p.summary + FROM packages p, + maintains m + $release_join + WHERE p.id = m.package " . $where . " + GROUP BY p.id + ORDER BY p.name"; + $result = $dbh->query($sql); + + // Run through any results + if (($numrows = $result->numRows()) > 0) { + + // Paging + include_once('Pager/Pager.php'); + $params['itemData'] = range(0, $numrows - 1); + $pager = &new Pager($params); + list($from, $to) = $pager->getOffsetByPageId(); + $links = $pager->getLinks(); + + // Row number + $rownum = $from - 1; + + /** + * Title html for results borderbox obj + * Eww. + */ + $title_html = sprintf('<table border="0" width="100%%" cellspacing="0" cellpadding="0"> + <tr> + <td align="left" width="1"><nobr>%s</nobr></td> + <td><nobr>Search results (%s - %s of %s)</nobr></td> + <td align="right" width="1"><nobr>%s</nobr></td> + </tr> + </table>', + $links['back'], + $from, + $to, + $numrows, + $links['next']); + + while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC, $rownum++) AND $rownum <= $to) { + $search_results[] = $row; + } + } + } + +/** +* Template stuff +*/ + @include($template_dir . 'package-search.html'); ?> Index: pearweb/templates/package-search.html +++ pearweb/templates/package-search.html <?response_header("Package search")?> <h1>Package search</h1> <script type="text/javascript" language="javascript"> <!-- xbApi_onload = []; xbApi_path = 'javascript/xbApi/'; // --> </script> <script language="javascript" src="javascript/xbApi/xbApi.loader.js" type="text/javascript"></script> <script type="text/javascript" language="javascript" src="javascript/calendar/calendar.js" defer></script> <link rel="stylesheet" href="javascript/calendar/calendar.css" media="screen" type="text/css"> <script type="text/javascript" language="javascript"> <!-- doesCalendar = ((IE || DOM) && Win && !Opera); date_updated_released_on = false; date_updated_released_before = false; date_updated_released_since = false; released_on_disabled = false; released_before_disabled = false; released_since_disabled = false; /** * Resets the above variables to false when form is cleared */ function form_reset() { searchForm = document.forms['search']; date_updated_released_on = false; date_updated_released_before = false; date_updated_released_since = false; /** * Re-enable date dropdowns */ searchForm.released_before_year.disabled = false; searchForm.released_before_month.disabled = false; searchForm.released_before_day.disabled = false; searchForm.released_since_year.disabled = false; searchForm.released_since_month.disabled = false; searchForm.released_since_day.disabled = false; searchForm.released_on_year.disabled = false; searchForm.released_on_month.disabled = false; searchForm.released_on_day.disabled = false; released_on_disabled = false; released_before_disabled = false; released_since_disabled = false; } /** * When changed, the date fields in the forms are updated by this */ function update_date(prefix, input) { if (eval('date_updated_' + prefix)) return true; yearElement = xbApi_getFormElement('search', prefix + '_year'); monthElement = xbApi_getFormElement('search', prefix + '_month'); dayElement = xbApi_getFormElement('search', prefix + '_day'); today = new Date(); switch (input) { case 'year': if (xbApi_getFormValue(monthElement) != '' || xbApi_getFormValue(dayElement) != '') return true; xbApi_setFormValue(monthElement, today.getMonth() + 1); xbApi_setFormValue(dayElement, today.getDate()); break; case 'month': if (xbApi_getFormValue(yearElement) != '' || xbApi_getFormValue(dayElement) != '') return true; xbApi_setFormValue(yearElement, today.getFullYear()); xbApi_setFormValue(dayElement, today.getDate()); break; case 'day': if (xbApi_getFormValue(yearElement) != '' || xbApi_getFormValue(monthElement) != '') return true; xbApi_setFormValue(yearElement, today.getFullYear()); xbApi_setFormValue(monthElement, today.getMonth() + 1); break; } disableDateOptions(prefix); eval('date_updated_' + prefix + ' = true'); return true; } /** * Function to disable date dropdowns when the * others are selected. */ function disableDateOptions(prefix) { /** * Disable appropriate option based on what just changed. */ searchForm = document.forms['search']; switch (prefix) { case 'released_on': searchForm.released_before_year.disabled = true; searchForm.released_before_month.disabled = true; searchForm.released_before_day.disabled = true; released_before_disabled = true; searchForm.released_since_year.disabled = true; searchForm.released_since_month.disabled = true; searchForm.released_since_day.disabled = true; released_since_disabled = true; break; case 'released_before': case 'released_since': searchForm.released_on_year.disabled = true; searchForm.released_on_month.disabled = true; searchForm.released_on_day.disabled = true; released_on_disabled = true; break; } } /** * Calendar variables */ calendarImagesPath = 'gifs/'; /** * Callback functions for the calendar */ function setDateFromCalendar_released_on(date, month, year) { date_updated_released_on = true; return setDateFromCalendar('released_on', date, month, year); } function setDateFromCalendar_released_before(date, month, year) { date_updated_released_before = true; return setDateFromCalendar('released_before', date, month, year); } function setDateFromCalendar_released_since(date, month, year) { date_updated_released_since = true; return setDateFromCalendar('released_since', date, month, year); } function setDateFromCalendar(prefix, date, month, year) { if (eval(prefix + '_disabled') == true) { return; } else { disableDateOptions(prefix); } yearElement = xbApi_getFormElement('search', prefix + '_year'); monthElement = xbApi_getFormElement('search', prefix + '_month'); dayElement = xbApi_getFormElement('search', prefix + '_day'); xbApi_setFormValue(yearElement, year); xbApi_setFormValue(monthElement, month); xbApi_setFormValue(dayElement, date); } function validate_form() { onYearElement = xbApi_getFormElement('search', 'released_on_year'); onMonthElement = xbApi_getFormElement('search', 'released_on_month'); onDayElement = xbApi_getFormElement('search', 'released_on_day'); beforeYearElement = xbApi_getFormElement('search', 'released_before_year'); beforeMonthElement = xbApi_getFormElement('search', 'released_before_month'); beforeDayElement = xbApi_getFormElement('search', 'released_before_day'); sinceYearElement = xbApi_getFormElement('search', 'released_since_year'); sinceMonthElement = xbApi_getFormElement('search', 'released_since_month'); sinceDayElement = xbApi_getFormElement('search', 'released_since_day'); released_on_changed = (xbApi_getFormValue(onYearElement) != '' || xbApi_getFormValue(onMonthElement) != '' || xbApi_getFormValue(onDayElement) != ''); released_before_changed = (xbApi_getFormValue(beforeYearElement) != '' || xbApi_getFormValue(beforeMonthElement) != '' || xbApi_getFormValue(beforeDayElement) != ''); released_since_changed = (xbApi_getFormValue(sinceYearElement) != '' || xbApi_getFormValue(sinceMonthElement) != '' || xbApi_getFormValue(sinceDayElement) != ''); if (released_on_changed && (released_since_changed || released_before_changed)) { alert('Cannot combine Released On and Released Before or Since!'); return false; } } // --> </script> <!-- This class prints stuff as part of it's constructor. --> <?$bb = new Borderbox("Search options")?> <form action="<?=$_SERVER['PHP_SELF']?>" method="get" name="search" onsubmit="validate_form()"> <table border="0"> <tr> <td>Package name:</td> <td valign="middle"> <?php $form->displayText("pkg_name", @$_GET['pkg_name']); ?> </td> <td> Match: <input type="radio" name="bool" value="AND" id="bool_and" <?=$bool_and_checked?> /> <label for="bool_and">All words</label> <input type="radio" name="bool" value="or" id="bool_or" <?=$bool_or_checked?> /> <label for="bool_or">Any word</label> </td> </tr> <tr> <td>Maintainer:</td> <td colspan="2"> <input name="pkg_maintainer" type="text" value="<?=$_GET['pkg_maintainer']?>"> <select onchange="document.forms['search'].pkg_maintainer.value = this.options[this.selectedIndex].value; this.selectedIndex = 0"> <option value="">Select user...</option> <?foreach($users as $u):?> <option value="<?=$u['handle']?>"><?=$u['name']?></option> <?endforeach?> </select> </td> </tr> <tr> <td valign="top">Category:</td> <td> <select name="pkg_category" style="width: 100%"> <option value=""></option> <?foreach($category_rows as $c):?> <option value="<?=$c['id']?>"><?=$c['name']?></option> <?endforeach?> </select> </td> <td> </td> </tr> <tr><td colspan="3"> </td></tr> <tr> <td colspan="3"><strong>With a release:</strong></td> </tr> <tr> <td>On:</td> <td colspan="2"> <input type="text" name="released_on_year" value="" size="5" onkeyup="update_date('released_on', 'year')"> <select name="released_on_month" onchange="update_date('released_on', 'month')"> <option value=""></option> <?foreach($months as $num => $text):?> <option value="<?=$num?>"><?=$text?></option> <?endforeach?> </select> <select name="released_on_day" onchange="update_date('released_on', 'day')"> <option value=""></option> <?foreach(range(1, 31) as $value):?> <option value="<?=$value?>"><?=$value?></option> <?endforeach?> </select> <script type="text/javascript" language="javascript"> <!-- if(doesCalendar){ document.write('<a href="javascript: showCalendar(\'setDateFromCalendar_released_on\', \'calendar_released_on\')"><img src="gifs/calendar.gif" border="0"></a>'); document.write('<div id="calendar_released_on" class="calendar" onmouseover="calendarMouseOver(true)" onmouseout="calendarMouseOver(false)"></div>'); } // --> </script> </td> </tr> <tr> <td>Before:</td> <td colspan="2"> <input type="text" name="released_before_year" value="" size="5" onkeyup="update_date('released_before', 'year')"> <select name="released_before_month" onchange="update_date('released_before', 'month')"> <option value=""></option> <?foreach($months as $num => $text):?> <option value="<?=$num?>"><?=$text?></option> <?endforeach?> </select> <select name="released_before_day" onchange="update_date('released_before', 'day')"> <option value=""></option> <?foreach(range(1, 31) as $value):?> <option value="<?=$value?>"><?=$value?></option> <?endforeach?> </select> <script type="text/javascript" language="javascript"> <!-- if(doesCalendar){ document.write('<a href="javascript: showCalendar(\'setDateFromCalendar_released_before\', \'calendar_released_before\')"><img src="gifs/calendar.gif" border="0"></a>'); document.write('<div id="calendar_released_before" class="calendar" onmouseover="calendarMouseOver(true)" onmouseout="calendarMouseOver(false)"></div>'); } // --> </script> </td> </tr> <tr> <td>Since:</td> <td colspan="2"> <input type="text" name="released_since_year" value="" size="5" onkeyup="update_date('released_since', 'year')"> <select name="released_since_month" onchange="update_date('released_since', 'month')"> <option value=""></option> <?foreach($months as $num => $text):?> <option value="<?=$num?>"><?=$text?></option> <?endforeach?> </select> <select name="released_since_day" onchange="update_date('released_since', 'day')"> <option value=""></option> <?foreach(range(1, 31) as $value):?> <option value="<?=$value?>"><?=$value?></option> <?endforeach?> </select> <script type="text/javascript" language="javascript"> <!-- if(doesCalendar){ document.write('<a href="javascript: showCalendar(\'setDateFromCalendar_released_since\', \'calendar_released_since\')"><img src="gifs/calendar.gif" border="0"></a>'); document.write('<div id="calendar_released_since" class="calendar" onmouseover="calendarMouseOver(true)" onmouseout="calendarMouseOver(false)"></div>'); } // --> </script> </td> </tr> <tr> <td> </td> <td colspan="2"> <input type="submit" value="Search" /> <input type="reset" value="Reset" onclick="form_reset()"/> </td> </tr> </table> </form> <?$bb->end()?> <br /><br /> <?if($numrows):?> <?$bb = new Borderbox($title_html)?> <?foreach($search_results as $row):?> <dt><a href="package-info.php?pacid=<?=$row['id']?>"><?=$row['name']?></a></dt> <dd><?=$row['summary']?></dd> <br /><br /> <?endforeach?> <?$bb->end()?> <?elseif($numrows === 0):?> <p> <strong>No results found</strong> </p> <?endif?> <?response_footer()?> Index: pearweb/public_html/javascript/calendar/calendar.css +++ pearweb/public_html/javascript/calendar/calendar.css cal_header{ font-family: Arial, Verdana, Helvetica, Sans-Serif; font-size: 10pt; font-weight: bold; } cal_dayname{ background-color: #eeeeee; border: 1px solid; font-family: Arial, Verdana, Helvetica, Sans-Serif; font-size: 8pt; color: #000000; } cal_day{ background-color: #eeeeee; color: #000000; font-family: Arial, Verdana, Helvetica, Sans-Serif; font-size: 8pt; } cal_day a { color: #000000; } cal_today{ color: #000000; background-color: #ffffff; border: 1px solid; font-family: Arial, Verdana, Helvetica, Sans-Serif; font-size: 8pt; } cal_today a { color: #000000; } calendar { background-color: #ffffff; border: 2px outset white; visibility: hidden; position: absolute; top: 1px; left: 1px; } Index: pearweb/public_html/javascript/calendar/calendar.js +++ pearweb/public_html/javascript/calendar/calendar.js /*************************************** ** Filename.......: calendar.js ** Project........: Popup Calendar ** Last Modified..: $Date: 2002/05/26 22:58:12 $ ** CVS Revision...: $Revision: 1.1 $ ** Copyright......: 2001, 2002 Richard Heyes ***************************************/ /*************************************** ** Shows the calendar ***************************************/ calendar_layers = new Array; // Shows the calendar function showCalendar(callbackFunc, layerId){ // Hide the layer if the button has been clicked again if(xbApi_isLayerVisible(layerId)){ xbApi_hideLayer(layerId); return; }else{ xbApi_showLayer(layerId); xbApi_setLayerPosition(layerId, xbApi_getMouseX()+10, xbApi_getMouseY()); } // Generate date values today = new Date(); date = today.getDate(); month = today.getMonth(); year = today.getFullYear(); showCalendarWithDate(callbackFunc, layerId, month, year); } // Shows the calendar function showCalendarWithDate(callbackFunc, layerId, month, year){ // Register this calendar in the array of layerid calendar_layers[calendar_layers.length] = layerId; // Get the html html = getCalendarHTML(callbackFunc, layerId, month, year); xbApi_setInnerHTML(layerId, html); } /*************************************** ** Returns table for a particular month ***************************************/ function getCalendarHTML(callbackFunc, layerId, month, year){ monthnames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); numdays = xbApi_getDaysInMonth(month, year); today = new Date(); fdate = new Date(year,month,1); first = fdate.getDay(); // First few blanks up to first day ret = new Array(new Array()); for(i=0; i<first; i++){ ret[0][ret[0].length] = '<td> </td>'; } // Main body of calendar row = 0; i = 1; while(i <= numdays){ if(ret[row].length == 7){ ret[++row] = new Array(); } css_class = (i == today.getDate() && month == today.getMonth() && year == today.getFullYear()) ? 'cal_today' : 'cal_day'; ret[row][ret[row].length] = '<td align="center" class="' + css_class + '"><a href="javascript: ' + callbackFunc + '(' + i + ', ' + (month + 1) + ', ' + year + '); xbApi_hideLayer(\'' + layerId + '\')">' + i++ + '</a></td>'; } // Format the HTML for(i=0; i<ret.length; i++){ ret[i] = ret[i].join('\n') + '\n'; } previous_year = fdate.getFullYear(); previous_month = fdate.getMonth() - 1; if(previous_month < 0){ previous_month = 11; previous_year--; } next_year = fdate.getFullYear(); next_month = fdate.getMonth() + 1; if(next_month > 11){ next_month = 0; next_year++; } html = '<table border="0" bgcolor="#eeeeee">'; html += '<tr><td class="cal_header"><a href="javascript: showCalendarWithDate(\'' + callbackFunc + '\', \'' + layerId + '\', ' + previous_month + ', ' + previous_year +')"><img src="' + calendarImagesPath + 'tri-back.gif" alt="<<" border="0" width="10" height="10"></a></td><td colspan="5" align="center" class="cal_header">' + monthnames[fdate.getMonth()] + ' ' + fdate.getFullYear() + '</td><td align="right" class="cal_header"><a href="javascript: showCalendarWithDate(\'' + callbackFunc + '\', \'' + layerId + '\', ' + next_month + ', ' + next_year +')"><img src="' + calendarImagesPath + 'tri.gif" alt=">>" border="0" width="10" height="10"></a></td></tr>'; html += '<tr>'; html += '<td class="cal_dayname">Sun</td>'; html += '<td class="cal_dayname">Mon</td>'; html += '<td class="cal_dayname">Tue</td>'; html += '<td class="cal_dayname">Wed</td>'; html += '<td class="cal_dayname">Thu</td>'; html += '<td class="cal_dayname">Fri</td>'; html += '<td class="cal_dayname">Sat</td></tr>'; html += '<tr>' + ret.join('</tr>\n<tr>') + '</tr>'; html += '</table>'; return html; } /*************************************** ** Onmouse(over|out) event handler ***************************************/ calendar_mouseover = false; function calendarMouseOver(status){ calendar_mouseover = status; return true; } /*************************************** ** Callbacks for document.onclick ***************************************/ calendar_old_onclick = document.onclick ? document.onclick : new Function; document.onclick = function(){ if(!calendar_mouseover){ for(i=0; i<calendar_layers.length; ++i){ xbApi_hideLayer(calendar_layers[i]); } } calendar_old_onclick(); } Index: pearweb/public_html/javascript/xbApi/xbApi.common.js +++ pearweb/public_html/javascript/xbApi/xbApi.common.js /*************************************** ** Form related ***************************************/ // Return a form element function xbApi_getFormElement(form, element){ return document.forms[form].elements[element]; } // Returns a form elements' value function xbApi_getFormValue(element){ return xbApi_formValue('get', element); } // Sets a form elements' value function xbApi_setFormValue(element, value){ return xbApi_formValue('set', element, value); } // Master function for above two function xbApi_formValue(action, formElement, value){ switch(formElement.type){ case 'text': case 'hidden': case 'textarea': return (action == 'set' ? formElement.value = value : formElement.value); break; case 'select-one': if(action == 'get'){ return formElement.options[formElement.selectedIndex].value; }else{ for(i=0; i<formElement.options.length; ++i){ if(formElement.options[i].value == value){ formElement.selectedIndex = i; break; } } } break; case 'select-multiple': if(action == 'get'){ ret = new Array; for(i=0; i<formElement.options.length; ++i){ if(formElement.options[i].selected == true){ ret[ret.length] = formElement.options[i].value; } } return ret; }else{ if(typeof(value) == 'array'){ for(i=0; i<value.length; ++i){ for(j=0; j<formElement.options.length; ++j){ if(formElement.options[j].value == value[i]){ formElement.options[j].selected = true; } } } return true; }else{ for(i=0; i<formElement.options.length; ++i){ if(formElement.options[i].value == value){ formElement.selectedIndex = i; return true; } } } } break; } } /*************************************** ** Date related functions ***************************************/ // Returns number of days in the supplied month function xbApi_getDaysInMonth(month, year){ monthdays = [30, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if(month != 1){ return monthdays[month]; }else{ return (year % 4 == 0 ? 29 : 28); } } /*************************************** ** Mouse related ***************************************/ var mousePosX; var mousePosY; // Returns mouses current X pos function xbApi_getMouseX(){ return mousePosX; } // Returns mouses current Y pos function xbApi_getMouseY(){ return mousePosY; } /*************************************** ** Event callbacks ***************************************/ window.onload = function(){ if (NS4) { document.captureEvents(Event.MOUSEMOVE); } document.onmousemove = xbApi_getMouseXY; for(i=0; i < xbApi_onload.length;i++){ eval(xbApi_onload[i] + '()'); } } Index: pearweb/public_html/javascript/xbApi/xbApi.dom.js +++ pearweb/public_html/javascript/xbApi/xbApi.dom.js /*************************************** ** Layer related ***************************************/ // Shows a layer function xbApi_showLayer(layerId){ document.getElementById(layerId).style.visibility = 'visible'; } // Hides a layer function xbApi_hideLayer(layerId){ document.getElementById(layerId).style.visibility = 'hidden'; } function xbApi_isLayerVisible(layerId){ return (document.getElementById(layerId).style.visibility == 'visible'); } // Sets a layers position function xbApi_setLayerPosition(layerId, Xpos, Ypos){ document.getElementById(layerId).style.left = Xpos; document.getElementById(layerId).style.top = Ypos; } // Sets a layers innerHTML function xbApi_setInnerHTML(layerId, html){ document.getElementById(layerId).innerHTML = html; } /*************************************** ** Mouse related ***************************************/ // Call back for onMouseMove event function xbApi_getMouseXY(e){ mousePosX = e.pageX; mousePosY = e.pageY; return true; } Index: pearweb/public_html/javascript/xbApi/xbApi.ie.js +++ pearweb/public_html/javascript/xbApi/xbApi.ie.js /*************************************** ** Layer related ***************************************/ // Shows a layer function xbApi_showLayer(layerId){ document.all[layerId].style.visibility = 'visible'; } // Hides a layer function xbApi_hideLayer(layerId){ document.all[layerId].style.visibility = 'hidden'; } function xbApi_isLayerVisible(layerId){ return (document.all[layerId].style.visibility == 'visible'); } // Sets a layers position function xbApi_setLayerPosition(layerId, Xpos, Ypos){ document.all[layerId].style.left = Xpos; document.all[layerId].style.top = Ypos; } // Sets a layers innerHTML function xbApi_setInnerHTML(layerId, html){ document.all[layerId].innerHTML = html; } /*************************************** ** Mouse related ***************************************/ // Call back for onMouseMove event function xbApi_getMouseXY(){ mousePosX = event.clientX; + document.body.scrollLeft; mousePosY = event.clientY; + document.body.scrollTop; } Index: pearweb/public_html/javascript/xbApi/xbApi.loader.js +++ pearweb/public_html/javascript/xbApi/xbApi.loader.js /*************************************** ** Browser determination ***************************************/ Mac = (navigator.appVersion.indexOf('Mac') != -1); Nix = (navigator.appVersion.indexOf('X11') != -1); Win = (navigator.appVersion.indexOf('Win') != -1); DOM = (document.getElementById) ? true : false; NS4 = (document.layers) ? true : false; IE = (document.all) ? true : false; IE4 = IE && !DOM; IE4M = IE4 && Mac; Opera = (navigator.userAgent.indexOf('Opera') != -1); Konqueror = (navigator.userAgent.indexOf('Konqueror') != -1); /*************************************** ** Check path variable ***************************************/ if(!xbApi_path){ xbApi_path = ''; } /*************************************** ** Include appropriate browser specific functions ***************************************/ // IE if(IE){ document.write('<script src="' + xbApi_path + 'xbApi.ie.js" type="text/javascript" language="javascript"></script>'); // DOM }else if(DOM){ document.write('<script src="' + xbApi_path + 'xbApi.dom.js" type="text/javascript" language="javascript"></script>'); // Netscape }else if(NS4){ document.write('<script src="' + xbApi_path + 'xbApi.ns4.js" type="text/javascript" language="javascript"></script>'); } /*************************************** ** Load common functions ***************************************/ document.write('<script src="' + xbApi_path + 'xbApi.common.js" type="text/javascript" language="javascript"></script>'); // end Index: pearweb/public_html/javascript/xbApi/xbApi.ns4.js +++ pearweb/public_html/javascript/xbApi/xbApi.ns4.js /*************************************** ** Layer related ***************************************/ // Shows a layer function xbApi_showLayer(layerId){ document.layers[layerId].visibility = 'show'; } // Hides a layer function xbApi_hideLayer(layerId){ document.layers[layerId].visibility = 'hide'; } function xbApi_isLayerVisible(layerId){ return (document.layers[layerId].visibility == 'show'); } // Sets a layers position function xbApi_setLayerPosition(layerId, Xpos, Ypos){ document.layers[layerId].left = Xpos; document.layers[layerId].top = Ypos; } // Sets a layers innerHTML function xbApi_setInnerHTML(layerId, html){ document.layers[layerId].document.open(); document.layers[layerId].document.write(html) document.layers[layerId].document.close(); } /*************************************** ** Mouse related ***************************************/ // Call back for onMouseMove event function xbApi_getMouseXY(e){ mousePosX = e.pageX; mousePosY = e.pageY; return true; }
Index: pearweb/public_html/package-search.php diff -u pearweb/public_html/package-search.php:1.13 pearweb/public_html/package-search.php:1.14 --- pearweb/public_html/package-search.php:1.13 Wed May 22 16:48:48 2002 +++ pearweb/public_html/package-search.php Sun May 26 18:58:11 2002 @@ -1,131 +1,176 @@ <?php -require_once "HTML/Form.php"; +/** +* Filename.......: package-search.php +* Project........: PEAR Website +* Last Modified..: $Date: 2002/05/26 22:58:11 $ +* CVS Revision...: $Revision: 1.14 $ +* +* Searches for packages matching various user definable +* criteria including: +* o Name +* o Maintainer +* o Category +* o Release date (on/before/after) +*/ + $template_dir = dirname(dirname(__FILE__)) . '/templates/'; + require_once "HTML/Form.php"; + +/** +* Setup code for the form +*/ + $form = new HTML_Form($_SERVER['PHP_SELF']); + +/** +* Months for released date dropdowns +*/ + $months[1] = 'January'; + $months[2] = 'February'; + $months[3] = 'March'; + $months[4] = 'April'; + $months[5] = 'May'; + $months[6] = 'June'; + $months[7] = 'July'; + $months[8] = 'August'; + $months[9] = 'September'; + $months[10] = 'October'; + $months[11] = 'November'; + $months[12] = 'December'; + +/** +* Used for the Match: radio buttons +*/ + $bool_and_checked = !isset($_GET['bool']) || $_GET['bool'] == "AND" ? 'checked="checked"' : ''; + $bool_or_checked = @$_GET['bool'] == "OR" ? 'checked="checked"' : ''; -$form = new HTML_Form($_SERVER['PHP_SELF']); +/** +* Code to fetch the current category list +*/ + $category_rows = $dbh->getAll('SELECT id, name FROM categories ORDER BY name', DB_FETCHMODE_ASSOC); /** - * TODO - * - More stuff to search on, eg summary, version - */ - -response_header("Package search"); -echo '<h1>Package search</h1>'; - -$bb = new Borderbox("Search options"); -?> - -<form action="<?php echo $_SERVER['PHP_SELF']?>" method="GET"> -<table border="0"> -<tr> - <td>Package name:</td> - <td valign="middle"> - <?php $form->displayText("pkg_name", @$_GET['pkg_name']); ?> - </td> - <td>Match: - <?php $form->displayRadio("bool", "AND", (@$_GET['bool'] == "AND" || !isset($_GET['bool']))); ?> - All words - <?php $form->displayRadio("bool", "OR", (@$_GET['bool'] == "OR")); ?> - Any word - </td> -</tr> -<tr> - <td>Maintainer:</td> - <td><?php $form->displayText("pkg_maintainer", @$_GET['pkg_maintainer']); ?></td> -</tr> -<tr> - <td>Category:</td> - <td> -<?php -$sth = $dbh->query('SELECT id, name FROM categories ORDER BY name'); - -$rows = array("" => ""); - -while ($row = $sth->fetchRow(DB_FETCHMODE_ASSOC)) { - $rows[$row['id']] = $row['name']; -} - -$form->displaySelect("pkg_category", $rows, @$_GET['pkg_category']); -?> - </td> -</tr> -<tr> - <td> </td> - <td><input type="submit" name="submit" value="Search" /></td> -</tr> -</table> -</form> - -<?php -$bb->end(); - -/*************************************** -** Is form submitted? Do search and show -** results. -***************************************/ - -if(!empty($_GET)) { - $dbh->setFetchmode(DB_FETCHMODE_ASSOC); - $where = array(); - $bool = @$_GET['bool'] == 'AND' ? ' AND ' : ' OR '; - - // Build package name part of query - if(!empty($_GET['pkg_name'])) { - $searchwords = preg_split('/\s+/', $_GET['pkg_name']); - for($i=0; $i<count($searchwords); $i++) { - $searchwords[$i] = "name LIKE '%".addslashes($searchwords[$i])."%'"; - } - $where[] = '('.implode($bool, $searchwords).')'; - } - - // Build maintainer part of query - if(!empty($_GET['pkg_maintainer'])) { - $where[] = "handle LIKE '%".addslashes($_GET['pkg_maintainer'])."%'"; - } - - // Build category part of query - if(!empty($_GET['pkg_category'])) { - $where[] = "category = '".addslashes($_GET['pkg_category'])."'"; - } - - // Compose query and execute - $where = !empty($where) ? 'AND '.implode(' AND ', $where) : ''; - $sql = "SELECT p.id, p.name, p.category, p.summary FROM packages p, maintains m WHERE p.id = m.package " . $where . " GROUP BY p.id ORDER BY p.name"; - $result = $dbh->query($sql); - - // Print any results - if (($numrows = $result->numRows()) > 0) { - - // Paging - include_once('Pager/Pager.php'); - $params['itemData'] = range(0, $numrows - 1); - $pager =& new Pager($params); - list($from, $to) = $pager->getOffsetByPageId(); - $links = $pager->getLinks('<nobr><< Prev</nobr>', '<nobr>Next >></nobr>'); - - // Row number - $rownum = $from - 1; - - echo "<br /><br />\n"; - - // Title of borderbox - $title_html = '<table border="0" width="100%" cellspacing="0" cellpadding="0"><tr>'; - $title_html .= '<td align="left" width="1">' . $links['back'] . '</td>'; - $title_html .= '<td>Search results (' . $from . ' - ' . $to . ' of ' . $numrows . ')</td>'; - $title_html .= '<td align="right" width="1">' . $links['next'] . '</td></tr></table>'; - - $bb = new Borderbox($title_html); - - while ($result->fetchInto($row, DB_FETCHMODE_ASSOC, $rownum++) AND $rownum <= $to) { - echo ' <dt><a href="package-info.php?pacid='.$row['id'].'">'.$row['name'].'</a></dt>'; - echo ' <dd>'.$row['summary'].'</dd>'; - echo ' <br /><br />'; - } - - $bb->end(); - } else { - echo '<p><strong>No results found</strong></p>'; - } -} +* Fetch list of users/maintainers +*/ + $users = $dbh->getAll('SELECT handle, name FROM users ORDER BY name', DB_FETCHMODE_ASSOC); + for ($i=0; $i<count($users); $i++) { + if (empty($users[$i]['name'])) { + $users[$i]['name'] = $users[$i]['handle']; + } + } -response_footer(); +/** +* Is form submitted? Do search and show +* results. +*/ + if (!empty($_GET)) { + $dbh->setFetchmode(DB_FETCHMODE_ASSOC); + $where = array(); + $bool = @$_GET['bool'] == 'AND' ? ' AND ' : ' OR '; + + // Build package name part of query + if (!empty($_GET['pkg_name'])) { + $searchwords = preg_split('/\s+/', $_GET['pkg_name']); + for ($i=0; $i<count($searchwords); $i++) { + $searchwords[$i] = sprintf("name LIKE '%%%s%%'", addslashes($searchwords[$i])); + } + $where[] = '(' . implode($bool, $searchwords) . ')'; + } + + // Build maintainer part of query + if (!empty($_GET['pkg_maintainer'])) { + $where[] = sprintf("handle LIKE '%%%s%%'", addslashes($_GET['pkg_maintainer'])); + } + + // Build category part of query + if (!empty($_GET['pkg_category'])) { + $where[] = sprintf("category = '%s'", addslashes($_GET['pkg_category'])); + } + + /** + * Any release date checking? + */ + $release_join = ''; + // RELEASED_ON + if (!empty($_GET['released_on_year']) AND !empty($_GET['released_on_month']) AND !empty($_GET['released_on_day'])) { + $release_join = ', releases r'; + $where[] = "p.id = r.package"; + $where[] = sprintf("DATE_FORMAT(r.releasedate, '%%Y-%%m-%%d') = '%04d-%02d-%02d'", + (int)$_GET['released_on_year'], + (int)$_GET['released_on_month'], + (int)$_GET['released_on_day']); + } else { + // RELEASED_BEFORE + if (!empty($_GET['released_before_year']) AND !empty($_GET['released_before_month']) AND !empty($_GET['released_before_day'])) { + $release_join = ', releases r'; + $where[] = "p.id = r.package"; + $where[] = sprintf("DATE_FORMAT(r.releasedate, '%%Y-%%m-%%d') <= '%04d-%02d-%02d'", + (int)$_GET['released_before_year'], + (int)$_GET['released_before_month'], + (int)$_GET['released_before_day']); + } + + // RELEASED_SINCE + if (!empty($_GET['released_since_year']) AND !empty($_GET['released_since_month']) AND !empty($_GET['released_since_day'])) { + $release_join = ', releases r'; + $where[] = "p.id = r.package"; + $where[] = sprintf("DATE_FORMAT(r.releasedate, '%%Y-%%m-%%d') >= '%04d-%02d-%02d'", + (int)$_GET['released_since_year'], + (int)$_GET['released_since_month'], + (int)$_GET['released_since_day']); + } + } + + // Compose query and execute + $where = !empty($where) ? 'AND '.implode(' AND ', $where) : ''; + $sql = "SELECT p.id, + p.name, + p.category, + p.summary + FROM packages p, + maintains m + $release_join + WHERE p.id = m.package " . $where . " + GROUP BY p.id + ORDER BY p.name"; + $result = $dbh->query($sql); + + // Run through any results + if (($numrows = $result->numRows()) > 0) { + + // Paging + include_once('Pager/Pager.php'); + $params['itemData'] = range(0, $numrows - 1); + $pager = &new Pager($params); + list($from, $to) = $pager->getOffsetByPageId(); + $links = $pager->getLinks(); + + // Row number + $rownum = $from - 1; + + /** + * Title html for results borderbox obj + * Eww. + */ + $title_html = sprintf('<table border="0" width="100%%" cellspacing="0" cellpadding="0"> + <tr> + <td align="left" width="1"><nobr>%s</nobr></td> + <td><nobr>Search results (%s - %s of %s)</nobr></td> + <td align="right" width="1"><nobr>%s</nobr></td> + </tr> + </table>', + $links['back'], + $from, + $to, + $numrows, + $links['next']); + + while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC, $rownum++) AND $rownum <= $to) { + $search_results[] = $row; + } + } + } + +/** +* Template stuff +*/ + @include($template_dir . 'package-search.html'); ?> Index: pearweb/templates/package-search.html +++ pearweb/templates/package-search.html <?response_header("Package search")?> <h1>Package search</h1> <script type="text/javascript" language="javascript"> <!-- xbApi_onload = []; xbApi_path = 'javascript/xbApi/'; // --> </script> <script language="javascript" src="javascript/xbApi/xbApi.loader.js" type="text/javascript"></script> <script type="text/javascript" language="javascript" src="javascript/calendar/calendar.js" defer></script> <link rel="stylesheet" href="javascript/calendar/calendar.css" media="screen" type="text/css"> <script type="text/javascript" language="javascript"> <!-- doesCalendar = ((IE || DOM) && Win && !Opera); date_updated_released_on = false; date_updated_released_before = false; date_updated_released_since = false; released_on_disabled = false; released_before_disabled = false; released_since_disabled = false; /** * Resets the above variables to false when form is cleared */ function form_reset() { searchForm = document.forms['search']; date_updated_released_on = false; date_updated_released_before = false; date_updated_released_since = false; /** * Re-enable date dropdowns */ searchForm.released_before_year.disabled = false; searchForm.released_before_month.disabled = false; searchForm.released_before_day.disabled = false; searchForm.released_since_year.disabled = false; searchForm.released_since_month.disabled = false; searchForm.released_since_day.disabled = false; searchForm.released_on_year.disabled = false; searchForm.released_on_month.disabled = false; searchForm.released_on_day.disabled = false; released_on_disabled = false; released_before_disabled = false; released_since_disabled = false; } /** * When changed, the date fields in the forms are updated by this */ function update_date(prefix, input) { if (eval('date_updated_' + prefix)) return true; yearElement = xbApi_getFormElement('search', prefix + '_year'); monthElement = xbApi_getFormElement('search', prefix + '_month'); dayElement = xbApi_getFormElement('search', prefix + '_day'); today = new Date(); switch (input) { case 'year': if (xbApi_getFormValue(monthElement) != '' || xbApi_getFormValue(dayElement) != '') return true; xbApi_setFormValue(monthElement, today.getMonth() + 1); xbApi_setFormValue(dayElement, today.getDate()); break; case 'month': if (xbApi_getFormValue(yearElement) != '' || xbApi_getFormValue(dayElement) != '') return true; xbApi_setFormValue(yearElement, today.getFullYear()); xbApi_setFormValue(dayElement, today.getDate()); break; case 'day': if (xbApi_getFormValue(yearElement) != '' || xbApi_getFormValue(monthElement) != '') return true; xbApi_setFormValue(yearElement, today.getFullYear()); xbApi_setFormValue(monthElement, today.getMonth() + 1); break; } disableDateOptions(prefix); eval('date_updated_' + prefix + ' = true'); return true; } /** * Function to disable date dropdowns when the * others are selected. */ function disableDateOptions(prefix) { /** * Disable appropriate option based on what just changed. */ searchForm = document.forms['search']; switch (prefix) { case 'released_on': searchForm.released_before_year.disabled = true; searchForm.released_before_month.disabled = true; searchForm.released_before_day.disabled = true; released_before_disabled = true; searchForm.released_since_year.disabled = true; searchForm.released_since_month.disabled = true; searchForm.released_since_day.disabled = true; released_since_disabled = true; break; case 'released_before': case 'released_since': searchForm.released_on_year.disabled = true; searchForm.released_on_month.disabled = true; searchForm.released_on_day.disabled = true; released_on_disabled = true; break; } } /** * Calendar variables */ calendarImagesPath = 'gifs/'; /** * Callback functions for the calendar */ function setDateFromCalendar_released_on(date, month, year) { date_updated_released_on = true; return setDateFromCalendar('released_on', date, month, year); } function setDateFromCalendar_released_before(date, month, year) { date_updated_released_before = true; return setDateFromCalendar('released_before', date, month, year); } function setDateFromCalendar_released_since(date, month, year) { date_updated_released_since = true; return setDateFromCalendar('released_since', date, month, year); } function setDateFromCalendar(prefix, date, month, year) { if (eval(prefix + '_disabled') == true) { return; } else { disableDateOptions(prefix); } yearElement = xbApi_getFormElement('search', prefix + '_year'); monthElement = xbApi_getFormElement('search', prefix + '_month'); dayElement = xbApi_getFormElement('search', prefix + '_day'); xbApi_setFormValue(yearElement, year); xbApi_setFormValue(monthElement, month); xbApi_setFormValue(dayElement, date); } function validate_form() { onYearElement = xbApi_getFormElement('search', 'released_on_year'); onMonthElement = xbApi_getFormElement('search', 'released_on_month'); onDayElement = xbApi_getFormElement('search', 'released_on_day'); beforeYearElement = xbApi_getFormElement('search', 'released_before_year'); beforeMonthElement = xbApi_getFormElement('search', 'released_before_month'); beforeDayElement = xbApi_getFormElement('search', 'released_before_day'); sinceYearElement = xbApi_getFormElement('search', 'released_since_year'); sinceMonthElement = xbApi_getFormElement('search', 'released_since_month'); sinceDayElement = xbApi_getFormElement('search', 'released_since_day'); released_on_changed = (xbApi_getFormValue(onYearElement) != '' || xbApi_getFormValue(onMonthElement) != '' || xbApi_getFormValue(onDayElement) != ''); released_before_changed = (xbApi_getFormValue(beforeYearElement) != '' || xbApi_getFormValue(beforeMonthElement) != '' || xbApi_getFormValue(beforeDayElement) != ''); released_since_changed = (xbApi_getFormValue(sinceYearElement) != '' || xbApi_getFormValue(sinceMonthElement) != '' || xbApi_getFormValue(sinceDayElement) != ''); if (released_on_changed && (released_since_changed || released_before_changed)) { alert('Cannot combine Released On and Released Before or Since!'); return false; } } // --> </script> <!-- This class prints stuff as part of it's constructor. --> <?$bb = new Borderbox("Search options")?> <form action="<?=$_SERVER['PHP_SELF']?>" method="get" name="search" onsubmit="validate_form()"> <table border="0"> <tr> <td>Package name:</td> <td valign="middle"> <?php $form->displayText("pkg_name", @$_GET['pkg_name']); ?> </td> <td> Match: <input type="radio" name="bool" value="AND" id="bool_and" <?=$bool_and_checked?> /> <label for="bool_and">All words</label> <input type="radio" name="bool" value="or" id="bool_or" <?=$bool_or_checked?> /> <label for="bool_or">Any word</label> </td> </tr> <tr> <td>Maintainer:</td> <td colspan="2"> <input name="pkg_maintainer" type="text" value="<?=$_GET['pkg_maintainer']?>"> <select onchange="document.forms['search'].pkg_maintainer.value = this.options[this.selectedIndex].value; this.selectedIndex = 0"> <option value="">Select user...</option> <?foreach($users as $u):?> <option value="<?=$u['handle']?>"><?=$u['name']?></option> <?endforeach?> </select> </td> </tr> <tr> <td valign="top">Category:</td> <td> <select name="pkg_category" style="width: 100%"> <option value=""></option> <?foreach($category_rows as $c):?> <option value="<?=$c['id']?>"><?=$c['name']?></option> <?endforeach?> </select> </td> <td> </td> </tr> <tr><td colspan="3"> </td></tr> <tr> <td colspan="3"><strong>With a release:</strong></td> </tr> <tr> <td>On:</td> <td colspan="2"> <input type="text" name="released_on_year" value="" size="5" onkeyup="update_date('released_on', 'year')"> <select name="released_on_month" onchange="update_date('released_on', 'month')"> <option value=""></option> <?foreach($months as $num => $text):?> <option value="<?=$num?>"><?=$text?></option> <?endforeach?> </select> <select name="released_on_day" onchange="update_date('released_on', 'day')"> <option value=""></option> <?foreach(range(1, 31) as $value):?> <option value="<?=$value?>"><?=$value?></option> <?endforeach?> </select> <script type="text/javascript" language="javascript"> <!-- if(doesCalendar){ document.write('<a href="javascript: showCalendar(\'setDateFromCalendar_released_on\', \'calendar_released_on\')"><img src="gifs/calendar.gif" border="0"></a>'); document.write('<div id="calendar_released_on" class="calendar" onmouseover="calendarMouseOver(true)" onmouseout="calendarMouseOver(false)"></div>'); } // --> </script> </td> </tr> <tr> <td>Before:</td> <td colspan="2"> <input type="text" name="released_before_year" value="" size="5" onkeyup="update_date('released_before', 'year')"> <select name="released_before_month" onchange="update_date('released_before', 'month')"> <option value=""></option> <?foreach($months as $num => $text):?> <option value="<?=$num?>"><?=$text?></option> <?endforeach?> </select> <select name="released_before_day" onchange="update_date('released_before', 'day')"> <option value=""></option> <?foreach(range(1, 31) as $value):?> <option value="<?=$value?>"><?=$value?></option> <?endforeach?> </select> <script type="text/javascript" language="javascript"> <!-- if(doesCalendar){ document.write('<a href="javascript: showCalendar(\'setDateFromCalendar_released_before\', \'calendar_released_before\')"><img src="gifs/calendar.gif" border="0"></a>'); document.write('<div id="calendar_released_before" class="calendar" onmouseover="calendarMouseOver(true)" onmouseout="calendarMouseOver(false)"></div>'); } // --> </script> </td> </tr> <tr> <td>Since:</td> <td colspan="2"> <input type="text" name="released_since_year" value="" size="5" onkeyup="update_date('released_since', 'year')"> <select name="released_since_month" onchange="update_date('released_since', 'month')"> <option value=""></option> <?foreach($months as $num => $text):?> <option value="<?=$num?>"><?=$text?></option> <?endforeach?> </select> <select name="released_since_day" onchange="update_date('released_since', 'day')"> <option value=""></option> <?foreach(range(1, 31) as $value):?> <option value="<?=$value?>"><?=$value?></option> <?endforeach?> </select> <script type="text/javascript" language="javascript"> <!-- if(doesCalendar){ document.write('<a href="javascript: showCalendar(\'setDateFromCalendar_released_since\', \'calendar_released_since\')"><img src="gifs/calendar.gif" border="0"></a>'); document.write('<div id="calendar_released_since" class="calendar" onmouseover="calendarMouseOver(true)" onmouseout="calendarMouseOver(false)"></div>'); } // --> </script> </td> </tr> <tr> <td> </td> <td colspan="2"> <input type="submit" value="Search" /> <input type="reset" value="Reset" onclick="form_reset()"/> </td> </tr> </table> </form> <?$bb->end()?> <br /><br /> <?if($numrows):?> <?$bb = new Borderbox($title_html)?> <?foreach($search_results as $row):?> <dt><a href="package-info.php?pacid=<?=$row['id']?>"><?=$row['name']?></a></dt> <dd><?=$row['summary']?></dd> <br /><br /> <?endforeach?> <?$bb->end()?> <?elseif($numrows === 0):?> <p> <strong>No results found</strong> </p> <?endif?> <?response_footer()?> Index: pearweb/public_html/javascript/calendar/calendar.css +++ pearweb/public_html/javascript/calendar/calendar.css cal_header{ font-family: Arial, Verdana, Helvetica, Sans-Serif; font-size: 10pt; font-weight: bold; } cal_dayname{ background-color: #eeeeee; border: 1px solid; font-family: Arial, Verdana, Helvetica, Sans-Serif; font-size: 8pt; color: #000000; } cal_day{ background-color: #eeeeee; color: #000000; font-family: Arial, Verdana, Helvetica, Sans-Serif; font-size: 8pt; } cal_day a { color: #000000; } cal_today{ color: #000000; background-color: #ffffff; border: 1px solid; font-family: Arial, Verdana, Helvetica, Sans-Serif; font-size: 8pt; } cal_today a { color: #000000; } calendar { background-color: #ffffff; border: 2px outset white; visibility: hidden; position: absolute; top: 1px; left: 1px; } Index: pearweb/public_html/javascript/calendar/calendar.js +++ pearweb/public_html/javascript/calendar/calendar.js /*************************************** ** Filename.......: calendar.js ** Project........: Popup Calendar ** Last Modified..: $Date: 2002/05/26 22:58:12 $ ** CVS Revision...: $Revision: 1.1 $ ** Copyright......: 2001, 2002 Richard Heyes ***************************************/ /*************************************** ** Shows the calendar ***************************************/ calendar_layers = new Array; // Shows the calendar function showCalendar(callbackFunc, layerId){ // Hide the layer if the button has been clicked again if(xbApi_isLayerVisible(layerId)){ xbApi_hideLayer(layerId); return; }else{ xbApi_showLayer(layerId); xbApi_setLayerPosition(layerId, xbApi_getMouseX()+10, xbApi_getMouseY()); } // Generate date values today = new Date(); date = today.getDate(); month = today.getMonth(); year = today.getFullYear(); showCalendarWithDate(callbackFunc, layerId, month, year); } // Shows the calendar function showCalendarWithDate(callbackFunc, layerId, month, year){ // Register this calendar in the array of layerid calendar_layers[calendar_layers.length] = layerId; // Get the html html = getCalendarHTML(callbackFunc, layerId, month, year); xbApi_setInnerHTML(layerId, html); } /*************************************** ** Returns table for a particular month ***************************************/ function getCalendarHTML(callbackFunc, layerId, month, year){ monthnames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); numdays = xbApi_getDaysInMonth(month, year); today = new Date(); fdate = new Date(year,month,1); first = fdate.getDay(); // First few blanks up to first day ret = new Array(new Array()); for(i=0; i<first; i++){ ret[0][ret[0].length] = '<td> </td>'; } // Main body of calendar row = 0; i = 1; while(i <= numdays){ if(ret[row].length == 7){ ret[++row] = new Array(); } css_class = (i == today.getDate() && month == today.getMonth() && year == today.getFullYear()) ? 'cal_today' : 'cal_day'; ret[row][ret[row].length] = '<td align="center" class="' + css_class + '"><a href="javascript: ' + callbackFunc + '(' + i + ', ' + (month + 1) + ', ' + year + '); xbApi_hideLayer(\'' + layerId + '\')">' + i++ + '</a></td>'; } // Format the HTML for(i=0; i<ret.length; i++){ ret[i] = ret[i].join('\n') + '\n'; } previous_year = fdate.getFullYear(); previous_month = fdate.getMonth() - 1; if(previous_month < 0){ previous_month = 11; previous_year--; } next_year = fdate.getFullYear(); next_month = fdate.getMonth() + 1; if(next_month > 11){ next_month = 0; next_year++; } html = '<table border="0" bgcolor="#eeeeee">'; html += '<tr><td class="cal_header"><a href="javascript: showCalendarWithDate(\'' + callbackFunc + '\', \'' + layerId + '\', ' + previous_month + ', ' + previous_year +')"><img src="' + calendarImagesPath + 'tri-back.gif" alt="<<" border="0" width="10" height="10"></a></td><td colspan="5" align="center" class="cal_header">' + monthnames[fdate.getMonth()] + ' ' + fdate.getFullYear() + '</td><td align="right" class="cal_header"><a href="javascript: showCalendarWithDate(\'' + callbackFunc + '\', \'' + layerId + '\', ' + next_month + ', ' + next_year +')"><img src="' + calendarImagesPath + 'tri.gif" alt=">>" border="0" width="10" height="10"></a></td></tr>'; html += '<tr>'; html += '<td class="cal_dayname">Sun</td>'; html += '<td class="cal_dayname">Mon</td>'; html += '<td class="cal_dayname">Tue</td>'; html += '<td class="cal_dayname">Wed</td>'; html += '<td class="cal_dayname">Thu</td>'; html += '<td class="cal_dayname">Fri</td>'; html += '<td class="cal_dayname">Sat</td></tr>'; html += '<tr>' + ret.join('</tr>\n<tr>') + '</tr>'; html += '</table>'; return html; } /*************************************** ** Onmouse(over|out) event handler ***************************************/ calendar_mouseover = false; function calendarMouseOver(status){ calendar_mouseover = status; return true; } /*************************************** ** Callbacks for document.onclick ***************************************/ calendar_old_onclick = document.onclick ? document.onclick : new Function; document.onclick = function(){ if(!calendar_mouseover){ for(i=0; i<calendar_layers.length; ++i){ xbApi_hideLayer(calendar_layers[i]); } } calendar_old_onclick(); } Index: pearweb/public_html/javascript/xbApi/xbApi.common.js +++ pearweb/public_html/javascript/xbApi/xbApi.common.js /*************************************** ** Form related ***************************************/ // Return a form element function xbApi_getFormElement(form, element){ return document.forms[form].elements[element]; } // Returns a form elements' value function xbApi_getFormValue(element){ return xbApi_formValue('get', element); } // Sets a form elements' value function xbApi_setFormValue(element, value){ return xbApi_formValue('set', element, value); } // Master function for above two function xbApi_formValue(action, formElement, value){ switch(formElement.type){ case 'text': case 'hidden': case 'textarea': return (action == 'set' ? formElement.value = value : formElement.value); break; case 'select-one': if(action == 'get'){ return formElement.options[formElement.selectedIndex].value; }else{ for(i=0; i<formElement.options.length; ++i){ if(formElement.options[i].value == value){ formElement.selectedIndex = i; break; } } } break; case 'select-multiple': if(action == 'get'){ ret = new Array; for(i=0; i<formElement.options.length; ++i){ if(formElement.options[i].selected == true){ ret[ret.length] = formElement.options[i].value; } } return ret; }else{ if(typeof(value) == 'array'){ for(i=0; i<value.length; ++i){ for(j=0; j<formElement.options.length; ++j){ if(formElement.options[j].value == value[i]){ formElement.options[j].selected = true; } } } return true; }else{ for(i=0; i<formElement.options.length; ++i){ if(formElement.options[i].value == value){ formElement.selectedIndex = i; return true; } } } } break; } } /*************************************** ** Date related functions ***************************************/ // Returns number of days in the supplied month function xbApi_getDaysInMonth(month, year){ monthdays = [30, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if(month != 1){ return monthdays[month]; }else{ return (year % 4 == 0 ? 29 : 28); } } /*************************************** ** Mouse related ***************************************/ var mousePosX; var mousePosY; // Returns mouses current X pos function xbApi_getMouseX(){ return mousePosX; } // Returns mouses current Y pos function xbApi_getMouseY(){ return mousePosY; } /*************************************** ** Event callbacks ***************************************/ window.onload = function(){ if (NS4) { document.captureEvents(Event.MOUSEMOVE); } document.onmousemove = xbApi_getMouseXY; for(i=0; i < xbApi_onload.length;i++){ eval(xbApi_onload[i] + '()'); } } Index: pearweb/public_html/javascript/xbApi/xbApi.dom.js +++ pearweb/public_html/javascript/xbApi/xbApi.dom.js /*************************************** ** Layer related ***************************************/ // Shows a layer function xbApi_showLayer(layerId){ document.getElementById(layerId).style.visibility = 'visible'; } // Hides a layer function xbApi_hideLayer(layerId){ document.getElementById(layerId).style.visibility = 'hidden'; } function xbApi_isLayerVisible(layerId){ return (document.getElementById(layerId).style.visibility == 'visible'); } // Sets a layers position function xbApi_setLayerPosition(layerId, Xpos, Ypos){ document.getElementById(layerId).style.left = Xpos; document.getElementById(layerId).style.top = Ypos; } // Sets a layers innerHTML function xbApi_setInnerHTML(layerId, html){ document.getElementById(layerId).innerHTML = html; } /*************************************** ** Mouse related ***************************************/ // Call back for onMouseMove event function xbApi_getMouseXY(e){ mousePosX = e.pageX; mousePosY = e.pageY; return true; } Index: pearweb/public_html/javascript/xbApi/xbApi.ie.js +++ pearweb/public_html/javascript/xbApi/xbApi.ie.js /*************************************** ** Layer related ***************************************/ // Shows a layer function xbApi_showLayer(layerId){ document.all[layerId].style.visibility = 'visible'; } // Hides a layer function xbApi_hideLayer(layerId){ document.all[layerId].style.visibility = 'hidden'; } function xbApi_isLayerVisible(layerId){ return (document.all[layerId].style.visibility == 'visible'); } // Sets a layers position function xbApi_setLayerPosition(layerId, Xpos, Ypos){ document.all[layerId].style.left = Xpos; document.all[layerId].style.top = Ypos; } // Sets a layers innerHTML function xbApi_setInnerHTML(layerId, html){ document.all[layerId].innerHTML = html; } /*************************************** ** Mouse related ***************************************/ // Call back for onMouseMove event function xbApi_getMouseXY(){ mousePosX = event.clientX; + document.body.scrollLeft; mousePosY = event.clientY; + document.body.scrollTop; } Index: pearweb/public_html/javascript/xbApi/xbApi.loader.js +++ pearweb/public_html/javascript/xbApi/xbApi.loader.js /*************************************** ** Browser determination ***************************************/ Mac = (navigator.appVersion.indexOf('Mac') != -1); Nix = (navigator.appVersion.indexOf('X11') != -1); Win = (navigator.appVersion.indexOf('Win') != -1); DOM = (document.getElementById) ? true : false; NS4 = (document.layers) ? true : false; IE = (document.all) ? true : false; IE4 = IE && !DOM; IE4M = IE4 && Mac; Opera = (navigator.userAgent.indexOf('Opera') != -1); Konqueror = (navigator.userAgent.indexOf('Konqueror') != -1); /*************************************** ** Check path variable ***************************************/ if(!xbApi_path){ xbApi_path = ''; } /*************************************** ** Include appropriate browser specific functions ***************************************/ // IE if(IE){ document.write('<script src="' + xbApi_path + 'xbApi.ie.js" type="text/javascript" language="javascript"></script>'); // DOM }else if(DOM){ document.write('<script src="' + xbApi_path + 'xbApi.dom.js" type="text/javascript" language="javascript"></script>'); // Netscape }else if(NS4){ document.write('<script src="' + xbApi_path + 'xbApi.ns4.js" type="text/javascript" language="javascript"></script>'); } /*************************************** ** Load common functions ***************************************/ document.write('<script src="' + xbApi_path + 'xbApi.common.js" type="text/javascript" language="javascript"></script>'); // end Index: pearweb/public_html/javascript/xbApi/xbApi.ns4.js +++ pearweb/public_html/javascript/xbApi/xbApi.ns4.js /*************************************** ** Layer related ***************************************/ // Shows a layer function xbApi_showLayer(layerId){ document.layers[layerId].visibility = 'show'; } // Hides a layer function xbApi_hideLayer(layerId){ document.layers[layerId].visibility = 'hide'; } function xbApi_isLayerVisible(layerId){ return (document.layers[layerId].visibility == 'show'); } // Sets a layers position function xbApi_setLayerPosition(layerId, Xpos, Ypos){ document.layers[layerId].left = Xpos; document.layers[layerId].top = Ypos; } // Sets a layers innerHTML function xbApi_setInnerHTML(layerId, html){ document.layers[layerId].document.open(); document.layers[layerId].document.write(html) document.layers[layerId].document.close(); } /*************************************** ** Mouse related ***************************************/ // Call back for onMouseMove event function xbApi_getMouseXY(e){ mousePosX = e.pageX; mousePosY = e.pageY; return true; }