uid ";
}
$pager_attrib = array("sort" => variable_get('biblio_sort', 'year'), 'order' => variable_get('biblio_order', 'DESC'));
$limits = null;
if (isset($_GET['order'])) {
$pager_attrib['order'] = ($_GET['order'] == 'desc') ? 'desc' : 'asc';
}
if (isset($_GET['sort'])) {
$pager_attrib['sort'] = check_plain($_GET['sort']);
}
switch ($pager_attrib['sort']) {
case 'type':
$sortby = "ORDER BY b.biblio_type %s, b.biblio_year DESC, SUBSTRING(n.title,1,1) ASC ";
break;
case 'title':
$sortby = "ORDER BY SUBSTRING(n.title,1,1) %s, b.biblio_year DESC ";
break;
case 'author':
/*$join[] = "inner join {biblio_has_author} as ha on a.aid = ha.aid";
$join[] = "inner join {biblio_author_index} as a on b.nid= ha.nid";
$sortby = " ORDER BY a.author %s ";
$where[] = "ha.rank = 1 ";
*/
$sortby = "ORDER BY SUBSTRING(LTRIM(b.biblio_authors),1,1) %s, b.biblio_year DESC ";
break;
case 'keyword': // added msh 070808
$sortby = "ORDER BY SUBSTRING(LTRIM(b.biblio_keywords),1,4) %s, b.biblio_keywords ASC ";
break;
case 'year':
default:
$sortby = "ORDER BY b.biblio_year %s, b.biblio_date DESC, SUBSTRING(n.title,1,1) ASC, b.biblio_type ASC ";
} //end switch
if (!isset($_SESSION['biblio_filter']) || !is_array($_SESSION['biblio_filter'])) {
$_SESSION['biblio_filter'] = array();
}
$session = &$_SESSION['biblio_filter'];
$numargs = func_num_args();
$arg_list = func_get_args();
foreach ($session as $filter) {
$arg_list = array_merge($arg_list, $filter);
}
if (count($arg_list) >= 2) {
$args = array();
while ($arg_list) {
$type = $arg_list[0];
array_shift($arg_list);
$operator = ($operator)?$operator:" AND "; //defaults to AND
switch ($type) {
case 'and':
$operator = " AND ";
break;
case 'or':
$operator = " OR ";
break;
case 'inline':
$inline = true;
break;
case 'profile':
$inline = "profile";
break;
case 'term':
case 'term_id':
$term = explode("?",$arg_list[0]);
array_shift($arg_list);
$join[] = "inner join {term_node} as tn on n.vid = tn.vid";
if ($type == 'term') {
$join[] = "inner join {term_data} as td on tn.tid= td.tid";
$where[] = "td.name = '%s' ";
}elseif ($type == 'term_id') {
$where[] = "tn.tid = '%d' ";
}
$terms[] = db_escape_string($term[0]);
array_push($args, $type, $term[0]);
break;
case 'author':
$term = explode("?",$arg_list[0]);
array_shift($arg_list);
$where[] = 'b.biblio_authors RLIKE "[[:<:]]%s[[:>:]]" ';
$terms[] = db_escape_string($term[0]);
array_push($args, $type, $term[0]);
$operator = NULL;
break;
case 'publisher':
$term = explode("?",$arg_list[0]);
array_shift($arg_list);
$where[] = "b.biblio_publisher RLIKE '%s' ";
$terms[] = db_escape_string($term[0]);
array_push($args, $type, $term[0]);
$operator = NULL;
break;
case 'year':
$term = db_escape_string($arg_list[0]);
array_shift($arg_list);
$where[] = "b.biblio_year=%d ";
//$limit .= " AND b.biblio_year=%d ";
$terms[] = (int)$term;
array_push($args, $type, (int)$term);
$operator = NULL;
break;
case 'uid':
$term = db_escape_string($arg_list[0]);
array_shift($arg_list);
$where[] = "n.uid=%d ";
//$limit .= " AND b.biblio_year=%d ";
$terms[] = (int)$term;
array_push($args, $type, (int)$term);
$operator = NULL;
break;
case 'keyword':
$term = explode("?",$arg_list[0]);
array_shift($arg_list);
$where[] = "b.biblio_keywords RLIKE '%s' ";
$terms[] = db_escape_string($term[0]);
array_push($args, $type, $term[0]);
$operator = NULL;
break;
case 'type':
$term = db_escape_string($arg_list[0]);
array_shift($arg_list);
$limit .= $operator. "b.biblio_type=%d ";
$terms[] = (int)$term;
array_push($args, $type, (int)$term);
$operator = NULL;
break;
case 'order':
$term = (db_escape_string($arg_list[0]) == 'desc')?'desc':'asc';
array_shift($arg_list);
$pager_attrib['order'] = $term;
array_push($args, $type, $term);
break;
case 'sort':
$term = db_escape_string($arg_list[0]);
array_shift($arg_list);
$pager_attrib['sort'] = $term;
array_push($args, $type, $term);
switch ($term) {
case 'type':
$sortby = "ORDER BY b.biblio_type %s, b.biblio_year DESC, SUBSTRING(n.title,1,1) ASC ";
break;
case 'title':
$sortby = "ORDER BY SUBSTRING(n.title,1,1) %s, b.biblio_year DESC ";
break;
case 'year':
default:
$sortby = "ORDER BY b.biblio_year %s, SUBSTRING(n.title,1,1) ASC, b.biblio_type ASC ";
} //end switch
break;
default:
$fields = biblio_get_db_fields();
$term = explode("?",$arg_list[0]);
array_shift($arg_list);
if (in_array("biblio_$type",$fields))
{
$where[] = "b.biblio_$type RLIKE '%s' ";
$terms[] = db_escape_string($term[0]);
array_push($args, $type, $term[0]);
$operator = NULL;
}
break;
}
}
}
$where[] = "n.type='biblio' ";
if ($user->uid != 1 ) {
$where[] = 'n.status = 1 ';
}//show only published entries to everyone except admin
$joins = implode(' ', $join);
$where_clause = count($where) > 1 ? '('. implode(') AND (', $where) .')': $where[0];
$query = db_rewrite_sql("SELECT DISTINCT n.*, b.*, bt.name as biblio_type_name FROM {node} n $joins WHERE $where_clause $published $limit $sortby ");
$count_query = db_rewrite_sql("SELECT DISTINCT COUNT(*) FROM {node} n $joins WHERE $where_clause $published $limit ");
$_SESSION['last_biblio_query'] = $query;
$terms[] = $pager_attrib['order'];
$_SESSION['last_biblio_query_terms'] = $terms;
$count = db_result(db_query($count_query,$terms));
$result = pager_query($query, variable_get('biblio_rowsperpage', 25),0,$count_query,$terms);
return biblio_show_results($result, $count, $pager_attrib, $args,$inline);
}
/*
* biblio_show_results takes the query results from biblio_db_search and
* adds some controls to the page then loops through the results applying
* the selected style to each entry
*
*/
function biblio_show_results($result, $count = 0, $attrib = array("sort" => 'year', 'order' => 'DESC'), $args = null,$inline=false) {
global $pager_total_items;
$base = variable_get('biblio_base', 'biblio');
$style = variable_get('biblio_style', 'classic');
theme('biblio_add_css');
if (variable_get('biblio_rss', 0)) {
drupal_set_html_head(' ');
}
$pub_types = db_query('SELECT t.* FROM {biblio_types} as t WHERE t.tid>0');
while ($option = db_fetch_object($pub_types)) {
$pub_type["$option->tid"] = $option->name;
}
if (!$inline) {
// Add some links to the top of the page to change the sorting/ordering...
$order = ($attrib['order'] == "desc" || $attrib['order'] == "DESC")?"asc":"desc";
if ( biblio_access('export')) {
$content .= '
'.t('Export @count results', array('@count' => $pager_total_items[0])).':['.l("Tagged","$base/export/tagged"). ']['.l("XML","$base/export/xml"). ']['.l("BibTex","$base/export/bib").']
';
}else{
$content .= ''.t('Found @count results', array('@count' => $pager_total_items[0])) .'
';
}
if (user_access('show sort links')) {
$options = array('attributes'=>array("title"=>t("Click a second time to reverse the sort order")));
$sort_links = variable_get('biblio_sort_tabs', array('author'=>'author','title'=>'title','type'=>'type','year'=>'year'));
$content .= '';
foreach($sort_links as $key => $link) {
if ($key === $link) {
$content .= t('Sort by').':';
break;
}
}
if ($sort_links['year']) {
$options['query'] = "sort=year&order=$order";
$content .= "[".l(t("Year"),$_GET['q'],$options)."]";
}
if ($sort_links['title']) {
$options['query'] = "sort=title&order=$order";
$content .= "[".l(t("Title"),$_GET['q'],$options)."]";
}
if ($sort_links['type']) {
$options['query'] = "sort=type&order=$order";
$content .= "[".l(t("Type"),$_GET['q'],$options)."]";
}
if ($sort_links['author']) {
$options['query'] = "sort=author&order=$order";
$content .= "[".l(t("Author"),$_GET['q'],$options)."]";
}
if ($sort_links['keyword']) {
$options['query'] = "sort=keyword&order=$order";
$content .= "[".l(t("Keyword"),$_GET['q'],$options)."]";
}
$content .= "
";
}
$session = &$_SESSION['biblio_filter'];
// if there are any filters in place, print them at the top of the list
if (count($args)) {
$content .= ''.t('Filters').': ';
$i = 0;
while ($args) {
$type = $args[0];
array_shift($args);
$value = db_escape_string($args[0]);
if ($type == 'term_id') {
$term_result = db_query('SELECT name FROM {term_data} as td WHERE td.tid = %d',$value);
$term = db_fetch_object($term_result);
$value = $term->name;
$type = t("Taxonomy Term");
}
if ($type == 'type') $value = $pub_type["$value"];
array_shift($args);
$params = array('%a' => $type , '%b' => $value );
$content .= ($i++ ? t(' and %a is %b ', $params) : t('%a is %b ', $params)) ;
}
$content .= ' '.l('['.t('Clear All Filters').']',"$base/filter/clear");
}
}
if ($inline === true) print '';
$_char = $_type = $_year = $name = "";
while ($node = db_fetch_object($result)) {
if (isset($node->biblio_year) && ($node->biblio_year == 9998)) $node->biblio_year = t("In Press") ;
if (isset($node->biblio_year) && ($node->biblio_year == 9999)) $node->biblio_year = t("Submitted") ;
switch ($attrib['sort']) {
case 'title':
if ( drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 1) != $_char) {
$_char = drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 1) ;
$content .= '
' . $_char . "
\n";
}
break;
case 'author':
if ( drupal_substr(drupal_ucfirst(ltrim($node->biblio_authors)), 0, 1) != $_char) {
$_char = drupal_substr(drupal_ucfirst(ltrim($node->biblio_authors)), 0, 1) ;
$content .= '
' . $_char . "
\n";
}
break;
case 'type':
if ($node->biblio_type_name != $_type) {
$_type = $node->biblio_type_name;
// $name = db_result(db_query("SELECT name FROM {biblio_types} as t where t.tid=%d", $node->biblio_type)) ;
$content .= '
' . $_type . "
\n";
}
break;
case 'keyword': // added msh 08 aug 07
$tok = drupal_ucfirst(strtok($node->biblio_keywords, variable_get('biblio_keyword_sep', ',')));
if (empty($tok)) {
$tok = t("No Keywords");
}
if ($tok != $name) {
$name = $tok;
if ($name != '') {
$content .= '
' . $name . "
\n";
}
}
break;
case 'year':
default:
if ($node->biblio_year != $_year) {
$_year = $node->biblio_year;
$content .= '
' .$_year. "
\n";
}
} //end switch
$content .= '
' . "\n";
$inline_links = ($inline && variable_get('inlinemode_in_links',0)) ? true : false;
$content .= theme('biblio_list', $node,$base,$style,$inline_links);
$content .= "
\n";
} //end while
$content .= theme('pager', 0, variable_get('biblio_rowsperpage', 25));
if ($count == 0) {
$content .= "
".t("No items found")." ";
if (strstr($content, "Filters:")) {
$content .= t('!modify_link or !remove_link your filters and try again.', array('!modify_link' => l(t('Modify'),"$base/filter"), '!remove_link' => l(t('remove'),"$base/filter/clear")));
}
}
if (!$inline) {
print theme('page', $content);
}elseif ($inline == 'profile'){
return $content ;
}else{
print $content . "
";
}
}
function _get_biblio_filters() {
$fields = " b.biblio_year, b.biblio_authors, t.name , t.tid ";
$order = " b.biblio_year DESC";
$taxo_fields = "td.name as termname,td.tid as taxid, v.name as vocab_name";
$taxo_order = "vocab_name ASC, termname ASC";
$table = "{node} as n inner join {biblio} as b on n.vid=b.vid ";
$join = "left join {biblio_types} as t on b.biblio_type = t.tid";
$taxo_join = array("inner join {term_node} as tn on n.vid = tn.vid",
"left join {term_data} as td on tn.tid= td.tid",
"left join {vocabulary} as v on v.vid= td.vid");
$taxo_joins = implode(' ',$taxo_join);
$result = db_query("SELECT $fields FROM $table $join ORDER BY $order");
$taxoresult = db_query("SELECT $taxo_fields FROM $table $taxo_joins ORDER BY $taxo_order");
while ($option = db_fetch_object($result)) {
if ($option->biblio_year == 9998) { $option->biblio_year = t("In Press"); }
if ($option->biblio_year == 9999) { $option->biblio_year = t("Submitted"); }
$pub_years["$option->biblio_year"] = $option->biblio_year;
$pub_type["$option->tid"] = $option->name;
$author_array = explode(";", $option->biblio_authors);
foreach($author_array as $auth) {
if (strstr($auth, ",")) {
$parts = split(",", $auth);
$lastname = trim($parts[0]);
} else {
$parts = split(" ", $auth);
$lastname = trim(end($parts));
}
if ($lastname) $pub_authors["$lastname"] = $lastname;
}
}
while ($tax = db_fetch_object($taxoresult)) {
$pub_taxo["$tax->taxid"] = "$tax->vocab_name - $tax->termname";
}
$pub_years = array_unique($pub_years);
$pub_type = array_unique($pub_type);
if (!empty($pub_taxo))$pub_taxo = array_unique($pub_taxo);
if (!empty($pub_taxo)) {
$tax_select = array('title' => t('Term'),'options' => $pub_taxo);
}else{$tax_select = null;
}
ksort($pub_authors);
$filters = array(
'author' => array('title' => t('Author'),'options' => $pub_authors),
'type' => array('title' => t('Type'),'options' => $pub_type),
'term_id' => $tax_select,
'year' => array('title' => t('Year'),'options' => $pub_years)
);
return $filters;
}
function biblio_form_filter() {
$session = &$_SESSION['biblio_filter'];
$session = is_array($session) ? $session : array();
$filters = _get_biblio_filters();
$i = 0;
$form['filters'] = array('#type' => 'fieldset',
'#title' => t('Show only items where'),
'#theme' => 'biblio_filters',
);
foreach ($session as $filter) {
list($type, $value) = $filter;
if ($type == 'category') {
// Load term name from DB rather than search and parse options array.
$value = module_invoke('taxonomy', 'get_term', $value);
$value = $value->name;
}else if ($type == 'keyword') {
$filters[$type]['title'] = 'Keyword';
}else {
$value = $filters[$type]['options'][$value];
}
$string = ($i++ ? 'and where %a is %b ' : '%a is %b ');
$form['filters']['current'][] = array('#value' => t($string, array('%a' => $filters[$type]['title'] , '%b' => $value)));
}
foreach ($filters as $key => $filter) {
if (count ($filter['options'])) {
$names[$key] = $filter['title'];
$form['filters']['status'][$key] = array('#type' => 'select', '#options' => $filter['options']);
}
}
$form['filters']['status']['keyword']=array('#type' => 'textfield','#size' => 25, '#maxlength' => 255);
$names['keyword'] = "Keyword";
$form['filters']['filter'] = array('#type' => 'radios', '#options' => $names, '#default_value' => 'status');
$form['filters']['buttons']['submit'] = array('#type' => 'submit', '#value' => (count($session) ? t('Refine') : t('Filter')));
if (count($session)) {
$form['filters']['buttons']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
$form['filters']['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
}
return $form;
}
function biblio_form_filter_submit($form, &$form_state) {
$op = $form_state['values']['op'];
$filters = _get_biblio_filters();
switch ($op) {
case t('Filter'):
case t('Refine'):
if (isset($form_state['values']['filter'])) {
$filter = $form_state['values']['filter'];
// Flatten the options array to accommodate hierarchical/nested options.
if (isset($filters[$filter]['options'])) {
$flat_options = form_options_flatten($filters[$filter]['options']);
}
if (isset($flat_options[$form_state['values'][$filter]]) || $filter == 'keyword') {
$_SESSION['biblio_filter'][] = array($filter, $form_state['values'][$filter]);
$base = variable_get('biblio_base', 'biblio');
drupal_goto($base);
}
}
break;
case t('Undo'):
array_pop($_SESSION['biblio_filter']);
break;
case t('Reset'):
$_SESSION['biblio_filter'] = array();
break;
}
}
function biblio_get_user_pubs($user,$profile=''){
switch ((isset($user->biblio_profile_uid) ) ? $user->biblio_profile_uid : variable_get('biblio_profile_uid', 'uid')){
case 'lastname':
$pubs = biblio_db_search('author', $user->biblio_lastname, $profile);
break;
case 'uid_lastname':
$pubs = biblio_db_search('uid', $user->uid, 'author', $user->biblio_lastname, $profile);
break;
case 'uid':
default:
$pubs = biblio_db_search('uid', $user->uid, $profile);
}
return $pubs;
}
function biblio_view_inline(&$node) {
$style = variable_get('biblio_style', 'classic');
$base = variable_get('biblio_base', 'biblio');
$output = '';
$output .= theme('biblio_long', $node, $base, $style);
$output .= '
';
print $output;
}
function biblio_citekey_view() {
$citekey = arg(2);
$nid = db_fetch_object(db_query("SELECT nid FROM {biblio} WHERE biblio_citekey = '%s' ORDER BY vid DESC", $citekey));
if ($nid->nid > 0) {
$node = node_load($nid->nid);
return node_page_view($node);
} else {
return t("Sorry, citekey @cite not found", array('@cite'=>$citekey));
}
}
function _biblio_author_links($author, $base='biblio', $inline = FALSE) {
$options = array();
$inline = $inline ? "/inline" : "";
if (isset($_GET['sort'])) {
$options['query'] .= "sort=" . $_GET['sort'];
}
if (isset($_GET['order'])) {
$options['query'] .= $options['query'] ? "&" : "" ;
$options['query'] .= "order=" . $_GET['order'];
}
$html = "";
$author_array = explode(";", $author);
foreach($author_array as $auth) {
$html .= (empty($html))? "" : "; ";
if (strstr($auth, ",")) {
$parts = split(",", $auth);
$lastname = $parts[0];
} else {
$parts = split(" ", $auth);
$lastname = end($parts);
}
// list($lastname, $init) = split(",", $auth);
$html .= l(trim($auth), "$base/author/" . trim($lastname) . $inline,$options );
}
return $html;
}
function _biblio_keyword_links($keywords,$base='biblio') {
$options = array();
if (isset($_GET['sort'])) {
$options['query'] .= "sort=" . $_GET['sort'];
}
if (isset($_GET['order'])) {
$options['query'] .= $options['query'] ? "&" : "";
$options['query'] .= "order=" . $_GET['order'];
}
$html = "";
$sep = variable_get('biblio_keyword_sep', ',');
$keyword_array = explode($sep, $keywords);
foreach($keyword_array as $kw) {
$html .= (empty($html))? "" : "; ";
$html .= l(trim($kw), "$base/keyword/" . trim($kw) , $options);
}
return $html;
}
function _biblio_parse_authors($authors) {
$and = array(" and ", " And ", " AND ");
$authors = str_replace($and, ", ", $authors); // change the word "and" to a comma
$authors = str_replace(" ,", ",", $authors); // fix some potential typos
$authors = str_replace(",,", ",", $authors); // ditto
// $authors = str_replace(";",",",$authors);
$chunks = explode(";", $authors); // split the authors on the semicolon
$num_chunks = count($chunks);
for($i = 0; $i < count($chunks); $i++) {
$suffix = _biblio_get_suffix($chunks[$i]); // get and strip out the suffix
$prefix = _biblio_get_prefix($chunks[$i]); // get and strip out the prefix
if (strstr($chunks[$i], ",")) { // we probably have lastname first
$subchunks = explode(",", trim($chunks[$i]));
$lastname = $subchunks[0];
$subchunks = explode(" ", trim($subchunks[1]));
$initials = "";
for ($j = 0; $j < count($subchunks) ; $j++) {
if (substr_count($subchunks[$j], '.')) {
$initials .= $subchunks[$j];
} else {
$initials .= drupal_substr($subchunks[$j], 0, 1) . ".";
}
}
} else { // we have some form of firstname first (Fistname I. Lastname)
$subchunks = explode(" ", trim($chunks[$i]));
$lastname = end($subchunks);
$initials = "";
for ($j = 0;
$j < count($subchunks) - 1 ;
$j++) {
if (substr_count($subchunks[$j], '.')) {
$initials .= $subchunks[$j];
} else {
$initials .= drupal_substr($subchunks[$j], 0, 1) . ".";
}
}
}
$chunks[$i] = trim($prefix . $lastname . ', ' . $initials . ' ' . $suffix);
}
return implode("; ", $chunks);
}
function _biblio_get_suffix(&$name) {
$suffix = null;
if (preg_match("/[, \.]+(Jr|Sr|Snr)\.?\s*$/", $name, $match)) {
$suffix = $match[0];
$Text = str_replace($suffix, "", $name);
} elseif (preg_match("/([, \.]+)(Jr|Sr|Snr)[. ]/", $name, $match)) {
$suffix = $match[1];
$name = str_replace($suffix, "", $name);
}
return $suffix;
}
function _biblio_get_prefix(&$name) {
$prefix = null;
$name = " " . $name;
$prefs = array(" Van ", " van ", " von ", " den ", " der ", " de ", " De ", " ter ", " Ter ", "Vander ");
if (strstr($name, " Van ")) $prefix .= "Van ";
if (strstr($name, " van ")) $prefix .= "van ";
if (strstr($name, " Vander ")) $prefix .= "Vander ";
if (strstr($name, " von ")) $prefix .= "von ";
if (strstr($name, " de ")) $prefix .= "de ";
if (strstr($name, " De ")) $prefix .= "De ";
if (strstr($name, " den ")) $prefix .= "den ";
if (strstr($name, " der ")) $prefix .= "der ";
if (strstr($name, " ter ")) $prefix .= "ter ";
if (strstr($name, " Ter ")) $prefix .= "Ter ";
if (strlen($prefix)) $name = str_replace($prefs, "", $name);
$name = trim($name);
return $prefix;
}