<?
function linker(){
   //if the input array var1 is empty (or not set) create it
   $change="";
   $numargs = func_num_args(); //count 
   $myarray=func_get_arg(0); //first arg is the assoc array

   for ($i = 1; $i < $numargs; $i=$i+2){
      $matcher=func_get_arg($i);
      $changer=func_get_arg($i+1);
      if(isset($myarray[$matcher])){
         $myarray[$matcher]=$changer;
      } // if(isset($myarray[$matcher]))
      else{ 
         $myarray[$matcher]=$changer;
      }//else

   }//for ($i = 1; $i < $numargs; $i=$i+2)

   foreach($myarray as $key=>$value){
      if($value!=""){
         $change=$change . "$key=$value&";
      }
   }//foreach($myarray as $key=>$value)

   $change = perl_chop('?'.$change);
   return $change;
}//function linker() 

function perl_chop($string){
   return substr($string,0,-1);
}

function get_images($fld){
   $dir  = '../images/gallery/' . $fld;
   $hdl  = opendir($dir);
   while( false !== ($img = readdir($hdl)) ){
      if( $img != '.' && $img != '..' ){
         $imgs[] = $img;
      }
   }
   closedir($hdl);
   return $imgs;
}

/*********************************************************************
**********************************************************************
*********************  Data Prep Functions  **************************
**********************************************************************
*********************************************************************/

function display_ao(){
   // display_event($data,$indent)
   if(func_num_args() == 2){
      $data   = func_get_arg(0);
      $indent = func_get_arg(1);
   }
   // display_event($data) !no indent
   else{
      $data   = func_get_arg(0);
      $indent = '';
   }
   if(empty($data['deadline'])){
      $dl  = "To Be Announced";
   }
   else{
      $dl  = preg_replace("/(\d{4})-(\d{2})-(\d{2})/","$2-$3-$1",$data['deadline']);   // unchanged if no -'s
      $dl  = preg_replace("/(\d{4})(\d{2})(\d{2})/","$2-$3-$1",$dl);
      $red = preg_replace("/(\d{2})-(\d{2})-(\d{4})/","$3$1$2",$dl);
      //echo date('Ymd') . "<br />" . $red;
      if(date('Ymd') >= $red){
         $dl = '<font color="red"><b>' . $dl . '</b></font>';
      }
   }

   $lt    = $data['link_titles'];
   $l     = $data['links'];
   if(!is_array($lt)){
      $lt = explode(DELIM,$lt);
   }
   if(!is_array($l)){
      $l  = explode(DELIM,$l);
   }
   $s     = $indent . "<tr>\n" . $indent . "   <td>\n";              //Start a row
   $m     = "\n" . $indent . "   </td>\n" . $indent . "   <td>\n";   //between column
   $e     = $indent . "   </td>\n" . $indent . "</tr>\n";            //end a row
   $des   = (empty($data['description'])) ? "" : stripslashes(preg_replace("/\n/","<br />\n",$data['description']));
   $html  = $s;
   $html .= (!empty($data['logo'])) ? $indent . '      <img alt="logo" src="' . $data['logo'] . '">&nbsp;&nbsp;' . $m : '';
   $html .= $indent . "      <b>" . stripslashes($data['title']) ."</b><br />\n";
   $html .= (!empty($dl)) ? $indent . "      <b>Deadline:</b> " . $dl . "<br />\n" . $indent . "      <br />\n" : $indent . "      <br />\n";
   $html .= $indent . "      <b>Description:</b> " . $des . "<br />\n" . $indent . "      <br />\n";
   if(!empty($data['contact'])){
      $html .= $indent . '      <b>Contact:</b> <a href="mailto:' . $data['contact_email'] . '">';
      $html .= $indent . stripslashes($data['contact']) . "</a><br />\n";
      $html .= (!empty($data['contact_phone'])) ? $indent . "<b>Phone:</b> " . stripslashes($data['contact_phone']) . "<br />\n" : '';
      $html .= $indent . "      <br />\n";
   }
   if(!empty($data['links'])){
      $html .= $indent . "      <b>Links:</b>\n";
      $html .= $indent . "      <ul>\n";
      for($i=0;$i<count($l);$i++){
         $html .= $indent . '         <li><a target="popup" href="' . $l[$i] . '">' . stripslashes($lt[$i]) . "</a></li>\n";
      }
      $html .= $indent . "      </ul>\n";
   }
   $html .= $e;
   return $html;
} // function display_ao()

function display_date($date){
   return preg_replace("/(\d{4})(\d{2})(\d{2})/","$1-$2-$3",$date);
}

function display_index($data){
   
   // Create the A-Z nav bar
   $index = ""; // Current letter carrier
   $j     = 65; // ACSII index of capital A
   $nav   = ""; // variable to compile nav bar
   for($i=0;$i<count($data);$i){
      $a=$data[$i];
      //echo $a;
      if( $a == chr($j) && $a != $index){
         $nav .= '<a href="#' . $a . '">' . $a . '</a> | ';
         $index=$a;
         $j++;
      }
      if( $a != chr($j) && $a != $index){
         //$j++;
         $d=chr($j);
         $nav .= $d . ' | ';
         $j++;
      }
      if($a == $index){
         $i++;
      }
         if($j == 91) break;
   }
   
   // fill remaining letters to Z
   while($j < 91){
      $d=chr($j);
      $nav .= $d . ' | ';
      $j++;
   }
   //$nav .= chr(90);
   $nav = substr($nav, 0, -3); // 
   return $nav;
}

function display_paper($row){
   $jour  = get_journal($row['journal_id']);
   $html  = '';
   if(!empty($row['contrib_num'])){
      $html .= '   <b>Contribution Number:</b> ' . $row['contrib_num'] . 
         '&nbsp;&nbsp;<a target="new" href="paper_request.php?ind=' . $row['contrib_num'] . "&act=upd\">Edit/Update</a><br />\n";
   }
   $html .= '   <b>Authors:</b> ' . stripslashes($row['authors']) . "<br />\n";
   if(!empty($row['date'])){
      $html .= '   <b>Date:</b> ' . stripslashes($row['date']) . "<br />\n";
   }
   $html .= '   <b>Title:</b> ' . get_paper_title($row['title']) .  "<br />\n";
   if(!empty($row['journal_id'])){
      $html .= '   <b>Journal:</b> <a href="' . $jour['link'] . '">' . stripslashes($jour['title']) . "</a><br />\n";
   }
   if(!empty($row['type']) && $row['type'] != 'Journal'){
      $html .= '   <b>Type:</b> ' . $row['type'] . "<br />\n";
   }
   if(!empty($row['pub_title'])){
      $html .= '   <b>Publication/Issue Title:</b> ' . stripslashes($row['pub_title']) . "<br />\n";
   }
   if(!empty($row['volume']) && !empty($row['pages'])){ // Volume and pages non-empty
      $html .= '   <b>Volume:</b> '. stripslashes($row['volume']) . "&nbsp;&nbsp;&nbsp;&nbsp;";
   }
   if(!empty($row['volume']) && empty($row['pages'])){ // Volume non-empty and pages empty
      $html .= '   <b>Volume:</b> '. stripslashes($row['volume']) . "<br />\n";
   }
   if(!empty($row['pages'])){
      $html .= '   <b>Pages:</b> ' . stripslashes($row['pages']) . "<br />\n";
   }
   if(!empty($row['doi'])){
      $html .= '   <b>DOI Number:</b> ' . stripslashes($row['doi']) . "<br />\n";
   }
   if(!empty($row['status'])){
      $html .= '   <b>Status:</b> ' . stripslashes($row['status']) . "<br />\n";
   }
   if(!empty($row['link'])){
      $html .= '   <b>Link:</b> <a target="new" href="' . stripslashes($row['link']) . '">PDF</a>' . "<br />\n";
   }
   if(!empty($row['contact_email'])){
      $html .= '   <b>Contact Email:</b> <a target="new" href="mailto:' . $row['contact_email'] . '">' . $row['contact_email'] . '</a>' . "<br />\n";
   }
   
   return $html;
} // function display_paper()

function display_event(){
   // display_event($data,$indent)
   if(func_num_args() == 2){
      $data   = func_get_arg(0);
      $indent = func_get_arg(1);
   }
   // display_event($data) !no indent
   else{
      $data   = func_get_arg(0);
      $indent = '';
   }
   $start = preg_replace("/(\d{4})-(\d{2})-(\d{2})/","$2-$3-$1",$data['start']); // unchanged if no -'s
   $start = preg_replace("/(\d{4})(\d{2})(\d{2})/","$2-$3-$1",$start);
   $end   = preg_replace("/(\d{4})-(\d{2})-(\d{2})/","$2-$3-$1",$data['end']);   // unchanged if no -'s
   $end   = preg_replace("/(\d{4})(\d{2})(\d{2})/","$2-$3-$1",$end);
   if(!empty($data['reg_deadline'])){
      $reg   = preg_replace("/(\d{4})-(\d{2})-(\d{2})/","$2-$3-$1",$data['reg_deadline']);   // unchanged if no -'s
      $reg   = preg_replace("/(\d{4})(\d{2})(\d{2})/","$2-$3-$1",$reg);
      $red   = preg_replace("/(\d{2})-(\d{2})-(\d{4})/","$3$1$2",$reg);
      //echo date('Ymd') . "<br />" . $red;
      if(date('Ymd') >= $red){
         $reg = '<font color="red"><b>' . $reg . '</b></font>';
      }
   }

   $lt    = $data['link_titles'];
   $l     = $data['links'];
   $des   = (empty($data['description'])) ? "" : stripslashes(preg_replace("/\n/","<br />\n",$data['description']));
   if(!is_array($lt)){
      $lt = explode(DELIM,$lt);
   }
   if(!is_array($l)){
      $l  = explode(DELIM,$l);
   }
   $s     = $indent . "<tr>\n" . $indent . "   <td>\n";              //Start a row
   $m     = "\n" . $indent . "   </td>\n" . $indent . "   <td>\n";   //between column
   $e     = $indent . "   </td>\n" . $indent . "</tr>\n";            //end a row
   $html  = $s;
   $html .= (!empty($data['logo'])) ? $indent . '      <img alt="logo" src="' . $data['logo'] . '">&nbsp;&nbsp;' . $m : '';
   $html .= $indent . "      <b>What:</b> " . stripslashes($data['title']) ."<br />\n";
   $html .= $indent . "      <b>Where:</b> " . stripslashes($data['location']) . "<br />\n";
   $html .= $indent . "      <b>Starting:</b> " . $start . "<br />\n";
   $html .= $indent . "      <b>Ending:</b> " . $end . "<br />\n";
   $html .= (!empty($reg)) ? $indent . "      <b>Reg. Deadline:</b> " . $reg . "<br />\n" . $indent . "      <br />\n" : $indent . "      <br />\n";
   $html .= $indent . "      <b>Description:</b> " . $des . "<br />\n" . $indent . "      <br />\n";
   if(!empty($data['contact'])){
      $html .= $indent . '      <b>Contact:</b> <a href="mailto:' . $data['contact_email'] . '">';
      $html .= $indent . stripslashes($data['contact']) . "</a>, " . stripslashes($data['contact_location']) . "<br />\n" . $indent . "      <br />\n";
   }
   if(!empty($data['links'])){
      $html .= $indent . "      <b>Links:</b>\n";
      $html .= $indent . "      <ul>\n";
      for($i=0;$i<count($l);$i++){
         $html .= $indent . '         <li><a target="popup" href="' . $l[$i] . '">' . stripslashes($lt[$i]) . "</a></li>\n";
      }
      $html .= $indent . "      </ul>\n";
   }
   $html .= $e;
   return $html;
} // function display_event()

function generate_pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = TRUE){
   $total_pages = ceil($num_items/$per_page);

   if ( $total_pages == 1 ){
      return '';
   }

   $on_page = floor($start_item / $per_page) + 1;

   $page_string = '';
   if ( $total_pages > 10 ){
      $init_page_max = ( $total_pages > 3 ) ? 3 : $total_pages;

      for($i = 1; $i < $init_page_max + 1; $i++){
         $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . linker($_GET,"offset",( ( $i - 1 ) * $per_page )) . '">' . $i . '</a>';
         if ( $i <  $init_page_max ){
            $page_string .= ", ";
         }
      }

      if ( $total_pages > 3 ){
         if ( $on_page > 1  && $on_page < $total_pages ){
            $page_string .= ( $on_page > 5 ) ? ' ... ' : ', ';

            $init_page_min = ( $on_page > 4 ) ? $on_page : 5;
            $init_page_max = ( $on_page < $total_pages - 4 ) ? $on_page : $total_pages - 4;

            for($i = $init_page_min - 1; $i < $init_page_max + 2; $i++){
               $page_string .= ($i == $on_page) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . linker($_GET,"offset",( ( $i - 1 ) * $per_page )) . '">' . $i . '</a>';
               if ( $i <  $init_page_max + 1 ){
                  $page_string .= ', ';
               }
            }

            $page_string .= ( $on_page < $total_pages - 4 ) ? ' ... ' : ', ';
         }
         else{
            $page_string .= ' ... ';
         }

         for($i = $total_pages - 2; $i < $total_pages + 1; $i++){
            $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>'  : '<a href="' . $base_url . linker($_GET,"offset",( ( $i - 1 ) * $per_page )) . '">' . $i . '</a>';
            if( $i <  $total_pages ){
               $page_string .= ", ";
            }
         }
      }
   }
   else{
      for($i = 1; $i < $total_pages + 1; $i++){
         $page_string .= ( $i == $on_page ) ? '<b>' . $i . '</b>' : '<a href="' . $base_url . linker($_GET,"offset",( ( $i - 1 ) * $per_page )) . '">' . $i . '</a>';
         if ( $i <  $total_pages ){
            $page_string .= ', ';
         }
      }
   }

   if ( $add_prevnext_text ){
      if ( $on_page > 1 ){
         $page_string = ' <a href="' . $base_url . linker($_GET,"offset",( ( $on_page - 2 ) * $per_page ))  . '">Previous</a>&nbsp;&nbsp;' . $page_string;
      }

      if ( $on_page < $total_pages ){
         $page_string .= '&nbsp;&nbsp;<a href="' . $base_url . linker($_GET,"offset",( $on_page * $per_page ))  . '">Next</a>';
      }

   }

   $page_string = '<b>Goto page</b> ' . $page_string;

   return $page_string;
} // function generate_pagination()

function get_journals(){
   global $db;

   if(func_num_args() == 2){
      $id     = func_get_arg(0);
      $indent = func_get_arg(1);
   }
   else{
      $id     = func_get_arg(0);
      $indent = '';
   }

   $query   = "SELECT id,title FROM " . TABLE_JOURNALS . " ORDER BY title";
   $result  = $db->sql_query($query);
   $html    = '';
   $jour[0] = "N/A";
   $i       = 1;
   while($jrow = $db->sql_fetchrow($result)){
      $jind[$i] = $jrow['id'];
      $jour[$i] = $jrow['title'];
      $i++;
   }
   $num=count($jour);
   $html .= $indent . '<select name="journal_id">' . "\n";
   for($i=0;$i<$num;$i++){
      if($jind[$i]!=$id){
         $html .= $indent . "   <option value=\"$jind[$i]\">".stripslashes($jour[$i])."</option>\n";
      }
      else{
         $html .= $indent . "   <option selected value=\"$jind[$i]\">".stripslashes($jour[$i])."</option>\n";
      }
   }
   $html .= $indent . "</select>\n";
   return $html;
} // function get_journals()

function get_journal_title($id){
   global $db;

   if(!empty($id)){
      $query = "SELECT title FROM journals WHERE id=" . $id;
      $tmp   = $db->sql_fetchrow($db->sql_query($query));
      return $tmp[0];
   }
   return NULL;
}

function get_paper_title($title){
   return stripslashes(preg_replace("/(.*), (A|An|The)$/","$2 $1",trim($title)));
}

function get_papers(){
   global $db;

   if(func_num_args() == 1){
      $indent = func_get_arg(0);
   }
   else{
      $indent = '';
   }

   $html   = '';
   $output = "title,contrib_num";
   $tbname = TABLE_PAPERS;
   $query  = "SELECT $output FROM $tbname ORDER BY contrib_num";
   $result = $db->sql_query($query);
   $html  .= $indent . '<select width="20" name="ind" onChange="nameChange(this.options[this.selectedIndex].value);">' . "\n";
   $html  .= $indent . '   <option>-----Select One-----</option>'."\n";
   while($row = $db->sql_fetchrow($result)){
      $title = get_paper_title($row[0]);
      $html .= $indent . '   <option ';
      if(strlen($title) > 50){
         $title = substr($title,0,44) . " . . .";
      }

      $sel = (isset($_GET['ind']) && $_GET['ind']==$row[1]) ? 'selected ' : '';

      $html .= $sel . 'value="' . $row[1] . '">' . $title . "</option>\n"; 
   } // while($row=mysql_fetch_row($result))
   $html .= $indent .  "</select>\n";
   return $html;
} // function get_papers()

function set_paper_title($title){
   return preg_replace("/^(A|An|The) (.*)/","$2, $1",trim($title));
}

function sort_by($sort){
   $html = '';
   if($sort == "contrib_num"){
      $html .= '<b>Contribution Number</b> | ';
   }
   else{
      $html .= '<a href="' . $_SERVER['PHP_SELF'] . linker($_GET,"order_by","contrib_num") . '">Contibution Number</a> | ';
   }

   if($sort == "authors"){
      $html .= '<b>Authors</b> | ';
   }
   else{
      $html .= '<a href="' . $_SERVER['PHP_SELF'] . linker($_GET,"order_by","authors") . '">Authors</a> | ';
   }

   if($sort == "title"){
      $html .= '<b>Title</b> | ';
   }
   else{
      $html .= '<a href="' . $_SERVER['PHP_SELF'] . linker($_GET,"order_by","title") . '">Title</a> | ';
   }

   if($sort == "type"){
      $html .= '<b>Type</b> | ';
   }
   else{
      $html .= '<a href="' . $_SERVER['PHP_SELF'] . linker($_GET,"order_by","type") . '">Type</a> | ';
   }

   if($sort == "journal_title"){
      $html .= '<b>Journal</b> | ';
   }
   else{
      $html .= '<a href="' . $_SERVER['PHP_SELF'] . linker($_GET,"order_by","journal_title") . '">Journal</a> | ';
   }
   $html .= '<b>Date:</b> ';
   if($sort == "date DESC"){
      $html .= '<b>New-Old</b> | ';
   }
   else{
      $html .= '<a href="' . $_SERVER['PHP_SELF'] . linker($_GET,"order_by","date DESC,contrib_num DESC") . '">New-Old</a> | ';
   }
   if($sort == "date"){
      $html .= '<b>Old-New</b>';
   }
   else{
      $html .= '<a href="' . $_SERVER['PHP_SELF'] . linker($_GET,"order_by","date,contrib_num") . '">Old-New</a>';
   }

   return $html;
}

/*********************************************************************
**********************************************************************
******************  Database Search Functions  ***********************
**********************************************************************
*********************************************************************/

function get_next_free_contrib_num(){
   global $db;

   $query1 = "SELECT MAX(contrib_num) FROM " . TABLE_PAPERS . " WHERE contrib_num<337";
   $tmp1   = $db->sql_fetchrow($db->sql_query($query1));
   $query2 = "SELECT MAX(contrib_num) FROM " . TABLE_PAPERS_PURG . " WHERE contrib_num<337";
   $tmp2   = $db->sql_fetchrow($db->sql_query($query2));
   $ret    = ($tmp1[0] > $tmp2[0]) ? $tmp1[0] : $tmp2[0];
   if($ret >= 336){
      $query3 = "SELECT MAX(contrib_num) FROM " . TABLE_PAPERS;
      $tmp3   = $db->sql_fetchrow($db->sql_query($query3));
      $query4 = "SELECT MAX(contrib_num) FROM " . TABLE_PAPERS_PURG;
      $tmp4   = $db->sql_fetchrow($db->sql_query($query4));
      $ret    = ($tmp3[0] > $tmp4[0]) ? $tmp3[0] : $tmp4[0];
   }
   $ret++;
   return $ret;
}

function get_journal($id){
   global $db;

   $query = "SELECT title,link FROM " . TABLE_JOURNALS . " WHERE id='" . $id . "'";
   return $db->sql_fetchrow($db->sql_query($query));
}

function paper_where($q){
   $tmp   = ' WHERE (';
   $terms = preg_split ("/(\s+|\+)/", $q);
   $num   = count($terms);
   for($i=0;$i<$num;$i++){
      $term = addslashes($terms[$i]);
      if(is_numeric($term)){
         $tmp .= "contrib_num=$term OR date=$term OR ";
      }
      else{
         $tmp .= "title LIKE '%$term%' OR authors LIKE '%$term%' OR journal_title LIKE '%$term%' OR ";
      }
   }
   return substr($tmp,0,-4).')'; // chop last ' OR ' off and add closing paren
}

/*********************************************************************
**********************************************************************
********************  Database Set Functions  ************************
**********************************************************************
*********************************************************************/

/*********************************************************************
**********************************************************************
*******************  Database Error Functions  ***********************
**********************************************************************
*********************************************************************/

// Fix define("HAS_DIED", 1); so constant in double quotes
// January 11, 2012 rcg/ttw
function message_die($msg_code, $msg_text = '', $msg_title = '', $err_line = '', $err_file = '', $sql = '')
{
   global $db;

   if(defined('HAS_DIED')){
      die("message_die() was called multiple times. This isn't supposed to happen. Was message_die() used in page_tail.php?");
   }
   
   define("HAS_DIED", 1);

   $sql_store = $sql;
   
   //
   // Get SQL error if we are debugging. Do this as soon as possible to prevent 
   // subsequent queries from overwriting the status of sql_error()
   //
   if ( DEBUG && ( $msg_code == GENERAL_ERROR || $msg_code == CRITICAL_ERROR ) )   {
      $sql_error = $db->sql_error();

      $debug_text = '';

      if ( $sql_error['message'] != '' )   {
         $debug_text .= '<br /><br />SQL Error : ' . $sql_error['code'] . ' ' . $sql_error['message'];
      }

      if ( $sql_store != '' ){
         $debug_text .= "<br /><br />$sql_store";
      }

      if ( $err_line != '' && $err_file != '' ){
         $debug_text .= '</br /><br />Line : ' . $err_line . '<br />File : ' . basename($err_file);
      }
   }

   switch($msg_code){
      case GENERAL_MESSAGE:
         if ( $msg_title == '' ){
            $msg_title = 'Information';
         }
         break;
      case CRITICAL_MESSAGE:
         if ( $msg_title == '' ){
            $msg_title = 'Critical Information';
         }
         break;
      case GENERAL_ERROR:
         if ( $msg_text == '' ){
            $msg_text = 'An Error Occured';
         }
         if ( $msg_title == '' ){
            $msg_title = 'General Error';
         }
         break;
      case CRITICAL_ERROR:
         //
         // Critical errors mean we cannot rely on _ANY_ DB information being
         // available so we're going to dump out a simple echo'd statement
         //
         if ( $msg_text == '' )   {
            $msg_text = 'A Critical Error Occured';
         }
         if ( $msg_title == '' )   {
            $msg_title = 'phpBB : <b>' . 'Critical Error' . '</b>';
         }
         break;
   }

   //
   // Add on DEBUG info if we've enabled debug mode and this is an error. This
   // prevents debug info being output for general messages should DEBUG be
   // set TRUE by accident (preventing confusion for the end user!)
   //
   if ( DEBUG && ( $msg_code == GENERAL_ERROR || $msg_code == CRITICAL_ERROR ) ){
      if ( $debug_text != '' ){
         $msg_text = $msg_text . '<br /><br /><b><u>DEBUG MODE</u></b>' . $debug_text;
      }
   }

   echo "<html>\n<body>\n" . $msg_title . "\n<br /><br />\n" . $msg_text . "</body>\n</html>";
   exit;
}
