Pager not working when $form[‘table’] is called with AJAX

For a statistics page I let users select the right file in a select list. After that I generate a table with stats. This table also has a pager (that worked without the ajax part).

Now I did everything in an ajax callback, when I now want to click on next page the URL is: http://localhost/drupal2/system/ajax?page=1 and that doesn’t work ofcourse.

My code:

function push_notifications_theme() { return array( 'push_notifications_form_table' => array(   'render element' => 'form', ), ); }  function push_notifications_form_table_form($  form = array(), &$  form_state) { $  form = array(); // $  id = $  _GET['id'];  $  qry = db_select('push_notifications_api', 'pt'); $  qry->distinct(); $  qry->fields('pt', array('app_name')); $  qry->orderBy('app_name', 'ASC'); $  names = $  qry->execute(); foreach($  names as $  record) { $  options[$  record->app_name] = $  record->app_name; }  $  form['title'] = array( '#type' => 'fieldset', '#title' => t('Application statistics'), '#description' => t('Select an application below to see the statistics.'), '#tree' => TRUE, );  $  form['title']['changethis'] = array( '#title' => t('Application Name'), '#type' => 'select', '#options' => $  options, '#required' => TRUE, '#ajax' => array(   'callback' => 'push_notifications_form_table_form_callback',   'wrapper' => 'replace_textfield_div', ), );  $  form['replace_textfield'] = array( '#prefix' => '<div id="replace_textfield_div">', '#suffix' => '</div>', );  if(!empty($  form_state['values']['title']['changethis'])) {  $  appname = $  form_state['values']['title']['changethis']; $  id = db_query('SELECT app_id FROM push_notifications_api WHERE app_name = :app_name', array(':app_name' => $  appname))->fetchField();  $  form['replace_textfield']['id'] = array( '#type' => 'fieldset', '#title' => t('@appname: Push notifications', array('@appname' => $  appname)), '#description' => t('Newest push notifications are on top.'), '#weight' => 10, );    $  go_back_link = array( '!link' => l(t('go back to the overview'), 'http://localhost/drupal2/admin/config/services/push_notifications'), );  $  form['replace_textfield']['goback'] = array( '#type' => 'fieldset', '#title' => t('Go back'), '#description' => t('If you want to view stats from other application you can !link', $  go_back_link), '#weight' => 25, );  // $  query = db_query('SELECT * FROM push_notifications_messages WHERE msg_appID = :app_id ORDER BY msg_timestamp DESC', array(':app_id' => $  id)); // $  qCount = db_query('SELECT * FROM push_notifications_messages WHERE msg_appID = :app_id', array(':app_id' => $  id))->rowCount();  $  query = db_select("push_notifications_messages", "n"); $  query->fields("n", array('msg_id', 'msg_message', 'msg_receiver', 'msg_device', 'msg_appID', 'msg_timestamp')); $  query->orderBy('msg_timestamp', 'DESC'); $  query->condition('msg_appID', $  id); $  query = $  query->extend('TableSort')->extend('PagerDefault')->limit(15); $  result1 = $  query->execute();   $  form['replace_textfield']['table'] = array(     '#theme' => 'table',     '#header' => array(t('Message'), t('Device'), t('Token'), t('Date')),     'rows' => array(),     '#weight' => 15,     );  foreach($  result1 as $  key => $  result) {     $  form['replace_textfield']['table']["#rows"]["'r$  key'"] = array(         'c1' => array(             'data' => array('#type' => 'item', '#markup' => t('@message', array('@message' => $  result->msg_message))),           ),         'c2' => array(             'data' => array('#type' => 'item', '#markup' => t('@device', array('@device' => $  result->msg_device))),           ),         'c3' => array(             'data' => array('#type' => 'item', '#markup' => t('@token', array('@token' => substr($  result->msg_receiver, -50)))),           ),         'c4' => array(             'data' => array('#type' => 'item', '#markup' => t('@timestamp', array('@timestamp' => date("d F Y H:i:s", $  result->msg_timestamp)))),           ),             ); }   $  form['replace_textfield']['pager'] = array('#markup' => theme('pager'), '#weight' => 20);  }    return $  form; }  function push_notifications_form_table_form_callback($  form, $  form_state) { // The form has already been submitted and updated. We can return the replaced // item as it is. return $  form['replace_textfield']; }  function theme_push_notifications_form_table(&$  variables) { // Get the userful values. $  form = $  variables['form']; $  rows = $  form['rows']; $  header = $  form['#header'];  // Setup the structure to be rendered and returned. $  content = array( '#theme' => 'table', '#header' => $  header, '#rows' => array(), );  // Traverse each row.  @see element_chidren(). foreach (element_children($  rows) as $  row_index) { $  row = array(); // Traverse each column in the row.  @see element_children(). foreach (element_children($  rows[$  row_index]) as $  col_index) {   // Render the column form element.   $  row[] = drupal_render($  rows[$  row_index][$  col_index]); } // Add the row to the table. $  content['#rows'][] = $  row; }  // Redner the table and return. return drupal_render($  content); } 

Screenshot of result: screenshot