<?php
/*
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

////////////////////////////////////////////////////////////////////////////////
///
/// \fn resource($type)
///
/// \param $type - type of resource
///
/// \brief wrapper to create appropriate object and call selectionText for that
/// object
///
////////////////////////////////////////////////////////////////////////////////
function resource($type) {
	switch($type) {
		case 'config':
			$obj = new Config();
			break;
		case 'image':
			$obj = new Image();
			break;
		case 'computer':
			$obj = new Computer();
			break;
		case 'managementnode':
			$obj = new ManagementNode();
			break;
		case 'schedule':
			$obj = new Schedule();
			break;
		case 'addomain':
			$obj = new ADdomain();
			break;
	}

	$html = $obj->selectionText();
	print $html;
}

////////////////////////////////////////////////////////////////////////////////
///
/// \class Resource
///
/// \brief base class for all resources; provides functionality useful to all
/// types of resources
///
////////////////////////////////////////////////////////////////////////////////
class Resource {
	var $restype;
	var $restypename;
	var $hasmapping;
	var $maptype;
	var $maptypename;
	var $basecdata;
	var $defaultGetDataArgs;
	var $deletable;
	var $deletetoggled;
	var $errmsg;
	var $namefield;
	var $addable;
	var $jsondata;

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn __construct()
	///
	/// \brief class construstor
	///
	/////////////////////////////////////////////////////////////////////////////
	function __construct() {
		# defines if resource type is mapped to another type
		$this->hasmapping = 0;
		# type of resource this resource maps to
		$this->maptype = '';
		# display name for $this->maptype
		$this->maptypename = '';
		# can this resource type be deleted
		$this->deletable = 1;
		# can this resource type be flagged as deleted
		$this->deletetoggled = 1;
		# array of arguments and default values that should be passed to getData function
		$this->defaultGetDataArgs = array();
		# base data for continuations
		$this->basecdata = array('obj' => $this);
		# field in database table used for the name of this resource type
		$this->namefield = 'name';
		# can this resource have new resources directly added
		$this->addable = 1;
		# base data for sending JSON response to AJAX call; this allows an
		#   inheriting function to set some additional data before calling base
		#   function
		$this->jsondata = array();
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn getData($args)
	///
	/// \param $args - array of arguments that determine what data gets returned
	///
	/// \return empty array
	///
	/// \brief stub function; each inheriting class should implement this
	/// function
	///
	/////////////////////////////////////////////////////////////////////////////
	function getData($args) {
		return array();
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn selectionText()
	///
	/// \brief generates HTML to select what management function to perform
	///
	/////////////////////////////////////////////////////////////////////////////
	function selectionText() {
		global $user;
		# get a count of resources user can administer
		$tmp = getUserResources(array("{$this->restype}Admin"), array("administer"));
		$resAdminCnt = count($tmp[$this->restype]);

		# get a count of resources user has access to
		$tmp = getUserResources(array("{$this->restype}Admin"), array("available"));
		$resCnt = count($tmp[$this->restype]);

		# get a count of resource groups user can manage
		$tmp = getUserResources(array("{$this->restype}Admin"), array("manageGroup"), 1);
		$resGroupCnt = count($tmp[$this->restype]);

		if($this->hasmapping) {
			# get a count of $restype groups and $maptype groups user can map
			$tmp = getUserResources(array("{$this->restype}Admin"), array("manageMapping"), 1);
			$resMapCnt = count($tmp[$this->restype]);
			$tmp = getUserResources(array("{$this->maptype}Admin"), array("manageMapping"), 1);
			$maptypeMapCnt = count($tmp[$this->maptype]);
		}
		else {
			$resMapCnt = 0;
			$maptypeMapCnt = 0;
		}

		$h = '';

		$h .= "<H2>" . i("Manage {$this->restypename}s") . "</H2>\n";
		$h .= "<FORM action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
		$showsubmit = 0;
		if(in_array("{$this->restype}Admin", $user["privileges"]) &&
		   ($this->addable == 1 || $resAdminCnt)) {
			$cont = addContinuationsEntry("viewResources", $this->basecdata);
			$h .= "<INPUT type=radio name=continuation value=\"$cont\" checked ";
			$h .= "id=\"{$this->restype}edit\"><label for=\"{$this->restype}edit\">";
			$h .= i("Edit {$this->restypename} Profiles") . "</label><br>\n";
			$showsubmit = 1;
		}

		if(($resAdminCnt && $resGroupCnt) || ($resMapCnt && $maptypeMapCnt)) {
			if($this->hasmapping)
				$label = i("Edit Grouping &amp; Mapping");
			else
				$label = i("Edit Grouping");
			$cont = addContinuationsEntry("groupMapHTML", $this->basecdata);
			$h .= "<INPUT type=radio name=continuation value=\"$cont\" id=\"";
			$h .= "resgroupmap\"><label for=\"resgroupmap\">$label</label><br>\n";
			$showsubmit = 1;
		}

		if($resAdminCnt)
			$h .= $this->extraSelectAdminOptions();

		if($showsubmit)
			$h .= "<br><INPUT type=submit value=" . i("Submit") . ">\n";
		else
			$h .= i("You don't have access to manage any {$this->restype}s.") . "<br>\n";
		$h .= "</FORM>\n";

		return $h;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn viewResources()
	///
	/// \brief prints a page to view resource information
	///
	/////////////////////////////////////////////////////////////////////////////
	function viewResources() {
		global $user, $mode;
		$h = '';
		$h .= "<h2>" . i("{$this->restypename} Profiles") . "</h2>\n";

		$resdata = $this->getData($this->defaultGetDataArgs);
		if(! empty($resdata)) {
			$tmp = array_keys($resdata);
			$testid = $tmp[0];
			$fields = array_keys($resdata[$testid]);
		}

		# hidden elements
		$cdata = $this->basecdata;
		$cdata['add'] = 1;
		$cont = addContinuationsEntry('AJsaveResource', $cdata);
		$h .= "<input type=\"hidden\" id=\"addresourcecont\" value=\"$cont\">\n";
		if(! empty($resdata)) {
			$h .= "<input type=\"hidden\" id=\"saveresourcecont\">\n";
			$cont = addContinuationsEntry('AJeditResource', $this->basecdata);
			$h .= "<input type=\"hidden\" id=\"editresourcecont\" value=\"$cont\">\n";
			if($this->deletable) {
				$cont = addContinuationsEntry('AJpromptToggleDeleteResource', $this->basecdata);
				$h .= "<input type=\"hidden\" id=\"deleteresourcecont\" value=\"$cont\">\n";
			}
			$cont = addContinuationsEntry('jsonResourceStore', $this->basecdata);
			$h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\" url=\"" . BASEURL;
			$h .= SCRIPT . "?continuation=$cont\" jsid=\"resourcestore\" ";
			$h .= "comparatorMap=\"\{\}\"></div>\n";
			/*$h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\"\n";
			$h .= "data=\"{'identifier':'id', 'label':'name', 'items':[]}\" \n";
			$h .= "jsid=\"affiliationstore\"></div>\n";
			$h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\"\n";
			$h .= "data=\"{'identifier':'id', 'label':'name', 'items':[]}\" \n";
			$h .= "jsid=\"ownerstore\"></div>\n";
			$h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\"\n";
			$h .= "data=\"{'identifier':'id', 'label':'name', 'items':[]}\" \n";
			$h .= "jsid=\"editgroupstore\"></div>\n";*/
		}

		if($this->addable)
			$h .= dijitButton('', i("Add New {$this->restypename}"), "addNewResource('" . i("Add {$this->restypename}") . "');");

		if(empty($resdata)) {
			$h .= "<br><br>(" . i("No {$this->restypename}s found to which you have access.") . ")\n";
			$cont = addContinuationsEntry("viewResources", $this->basecdata);
			$url = BASEURL . SCRIPT . "?continuation=$cont";
			$h .= "<input type=\"hidden\" id=\"reloadpageurl\" value=\"$url\">\n";
		}

		$h .= $this->addEditDialogHTML(0);

		if(empty($resdata)) {
			print $h;
			return;
		}

		$selfields = array();
		if(array_key_exists("{$this->restype}selfields", $_COOKIE)) {
			$tmp = explode('|', $_COOKIE["{$this->restype}selfields"]);
			foreach($tmp as $pair) {
				$pair = explode(':', $pair);
				if(count($pair) != 2)
					continue;
				$field = $pair[0];
				$val = $pair[1];
				if(preg_match('/^[a-zA-Z0-9]+$/', $field) && ($val == 0 || $val == 1))
					$selfields[$field] = $val;
			}
		}

		# filters
		$h .= "<div dojoType=\"dijit.TitlePane\" title=\"" . i("Filters (click to expand)") . "\" ";
		$h .= "open=\"false\">\n";
		$h .= "<span id=\"namefilter\">\n";
		$h .= "<strong>" . i("Name") . "</strong>:\n";
		$h .= "<div dojoType=\"dijit.form.TextBox\" id=\"namefilter\" length=\"80\">";
		$h .= "  <script type=\"dojo/connect\" event=\"onKeyUp\" args=\"event\">\n";
		$h .= "    if(event.keyCode == 13) resource.GridFilter();\n";
		$h .= "  </script>\n";
		$h .= "</div>\n";

		$h .= dijitButton('', i("Apply Name Filter"), "resource.GridFilter();");
		$h .= "<br>\n";

		$h .= "</span>\n"; # namefilter
		$h .= "<strong>" . i("Displayed Fields") . "</strong>:<br>\n";
		$h .= $this->addDisplayCheckboxes($fields, $resdata[$testid], $selfields);
		if($this->deletetoggled) {
			$h .= "<label for=\"showdeleted\"><strong>";
			$h .= i("Include Deleted {$this->restypename}s:");
			$h .= "</strong></label>\n";
			$h .= "<input type=\"checkbox\" dojoType=\"dijit.form.CheckBox\" ";
			$h .= "id=\"showdeleted\" onChange=\"resource.GridFilter();\">\n";
		}
		$h .= "</div>\n";

		$h .= $this->extraResourceFilters();

		$h .= "<div id=\"gridcontainer\">\n";
		$h .= "<table dojoType=\"dojox.grid.DataGrid\" jsId=\"resourcegrid\" ";
		$h .= "sortInfo=3 store=\"resourcestore\" autoWidth=\"true\" style=\"";
		if($this->deletetoggled)
			$h .= "height: 580px;\" query=\"{deleted: '0'}\">\n";
		else
			$h .= "height: 580px;\">\n";
		$h .= "<thead>\n";
		$h .= "<tr>\n";
		if(preg_match('/MSIE/i', $_SERVER['HTTP_USER_AGENT']) ||
		   preg_match('/Trident/i', $_SERVER['HTTP_USER_AGENT']) ||
		   preg_match('/Edge/i', $_SERVER['HTTP_USER_AGENT']))
			$w = array('64px', '43px', '200px');
		else
			$w = array('5em', '3.5em', '17em');
		$h .= "<th field=\"id\" id=\"delcolth\" width=\"{$w[0]}\" formatter=\"resource.DeleteBtn\" styles=\"text-align: center;\">&nbsp;</th>\n";
		$h .= "<th field=\"id\" width=\"{$w[1]}\" formatter=\"resource.EditBtn\" styles=\"text-align: center;\">&nbsp;</th>\n";
		$h .= "<th field=\"name\" width=\"{$w[2]}\">" . i("Name") . "</th>\n";
		if(! array_key_exists('owner', $selfields))
			$selfields['owner'] = 1;
		foreach($fields as $field)
			$names[$field] = $this->fieldDisplayName($field);
		uasort($names, 'sortKeepIndex');
		foreach($names as $field => $name) {
			if($field == $this->namefield ||
			   $field == 'name' ||
			   is_array($resdata[$testid][$field]) ||
			   preg_match('/id$/', $field))
				continue;
			$w = $this->fieldWidth($field);
			if(array_key_exists($field, $selfields) && $selfields[$field])
				$h .= "<th field=\"$field\" $w formatter=\"resource.colformatter\">";
			else
				$h .= "<th field=\"$field\" $w hidden=\"true\" formatter=\"resource.colformatter\">";
			$h .= "$name</th>\n";
		}
		$h .= "</tr>\n";
		$h .= "</thead>\n";
		$h .= "</table>\n";
		$h .= "</div>\n";

		if($this->deletable) {
			# toggle delete dialog
			$h .= "<div id=\"toggleDeleteDialog\" dojoType=\"dijit.Dialog\">\n";
			$h .= "<h2 id=\"toggleDeleteHeading\"></h2>\n";
			$h .= "<span id=\"toggleDeleteQuestion\"></span><br>\n";
			$h .= "<div id=\"confdelrescontent\"></div>\n";
			$h .= dijitButton('toggleDeleteBtn', i("Delete {$this->restypename}"), "submitToggleDeleteResource();");
			$h .= dijitButton('', i("Cancel"), "clearHideConfirmDelete();");
			$h .= "<input type=hidden id=\"submitdeletecont\">\n";
			$h .= "</div>\n";
		}

		print $h;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn addDisplayCheckboxes($allfields, $sample, $selfields)
	///
	/// \param $allfields - array of fields for which to generate checkboxes
	/// \param $sample - sample data item that is used to determine what fields
	/// to use for generating checkboxes
	/// \param $selfields - array of fields that should be selected
	///
	/// \return html
	///
	/// \brief generates checkboxes to be used as filters on the viewResources
	/// page
	///
	/////////////////////////////////////////////////////////////////////////////
	function addDisplayCheckboxes($allfields, $sample, $selfields) {
		$fields = array('owner');
		$names = array('owner' => $this->fieldDisplayName('owner'));
		foreach($allfields as $field) {
			if($field == $this->namefield ||
			   $field == 'name' ||
			   $field == 'owner' ||
			   is_array($sample[$field]) ||
			   preg_match('/id$/', $field))
				continue;
			$fields[] = $field;
			$names[$field] = $this->fieldDisplayName($field);
		}
		uasort($names, 'sortKeepIndex');
		$h = '';
		$fieldcnt = count($fields);
		$cols = $fieldcnt / 4;
		if($cols > 4)
			$cols = 4;
		if($fieldcnt < 6) {
			foreach($names as $field => $name) {
				if($field == 'owner' && (! array_key_exists('owner', $selfields) || $selfields['owner']))
					$h .= "<input type=checkbox id=chk$field checked onClick=\"resource.toggleResFieldDisplay(this, '$field')\">";
				elseif($field == 'name' || (array_key_exists($field, $selfields) && $selfields[$field]))
					$h .= "<input type=checkbox id=chk$field checked onClick=\"resource.toggleResFieldDisplay(this, '$field')\">";
				else
					$h .= "<input type=checkbox id=chk$field onClick=\"resource.toggleResFieldDisplay(this, '$field')\">";
				$h .= "<label for=chk$field>$name</label><br>\n";
			}
		}
		else {
			$h .= "<table>\n";
			$cnt = 0;
			foreach($names as $field => $name) {
				$mod = $cols;
				if($cnt % $mod == 0)
					$h .= "<tr>\n";
				if($field == 'owner' && (! array_key_exists('owner', $selfields) || $selfields['owner']))
					$h .= "  <td><input type=checkbox id=chk$field checked onClick=\"resource.toggleResFieldDisplay(this, '$field')\">";
				elseif($field == 'name' || (array_key_exists($field, $selfields) && $selfields[$field]))
					$h .= "  <td><input type=checkbox id=chk$field checked onClick=\"resource.toggleResFieldDisplay(this, '$field')\">";
				else
					$h .= "  <td><input type=checkbox id=chk$field onClick=\"resource.toggleResFieldDisplay(this, '$field')\">";
				$h .= "<label for=chk$field>$name</label><br></td>\n";
				$cnt++;
				if($cnt % $mod == 0)
					$h .= "</tr>\n";
			}
			if($cnt % $mod != 0)
				$h .= "</tr>\n";
			$h .= "</table>\n";
		}
		return $h;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn fieldWidth($field)
	///
	/// \param $field - name of a resource field
	///
	/// \return string for setting width of field (includes width= part)
	///
	/// \brief generates the required width for the field; can return an empty
	/// string if field should default to auto width
	///
	/////////////////////////////////////////////////////////////////////////////
	function fieldWidth($field) {
		switch($field) {
			case 'owner':
				$w = 12;
				break;
			default:
				return '';
		}
		if(preg_match('/MSIE/i', $_SERVER['HTTP_USER_AGENT']) ||
		   preg_match('/Trident/i', $_SERVER['HTTP_USER_AGENT']) ||
		   preg_match('/Edge/i', $_SERVER['HTTP_USER_AGENT']))
			$w = round($w * 11.5) . 'px';
		else
			$w = "{$w}em";
		return "width=\"$w\"";
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn fieldDisplayName($field)
	///
	/// \param $field - name of a resource field
	///
	/// \return display value for $field
	///
	/// \brief generates the display value for $field; this base function just
	/// uppercases the first letter; each inheriting class should create its own
	/// function
	///
	/////////////////////////////////////////////////////////////////////////////
	function fieldDisplayName($field) {
		return ucfirst($field);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn extraResourceFilters()
	///
	/// \return empty string
	///
	/// \brief base function; allows inheriting classes to generate additional
	/// filters to be displayed on the viewResources page
	///
	/////////////////////////////////////////////////////////////////////////////
	function extraResourceFilters() {
		return '';
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn jsonResourceStore()
	///
	/// \brief generates and sends a JSON formatted store of resource data
	///
	/////////////////////////////////////////////////////////////////////////////
	function jsonResourceStore() {
		global $user;
		$args = $this->defaultGetDataArgs;
		$args['includedeleted'] = 1;
		$resdata = $this->getData($args);
		$resources = getUserResources(array($this->restype . "Admin"), array("administer"), 0, 1);
		foreach($resources as $type => $tmp) {
			if($type != $this->restype)
				unset($resources[$type]);
		}


		// this method may include fields for some records but not others
		/*$items = array();
		foreach($resdata as $id => $res) {
			if(! array_key_exists($id, $resources[$this->restype]))
				continue;
			$g = array('id' => $id);
			$g['name'] = $res[$this->namefield];
			$g['owner'] = $res['owner'];
			foreach($res as $key => $val) {
				if($key == 'name' ||
				   $key == 'owner' ||
				   $key == $this->namefield ||
				   is_array($val) ||
				   preg_match('/id$/', $key))
					continue;
				$g[$key] = $val;
			}
			$items[] = $g;
		}
		return $items;*/



		// this method only includes keys that exist in the first element
		reset($resdata);
		$id = key($resdata);
		$fields = array_keys($resdata[$id]);
		$items = array();
		foreach($resdata as $id => $res) {
			if(! array_key_exists($id, $resources[$this->restype]))
				continue;
			$item = array('id' => $id);
			$item['name'] = $res[$this->namefield];
			$item['owner'] = $res['owner'];
			foreach($fields as $field) {
				if($field == 'name' ||
				   $field == 'owner' ||
				   $field == $this->namefield ||
				   ! array_key_exists($field, $res) ||
				   is_array($res[$field]) ||
				   preg_match('/id$/', $field))
					continue;
				$item[$field] = $res[$field];
			}
			$items[] = $item;
			unset($resdata[$id]);
		}
		sendJSON($items, 'id');
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn toggleDeleteResource($rscid)
	///
	/// \param $rscid - id of a resource (from table specific to that resource,
	/// not from the resource table)
	///
	/// \return 1 on success, 0 on failure
	///
	/// \brief if resource type allows resources to be flagged as deleted;
	/// toggles the deleted flag; otherwise deletes the entry from that resources
	/// table and the general resource table
	///
	/////////////////////////////////////////////////////////////////////////////
	function toggleDeleteResource($rscid) {
		if($this->deletetoggled) {
			$query = "SELECT deleted "
			       . "FROM `{$this->restype}` "
			       . "WHERE id = $rscid";
			$qh = doQuery($query);
			if($row = mysqli_fetch_assoc($qh)) {
				$newval = (int)(! (int)$row['deleted']);
				$query = "UPDATE {$this->restype} "
				       . "SET deleted = $newval "
				       . "WHERE id = $rscid";
				doQuery($query);
				$this->submitToggleDeleteResourceExtra($rscid, $row['deleted']);
			}
			else
				return 0;
		}
		else {
			$this->submitToggleDeleteResourceExtra($rscid);

			$query = "DELETE r "
			       . "FROM resource r, "
			       .      "resourcetype rt "
			       . "WHERE r.resourcetypeid = rt.id AND "
			       .       "rt.name = '{$this->restype}' AND "
			       .       "r.subid = $rscid";
			doQuery($query);
			$query = "DELETE FROM `{$this->restype}` "
			       . "WHERE id = $rscid";
			doQuery($query);
		}

		# clear user resource cache for this type
		$key = getKey(array(array($this->restype . "Admin"), array("administer"), 0, 1, 0, 0));
		unset($_SESSION['userresources'][$key]);
		$key = getKey(array(array($this->restype . "Admin"), array("administer"), 0, 0, 0, 0));
		unset($_SESSION['userresources'][$key]);

		return 1;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn AJpromptToggleDeleteResource()
	///
	/// \brief generates and sends content prompting user to confirm deletion of
	/// resource
	///
	/////////////////////////////////////////////////////////////////////////////
	function AJpromptToggleDeleteResource() {
		$rscid = processInputVar('rscid', ARG_NUMERIC);
		# check access to $rscid
		$resources = getUserResources(array("{$this->restype}Admin"), array("administer"), 0, 1);
		if(! array_key_exists($rscid, $resources[$this->restype])) {
			$type = strtolower($this->restypename);
			$rt = array('status' => 'noaccess',
			            'msg' => i("You do not have access to delete the selected $type."),
			            'rscid' => $rscid);
			sendJSON($rt);
			return;
		}
		# check usage of resource
		$msg = $this->checkResourceInUse($rscid);
		if($msg != '') {
			$rt = array('status' => 'inuse',
			            'msg' => $msg,
			            'rscid' => $rscid);
			sendJSON($rt);
			return;
		}
		$rt = array('title' => i("Confirm Delete {$this->restypename}"),
		            'question' => i("Delete the following {$this->restype}?"),
		            'btntxt' => i("Delete {$this->restypename}"),
		            'status' => 'success');
		$args = $this->defaultGetDataArgs;
		if($this->deletetoggled)
			$args['includedeleted'] = 1;
		$args['rscid'] = $rscid;
		$resdata = $this->getData($args);
		if($this->deletetoggled && $resdata[$rscid]['deleted']) {
			$rt['title'] = i("Confirm Undelete {$this->restypename}");
			$rt['question'] = i("Undelete the following {$this->restype}?");
			$rt['btntxt'] = i("Undelete {$this->restypename}");
		}
		$fields = array_keys($resdata[$rscid]);
		$rt['fields'] = array();
		$rt['fields'][] = array('field' => 'name',
		                        'name' => i('Name'),
		                        'value' => $resdata[$rscid][$this->namefield]);
		$rt['fields'][] = array('field' => 'owner',
		                        'name' => i('Owner'),
		                        'value' => $resdata[$rscid]['owner']);
		foreach($fields as $field) {
			if($field == $this->namefield ||
			   $field == 'name' ||
			   $field == 'owner' ||
			   is_array($resdata[$rscid][$field]) ||
			   preg_match('/id$/', $field))
				continue;
			$rt['fields'][] = array('field' => $field,
			                        'name' => $this->fieldDisplayName($field),
			                        'value' => $resdata[$rscid][$field]);
		}
		$rt['html'] = $this->toggleDeleteResourceExtra();

		$cdata = getContinuationVar();
		$cdata['rscid'] = $rscid;
		$cont = addContinuationsEntry('AJsubmitToggleDeleteResource', $cdata);
		$rt['cont'] = $cont;
		sendJSON($rt);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn toggleDeleteResourceExtra()
	///
	/// \return empty string
	///
	/// \brief allows inheriting class to generate additional information to be
	/// included on the confirm toggle delete resource page
	///
	/////////////////////////////////////////////////////////////////////////////
	function toggleDeleteResourceExtra() {
		return '';
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn AJsubmitToggleDeleteResource()
	///
	/// \brief AJAX callable wrapper for toggleDeleteResource
	///
	/////////////////////////////////////////////////////////////////////////////
	function AJsubmitToggleDeleteResource() {
		$rscid = getContinuationVar('rscid');
		if($this->toggleDeleteResource($rscid))
			$rt = array('status' => 'success', 'rscid' => $rscid);
		else
			$rt = array('status' => 'failed', 'rscid' => $rscid);
		sendJSON($rt);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn submitToggleDeleteResourceExtra($rscid, $deleted)
	///
	/// \param $rscid - id of a resource (from table specific to that resource,
	/// not from the resource table)
	/// \param $deleted - (optional, default=0) 1 if resource was previously
	/// deleted; 0 if not
	///
	/// \brief function to do any extra stuff specific to a resource type when
	/// toggling delete for a resource; to be implemented by inheriting class if
	/// needed
	///
	/////////////////////////////////////////////////////////////////////////////
	function submitToggleDeleteResourceExtra($rscid, $deleted=0) {
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn groupMapHTML()
	///
	/// \brief prints HTML for groupping and mapping page
	///
	/////////////////////////////////////////////////////////////////////////////
	function groupMapHTML() {
		$h = '';
		$h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\" jsId=\"resourcetogroupsstore\" ";
		$h .= "data=\"resourcetogroupsdata\"></div>\n";
		$h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\" jsId=\"grouptoresourcesstore\" ";
		$h .= "data=\"grouptoresourcesdata\"></div>\n";
		$h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\" jsId=\"mapbyresgroupstore\" ";
		$h .= "data=\"mapbyresgroupdata\"></div>\n";
		$h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\" jsId=\"mapbymaptogroupstore\" ";
		$h .= "data=\"mapbymaptogroupdata\"></div>\n";
		$h .= "<div id=\"mainTabContainer\" dojoType=\"dijit.layout.TabContainer\"\n";
		$h .= "     style=\"width:600px;height:600px\">\n";
		$h .= $this->groupByResourceHTML();
		$h .= $this->groupByGroupHTML();
		if($this->hasmapping) {
			$h .= "<input type=\"hidden\" id=\"domapping\" value=\"1\">\n";
			$h .= $this->mapByResGroupHTML();
			$h .= $this->mapByMapToGroupHTML();
		}
		else
			$h .= "<input type=\"hidden\" id=\"domapping\" value=\"0\">\n";
		$h .= "</div>\n";
		print $h;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn groupByResourceHTML()
	///
	/// \return html
	///
	/// \brief generates HTML for resource grouping by selecting a resource
	///
	/////////////////////////////////////////////////////////////////////////////
	function groupByResourceHTML() {
		# build list of resources
		$tmp = getUserResources(array($this->restype . "Admin"), array('manageGroup'));
		if(empty($tmp[$this->restype]))
			return '';
		$resources = $tmp[$this->restype];
		uasort($resources, 'sortKeepIndex');
		$h = '';
		$h .= "<div id=\"groupbyresourcediv\" dojoType=\"dijit.layout.ContentPane\" ";
		$h .= "title=\"" . i("Group By {$this->restypename}") . "\">\n";
		$h .= "<div id=\"groupbyresourcedesc\">\n";
		$h .= "<div style=\"width: 400px;\">\n";
		$h .= i("Select an item from the drop-down box and click \"Get Groups\" to see all of the groups it is in. Then, select a group it is in and click the Remove button to remove it from that group, or select a group it is not in and click the Add button to add it to that group.");
		$h .= "</div><br>\n";
		$h .= "</div>\n"; # groupbyresourcedesc
		$h .= "<div id=\"groupbyresourcesel\">\n";
		$h .= i($this->restypename) . ":<select id=\"resources\">\n";
		foreach($resources as $id => $res)
			$h .= "<option value=$id>$res</option>\n";
		$h .= "</select>\n";
		$h .= dijitButton('fetchGrpsButton', i("Get Groups"),
			               "populateLists('resources', 'ingroups', 'inresourcename', 'outresourcename', 'resgroupinggroupscont');");
		$h .= "</div>\n"; # groupbyresourcesel
		$h .= "<table><tbody><tr>\n";
		# select for groups resource is in
		$h .= "<td valign=top>\n";
		$h .= sprintf(i("Groups %s is in:"), "<span style=\"font-weight: bold;\" id=\"inresourcename\"></span>");
		$h .= "<br>\n";
		$h .= "<table dojoType=\"dojox.grid.DataGrid\" jsId=\"ingroups\" ";
		$h .= "store=\"resourcetogroupsstore\" style=\"width: 240px; height: 250px;\" query=\"{inout: 1}\" ";
		$h .= "selectionMode=\"extended\">\n";
		$h .= "<thead>\n";
		$h .= "<tr>\n";
		$h .= "<th field=\"name\" width=\"160px\"></th>\n";
		$h .= "</tr>\n";
		$h .= "</thead>\n";
		$h .= "</table>\n";
		$h .= "</td>\n";
		# transfer buttons
		$h .= "<td style=\"vertical-align: middle;\">\n";
		$h .= dijitButton('', "<div style=\"width: 60px;\">&lt;-" . i("Add") . "</div>",
		                  "resource.addRemItem('addgrpcont', 'resources', 'outgroups');");
		$cdata = $this->basecdata;
		$cdata['mode'] = 'add';
		$cont = addContinuationsEntry('AJaddRemGroupResource', $cdata);
		$h .= "<input type=\"hidden\" id=\"addgrpcont\" value=\"$cont\">\n";
		$h .= "<br><br><br>\n";
		$h .= dijitButton('', "<div style=\"width: 60px;\">" . i("Remove") . "-&gt;</div>",
		                  "resource.addRemItem('remgrpcont', 'resources', 'ingroups');");
		$cdata['mode'] = 'remove';
		$cont = addContinuationsEntry('AJaddRemGroupResource', $cdata);
		$h .= "<input type=\"hidden\" id=\"remgrpcont\" value=\"$cont\">\n";
		$h .= "</td>\n";
		# select for groups resource is not in
		$h .= "<td valign=top>\n";
		$h .= sprintf(i("Groups %s is not in:"), "<span style=\"font-weight: bold;\" id=\"outresourcename\"></span>");
		$h .= "<br>\n";
		$h .= "<table dojoType=\"dojox.grid.DataGrid\" jsId=\"outgroups\" ";
		$h .= "store=\"resourcetogroupsstore\" style=\"width: 240px; height: 250px;\" query=\"{inout: 1}\" ";
		$h .= "selectionMode=\"extended\">\n";
		$h .= "<thead>\n";
		$h .= "<tr>\n";
		$h .= "<th field=\"name\" width=\"160px\"></th>\n";
		$h .= "</tr>\n";
		$h .= "</thead>\n";
		$h .= "</table>\n";
		$h .= "</td>\n";
		$h .= "</tr></tbody></table>\n";
		$cdata = $this->basecdata;
		$cdata['store'] = 'resourcetogroupsstore';
		$cdata['intitle'] = 'ingroups';
		$cdata['outtitle'] = 'outgroups';
		$cont = addContinuationsEntry('jsonResourceGroupingGroups', $cdata);
		$h .= "<input type=hidden id=\"resgroupinggroupscont\" value=\"$cont\">\n";
		$h .= "</div>\n";
		return $h;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn jsonResourceGroupingGroups()
	///
	/// \brief sends JSON of resource groups for resource grouping by selecting a
	/// resource page
	///
	/////////////////////////////////////////////////////////////////////////////
	function jsonResourceGroupingGroups() {
		$resid = processInputVar('id', ARG_NUMERIC);
		$resources = getUserResources(array($this->restype . "Admin"), array("manageGroup"));
		if(! array_key_exists($resid, $resources[$this->restype])) {
			sendJSON(array('status' => 'noaccess'));
			return;
		}
		$groups = getUserResources(array($this->restype . 'Admin'), array('manageGroup'), 1);
		$memberships = getResourceGroupMemberships($this->restype);
		$all = array();
		foreach($groups[$this->restype] as $id => $group) {
			if(array_key_exists($resid, $memberships[$this->restype]) &&
				in_array($id, $memberships[$this->restype][$resid]))
				$all[] = array('id' => $id, 'name' => $group, 'inout' => 1);
			else
				$all[] = array('id' => $id, 'name' => $group, 'inout' => 0);
		}
		$arr = array('items' => $all,
		             'intitle' => getContinuationVar('intitle'),
		             'outtitle' => getContinuationVar('outtitle'));
		sendJSON($arr);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn AJaddRemGroupResource()
	///
	/// \brief adds or removes groups for a resource and sends JSON response
	///
	/////////////////////////////////////////////////////////////////////////////
	function AJaddRemGroupResource() {
		$rscid = processInputVar('id', ARG_NUMERIC);
		$resources = getUserResources(array($this->restype . "Admin"), array("manageGroup"));
		if(! array_key_exists($rscid, $resources[$this->restype])) {
			$arr = array('status' => 'noaccess');
			sendJSON($arr);
			return;
		}

		$groups = getUserResources(array($this->restype . "Admin"), array("manageGroup"), 1);
		$tmp = processInputVar('listids', ARG_STRING);
		$tmp = explode(',', $tmp);
		$groupids = array();
		foreach($tmp as $id) {
			if(! is_numeric($id))
				continue;
			if(! array_key_exists($id, $groups[$this->restype])) {
				$arr = array('status' => 'noaccess');
				sendJSON($arr);
				return;
			}
			$groupids[] = $id;
		}

		$mode = getContinuationVar('mode');

		$args = $this->defaultGetDataArgs;
		$args['rscid'] = $rscid;
		$resdata = $this->getData($args);

		if($mode == 'add') {
			$adds = array();
			foreach($groupids as $id)
				$adds[] = "({$resdata[$rscid]['resourceid']}, $id)";
			$query = "INSERT IGNORE INTO resourcegroupmembers "
					 . "(resourceid, resourcegroupid) VALUES ";
			$query .= implode(',', $adds);
			doQuery($query);
		}
		else {
			$rems = implode(',', $groupids);
			$query = "DELETE FROM resourcegroupmembers "
					 . "WHERE resourceid = {$resdata[$rscid]['resourceid']} AND "
					 .       "resourcegroupid IN ($rems)";
			doQuery($query);
		}

		$_SESSION['userresources'] = array();
		$regids = "^" . implode('$|^', $groupids) . "$";
		$arr = array('status' => 'success',
		             'regids' => $regids,
		             'inselobj' => 'ingroups',
		             'outselobj' => 'outgroups');
		sendJSON($arr);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn groupByGroupHTML()
	///
	/// \return html
	///
	/// \brief generates HTML for resource grouping by selecting a resource group
	///
	/////////////////////////////////////////////////////////////////////////////
	function groupByGroupHTML() {
		$resources = getUserResources(array($this->restype . 'Admin'), array('manageGroup'));
		if(empty($resources[$this->restype]))
			return '';
		$h = '';
		$h .= "<div id=\"groupbygroupdiv\" dojoType=\"dijit.layout.ContentPane\" ";
		$h .= "title=\"" . i("Group By Group") . "\">\n";
		$h .= "<div style=\"width: 420px;\">\n";
		$h .= i("Select a group from the drop-down box and click \"Get {$this->restypename}s\" to see all of the resources in it. Then, select a resource in it and click the Remove button to remove it from that group, or select a resource that is not in it and click the Add button to add it to that group.");
		$h .= "</div><br>\n";
		$h .= i("Group:") . "<select id=\"resgroups\">\n";
		# build list of groups
		$tmp = getUserResources(array($this->restype . "Admin"), array('manageGroup'), 1);
		$groups = $tmp[$this->restype];
		uasort($groups, 'sortKeepIndex');
		foreach($groups as $id => $group)
			$h .= "<option value=$id>$group</option>\n";
		$h .= "</select>\n";
		$h .= dijitButton('fetchResourcesButton', "Get {$this->restypename}s",
		                  "populateLists('resgroups', 'inresources', 'ingroupname', 'outgroupname', 'resgroupingresourcescont');");
		$h .= "<table><tbody><tr>\n";
		# select for resources in group
		$h .= "<td valign=top>\n";
		$h .= sprintf(i("{$this->restypename}s in %s:"), "<span style=\"font-weight: bold;\" id=\"ingroupname\"></span>");
		$h .= "<br>\n";
		$h .= "<table dojoType=\"dojox.grid.DataGrid\" jsId=\"inresources\" ";
		$h .= "store=\"grouptoresourcesstore\" style=\"width: 240px; height: 250px;\" query=\"{inout: 1}\" ";
		$h .= "selectionMode=\"extended\" sortInfo=\"1\">\n";
		$h .= "<thead>\n";
		$h .= "<tr>\n";
		$h .= "<th field=\"name\" width=\"160px\"></th>\n";
		$h .= "</tr>\n";
		$h .= "</thead>\n";
		$h .= "</table>\n";
		$h .= "</td>\n";
		# transfer buttons
		$h .= "<td style=\"vertical-align: middle;\">\n";
		$h .= dijitButton('', "<div style=\"width: 60px;\">&lt;-" . i("Add") . "</div>",
		                  "resource.addRemItem('additemcont', 'resgroups', 'outresources');");
		$cdata = $this->basecdata;
		$cdata['mode'] = 'add';
		$cont = addContinuationsEntry('AJaddRemResourceGroup', $cdata);
		$h .= "<input type=\"hidden\" id=\"additemcont\" value=\"$cont\">\n";
		$h .= "<br><br><br>\n";
		$h .= dijitButton('', "<div style=\"width: 60px;\">" . i("Remove") . "-&gt;</div>",
		                  "resource.addRemItem('remitemcont', 'resgroups', 'inresources');");
		$cdata['mode'] = 'remove';
		$cont = addContinuationsEntry('AJaddRemResourceGroup', $cdata);
		$h .= "<input type=\"hidden\" id=\"remitemcont\" value=\"$cont\">\n";
		$h .= "</td>\n";
		# select for groups resource is not in
		$h .= "<td valign=top>\n";
		$h .= sprintf(i("{$this->restypename}s not in %s:"), "<span style=\"font-weight: bold;\" id=\"outgroupname\"></span>");
		$h .= "<br>\n";
		$h .= "<table dojoType=\"dojox.grid.DataGrid\" jsId=\"outresources\" ";
		$h .= "store=\"grouptoresourcesstore\" style=\"width: 240px; height: 250px;\" query=\"{inout: 1}\" ";
		$h .= "selectionMode=\"extended\" sortInfo=\"1\">\n";
		$h .= "<thead>\n";
		$h .= "<tr>\n";
		$h .= "<th field=\"name\" width=\"160px\"></th>\n";
		$h .= "</tr>\n";
		$h .= "</thead>\n";
		$h .= "</table>\n";
		$h .= "</td>\n";
		$h .= "</tr></tbody></table>\n";
		$cdata = $this->basecdata;
		$cdata['store'] = 'grouptoresourcesstore';
		$cdata['intitle'] = 'inresources';
		$cdata['outtitle'] = 'outresources';
		$cont = addContinuationsEntry('jsonResourceGroupingResources', $cdata);
		$h .= "<input type=hidden id=\"resgroupingresourcescont\" value=\"$cont\">\n";
		$h .= "</div>\n";
		return $h;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn jsonResourceGroupingResources()
	///
	/// \brief sends JSON of resources for resource grouping by selecting a
	/// resource group
	///
	/////////////////////////////////////////////////////////////////////////////
	function jsonResourceGroupingResources() {
		$groupid = processInputVar('id', ARG_NUMERIC);
		$groups = getUserResources(array($this->restype . "Admin"), array("manageGroup"), 1);
		if(! array_key_exists($groupid, $groups[$this->restype])) {
			sendJSON(array('status' => 'noaccess'));
			return;
		}
		$resources = getUserResources(array($this->restype . 'Admin'), array('manageGroup'));
		#uasort($resources[$this->restype], 'sortKeepIndex');
		$memberships = getResourceGroupMemberships($this->restype);
		$all = array();
		foreach($resources[$this->restype] as $id => $res) {
			if(array_key_exists($id, $memberships[$this->restype]) &&
				in_array($groupid, $memberships[$this->restype][$id]))
				$all[] = array('id' => $id, 'name' => $res, 'inout' => 1);
			else
				$all[] = array('id' => $id, 'name' => $res, 'inout' => 0);
		}
		$arr = array('items' => $all,
		             'intitle' => getContinuationVar('intitle'),
		             'outtitle' => getContinuationVar('outtitle'));
		sendJSON($arr);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn AJaddRemResourceGroup()
	///
	/// \brief adds or removes resources for a resource group and sends JSON
	/// response
	///
	/////////////////////////////////////////////////////////////////////////////
	function AJaddRemResourceGroup() {
		$groupid = processInputVar('id', ARG_NUMERIC);
		$groups = getUserResources(array($this->restype . "Admin"), array("manageGroup"), 1);
		if(! array_key_exists($groupid, $groups[$this->restype])) {
			$arr = array('status' => 'noaccess');
			sendJSON($arr);
			return;
		}

		$resources = getUserResources(array($this->restype . "Admin"), array("manageGroup"));
		$tmp = processInputVar('listids', ARG_STRING);
		$tmp = explode(',', $tmp);
		$rscids = array();
		foreach($tmp as $id) {
			if(! is_numeric($id))
				continue;
			if(! array_key_exists($id, $resources[$this->restype])) {
				$arr = array('status' => 'noaccess');
				sendJSON($arr);
				return;
			}
			$rscids[] = $id;
		}

		$mode = getContinuationVar('mode');

		$resdata = $this->getData($this->defaultGetDataArgs);

		if($mode == 'add') {
			$adds = array();
			foreach($rscids as $id)
				$adds[] = "({$resdata[$id]['resourceid']}, $groupid)";
			$query = "INSERT IGNORE INTO resourcegroupmembers "
					 . "(resourceid, resourcegroupid) VALUES ";
			$query .= implode(',', $adds);
		}
		else {
			$delids = array();
			foreach($rscids as $id)
				$delids[] = $resdata[$id]['resourceid'];
			$inlist = implode(',', $delids);
			$query = "DELETE FROM resourcegroupmembers "
					 . "WHERE resourcegroupid = $groupid AND "
					 .       "resourceid IN ($inlist)";
			doQuery($query);
		}

		doQuery($query);
		$_SESSION['userresources'] = array();
		$regids = "^" . implode('$|^', $rscids) . "$";
		$arr = array('status' => 'success',
		             'regids' => $regids,
		             'inselobj' => 'inresources',
		             'outselobj' => 'outresources');
		sendJSON($arr);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn 
	///
	/// \brief Resource
	///
	/////////////////////////////////////////////////////////////////////////////
	function groupByGridHTML() {
		# TODO
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn mapByResGroupHTML()
	///
	/// \return html
	///
	/// \brief generates HTML for resource mapping by selecting a resource group
	/// of this type of resource
	///
	/////////////////////////////////////////////////////////////////////////////
	function mapByResGroupHTML() {
		$tmp = getUserResources(array($this->restype . "Admin"),
		                        array("manageMapping"), 1);
		$groups = $tmp[$this->restype];
		uasort($groups, "sortKeepIndex");
		$tmp = getUserResources(array($this->maptype . "Admin"),
		                        array("manageMapping"), 1);
		$mapgroups = $tmp[$this->maptype];
		uasort($mapgroups, "sortKeepIndex");
		$h = '';

		if(! count($groups) || ! count($mapgroups)) {
			$h .= i("You don't have access to manage any mappings for this resource type.");
			return $h;
		}

		$h .= "<div id=\"mapbyresgroupdiv\" dojoType=\"dijit.layout.ContentPane\" ";
		$h .= "title=\"" . i("Map By {$this->restypename} Group") . "\">\n";
		$h .= "<div style=\"width: 390px;\">\n";
		$h .= i("Select an item from the drop-down box and click \"Get {$this->maptypename} Groups\" to see all of the groups it maps to. Then, select a group it does not map to and click the Add button to map it to that group, or select a group it maps to and click the Remove button to unmap it from that group.");
		$h .= "</div><br>\n";
		$h .= i("{$this->restypename} Group:") . "<select id=\"groups\">\n";
		foreach($groups as $id => $group)
			$h .= "<option value=$id>$group</option>\n";
		$h .= "</select>\n";
		$h .= dijitButton('', i("Get {$this->maptypename} Groups"),
		                  "populateLists('groups', 'inmapgroups', 'inmapgroupname', 'outmapgroupname', 'mapbyresgroupcont');");
		$h .= "<table><tbody><tr>\n";
		# select for groups mapped to
		$h .= "<td valign=top>\n";
		$h .= sprintf(i("{$this->maptypename} Groups %s maps to:"), "<span style=\"font-weight: bold;\" id=\"inmapgroupname\"></span>");
		$h .= "<br>\n";
		$h .= "<table dojoType=\"dojox.grid.DataGrid\" jsId=\"inmapgroups\" ";
		$h .= "store=\"mapbyresgroupstore\" style=\"width: 240px; height: 250px;\" query=\"{inout: 1}\" ";
		$h .= "selectionMode=\"extended\">\n";
		$h .= "<thead>\n";
		$h .= "<tr>\n";
		$h .= "<th field=\"name\" width=\"160px\"></th>\n";
		$h .= "</tr>\n";
		$h .= "</thead>\n";
		$h .= "</table>\n";
		$h .= "</td>\n";
		# transfer buttons
		$h .= "<td style=\"vertical-align: middle;\">\n";
		$h .= dijitButton('', "<div style=\"width: 60px;\">&lt;-" . i("Add") . "</div>",
		                  "resource.addRemItem('addmapgrpcont', 'groups', 'outmapgroups');");
		$cdata = $this->basecdata;
		$cdata['mode'] = 'add';
		$cont = addContinuationsEntry('AJaddRemMapToGroup', $cdata);
		$h .= "<input type=\"hidden\" id=\"addmapgrpcont\" value=\"$cont\">\n";
		$h .= "<br>\n";
		$h .= "<br>\n";
		$h .= "<br>\n";
		$h .= dijitButton('', "<div style=\"width: 60px;\">" . i("Remove") . "-&gt;</div>",
		                  "resource.addRemItem('remmapgrpcont', 'groups', 'inmapgroups');");
		$cdata['mode'] = 'remove';
		$cont = addContinuationsEntry('AJaddRemMapToGroup', $cdata);
		$h .= "<input type=\"hidden\" id=\"remmapgrpcont\" value=\"$cont\">\n";
		$h .= "</td>\n";
		# select for groups resource is not in
		$h .= "<td valign=top>\n";
		$h .= sprintf(i("{$this->maptypename} Groups %s does not map to:"), "<span style=\"font-weight: bold;\" id=\"outmapgroupname\"></span>");
		$h .= "<br>\n";
		$h .= "<table dojoType=\"dojox.grid.DataGrid\" jsId=\"outmapgroups\" ";
		$h .= "store=\"mapbyresgroupstore\" style=\"width: 240px; height: 250px;\" query=\"{inout: 1}\" ";
		$h .= "selectionMode=\"extended\">\n";
		$h .= "<thead>\n";
		$h .= "<tr>\n";
		$h .= "<th field=\"name\" width=\"160px\"></th>\n";
		$h .= "</tr>\n";
		$h .= "</thead>\n";
		$h .= "</table>\n";
		$h .= "</td>\n";
		$h .= "</tr></tbody></table>\n";
		$cdata = $this->basecdata;
		$cdata['store'] = 'mapbyresgroupstore';
		$cdata['intitle'] = 'inmapgroups';
		$cdata['outtitle'] = 'outmapgroups';
		$cont = addContinuationsEntry('jsonResourceMappingMapToGroups', $cdata);
		$h .= "<input type=hidden id=\"mapbyresgroupcont\" value=\"$cont\">\n";
		$h .= "</div>\n";
		return $h;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn jsonResourceMappingMapToGroups()
	///
	/// \brief sends JSON of resource groups for resource mapping by selecting a
	/// resource group of this resource type
	///
	/////////////////////////////////////////////////////////////////////////////
	function jsonResourceMappingMapToGroups() {
		$resgrpid = processInputVar('id', ARG_NUMERIC);
		$resources = getUserResources(array($this->restype . "Admin"), array("manageMapping"), 1);
		if(! array_key_exists($resgrpid, $resources[$this->restype])) {
			sendJSON(array('status' => 'noaccess'));
			return;
		}
		$mapgroups = getUserResources(array($this->maptype . 'Admin'), array('manageMapping'), 1);
		$mapping = getResourceMapping($this->restype, $this->maptype);
		$all = array();

		foreach($mapgroups[$this->maptype] as $id => $group) {
			if(array_key_exists($resgrpid, $mapping) &&
				in_array($id, $mapping[$resgrpid]))
				$all[] = array('id' => $id, 'name' => $group, 'inout' => 1);
			else
				$all[] = array('id' => $id, 'name' => $group, 'inout' => 0);
		}
		$arr = array('items' => $all,
		             'intitle' => getContinuationVar('intitle'),
		             'outtitle' => getContinuationVar('outtitle'));
		sendJSON($arr);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn AJaddRemMapToGroup()
	///
	/// \brief adds or removes groups that map to a group of this resource type
	///
	/////////////////////////////////////////////////////////////////////////////
	function AJaddRemMapToGroup() {
		$groupid = processInputVar('id', ARG_NUMERIC);
		$groups = getUserResources(array($this->restype . "Admin"),
		                           array("manageMapping"), 1);
		if(! array_key_exists($groupid, $groups[$this->restype])) {
			$arr = array('status' => 'noaccess');
			sendJSON($arr);
			return;
		}

		$mapgroups = getUserResources(array($this->maptype . "Admin"),
		                              array("manageMapping"), 1);
		$tmp = processInputVar('listids', ARG_STRING);
		$tmp = explode(',', $tmp);
		$mapids = array();
		foreach($tmp as $id) {
			if(! is_numeric($id))
				continue;
			if(! array_key_exists($id, $mapgroups[$this->maptype])) {
				$arr = array('status' => 'noaccess');
				sendJSON($arr);
				return;
			}
			$mapids[] = $id;
		}

		$mytypeid = getResourceTypeID($this->restype);
		$maptypeid = getResourceTypeID($this->maptype);

		$mode = getContinuationVar('mode');

		if($mode == 'add') {
			$adds = array();
			foreach($mapids as $id)
				$adds[] = "($groupid, $mytypeid, $id, $maptypeid)";
			$query = "INSERT IGNORE INTO resourcemap "
					 .        "(resourcegroupid1, resourcetypeid1, "
					 .         "resourcegroupid2, resourcetypeid2) "
					 . "VALUES ";
			$query .= implode(',', $adds);
			doQuery($query);
		}
		else {
			foreach($mapids as $id) {
				$query = "DELETE FROM resourcemap "
						 . "WHERE resourcegroupid1 = $groupid AND "
						 .       "resourcetypeid1 = $mytypeid AND "
						 .       "resourcegroupid2 = $id AND "
						 .       "resourcetypeid2 = $maptypeid";
				doQuery($query);
			}
		}
		$regids = "^" . implode('$|^', $mapids) . "$";
		$arr = array('status' => 'success',
		             'regids' => $regids,
		             'inselobj' => 'inmapgroups',
		             'outselobj' => 'outmapgroups');
		sendJSON($arr);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn mapByMapToGroupHTML()
	///
	/// \return html
	///
	/// \brief generates HTML for resource mapping by selecting a resource group
	/// of the type that this type maps to
	///
	/////////////////////////////////////////////////////////////////////////////
	function mapByMapToGroupHTML() {
		$tmp = getUserResources(array($this->maptype . "Admin"),
		                        array("manageMapping"), 1);
		$mapgroups = $tmp[$this->maptype];
		uasort($mapgroups, "sortKeepIndex");
		$tmp = getUserResources(array($this->restype . "Admin"),
		                        array("manageMapping"), 1);
		$groups = $tmp[$this->restype];
		uasort($groups, "sortKeepIndex");
		$h = '';

		if(! count($mapgroups) || ! count($groups)) {
			$h .= "You don't have access to manage any mappings for this resource ";
			$h .= "type.<br>\n";
			return $h;
		}

		$h .= "<div id=\"mapbymaptogroupdiv\" dojoType=\"dijit.layout.ContentPane\" ";
		$h .= "title=\"" . i("Map By {$this->maptypename} Group") . "\">\n";
		$h .= "<div style=\"width: 410px;\">\n";
		$h .= i("Select an item from the drop-down box and click \"Get {$this->restypename} Groups\" to see all of the groups it maps to. Then, select a group it does not map to and click the Add button to map it to that group, or select a group it maps to and click the Remove button to unmap it from that group.");
		$h .= "</div><br>\n";
		$h .= i("{$this->maptypename} Group:") . "<select id=\"maptogroups\">\n";
		foreach($mapgroups as $id => $group)
			$h .= "<option value=$id>$group</option>\n";
		$h .= "</select>\n";
		$h .= dijitButton('', i("Get {$this->restypename} Groups"),
		                  "populateLists('maptogroups', 'inmaptogroups', 'inmaptogroupname', 'outmaptogroupname', 'mapbymaptogroupcont');");
		$h .= "<table><tbody><tr>\n";
		# select for groups mapped to
		$h .= "<td valign=top>\n";
		$h .= sprintf(i("{$this->restypename} Groups %s maps to:"), "<span style=\"font-weight: bold;\" id=\"inmaptogroupname\"></span>");
		$h .= "<br>\n";
		$h .= "<table dojoType=\"dojox.grid.DataGrid\" jsId=\"inmaptogroups\" ";
		$h .= "store=\"mapbymaptogroupstore\" style=\"width: 240px; height: 250px;\" query=\"{inout: 1}\" ";
		$h .= "selectionMode=\"extended\">\n";
		$h .= "<thead>\n";
		$h .= "<tr>\n";
		$h .= "<th field=\"name\" width=\"160px\"></th>\n";
		$h .= "</tr>\n";
		$h .= "</thead>\n";
		$h .= "</table>\n";
		$h .= "</td>\n";
		# transfer buttons
		$h .= "<td style=\"vertical-align: middle;\">\n";
		$h .= dijitButton('', "<div style=\"width: 60px;\">&lt;-" . i("Add") . "</div>",
		                  "resource.addRemItem('addmaptogrpcont', 'maptogroups', 'outmaptogroups');");
		$cdata = $this->basecdata;
		$cdata['mode'] = 'add';
		$cont = addContinuationsEntry('AJaddRemGroupMapTo', $cdata);
		$h .= "<input type=\"hidden\" id=\"addmaptogrpcont\" value=\"$cont\">\n";
		$h .= "<br><br><br>\n";
		$h .= dijitButton('', "<div style=\"width: 60px;\">" . i("Remove") . "-&gt;</div>",
		                  "resource.addRemItem('remmaptogrpcont', 'maptogroups', 'inmaptogroups');");
		$cdata['mode'] = 'remove';
		$cont = addContinuationsEntry('AJaddRemGroupMapTo', $cdata);
		$h .= "<input type=\"hidden\" id=\"remmaptogrpcont\" value=\"$cont\">\n";
		$h .= "</td>\n";
		# select for groups resource is not in
		$h .= "<td valign=top>\n";
		$h .= sprintf(i("{$this->restypename} Groups %s does not map to:"), "<span style=\"font-weight: bold;\" id=\"outmaptogroupname\"></span>");
		$h .= "<br>\n";
		$h .= "<table dojoType=\"dojox.grid.DataGrid\" jsId=\"outmaptogroups\" ";
		$h .= "store=\"mapbymaptogroupstore\" style=\"width: 240px; height: 250px;\" query=\"{inout: 1}\" ";
		$h .= "selectionMode=\"extended\">\n";
		$h .= "<thead>\n";
		$h .= "<tr>\n";
		$h .= "<th field=\"name\" width=\"160px\"></th>\n";
		$h .= "</tr>\n";
		$h .= "</thead>\n";
		$h .= "</table>\n";
		$h .= "</td>\n";
		$h .= "</tr></tbody></table>\n";
		$cdata = $this->basecdata;
		$cdata['store'] = 'mapbymaptogroupstore';
		$cdata['intitle'] = 'inmaptogroups';
		$cdata['outtitle'] = 'outmaptogroups';
		$cont = addContinuationsEntry('jsonResourceMappingGroups', $cdata);
		$h .= "<input type=hidden id=\"mapbymaptogroupcont\" value=\"$cont\">\n";
		$h .= "</div>\n";
		return $h;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn jsonResourceMappingGroups()
	///
	/// \brief sends JSON of resource groups for resource mapping by selecting a
	/// resource group of the type this type maps to
	///
	/////////////////////////////////////////////////////////////////////////////
	function jsonResourceMappingGroups() {
		$resmaptogrpid = processInputVar('id', ARG_NUMERIC);
		$resources = getUserResources(array($this->maptype . "Admin"), array("manageMapping"), 1);
		if(! array_key_exists($resmaptogrpid, $resources[$this->maptype])) {
			sendJSON(array('status' => 'noaccess'));
			return;
		}
		$groups = getUserResources(array($this->restype . 'Admin'), array('manageMapping'), 1);
		$mapping = getResourceMapping($this->maptype, $this->restype);
		$all = array();

		foreach($groups[$this->restype] as $id => $group) {
			if(array_key_exists($resmaptogrpid, $mapping) &&
				in_array($id, $mapping[$resmaptogrpid]))
				$all[] = array('id' => $id, 'name' => $group, 'inout' => 1);
			else
				$all[] = array('id' => $id, 'name' => $group, 'inout' => 0);
		}
		$arr = array('items' => $all,
		             'intitle' => getContinuationVar('intitle'),
		             'outtitle' => getContinuationVar('outtitle'));
		sendJSON($arr);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn AJaddRemGroupMapTo()
	///
	/// \brief adds or removes groups that map to a group of the type this
	/// resource maps to
	///
	/////////////////////////////////////////////////////////////////////////////
	function AJaddRemGroupMapTo() {
		$mapgroupid = processInputVar('id', ARG_NUMERIC);
		$mapgroups = getUserResources(array($this->maptype . "Admin"),
		                              array("manageMapping"), 1);
		if(! array_key_exists($mapgroupid, $mapgroups[$this->maptype])) {
			$arr = array('status' => 'noaccess');
			sendJSON($arr);
			return;
		}

		$groups = getUserResources(array($this->restype . "Admin"),
		                           array("manageMapping"), 1);
		$tmp = processInputVar('listids', ARG_STRING);
		$tmp = explode(',', $tmp);
		$groupids = array();
		foreach($tmp as $id) {
			if(! is_numeric($id))
				continue;
			if(! array_key_exists($id, $groups[$this->restype])) {
				$arr = array('status' => 'noaccess');
				sendJSON($arr);
				return;
			}
			$groupids[] = $id;
		}

		$mytypeid = getResourceTypeID($this->restype);
		$maptypeid = getResourceTypeID($this->maptype);

		$mode = getContinuationVar('mode');

		if($mode == 'add') {
			$adds = array();
			foreach($groupids as $id)
				$adds[] = "($id, $mytypeid, $mapgroupid, $maptypeid)";
			$query = "INSERT IGNORE INTO resourcemap "
					 .        "(resourcegroupid1, resourcetypeid1, "
					 .         "resourcegroupid2, resourcetypeid2) "
					 . "VALUES ";
			$query .= implode(',', $adds);
			doQuery($query);
		}
		else {
			foreach($groupids as $id) {
				$query = "DELETE FROM resourcemap "
						 . "WHERE resourcegroupid1 = $id AND "
						 .       "resourcetypeid1 = $mytypeid AND "
						 .       "resourcegroupid2 = $mapgroupid AND "
						 .       "resourcetypeid2 = $maptypeid";
				doQuery($query);
			}
		}
		$regids = "^" . implode('$|^', $groupids) . "$";
		$arr = array('status' => 'success',
		             'regids' => $regids,
		             'inselobj' => 'inmaptogroups',
		             'outselobj' => 'outmaptogroups');
		sendJSON($arr);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn mapByGridHTML()
	///
	/// \brief
	///
	/////////////////////////////////////////////////////////////////////////////
	function mapByGridHTML() {
		# TODO
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn AJsaveResource()
	///
	/// \brief saves changes to a resource; must be implemented by inheriting
	/// class
	///
	/////////////////////////////////////////////////////////////////////////////
	function AJsaveResource() {
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn AJeditResource()
	///
	/// \brief sends data for editing a resource
	///
	/////////////////////////////////////////////////////////////////////////////
	function AJeditResource() {
		$rscid = processInputVar('rscid', ARG_NUMERIC);
		$resources = getUserResources(array($this->restype . 'Admin'), array('administer'), 0, 1);
		if(! array_key_exists($rscid, $resources[$this->restype])) {
			$ret = array('status' => 'noaccess');
			sendJSON($ret);
			return;
		}
		$args = $this->defaultGetDataArgs;
		$args['rscid'] = $rscid;
		$tmp = $this->getData($args);
		$data = $tmp[$rscid];
		$cdata = $this->basecdata;
		$cdata['rscid'] = $rscid;
		$cdata['olddata'] = $data;

		# save continuation
		$cont = addContinuationsEntry('AJsaveResource', $cdata);

		$ret = $this->jsondata;
		$ret['title'] = "Edit {$this->restypename}";
		$ret['cont'] = $cont;
		$ret['resid'] = $rscid;
		$ret['data'] = $data;
		$ret['status'] = 'success';
		sendJSON($ret);
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn addResource($data)
	///
	/// \param $data - array of needed data for adding a new resource
	///
	/// \return id of new resource
	///
	/// \brief handles all parts of adding a new resource to the database; should
	/// be implemented by inheriting class, but not required since it is only
	/// called by functions in the inheriting class (nothing in this base class
	/// calls it directly)
	///
	/////////////////////////////////////////////////////////////////////////////
	function addResource($data) {
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn addEditDialogHTML($add)
	///
	/// \param $add (optional, defaul=0) - 0 for edit, 1 for add
	///
	/// \brief handles generating HTML for dialog used to edit resource; must be
	/// implemented by inheriting class
	///
	/////////////////////////////////////////////////////////////////////////////
	function addEditDialogHTML($add) {
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn checkExistingField($field, $value, $id=0)
	///
	/// \param $field - database field name
	/// \param $value - value for $field
	/// \param $id - (optional, default=0) if nonzero, ignore resource with this
	/// id
	///
	/// \return 1 if existing resource with $field set to $value, 0 if not
	///
	/// \brief checks to see if there is already a record in the database with
	/// $field set to $value
	///
	/////////////////////////////////////////////////////////////////////////////
	function checkExistingField($field, $value, $id=0) {
		$query = "SELECT id FROM {$this->restype} "
		       . "WHERE `$field` = '$value'";
		if($this->deletetoggled)
			$query .= " AND deleted = 0";
		if($id)
			$query .= " AND id != $id";
		$qh = doQuery($query);
		if(mysqli_num_rows($qh))
			return 1;
		return 0;
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn extraSelectAdminOptions()
	///
	/// \return html
	///
	/// \brief generates any HTML for additional options that should be shown on
	/// selectionText page
	///
	/////////////////////////////////////////////////////////////////////////////
	function extraSelectAdminOptions() {
	}

	/////////////////////////////////////////////////////////////////////////////
	///
	/// \fn checkResourceInUse($rscid)
	///
	/// \param $rscid - id of resource
	///
	/// \return empty string if not being used; string of where resource is
	/// being used if being used
	///
	/// \brief checks to see if a resource is being used; must be implemented in
	/// inheriting class
	///
	/////////////////////////////////////////////////////////////////////////////
	function checkResourceInUse($rscid) {
		return '';
	}
}

////////////////////////////////////////////////////////////////////////////////
///
/// \fn AJstartImage()
///
/// \brief starts the imaging process for a reservation
///
////////////////////////////////////////////////////////////////////////////////
function AJstartImage() {
	global $user;
	$requestid = getContinuationVar("requestid");
	$checkpoint = getContinuationVar("checkpoint", 0);

	$data = getRequestInfo($requestid, 1);
	if(is_null($data) || $data['stateid'] == 11 || $data['stateid'] == 12 ||
	   ($data['stateid'] == 14 && 
	   ($data['laststateid'] == 11 || $data['laststateid'] == 12))) {
		$ret = array('status' => 'resgone',
		             'errmsg' => i("The reservation you selected to image has expired."));
		sendJSON($ret);
		return;
	}
	$disableUpdate = 1;
	$imageid = '';
	if(count($data['reservations']) == 1) {
		$imageid = $data['reservations'][0]['imageid'];
		$revid = $data['reservations'][0]['imagerevisionid'];
	}
	else {
		foreach($data["reservations"] as $res) {
			if($res["forcheckout"]) {
				$imageid = $res["imageid"];
				$revid = $res['imagerevisionid'];
				break;
			}
		}
	}
	$ostype = 'windows';
	if(! empty($imageid)) {
		$imageData = getImages(0, $imageid);
		if($imageData[$imageid]['ownerid'] == $user['id'])
			$disableUpdate = 0;
		if($imageData[$imageid]['installtype'] == 'none' ||
		   $imageData[$imageid]['installtype'] == 'kickstart')
			$disableUpdate = 1;
		$ostype = $imageData[$imageid]['ostype'];
	}
	else {
		$data['status'] = 'error';
		$data['errmsg'] = i("There was an error in starting the imaging process. Please contact a system administrator.");
		sendJSON($data);
		return;
	}

	# check for root access being disabled
	if($imageData[$imageid]['rootaccess'] == 0 && $imageData[$imageid]['ownerid'] != $user['id']) {
		$ret = array('status' => 'rootaccessnoimage');
		sendJSON($ret);
		return;
	}

	$obj = new Image();
	$cdata = array('obj' => $obj,
	               'requestid' => $requestid,
	               'imageid' => $imageid,
	               'baserevisionid' => $revid,
	               'checkpoint' => $checkpoint,
	               'add' => 1);
	$cdata['addomainvals'] = array();
	if(in_array("addomainAdmin", $user["privileges"])) {
		$vals = getUserResources(array('addomainAdmin'), array("manageGroup"));
		$cdata['addomainvals'] = $vals['addomain'];
	}
	$cont = addContinuationsEntry('AJsaveResource', $cdata, SECINDAY, 0);
	$arr = array('newcont' => $cont,
	             'enableupdate' => 0,
	             'connectmethods' => $imageData[$imageid]['connectmethods'],
	             'owner' => "{$user['unityid']}@{$user['affiliation']}",
	             'checkpoint' => $checkpoint,
	             'ostype' => $ostype);

	$cdata = array('obj' => $obj,
	               'imageid' => $imageid,
	               'newimage' => 1,
	               'curmethods' => $imageData[$imageid]['connectmethods']);
	$cont = addContinuationsEntry('connectmethodDialogContent', $cdata);
	$arr['connectmethodurl'] = BASEURL . SCRIPT . "?continuation=$cont";

	if(! $disableUpdate) {
		$revisions = getImageRevisions($imageid, 1);
		if(array_key_exists($revid, $revisions))
			$comments = $revisions[$revid]['comments'];
		else {
			$keys = array_keys($revisions);
			if(count($keys)) {
				$key = array_pop($keys);
				$comments = $revisions[$key]['comments'];
			}
			else
				$comments = '';
		}
		if(preg_match('/\w/', $comments)) {
			$cmt  = sprintf(i("These are the comments from the previous revision (%s):"),
			                $revisions[$revid]['revision']);
			$cmt .= "<br>";
			$cmt .= "{$revisions[$revid]['comments']}<br><br>";
		}
		else
			$cmt = i("The previous revision did not have any comments.") . "<br><br>";
		$arr['comments'] = $cmt;
		$cdata = array('obj' => $obj,
		               'requestid' => $requestid,
		               'imageid' => $imageid,
		               'checkpoint' => $checkpoint,
		               'revisionid' => $revid);
		$cont = addContinuationsEntry('AJupdateImage', $cdata, SECINDAY, 0);
		$arr['updatecont'] = $cont;
		$arr['enableupdate'] = 1;
	}
	$arr['status'] = 'success';
	sendJSON($arr);
}

?>
