Modified: vcl/trunk/web/.ht-inc/vm.php
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/.ht-inc/vm.php?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/.ht-inc/vm.php (original)
+++ vcl/trunk/web/.ht-inc/vm.php Thu Sep 11 16:01:48 2014
@@ -31,6 +31,7 @@ function editVMInfo() {
        print "<h2>Manage Virtual Hosts</h2>\n";
 
        $profiles = getVMProfiles();
+       uasort($profiles, 'sortKeepIndex');
        if(checkUserHasPerm('Manage VM Profiles')) {
                print "<div id=\"mainTabContainer\" 
dojoType=\"dijit.layout.TabContainer\"\n";
                print "     style=\"width:650px;height:600px\">\n";
@@ -554,7 +555,6 @@ function updateVMlimit() {
        }
        $resources = getUserResources(array("computerAdmin"), 
array("administer"));
        if(! array_key_exists($data[$vmhostid]['computerid'], 
$resources['computer'])) {
-               print "alert('You do not have access to manage this host.');";
                $rc = array('status' => 'ERROR',
                            'msg' => "You do not have access to manage this 
host.");
                sendJSON($rc);
@@ -718,6 +718,7 @@ function AJvmFromHost() {
                }
                # try to remove reservations off of computer
                moveReservationsOffComputer($compid);
+               cleanSemaphore();
 
                # check for unmovable or active reservations
                $query = "SELECT DATE_FORMAT(rq.end, '%l:%i%p %c/%e/%y') AS 
end, "
@@ -960,19 +961,19 @@ function AJupdateVMprofileItem() {
 
        $item = mysql_real_escape_string($item);
        $profile = getVMProfiles($profileid);
-    if($item == 'password' && $profile[$profileid]['rsapub']){
-        $encrypted = encryptDataAsymmetric($newvalue, 
$profile[$profileid]['rsapub']);
-        $escaped = mysql_real_escape_string($encrypted);
-        $query = "UPDATE vmprofile "
-               . "SET `encryptedpasswd` = '$escaped' "
-               . "WHERE id=$profileid";
-        doQuery($query, 101);
-        # don't store the unencrypted password
-        $newvalue2 = 'NULL';
-        $newvalue = '';
-    } else if($profile[$profileid][$item] == $newvalue){
+       if($item == 'password' && $profile[$profileid]['rsapub']) {
+               $encrypted = encryptDataAsymmetric($newvalue, 
$profile[$profileid]['rsapub']);
+               $escaped = mysql_real_escape_string($encrypted);
+               $query = "UPDATE vmprofile "
+                      . "SET `encryptedpasswd` = '$escaped' "
+                      . "WHERE id = $profileid";
+               doQuery($query, 101);
+               # don't store the unencrypted password
+               $newvalue2 = 'NULL';
+               $newvalue = '';
+       }
+       else if($profile[$profileid][$item] == $newvalue)
                return;
-    }
        $query = "UPDATE vmprofile "
               . "SET `$item` = $newvalue2 "
               . "WHERE id = $profileid";

Modified: vcl/trunk/web/.ht-inc/xmlrpcWrappers.php
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/.ht-inc/xmlrpcWrappers.php?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/.ht-inc/xmlrpcWrappers.php (original)
+++ vcl/trunk/web/.ht-inc/xmlrpcWrappers.php Thu Sep 11 16:01:48 2014
@@ -108,9 +108,11 @@ function XMLRPCtest($string) {
 ///
 /// \fn XMLRPCgetImages()
 ///
-/// \return an array of image arrays, each with 2 indices:\n
+/// \return an array of image arrays, each with these indices:\n
 /// \b id - id of the image\n
-/// \b name - name of the image
+/// \b name - name of the image\n
+/// \b description - description of image\n
+/// \b usage - usage instructions for image
 ///
 /// \brief gets the images to which the user has access
 ///
@@ -215,7 +217,7 @@ function XMLRPCaddRequest($imageid, $sta
 
        $images = getImages();
        $revisionid = getProductionRevisionid($imageid);
-       $rc = isAvailable($images, $imageid, $revisionid, $start, $end);
+       $rc = isAvailable($images, $imageid, $revisionid, $start, $end, 1);
        if($rc < 1) {
                addLogEntry($nowfuture, unixToDatetime($start), 
                            unixToDatetime($end), 0, $imageid);
@@ -323,7 +325,7 @@ function XMLRPCaddRequestWithEnding($ima
 
        $images = getImages();
        $revisionid = getProductionRevisionid($imageid);
-       $rc = isAvailable($images, $imageid, $revisionid, $start, $end);
+       $rc = isAvailable($images, $imageid, $revisionid, $start, $end, 1);
        if($rc < 1) {
                addLogEntry($nowfuture, unixToDatetime($start), 
                            unixToDatetime($end), 0, $imageid);
@@ -376,7 +378,7 @@ function XMLRPCdeployServer($imageid, $s
                             $logingroup='', $ipaddr='', $macaddr='',
                             $monitored=0, $foruser='', $name='') {
        global $user, $remoteIP;
-       if(! in_array("serverProfileAdmin", $user["privileges"])) {
+       if(! in_array("serverCheckOut", $user["privileges"])) {
                return array('status' => 'error',
                             'errorcode' => 60,
                             'errormsg' => "access denied to deploy server");
@@ -527,7 +529,7 @@ function XMLRPCdeployServer($imageid, $s
        $images = getImages();
        $revisionid = getProductionRevisionid($imageid);
        $rc = isAvailable($images, $imageid, $revisionid, $start, $end,
-                         0, 0, 0, 0, $ipaddr, $macaddr);
+                         1, 0, 0, 0, 0, $ipaddr, $macaddr);
        if($rc < 1) {
                addLogEntry($nowfuture, unixToDatetime($start), 
                            unixToDatetime($end), 0, $imageid);
@@ -582,7 +584,7 @@ function XMLRPCdeployServer($imageid, $s
 /// \li \b errorcode - error number\n
 /// \li \b errormsg - error string\n
 ///
-/// \b success - request was successfully ended; there will be an additional
+/// \b success - request was successfully found; there will be an additional
 /// element whose index is 'requests' which is an array of arrays, each having
 /// these elements (or empty if no existing requests):\n
 /// \li \b requestid - id of the request\n
@@ -614,7 +616,8 @@ function XMLRPCgetRequestIds() {
                             'start' => $start,
                             'end' => $end,
                             'OS' => $req['OS'],
-                            'isserver' => $req['server']);
+                            'isserver' => $req['server'],
+                            'admin' => $req['serveradmin']);
                if($req['currstateid'] == 14)
                        $tmp['state'] = $states[$req['laststateid']];
                else
@@ -884,12 +887,33 @@ function XMLRPCextendRequest($requestid,
        $timeToNext = timeToNextReservation($request);
        $movedall = 1;
        if($timeToNext > -1) {
-               foreach($request["reservations"] as $res) {
-                       if(! moveReservationsOffComputer($res["computerid"])) {
-                               $movedall = 0;
-                               break;
+               $lockedall = 1;
+               if(count($request['reservations']) > 1) {
+                       # get semaphore on each existing node in cluster so 
that nothing 
+                       # can get moved to the nodes during this process
+                       $checkend = unixToDatetime($unixend + 900);
+                       foreach($request["reservations"] as $res) {
+                               if(! retryGetSemaphore(1, 1, 
$res['managementnodeid'], $res['computerid'], $request['start'], $checkend, 
$requestid)) {
+                                       $lockedall = 0;
+                                       break;
+                               }
                        }
                }
+               if($lockedall) {
+                       foreach($request["reservations"] as $res) {
+                               if(! 
moveReservationsOffComputer($res["computerid"])) {
+                                       $movedall = 0;
+                                       break;
+                               }
+                       }
+               }
+               else {
+                       cleanSemaphore();
+                       return array('status' => 'error',
+                                    'errorcode' => 42,
+                                    'errormsg' => 'cannot extend due to 
another reservation immediately after this one');
+               }
+               cleanSemaphore();
        }
        if(! $movedall) {
                $timeToNext = timeToNextReservation($request);
@@ -912,7 +936,7 @@ function XMLRPCextendRequest($requestid,
        }
        $rc = isAvailable(getImages(), $request['reservations'][0]["imageid"],
                          $request['reservations'][0]['imagerevisionid'],
-                         $startts, $newendts, $requestid);
+                         $startts, $newendts, 1, $requestid);
        // conflicts with scheduled maintenance
        if($rc == -2) {
                addChangeLogEntry($request["logid"], NULL, 
unixToDatetime($newendts),
@@ -939,6 +963,7 @@ function XMLRPCextendRequest($requestid,
        }
        // success
        updateRequest($requestid);
+       cleanSemaphore();
        return array('status' => 'success');
 }
 
@@ -1022,12 +1047,33 @@ function XMLRPCsetRequestEnding($request
        $timeToNext = timeToNextReservation($request);
        $movedall = 1;
        if($timeToNext > -1) {
-               foreach($request["reservations"] as $res) {
-                       if(! moveReservationsOffComputer($res["computerid"])) {
-                               $movedall = 0;
-                               break;
+               $lockedall = 1;
+               if(count($request['reservations']) > 1) {
+                       # get semaphore on each existing node in cluster so 
that nothing 
+                       # can get moved to the nodes during this process
+                       $checkend = unixToDatetime($unixend + 900);
+                       foreach($request["reservations"] as $res) {
+                               if(! retryGetSemaphore(1, 1, 
$res['managementnodeid'], $res['computerid'], $request['start'], $checkend, 
$requestid)) {
+                                       $lockedall = 0;
+                                       break;
+                               }
+                       }
+               }
+               if($lockedall) {
+                       foreach($request["reservations"] as $res) {
+                               if(! 
moveReservationsOffComputer($res["computerid"])) {
+                                       $movedall = 0;
+                                       break;
+                               }
                        }
                }
+               else {
+                       cleanSemaphore();
+                       return array('status' => 'error',
+                                    'errorcode' => 42,
+                                    'errormsg' => 'cannot extend due to 
another reservation immediately after this one');
+               }
+               cleanSemaphore();
        }
        if(! $movedall) {
                $timeToNext = timeToNextReservation($request);
@@ -1051,7 +1097,7 @@ function XMLRPCsetRequestEnding($request
        }
        $rc = isAvailable(getImages(), $request['reservations'][0]["imageid"],
                          $request['reservations'][0]['imagerevisionid'],
-                         $startts, $end, $requestid);
+                         $startts, $end, 1, $requestid);
        // conflicts with scheduled maintenance
        if($rc == -2) {
                addChangeLogEntry($request["logid"], NULL, unixToDatetime($end),
@@ -1078,6 +1124,7 @@ function XMLRPCsetRequestEnding($request
        }
        // success
        updateRequest($requestid);
+       cleanSemaphore();
        return array('status' => 'success');
 }
 
@@ -1164,7 +1211,7 @@ function XMLRPCautoCapture($requestid) {
                             'errorcode' => 48,
                             'errormsg' => 'cannot image a cluster 
reservation');
        }
-       require_once(".ht-inc/images.php");
+       require_once(".ht-inc/image.php");
        $imageid = $reqData['reservations'][0]['imageid'];
        $imageData = getImages(0, $imageid);
        $captime = unixToDatetime(time());
@@ -1175,7 +1222,7 @@ function XMLRPCautoCapture($requestid) {
        # create new revision if requestor is owner and not a kickstart image
        if($imageData[$imageid]['installtype'] != 'kickstart' &&
           $reqData['userid'] == $imageData[$imageid]['ownerid']) {
-               $rc = updateExistingImage($requestid, $reqData['userid'], 
$comments, 1);
+               $rc = Image::AJupdateImage($requestid, $reqData['userid'], 
$comments, 1);
                if($rc == 0) {
                        return array('status' => 'error',
                                     'errorcode' => 49,
@@ -1191,7 +1238,7 @@ function XMLRPCautoCapture($requestid) {
                      . "owner: 
{$ownerdata['unityid']}@{$ownerdata['affiliation']}<br>";
                $connectmethods = getImageConnectMethods($imageid, 
$reqData['reservations'][0]['imagerevisionid']);
                $data = array('requestid' => $requestid,
-                             'description' => $desc,
+                             'desc' => $desc,
                              'usage' => '',
                              'owner' => 
"{$ownerdata['unityid']}@{$ownerdata['affiliation']}",
                              'prettyname' => "Autocaptured 
({$ownerdata['unityid']} - $requestid)",
@@ -1203,9 +1250,15 @@ function XMLRPCautoCapture($requestid) {
                              'checkuser' => 1,
                              'rootaccess' => 1,
                              'sysprep' => 1,
+                             'basedoffrevisionid' => 
$reqData['reservations'][0]['imagerevisionid'],
+                             'platformid' => 
$imageData[$imageid]['platformid'],
+                             'osid' => $imageData[$imageid]["osid"],
+                             'reload' => 20,
                              'comments' => $comments,
-                             'connectmethodids' => implode(',', 
array_keys($connectmethods)));
-               $rc = submitAddImage($data, 1);
+                             'connectmethodids' => implode(',', 
array_keys($connectmethods)),
+                             'autocaptured' => 1);
+               $obj = new Image();
+               $rc = $obj->addResource($data);
                if($rc == 0) {
                        return array('status' => 'error',
                                     'errorcode' => 50,
@@ -1608,7 +1661,7 @@ function XMLRPCaddNode($nodeName, $paren
        }
        if(in_array("nodeAdmin", $user['privileges'])) {
                $nodeInfo = getNodeInfo($parentNode);
-               if(is_null($tmp)) {
+               if(is_null($nodeInfo)) {
                        return array('status' => 'error',
                                     'errorcode' => 78,
                                     'errormsg' => 'Invalid nodeid specified');
@@ -1821,7 +1874,8 @@ function XMLRPCaddUserGroupPriv($name, $
        array_push($usertypes["users"], "cascade");
 
        $diff = array_diff($perms, $usertypes['users']);
-       if(count($diff) || (count($perms) == 1 && $perms[0] == 'cascade')) {
+       if(! count($perms) || count($diff) ||
+          (count($perms) == 1 && $perms[0] == 'cascade')) {
                return array('status' => 'error',
                             'errorcode' => 66,
                             'errormsg' => 'Invalid or missing permissions list 
supplied');
@@ -1830,9 +1884,13 @@ function XMLRPCaddUserGroupPriv($name, $
        $cnp = getNodeCascadePrivileges($nodeid, "usergroups");
        $np = getNodePrivileges($nodeid, "usergroups", $cnp);
 
-       $diff = array_diff($perms, $np['usergroups'][$name]['privs']);
-       if(empty($diff))
-               return array('status' => 'success');
+       if(array_key_exists($name, $np['usergroups'])) {
+               $diff = array_diff($perms, $np['usergroups'][$name]['privs']);
+               if(empty($diff))
+                       return array('status' => 'success');
+       }
+       else
+               $diff = $perms;
 
        updateUserOrGroupPrivs($groupid, $nodeid, $diff, array(), "group");
        return array('status' => 'success');
@@ -2430,7 +2488,7 @@ function XMLRPCeditUserGroup($name, $aff
                return $rc;
 
        # get info about group
-       $query = "SELECT ownerid "
+       $query = "SELECT ownerid, "
               .        "affiliationid, "
               .        "custom, "
               .        "courseroll "
@@ -3014,23 +3072,23 @@ function XMLRPCremoveResourceGroup($name
 /// created block time and at least one other index named 'status' which will
 /// have one of these values:\n
 /// \b error - error occurred; there will be 2 additional elements in the
-/// array:
-/// \li \b errorcode - error number
-/// \li \b errormsg - error string
+/// array:\n
+/// \li \b errorcode - error number\n
+/// \li \b errormsg - error string\n
 ///
 /// \b success - blockTimesid was processed; there will be two additional
-/// elements in this case:
+/// elements in this case:\n
 /// \li \b allocated - total number of desired allocations that have been
-/// processed
+/// processed\n
 /// \li \b unallocated - total number of desired allocations that have not been
-/// processed
+/// processed\n
 ///
 /// \b warning - there was a non-fatal issue that occurred while processing
-/// the call; there will be four additional elements in this case:
-/// \li \b warningcode - warning number
-/// \li \b warningmsg - warning string
+/// the call; there will be four additional elements in this case:\n
+/// \li \b warningcode - warning number\n
+/// \li \b warningmsg - warning string\n
 /// \li \b allocated - total number of desired allocations that have been
-/// processed
+/// processed\n
 /// \li \b unallocated - total number of desired allocations that have not been
 /// processed\n\n
 ///
@@ -3206,18 +3264,18 @@ function XMLRPCblockAllocation($imageid,
 ///
 /// \b completed - blockTimesid was previously successfully processed\n
 /// \b success - blockTimesid was processed; there will be two additional
-/// elements in this case:
+/// elements in this case:\n
 /// \li \b allocated - total number of desired allocations that have been
-/// processed
+/// processed\n
 /// \li \b unallocated - total number of desired allocations that have not been
-/// processed
+/// processed\n
 ///
 /// \b warning - there was a non-fatal issue that occurred while processing
-/// the call; there will be four additional elements in this case:
-/// \li \b warningcode - warning number
-/// \li \b warningmsg - warning string
+/// the call; there will be four additional elements in this case:\n
+/// \li \b warningcode - warning number\n
+/// \li \b warningmsg - warning string\n
 /// \li \b allocated - total number of desired allocations that have been
-/// processed
+/// processed\n
 /// \li \b unallocated - total number of desired allocations that have not been
 /// processed\n\n
 ///
@@ -3332,7 +3390,7 @@ function XMLRPCprocessBlockTime($blockTi
                        }
                        # check to see if computer is available for whole block
                        $rc = isAvailable($images, $rqdata['imageid'], 
$revisionid, $checkstart,
-                                         $unixend, $row['reqid'], 
$row['userid'],
+                                         $unixend, 1, $row['reqid'], 
$row['userid'],
                                          $ignoreprivileges, 0, '', '', 1);
                        // if not available for whole block, just skip this one
                        if($rc < 1)
@@ -3375,6 +3433,7 @@ function XMLRPCprocessBlockTime($blockTi
                               . "VALUES $blockComps";
                        doQuery($query);
                }
+               cleanSemaphore();
        }
 
        # check to see if all computers have been allocated
@@ -3451,7 +3510,7 @@ function XMLRPCprocessBlockTime($blockTi
                        $userid = array_pop($userids);
                # use end of block time to find available computers, but...
                $rc = isAvailable($images, $rqdata['imageid'], $revisionid, 
$stagunixstart,
-                                 $unixend, 0, $userid, $ignoreprivileges);
+                                 $unixend, 1, 0, $userid, $ignoreprivileges);
                if($rc < 1)
                        continue;
 
@@ -3488,12 +3547,12 @@ function XMLRPCprocessBlockTime($blockTi
                               .       "$mgmtnodeid)";
                        doQuery($query, 101);
                }
-               semUnlock();
                $blockComps = implode(',', $blockCompVals);
                $query = "INSERT INTO blockComputers "
                       .        "(blockTimeid, computerid, imageid, 
reloadrequestid) "
                       . "VALUES $blockComps";
                doQuery($query, 101);
+               cleanSemaphore();
                $blockCompVals = array();
        }
        if($allocated == 0) {

Modified: vcl/trunk/web/css/vcl.css
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/css/vcl.css?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/css/vcl.css (original)
+++ vcl/trunk/web/css/vcl.css Thu Sep 11 16:01:48 2014
@@ -14,6 +14,14 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
+html {
+       height: 100%;
+       width: 100%;
+}
+body {
+       height: 100%;
+       width: 100%;
+}
 .scriptonly {
        display: none;
 }
@@ -219,6 +227,14 @@
        color: red;
 }
 
+.ready {
+       color: #008000;
+}
+
+.wait {
+       color: #e58304;
+}
+
 #revisiontable th {
        border: solid 1px #000000;
        padding: 2px;
@@ -311,9 +327,232 @@
        margin: 10px;
 }
 
+#gridcontainer table th,
+#gridcontainer table td,
 #usergroupcontainer table th,
 #usergroupcontainer table td,
 #resourcegroupcontainer table th,
-#resourcegroupcontainer table td {
+#resourcegroupcontainer table td,
+#extrafiltersdiv table th,
+#extrafiltersdiv table td {
        font-size: 1em;
 }
+
+.editmntable, #deployprofilediv table, #serverprofiledata table {
+       border-collapse: collapse;
+}
+
+.boxedtablerows {
+       border: 1px solid #000000;
+}
+
+#systemconfigdiv .dojoxMultiSelectSelectedOption,
+#groupbyresourcediv .dojoxMultiSelectSelectedOption,
+#groupbygroupdiv .dojoxMultiSelectSelectedOption,
+#mapbyresgroupdiv .dojoxMultiSelectSelectedOption,
+#mapbymaptogroupdiv .dojoxMultiSelectSelectedOption {
+       background-color: black;
+       color: white;
+}
+
+/*#configvariablegriddiv .dojoxGridCellFocus {
+       background-color: black;
+       color: white;
+}*/
+
+#systemconfigdiv .dojoxGridHeader,
+#groupbyresourcediv .dojoxGridHeader,
+#groupbygroupdiv .dojoxGridHeader, 
+#mapbyresgroupdiv .dojoxGridHeader, 
+#mapbymaptogroupdiv .dojoxGridHeader, 
+#configvariablegriddiv .dojoxGridHeader {
+       display: none;
+}
+
+#systemconfigdiv .dojoxGrid,
+#groupbyresourcediv .dojoxGrid,
+#groupbygroupdiv .dojoxGrid,
+#mapbyresgroupdiv .dojoxGrid,
+#mapbymaptogroupdiv .dojoxGrid,
+#subimagegriddiv .dojoxGrid,
+#configvariablegriddiv .dojoxGrid {
+       background-color: white;
+       border: 1px solid black;
+}
+
+#systemconfigdiv .dojoxGridRow,
+#systemconfigdiv .dojoxGridRowOdd,
+#groupbyresourcediv .dojoxGridRow,
+#groupbyresourcediv .dojoxGridRowOdd,
+#groupbygroupdiv .dojoxGridRow,
+#groupbygroupdiv .dojoxGridRowOdd,
+#mapbyresgroupdiv .dojoxGridRow,
+#mapbyresgroupdiv .dojoxGridRowOdd,
+#mapbymaptogroupdiv .dojoxGridRow,
+#mapbymaptogroupdiv .dojoxGridRowOdd,
+#subimagegriddiv .dojoxGridRow,
+#subimagegriddiv .dojoxGridRowOdd,
+#configvariablegriddiv .dojoxGridRow,
+#configvariablegriddiv .dojoxGridRowOdd {
+       width: 300px;
+       background-color: white;
+       border: none;
+       padding: 0;
+       margin: 0;
+}
+
+#content #systemconfigdiv table,
+#content #groupbyresourcediv table,
+#content #groupbygroupdiv table,
+#content #mapbyresgroupdiv table,
+#content #mapbymaptogroupdiv table,
+#content #subimagegriddiv table,
+#content #configvariablegriddiv table {
+       border-spacing: 0;
+}
+
+#systemconfigdiv .dojoxGridRowSelected,
+#groupbyresourcediv .dojoxGridRowSelected,
+#groupbygroupdiv .dojoxGridRowSelected,
+#mapbyresgroupdiv .dojoxGridRowSelected,
+#mapbymaptogroupdiv .dojoxGridRowSelected,
+#subimagegriddiv .dojoxGridRowSelected,
+#configvariablegriddiv .dojoxGridRowSelected {
+       width: 300px;
+       background-color: black;
+       border: none;
+       padding: 0;
+       margin: 0;
+       color: white;
+}
+
+#systemconfigdiv .dojoxGridRowSelected td,
+#groupbyresourcediv .dojoxGridRowSelected td,
+#groupbygroupdiv .dojoxGridRowSelected td,
+#mapbyresgroupdiv .dojoxGridRowSelected td,
+#mapbymaptogroupdiv .dojoxGridRowSelected td,
+#subimagegriddiv .dojoxGridRowSelected td,
+#configvariablegriddiv .dojoxGridRowSelected td {
+       background-color: black;
+       color: white;
+}
+
+#systemconfigdiv .dojoxGridCell,
+#systemconfigdiv .dojoxGridCellFocus,
+#systemconfigdiv .dojoxGridCellOver,
+#groupbyresourcediv .dojoxGridCell,
+#groupbyresourcediv .dojoxGridCellFocus,
+#groupbyresourcediv .dojoxGridCellOver,
+#groupbygroupdiv .dojoxGridCell,
+#groupbygroupdiv .dojoxGridCellFocus,
+#groupbygroupdiv .dojoxGridCellOver,
+#mapbyresgroupdiv .dojoxGridCell,
+#mapbyresgroupdiv .dojoxGridCellFocus,
+#mapbyresgroupdiv .dojoxGridCellOver,
+#mapbymaptogroupdiv .dojoxGridCell,
+#mapbymaptogroupdiv .dojoxGridCellFocus,
+#mapbymaptogroupdiv .dojoxGridCellOver,
+#subimagegriddiv .dojoxGridCell,
+#subimagegriddiv .dojoxGridCellFocus,
+#subimagegriddiv .dojoxGridCellOver,
+#configvariablegriddiv .dojoxGridCell,
+#configvariablegriddiv .dojoxGridCellFocus,
+#configvariablegriddiv .dojoxGridCellOver {
+       border: none;
+       border-style: none;
+}
+
+#systemconfigdiv .dojoxMultiSelectItemBox,
+#groupbyresourcediv .dojoxMultiSelectItemBox,
+#groupbygroupdiv .dojoxMultiSelectItemBox,
+#mapbyresgroupdiv .dojoxMultiSelectItemBox,
+#mapbymaptogroupdiv .dojoxMultiSelectItemBox,
+#subimagegriddiv .dojoxMultiSelectItemBox,
+#configvariablegriddiv .dojoxMultiSelectItemBox {
+       display: none;
+}
+
+#addeditdlgcontent label,
+#newreslabelfields label {
+       position: absolute;
+       text-align: right;
+       width: 9em;
+       font-weight: bold;
+}
+
+#newreslabelfields label {
+       width: 10em;
+}
+
+#addeditdlgcontent .labeledform {
+       margin-left: 9.5em;
+}
+
+#advancedoptions .labeledform {
+       margin-left: 17em;
+}
+
+#mgmtnodedlgcontent label {
+       width: 18.5em;
+}
+
+#mgmtnodedlgcontent .labeledform {
+       margin-left: 19em;
+}
+
+#computerdlgcontent label {
+       width: 12em;
+}
+
+#computerdlgcontent .labeledform {
+       margin-left: 12.5em;
+}
+
+#advancedoptions label {
+       width: 16.5em;
+}
+
+#cfgvartypelbl {
+       margin-top: 6px;
+}
+
+#addeditdlgcontent .labeledforminnerlabel {
+       text-align: left;
+       font-weight: normal;
+       position: static;
+}
+
+#newreslabelfields .labeledform {
+       margin-left: 10.5em;
+}
+
+#configvariables {
+       border: 1px solid black;
+       margin: 3px;
+}
+
+.strikethrough {
+       text-decoration: line-through;
+}
+
+#nrfixedipdiv {
+       border: 1px solid black;
+       padding: 3px;
+       margin: 3px;
+       display: inline-block;
+}
+
+.boxedoptions {
+       border: 1px solid black;
+       padding: 3px;
+       margin: 3px 1px;
+}
+
+#imageRevisionDlg .dijitDialogPaneContent {
+       height: 100%;
+       width: 100%;
+}
+
+.disabledlabel {
+       color: #888888;
+}

Modified: vcl/trunk/web/index.php
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/index.php?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/index.php (original)
+++ vcl/trunk/web/index.php Thu Sep 11 16:01:48 2014
@@ -16,10 +16,9 @@
   limitations under the License.
 */
 
-# ASF VCL v2.3
-$VCLversion = '2.3';
+# ASF VCL v2.4
+$VCLversion = '2.4';
 
-@include_once("fckeditor/fckeditor.php");
 require_once(".ht-inc/conf.php");
 if(! isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") {
        header("Location: " . BASEURL . "/");
@@ -84,14 +83,30 @@ if(checkUserHasPerm('View Debug Informat
 }
 
 if($hasArg) {
-       $actionFunction($arg);
+       if(function_exists($actionFunction))
+               $actionFunction($arg);
+       else {
+               $obj = getContinuationVar('obj');
+               if(! is_null($obj) && method_exists($obj, $actionFunction))
+                       $obj->$actionFunction($arg);
+               else
+                       main();
+       }
 }
 else {
-       $actionFunction();
+       if(function_exists($actionFunction))
+               $actionFunction();
+       else {
+               $obj = getContinuationVar('obj');
+               if(! is_null($obj) && method_exists($obj, $actionFunction))
+                       $obj->$actionFunction();
+               else
+                       main();
+       }
 }
 printHTMLFooter();
 
-dbDisconnect();
+cleanSemaphore();
 
-semUnlock();
+dbDisconnect();
 ?>

Modified: vcl/trunk/web/js/blockallocations.js
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/js/blockallocations.js?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/js/blockallocations.js (original)
+++ vcl/trunk/web/js/blockallocations.js Thu Sep 11 16:01:48 2014
@@ -32,27 +32,7 @@ var blockFormAddListData = {
        items: []
 }
 
-function RPCwrapper(data, CB, dojson) {
-       if(dojson) {
-               dojo.xhrPost({
-                       url: 'index.php',
-                       load: CB,
-                       handleAs: "json",
-                       error: errorHandler,
-                       content: data,
-                       timeout: 15000
-               });
-       }
-       else {
-               dojo.xhrPost({
-                       url: 'index.php',
-                       load: CB,
-                       error: errorHandler,
-                       content: data,
-                       timeout: 15000
-               });
-       }
-}
+var usagechart = null;
 
 function generalReqCB(data, ioArgs) {
        eval(data);
@@ -1367,3 +1347,49 @@ function timestampToTimeVirtual(val) {
 function machinecntfilter(val) {
        return parseInt(val);
 }
+
+function viewBlockUsage(blockid) {
+       var cont = dojo.byId('viewblockusagecont').value;
+       RPCwrapper({continuation: cont, blockid: blockid}, viewBlockUsageCB, 1);
+}
+
+function viewBlockUsageCB(data, ioArgs) {
+       if(data.items.status == 'success') {
+               if(usagechart)
+                       usagechart.destroy();
+               usagechart = new dojox.charting.Chart2D('blockusagechartdiv');
+               usagechart.setTheme(dojox.charting.themes.ThreeD);
+               var xtickstep = parseInt(data.items.usage.xlabels.length / 10) 
|| 1;
+               usagechart.addAxis("x", {
+                       includeZero: false,
+                       labels: data.items.usage.xlabels,
+                       rotation: -90,
+                       minorTicks: false,
+                       font: 'normal normal normal 11px verdana',
+                       majorTickStep: xtickstep
+               });
+               usagechart.addAxis('y', {
+                       vertical: true,
+                       max: 100,
+                       includeZero: true,
+                       minorTicks: true,
+                       minorLabels: false,
+                       majorTickStep: 20,
+                       minorTickStep: 10
+               });
+               usagechart.addPlot('default', {type: "Columns", gap: 1});
+               usagechart.addPlot('Grid', {type: 'Grid', hMajorLines: true, 
vMajorLines: false});
+               usagechart.addSeries("Main", data.items.usage.points, {stroke: 
{width: 1}});
+               var a = new dojox.charting.action2d.Tooltip(usagechart);
+               usagechart.render();
+               dojo.addClass('blockusageemptydiv', 'hidden');
+               dojo.removeClass('blockusagechartdiv', 'hidden');
+               dijit.byId('viewUsageDialog').show();
+       }
+       else if(data.items.status == 'empty') {
+               dojo.addClass('blockusagechartdiv', 'hidden');
+               dojo.removeClass('blockusageemptydiv', 'hidden');
+               dijit.byId('viewUsageDialog').show();
+       }
+}
+

Modified: vcl/trunk/web/js/code.js
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/js/code.js?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/js/code.js (original)
+++ vcl/trunk/web/js/code.js Thu Sep 11 16:01:48 2014
@@ -48,52 +48,47 @@ function testJS() {
                document.getElementById('testjavascript').value = '1';
 }
 
-function checkAllCompUtils() {
-       var count = 0;
-       var obj;
-       while(obj = document.getElementById('comp' + count)) {
-               obj.checked = true;
-               document.getElementById('compid' + count).className = 'hlrow';
-               toggledRows['compid' + count] = 1;
-               count++;
-       }
-       return true;
-}
-
-function uncheckAllCompUtils() {
-       var count = 0;
-       var obj;
-       while(obj = document.getElementById('comp' + count)) {
-               obj.checked = false;
-               document.getElementById('compid' + count).className = '';
-               toggledRows['compid' + count] = 0;
-               count++;
-       }
-       return true;
-}
-
-function reloadComputerSubmit() {
-       var formobj = document.getElementById('utilform');
-       var obj = document.getElementById('utilformcont');
-       var contobj = document.getElementById('reloadcont');
-       obj.value = contobj.value;
-       formobj.submit();
-}
-
-function compStateChangeSubmit() {
-       var formobj = document.getElementById('utilform');
-       var obj = document.getElementById('utilformcont');
-       var contobj = document.getElementById('statecont');
-       obj.value = contobj.value;
-       formobj.submit();
-}
-
-function compScheduleChangeSubmit() {
-       var formobj = document.getElementById('utilform');
-       var obj = document.getElementById('utilformcont');
-       var contobj = document.getElementById('schcont');
-       obj.value = contobj.value;
-       formobj.submit();
+function RPCwrapper(data, CB, dojson, timeout) {
+       if(typeof timeout === 'undefined')
+               timeout = 15000;
+       if(dojson) {
+               return dojo.xhrPost({
+                       url: 'index.php',
+                       load: function(data, ioArgs) {returnCheck(CB, data, 
ioArgs);},
+                       //load: CB,
+                       //handleAs: "json",
+                       error: errorHandler,
+                       content: data,
+                       timeout: timeout
+               });
+       }
+       else {
+               return dojo.xhrPost({
+                       url: 'index.php',
+                       load: CB,
+                       error: errorHandler,
+                       content: data,
+                       timeout: timeout
+               });
+       }
+}
+
+function returnCheck(CB, data, ioArgs) {
+       try {
+               var json = dojo.fromJson(data);
+       }
+       catch(error) {
+               if(data.match(/<html/) || ! error.message.match(/syntax 
error/)) {
+                       alert(_('Error encountered:') + " " + _('Please try 
again later'));
+                       return;
+               }
+               var div = document.createElement('div');
+               div.innerHTML = data;
+               var msg = div.textContent || div.innerText || "";
+               alert(_('Error encountered:') + '\n\n' + msg);
+               return;
+       }
+       CB(json, ioArgs);
 }
 
 Array.prototype.inArray = function(data) {
@@ -114,7 +109,7 @@ Array.prototype.search = function(data) 
        return false;
 }
 
-var genericCB = function(type, data, evt) {
+function generalCB(data, ioArgs) {
        unsetLoading();
        var regex = new RegExp('^<!DOCTYPE html');
        if(data.match(regex)) {
@@ -125,7 +120,7 @@ var genericCB = function(type, data, evt
                alert(mesg);
                var d = {mode: 'errorrpt',
                         data: data};
-               RPCwrapper(d, function(type, data, evt) {});
+               RPCwrapper(d, function(data, ioArgs) {});
                return;
        }
        eval(data);
@@ -135,6 +130,7 @@ var errorHandler = function(error, ioArg
        /*if(error.name == 'cancel')
                return;
        alert('AJAX Error: ' + error.message + '\nLine ' + error.lineNumber + ' 
in ' + error.fileName);*/
+       //console.log(error);
 }
 
 function errorHandler(data, ioArgs) {
@@ -149,38 +145,14 @@ function AJdojoCreate(objid) {
 
 function setLoading() {
    document.body.style.cursor = 'wait';
-       if(dojo.widget.byId('workingDialog'))
-               dojo.widget.byId('workingDialog').show();
+       if(dijit.byId('workingDialog'))
+               dijit.byId('workingDialog').show();
 }
 
 function unsetLoading() {
        document.body.style.cursor = 'default';
-       if(dojo.widget.byId('workingDialog'))
-               dojo.widget.byId('workingDialog').hide();
-}
-
-function toggleRowSelect(id) {
-       var row = document.getElementById(id);
-       if(toggledRows[id] && toggledRows[id] == 1) {
-               row.className = '';
-               toggledRows[id] = 0;
-       }
-       else {
-               row.className = 'hlrow';
-               toggledRows[id] = 1;
-       }
-}
-
-function toggleColSelect(id) {
-       var col = document.getElementById(id);
-       if(toggledCols[id] && toggledCols[id] == 1) {
-               col.className = '';
-               toggledCols[id] = 0;
-       }
-       else {
-               col.className = 'hlcol';
-               toggledCols[id] = 1;
-       }
+       if(dijit.byId('workingDialog'))
+               dijit.byId('workingDialog').hide();
 }
 
 function updateMouseXY(e) {
@@ -345,3 +317,59 @@ function recenterDijitDialog(id) {
                delete dijit.byId(id)._relativePosition;
        dijit.byId(id)._position();
 }
+
+function resizeRecenterDijitDialog(id) {
+       // taken from Dialog.js _size function
+       /*var d = dijit.byId(id);
+       var mb = dojo._getMarginSize(d.domNode);
+       var viewport = dojo.window.getBox();
+       if(mb.h >= viewport.h) {
+               // Reduce size of dialog contents so that dialog fits in 
viewport
+               var h = Math.min(mb.h, Math.floor(viewport.h * 0.75));
+               dojo.style(d.containerNode, {
+                       height: h + "px",
+                       overflow: "auto",
+                       position: "relative"    // workaround IE bug moving 
scrollbar or dragging dialog
+               });
+       }*/
+       dijit.byId(id)._size();
+       recenterDijitDialog(id);
+}
+
+function checkValidatedObj(objid, errobj) {
+       if(dijit.byId(objid) && ! dijit.byId(objid).get('disabled') &&
+          ! dijit.byId(objid).isValid()) {
+               dijit.byId(objid)._hasBeenBlurred = true;
+               dijit.byId(objid).validate();
+               //dijit.byId(objid).focus();
+               if(typeof errobj == 'string') {
+                       if(dijit.byId(errobj))
+                               dijit.byId(errobj).set('value', '');
+                       else if(dojo.byId(errobj))
+                               dojo.byId(errobj).innerHTML = '';
+                       else
+                               errobj = null;
+               }
+               if(errobj !== null && typeof errobj != 'undefined')
+                       errobj.innerHTML = '';
+               return 0;
+       }
+       return 1;
+}
+
+function resetSelect(objid) {
+       if(dijit.byId(objid)) {
+               dijit.byId(objid).reset();
+               return;
+       }
+       var obj = dojo.byId(objid);
+       var found = 0;
+       for(var i = 0; i < obj.options.length; i++) {
+               if(obj.options[i].defaultSelected) {
+                       obj.selectedIndex = i;
+                       found = 1;
+               }
+       }
+       if(! found)
+               obj.selectedIndex = 0;
+}

Modified: vcl/trunk/web/js/dashboard.js
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/js/dashboard.js?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/js/dashboard.js (original)
+++ vcl/trunk/web/js/dashboard.js Thu Sep 11 16:01:48 2014
@@ -15,27 +15,7 @@
 * limitations under the License.
 */
 
-function RPCwrapper(data, CB, dojson) {
-       if(dojson) {
-               dojo.xhrPost({
-                       url: 'index.php',
-                       load: CB,
-                       handleAs: "json",
-                       error: errorHandler,
-                       content: data,
-                       timeout: 15000
-               });
-       }
-       else {
-               dojo.xhrPost({
-                       url: 'index.php',
-                       load: CB,
-                       error: errorHandler,
-                       content: data,
-                       timeout: 15000
-               });
-       }
-}
+var refreshtimer;
 
 function generalReqCB(data, ioArgs) {
        eval(data);
@@ -61,7 +41,9 @@ function updateDashboardCB(data, ioArgs)
        updateBlockAllocation(data.items.blockallocation);
        if(dojo.byId('newreservations'))
                updateNewReservations(data.items.newreservations);
-       setTimeout(updateDashboard, 15000);
+       if(dojo.byId('failedimaging'))
+               updateFailedImaging(data.items.failedimaging);
+       refreshtimer = setTimeout(updateDashboard, 15000);
 }
 
 function updateStatus(data) {
@@ -157,11 +139,15 @@ function updateTopFailed(data) {
                return;
        }
        var txt = '<table>';
+       txt += '<tr><th align="right">'
+       txt += 'Image</th><th>User</th><th>Reload</th></tr>'
        for(var i = 0; i < data.length; i++) {
                txt += '<tr><th align="right">'
                    + data[i].prettyname
                    + '</th><td>'
                    + data[i].count
+                   + '</td><td>'
+                   + data[i].reloadcount
                    + '</td></tr>';
        }
        txt += '</table>';
@@ -244,6 +230,74 @@ function updateNewReservations(data) {
        obj.innerHTML = txt;
 }
 
+function updateFailedImaging(data) {
+       var obj = dojo.byId('failedimaging');
+       var txt = '<table>';
+       txt += '<tr>'
+           +  '<td></td>'
+           +  '<th>Start</th>'
+           +  '<th>ReqID</th>'
+           +  '<th>Computer</th>'
+           +  '<th>VM Host</th>'
+           +  '<th>Image</th>'
+           +  '<th>Owner</th>'
+           +  '<th>Management Node</th>'
+           +  '</tr>';
+       for(var i = 0; i < data.length; i++) {
+               if(i % 2)
+                       txt += '<tr style=\"background-color: #D8D8D8;\">';
+               else
+                       txt += '<tr style=\"background-color: #EEEEEE;\">';
+               txt += '<td style=\"padding: 1px; border-right: 1px solid;\">'
+                   + '<button id=\"imgbtn' + data[i].id + '\" 
type=\"button\"></button>'
+                   + '<input type=\"hidden\" id=\"iptimgbtn' + data[i].id + 
'\">'
+                   + '</td><td style=\"padding: 1px; border-right: 1px 
solid;\">'
+                   + data[i].start
+                   + '</td><td style=\"padding: 1px; border-right: 1px 
solid;\">'
+                   + data[i].id
+                   + '</td><td style=\"padding: 1px; border-right: 1px 
solid;\">'
+                   + data[i].computer
+                   + '</td><td style=\"padding: 1px; border-right: 1px 
solid;\">'
+                   + data[i].vmhost
+                   + '</td><td style=\"padding: 1px; border-right: 1px 
solid;\">'
+                   + data[i].image
+                   + '</td><td style=\"padding: 1px; border-right: 1px 
solid;\">'
+                   //+ data[i].installtype
+                   + data[i].owner
+                   + '</td><td style=\"padding: 1px; border-right: 1px 
solid;\">'
+                   + data[i].managementnode
+                   + '</td></tr>';
+       }
+       txt += '</table>';
+       obj.innerHTML = txt;
+       for(var i = 0; i < data.length; i++) {
+               var btnid = 'imgbtn' + data[i].id
+               if(dijit.byId(btnid))
+                       dijit.byId(btnid).destroy(true);
+               dojo.byId('ipt' + btnid).value = data[i].contid;
+               var btn = new dijit.form.Button({
+                       label: "Restart Imaging",
+                       onClick: function() {
+                               var contid = dojo.byId('ipt' + this.id).value;
+                               RPCwrapper({continuation: contid}, 
restartImagingCB, 1);
+                       }
+               }, btnid);
+       }
+}
+
+function restartImagingCB(data, ioArgs) {
+       if(data.items.status == 'noaccess') {
+               alert('You do not have access to restart the imaging process 
for this reservation');
+               return;
+       }
+       else if(data.items.status == 'wrongstate') {
+               alert('The state of this reservation changed and is no longer 
valid for restarting the reservation');
+               return;
+       }
+       clearTimeout(refreshtimer);
+       updateDashboard();
+}
+
 function timestampToTime(val) {
        if(! dijit.byId('reschart').chart.labeldata)
                return '';

Modified: vcl/trunk/web/js/privileges.js
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/js/privileges.js?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/js/privileges.js (original)
+++ vcl/trunk/web/js/privileges.js Thu Sep 11 16:01:48 2014
@@ -16,28 +16,6 @@
 */
 var currentOver = '';
 
-function RPCwrapper(data, CB, dojson) {
-       if(dojson) {
-               dojo.xhrPost({
-                       url: 'index.php',
-                       load: CB,
-                       handleAs: "json",
-                       error: errorHandler,
-                       content: data,
-                       timeout: 15000
-               });
-       }
-       else {
-               dojo.xhrPost({
-                       url: 'index.php',
-                       load: CB,
-                       error: errorHandler,
-                       content: data,
-                       timeout: 15000
-               });
-       }
-}
-
 function generalPrivCB(data, ioArgs) {
        eval(data);
        unsetLoading2();
@@ -447,7 +425,10 @@ function submitAddUserGroup() {
        var obj = dijit.byId('blockgrpchk');
        if(obj.checked)
                perms.push('block');
-       for(var i = 0; obj = dijit.byId('usergrpck0:' + i); i++) {
+       obj = dijit.byId('usergrpck0:0');
+       if(obj.checked)
+               perms.push('cascade');
+       for(var i = 1; obj = dijit.byId('usergrpck0:' + i); i++) {
                if(obj.checked)
                        perms.push(obj.name);
        }

Modified: vcl/trunk/web/js/requests.js
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/js/requests.js?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/js/requests.js (original)
+++ vcl/trunk/web/js/requests.js Thu Sep 11 16:01:48 2014
@@ -17,27 +17,18 @@
 var resSubmitted = 0;
 var suggestTimeData = {}
 var resbtntxt = '';
-
-function RPCwrapper(data, CB, dojson) {
-       if(dojson) {
-               dojo.xhrPost({
-                       url: 'index.php',
-                       load: CB,
-                       handleAs: "json",
-                       error: errorHandler,
-                       content: data,
-                       timeout: 30000
-               });
-       }
-       else {
-               dojo.xhrPost({
-                       url: 'index.php',
-                       load: CB,
-                       error: errorHandler,
-                       content: data,
-                       timeout: 30000
-               });
-       }
+var waittimetimeout = null;
+var durationchanged = 0;
+var initialimageset = 0;
+var resconfigmapid = 0;
+var revisiongrids;
+var waittimeobj;
+var waittimeh;
+
+var profilesstoredata = {
+       identifier: 'id',
+       label: 'name',
+       items: []
 }
 
 function generalReqCB(data, ioArgs) {
@@ -45,46 +36,502 @@ function generalReqCB(data, ioArgs) {
        document.body.style.cursor = 'default';
 }
 
+function initViewRequests(imaging) {
+       if(typeof(dijit) == "undefined" ||
+          typeof(dijit.byId) == "undefined" ||
+          typeof(images) == "undefined") {
+               setTimeout(function() {initViewRequests(imaging);}, 100);
+               return;
+       }
+       if(dijit.byId('deployimage'))
+               setLastImage();
+       if(imaging) {
+               if(imagingaccess == 0) {
+                       var btn = new dijit.form.Button({
+                               label: 'Close'
+                       });
+                       var dlg = new dijit.Dialog({
+                               id: 'noimageaccessdlg',
+                               title: 'Create / Update an Image',
+                               content: 'You do not have access to create or 
update any images.<br><br>',
+                               style: 'width: 300px; text-align: center;',
+                               closable: false
+                       });
+                       
dojo.style(dijit.byId('noimageaccessdlg').closeButtonNode, 'display', 'none');
+                       dlg.containerNode.appendChild(btn.domNode);
+                       dojo.connect(btn, "onClick", function () 
{dlg.destroy();});
+                       dlg.show();
+               }
+               else {
+                       dojo.byId('imagingrdo').checked = true;
+                       selectResType();
+                       dijit.byId('newResDlg').show();
+               }
+       }
+       setTimeout(function() {initialimageset = 1;}, 1);
+}
+
+function showNewResDlg() {
+       resetNewResDlg();
+       if(dojo.byId('basicrdo')) {
+               selectResType();
+               selectEnvironment();
+       }
+       if(dijit.byId('newResDlgBtn'))
+               dijit.byId('newResDlgBtn').set('disabled', false);
+       dijit.byId('newResDlg').show();
+}
+
+function resetNewResDlg() {
+       if(! dijit.byId('deployimage'))
+               return;
+       setLastImage();
+       dojo.byId('basicrdo').checked = true;
+       selectResType();
+       dijit.byId('deployprofileid').reset();
+       dijit.byId('deployname').reset();
+       resetSelect('deployadmingroup');
+       resetSelect('deploylogingroup');
+       //dijit.byId('deployfixedMAC').reset();
+       //dijit.byId('deploymonitored').reset();
+       dijit.byId('deployfixedIP').reset();
+       dijit.byId('deploynetmask').reset();
+       dijit.byId('deployrouter').reset();
+       dijit.byId('deploydns').reset();
+       resetSelect('deploystartday');
+       resetSelect('deployhour');
+       resetSelect('deploymin');
+       resetSelect('deploymeridian');
+       dojo.byId('startnow').checked = true;
+       if(dijit.byId('deploystartdate')) {
+               dijit.byId('deploystartdate')._hasBeenBlurred = false;
+               dijit.byId('deploystartdate').reset();
+       }
+       if(dijit.byId('deploystarttime')) {
+               dijit.byId('deploystarttime')._hasBeenBlurred = false;
+               dijit.byId('deploystarttime').reset();
+       }
+       if(dijit.byId('deployenddate')) {
+               dijit.byId('deployenddate')._hasBeenBlurred = false;
+               dijit.byId('deployenddate').reset();
+       }
+       if(dijit.byId('deployendtime')) {
+               dijit.byId('deployendtime')._hasBeenBlurred = false;
+               dijit.byId('deployendtime').reset();
+       }
+       resetSelect('reqlength');
+       if(dojo.byId('endduration'))
+               setTimeout(function() {
+                       // have to reset again to clear warning icons
+                       dijit.byId('deployendtime').reset();
+                       dijit.byId('deployenddate').reset();
+                       dojo.byId('endduration').checked = true;
+               }, 1);
+       dojo.byId('deployerr').innerHTML = '';
+}
+
+function setLastImage() {
+       var sel = dijit.byId('deployimage');
+       sel.set('value', lastimageid);
+       checkSelectedInList();
+}
+
+function selectResType() {
+       if(dojo.byId('basicrdo').checked || dojo.byId('imagingrdo').checked) {
+               dojo.removeClass('limitstart', 'hidden');
+               dojo.removeClass('durationend', 'hidden');
+               dojo.addClass('whentitleserver', 'hidden');
+               dojo.addClass('deployprofileslist', 'hidden');
+               dojo.addClass('nrnamespan', 'hidden');
+               dojo.addClass('nrservergroupspan', 'hidden');
+               //dojo.addClass('nrmacaddrspan', 'hidden');
+               //dojo.addClass('nrmonitoredspan', 'hidden');
+               dojo.addClass('nrfixedipdiv2', 'hidden');
+               dojo.addClass('anystart', 'hidden');
+               dojo.addClass('indefinteend', 'hidden');
+               //hideDijitButton('newResDlgShowConfigBtn'); // finishconfigs
+               if(dojo.byId('openend').value == 1) {
+                       dojo.removeClass('endlbl', 'hidden');
+                       dojo.removeClass('specifyend', 'hidden');
+               }
+               else {
+                       dojo.addClass('endlbl', 'hidden');
+                       dojo.addClass('specifyend', 'hidden');
+               }
+               if(dojo.byId('endat') && ! dojo.byId('endat').checked) {
+                       dojo.byId('endduration').checked = true;
+                       delayedUpdateWaitTime(0, 50);
+               }
+       }
+       if(dojo.byId('basicrdo').checked) {
+               dijit.byId('deployimage').set('query', {basic: 1, checkout: 1});
+               checkSelectedInList();
+               var imageid = getSelectValue('deployimage');
+               var item = dijit.byId('deployimage').get('item');
+               var max = imagestore.getValue(item, 'maxinitialtime');
+               if(max)
+                       setMaxRequestLength(max);
+               else
+                       setMaxRequestLength(defaultMaxTime);
+               dojo.removeClass('whentitlebasic', 'hidden');
+               dojo.addClass('whentitleimaging', 'hidden');
+               if(! durationchanged)
+                       dojo.byId('reqlength').value = 60;
+       }
+       if(dojo.byId('imagingrdo').checked) {
+               dijit.byId('deployimage').set('query', {imaging: 1});
+               checkSelectedInList();
+               setMaxRequestLength(maximaging);
+               dojo.removeClass('whentitleimaging', 'hidden');
+               dojo.addClass('whentitlebasic', 'hidden');
+               if(! durationchanged)
+                       dojo.byId('reqlength').value = 480;
+       }
+       if(dojo.byId('serverrdo').checked) {
+               dijit.byId('deployimage').set('query', {server: 1, checkout: 
1});
+               checkSelectedInList();
+               dijit.byId('deploystarttime').set('required', true);
+               dijit.byId('deploystartdate').set('required', true);
+               dojo.addClass('waittime', 'hidden');
+               dojo.addClass('deployerr', 'hidden');
+               if(dojo.hasClass('anystart', 'hidden') &&
+                  dojo.byId('startlater') &&
+                  dojo.byId('startlater').checked) {
+                       delayedUpdateWaitTime(0, 50);
+               }
+               dojo.addClass('whentitlebasic', 'hidden');
+               dojo.addClass('whentitleimaging', 'hidden');
+               dojo.addClass('limitstart', 'hidden');
+               dojo.addClass('durationend', 'hidden');
+               dojo.removeClass('whentitleserver', 'hidden');
+               if(profilesstore._arrayOfAllItems.length != 0)
+                       dojo.removeClass('deployprofileslist', 'hidden');
+               dojo.removeClass('nrnamespan', 'hidden');
+               dojo.removeClass('nrservergroupspan', 'hidden');
+               //dojo.removeClass('nrmacaddrspan', 'hidden');
+               //dojo.removeClass('nrmonitoredspan', 'hidden');
+               dojo.removeClass('nrfixedipdiv2', 'hidden');
+               dojo.removeClass('anystart', 'hidden');
+               dojo.removeClass('indefinteend', 'hidden');
+               dojo.removeClass('endlbl', 'hidden');
+               dojo.removeClass('specifyend', 'hidden');
+               //showDijitButton('newResDlgShowConfigBtn'); // finishconfigs
+               if(dojo.byId('endat') && ! dojo.byId('endat').checked) {
+                       dojo.byId('endindef').checked = true;
+                       delayedUpdateWaitTime(0, 50);
+               }
+       }
+       resetDeployBtnLabel();
+       resizeRecenterDijitDialog('newResDlg');
+}
+
+function checkSelectedInList() {
+       var sel = dijit.byId('deployimage');
+       var q = new Object();
+       for(v in sel.query)
+               q[v] = sel.query[v];
+       q.id = sel.get('value');
+       sel.store.fetch({
+               query: q,
+               onComplete: function(items, request) {
+                       if(items.length == 0)
+                               setFirstAvailableImage();
+               }
+       });
+}
+
+function setFirstAvailableImage() {
+       var sel = dijit.byId('deployimage');
+       sel.store.fetch({
+               query: sel.query,
+               onItem: function(item, request) {
+                       sel.set('value', item['id']);
+               },
+               count: 1
+       });
+}
+
 function selectEnvironment() {
-       var imageid = getSelectValue('imagesel');
-       if(maxTimes[imageid])
-               setMaxRequestLength(maxTimes[imageid]);
+       if(! initialimageset)
+               return;
+       var imageid = getSelectValue('deployimage');
+       var item = dijit.byId('deployimage').get('item');
+       var max = imagestore.getValue(item, 'maxinitialtime');
+       if(max)
+               setMaxRequestLength(max);
        else
                setMaxRequestLength(defaultMaxTime);
-       updateWaitTime(1);
+       dijit.byId('deployname').reset();
+       delayedUpdateWaitTime(1, 50);
+}
+
+function delayedUpdateWaitTime(cleardesc, time) {
+       clearTimeout(waittimetimeout);
+       waittimetimeout = setTimeout(function() {updateWaitTime(cleardesc);}, 
time);
 }
 
 function updateWaitTime(cleardesc) {
        if(! dojo.byId('waittime'))
                return;
-       var desconly = 0;
+       dojo.addClass('waittime', 'hidden');
+       if(! validateDeployInputs()) {
+               if(cleardesc) {
+                       getImageDescription();
+                       if(dojo.byId('serverrdo').checked)
+                               configureSystem();
+               }
+               return;
+       }
+       dijit.byId('newResDlgBtn').set('disabled', false);
        if(cleardesc)
                dojo.byId('imgdesc').innerHTML = '';
-       dojo.byId('waittime').innerHTML = '';
-       if(! dojo.byId('timenow').checked) {
-               dojo.byId('waittime').className = 'hidden';
-               desconly = 1;
-       }
-       if(dojo.byId('openend') &&
-          dojo.byId('openend').checked) {
-               dojo.byId('waittime').className = 'hidden';
-               desconly = 1;
-       }
-       var imageid = getSelectValue('imagesel');
-       if(dojo.byId('reqlength'))
-               var length = dojo.byId('reqlength').value;
+       var data = getDeployData(1);
+       data.continuation = dojo.byId('waitcontinuation').value;
+       document.body.style.cursor = 'wait';
+       /*if(typeof waittimeobj !== 'undefined')
+               waittimeobj.cancel();
+       waittimeobj = RPCwrapper(data, generalReqCB, 0, 30000);*/
+       RPCwrapper(data, generalReqCB, 0, 30000);
+       if(dojo.byId('serverrdo').checked)
+               configureSystem();
+}
+
+function validateDeployInputs() {
+       if(dijit.byId('deployimage') &&
+          ! checkValidatedObj('deployimage')) {
+               dijit.byId('newResDlgBtn').set('disabled', true);
+               return false;
+       }
+       if(dojo.byId('endat').checked &&
+          (! dijit.byId('deployenddate').isValid() ||
+          ! dijit.byId('deployendtime').isValid())) {
+               dijit.byId('newResDlgBtn').set('disabled', true);
+          if(! checkValidatedObj('deployenddate', 'deployerr') ||
+             ! checkValidatedObj('deployendtime', 'deployerr'))
+                       return false;
+       }
+       if(dojo.byId('serverrdo').checked &&
+          dojo.byId('startlater') && dojo.byId('startlater').checked &&
+          (! dijit.byId('deploystartdate').isValid() ||
+          ! dijit.byId('deploystarttime').isValid())) {
+               dijit.byId('newResDlgBtn').set('disabled', true);
+          if(! checkValidatedObj('deploystartdate', 'deployerr') ||
+             ! checkValidatedObj('deploystarttime', 'deployerr'))
+                       return false;
+       }
+       if(dojo.byId('serverrdo').checked &&
+          dijit.byId('deployfixedIP') &&
+          ! checkValidatedObj('deployfixedIP', 'deployerr')) {
+               return false;
+       }
+       var now = new Date();
+       now.setMilliseconds(0);
+       var nowts = parseInt(now.getTime() / 1000);
+       if(dojo.byId('startlater').checked) {
+               if(dojo.byId('serverrdo').checked) {
+                       var start = dijit.byId('deploystartdate').get('value');
+                       var time = dijit.byId('deploystarttime').get('value');
+                       start.setHours(time.getHours());
+                       start.setMinutes(time.getMinutes());
+                       var teststart = parseInt(start.getTime() / 1000);
+                       if(start < now) {
+                               dojo.byId('deployerr').innerHTML = _('The start 
day and time must be in the future.');
+                               dojo.removeClass('deployerr', 'hidden');
+                               dijit.byId('newResDlgBtn').set('disabled', 
true);
+                               return false;
+                       }
+               }
+               else {
+                       var tmp = dojo.byId('deploystartday').value;
+                       var teststart = new Date(tmp * 1000);
+                       var hour = parseInt(dojo.byId('deployhour').value);
+                       var m = dojo.byId('deploymeridian').value;
+                       if(m == 'pm' && hour < 12)
+                               hour += 12;
+                       else if(m == 'am' && hour == 12)
+                               hour = 0;
+                       teststart.setHours(hour);
+                       teststart.setMinutes(dojo.byId('deploymin').value);
+                       teststart.setSeconds(0);
+                       if(teststart < now) {
+                               dojo.byId('deployerr').innerHTML = _('The start 
day and time must be in the future.');
+                               dojo.removeClass('deployerr', 'hidden');
+                               dijit.byId('newResDlgBtn').set('disabled', 
true);
+                               return false;
+                       }
+                       teststart = parseInt(teststart.getTime() / 1000);
+               }
+       }
+       if(dojo.byId('endat') && dojo.byId('endat').checked) {
+               var end = dijit.byId('deployenddate').get('value');
+               var time = dijit.byId('deployendtime').get('value');
+               end.setHours(time.getHours());
+               end.setMinutes(time.getMinutes());
+               var endts = parseInt(end.getTime() / 1000);
+               if(nowts + 1800 > endts) {
+                       dojo.byId('deployerr').innerHTML = _('The end time must 
be at least 30 minutes in the future.');
+                       dojo.removeClass('deployerr', 'hidden');
+                       dijit.byId('newResDlgBtn').set('disabled', true);
+                       return false;
+               }
+               if(dojo.byId('startnow').checked) {
+                       var teststart = new Date();
+                       teststart.setMilliseconds(0);
+                       teststart = parseInt(teststart.getTime() / 1000);
+               }
+               if(teststart > endts) {
+                       dojo.byId('deployerr').innerHTML = _('The end time must 
be after the start time.');
+                       dojo.removeClass('deployerr', 'hidden');
+                       dijit.byId('newResDlgBtn').set('disabled', true);
+                       return false;
+               }
+               if(teststart + 1800 > endts) {
+                       dojo.byId('deployerr').innerHTML = _('The end time is 
too close to the start time.');
+                       dojo.removeClass('deployerr', 'hidden');
+                       dijit.byId('newResDlgBtn').set('disabled', true);
+                       return false;
+               }
+       }
+       if(! dojo.byId('serverrdo').checked)
+               return true;
+
+       if(! checkValidatedObj('deployname', 'deployerr') ||
+          ! checkValidatedObj('deployadmingroup', 'deployerr') ||
+          ! checkValidatedObj('deploylogingroup', 'deployerr') ||
+          //! checkValidatedObj('deployfixedMAC', 'deployerr') ||
+          ! checkValidatedObj('deploynetmask', 'deployerr') ||
+          ! checkValidatedObj('deployrouter', 'deployerr') ||
+          ! checkValidatedObj('deploydns', 'deployerr'))
+               return false;
+       return true;
+}
+
+function getDeployData(waitonly) {
+       var data = {imageid: getSelectValue('deployimage')}
+       if(dojo.byId('startlater').checked) {
+               if(dojo.byId('serverrdo').checked) {
+                       var start = dijit.byId('deploystartdate').get('value');
+                       var time = dijit.byId('deploystarttime').get('value');
+                       start.setHours(time.getHours());
+                       start.setMinutes(time.getMinutes());
+                       data.start = parseInt(start.getTime() / 1000);
+               }
+               else {
+                       var tmp = dojo.byId('deploystartday').value;
+                       var date = new Date(tmp * 1000);
+                       var hour = parseInt(dojo.byId('deployhour').value);
+                       var m = dojo.byId('deploymeridian').value;
+                       if(m == 'pm' && hour < 12)
+                               hour += 12;
+                       else if(m == 'am' && hour == 12)
+                               hour = 0;
+                       date.setHours(hour);
+                       date.setMinutes(dojo.byId('deploymin').value);
+                       date.setSeconds(0);
+                       data.start = parseInt(date.getTime() / 1000);
+               }
+       }
+       else {
+               data.start = 'zero';
+       }
+       if(dojo.byId('endindef') && dojo.byId('endindef').checked) {
+               data.ending = 'indefinite';
+       }
+       else if(dojo.byId('endat') && dojo.byId('endat').checked) {
+               data.ending = 'endat';
+               var end = dijit.byId('deployenddate').get('value');
+               var time = dijit.byId('deployendtime').get('value');
+               end.setHours(time.getHours());
+               end.setMinutes(time.getMinutes());
+               data.end = parseInt(end.getTime() / 1000);
+       }
+       else {
+               data.ending = 'duration';
+               data.duration = dojo.byId('reqlength').value;
+       }
+       if(dojo.byId('basicrdo').checked)
+               data.type = 'basic';
+       else if(dojo.byId('imagingrdo').checked)
+               data.type = 'imaging';
+       else if(dojo.byId('serverrdo').checked)
+               data.type = 'server';
+       if(dojo.byId('serverrdo').checked &&
+          dijit.byId('deployfixedIP') &&
+          dijit.byId('deployfixedIP').get('value') != '') {
+               data.fixedIP = dijit.byId('deployfixedIP').get('value');
+       }
+       if(waitonly)
+               return data;
+
+       // finishconfigs
+       /*if(dojo.byId('serverrdo').checked)
+               data.configdata = getConfigData();*/
+       data.profileid = dojo.byId('appliedprofileid').value;
+       data.name = dijit.byId('deployname').get('value');
+       data.admingroupid = getSelectValue('deployadmingroup');
+       data.logingroupid = getSelectValue('deploylogingroup');
+       data.ipaddr = dijit.byId('deployfixedIP').get('value');
+       if(data.ipaddr != '') {
+               data.netmask = dijit.byId('deploynetmask').get('value');
+               data.router = dijit.byId('deployrouter').get('value');
+               data.dns = dijit.byId('deploydns').get('value');
+       }
+       else {
+               data.netmask = '';
+               data.router = '';
+               data.dns = '';
+       }
+       /*data.macaddr = dijit.byId('deployfixedMAC').get('value');
+       if(dijit.byId('deploymonitored').get('value') == 'on')
+               data.monitored = 1;
        else
-               var length = 480;
-       var contid = dojo.byId('waitcontinuation').value;
-       var data = {continuation: contid,
-                   imageid: imageid,
-                   length: length,
-                   desconly: desconly};
-       if(! desconly)
-               dojo.byId('waittime').className = 'shown';
-       //setLoading();
-   document.body.style.cursor = 'wait';
-       RPCwrapper(data, generalReqCB);
+               data.monitored = 0;*/
+       return data;
+}
+
+function getConfigData() {
+       var configdata = [];
+       var tmp = configlist.store._getItemsArray();
+       for(var i = 0; i < tmp.length; i++) {
+               var cfg = '';
+               var ids = tmp[i]['id'][0].split('/');
+               cfg  = '"' + tmp[i]['id'];
+               cfg += '":{"id":"' + tmp[i]['id'];
+               cfg += '","applied":"' + tmp[i]['applied'];
+               if(parseInt(ids[1]) < 0) {
+                       cfg += '","configid":"' + tmp[i]['configid'];
+                       cfg += '","configstageid":"' + tmp[i]['configstageid'];
+                       cfg += '","imageid":"' + tmp[i]['imageid'];
+               }
+               cfg += '"}';
+               configdata.push(cfg);
+       }
+       var allcfgs = configdata.join(',');
+
+       var configvardata = [];
+       var tmp = dijit.byId('configvariables').store._getItemsArray();
+       for(var i = 0; i < tmp.length; i++) {
+               var cfgvar = '';
+               cfgvar  = '"' + tmp[i]['id'];
+               cfgvar += '":{"id":"' + tmp[i]['id'];
+               cfgvar += '","value":"' + 
tmp[i]['defaultvalue'][0].replace(/\n/g, '\\n');
+               cfgvar += '"}';
+               configvardata.push(cfgvar);
+       }
+       var allcfgvars = configvardata.join(',');
+       return '{"configs":{' + allcfgs + '},"configvars":{' + allcfgvars + 
'}}';
+       //return '{"configs":{' + allcfgs + '}}';
+}
+
+function getImageDescription() {
+       if(dijit.byId('deployimage') &&
+          ! checkValidatedObj('deployimage'))
+               return;
+       dojo.byId('imgdesc').innerHTML = '';
+       var data = {continuation: dojo.byId('waitcontinuation').value,
+                   desconly: 1,
+                   imageid: getSelectValue('deployimage')}
+       RPCwrapper(data, generalReqCB, 0, 30000);
 }
 
 function showSuggestedTimes() {
@@ -95,10 +542,11 @@ function showSuggestedTimes() {
        dijit.byId('suggestedTimes').show();
        dojo.byId('suggestContent').innerHTML = '';
        dojo.removeClass('suggestloading', 'hidden');
+       dijit.byId('suggestDlgBtn').set('disabled', true);
        showDijitButton('suggestDlgBtn');
        dijit.byId('suggestDlgCancelBtn').set('label', _('Cancel'));
        var data = {continuation: dojo.byId('suggestcont').value};
-       RPCwrapper(data, showSuggestedTimesCB, 1);
+       RPCwrapper(data, showSuggestedTimesCB, 1, 30000);
        document.body.style.cursor = 'wait';
 }
 
@@ -137,39 +585,67 @@ function setSuggestSlot(slot) {
        dijit.byId('suggestDlgBtn').set('disabled', false);
 }
 
-function useSuggestedSlot() {
+function useSuggestedEditSlot() {
        var slot = suggestTimeData[dojo.byId('selectedslot').value];
-       dojo.byId('laterradio').checked = true;
-       var s = new Date(parseInt(slot['startts'] + '000'));
-       dojo.byId('reqday').value = dojox.string.sprintf('%d/%d/%d', 
s.getMonth() + 1, s.getDate(), s.getFullYear());
-       var hm = get12from24(s.getHours());
-       dojo.byId('reqhour').value = hm['hour'];
-       dojo.byId('reqmeridian').value = hm['meridian'];
-       var min = s.getMinutes();
-       if(min == 0)
-               dojo.byId('reqmin').value = 'zero';
+       var start = parseInt(slot['startts'] + '000');
+       var s = new Date(start);
+       if(slot['startts'] == dojo.byId('selectedslot').value)
+               var e = new Date(start + parseInt(slot['duration'] + '000'));
        else
-               dojo.byId('reqmin').value = min;
-       dojo.byId('reqlength').value = slot['duration'] / 60;
-       dojo.byId('waittime').className = 'hidden';
+               var e = new Date(parseInt(dojo.byId('selectedslot').value + 
'000'));
+       var testend = new Date(2038, 0, 1, 0, 0, 0, 0);
+       if(dojo.byId('deploystartday')) {
+               var sel = dojo.byId('deploystartday');
+               for(var i = 0; i < sel.options.length; i++) {
+                       var testdate = new Date(parseInt(sel.options[i].value + 
'000'));
+                       if(s.getDay() == testdate.getDay()) {
+                               sel.value = sel.options[i].value;
+                               break;
+                       }
+               }
+               var hour = s.getHours();
+               if(hour == 0) {
+                       dojo.byId('deployhour').value = 12;
+                       dojo.byId('deploymeridian').value = 'am';
+               }
+               else if(hour == 12) {
+                       dojo.byId('deployhour').value = 12;
+                       dojo.byId('deploymeridian').value = 'pm';
+               }
+               else if(hour > 12) {
+                       dojo.byId('deployhour').value = hour - 12;
+                       dojo.byId('deploymeridian').value = 'pm';
+               }
+               else {
+                       dojo.byId('deployhour').value = hour;
+                       dojo.byId('deploymeridian').value = 'am';
+               }
+               dojo.byId('deploymin').value = s.getMinutes();
+               dojo.byId('startlater').checked = true;
+       }
+       if(dojo.byId('endduration') && dojo.byId('endduration').checked)
+               dojo.byId('reqlength').value = parseInt(slot['duration'] / 60);
+       if(dojo.byId('endat') && dojo.byId('endat').checked) {
+               dijit.byId('deployenddate').set('value', e);
+               dijit.byId('deployendtime').set('value', e);
+       }
+       if(dojo.byId('startlater') && dojo.byId('startlater').checked) {
+               dijit.byId('deploystartdate').set('value', s);
+               dijit.byId('deploystarttime').set('value', s);
+       }
        dijit.byId('suggestedTimes').hide();
-       updateWaitTime(0);
+       delayedUpdateWaitTime(0, 50);
 }
 
 function selectLater() {
        dojo.byId('laterradio').checked = true;
-       if(dojo.byId('newsubmit')) {
+       if(dijit.byId('newResDlgBtn')) {
                if(resbtntxt != '')
-                       dojo.byId('newsubmit').value = resbtntxt;
+                       dijit.byId('newResDlgBtn').set('label', resbtntxt);
                else
-                       dojo.byId('newsubmit').value = _('Create Reservation');
+                       dijit.byId('newResDlgBtn').set('label', _('Create 
Reservation'));
        }
-       dojo.byId('waittime').innerHTML = '';
-}
-
-function selectDuration() {
-       if(dojo.byId('durationradio'))
-               dojo.byId('durationradio').checked = true;
+       dojo.addClass('waittime', 'hidden');
 }
 
 function selectLength() {
@@ -205,14 +681,82 @@ function setOpenEnd() {
                                     t.getMinutes());
 }
 
+function setStartNow() {
+       dijit.byId('deploystarttime').set('required', false);
+       dijit.byId('deploystartdate').set('required', false);
+       dojo.addClass('waittime', 'hidden');
+       dojo.addClass('deployerr', 'hidden');
+       delayedUpdateWaitTime(0, 1000);
+       resetDeployBtnLabel();
+}
+
+function setStartLater() {
+       dojo.byId('startlater').checked = true;
+       if(dojo.byId('basicrdo').checked) {
+               dijit.byId('deploystarttime').set('required', false);
+               dijit.byId('deploystartdate').set('required', false);
+       }
+       else {
+               dijit.byId('deploystarttime').set('required', true);
+               dijit.byId('deploystartdate').set('required', true);
+       }
+       dojo.addClass('deployerr', 'hidden');
+       dojo.addClass('waittime', 'hidden');
+       delayedUpdateWaitTime(0, 1000);
+       resetDeployBtnLabel();
+}
+
+function durationChange() {
+       durationchanged = 1;
+}
+
+function setEndDuration() {
+       if(dojo.byId('endduration'))
+               dojo.byId('endduration').checked = true;
+       dijit.byId('deployendtime').set('required', false);
+       dijit.byId('deployenddate').set('required', false);
+       dojo.addClass('deployerr', 'hidden');
+       dojo.addClass('waittime', 'hidden');
+       delayedUpdateWaitTime(0, 1000);
+       resetDeployBtnLabel();
+}
+
+function setEndIndef() {
+       dijit.byId('deployendtime').set('required', false);
+       dijit.byId('deployenddate').set('required', false);
+       dojo.addClass('deployerr', 'hidden');
+       dojo.addClass('waittime', 'hidden');
+       delayedUpdateWaitTime(0, 1000);
+       resetDeployBtnLabel();
+}
+
+function setEndAt() {
+       dojo.byId('endat').checked = true;
+       dijit.byId('deployendtime').set('required', true);
+       dijit.byId('deployenddate').set('required', true);
+       dojo.addClass('deployerr', 'hidden');
+       dojo.addClass('waittime', 'hidden');
+       delayedUpdateWaitTime(0, 1000);
+       resetDeployBtnLabel();
+}
+
+function resetDeployBtnLabel() {
+       if(dojo.byId('basicrdo').checked)
+               dijit.byId('newResDlgBtn').set('label', _("Create 
Reservation"));
+       if(dojo.byId('imagingrdo').checked)
+               dijit.byId('newResDlgBtn').set('label', _("Create Imaging 
Reservation"));
+       if(dojo.byId('serverrdo').checked)
+               dijit.byId('newResDlgBtn').set('label', _("Deploy Server"));
+}
+
 function checkValidImage() {
        if(resSubmitted)
                return false;
-       if(dijit.byId('imagesel') && ! dijit.byId('imagesel').isValid()) {
+       if(dijit.byId('deployimage') && ! dijit.byId('deployimage').isValid()) {
                alert(_('Please select a valid environment.'));
                return false;
        }
-       if(dojo.byId('newsubmit').value == _('View Available Times')) {
+       if(dijit.byId('newResDlgBtn').get('label') == _('View Available 
Times')) {
                showSuggestedTimes();
                return false;
        }
@@ -226,6 +770,8 @@ function setMaxRequestLength(minutes) {
        var text;
        var newminutes;
        var tmp;
+       var saveduration = obj.options[obj.selectedIndex].value;
+       var saveindex = obj.selectedIndex;
        for(i = obj.length - 1; i >= 0; i--) {
                if(parseInt(obj.options[i].value) > minutes)
                        obj.options[i] = null;
@@ -271,6 +817,422 @@ function setMaxRequestLength(minutes) {
                }
                obj.options[i + 1] = new Option(text, newminutes);
        }
+       if(saveindex > i)
+               obj.value = minutes;
+       else
+               obj.value = saveduration;
+}
+
+function configureSystem() {
+       return; // finishconfigs
+       var data = {continuation: dojo.byId('configcont').value,
+                   imageid: getSelectValue('deployimage')};
+       RPCwrapper(data, configureSystemCB, 1, 30000);
+}
+
+function configureSystemCB(data, ioArgs) {
+       var vardata = {identifier: 'id', label: 'name', items: 
data.items.configs};
+       var newstore = new dojo.data.ItemFileWriteStore({data: vardata});
+       var oldstore = configlist.store;
+       configlist.setStore(newstore);
+       delete oldstore;
+
+       var vardata2 = {identifier: 'id', label: 'name', items: 
data.items.variables};
+       var newstore2 = new dojo.data.ItemFileWriteStore({data: vardata2});
+       oldstore = dijit.byId('configvariables').store;
+       dijit.byId('configvariables').setStore(newstore2, '', {query: {id: 
''}});
+       delete oldstore;
+       
+       // finishconfigs
+       /*if(data.items.configs.length == 0)
+               dijit.byId('newResDlgShowConfigBtn').set('disabled', true);
+       else
+               dijit.byId('newResDlgShowConfigBtn').set('disabled', false);*/
+
+       if(dijit.byId('clustertree'))
+               dijit.byId('clustertree').destroy();
+       if(data.items.cluster) {
+               dojo.removeClass('clusterdiv', 'hidden');
+               var treedata = {identifier: 'id', label: 'image', items: 
data.items.subimages};
+               var store = new dojo.data.ItemFileReadStore({data: treedata});
+               var model = new dijit.tree.ForestStoreModel({
+                       store: store,
+                       query: {id: '*'},
+                       rootId: 'root',
+                       rootLabel: 
dijit.byId('deployimage').attr('displayedValue'),
+                       childrenAttrs: ['children']
+               });
+               var div = document.createElement('div');
+               dojo.byId('treeparent').appendChild(div);
+               var tree = dijit.Tree({model: model, id: 'clustertree', 
onClick: subimageSelected}, div);
+       }
+       else {
+               dojo.addClass('clusterdiv', 'hidden');
+       }
+}
+
+function showConfigureSystem() {
+       if(dojo.hasClass('clusterdiv', 'hidden'))
+               setTimeout(function() {configlist.setQuery({id: '*'});}, 1);
+       else
+               setTimeout(function() {
+                       configlist.setQuery({id: '0/*', cluster: 0});
+                       var tree = dijit.byId('clustertree');
+                       tree.attr('path', ['root']);
+                       var node = tree._itemNodesMap['root'];
+                       tree.focusNode(node[0]);
+               }, 1);
+       dojo.addClass('configdatadiv', 'hidden');
+       dijit.byId('newResConfigDlg').show();
+}
+
+function closeConfigureSystem() {
+       dijit.byId('newResConfigDlg').hide();
+       saveSelectedConfig();
+       if(configlist.selection.selectedIndex >= 0)
+               
configlist.selection.setSelected(configlist.selection.selectedIndex, false);
+       dojo.byId('configtype').innerHTML = '';
+       dojo.byId('configapplychk').checked = false;
+       dojo.byId('configkey').innerHTML = '';
+       dijit.byId('configvalueint').reset();
+       dijit.byId('configvaluefloat').reset();
+       dijit.byId('configvaluestring').reset();
+       dijit.byId('configvaluetext').reset();
+       dojo.addClass('configvalint', 'hidden');
+       dojo.removeClass('configvalstring', 'hidden');
+       
dijit.byId('configvariables').setStore(dijit.byId('configvariables').store, '', 
{query: {configid: ''}});
+}
+
+function subimageSelected(item) {
+       if(item.id == 'root')
+               var searchid = 0;
+       else
+               var searchid = item.id[0];
+       configlist.setQuery({id: searchid + '/*', cluster: 0});
+       configlist.selection.clear();
+       dojo.byId('configtype').innerHTML = '';
+       dojo.byId('configapplychk').checked = false;
+       dojo.addClass('configdatadiv', 'hidden');
+}
+
+function addReservationConfig() {
+       var item = dijit.byId('addconfigsel').get('item');
+       var newitem = {};
+       var node = dijit.byId('clustertree').selectedItem;
+       if(node.id == 'root') {
+               var subimageid = 0;
+               var imageid = dijit.byId('deployimage').value;
+       }
+       else {
+               var subimageid = node.id[0];
+               var imageid = node.childimageid[0];
+       }
+       newitem.configmaptype = 'Reservation';
+       resconfigmapid--;
+       //newitem.configmaptypeid = '5'; // TODO rather not hard code this
+       newitem.configid = item.id;
+       newitem.id = subimageid + '/' + resconfigmapid;
+       newitem.config = item.name;
+       newitem.configdata = item.data;
+       newitem.subid = 1;
+       newitem.affiliationid = 1;
+       newitem.affiliation = '';
+       newitem.configstageid = 1; // TODO set this from another select object
+       newitem.configstage = '';
+       newitem.subimageid = null;
+       newitem.configsubimageid = null;
+       newitem.disabled = 0;
+       newitem.configmapid = resconfigmapid;
+       newitem.cluster = 0;
+       newitem.applied = true;
+       newitem.configdata = item.data;
+       newitem.ownerid = item.ownerid;
+       newitem.owner = item.owner;
+       newitem.configtype = item.configtype;
+       newitem.configtypeid = item.configtypeid;
+       newitem.imageid = imageid;
+       configlist.store.newItem(newitem);
+       setTimeout(function() {configlist.setQuery({id: subimageid + '/*', 
cluster: 0});}, 1);
+       for(var i = 0; i < item.variables.length; i++) {
+               var fromvar = item.variables[i];
+               var newvar = {};
+               newvar.id =  newitem.id + '/' + fromvar.id; // 
configid/configvariableid - configid is of form configsubimageid/configmapid
+               newvar.name = fromvar.name;
+               newvar.description = '';
+               newvar.configid = fromvar.configid;
+               newvar.type = '';
+               newvar.datatype = fromvar.datatype;
+               newvar.datatypeid = fromvar.datatypeid;
+               newvar.defaultvalue = fromvar.defaultvalue;
+               newvar.required = fromvar.required;
+               newvar.identifier = fromvar.identifier;
+               newvar.ask = parseInt(fromvar.ask);
+               dijit.byId('configvariables').store.newItem(newvar);
+       }
+}
+
+function configSelected(rowIndex) {
+       var item = configlist.getItem(rowIndex);
+       var store = configlist.store;
+       dojo.byId('configtype').innerHTML = store.getValue(item, 'configtype');
+       var optional = store.getValue(item, 'optional');
+       if(! optional) {
+               dojo.byId('configapplychk').checked = true;
+               dojo.byId('configapplychk').disabled = true;
+       }
+       else {
+               dojo.byId('configapplychk').disabled = false;
+               if(store.getValue(item, 'applied'))
+                       dojo.byId('configapplychk').checked = true;
+               else
+                       dojo.byId('configapplychk').checked = false;
+       }
+
+       var configtype = store.getValue(item, 'configtype');
+       if(configtype == 'VLAN' || configtype == 'Cluster')
+               dojo.addClass('configdatadiv', 'hidden');
+       else {
+               dijit.byId('viewconfigdatabtn').set('disabled', false);
+               dijit.byId('configvariables').set('disabled', false);
+               
dijit.byId('configvariables').setStore(dijit.byId('configvariables').store, '', 
{query: {id: store.getValue(item, 'id') + '/*', ask: 1}});
+               if(dijit.byId('configvariables').options.length)
+                       dojo.removeClass('configvariablediv', 'hidden');
+               else
+                       dojo.addClass('configvariablediv', 'hidden');
+               dojo.removeClass('configdatadiv', 'hidden');
+       }
+}
+
+function setApplyConfig() {
+       var item = configlist.getItem(configlist.selection.selectedIndex);
+       var store = configlist.store;
+       if(dojo.byId('configapplychk').checked)
+               store.setValue(item, 'applied', true);
+       else
+               store.setValue(item, 'applied', false);
+}
+
+function showConfigData() {
+       var item = configlist.getItem(configlist.selection.selectedIndex);
+       var store = configlist.store;
+       var data = store.getValue(item, 'configdata');
+       dijit.byId('configdatadlg').set('content', data.replace(/\n/g, "<br>"));
+}
+
+function selectConfigVariable() {
+       var store = dijit.byId('configvariables').store;
+       store.fetch({
+               query: {id: dijit.byId('configvariables').get('value')},
+               onItem: function(item, request) {
+                       dojo.byId('configkey').innerHTML = store.getValue(item, 
'identifier');
+                       var type = store.getValue(item, 'datatype');
+                       var value = store.getValue(item, 'defaultvalue');
+                       dojo.addClass('configvalbool', 'hidden');
+                       dojo.addClass('configvalint', 'hidden');
+                       dojo.addClass('configvalfloat', 'hidden');
+                       dojo.addClass('configvalstring', 'hidden');
+                       dojo.addClass('configvaltext', 'hidden');
+                       dojo.removeClass('configval' + type, 'hidden');
+                       dijit.byId('configvalue' + type).set('value', value);
+                       if(store.getValue(item, 'required'))
+                               dojo.byId('configrequired').innerHTML = 'yes';
+                       else
+                               dojo.byId('configrequired').innerHTML = 'no';
+               }
+       });
+}
+
+function saveSelectedConfig() {
+       if(configlist.selection.selectedIndex < 0)
+               return;
+       var item = configlist.getItem(configlist.selection.selectedIndex);
+       var store = configlist.store;
+       if(store.getValue(item, 'optional') && 
dojo.byId('configapplychk').checked)
+               store.setValue(item, 'applied', true);
+}
+
+function saveSelectedConfigVar() {
+       var store = dijit.byId('configvariables').store;
+       store.fetch({
+               query: {id: dijit.byId('configvariables').get('value')},
+               onItem: function(item, request) {
+                       var type = store.getValue(item, 'datatype');
+                       store.setValue(item, 'defaultvalue', 
dijit.byId('configvalue' + type).get('value'));
+               }
+       });
+}
+
+function promptRevisions() {
+       document.body.style.cursor = 'wait';
+       var item = dijit.byId('deployimage').get('item');
+       var imageid = imagestore.getValue(item, 'id');
+       if(dijit.byId('imageRevisionDlg'))
+               dijit.byId('imageRevisionDlg').destroyRecursive();
+       var divall = document.createElement('div');
+       var div1 = document.createElement('div');
+       div1.innerHTML = _("There are multiple versions of this environment 
available.") + "<br>" +
+                             _("Please select the version you would like to 
check out:");
+       divall.appendChild(div1);
+       var div2 = document.createElement('div');
+       div2.id = 'imageRevisionContent';
+       div2.style.height = "85%";
+       div2.style.width = "88%";
+       div2.style.overflow = "auto";
+       divall.appendChild(div2);
+       var div3 = document.createElement('div');
+       div3.style.textAlign = "center";
+       var btn1 = new dijit.form.Button({
+               id: 'imageRevBtn',
+               label: dijit.byId('newResDlgBtn').label,
+       }, document.createElement('div'));
+       dojo.connect(btn1, 'onClick', submitNewReservation);
+       div3.appendChild(btn1.domNode);
+       var btn2 = new dijit.form.Button({
+               label: _('Cancel'),
+       }, document.createElement('div'));
+       dojo.connect(btn2, 'onClick', function() 
{dijit.byId('imageRevisionDlg').hide();});
+       div3.appendChild(btn2.domNode);
+       divall.appendChild(div3);
+       var dlg = new dijit.Dialog({
+               id: 'imageRevisionDlg',
+               title: _('Select Image Revisions'),
+               content: divall,
+               width: "50%",
+               style: "width: 50%",
+               autofocus: false
+       });
+       detailimagestore.get(imageid).then(promptRevisionsCB);
+}
+
+function promptRevisionsCB(item) {
+       revisiongrids = new Array();
+       addRevisionSelection(item);
+       if(! dojo.byId('imagingrdo').checked &&
+          item.imagemetaid != null &&
+       item.subimages.length) {
+               for(var i = 0; i < item.subimages.length; i++) {
+                       
detailimagestore.get(item.subimages[i]).then(function(item) 
{addRevisionSelection(item);});
+               }
+       }
+       dijit.byId('newResDlgBtn').set('disabled', false);
+       if(! dojo.byId('imagingrdo').checked &&
+          item.imagemetaid != null &&
+       item.subimages.length)
+               setTimeout(function() {showRevisionDlg(item.subimages.length + 
1);}, 100);
+       else
+               showRevisionDlg(1);
+}
+
+function addRevisionSelection(item) {
+       var mstore = new dojo.store.Memory({data: item.imagerevision});
+       var wrapper = new dojo.data.ObjectStore({objectStore: mstore});
+       var layout = [
+               {field: 'revision', name: 'Revision', width: '60px'},
+               {field: 'user', name: 'User', width: '130px'},
+               {field: 'prettydate', name: 'Created', width: '110px'},
+               {field: 'production', name: 'Production', width: '60px'}
+       ];
+       var div = document.createElement('div');
+       div.style.width = "100%";
+       var grid = new dojox.grid.DataGrid(
+               {
+                       store: wrapper,
+                       structure: layout,
+                       autoHeight: true
+               },
+               div
+       );
+       grid.startup();
+       var node = document.createElement('b');
+       node.innerHTML = '<br><big>' + item.prettyname + ':</big>';
+       dojo.byId('imageRevisionContent').appendChild(node);
+       dojo.byId('imageRevisionContent').appendChild(grid.domNode);
+       grid.render();
+       var newobj = new Object();
+       newobj.grid = grid;
+       newobj.imageid = item.id;
+       revisiongrids.push(newobj);
+}
+
+function showRevisionDlg(count) {
+       if(revisiongrids.length == count) {
+               var waiting = 0;
+               for(var i = 0; i < count; i++) {
+                       revisiongrids[i].grid.render();
+                       if(! revisiongrids[i].grid._isLoaded) {
+                               waiting = 1;
+                               break;
+                       }
+               }
+               if(! waiting) {
+                       document.body.style.cursor = 'default';
+                       dijit.byId('imageRevisionDlg').show();
+                       
dijit.byId('imageRevisionDlg').domNode.childNodes[3].style.width = "96%";
+                       return;
+               }
+       }
+       setTimeout(function() {showRevisionDlg(count);}, 100);
+}
+
+function submitNewReservation() {
+       if(! validateDeployInputs()) {
+               return;
+       }
+       if(dijit.byId('newResDlgBtn').get('label') == _('View Available 
Times')) {
+               showSuggestedTimes();
+               return;
+       }
+       if(! dijit.byId('imageRevisionDlg') || ! 
dijit.byId('imageRevisionDlg').open) {
+               var item = dijit.byId('deployimage').get('item');
+               if(imagestore.getValue(item, 'revisions')) {
+                       dijit.byId('newResDlgBtn').set('disabled', true);
+                       promptRevisions();
+                       return;
+               }
+       }
+       var data = getDeployData(0);
+       if(dijit.byId('imageRevisionDlg') && 
dijit.byId('imageRevisionDlg').open) {
+               revids = new Array();
+               for(var i = 0; i < revisiongrids.length; i++) {
+                       var sel = revisiongrids[i].grid.selection.getSelected();
+                       if(sel.length)
+                               revids.push(sel[0].id);
+                       else
+                               revids.push(0);
+               }
+               data.revisionid = revids.join(':');
+               dijit.byId('imageRevBtn').set('label', _('Working...'));
+               dijit.byId('imageRevBtn').set('disabled', true);
+       }
+       else {
+               dijit.byId('newResDlgBtn').set('disabled', true);
+       }
+       data.continuation = dojo.byId('deploycont').value;
+       RPCwrapper(data, submitNewReservationCB, 1, 30000);
+}
+
+function submitNewReservationCB(data, ioArgs) {
+       if(dijit.byId('imageRevisionDlg') && 
dijit.byId('imageRevisionDlg').open) {
+               dijit.byId('imageRevisionDlg').hide();
+               dojo.byId('imageRevisionContent').innerHTML = '';
+               dijit.byId('imageRevBtn').set('label', 
dijit.byId('newResDlgBtn').label);
+               dijit.byId('imageRevBtn').set('disabled', false);
+       }
+       dijit.byId('newResDlgBtn').set('disabled', false);
+       if(data.items.err == 1) {
+               dojo.removeClass('deployerr', 'hidden');
+               dojo.byId('deployerr').innerHTML = data.items.errmsg;
+               dojo.byId('waittime').innerHTML = '';
+               return;
+       }
+       else if(data.items.err == 2) {
+               delayedUpdateWaitTime(0, 50);
+               return;
+       }
+       else if(data.items.err == 0) {
+               resRefresh();
+               dijit.byId('newResDlg').hide();
+       }
 }
 
 function checkTimeouts() {
@@ -302,7 +1264,7 @@ function resRefresh() {
                    incdetails: incdetails};
        if(dojo.byId('detailreqid'))
                data.reqid = dojo.byId('detailreqid').value;
-       RPCwrapper(data, generalReqCB);
+       RPCwrapper(data, generalReqCB, 0, 30000);
 }
 
 function showResStatusPane(reqid) {
@@ -340,8 +1302,18 @@ function showWindow(name) {
        obj.show();
 }
 
+function connectRequest(cont) {
+       RPCwrapper({continuation: cont}, connectRequestCB, 1);
+}
+
+function connectRequestCB(data, ioArgs) {
+       dijit.byId('connectDlgContent').set('content', data.items.html);
+       dijit.byId('connectDlg').show();
+       setTimeout(checkConnectTimeout, 15000);
+}
+
 function endReservation(cont) {
-       RPCwrapper({continuation: cont}, endReservationCB, 1);
+       RPCwrapper({continuation: cont}, endReservationCB, 1, 30000);
 }
 
 function endReservationCB(data, ioArgs) {
@@ -360,7 +1332,7 @@ function submitDeleteReservation() {
        if(dojo.byId('radioprod')) {
                if(dojo.byId('radioprod').checked) {
                        var cont = dojo.byId('radioprod').value;
-                       RPCwrapper({continuation: cont}, endReservationCB, 1);
+                       RPCwrapper({continuation: cont}, endReservationCB, 1, 
30000);
                        return;
                }
                else if(dojo.byId('radioend').checked)
@@ -374,11 +1346,11 @@ function submitDeleteReservation() {
        dojo.byId('endResDlgContent').innerHTML = '';
        dijit.byId('endResDlg').hide();
    document.body.style.cursor = 'wait';
-       RPCwrapper(data, generalReqCB);
+       RPCwrapper(data, generalReqCB, 0, 30000);
 }
 
 function removeReservation(cont) {
-       RPCwrapper({continuation: cont}, removeReservationCB, 1);
+       RPCwrapper({continuation: cont}, removeReservationCB, 1, 30000);
 }
 
 function removeReservationCB(data, ioArgs) {
@@ -398,12 +1370,12 @@ function submitRemoveReservation() {
        dojo.byId('remResDlgContent').innerHTML = '';
        dijit.byId('remResDlg').hide();
    document.body.style.cursor = 'wait';
-       RPCwrapper(data, generalReqCB);
+       RPCwrapper(data, generalReqCB, 0, 30000);
 }
 
 function editReservation(cont) {
    document.body.style.cursor = 'wait';
-       RPCwrapper({continuation: cont}, editReservationCB, 1);
+       RPCwrapper({continuation: cont}, editReservationCB, 1, 30000);
 }
 
 function editReservationCB(data, ioArgs) {
@@ -421,6 +1393,14 @@ function editReservationCB(data, ioArgs)
                dijit.byId('editResDlgBtn').set('style', 'display: none');
                dijit.byId('editResCancelBtn').set('label', _('Okay'));
        }
+       else if(data.items.status == 'noindefinite') {
+               dijit.byId('editResDlgBtn').set('style', 'display: inline');
+               dijit.byId('editResCancelBtn').set('label', _('Cancel'));
+               dojo.byId('editrescont').value = data.items.cont;
+               dojo.byId('editresid').value = data.items.requestid;
+               dojo.addClass('indefinitelabel', 'disabledlabel');
+               dojo.byId('indefiniteradio').disabled = true;
+       }
        else {
                dijit.byId('editResDlgBtn').set('style', 'display: inline');
                dijit.byId('editResCancelBtn').set('label', _('Cancel'));
@@ -479,44 +1459,6 @@ function editResOpenEnd() {
                                     t.getMinutes());
 }
 
-function useSuggestedEditSlot() {
-       var slot = suggestTimeData[dojo.byId('selectedslot').value];
-       var tmp = parseInt(slot['startts'] + '000');
-       var s = new Date(tmp);
-       if(slot['startts'] == dojo.byId('selectedslot').value)
-               var e = new Date(tmp + parseInt(slot['duration'] + '000'));
-       else
-               var e = new Date(parseInt(dojo.byId('selectedslot').value + 
'000'));
-       var testend = new Date(2038, 0, 1, 0, 0, 0, 0);
-       if(dijit.byId('day')) {
-               var day = dojox.string.sprintf('%d%02d%02d', s.getFullYear(), 
s.getMonth() + 1, s.getDate());
-               dijit.byId('day').set('value', day);
-       }
-       if(dijit.byId('editstarttime'))
-               dijit.byId('editstarttime').set('value', s);
-       if(! dojo.byId('indefiniteradio') || e < testend) {
-               if(dijit.byId('openenddate'))
-                       dijit.byId('openenddate').set('value', e);
-               if(dijit.byId('openendtime'))
-                       dijit.byId('openendtime').set('value', e);
-       }
-
-       var len = slot['duration'] / 60; 
-       if(dojo.byId('indefiniteradio') && e >= testend) {
-               dojo.byId('indefiniteradio').checked = true;
-       }
-       else if(dijit.byId('length') && 
dijit.byId('length').getOptions(len.toString())) {
-               dijit.byId('length').set('value', len);
-               if(dojo.byId('lengthradio'))
-                       dojo.byId('lengthradio').checked = true;
-       }
-       else if(dojo.byId('dateradio')) {
-               dojo.byId('dateradio').checked = true;
-       }
-
-       dijit.byId('suggestedTimes').hide();
-}
-
 function submitEditReservation() {
        if(dijit.byId('editResDlgBtn').get('label') == _('View Available 
Times')) {
                dijit.byId('suggestDlgBtn').set('disabled', true);
@@ -574,7 +1516,7 @@ function submitEditReservation() {
                data.endmode = 'indefinite';
        }
        document.body.style.cursor = 'wait';
-       RPCwrapper(data, submitEditReservationCB, 1);
+       RPCwrapper(data, submitEditReservationCB, 1, 30000);
 }
 
 function submitEditReservationCB(data, ioArgs) {
@@ -613,7 +1555,7 @@ function submitEditReservationCB(data, i
 
 function checkResGone(reqids) {
        var editresid = dojo.byId('editresid').value;
-       if(editresid == '')
+       if(editresid == '' || editresid == 'undefined')
                return;
        for(var i = 0; i < reqids.length; i++) {
                if(editresid == reqids[i])
@@ -658,7 +1600,7 @@ function submitRebootReservation() {
        else
                data.reboottype = 0;
        dijit.byId('rebootdlg').hide();
-       RPCwrapper(data, generalReqCB);
+       RPCwrapper(data, generalReqCB, 0, 30000);
 }
 
 function hideReinstallResDlg() {
@@ -672,7 +1614,7 @@ function showReinstallRequest(cont) {
        dojo.removeClass('reinstallloading', 'hidden');
        dijit.byId('reinstalldlg').show();
        var data = {continuation: cont};
-       RPCwrapper(data, showReinstallRequestCB, 1);
+       RPCwrapper(data, showReinstallRequestCB, 1, 30000);
        document.body.style.cursor = 'wait';
 }
 
@@ -702,7 +1644,7 @@ function submitReinstallReservation() {
                }
        }
        document.body.style.cursor = 'wait';
-       RPCwrapper(data, submitReinstallReservationCB, 1);
+       RPCwrapper(data, submitReinstallReservationCB, 1, 30000);
 }
 
 function submitReinstallReservationCB(data, ioArgs) {
@@ -725,6 +1667,8 @@ function submitReinstallReservationCB(da
        }
 }
 
+// TODO get this working
+// talk to Andy about preventing vcld from deleting the connecttimeout entry 
until the end of the reservation
 function checkConnectTimeout() {
        var nextcheck = 15;
        if(! dojo.byId('timeoutvalue'))
@@ -734,7 +1678,7 @@ function checkConnectTimeout() {
        var now = (tmp.getTime() - tmp.getMilliseconds()) / 1000;
        if(timeout <= now) {
                var cont = dojo.byId('refreshcont').value;
-               RPCwrapper({continuation: cont}, checkConnectTimeoutCB, 1);
+               RPCwrapper({continuation: cont}, checkConnectTimeoutCB, 1, 
30000);
                return;
        }
        else if(timeout - now < nextcheck) {
@@ -753,34 +1697,3 @@ function checkConnectTimeoutCB(data, ioA
        }
 }
 
-function showRDPbutton() {
-       // submitted by Gerhard Harti from ODU
-       if(! dojo.byId('counterdiv') || ! dojo.byId('connectdiv'))
-               return;
-       var timeInterval = 2;
-       if(typeof timeInterval === 'undefined' || parseInt(timeInterval) <= 0) {
-               timeInterval = 1
-       }
-       dojo.addClass('connectdiv', 'hidden');
-       dojo.removeClass('counterdiv', 'hidden');
-       if(timeInterval == 1)
-               dojo.byId('counterdiv').innerHTML = _(' Ready to connect in ') 
+ timeInterval + _(' second');
-       else
-               dojo.byId('counterdiv').innerHTML = _(' Ready to connect in ') 
+ timeInterval + _(' seconds');
-       var si = setInterval(function() {
-               if(timeInterval === 0) {
-                       clearInterval(si);
-               } else {
-                       timeInterval--;
-                       if(timeInterval !== 0) {
-                               if(timeInterval == 1)
-                                       dojo.byId('counterdiv').innerHTML = _(' 
Ready to connect in ') + timeInterval + _(' second');
-                               else
-                                       dojo.byId('counterdiv').innerHTML = _(' 
Ready to connect in ') + timeInterval + _(' seconds');
-                       } else {
-                               dojo.addClass('counterdiv', 'hidden');
-                               dojo.removeClass('connectdiv', 'hidden');
-                       }
-               }
-       }, 1000);
-}


Reply via email to