? .bzr
? 645990-fix-view-join.patch
? 705642-fix_glossary-view.patch
? exposed_sort.patch
? views-228510-exposed_sorts-2.patch
Index: views.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/views.module,v
retrieving revision 1.341.4.11
diff -u -p -r1.341.4.11 views.module
--- views.module	6 Feb 2010 14:17:10 -0000	1.341.4.11
+++ views.module	6 Feb 2010 14:29:12 -0000
@@ -994,7 +994,7 @@ function views_exposed_form($form, &$for
   $form['submit'] = array(
     '#name' => '', // prevent from showing up in $_GET.
     '#type' => 'submit',
-    '#value' => t('Apply'),
+    '#value' => t('Submit'),
     '#id' => drupal_html_id('edit-submit-' . $view->name),
   );
 
@@ -1046,7 +1046,7 @@ function views_exposed_form_submit(&$for
   $form_state['view']->exposed_raw_input = array();
 
 
-  $exclude = array('q', 'submit', 'form_build_id', 'form_id', 'form_token', 'submit_button', 'exposed_form_plugin', '');
+  $exclude = array('q', 'submit', 'form_build_id', 'form_id', 'form_token', 'exposed_form_plugin', '');
   $exposed_form_plugin = $form_state['exposed_form_plugin'];
   $exposed_form_plugin->exposed_form_submit($form, $form_state, $exclude);
 
@@ -1295,4 +1295,3 @@ function views_process_dependency($eleme
 
   return $element;
 }
-
Index: includes/handlers.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/includes/handlers.inc,v
retrieving revision 1.119.4.4
diff -u -p -r1.119.4.4 handlers.inc
--- includes/handlers.inc	28 Jan 2010 22:44:36 -0000	1.119.4.4
+++ includes/handlers.inc	6 Feb 2010 14:29:13 -0000
@@ -19,11 +19,11 @@ function _views_create_handler($definiti
       !class_exists($definition['override handler'])) {
     return;
   }
-  
+
   if (!class_exists($definition['handler'])) {
     return;
   }
-  
+
    if (!empty($definition['override handler'])) {
      $handler = new $definition['override handler'];
    }
@@ -951,6 +951,14 @@ function views_get_timezone() {
 function views_date_sql_field($field, $field_type = 'int', $set_offset = NULL) {
   $db_type = db_driver();
   $offset = $set_offset !== NULL ? $set_offset : views_get_timezone();
+  if (isset($offset) && !is_numeric($offset)) {
+    $tz = date_default_timezone_get();
+    $current = time('Z');
+    date_default_timezone_set($offset);
+    $offset_seconds = $current - time('Z');
+    date_default_timezone_set($tz);
+  }
+
   switch ($db_type) {
     case 'mysql':
     case 'mysqli':
@@ -962,7 +970,7 @@ function views_date_sql_field($field, $f
           break;
       }
       if (!empty($offset)) {
-        $field = "($field + INTERVAL $offset SECOND)";
+        $field = "($field + INTERVAL $offset_seconds SECOND)";
       }
       return $field;
     case 'pgsql':
@@ -974,7 +982,7 @@ function views_date_sql_field($field, $f
           break;
       }
       if (!empty($offset)) {
-        $field = "($field + INTERVAL '$offset SECONDS')";
+        $field = "($field + INTERVAL '$offset_seconds SECONDS')";
       }
       return $field;
   }
@@ -1143,7 +1151,7 @@ function views_views_handlers() {
     'views_handler_sort_date',
     'views_handler_sort_menu_hierarchy',
     'views_handler_sort_random',
-  
+
     // group by handlers
     'views_handler_argument_group_by_numeric' => array(
       'parent' => 'views_handler_argument',
@@ -1256,7 +1264,7 @@ class views_join {
    * @param $view_query
    *   The source query, implementation of views_plugin_query.
    * @return
-   *   
+   *
    */
   function build_join($select_query, $table, $view_query) {
     if (empty($this->definition['table formula'])) {
Index: includes/view.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/includes/view.inc,v
retrieving revision 1.167.4.9
diff -u -p -r1.167.4.9 view.inc
--- includes/view.inc	6 Feb 2010 13:29:48 -0000	1.167.4.9
+++ includes/view.inc	6 Feb 2010 14:29:15 -0000
@@ -203,7 +203,7 @@ class view extends views_db_object {
         }
       }
     }
-    
+
     $this->current_display = 'default';
     $this->display_handler = &$this->display['default']->handler;
 
Index: modules/node/views_handler_argument_dates_various.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/modules/node/views_handler_argument_dates_various.inc,v
retrieving revision 1.4
diff -u -p -r1.4 views_handler_argument_dates_various.inc
--- modules/node/views_handler_argument_dates_various.inc	8 Jan 2009 00:25:19 -0000	1.4
+++ modules/node/views_handler_argument_dates_various.inc	6 Feb 2010 14:29:15 -0000
@@ -63,14 +63,16 @@ class views_handler_argument_node_create
    */
   function summary_name($data) {
     $created = $data->{$this->name_alias};
-    return format_date(strtotime($created . "15"), 'custom', $this->format, 0);
+    // @todo fix this! I removed ,0 but the whole timezone handling is broken.
+    return format_date(strtotime($created . "15"), 'custom', $this->format);
   }
 
   /**
    * Provide a link to the next level of the view
    */
   function title() {
-    return format_date(strtotime($this->argument . "15"), 'custom', $this->format, 0);
+    // @todo fix this! I removed ,0 but the whole timezone handling is broken.
+    return format_date(strtotime($this->argument . "15"), 'custom', $this->format);
   }
 }
 
Index: plugins/views_plugin_exposed_form.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/plugins/views_plugin_exposed_form.inc,v
retrieving revision 1.2.2.5
diff -u -p -r1.2.2.5 views_plugin_exposed_form.inc
--- plugins/views_plugin_exposed_form.inc	6 Feb 2010 13:29:48 -0000	1.2.2.5
+++ plugins/views_plugin_exposed_form.inc	6 Feb 2010 14:29:15 -0000
@@ -32,6 +32,10 @@ class views_plugin_exposed_form extends 
   function option_definition() {
     $options = parent::option_definition();
     $options['submit_button'] = array('default' => t('Apply'), 'translatable' => TRUE);
+    $options['reset_button'] = array('default' => FALSE, 'bool' => TRUE);
+    $options['exposed_sorts_label'] = array('default' => 'Sort By', 'translatable' => TRUE);
+    $options['sort_asc_label'] = array('default' => 'Asc', 'translatable' => TRUE);
+    $options['sort_desc_label'] = array('default' => 'Desc', 'translatable' => TRUE);
     return $options;
   }
 
@@ -41,14 +45,39 @@ class views_plugin_exposed_form extends 
       '#title' => t('Submit button text'),
       '#description' => t('Text to display in the submit button of the exposed form.'),
       '#default_value' => $this->options['submit_button'],
+      '#required' => TRUE,
     );
-    
+
     $form['reset_button'] = array (
       '#type' => 'checkbox',
       '#title' => t('Include reset button'),
       '#description' => t('If checked the exposed form will provide a button to reset all the applied exposed filters'),
       '#default_value' => $this->options['reset_button'],
     );
+
+    $form['exposed_sorts_label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Exposed sorts label'),
+      '#description' => t('Text to display as the label of the exposed sort select box.'),
+      '#default_value' => $this->options['exposed_sorts_label'],
+      '#required' => TRUE,
+    );
+
+    $form['sort_asc_label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Ascending'),
+      '#description' => t('Text to use when exposed sort is ordered ascending.'),
+      '#default_value' => $this->options['sort_asc_label'],
+      '#required' => TRUE,
+    );
+
+    $form['sort_desc_label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Descending'),
+      '#description' => t('Text to use when exposed sort is ordered descending.'),
+      '#default_value' => $this->options['sort_desc_label'],
+      '#required' => TRUE,
+    );
   }
 
   /**
@@ -66,7 +95,6 @@ class views_plugin_exposed_form extends 
       'method' => 'get',
       'rerender' => TRUE,
       'no_redirect' => TRUE,
-      'submit_button' => $this->options['submit_button'],
     );
 
     // Some types of displays (eg. attachments) may wish to use the exposed
@@ -89,7 +117,26 @@ class views_plugin_exposed_form extends 
     return $output;
   }
 
-  function query() { }
+  function query() {
+    $view = $this->view;
+    $exposed_data = $view->exposed_data;
+    $sort_by = $exposed_data['sort_by'];
+    if (!empty($sort_by)) {
+      $handler = $view->sort[$sort_by];
+      if (isset($handler)) {
+        $view->query->orderby = array();
+        if (isset($exposed_data['sort_order']) && in_array($exposed_data['sort_order'], array('asc', 'desc'))) {
+          $handler->options['order'] = $exposed_data['sort_order'];
+        }
+        $handler->query();
+        foreach ($view->sort as $sort) {
+          if (!$sort->is_exposed()) {
+            $sort->query();
+          }
+        }
+      }
+    }
+  }
 
   function pre_render() { }
 
@@ -106,6 +153,36 @@ class views_plugin_exposed_form extends 
         '#type' => 'submit',
       );
     }
+
+    $form['submit']['#value'] = t($this->options['submit_button']);
+    // Check if there is exposed sorts for this view
+    $exposed_sorts = array();
+    foreach ($this->view->sort as $id => $handler) {
+      if ($handler->can_expose() && $handler->is_exposed()) {
+        $exposed_sorts[$id] = check_plain($handler->options['expose']['label']);
+      }
+    }
+
+    if (count($exposed_sorts)) {
+      $form['sort_by'] = array(
+        '#type' => 'select',
+        '#options' => $exposed_sorts,
+        '#title' => t($this->options['exposed_sorts_label']),
+      );
+      $sort_order = array(
+        'asc' => t($this->options['sort_asc_label']),
+        'desc' => t($this->options['sort_desc_label']),
+      );
+      $form['sort_order'] = array(
+        '#type' => 'select',
+        '#options' => $sort_order,
+        '#title' => t('Order'),
+      );
+      $form['submit']['#weight'] = 10;
+      if (isset($form['reset'])) {
+        $form['reset']['#weight'] = 10;
+      }
+    }
   }
 
   function exposed_form_validate(&$form, &$form_state) { }
@@ -126,7 +203,7 @@ class views_plugin_exposed_form extends 
       $this->reset_form($form, $form_state);
     }
   }
-   
+
   function reset_form(&$form, &$form_state) {
     unset($_SESSION['views'][$this->view->name][$this->view->current_display]);
     $form_state = array();
Index: plugins/views_plugin_query_default.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/plugins/Attic/views_plugin_query_default.inc,v
retrieving revision 1.1.4.13
diff -u -p -r1.1.4.13 views_plugin_query_default.inc
--- plugins/views_plugin_query_default.inc	6 Feb 2010 13:35:12 -0000	1.1.4.13
+++ plugins/views_plugin_query_default.inc	6 Feb 2010 14:29:16 -0000
@@ -1215,4 +1215,3 @@ class views_plugin_query_default extends
 function views_query_default_aggregation_method_simple($group_type, $field) {
   return strtoupper($group_type) . '(' . $field . ')';
 }
-
