blob: dd08e374a822c53c0c50df53c7326b3f38f4b3e5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function Computer() {
Resource.apply(this, Array.prototype.slice.call(arguments));
this.selids = [];
this.selectingall = false;
this.restype = 'computer';
}
Computer.prototype = new Resource();
var filterstore;
var filtercbstores = {};
var extrafiltergrid;
var savescroll = 0;
var editobj;
var addedit = 'edit';
var lastselected = {blade: {provisioningid: '', stateid: ''},
lab: {provisioningid: '', stateid: ''},
virtualmachine: {provisioningid: '', stateid: ''}};
var filterdelay;
String.prototype.ucfirst = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
}
Computer.prototype.DeleteBtn = function(rscid, rowIndex) {
var rowdata = this.grid.getItem(rowIndex);
if(! ('deleted' in rowdata) || rowdata.deleted == '0') {
var id = 'chkb' + rowdata.id;
if(dojo.indexOf(resource.selids, id) != -1)
var checked = true;
else
var checked = false;
var cb = new dijit.form.CheckBox({
id: id,
value: rowdata.id,
checked: checked,
onClick: selectRow
});
cb._destroyOnRemove = true;
return cb;
}
// resource has deleted set
return ' ';
}
Computer.prototype.EditBtn = function(rscid, rowIndex) {
var rowdata = this.grid.getItem(rowIndex);
if(! ('deleted' in rowdata) || rowdata.deleted == '0') {
var btn = new dijit.form.Button({
label: 'Edit',
onClick: function() {
editResource(rscid);
}
});
}
else {
var btn = new dijit.form.Button({
label: 'Undelete',
onClick: function() {
toggleDeleteResource(rscid);
}
});
}
btn._destroyOnRemove = true;
return btn;
}
Computer.prototype.colformatter = function(value, rowIndex, obj) {
if(obj.field == 'state') {
if(value == 'failed')
return '<span class="rederrormsg">failed</span>';
if(value == 'available')
return '<span class="ready">available</span>';
if(value == 'reloading')
return '<span class="wait">reloading</span>';
}
else if(obj.field == 'notes' && value) {
return value.replace('@', '<br>').replace(/\n/g, '<br>');
}
else if(obj.field == 'deleted' ||
obj.field == 'natenabled' ||
obj.field == 'nathostenabled') {
if(value == "0")
return '<span class="rederrormsg">false</span>';
if(value == "1")
return '<span class="ready">true</span>';
}
return value;
}
Computer.prototype.toggleResFieldDisplay = function(obj, field) {
for(var i in resourcegrid.layout.cells) {
if(resourcegrid.layout.cells[i].field == field) {
if(obj.checked) {
resourcegrid.layout.setColumnVisibility(i, true);
extrafiltergrid.layout.setColumnVisibility(i, true);
}
else {
resourcegrid.layout.setColumnVisibility(i, false);
extrafiltergrid.layout.setColumnVisibility(i, false);
delete resourcegrid.query[field];
resourcegrid.setQuery(resourcegrid.query);
}
break;
}
}
this.updateFieldCookie(field, obj.checked);
}
Computer.prototype.GridFilter = function() {
if(dijit.byId('showdeleted').get('value')) {
var width = '5.1em';
var showdeleted = '*';
}
else {
var width = '3em';
var showdeleted = '0';
}
resourcegrid.setCellWidth(1, width);
resourcegrid.layout.cells[1].view.update();
extrafiltergrid.setCellWidth(1, width);
extrafiltergrid.layout.cells[1].view.update();
var query = resourcegrid.query;
query['deleted'] = showdeleted;
resourcegrid.setQuery(query);
}
function filterKeyDown(e) {
if(e.keyCode == dojo.keys.ENTER) {
dojo.stopEvent(e);
dijit.byId('ownercb').focus();
var focusnext = 0;
var cells = extrafiltergrid.layout.cells;
for(var i = 2; i < cells.length; i++) {
if(focusnext && ! cells[i].hidden) {
dijit.byId(cells[i].field + 'cb').focus();
focusnext = 2;
break;
}
if(cells[i].field + 'cb' == e.target.id) {
focusnext = 1;
continue;
}
}
if(focusnext == 1)
dijit.byId(cells[2].field + 'cb').focus();
}
}
Computer.prototype.Selection = function() {
// TODO this messes up when all rows have been selected with selectAllRows
// and then a row is unselected because this function only handles
// rendered rows
var sel = resourcegrid.selection.selected;
if(! resource.selectingall) {
dojo.forEach(resource.selids, function(id) {
if(dijit.byId(id))
dijit.byId(id).set('checked', false);
});
resource.selids = [];
}
for(var i = 0; i < sel.length; i++) {
if(sel[i]) {
var comp = resourcegrid.getItem(i);
if(! resource.selectingall) {
if(! parseInt(comp.deleted))
resource.selids.push('chkb' + comp.id);
else
resourcegrid.selection.deselect(comp);
}
if(dijit.byId('chkb' + comp.id))
dijit.byId('chkb' + comp.id).set('checked', true);
}
}
if(resource.selids.length != resourcegrid.rowCount)
dijit.byId('selectallchkb').set('checked', false);
else
dijit.byId('selectallchkb').set('checked', true);
}
Computer.prototype.nocasesort = function(a, b) {
var al = a.toLowerCase();
var bl = b.toLowerCase();
if(al.match(/[0-9]/) ||
bl.match(/[0-9]/)) {
return resource.comparehostnames(al, bl);
}
if(al < bl)
return -1;
if(bl < al)
return 1;
return 0;
}
Computer.prototype.ipsort = function(a, b) {
var aparts = a.split('.');
var bparts = b.split('.');
for(var i = 0; i < 4; i++) {
aparts[i] = parseInt(aparts[i]);
bparts[i] = parseInt(bparts[i]);
}
if(aparts[0] < bparts[0])
return -1;
if(aparts[0] > bparts[0])
return 1;
if(aparts[1] < bparts[1])
return -1;
if(aparts[1] > bparts[1])
return 1;
if(aparts[2] < bparts[2])
return -1;
if(aparts[2] > bparts[2])
return 1;
if(aparts[3] < bparts[3])
return -1;
if(aparts[3] > bparts[3])
return 1;
return 0;
}
Computer.prototype.comparehostnames = function(a, b) {
// get hostname
var tmp = a.split('.');
var h1 = tmp.shift();
var letters1 = h1.replace(/([^a-zA-Z])/g, '');
tmp = b.split('.');
var h2 = tmp.shift();
var letters2 = h2.replace(/([^a-zA-Z])/g, '');
// if non-numeric part is different, return based on that
cmp = letters1.localeCompare(letters2);
if(cmp)
return cmp;
// at this point, the only difference is in the numbers
var digits1 = h1.replace(/([^\d-])/g, '');
var digits1Arr = digits1.split('-');
var digits2 = h2.replace(/([^\d-])/g, '');
var digits2Arr = digits2.split('-');
var len1 = digits1Arr.length;
var len2 = digits2Arr.length;
for(var i = 0; i < len1 && i < len2; i++) {
if(parseInt(digits1Arr[i]) < parseInt(digits2Arr[i]))
return -1;
else if(parseInt(digits1Arr[i]) > parseInt(digits2Arr[i]))
return 1;
}
return 0;
}
var resource = new Computer();
function initPage() {
if(dojo.byId('reloadpageurl'))
return;
document.body.style.cursor = 'wait';
if(! ('resourcegrid' in window)) {
setTimeout(function() {
initPage();
}, 100);
return;
}
else {
document.body.style.cursor = 'default';
buildExtraFilters();
// set width of first column
resourcegrid.setCellWidth(0, '21px');
resourcegrid.layout.cells[0].view.update();
// connect selection
dojo.connect(resourcegrid, 'onSelectionChanged', this, resource.Selection);
// hide resource name filter
dojo.addClass('namefilter', 'hidden');
// connect scrolling stuff
dojo.connect(resourcegrid, 'postrender', setScroll);
dojo.connect(resourcegrid.views.views[0].scrollboxNode, 'onscroll', saveScroll);
// select all computer groups
for(var i = 0; i < dojo.byId('filtercompgroups').options.length; i++) {
dojo.byId('filtercompgroups').options[i].selected = true;
}
// confirm new nathost button
if(dijit.byId('newnathostid').options.length == 0)
dijit.byId('newnathostbtn').set('disabled', true);
clearTimeout(filterdelay);
if(! resourcestore.comparatorMap) {
resourcestore.comparatorMap = {};
}
resourcestore.comparatorMap['ram'] = resource.nocasesort;
resourcestore.comparatorMap['procnumber'] = resource.nocasesort;
resourcestore.comparatorMap['procspeed'] = resource.nocasesort;
resourcestore.comparatorMap['network'] = resource.nocasesort;
resourcestore.comparatorMap['IPaddress'] = resource.ipsort;
resourcestore.comparatorMap['privateIPaddress'] = resource.ipsort;
dojo.connect(resourcegrid, '_onFetchComplete', function() {dojo.byId('computercount').innerHTML = 'Computers in table: ' + resourcegrid.rowCount;});
}
}
function selectRow(e) {
var id = this.id.replace('chkb', '');
if(this.checked) {
resource.selids.push(this.id);
resourcestore.fetchItemByIdentity({
identity: id,
onItem: function(item, req) {
resourcegrid.selection.addToSelection(resourcegrid.getItemIndex(item));
}
});
}
else {
var index = resource.selids.indexOf(id);
if(index > -1)
resource.selids.splice(index, 1);
resourcestore.fetchItemByIdentity({
identity: id,
onItem: function(item, req) {
resourcegrid.selection.deselect(resourcegrid.getItemIndex(item));
}
});
}
dojo.stopEvent(e);
}
function selectAllRows() {
resourcestore.fetch({
query: resourcegrid.query,
onComplete: function(items, request) {
resource.selectingall = true;
if(resource.selids.length) {
dojo.forEach(resource.selids, function(id) {
if(dijit.byId(id))
dijit.byId(id).set('checked', false);
});
resource.selids = [];
resourcegrid.selection.clear();
dijit.byId('selectallchkb').set('checked', false);
}
else {
resource.selids = [];
dojo.forEach(items, function(item) {
if(! parseInt(item.deleted)) {
resource.selids.push('chkb' + item.id);
resourcegrid.selection.addToSelection(resourcegrid.getItemIndex(item));
}
})
dijit.byId('selectallchkb').set('checked', true);
}
resource.selectingall = false;
}
});
}
function buildExtraFilters() {
// create grid layout
var obj = {};
var layout = [];
var cells = resourcegrid.layout.cells;
for(var i = 0; i < cells.length; i++) {
var litem = {};
obj[cells[i].field] = '';
litem['field'] = cells[i].field;
if(cells[i].field == 'id')
litem['name'] = '&nbsp;';
else
litem['name'] = cells[i].name;
litem['hidden'] = cells[i].hidden;
if(i == 0)
litem['width'] = '21px';
else if(typeof cells[i].width != 'undefined')
litem['width'] = cells[i].width;
litem['editable'] = false;
if(i == 0) {
litem['formatter'] = function(value, index, item) {
var cb = new dijit.form.CheckBox({
id: 'selectallchkb',
checked: false,
onClick: selectAllRows,
_destroyOnRemove: true
});
return cb;
}
}
if(i == 1) {
litem['formatter'] = function(value, index, item) {
item.customStyles.push('background-color: #e8e8e8');
item.customStyles.push('border: 1px solid black');
item.customStyles.push('text-align: center');
return '<span id=\"applyextrafilters\">Apply</span>';
}
}
else if(i > 1) {
litem['formatter'] = function(value, index, item) {
if(dijit.byId(item.field + 'cb'))
return dijit.byId(item.field + 'cb');
if(item.field in filtercbstores)
var store = filtercbstores[item.field];
else
var store = dojo.data.ItemFileReadStore({});
var cb = new dijit.form.ComboBox({
selectOnClick: true,
store: store,
id: item.field + "cb",
required: false,
query: {id: '*'},
onChange: applyExtraFilters,
field: item.field,
queryExpr: '*${0}*',
autoComplete: false,
labelFunc: cbformatter,
labelType: 'html',
searchAttr: 'value',
fetchProperties: {sort: [{attribute:"value"}]}
});
if(typeof item.width != 'undefined') {
if(item.width.match(/px/))
var newwidth = (parseInt(item.width) - 11) + 'px';
else
var newwidth = (parseInt(item.width) - 0.6) + 'em';
cb.set('style', {width: newwidth});
}
else if(typeof item.unitWidth != 'undefined') {
if(item.unitWidth.match(/px/))
var newwidth = (parseInt(item.unitWidth) - 11) + 'px';
else
var newwidth = (parseInt(item.unitWidth) - 0.6) + 'em';
cb.set('style', {width: newwidth});
}
return cb;
};
}
layout.push(litem);
}
var data = {items: [obj]};
filterstore = new dojo.data.ItemFileReadStore({data: data});
extrafiltergrid = new dojox.grid.DataGrid({
query: {name: '*'},
store: filterstore,
structure: layout,
canSort: function() {return false;},
onCellClick: combofocus,
autoWidth: true
}, document.createElement('div'));
dojo.byId('extrafiltersdiv').appendChild(extrafiltergrid.domNode);
extrafiltergrid.startup();
var cells = extrafiltergrid.layout.cells;
for(var i = 2; i < cells.length; i++) {
dojo.connect(dijit.byId(cells[i].field + 'cb'), 'onKeyDown', null, filterKeyDown);
}
// create stores for comboboxes
resourcestore.fetch({
onComplete: function(items, request) {
var data = {};
var seen = {};
var cells = resourcegrid.layout.cells;
dojo.forEach(items, function(item) {
for(var i = 0; i < cells.length; i++) {
if(cells[i].field == 'id')
continue;
var field = cells[i].field;
if(! (field in seen)) {
seen[field] = [];
data[field] = [];
}
if(dojo.indexOf(seen[field], item[field]) == -1) {
seen[field].push(item[field].toString());
data[field].push({id: item.id.toString(), value: item[cells[i].field].toString()});
}
}
});
for(var i = 0; i < cells.length; i++) {
if(cells[i].field == 'id')
continue;
var field = cells[i].field;
var store = new dojo.data.ItemFileReadStore({data: {identifier:'id', label:'value', items: data[field]}});
filtercbstores[field] = store;
dijit.byId(field + 'cb').set('store', store);
}
}
});
}
function cbformatter(item, store) {
var comp = new Computer();
return comp.colformatter(store.getValue(item, 'value'), '', this);
}
function combofocus(obj) {
if(dijit.byId(obj.cell.field + "cb"))
dijit.byId(obj.cell.field + "cb").focus();
}
function applyExtraFilters(value) {
delete resourcegrid.query[this.field];
value = value.replace('(', '\\(');
value = value.replace(')', '\\)');
if(this.field == 'state' && value == 'inuse')
resourcegrid.query[this.field] = value;
else if(value != '')
resourcegrid.query[this.field] = new RegExp('.*' + value + '.*', 'i');
resourcegrid.setQuery(resourcegrid.query);
dojo.byId('computercount').innerHTML = 'Computers in table: ' + resourcegrid.rowCount;
var savelist = resource.selids;
resourcegrid.selection.clear();
var newselids = [];
for(var i = 0; i < resourcegrid.rowCount; i++) {
var row = resourcegrid.getItem(i);
if(! row)
continue;
var id = 'chkb' + row.id;
if(dojo.indexOf(savelist, id) != -1) {
newselids.push(id);
resourcegrid.selection.addToSelection(resourcegrid.getItemIndex(row));
dijit.byId(id).set('checked', true);
}
}
resourcegrid.selids = newselids;
}
function addNewResource(title) {
if(dijit.byId('scheduleid').options.length == 0) {
dijit.byId('noschedulenoadd').show();
return;
}
dijit.byId('mode').set('value', 'single');
addedit = 'add';
resetEditResource();
dijit.byId('type').reset();
selectType();
dijit.byId('addeditdlg').set('title', title);
dijit.byId('addeditbtn').set('label', title);
dojo.byId('editresid').value = 0;
dojo.removeClass('singlemultiplediv', 'hidden');
dojo.addClass('notesspan', 'hidden');
dojo.addClass('vmprofilespan', 'hidden');
dojo.addClass('curimgspan', 'hidden');
dojo.addClass('compidspan', 'hidden');
dijit.byId('nathostid').set('disabled', true);
dijit.byId('nathostenabled').set('checked', false);
dijit.byId('natpublicipaddress').set('disabled', true);
dijit.byId('natinternalipaddress').set('disabled', true);
dijit.byId('addeditdlg').show();
}
function toggleSingleMultiple() {
if(dijit.byId('mode').get('value') == 'single')
toggleAddSingle();
else
toggleAddMultiple();
}
function toggleAddSingle() {
dojo.addClass('multiplenotediv', 'hidden');
dojo.addClass('startenddiv', 'hidden');
dojo.addClass('multiipmacdiv', 'hidden');
dojo.removeClass('singleipmacdiv', 'hidden');
dojo.removeClass('nathost', 'hidden');
dijit.byId('name').set('regExp', '^([a-zA-Z0-9_][-a-zA-Z0-9_\.]{1,35})$');
dijit.byId('addeditbtn').setLabel('Add Computer');
recenterDijitDialog('addeditdlg');
}
function toggleAddMultiple() {
dojo.removeClass('multiplenotediv', 'hidden');
dojo.removeClass('startenddiv', 'hidden');
dojo.removeClass('multiipmacdiv', 'hidden');
dojo.addClass('singleipmacdiv', 'hidden');
dojo.addClass('nathost', 'hidden');
dijit.byId('name').set('regExp', '^([a-zA-Z0-9_%][-a-zA-Z0-9_\.%]{1,35})$');
dijit.byId('addeditbtn').setLabel('Add Computers');
recenterDijitDialog('addeditdlg');
}
function toggleNAT(chkid, selid) {
if(dijit.byId(chkid).checked) {
dijit.byId(selid).set('disabled', false);
}
else {
dijit.byId(selid).set('disabled', true);
}
if(chkid == 'natenabled' &&
dijit.byId(chkid).checked &&
dijit.byId('nathostenabled').checked) {
dijit.byId('nathostenabled').set('checked', false);
}
}
function toggleNAThost() {
if(dijit.byId('nathostenabled').checked) {
if(dijit.byId('natenabled').checked)
dijit.byId('natenabled').set('checked', false);
dijit.byId('natpublicipaddress').set('disabled', false);
dijit.byId('natinternalipaddress').set('disabled', false);
}
else {
dijit.byId('natpublicipaddress').set('disabled', true);
dijit.byId('natinternalipaddress').set('disabled', true);
}
}
function inlineEditResourceCB(data, ioArgs) {
dojo.addClass('singlemultiplediv', 'hidden');
toggleAddSingle();
if(data.items.status == 'success') {
addedit = 'edit';
editobj = data.items.data;
dojo.addClass('cancelvmhostinuseokdiv', 'hidden');
if(data.items.showcancel) {
dojo.removeClass('cancelvmhostinusediv', 'hidden');
dojo.byId('tohostcancelcont').value = data.items.tohostcancelcont;
if(data.items.tohostfuture) {
dojo.addClass('tohostnowspan', 'hidden');
dojo.removeClass('tohostfuturespan', 'hidden');
dojo.byId('tohostfuturetimespan').innerHTML = data.items.tohoststart;
}
else {
dojo.removeClass('tohostnowspan', 'hidden');
dojo.addClass('tohostfuturespan', 'hidden');
}
}
else {
dojo.addClass('cancelvmhostinusediv', 'hidden');
}
dijit.byId('type').set('value', data.items.data.type);
selectType();
dijit.byId('provisioningid').set('value', data.items.data.provisioningid);
selectProvisioning();
lastselected[data.items.data.type]['provisioningid'] = data.items.data.provisioningid;
dijit.byId('stateid').set('value', data.items.data.stateid);
lastselected[data.items.data.type]['stateid'] = data.items.data.stateid;
dojo.byId('saveresourcecont').value = data.items.cont;
dijit.byId('addeditdlg').set('title', data.items.title);
dijit.byId('addeditbtn').set('label', 'Save Changes');
dijit.byId('addeditbtn').set('disabled', false);
dojo.byId('editresid').value = data.items.resid;
dijit.byId('name').set('value', data.items.data.hostname);
dijit.byId('owner').set('value', data.items.data.owner);
dijit.byId('ipaddress').set('value', data.items.data.IPaddress);
dijit.byId('privateipaddress').set('value', data.items.data.privateIPaddress);
dijit.byId('publicmac').set('value', data.items.data.eth1macaddress);
dijit.byId('privatemac').set('value', data.items.data.eth0macaddress);
if('notes' in data.items.data && data.items.data.notes) {
if(data.items.data.notes.match(/@/))
dijit.byId('notes').set('value', data.items.data.notes.split('@')[1]);
else
dijit.byId('notes').set('value', data.items.data.notes);
}
dijit.byId('vmprofileid').set('value', data.items.data.vmprofileid);
dijit.byId('platformid').set('value', data.items.data.platformid);
dijit.byId('scheduleid').set('value', data.items.data.scheduleid);
dojo.byId('curimg').innerHTML = data.items.data.currentimg;
dijit.byId('ram').set('value', data.items.data.ram);
dijit.byId('cores').set('value', data.items.data.procnumber);
dijit.byId('procspeed').set('value', data.items.data.procspeed);
dijit.byId('network').set('value', data.items.data.network);
dijit.byId('predictivemoduleid').set('value', data.items.data.predictivemoduleid);
dojo.byId('compid').innerHTML = data.items.data.id;
dijit.byId('location').set('value', data.items.data.location);
if(data.items.data.natenabled == 1) {
dijit.byId('natenabled').set('checked', true);
dijit.byId('nathostid').set('disabled', false);
dijit.byId('nathostid').set('value', data.items.data.nathostid);
}
else {
dijit.byId('natenabled').set('checked', false);
dijit.byId('nathostid').set('disabled', true);
}
if(data.items.data.nathostenabled == 1) {
dijit.byId('nathostenabled').set('checked', true);
dijit.byId('natpublicipaddress').set('disabled', false);
dijit.byId('natinternalipaddress').set('disabled', false);
dijit.byId('natpublicipaddress').set('value', data.items.data.natpublicIPaddress);
dijit.byId('natinternalipaddress').set('value', data.items.data.natinternalIPaddress);
}
else {
dijit.byId('nathostenabled').set('checked', false);
dijit.byId('natpublicipaddress').set('disabled', true);
dijit.byId('natinternalipaddress').set('disabled', true);
dijit.byId('natpublicipaddress').set('value', '');
dijit.byId('natinternalipaddress').set('value', '');
}
dojo.byId('addeditdlgerrmsg').innerHTML = '';
dijit.byId('addeditdlg').show();
}
else if(data.items.status == 'noaccess') {
alert('Access denied to edit this item');
}
}
function selectType() {
var type = dijit.byId('type').get('value');
var obj = dijit.byId('provisioningid');
obj.options = [];
dojo.forEach(options[type]['provisioning'], function(prov) {
obj.addOption(prov);
});
dijit.byId('provisioningid').set('value', lastselected[type]['provisioningid']);
var obj = dijit.byId('stateid');
obj.options = [];
if(addedit == 'edit') {
if(type == 'virtualmachine' && parseInt(editobj.vmhostid) > 0 &&
editobj.state != 'available')
obj.addOption({value: '2', label: 'available'});
obj.addOption({value: editobj.stateid, label: editobj.state});
}
dojo.forEach(options[type]['states'], function(state) {
if(addedit == 'edit' && state.value == editobj.stateid)
return;
if(addedit == 'add' && state.label == 'vmhostinuse' &&
dijit.byId('provisioningid').attr('displayedValue') != 'None')
return;
obj.addOption({value: state.value, label: state.label});
});
dijit.byId('stateid').set('value', lastselected[type]['stateid']);
if(type == 'blade' &&
dijit.byId('provisioningid').attr('displayedValue') == 'None' &&
dijit.byId('stateid').attr('displayedValue') == 'vmhostinuse')
dojo.removeClass('vmprofilespan', 'hidden');
else if(dijit.byId('stateid').attr('displayedValue') != 'vmhostinuse')
dojo.addClass('vmprofilespan', 'hidden');
if(addedit == 'edit' && dijit.byId('stateid').attr('displayedValue') == 'maintenance')
dojo.removeClass('notesspan', 'hidden');
else
dojo.addClass('notesspan', 'hidden');
}
function selectProvisioning() {
lastselected[dijit.byId('type').get('value')]['provisioningid'] = dijit.byId('provisioningid').get('value');
var obj = dijit.byId('stateid');
obj.options = [];
if(addedit == 'edit') {
if(dijit.byId('type').get('value') == 'virtualmachine' &&
parseInt(editobj.vmhostid) > 0 &&
editobj.state != 'available')
obj.addOption({value: '2', label: 'available'});
var addedexisting = false;
}
dojo.forEach(options[dijit.byId('type').get('value')]['states'], function(state) {
if(((dijit.byId('type').get('value') == 'blade' &&
dijit.byId('provisioningid').attr('displayedValue') == 'None') ||
(addedit == 'add' && dijit.byId('type').get('value') == 'virtualmachine')) &&
state.label == 'available')
return;
if(addedit == 'add' && state.label == 'vmhostinuse' &&
dijit.byId('provisioningid').attr('displayedValue') != 'None')
return;
if(addedit == 'edit' && state.value == editobj.stateid)
addedexisting = true;
obj.addOption({value: state.value, label: state.label});
});
if(addedit == 'edit' && ! addedexisting)
obj.addOption({value: editobj.stateid, label: editobj.state});
dijit.byId('stateid').set('value', lastselected[dijit.byId('type').get('value')]['stateid']);
}
function selectState() {
lastselected[dijit.byId('type').get('value')]['stateid'] = dijit.byId('stateid').get('value');
if(dijit.byId('type').get('value') == 'blade' &&
dijit.byId('stateid').attr('displayedValue') == 'vmhostinuse')
dojo.removeClass('vmprofilespan', 'hidden');
else if(dijit.byId('stateid').attr('displayedValue') != 'vmhostinuse')
dojo.addClass('vmprofilespan', 'hidden');
if(addedit == 'edit' && dijit.byId('stateid').attr('displayedValue') == 'maintenance')
dojo.removeClass('notesspan', 'hidden');
else
dojo.addClass('notesspan', 'hidden');
}
function resetEditResource() {
var fields = ['name', 'owner', 'type', 'ipaddress', 'privateipaddress',
'publicmac', 'privatemac', 'provisioningid', 'stateid',
'vmprofileid', 'platformid', 'scheduleid', 'ram', 'cores',
'procspeed', 'network', 'location', 'startnum', 'endnum',
'startpubipaddress', 'endpubipaddress', 'startprivipaddress',
'endprivipaddress', 'startmac', 'notes', 'predictivemoduleid',
'natpublicipaddress', 'natinternalipaddress'];
for(var i = 0; i < fields.length; i++) {
dijit.byId(fields[i]).reset();
}
dojo.byId('curimg').innerHTML = '';
dojo.byId('compid').innerHTML = '';
dojo.byId('addeditdlgerrmsg').innerHTML = '';
dojo.removeClass('notesspan', 'hidden');
dojo.removeClass('vmprofilespan', 'hidden');
dojo.removeClass('curimgspan', 'hidden');
dojo.removeClass('compidspan', 'hidden');
dijit.byId('natenabled').set('checked', false);
dijit.byId('nathostid').set('disabled', true);
}
function saveResource() {
var errobj = dojo.byId('addeditdlgerrmsg');
if(addedit == 'edit' || dijit.byId('mode').get('value') == 'single')
var fields = ['name', 'owner', 'ipaddress', 'privateipaddress', 'publicmac',
'privatemac', 'ram', 'cores', 'procspeed', 'location',
'natpublicipaddress', 'natinternalipaddress'];
else
var fields = ['name', 'startnum', 'endnum', 'owner', 'startpubipaddress',
'endpubipaddress', 'startprivipaddress', 'endprivipaddress',
'startmac', 'ram', 'cores', 'procspeed', 'location',
'natpublicipaddress', 'natinternalipaddress'];
for(var i = 0; i < fields.length; i++) {
if(! checkValidatedObj(fields[i], errobj))
return;
}
if(addedit == 'add')
var data = {continuation: dojo.byId('addresourcecont').value};
else
var data = {continuation: dojo.byId('saveresourcecont').value};
if(addedit == 'edit' && dijit.byId('stateid').attr('displayedValue') == 'maintenance') {
if(! dijit.byId('notes').get('value').match(/^([-a-zA-Z0-9_\. ,#\(\)=\+:;]{0,5000})$/)) {
errobj.innerHTML = "Maintenance reason can be up to 5000 characters long and may only<br>contain letters, numbers, spaces and these characters: - , . _ # ( ) = + : ;";
return;
}
else
data['notes'] = dijit.byId('notes').get('value');
}
else
data['notes'] = '';
for(var i = 0; i < fields.length; i++) {
data[fields[i]] = dijit.byId(fields[i]).get('value');
}
data['type'] = dijit.byId('type').get('value');
data['provisioningid'] = dijit.byId('provisioningid').get('value');
data['stateid'] = dijit.byId('stateid').get('value');
data['vmprofileid'] = dijit.byId('vmprofileid').get('value');
data['platformid'] = dijit.byId('platformid').get('value');
data['scheduleid'] = dijit.byId('scheduleid').get('value');
data['network'] = dijit.byId('network').get('value');
data['predictivemoduleid'] = dijit.byId('predictivemoduleid').get('value');
data['natenabled'] = dijit.byId('natenabled').get('value');
if(data['natenabled'] == 1)
data['nathostid'] = dijit.byId('nathostid').get('value');
else {
data['natenabled'] = 0;
data['nathostid'] = 0;
}
data['nathostenabled'] = dijit.byId('nathostenabled').get('value');
if(data['nathostenabled'] == 1) {
if(data['natenabled'] == 1) {
errobj.innerHTML = "Connect Using NAT and Use as NAT Host cannot both be checked";
return;
}
}
else
data['nathostenabled'] = 0;
data['addmode'] = dijit.byId('mode').get('value');
dijit.byId('addeditbtn').set('disabled', true);
RPCwrapper(data, saveResourceCB, 1);
}
function saveResourceCB(data, ioArgs) {
if(data.items.status == 'error') {
dojo.byId('addeditdlgerrmsg').innerHTML = '<br>' + data.items.msg;
dijit.byId('addeditbtn').set('disabled', false);
}
else if(data.items.status == 'adderror') {
alert(data.items.errormsg);
}
else if(data.items.status == 'success') {
if(data.items.action == 'add') {
if(data.items.addmode == 'single') {
if(typeof resourcegrid !== 'undefined') {
resourcegrid.store.newItem(data.items.data);
resourcegrid.sort();
if(data.items.data.nathostenabled) {
dijit.byId('nathostid').addOption({label: data.items.data.hostname, value: data.items.data.nathostenabledid});
dijit.byId('newnathostid').addOption({label: data.items.data.hostname, value: data.items.data.nathostenabledid});
dijit.byId('newnathostbtn').set('disabled', false);
}
}
dojo.forEach(dijit.findWidgets(dojo.byId('groupdlgcontent')), function(w) {
w.destroyRecursive();
});
if(data.items.nogroups == 0) {
dojo.byId('groupdlgcontent').innerHTML = data.items.groupingHTML;
AJdojoCreate('groupdlgcontent');
dojo.byId('resources').value = data.items.data.id;
populateLists('resources', 'ingroups', 'inresourcename', 'outresourcename', 'resgroupinggroupscont');
dijit.byId('groupdlg').show();
dijit.byId('groupingnote').show();
}
}
else {
if(typeof resourcegrid !== 'undefined') {
for(var i = 0; i < data.items.data.length; i++) {
resourcegrid.store.newItem(data.items.data[i]);
}
resourcegrid.sort();
}
dojo.forEach(dijit.findWidgets(dojo.byId('groupdlgcontent')), function(w) {
w.destroyRecursive();
});
if(data.items.nogroups == 0) {
dojo.byId('groupdlgcontent').innerHTML = data.items.groupingHTML;
dojo.byId('groupbyresourcedesc').innerHTML = data.items.grouphelp;
dojo.addClass('groupbyresourcesel', 'hidden');
AJdojoCreate('groupdlgcontent');
dojo.byId('resources').value = data.items.data[0].id;
populateLists('resources', 'ingroups', 'inresourcename', 'outresourcename', 'resgroupinggroupscont');
dojo.byId('inresourcename').innerHTML = 'new computer set';
dojo.byId('outresourcename').innerHTML = 'new computer set';
dojo.byId('addgrpcont').value = data.items.addcont;
dojo.byId('remgrpcont').value = data.items.remcont;
dijit.byId('groupdlg').show();
dijit.byId('groupingnote').show();
}
}
}
else {
resourcegrid.store.fetch({
query: {id: data.items.data.id},
onItem: function(item) {
var washost = resourcegrid.store.getValue(item, 'nathostenabled');
resourcegrid.store.setValue(item, 'name', data.items.data.hostname);
resourcegrid.store.setValue(item, 'owner', data.items.data.owner);
resourcegrid.store.setValue(item, 'state', data.items.data.state);
resourcegrid.store.setValue(item, 'platform', data.items.data.platform);
resourcegrid.store.setValue(item, 'schedule', data.items.data.schedule);
resourcegrid.store.setValue(item, 'currentimg', data.items.data.currentimg);
resourcegrid.store.setValue(item, 'imagerevision', data.items.data.imagerevision);
resourcegrid.store.setValue(item, 'nextimg', data.items.data.nextimg);
resourcegrid.store.setValue(item, 'ram', data.items.data.ram);
resourcegrid.store.setValue(item, 'procnumber', data.items.data.procnumber);
resourcegrid.store.setValue(item, 'procspeed', data.items.data.procspeed);
resourcegrid.store.setValue(item, 'network', data.items.data.network);
resourcegrid.store.setValue(item, 'IPaddress', data.items.data.IPaddress);
resourcegrid.store.setValue(item, 'privateIPaddress', data.items.data.privateIPaddress);
resourcegrid.store.setValue(item, 'eth0macaddress', data.items.data.eth0macaddress);
resourcegrid.store.setValue(item, 'eth1macaddress', data.items.data.eth1macaddress);
resourcegrid.store.setValue(item, 'type', data.items.data.type);
resourcegrid.store.setValue(item, 'deleted', data.items.data.deleted);
resourcegrid.store.setValue(item, 'notes', data.items.data.notes);
resourcegrid.store.setValue(item, 'vmhost', data.items.data.vmhost);
resourcegrid.store.setValue(item, 'predictivemodule', data.items.data.predictivemodule);
resourcegrid.store.setValue(item, 'location', data.items.data.location);
resourcegrid.store.setValue(item, 'provisioning', data.items.data.provisioning);
resourcegrid.store.setValue(item, 'natenabled', data.items.data.natenabled);
resourcegrid.store.setValue(item, 'nathost', data.items.data.nathost);
resourcegrid.store.setValue(item, 'nathostenabled', data.items.data.nathostenabled);
resourcegrid.store.setValue(item, 'natpublicIPaddress', data.items.data.natpublicIPaddress);
resourcegrid.store.setValue(item, 'natinternalIPaddress', data.items.data.natinternalIPaddress);
if(data.items.data.nathostenabled) {
if(washost == 0) {
dijit.byId('nathostid').addOption({label: data.items.data.hostname, value: data.items.data.nathostenabledid});
dijit.byId('newnathostid').addOption({label: data.items.data.hostname, value: data.items.data.nathostenabledid});
dijit.byId('newnathostbtn').set('disabled', false);
}
}
else {
dijit.byId('nathostid').options.forEach(
function(node, index, nodelist) {
if(node.label == data.items.data.hostname)
dijit.byId('nathostid').removeOption({value: node.value});
}
);
dijit.byId('newnathostid').options.forEach(
function(node, index, nodelist) {
if(node.label == data.items.data.hostname)
dijit.byId('newnathostid').removeOption({value: node.value});
if(dijit.byId('newnathostid').options.length == 0)
dijit.byId('newnathostbtn').set('disabled', true);
}
);
}
},
onComplete: function(items, result) {
// when call resourcegrid.sort directly, the table contents disappear; not sure why
setTimeout(function() {resourcegrid.sort();}, 10);
}
});
}
dijit.byId('addeditdlg').hide();
resetEditResource();
if('promptuser' in data.items) {
dijit.byId('confirmactiondlg').set('title', data.items.title);
dijit.byId('submitactionbtn').setLabel(data.items.btntxt);
dojo.removeClass('submitactionbtnspan', 'hidden');
dijit.byId('actionmsg').set('content', data.items.msg);
dojo.byId('submitcont').value = data.items.cont;
dijit.byId('confirmactiondlg').show();
}
else if('promptuserfail' in data.items) {
dijit.byId('confirmactiondlg').set('title', data.items.title);
dojo.addClass('submitactionbtnspan', 'hidden');
dijit.byId('cancelactionbtn').setLabel('Close');
dijit.byId('actionmsg').set('content', data.items.msg);
dijit.byId('confirmactiondlg').show();
}
else if('multirefresh' in data.items) {
refreshcompdata(data.items.multirefresh);
}
else
setTimeout(function() {dijit.byId('addeditbtn').set('disabled', false);}, 250);
}
}
function cancelScheduledtovmhostinuse() {
var data = {continuation: dojo.byId('tohostcancelcont').value};
RPCwrapper(data, cancelScheduledtovmhostinuseCB, 1);
}
function cancelScheduledtovmhostinuseCB(data, ioArgs) {
if(data.items.status == 'success') {
dojo.byId('cancelvmhostinuseokdiv').innerHTML = data.items.msg;
dojo.addClass('cancelvmhostinusediv', 'hidden');
dojo.removeClass('cancelvmhostinuseokdiv', 'hidden');
}
else if(data.items.status == 'failed') {
dojo.byId('cancelvmhostinusediv').innerHTML = "An error was encountered that prevented the reservation to place this computer in the vmhostinuse state from being deleted.";
}
}
function confirmReload() {
var data = {continuation: dojo.byId('reloadcont').value,
imageid: dijit.byId('reloadimageid').get('value')};
confirmAction(data);
}
function confirmDelete() {
var data = {continuation: dojo.byId('deletecont').value};
confirmAction(data);
}
function confirmStateChange() {
var data = {continuation: dojo.byId('statechangecont').value,
stateid: dijit.byId('newstateid').get('value')};
confirmAction(data);
}
function confirmScheduleChange() {
var data = {continuation: dojo.byId('schedulecont').value,
schid: dijit.byId('newscheduleid').get('value')};
confirmAction(data);
}
function confirmProvisioningChange() {
var data = {continuation: dojo.byId('provisioningchangecont').value,
provisioningid: dijit.byId('newprovisioningid').get('value')};
confirmAction(data);
}
function confirmPredictiveModuleChange() {
var data = {continuation: dojo.byId('predictivemodulechangecont').value,
predictivemoduleid: dijit.byId('newpredictivemoduleid').get('value')};
confirmAction(data);
}
function confirmNATchange() {
if(dijit.byId('newnathostid').options.length == 0)
return;
var data = {continuation: dojo.byId('natchangecont').value};
if(dijit.byId('newnatenabled').get('value') == 1) {
data['natenabled'] = 1;
data['nathostid'] = dijit.byId('newnathostid').get('value');
}
else {
data['natenabled'] = 0;
data['nathostid'] = 0;
}
confirmAction(data);
}
function generateDHCPdata(type) {
var data = {continuation: dojo.byId(type + 'dhcpcont').value,
type: type};
if(dijit.byId('mnprivipaddr'))
data['mnip'] = dijit.byId('mnprivipaddr').get('value');
if(type == 'private') {
if(dojo.byId('preth0rdo').checked)
data['nic'] = 'eth0';
else
data['nic'] = 'eth1';
}
else {
if(dojo.byId('pueth0rdo').checked)
data['nic'] = 'eth0';
else
data['nic'] = 'eth1';
}
confirmAction(data);
}
function hostsData() {
var data = {continuation: dojo.byId('hostsdatacont').value};
confirmAction(data);
}
function showReservations() {
var data = {continuation: dojo.byId('showreservationscont').value};
confirmAction(data);
}
function showReservationHistory() {
var compids = [];
dojo.forEach(resource.selids, function(id) {
compids.push(id.replace('chkb', ''));
});
if(compids.length > 3) {
alert('Due to the load this can introduce on the database server, only a maximum of 3 computers can be selected for viewing Reservation History.');
return;
}
var data = {continuation: dojo.byId('showreservationhistorycont').value};
confirmAction(data);
}
function confirmAction(data) {
dijit.popup.close(dijit.byId('actionmenu'));
var compids = [];
dojo.forEach(resource.selids, function(id) {
compids.push(id.replace('chkb', ''));
});
if(compids.length == 0) {
alert('No computers selected');
return;
}
data['compids[]'] = compids;
RPCwrapper(data, confirmActionCB, 1);
}
function confirmActionCB(data, ioArgs) {
if(data.items.status == 'error') {
dijit.byId('confirmactiondlg').set('title', 'Error');
dijit.byId('cancelactionbtn').setLabel('Close');
dojo.addClass('submitactionbtnspan', 'hidden');
dijit.byId('actionmsg').set('content', data.items.errormsg);
dijit.byId('confirmactiondlg').show();
}
else if(data.items.status == 'success') {
dijit.byId('confirmactiondlg').set('title', data.items.title);
dijit.byId('submitactionbtn').setLabel(data.items.btntxt);
dijit.byId('actionmsg').set('content', data.items.actionmsg);
//AJdojoCreate('actionmsg');
if('complist' in data.items)
dojo.byId('complist').innerHTML = data.items.complist;
dojo.byId('submitcont').value = data.items.cont;
if('disablesubmit' in data.items && data.items.disablesubmit == 1)
dijit.byId('submitactionbtn').set('disabled', true);
dijit.byId('confirmactiondlg').show();
}
else if(data.items.status == 'onestep') {
dijit.byId('confirmactiondlg').set('title', data.items.title);
dijit.byId('cancelactionbtn').setLabel('Close');
dojo.addClass('submitactionbtnspan', 'hidden');
dijit.byId('actionmsg').set('content', data.items.actionmsg);
//AJdojoCreate('actionmsg');
if('complist' in data.items)
dojo.byId('complist').innerHTML = data.items.complist;
dijit.byId('confirmactiondlg').show();
}
}
function cancelAction() {
dijit.byId('confirmactiondlg').hide();
dijit.byId('confirmactiondlg').set('title', '');
dijit.byId('actionmsg').set('content', '');
dojo.byId('complist').innerHTML = '';
dijit.byId('submitactionbtn').setLabel('Submit');
dijit.byId('submitactionbtn').set('disabled', false);
dojo.removeClass('submitactionbtnspan', 'hidden');
dijit.byId('cancelactionbtn').setLabel('Cancel');
}
function submitAction() {
var data = {continuation: dojo.byId('submitcont').value};
if(dijit.byId('utilnotes'))
data['notes'] = dijit.byId('utilnotes').get('value');
if(dijit.byId('profileid'))
data['profileid'] = dijit.byId('profileid').get('value');
if(dojo.byId('modedirect')) {
if(dojo.byId('modedirect').checked)
data['mode'] = 'direct';
else
data['mode'] = 'reload';
}
RPCwrapper(data, submitActionCB, 1);
}
function submitActionCB(data, ioArgs) {
if(data.items.status == 'error') {
dijit.byId('confirmactiondlg').set('title', 'Error');
dijit.byId('cancelactionbtn').setLabel('Close');
dojo.addClass('submitactionbtnspan', 'hidden');
dijit.byId('actionmsg').set('content', data.items.errormsg);
dojo.byId('complist').innerHTML = '';
dijit.byId('confirmactiondlg').show();
return;
}
if(('clearselection' in data.items && data.items.clearselection == 1) ||
(dijit.byId('statecb').value != '' && data.items.newstate != dijit.byId('statecb').value))
resourcegrid.selection.clear();
if('refreshcount' in data.items && parseInt(data.items.refreshcount) > 0) {
var cnt = parseInt(data.items.refreshcount) - 1;
refreshcompdata(cnt);
}
dijit.byId('confirmactiondlg').set('title', data.items.title);
dijit.byId('cancelactionbtn').setLabel('Close');
dojo.addClass('submitactionbtnspan', 'hidden');
dijit.byId('actionmsg').set('content', data.items.msg);
dojo.byId('complist').innerHTML = '';
dojo.byId('submitcont').value = '';
recenterDijitDialog('confirmactiondlg');
}
function refreshcompdata(refreshcount) {
var url = resourcestore.url;
resourcestore.close();
resourcestore = new dojo.data.ItemFileWriteStore({url: url});
resourcestore.comparatorMap = {name: resource.nocasesort,
procnumber: resource.nocasesort,
procspeed: resource.nocasesort,
network: resource.nocasesort,
ram: resource.nocasesort,
IPaddress: resource.ipsort,
privateIPaddress: resource.ipsort};
resourcestore.fetch();
savescroll = resourcegrid.scrollTop;
resourcegrid.setStore(resourcestore, resourcegrid.query);
if(refreshcount)
setTimeout(function() {refreshcompdata(--refreshcount);}, 5000);
}
function setScroll() {
if(savescroll != 0)
resourcegrid.scrollTo(savescroll);
}
function saveScroll(scrollobj) {
if(resourcegrid.scrollTop != 0)
savescroll = 0;
}
function delayedCompGroupFilterSelection() {
if(filterdelay)
clearTimeout(filterdelay);
filterdelay = setTimeout(compGroupFilterSelection, 1500);
}
function compGroupFilterSelection() {
var selected = new Array();
var selobj = dojo.byId('filtercompgroups');
for(var i = 0; i < selobj.options.length; i++) {
if(selobj.options[i].selected)
selected.push(selobj.options[i].value);
}
var data = {groupids: selected.join(','),
continuation: dojo.byId('filtercompgroupscont').value};
RPCwrapper(data, compGroupFilterSelectionCB, 1);
}
function compGroupFilterSelectionCB(data, ioArgs) {
if(data.items.status == 'error') {
alert(data.items.errormsg);
return;
}
var query = resourcegrid.query;
query['id'] = new RegExp(data.items.regids);
resourcegrid.setQuery(query);
dojo.byId('computercount').innerHTML = 'Computers in table: ' + resourcegrid.rowCount;
}