First half of updating activities to improve presistence of search form when edit form displayed, a=chris

Chris Pollett [2016-09-19 04:Sep:th]
First half of updating activities to improve presistence of search form when edit form displayed, a=chris
Filename
src/controllers/AdminController.php
src/controllers/components/AccountaccessComponent.php
src/controllers/components/AdvertisementComponent.php
src/controllers/components/CrawlComponent.php
src/controllers/components/SocialComponent.php
src/controllers/components/SystemComponent.php
src/library/ScraperManager.php
src/views/elements/EditmixElement.php
src/views/elements/ManageadvertisementsElement.php
src/views/elements/ManagerolesElement.php
src/views/elements/ManageusersElement.php
src/views/elements/MixcrawlsElement.php
src/views/elements/ScrapersElement.php
src/views/helpers/PagingtableHelper.php
src/views/helpers/SearchformHelper.php
tests/ManyDetectorsExperiment.php
diff --git a/src/controllers/AdminController.php b/src/controllers/AdminController.php
index 1a11dd418..1f4bee7cf 100755
--- a/src/controllers/AdminController.php
+++ b/src/controllers/AdminController.php
@@ -547,6 +547,7 @@ class AdminController extends Controller implements CrawlConstants
      *
      * @param array& $data modified to contain the field data needed for
      *     the view to draw the search form
+     * @param string activity in which this search is being conducted
      * @param array $comparison_fields those fields of the entity
      *     in question ( for example, users) which we can search both with
      *     string comparison operators and equality operators
@@ -555,10 +556,12 @@ class AdminController extends Controller implements CrawlConstants
      * @param string $field_postfix suffix to append onto field names in
      *     case there are multiple forms on the same page
      */
-    public function tableSearchRequestHandler(&$data, $comparison_fields = [],
-        $equal_comparison_fields = [], $field_postfix = "")
+    public function tableSearchRequestHandler(&$data, $activity,
+        $comparison_fields = [], $equal_comparison_fields = [],
+        $field_postfix = "")
     {
         $data['FORM_TYPE'] = "search";
+        $activity_postfix = $activity . $field_postfix;
         $data['COMPARISON_TYPES'] = [
             "=" => tl('admin_controller_equal'),
             "!=" => tl('admin_controller_not_equal'),
@@ -566,15 +569,21 @@ class AdminController extends Controller implements CrawlConstants
             "BEGINS WITH" => tl('admin_controller_begins_with'),
             "ENDS WITH" => tl('admin_controller_ends_with'),
         ];
+        $_SESSION['SEARCH'][$activity_postfix]['COMPARISON_TYPES'] =
+            $data['COMPARISON_TYPES'];
         $data['EQUAL_COMPARISON_TYPES'] = [
             "=" => tl('admin_controller_equal'),
             "!=" => tl('admin_controller_not_equal'),
         ];
+        $_SESSION['SEARCH'][$activity_postfix]['EQUAL_COMPARISON_TYPES'] =
+            $data['EQUAL_COMPARISON_TYPES'];
         $data['SORT_TYPES'] = [
             "NONE" => tl('admin_controller_no_sort'),
             "ASC" => tl('admin_controller_sort_ascending'),
             "DESC" => tl('admin_controller_sort_descending'),
         ];
+        $_SESSION['SEARCH'][$activity_postfix]['SORT_TYPES'] =
+            $data['SORT_TYPES'];
         $paging = "";
         foreach ($comparison_fields as $comparison_start) {
             $comparison = $comparison_start."_comparison";
@@ -585,6 +594,8 @@ class AdminController extends Controller implements CrawlConstants
                 isset($data[$comparison_types][
                 $_REQUEST[$comparison]])) ? $_REQUEST[$comparison] :
                 "=";
+            $_SESSION['SEARCH'][$activity_postfix]['COMPARISON_FIELDS'
+                ][$comparison] = $data[$comparison];
             $paging .= "&$comparison=".
                 urlencode($data[$comparison]);
         }
@@ -592,8 +603,10 @@ class AdminController extends Controller implements CrawlConstants
             $sort = $sort_start."_sort";
             $data[$sort] = (isset($_REQUEST[$sort]) &&
                 isset($data['SORT_TYPES'][
-                $_REQUEST[$sort]])) ?$_REQUEST[$sort] :
+                $_REQUEST[$sort]])) ? $_REQUEST[$sort] :
                 "NONE";
+            $_SESSION['SEARCH'][$activity_postfix]['SORT'][$sort] =
+                $data[$sort];
             $paging .= "&$sort=".urlencode($data[$sort]);
         }
         $search_array = [];
@@ -604,6 +617,8 @@ class AdminController extends Controller implements CrawlConstants
             $data[$field_name] = (isset($_REQUEST[$field_name])) ?
                 $this->clean($_REQUEST[$field_name], "string") :
                 "";
+            $_SESSION['SEARCH'][$activity_postfix]['FIELD_NAMES'
+                ][$field_name] = $data[$field_name];
             if ($field_name=='access' && $data[$field_name] >= 10) {
                 $search_array[] = ["status",
                     $data[$field_comparison], $data[$field_name]/10,
@@ -617,6 +632,33 @@ class AdminController extends Controller implements CrawlConstants
                 urlencode($data[$field_name]);
         }
         $data['PAGING'] = $paging;
+        $_SESSION['SEARCH'][$activity_postfix]['SEARCH_ARRAY'] =
+            $search_array;
+        $_SESSION['SEARCH'][$activity_postfix]['PAGING'] =
+            $data['PAGING'];
         return $search_array;
     }
+    /**
+     *
+     */
+    function restoreLastSearchFromSession(&$data, $activity,
+        $field_postfix = "")
+    {
+        $activity_postfix = $activity . $field_postfix;
+        if(empty($_SESSION['LAST_SEARCH'][$activity_postfix])) {
+            return;
+        }
+        $last_search = $_SESSION['LAST_SEARCH'][$activity_postfix];
+        foreach (['COMPARISON_TYPES', 'EQUAL_COMPARISON_TYPES',
+            'SORT_TYPES', 'SEARCH_ARRAY', 'PAGING'] as $field) {
+            $data[$field] = (empty($last_search[$field])) ? [] :
+                $last_search[$field];
+        }
+        foreach (['COMPARISON_FIELDS', 'SORT', 'FIELD_NAMES'] as $field) {
+            foreach ($last_search[$field] as $name => $value) {
+                $data[$name] = $value;
+            }
+        }
+        return $data['SEARCH_ARRAY'];
+    }
 }
diff --git a/src/controllers/components/AccountaccessComponent.php b/src/controllers/components/AccountaccessComponent.php
index 5652c4379..652177855 100644
--- a/src/controllers/components/AccountaccessComponent.php
+++ b/src/controllers/components/AccountaccessComponent.php
@@ -361,7 +361,7 @@ class AccountaccessComponent extends Component
         }
         $request_fields = ['start_row', 'num_show', 'end_row',
             'visible_roles', 'visible_groups', 'role_filter',
-            'group_filter', 'role_limit', 'group_limit'];
+            'group_filter', 'role_limit', 'group_limit', 'context'];
         $signin_model = $parent->model("signin");
         $user_model = $parent->model("user");
         $group_model = $parent->model("group");
@@ -423,9 +423,10 @@ class AccountaccessComponent extends Component
         $data['PAGING'] = "";
         if (isset($_REQUEST['arg']) &&
             in_array($_REQUEST['arg'], $possible_arguments)) {
+            $arg = $_REQUEST['arg'];
             $pass_len = (isset($_REQUEST['new_password'])) ?
                 strlen($_REQUEST['new_password']) : 0;
-            switch ($_REQUEST['arg']) {
+            switch ($arg) {
                 case "adduser":
                     if ($pass_len > C\ZKP_PASSWORD_LEN ||
                         (C\AUTHENTICATION_MODE != C\ZKP_AUTHENTICATION &&
@@ -479,6 +480,9 @@ class AccountaccessComponent extends Component
                     break;
                 case "edituser":
                     $data['FORM_TYPE'] = "edituser";
+                    if (!empty($_REQUEST['context'])) {
+                        $data['context'] = "search";
+                    }
                     $user = $user_model->getUser($username);
                     if (!$user) {
                         return $parent->redirectWithMessage(
@@ -554,6 +558,10 @@ class AccountaccessComponent extends Component
                     $data['CURRENT_USER']['id'] = $user_id;
                     break;
                 case "deleteuser":
+                    if (!empty($_REQUEST['context'])) {
+                        $_REQUEST['arg'] = 'search';
+                        $request_fields[] = 'arg';
+                    }
                     $user_id =
                         $signin_model->getUserId($username);
                     if ($user_id <= 0) {
@@ -578,24 +586,24 @@ class AccountaccessComponent extends Component
                         $_REQUEST['arg'] = 'adduser';
                         return $parent->redirectWithMessage(
                         tl('accountaccess_component_username_doesnt_exists'),
-                            $request_fields);
+                            array_merge(['arg'], $request_fields));
                     } else  if (!($role_id = $role_model->getRoleId(
                         $select_role))) {
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_rolename_doesnt_exists'
-                            ), array_merge(array('arg', 'user_name'),
+                            ), array_merge(['arg', 'user_name'],
                             $request_fields));
                     } else if ($role_model->checkUserRole($user_id,
                         $role_id)) {
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_rolename_already_added'
-                            ), array_merge(array('arg', 'user_name'),
+                            ), array_merge(['arg', 'user_name'],
                             $request_fields));
                     } else {
                         $role_model->addUserRole($user_id, $role_id);
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_rolename_added'),
-                            array_merge(array('arg', 'user_name'),
+                            array_merge(['arg', 'user_name'],
                             $request_fields));
                     }
                     break;
@@ -605,18 +613,18 @@ class AccountaccessComponent extends Component
                         $_REQUEST['arg'] = 'adduser';
                         return $parent->redirectWithMessage(
                         tl('accountaccess_component_username_doesnt_exists'),
-                            $request_fields);
+                            array_merge(['arg'], $request_fields));
                     } else if (!($group_id = $group_model->getGroupId(
                         $select_group))) {
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_groupname_doesnt_exists'
-                            ), array_merge(array('arg', 'user_name'),
+                            ), array_merge(['arg', 'user_name'],
                             $request_fields));
                     } else if ($group_model->checkUserGroup($user_id,
                         $group_id)){
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_groupname_already_added'
-                            ), array_merge(array('arg', 'user_name'),
+                            ), array_merge(['arg', 'user_name'],
                             $request_fields));
                     } else {
                         $group_model->addUserGroup($user_id,
@@ -624,7 +632,7 @@ class AccountaccessComponent extends Component
                         $this->getUserGroupsData($data, $user_id);
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_groupname_added'),
-                            array_merge(array('arg', 'user_name'),
+                            array_merge(['arg', 'user_name'],
                             $request_fields));
                     }
                     break;
@@ -634,12 +642,13 @@ class AccountaccessComponent extends Component
                         $_REQUEST['arg'] = 'adduser';
                         return $parent->redirectWithMessage(
                         tl('accountaccess_component_username_doesnt_exists'),
-                            $request_fields);
+                            array_merge(['arg'],
+                            $request_fields));
                     } else if (!($role_model->checkUserRole($user_id,
                         $select_role))) {
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_rolename_doesnt_exists'
-                            ), array_merge(array('arg', 'user_name'),
+                            ), array_merge(['arg', 'user_name'],
                             $request_fields));
                     } else {
                         $data['FORM_TYPE'] = "edituser";
@@ -648,12 +657,16 @@ class AccountaccessComponent extends Component
                         $this->getUserRolesData($data, $user_id);
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_rolename_deleted'
-                            ), array_merge(array('arg', 'user_name'),
+                            ), array_merge(['arg', 'user_name'],
                             $request_fields));
                     }
                     break;
                 case "deleteusergroup":
                     $_REQUEST['arg'] = 'edituser';
+                    if (!empty($_REQUEST['context'])) {
+                        $_REQUEST['c'] = 'search';
+                        $request_fields[] = 'arg';
+                    }
                     if ($user_id <= 0) {
                         $_REQUEST['arg'] = 'adduser';
                         return $parent->redirectWithMessage(
@@ -663,7 +676,7 @@ class AccountaccessComponent extends Component
                         $select_group))) {
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_groupname_doesnt_exists'
-                            ), array_merge(array('arg', 'user_name'),
+                            ), array_merge(['arg', 'user_name'],
                             $request_fields));
                     } else {
                         $data['FORM_TYPE'] = "edituser";
@@ -672,18 +685,31 @@ class AccountaccessComponent extends Component
                         $this->getUserGroupsData($data, $user_id);
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_group_deleted'),
-                            array_merge(array('arg', 'user_name'),
+                            array_merge(['arg', 'user_name'],
                             $request_fields));
                     }
                     break;
                 case "search":
                     $data["FORM_TYPE"] = "search";
                     $search_array =
-                        $parent->tableSearchRequestHandler($data,
+                        $parent->tableSearchRequestHandler($data,
+                        "manageUsers",
                         ['user', 'first', 'last', 'email', 'status'],
                         ['status'], "_name");
+                    if (empty($_SESSION['LAST_SEARCH']['manageUsers_name']) ||
+                        !empty($_REQUEST['user_name'])) {
+                        $_SESSION['LAST_SEARCH']['manageUsers_name'] =
+                            $_SESSION['SEARCH']['manageUsers_name'];
+                        unset($_SESSION['SEARCH']['manageUsers_name']);
+                    } else {
+                        $default_search = true;
+                    }
                     break;
                 case "updatestatus":
+                    if (!empty($_REQUEST['context'])) {
+                        $_REQUEST['arg'] = 'search';
+                        $request_fields[] = 'arg';
+                    }
                     $user_id = $signin_model->getUserId($username);
                     if (!isset($data['STATUS_CODES'][$_REQUEST['userstatus']])||
                         $user_id == 1) {
@@ -700,8 +726,22 @@ class AccountaccessComponent extends Component
                     break;
             }
         }
-        if ($search_array == []) {
-            $search_array[] = ["user", "", "", "ASC"];
+        if ($search_array == [] || !empty($default_search)) {
+            if (!empty($_SESSION['LAST_SEARCH']['manageUsers_name'])) {
+                if (!empty($_REQUEST['arg']) && $_REQUEST['arg'] == 'search') {
+                    $search_array =
+                        $parent->restoreLastSearchFromSession($data,
+                        'manageUsers_name');
+                } else if (!empty($_REQUEST['context'])) {
+                    $search_array = $_SESSION['LAST_SEARCH'][
+                        'manageUsers_name']['SEARCH_ARRAY'];
+                    $data['PAGING'] =
+                        $_SESSION['LAST_SEARCH']['manageUsers_name']['PAGING'];
+                }
+            }
+            if ($search_array == []) {
+                $search_array[] = ["user", "", "", "ASC"];
+            }
         }
         $parent->pagingLogic($data, $user_model, "USERS",
             C\DEFAULT_ADMIN_PAGING_NUM, $search_array, "");
@@ -802,7 +842,6 @@ class AccountaccessComponent extends Component
      *
      * @return array $data information about roles in the system, activities,
      *     etc. as well as status messages on performing a given sub activity
-     *
      */
     public function manageRoles()
     {
@@ -884,13 +923,13 @@ class AccountaccessComponent extends Component
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_rolename_doesnt_exists'
                             ), ["arg", "start_row", "end_row", "num_show",
-                            "name"]);
+                            "name", "context"]);
                     } else if (!in_array($select_activity, $activity_ids)) {
                         return $parent->redirectWithMessage(
                             tl(
                             'accountaccess_component_activityname_doesnt_exists'
                             ), ["arg", "start_row", "end_row", "num_show",
-                            "name"]);
+                            "name", "context"]);
                     } else {
                         $role_model->addActivityRole(
                             $role_id, $select_activity);
@@ -899,8 +938,8 @@ class AccountaccessComponent extends Component
                             $role_model->getRoleActivities($role_id);
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_activity_added'),
-                            ["arg", "start_row", "end_row", "num_show", "name"]
-                            );
+                            ["arg", "start_row", "end_row", "num_show", "name",
+                            "context"]);
                     }
                     break;
                 case "addrole":
@@ -921,20 +960,20 @@ class AccountaccessComponent extends Component
                             "</h1>')";
                    }
                    $data['CURRENT_ROLE']['name'] = "";
-                    break;
+                   break;
                 case "deleteactivity":
                    $_REQUEST['arg'] = "editrole";
                    if (($role_id = $role_model->getRoleId($name)) <= 0) {
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_rolename_doesnt_exists'
                             ), ["arg", "start_row", "end_row", "num_show",
-                            "name"]);
+                            "name", "context"]);
                     } else if (!in_array($select_activity, $activity_ids)) {
                         return $parent->redirectWithMessage(
                             tl(
                             'accountaccess_component_activityname_doesnt_exists'
                             ), ["arg", "start_row", "end_row", "num_show",
-                            "name"]);
+                            "name", "context"]);
                     } else {
                         $role_model->deleteActivityRole(
                             $role_id, $select_activity);
@@ -946,21 +985,27 @@ class AccountaccessComponent extends Component
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_activity_deleted'),
                             ["arg", "start_row", "end_row", "num_show",
-                            "name"]);
+                            "name", "context"]);
                     }
                     break;
                 case "deleterole":
+                    $preserve = [];
+                    if (!empty($_REQUEST['context'])) {
+                        $_REQUEST['arg'] = 'search';
+                        $preserve[] = 'arg';
+                    }
                     if (($role_id = $role_model->getRoleId($name)) <= 0) {
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_rolename_doesnt_exists'
-                            ),["start_row", "end_row", "num_show"]);
+                            ),array_merge($preserve, ["start_row", "end_row",
+                            "num_show"]));
                     } else {
                         $role_model->deleteRole($role_id);
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_rolename_deleted'),
-                            ["start_row", "end_row", "num_show"]);
+                            array_merge($preserve, ["start_row", "end_row",
+                            "num_show"]));
                     }
-                    $data['CURRENT_ROLE']['name'] = "";
                     break;
                 case "editrole":
                     $data['FORM_TYPE'] = "editrole";
@@ -972,6 +1017,9 @@ class AccountaccessComponent extends Component
                         $data['FORM_TYPE'] = "addrole";
                         break;
                     }
+                    if (!empty($_REQUEST['context'])) {
+                        $data['context'] = 'search';
+                    }
                     $update = false;
                     foreach ($data['CURRENT_ROLE'] as $field => $value) {
                         $upper_field = strtoupper($field);
@@ -990,17 +1038,40 @@ class AccountaccessComponent extends Component
                         $role_model->updateRole($role);
                         return $parent->redirectWithMessage(
                             tl('accountaccess_component_role_updated'),
-                            ["arg", "start_row", "end_row", "num_show"]);
+                            ["arg", "start_row", "end_row", "num_show",
+                            "context"]);
                     }
                     break;
                 case "search":
                     $search_array = $parent->tableSearchRequestHandler($data,
-                        ['name']);
+                        "manageRoles", ['name']);
+                    if (empty($_SESSION['LAST_SEARCH']['manageRoles']) ||
+                        isset($_REQUEST['name'])) {
+                        $_SESSION['LAST_SEARCH']['manageRoles'] =
+                            $_SESSION['SEARCH']['manageRoles'];
+                        unset($_SESSION['SEARCH']['manageRoles']);
+                    } else {
+                        $default_search = true;
+                    }
                     break;
             }
         }
-        if ($search_array == []) {
-            $search_array[] = ["name", "", "", "ASC"];
+        if ($search_array == [] || !empty($default_search)) {
+            if (!empty($_SESSION['LAST_SEARCH']['manageRoles'])) {
+                if (!empty($_REQUEST['arg']) && $_REQUEST['arg'] == 'search') {
+                    $search_array =
+                        $parent->restoreLastSearchFromSession($data,
+                        'manageRoles');
+                } else if (!empty($_REQUEST['context'])) {
+                    $search_array =
+                        $_SESSION['LAST_SEARCH']['manageRoles']['SEARCH_ARRAY'];
+                    $data['PAGING'] =
+                        $_SESSION['LAST_SEARCH']['manageRoles']['PAGING'];
+                }
+            }
+            if ($search_array == []) {
+                $search_array[] = ["name", "", "", "ASC"];
+            }
         }
         $parent->pagingLogic($data, $role_model, "ROLES",
             C\DEFAULT_ADMIN_PAGING_NUM, $search_array, "");
diff --git a/src/controllers/components/AdvertisementComponent.php b/src/controllers/components/AdvertisementComponent.php
index 501d8fb28..882b2e4cd 100644
--- a/src/controllers/components/AdvertisementComponent.php
+++ b/src/controllers/components/AdvertisementComponent.php
@@ -171,6 +171,7 @@ class AdvertisementComponent extends Component
             180 => tl('advertisement_component_one_eighty_days'),
         ];
         $request_field_types = [
+            'context' => 'string',
             "start_row" => 'int', "num_show"  => 'int', "end_row"  => 'int',
             "NAME" => 'string', "DESTINATION" => 'web-url',
             "DESCRIPTION"  => 'string', "KEYWORDS"  => 'string',
@@ -277,9 +278,15 @@ class AdvertisementComponent extends Component
                     $credit_model->updateCredits($user_id,
                         -$data["BUDGET"],
                         'advertisement_component_buy_ad');
+                    $preserve = [];
+                    if (!empty($_REQUEST['context'])) {
+                        $_REQUEST['arg'] = 'search';
+                        $preserve[] = 'arg';
+                    }
                     return $parent->redirectWithMessage(
                         tl('advertisement_component_ad_created'),
-                        ["start_row", "num_show", "end_row"]);
+                        array_merge($preserve,
+                        ["start_row", "num_show", "end_row"]));
                 }
                 break;
             case "changestatus":
@@ -305,10 +312,14 @@ class AdvertisementComponent extends Component
                     $result = $advertisement_model->setAdvertisementStatus(
                         $data['id'], $data['status']);
                     if ($result) {
+                    $preserve = ["start_row", "end_row", "num_show"];
+                        if (!empty($_REQUEST['context'])) {
+                            $_REQUEST['arg'] = 'search';
+                            $preserve[] = 'arg';
+                        }
                         return $parent->redirectWithMessage(tl(
                             tl('advertisement_component_status_changed')),
-                            array_merge(["start_row", "end_row", "num_show"],
-                            $request_fields));
+                            array_merge($preserve, $request_fields));
                     }
                 }
                 break;
@@ -353,7 +364,8 @@ class AdvertisementComponent extends Component
                             unset($data['END_DATE']);
                             return $parent->redirectWithMessage(
                                 tl('advertisement_component_ad_updated'),
-                                ["start_row", "num_show", "end_row"]);
+                                ["arg", "id", "start_row", "num_show",
+                                "end_row", "context"]);
                         }
                     }
                 }
@@ -362,12 +374,36 @@ class AdvertisementComponent extends Component
                 $data["FORM_TYPE"] = "search";
                 $search_array =
                     $parent->tableSearchRequestHandler($data,
+                        "manageAdvertisements",
                         ['name', 'description', 'destination', 'keywords',
                         'budget', 'start_date', 'end_date']);
+                if (empty($_SESSION['LAST_SEARCH']['manageAdvertisements']) ||
+                    isset($_REQUEST['name'])) {
+                    $_SESSION['LAST_SEARCH']['manageAdvertisements'] =
+                        $_SESSION['SEARCH']['manageAdvertisements'];
+                    unset($_SESSION['SEARCH']['manageAdvertisements']);
+                } else {
+                    $default_search = true;
+                }
                 break;
         }
-        if ($search_array == []) {
-            $search_array[] = ["id", "", "", "DESC"];
+        if ($search_array == [] || !empty($default_search)) {
+            if (!empty($_SESSION['LAST_SEARCH']['manageAdvertisements'])) {
+                if (!empty($_REQUEST['arg']) && $_REQUEST['arg'] == 'search') {
+                    $search_array =
+                        $parent->restoreLastSearchFromSession($data,
+                        'manageAdvertisements');
+                } else if (!empty($_REQUEST['context'])) {
+                    $search_array =
+                        $_SESSION['LAST_SEARCH']['manageAdvertisements'][
+                        'SEARCH_ARRAY'];
+                    $data['PAGING'] = $_SESSION['LAST_SEARCH'][
+                        'manageAdvertisements']['PAGING'];
+                }
+            }
+            if ($search_array == []) {
+                $search_array[] = ["id", "", "", "DESC"];
+            }
         }
         if(!C\MOBILE) {
             $data['SCRIPT'] .= "\npreview(elt('ad-name'))\n" .
diff --git a/src/controllers/components/CrawlComponent.php b/src/controllers/components/CrawlComponent.php
index c42f6c9c4..1553ba8d3 100644
--- a/src/controllers/components/CrawlComponent.php
+++ b/src/controllers/components/CrawlComponent.php
@@ -690,13 +690,37 @@ class CrawlComponent extends Component implements CrawlConstants

                 case 'search':
                     $search_array =
-                        $parent->tableSearchRequestHandler($data, ['name']);
+                        $parent->tableSearchRequestHandler($data,
+                            "manageClassifiers", ['name']);
+                    if (empty($_SESSION['LAST_SEARCH']['manageClassifiers']) ||
+                        isset($_REQUEST['name'])) {
+                        $_SESSION['LAST_SEARCH']['manageClassifiers'] =
+                            $_SESSION['SEARCH']['manageClassifiers'];
+                        unset($_SESSION['SEARCH']['manageClassifiers']);
+                    } else {
+                        $default_search = true;
+                    }
                 break;
             }
         }
         $data['classifiers'] = $classifiers;
-        if ($search_array == []) {
-            $search_array[] = ["name", "", "", "ASC"];
+        if ($search_array == [] || !empty($default_search)) {
+            if (!empty($_SESSION['LAST_SEARCH']['manageClassifiers'])) {
+                if (!empty($_REQUEST['arg']) && $_REQUEST['arg'] == 'search') {
+                    $search_array =
+                        $parent->restoreLastSearchFromSession($data,
+                        'manageClassifiers');
+                } else if (!empty($_REQUEST['context'])) {
+                    $search_array =
+                        $_SESSION['LAST_SEARCH'][
+                        'manageClassifiers']['SEARCH_ARRAY'];
+                    $data['PAGING'] =
+                        $_SESSION['LAST_SEARCH']['manageClassifiers']['PAGING'];
+                }
+            }
+            if ($search_array == []) {
+                $search_array[] = ["name", "", "", "ASC"];
+            }
         }
         $parent->pagingLogic($data, 'classifiers', 'classifiers',
             C\DEFAULT_ADMIN_PAGING_NUM, $search_array, "",
diff --git a/src/controllers/components/SocialComponent.php b/src/controllers/components/SocialComponent.php
index d3388e542..ee0c00ad2 100644
--- a/src/controllers/components/SocialComponent.php
+++ b/src/controllers/components/SocialComponent.php
@@ -175,6 +175,14 @@ class SocialComponent extends Component implements CrawlConstants
             $group = null;
         }
         /* end ownership verify */
+        $browse = false;
+        $search_name = "manageGroups";
+        if (isset($_REQUEST['browse']) && $_REQUEST['browse'] == 'true' &&
+            $_REQUEST['arg'] == 'search') {
+            $browse = true;
+            $data['browse'] = 'true';
+            $search_name = "browseGroups";
+        }
         $data['USER_FILTER'] = "";
         if (isset($_REQUEST['arg']) &&
             in_array($_REQUEST['arg'], $possible_arguments)) {
@@ -494,9 +502,18 @@ class SocialComponent extends Component implements CrawlConstants
                         tl('social_component_banned_status');
                     $search_array =
                         $parent->tableSearchRequestHandler($data,
-                        ['name', 'owner', 'register', 'access','voting',
+                            $search_name,
+                            ['name', 'owner', 'register', 'access','voting',
                             'lifetime'],
-                        ['register', 'access', 'voting', 'lifetime']);
+                            ['register', 'access', 'voting', 'lifetime']);
+                    if (empty($_SESSION['LAST_SEARCH'][$search_name]) ||
+                        isset($_REQUEST['name'])) {
+                        $_SESSION['LAST_SEARCH'][$search_name] =
+                            $_SESSION['SEARCH'][$search_name];
+                        unset($_SESSION['SEARCH'][$search_name]);
+                    } else {
+                        $default_search = true;
+                    }
                     break;
                 case "statistics":
                     if (!$group_id || (!$is_owner &&
@@ -542,14 +559,22 @@ class SocialComponent extends Component implements CrawlConstants
             }
         }
         $current_id = $_SESSION["USER_ID"];
-        $browse = false;
-        if (isset($_REQUEST['browse']) && $_REQUEST['browse'] == 'true' &&
-            $_REQUEST['arg'] == 'search') {
-            $browse = true;
-            $data['browse'] = 'true';
-        }
-        if ($search_array == []) {
-            $search_array[] = ["name", "", "", "ASC"];
+        if ($search_array == [] || !empty($default_search)) {
+            if (!empty($_SESSION['LAST_SEARCH'][$search_name])) {
+                if (!empty($_REQUEST['arg']) && $_REQUEST['arg'] == 'search') {
+                    $search_array =
+                        $parent->restoreLastSearchFromSession($data,
+                        $search_name);
+                } else if (!empty($_REQUEST['context'])) {
+                    $search_array =
+                        $_SESSION['LAST_SEARCH'][$search_name]['SEARCH_ARRAY'];
+                    $data['PAGING'] =
+                        $_SESSION['LAST_SEARCH'][$search_name]['PAGING'];
+                }
+            }
+            if ($search_array == []) {
+                $search_array[] = ["name", "", "", "ASC"];
+            }
         }
         $parent->pagingLogic($data, $group_model,
             "GROUPS", C\DEFAULT_ADMIN_PAGING_NUM, $search_array, "",
@@ -3300,12 +3325,19 @@ EOD;
                             tl('social_component_mix_invalid_timestamp'));
                     }
                     $crawl_model->deleteCrawlMix($_REQUEST['timestamp']);
+                    $preserve = [];
+                    if (!empty($_REQUEST['context'])) {
+                        $_REQUEST['arg'] = 'search';
+                        $preserve[] = 'arg';
+                    }
                     return $parent->redirectWithMessage(
-                        tl('social_component_mix_deleted'));
-                    break;
+                        tl('social_component_mix_deleted'), $preserve);
                 case "editmix":
                     //$data passed by reference
                     $this->editMix($data);
+                    if (!empty($_REQUEST['context'])) {
+                        $data['context'] = 'search';
+                    }
                     break;
                 case "importmix":
                     $import_success = true;
@@ -3329,7 +3361,6 @@ EOD;
                     $crawl_model->setCrawlMix($mix);
                     return $parent->redirectWithMessage(
                         tl('social_component_mix_imported'));
-                    break;
                 case "index":
                     $timestamp = substr(
                         $parent->clean($_REQUEST['timestamp'], "int"), 0,
@@ -3341,12 +3372,25 @@ EOD;
                         $_SESSION['its'] = $timestamp;
                         $user_model->setUserSession($user_id, $_SESSION);
                     }
+                    $preserve = [];
+                    if (!empty($_REQUEST['context'])) {
+                        $_REQUEST['arg'] = 'search';
+                        $preserve[] = 'arg';
+                    }
                     return $parent->redirectWithMessage(
-                        tl('social_component_set_index'));
-                    break;
+                        tl('social_component_set_index'), $preserve);
                 case "search":
                     $search_array =
-                        $parent->tableSearchRequestHandler($data, ['name']);
+                        $parent->tableSearchRequestHandler($data,
+                            "mixCrawls", ['name']);
+                    if (empty($_SESSION['LAST_SEARCH']['mixCrawls']) ||
+                        isset($_REQUEST['name'])) {
+                        $_SESSION['LAST_SEARCH']['mixCrawls'] =
+                            $_SESSION['SEARCH']['mixCrawls'];
+                        unset($_SESSION['SEARCH']['mixCrawls']);
+                    } else {
+                        $default_search = true;
+                    }
                     break;
                 case "sharemix":
                     if (!isset($_REQUEST['group_name'])) {
@@ -3390,8 +3434,22 @@ EOD;
                     break;
             }
         }
-        if ($search_array == []) {
-            $search_array[] = ["name", "", "", "ASC"];
+        if ($search_array == [] || !empty($default_search)) {
+            if (!empty($_SESSION['LAST_SEARCH']['mixCrawls'])) {
+                if (!empty($_REQUEST['arg']) && $_REQUEST['arg'] == 'search') {
+                    $search_array =
+                        $parent->restoreLastSearchFromSession($data,
+                        'mixCrawls');
+                } else if (!empty($_REQUEST['context'])) {
+                    $search_array =
+                        $_SESSION['LAST_SEARCH']['mixCrawls']['SEARCH_ARRAY'];
+                    $data['PAGING'] =
+                        $_SESSION['LAST_SEARCH']['mixCrawls']['PAGING'];
+                }
+            }
+            if ($search_array == []) {
+                $search_array[] = ["name", "", "", "ASC"];
+            }
         }
         $search_array[] = ["owner_id", "=", $user_id, ""];
         $parent->pagingLogic($data, $crawl_model, "available_mixes",
@@ -3423,7 +3481,6 @@ EOD;
             (L\getLocaleDirection() == 'ltr') ? "right": "left";
         $data["ELEMENT"] = "editmix";
         $user_id = $_SESSION['USER_ID'];
-
         $mix = [];
         $timestamp = 0;
         if (isset($_REQUEST['timestamp'])) {
@@ -3526,8 +3583,14 @@ EOD;
             if ($save_mix) {
                 $data['MIX'] = $mix;
                 $crawl_model->setCrawlMix($mix);
+                $preserve = [];
+                if (!empty($_REQUEST['context']) &&
+                    $_REQUEST['context'] == 'search') {
+                    $_REQUEST['arg'] = 'search';
+                    $preserve = ['arg'];
+                }
                 return $parent->redirectWithMessage(
-                    tl('social_component_mix_saved'));
+                    tl('social_component_mix_saved'), $preserve);
             }
         }
         $data['SCRIPT'] .= 'fragments = [';
diff --git a/src/controllers/components/SystemComponent.php b/src/controllers/components/SystemComponent.php
index 5966d4163..52ae8fcf8 100755
--- a/src/controllers/components/SystemComponent.php
+++ b/src/controllers/components/SystemComponent.php
@@ -301,7 +301,7 @@ class SystemComponent extends Component
         $locale_model = $parent->model("locale");
         $possible_arguments = ["addlocale", "deletelocale", "editlocale",
             "editstrings", "search"];
-        $search_array = [["tag", "", "", "ASC"]];
+        $search_array = [];
         $data['SCRIPT'] = "";
         $data["ELEMENT"] = "managelocales";
         $data['CURRENT_LOCALE'] = ["localename" => "",
@@ -480,11 +480,37 @@ class SystemComponent extends Component
                     break;
                 case "search":
                     $search_array = $parent->tableSearchRequestHandler($data,
-                        ['name', 'tag', 'mode', 'active'],
+                        "manageLocales", ['name', 'tag', 'mode', 'active'],
                         ['active']);
+                    if (empty($_SESSION['LAST_SEARCH']["manageLocales"]) ||
+                        isset($_REQUEST['name'])) {
+                        $_SESSION['LAST_SEARCH']["manageLocales"] =
+                            $_SESSION['SEARCH']["manageLocales"];
+                        unset($_SESSION['SEARCH']["manageLocales"]);
+                    } else {
+                        $default_search = true;
+                    }
                     break;
             }
         }
+        if ($search_array == [] || !empty($default_search)) {
+            if (!empty($_SESSION['LAST_SEARCH']["manageLocales"])) {
+                if (!empty($_REQUEST['arg']) && $_REQUEST['arg'] == 'search') {
+                    $search_array =
+                        $parent->restoreLastSearchFromSession($data,
+                        "manageLocales");
+                } else if (!empty($_REQUEST['context'])) {
+                    $search_array =
+                        $_SESSION['LAST_SEARCH']["manageLocales"][
+                        'SEARCH_ARRAY'];
+                    $data['PAGING'] =
+                        $_SESSION['LAST_SEARCH']["manageLocales"]['PAGING'];
+                }
+            }
+            if ($search_array == []) {
+                $search_array = [["tag", "", "", "ASC"]];;
+            }
+        }
         if ($paging) {
             $parent->pagingLogic($data, $locale_model,
                 "LOCALES", C\DEFAULT_ADMIN_PAGING_NUM, $search_array);
diff --git a/src/library/ScraperManager.php b/src/library/ScraperManager.php
index f468c5ea7..3c3d2a043 100644
--- a/src/library/ScraperManager.php
+++ b/src/library/ScraperManager.php
@@ -56,7 +56,8 @@ class ScraperManager
                 $scraper['SIGNATURE'], ENT_QUOTES);
             if (self::checkSignature($page, $out_scraper['SIGNATURE'])) {
                 $out_scraper['ID'] = $scraper['ID'];
-                $out_scraper['SCRAPE_RULES'] = $scraper['SCRAPE_RULES'];
+                $out_scraper['SCRAPE_RULES'] = html_entity_decode(
+                    $scraper['SCRAPE_RULES'], ENT_QUOTES);;
                 $out_scraper['NAME'] = $scraper['NAME'];
                 break;
             }
@@ -95,8 +96,11 @@ class ScraperManager
         return empty($temp_page) ? $page : $temp_page;
     }
     /**
-     * Checks to see if applying the xpath in $signature to $page results
-     * in a non-empty dom node list.
+     * If $signature begins with '/', checks to see if applying
+     * the xpath in $signature to $page results
+     * in a non-empty dom node list. Otherwise, does a match of the
+     * regex (without matching start and end delimiters (say, /)
+     * against $page and returns whether found
      *
      * @var string $page a web document to check
      * @var string $signature an xpath to check against
@@ -104,11 +108,16 @@ class ScraperManager
      */
     public static function checkSignature($page, $signature)
     {
-        $dom = new \DOMDocument();
-        @$dom->loadHTML($page);
-        $xpath = new \DOMXpath($dom);
-        $results = $xpath->query($signature);
-        return !empty($results->length) || $results->length > 0;
+        if ($signature[0] == '/') {
+            $dom = new \DOMDocument();
+            @$dom->loadHTML($page);
+            $xpath = new \DOMXpath($dom);
+            $results = $xpath->query($signature);
+            return !empty($results->length) || $results->length > 0;
+        } else {
+            $regex = "/" . preg_quote($signature) . "/";
+            return (preg_match($regex, $page) == 1);
+        }
     }
     /**
      * Get the contents of a document via an xpath
diff --git a/src/views/elements/EditmixElement.php b/src/views/elements/EditmixElement.php
index 8e2422be6..374b432bd 100644
--- a/src/views/elements/EditmixElement.php
+++ b/src/views/elements/EditmixElement.php
@@ -50,10 +50,14 @@ class EditmixElement extends Element
     public function render($data)
     {
         $admin_url = htmlentities(B\controllerUrl('admin', true));
+        $context = "";
+        if (!empty($data['context'])) {
+            $context = "context=true&amp;arg=search&amp;";
+        }
         ?>
         <div class="current-activity">
         <div class="<?= $data['leftorright'] ?>">
-        <a href="<?=$admin_url ?>a=mixCrawls&amp;<?=
+        <a href="<?=$admin_url ?>a=mixCrawls&amp;<?= $context.
             C\CSRF_TOKEN."=".$data[C\CSRF_TOKEN] ?>" ><?=
             tl('editmix_element_back_to_mix') ?></a>
         </div>
@@ -63,6 +67,12 @@ class EditmixElement extends Element
         <input type="hidden" name="<?= C\CSRF_TOKEN ?>" value="<?=
             $data[C\CSRF_TOKEN] ?>" />
         <input type="hidden" name="a" value="mixCrawls" />
+        <?php
+            if ($context) { ?>
+                <input type="hidden" name="context" value="search" />
+                <?php
+            }
+        ?>
         <input type="hidden" name="arg" value="editmix" />
         <input type="hidden" name="update" value="update" />
         <input type="hidden" name="mix[TIMESTAMP]"
diff --git a/src/views/elements/ManageadvertisementsElement.php b/src/views/elements/ManageadvertisementsElement.php
index bc0bffe3c..f7876b6e7 100644
--- a/src/views/elements/ManageadvertisementsElement.php
+++ b/src/views/elements/ManageadvertisementsElement.php
@@ -84,9 +84,15 @@ class ManageadvertisementsElement extends Element
                         tl('manageadvertisements_element_actions')?></th>
                 </tr>
                 <?php
-                $admin_url = htmlentities(B\controllerUrl('admin', true)) .
+                $admin_url = htmlentities(B\controllerUrl('admin', true)) .
                     C\CSRF_TOKEN . "=" . $data[C\CSRF_TOKEN];
-                $base_url = $admin_url . "&amp;a=manageAdvertisements";
+                $context = "";
+                if (!empty($data['context']) && $data['context'] == 'search'||
+                    $data['FORM_TYPE'] == 'search') {
+                    $context = 'context=search&amp;';
+                }
+                $base_url = $admin_url . "&amp;$context" .
+                    "a=manageAdvertisements";
                 $user_url = $admin_url . "&amp;a=manageUsers&amp;arg=edituser".
                     "&amp;user_name=";
                 if (isset($data['START_ROW'])) {
@@ -240,6 +246,12 @@ class ManageadvertisementsElement extends Element
                 $data[C\CSRF_TOKEN] ?>" />
             <input type="hidden" name="a" value="manageAdvertisements"/>
             <input type="hidden" name="arg" value="<?=$data['FORM_TYPE']?>" />
+            <?php
+            if (!empty($data['context']) && $data['context'] == 'search') { ?>
+                <input type="hidden" name="context" value="search" />
+                <?php
+            }
+            ?>
             <table>
             <?php
             if($edit_advertisement && $data['HAS_ADMIN_ROLE']) { ?>
diff --git a/src/views/elements/ManagerolesElement.php b/src/views/elements/ManagerolesElement.php
index a6b25939a..922b276b0 100644
--- a/src/views/elements/ManagerolesElement.php
+++ b/src/views/elements/ManagerolesElement.php
@@ -77,8 +77,13 @@ class ManagerolesElement extends Element
                     "&amp;end_row=".$data['END_ROW'].
                     "&amp;num_show=".$data['NUM_SHOW'];
             }
-            $delete_url = $base_url . "&amp;arg=deleterole&amp;";
-            $edit_url = $base_url . "&amp;arg=editrole&amp;";
+            $context = "";
+            if ($data['FORM_TYPE'] == 'search' ||
+                !empty($data['context']) && $data['context'] == 'search') {
+                $context = 'context=search&amp;';
+            }
+            $delete_url = $base_url . "&amp;arg=deleterole&amp;$context";
+            $edit_url = $base_url . "&amp;arg=editrole&amp;$context";
             $stretch = (C\MOBILE) ? 1 :2;
             foreach ($data['ROLES'] as $role) {
                 e("<tr>");
@@ -163,7 +168,11 @@ class ManagerolesElement extends Element
                 ?> /></th></tr>
         <?php
         if ($editrole) {
-        ?>
+            $context = "";
+            if (!empty($data['context']) && $data['context'] == 'search') {
+                $context = 'context=search&amp;';
+            }
+            ?>
             <tr><th class="table-label" style="vertical-align:top"><?=
                 tl('manageroles_element_role_activities') ?>:</th>
                 <td><div class='light-gray-box'><table><?php
@@ -176,8 +185,8 @@ class ManagerolesElement extends Element
                             tl('manageroles_element_delete')."</span></td>");
                     } else {
                         e("<td><a href='{$admin_url}a=manageRoles".
-                            "&amp;arg=deleteactivity&amp;selectactivity=".
-                            $activity_array['ACTIVITY_ID']);
+                            "&amp;arg=deleteactivity&amp;$context".
+                            "selectactivity=". $activity_array['ACTIVITY_ID']);
                         e("&amp;name=".$data['CURRENT_ROLE']['name'].
                             "&amp;".C\CSRF_TOKEN."=".$data[C\CSRF_TOKEN].
                             $paging.
diff --git a/src/views/elements/ManageusersElement.php b/src/views/elements/ManageusersElement.php
index e18bd2a25..1ab5f72fb 100644
--- a/src/views/elements/ManageusersElement.php
+++ b/src/views/elements/ManageusersElement.php
@@ -61,7 +61,6 @@ class ManageusersElement extends Element
         $data['ACTIVITY'] = 'manageUsers';
         $data['VIEW'] = $this->view;
         $this->view->helper("pagingtable")->render($data);
-
         $default_accounts = [C\ROOT_ID, C\PUBLIC_USER_ID];
         ?>
         <table class="role-table">
@@ -84,8 +83,13 @@ class ManageusersElement extends Element
                     "&amp;end_row=".$data['END_ROW'].
                     "&amp;num_show=".$data['NUM_SHOW'];
             }
-            $delete_url = $base_url . "&amp;arg=deleteuser&amp;";
-            $edit_url = $base_url . "&amp;arg=edituser&amp;";
+            $context = "";
+            if ($data['FORM_TYPE'] == 'search' ||
+                !empty($data['context']) && $data['context'] == 'search') {
+                $context = 'context=search&amp;';
+            }
+            $delete_url = $base_url . "&amp;arg=deleteuser&amp;$context";
+            $edit_url = $base_url . "&amp;arg=edituser&amp;$context";
             $mobile_columns = ['USER_NAME', 'STATUS'];
             $stretch = (C\MOBILE) ? 1 :2;
             $out_columns = ['USER_NAME', 'FIRST_NAME', 'LAST_NAME',
@@ -120,6 +124,12 @@ class ManageusersElement extends Element
                         <input type="hidden" name="user_name" value="<?=
                             $user['USER_NAME'] ?>" />
                         <?php
+                        if ($context) {
+                            ?>
+                            <input type="hidden" name="context"
+                                value="search" />
+                            <?php
+                        }
                         $this->view->helper("options")->render(
                             "update-userstatus-{$user['USER_NAME']}",
                             "userstatus", $data['STATUS_CODES'],
@@ -270,7 +280,11 @@ class ManageusersElement extends Element
                 } ?></td></tr>
         <?php
         if ($edituser) {
-        ?>
+            $context = "";
+            if (!empty($data['context']) && $data['context'] == 'search') {
+                $context = 'context=search&amp;';
+            }
+            ?>
             <tr><th class="table-label" style="vertical-align:top"><?=
             tl('manageusers_element_roles') ?>:</th>
                 <td><div class='light-gray-box'>
@@ -295,12 +309,12 @@ class ManageusersElement extends Element
                                 "</span></td>");
                         } else {
                             e("<td><a href='{$admin_url}a=manageUsers".
-                                "&amp;arg=deleteuserrole&amp;selectrole=".
-                                $role_array['ROLE_ID']);
+                                "&amp;arg=deleteuserrole&amp;$context".
+                                "selectrole=" . $role_array['ROLE_ID']);
                             e("&amp;user_name=".
                                 $data['CURRENT_USER']['user_name'].
                                 "&amp;".C\CSRF_TOKEN."=".$data[C\CSRF_TOKEN].
-                                "&amp;$visibles&amp;$limits'>".
+                                "&amp;$visibles&amp;$context$limits'>".
                                 tl('manageusers_element_delete').
                                 "</a></td>");
                         }
@@ -323,7 +337,8 @@ class ManageusersElement extends Element
                                 "&amp;group_filter=".$data['GROUP_FILTER'];
                             if ($limit >= C\NUM_RESULTS_PER_PAGE ) {
                                 ?><a href='<?=
-                                "$action_url&amp;arg=edituser&amp;role_limit=".
+                                "$action_url&amp;arg=edituser&amp;$context" .
+                                "role_limit=".
                                 ($limit - C\NUM_RESULTS_PER_PAGE) ?>'
                                 >&lt;&lt;</a><?php
                             }
@@ -335,7 +350,8 @@ class ManageusersElement extends Element
                             if ($data['NUM_USER_ROLES'] > $limit +
                                 C\NUM_RESULTS_PER_PAGE) {
                                 ?><a href='<?=
-                                "$action_url&amp;arg=edituser&amp;role_limit=".
+                                "$action_url&amp;arg=edituser&amp;$context" .
+                                "role_limit=".
                                 ($limit + C\NUM_RESULTS_PER_PAGE) ?>'
                                 >&gt;&gt;</a>
                             <?php
@@ -385,7 +401,8 @@ class ManageusersElement extends Element
                             $data["MEMBERSHIP_CODES"][$group_array['STATUS']].
                             "</td>");
                         e("<td><a href='{$admin_url}a=manageUsers".
-                            "&amp;arg=deleteusergroup&amp;selectgroup=".
+                            "&amp;arg=deleteusergroup&amp;$context".
+                            "selectgroup=".
                             $group_array['GROUP_ID']);
                         e("&amp;user_name=".$data['CURRENT_USER']['user_name'].
                             "&amp;".C\CSRF_TOKEN."=".$data[C\CSRF_TOKEN].
@@ -409,7 +426,8 @@ class ManageusersElement extends Element
                                 "&amp;group_filter=".$data['GROUP_FILTER'];
                             if ($limit >= C\NUM_RESULTS_PER_PAGE ) {
                                 ?><a href='<?=
-                                "$action_url&amp;arg=edituser&amp;group_limit=".
+                                "$action_url&amp;arg=edituser&amp;$context" .
+                                "group_limit=".
                                 ($limit - C\NUM_RESULTS_PER_PAGE) ?>'
                                 >&lt;&lt;</a><?php
                             }
@@ -422,7 +440,8 @@ class ManageusersElement extends Element
                             if ($data['NUM_USER_GROUPS'] > $limit +
                                 C\NUM_RESULTS_PER_PAGE) {
                                 ?><a href='<?=
-                                "$action_url&amp;arg=edituser&amp;group_limit=".
+                                "$action_url&amp;arg=edituser&amp;$context" .
+                                "group_limit=".
                                 ($limit + C\NUM_RESULTS_PER_PAGE)
                                 ?>'>&gt;&gt;</a>
                             <?php
diff --git a/src/views/elements/MixcrawlsElement.php b/src/views/elements/MixcrawlsElement.php
index 8fdd41774..8d38db0ef 100644
--- a/src/views/elements/MixcrawlsElement.php
+++ b/src/views/elements/MixcrawlsElement.php
@@ -67,6 +67,11 @@ class MixcrawlsElement extends Element
         $data['ACTIVITY'] = 'mixCrawls';
         $data['VIEW'] = $this->view;
         $data['NO_FLOAT_TABLE'] = true;
+        $context = '';
+        if ($data['FORM_TYPE'] == 'search' ||
+            !empty($data['context']) && $data['context'] == 'search') {
+            $context = 'context=search&';
+        }
         $this->view->helper("pagingtable")->render($data);
         ?>
         <table class="mixes-table">
@@ -117,12 +122,12 @@ class MixcrawlsElement extends Element
             ?>
             <td><a href="javascript:share_form(<?=$mix['TIMESTAMP'] ?>, '<?=
                 $mix['NAME'] ?>')"><?= tl('mixcrawls_view_share') ?></a></td>
-            <td><a href="<?= $base_url ?>editmix&timestamp=<?=
+            <td><a href="<?= $base_url ?>editmix&<?=$context ?>timestamp=<?=
                 $mix['TIMESTAMP'] ?>"><?= tl('mixcrawls_view_edit')?></a></td>
             <td>
             <?php
             if ( $mix['TIMESTAMP'] != $data['CURRENT_INDEX']) { ?>
-                <a href="<?= $base_url ?>index&timestamp=<?=
+                <a href="<?= $base_url ?>index&<?=$context ?>timestamp=<?=
                 $mix['TIMESTAMP'] ?>"><?= tl('mixcrawls_set_index') ?></a>
             <?php
             } else { ?>
@@ -133,7 +138,7 @@ class MixcrawlsElement extends Element
             </td>
             <td><a onclick='javascript:return confirm("<?=
                 tl('confirm_delete_operation') ?>");' href="<?=$base_url
-                ?>deletemix&timestamp=<?=$mix['TIMESTAMP']
+                ?>deletemix&<?=$context ?>timestamp=<?=$mix['TIMESTAMP']
                 ?>"><?= tl('mixcrawls_view_delete') ?></a></td>
             </tr>
         <?php
diff --git a/src/views/elements/ScrapersElement.php b/src/views/elements/ScrapersElement.php
index 3a583a3ec..e27c1d0b7 100644
--- a/src/views/elements/ScrapersElement.php
+++ b/src/views/elements/ScrapersElement.php
@@ -123,8 +123,8 @@ class ScrapersElement extends Element
         $data['NO_SEARCH'] = true;
         $this->view->helper("pagingtable")->render($data);
         $paging = "&amp;start_row=".$data['START_ROW'].
-                    "&amp;end_row=".$data['END_ROW'].
-                    "&amp;num_show=".$data['NUM_SHOW'];
+            "&amp;end_row=".$data['END_ROW'].
+            "&amp;num_show=".$data['NUM_SHOW'];
         ?>
         <table class="scrapers-table">
         <tr><th><?= tl('scrapers_element_name_heading') ?></th>
@@ -138,7 +138,7 @@ class ScrapersElement extends Element
                 urlencode($scraper['NAME']));
         ?>
         <tr><td><b><?= $scraper['NAME'] ?></b></td>
-            <td><?=$scraper['SIGNATURE'] ?></td>
+            <td><?= $scraper['SIGNATURE'] ?></td>
             <td>
                 <?=preg_replace("/###/", "###<br />",
                     $scraper['SCRAPE_RULES']); ?>
diff --git a/src/views/helpers/PagingtableHelper.php b/src/views/helpers/PagingtableHelper.php
index 172b5d677..fa3e2c573 100644
--- a/src/views/helpers/PagingtableHelper.php
+++ b/src/views/helpers/PagingtableHelper.php
@@ -123,6 +123,11 @@ class PagingtableHelper extends Helper
                 value="<?php e($data[C\CSRF_TOKEN]); ?>" />
             <input type="hidden" name="a" value="<?= $activity ?>" />
             <?php
+            if (!empty($data['context']) || $data['FORM_TYPE'] == 'search') {
+                ?>
+                <input type="hidden" name="arg" value="search" />
+                <?php
+            }
             e("<b>".tl('pagingtable_helper_show')."</b>");
             $data['VIEW']->helper("options")->render(
                 "{$var_prefix}num-show", "{$var_prefix}num_show",
@@ -231,6 +236,11 @@ class PagingtableHelper extends Helper
                 value="<?= $data[C\CSRF_TOKEN] ?>" />
             <input type="hidden" name="a" value="<?= $activity ?>" />
             <?php
+                if (!empty($data['context']) || $data['FORM_TYPE'] == 'search'){
+                    ?>
+                    <input type="hidden" name="arg" value="search" />
+                    <?php
+                }
                 e("<b>".tl('pagingtable_helper_show')."</b>");
                 $data['VIEW']->helper("options")->render(
                     "{$var_prefix}num-show", "{$var_prefix}num_show",
diff --git a/src/views/helpers/SearchformHelper.php b/src/views/helpers/SearchformHelper.php
index d101ea693..e61dc7356 100644
--- a/src/views/helpers/SearchformHelper.php
+++ b/src/views/helpers/SearchformHelper.php
@@ -76,10 +76,10 @@ class SearchformHelper extends Helper
         <h2><?= $title . "&nbsp;" ?> </h2><?php
         $item_sep = (C\MOBILE) ? "<br />" : "</td><td>";
         ?>
-        <form id="search-form" method="post" autocomplete="off">
+        <form id="search-form" method="get" autocomplete="off">
         <input type="hidden" name="c" value="<?= $controller ?>" />
-        <input type="hidden" name="<?=CSRF_TOKEN  ?>" value="<?=
-            $data[CSRF_TOKEN] ?>" />
+        <input type="hidden" name="<?=C\CSRF_TOKEN  ?>" value="<?=
+            $data[C\CSRF_TOKEN] ?>" />
         <input type="hidden" name="a" value="<?= $activity ?>" />
         <input type="hidden" name="arg" value="search" />
         <?php
diff --git a/tests/ManyDetectorsExperiment.php b/tests/ManyScrapersExperiment.php
similarity index 96%
rename from tests/ManyDetectorsExperiment.php
rename to tests/ManyScrapersExperiment.php
index dded52651..f2f41bd95 100644
--- a/tests/ManyDetectorsExperiment.php
+++ b/tests/ManyScrapersExperiment.php
@@ -23,6 +23,7 @@
  * END LICENSE
  *
  * @author Charles Bocage charles.bocage@sjsu.edu
+ *  (changed to web scrapers by Chris Pollett)
  * @license http://www.gnu.org/licenses/ GPL3
  * @link http://www.seekquarry.com/
  * @copyright 2009 - 2016
@@ -31,6 +32,7 @@
 namespace seekquarry\yioop\tests;

 use seekquarry\yioop\configs as C;
+use seekquarry\yioop\controllers\AdminController;
 use seekquarry\yioop\library as L;
 use seekquarry\yioop\models as M;

@@ -39,9 +41,9 @@ if (isset($_SERVER['DOCUMENT_ROOT']) && strlen($_SERVER['DOCUMENT_ROOT']) > 0){
     exit();
 }
 /**
- * This script inserts 239 CMS detectors into the database so that one can
+ * This script inserts 239 Web Scraper into the database so that one can
  * test the crawl speed of Yioop in a scenario that there are a moderate
- * number of CMS detectors.
+ * number of Web Scrapers.
  */
 /**
  * Calculate base directory of script
@@ -54,22 +56,26 @@ define("seekquarry\\yioop\\configs\\BASE_DIR", C\PARENT_DIR . "/src");
 require_once C\BASE_DIR.'/configs/Config.php';
 /** For class autoload **/
 require_once C\PARENT_DIR ."/vendor/autoload.php";
-$cms_model = new M\CmsModel();
-//Add lots of CMS detectors
-$cms_detectors = getCmsDetectorEntries();
-print("Please wait this will take " . count($cms_detectors) . " seconds\n");
-foreach ($cms_detectors as $cms_detector) {
-    $name = $cms_detector[0];
-    $header = $cms_detector[1];
-    $cms_model->addCmsDetectors($name, $header, "");
-    sleep(1);
+$scraper_model = new M\ScraperModel();
+//Add lots of Web Scrapers
+$web_scrapers = getScraperEntries();
+$num_scrapers = count($web_scrapers);
+$controller = new AdminController();
+$i = 0;
+foreach ($web_scrapers as $web_scraper) {
+    $name = $web_scraper[0];
+    $signature = $web_scraper[1];
+    $scraper_model->add($controller->clean($name, "string"),
+        $controller->clean($signature, "string"), "");
+    $i++;
+    echo "Adding scraper $i of $num_scrapers.\n";
 }
 /**
- * This function has an array of CMS detector values to return.
+ * This function has an array of Web Scrapers.
  *
  * @param array CMS detector values.
  */
-function getCmsDetectorEntries()
+function getScraperEntries()
 {
     return [
         ["1C-Bitrix","(?:<link[^>]+components/bitrix|(?:src|href)=\"/bitrix" .
@@ -419,4 +425,4 @@ function getCmsDetectorEntries()
         ["xCharts","<link[^>]* href=\"[^\"]*xcharts(?:\\.min)?\\.css"],
         ["xtCommerce","<div class=\"copyright\">[^<]+<a[^>]+>xt:Commerce"],
     ];
-}
\ No newline at end of file
+}
ViewGit