/*
* 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.
*/
if("Notification" in window)
	window.Notification.requestPermission();

var resSubmitted = 0;
var suggestTimeData = {}
var resbtntxt = '';
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) {
	eval(data);
	document.body.style.cursor = 'default';
}

function initViewRequests(imaging) {
	if(typeof(dijit) == "undefined" ||
	   typeof(dijit.byId) == "undefined" ||
	   typeof(images) == "undefined" ||
	   dojo.byId('limitstart') == null ||
	   (imaging && typeof(dijit.byId('deployimage')) == '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();
	if(dijit.byId('nousercheck'))
		dijit.byId('nousercheck').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('indefiniteend', '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')) {
			dojo.byId('endduration').checked = true;
			delayedUpdateWaitTime(0, 50);
		}
	}
	if(dojo.byId('basicrdo').checked) {
		dijit.byId('deployimage').set('query', {basic: 1, checkout: 1});
		checkSelectedInList();
		if(dijit.byId('nousercheck'))
			dojo.removeClass('nousercheckspan', 'hidden');
		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(dijit.byId('nousercheck'))
			dojo.addClass('nousercheckspan', 'hidden');
		if(! durationchanged)
			dojo.byId('reqlength').value = 480;
	}
	if(dojo.byId('serverrdo').checked) {
		dijit.byId('deployimage').set('query', {server: 1, checkout: 1});
		checkSelectedInList();
		if(dijit.byId('nousercheck'))
			dojo.addClass('nousercheckspan', 'hidden');
		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 &&
		   (profilesstore._arrayOfAllItems.length != 1 ||
		   profilesstore._arrayOfAllItems[0].name != _('(New Profile)')))
			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('indefiniteend', '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() {
	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);
	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;
	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 = '';
	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') && 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;
			tmp = new Date(tmp * 1000);
			var date = new Date(tmp.getTime());
			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();*/
	if(dijit.byId('nousercheck') && dijit.byId('nousercheck').get('value') == 1)
		data.nousercheck = 1;
	else
		data.nousercheck = 0;
	//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
		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() {
	if(dojo.byId('suggestcont').value == 'cluster') {
		alert(_('Times cannot be suggested for cluster reservations'));
		return;
	}
	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, 30000);
	document.body.style.cursor = 'wait';
}

function showSuggestedTimesCB(data, ioArgs) {
	document.body.style.cursor = 'default';
	dojo.addClass('suggestloading', 'hidden');
	dojo.byId('suggestContent').innerHTML = data.items.html;
	if(data.items.status == 'resgone') {
		dijit.byId('suggestedTimes').hide();
		resGone('edit');
		resRefresh();
		return;
	}
	else if(data.items.status == 'error') {
		hideDijitButton('suggestDlgBtn');
		dijit.byId('suggestDlgCancelBtn').set('label', _('Okay'));
		if(dijit.byId('suggestedTimes'))
			recenterDijitDialog('suggestedTimes');
		return;
	}
	else if(data.items.status == 'noextend') {
		dijit.byId('suggestedTimes').hide();
		dojo.byId('editResDlgContent').innerHTML = data.items.html;
		dojo.byId('editResDlgPartialMsg').innerHTML = '';
		dojo.byId('editResDlgErrMsg').innerHTML = '';
		dijit.byId('editResDlgBtn').set('style', 'display: none');
		dijit.byId('editResCancelBtn').set('label', _('Okay'));
		recenterDijitDialog('editResDlg');
		return;
	}
	recenterDijitDialog('suggestedTimes');
	suggestTimeData = data.items.data;
}

function setSuggestSlot(slot) {
	dojo.byId('selectedslot').value = slot;
	dijit.byId('suggestDlgBtn').set('disabled', false);
}

function useSuggestedEditSlot() {
	var slot = suggestTimeData[dojo.byId('selectedslot').value];
	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
		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++) {
			if(s.getDayName() == sel.options[i].innerHTML) {
				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();
	delayedUpdateWaitTime(0, 50);
}

function selectLater() {
	dojo.byId('laterradio').checked = true;
	if(dijit.byId('newResDlgBtn')) {
		if(resbtntxt != '')
			dijit.byId('newResDlgBtn').set('label', resbtntxt);
		else
			dijit.byId('newResDlgBtn').set('label', _('Create Reservation'));
	}
	dojo.addClass('waittime', 'hidden');
}

function selectLength() {
	if(dojo.byId('lengthradio'))
		dojo.byId('lengthradio').checked = true;
}

function selectEnding() {
	if(dojo.byId('dateradio'))
		dojo.byId('dateradio').checked = true;
	dijit.byId('editResDlgBtn').set('label', _('Modify Reservation'));
	resetEditResBtn();
}

function setOpenEnd() {
	dojo.byId('openend').checked = true;
	if(! dijit.byId('openenddate').isValid() ||
	   ! dijit.byId('openendtime').isValid()) {
		dojo.byId('enddate').value = '';
		return;
	}
	var d = dijit.byId('openenddate').value;
	var t = dijit.byId('openendtime').value;
	if(d == null || t == null) {
		dojo.byId('enddate').value = '';
		return;
	}
	dojo.byId('enddate').value = dojox.string.sprintf('%d-%02d-%02d %02d:%02d:00',
	                             d.getFullYear(),
	                             (d.getMonth() + 1),
	                             d.getDate(),
	                             t.getHours(),
	                             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('deployimage') && ! dijit.byId('deployimage').isValid()) {
		alert(_('Please select a valid environment.'));
		return false;
	}
	if(dijit.byId('newResDlgBtn').get('label') == _('View Available Times')) {
		showSuggestedTimes();
		return false;
	}
	resSubmitted = 1;
	return true;
}

function setMaxRequestLength(minutes) {
	var obj = dojo.byId('reqlength');
	var i;
	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;
	}
	for(i = obj.length - 1; obj.options[i].value < minutes; i++) {
		// if last option is < 60, add 1 hr
		if(parseInt(obj.options[i].value) < 60 &&
			minutes >= 60) {
			text = '1 ' + _('hour');
			newminutes = 60;
		}
		// if option > 45 days, add as weeks
		else if(parseInt(obj.options[i].value) > 64700) {
			var len = parseInt(obj.options[i].value);
			if(len == 64800)
				len = 60480;
			if(len % 10080)
				len = len - (len % 10080);
			else
				len = len + 10080;
			text = len / 10080 + ' ' + _('weeks');
			newminutes = len;
		}
		// if option > 46 hours, add as days
		else if(parseInt(obj.options[i].value) > 2640) {
			var len = parseInt(obj.options[i].value);
			if(len == 2760)
				len = 1440;
			if(len % 1440)
				len = len - (len % 1440);
			else
				len = len + 1440;
			text = len / 1440 + ' ' + _('days');
			newminutes = len;
		}
		// else add in 2 hr chuncks up to max
		else {
			tmp = parseInt(obj.options[i].value);
			if(tmp % 120)
				tmp = tmp - (tmp % 120);
			newminutes = tmp + 120;
			if(newminutes < minutes)
				text = (newminutes / 60) + ' ' + _('hours');
			else {
				newminutes = minutes;
				tmp = newminutes - (newminutes % 60);
				if(newminutes % 60)
					if(newminutes % 60 < 10)
						text = (tmp / 60) + ':0' + (newminutes % 60) + ' ' + _('hours');
					else
						text = (tmp / 60) + ':' + (newminutes % 60) + ' ' + _('hours');
				else
					text = (tmp / 60) + ' ' + _('hours');
			}
		}
		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() {
	var nextcheck = 15;
	var nodes = dojo.query('.timeoutvalue');
	var tmp = new Date();
	var now = (tmp.getTime() - tmp.getMilliseconds()) / 1000;
	for(var i = 0; i < nodes.length; i++) {
		var testval = parseInt(nodes[i].value);
		if(testval <= now) {
			nodes[i].parentNode.removeChild(nodes[i]);
			resRefresh();
			break;
		}
		else if(testval - now < nextcheck)
			nextcheck = testval - now;
	}
	if(nodes.length == 0)
		nextcheck = 60;
	check_timeout_timer = setTimeout(checkTimeouts, nextcheck * 1000);
}

function resRefresh() {
	if(! dojo.byId('resRefreshCont'))
		return;
	var contid = dojo.byId('resRefreshCont').value;
	/*if(dojo.widget.byId('resStatusPane').windowState == 'minimized')
		var incdetails = 0;
	else*/
		var incdetails = 1;
	var data = {continuation: contid,
	            incdetails: incdetails};
	if(dojo.byId('detailreqid') && dojo.byId('detailreqid').value != 0)
		data.reqid = dojo.byId('detailreqid').value;
	else
		data.incdetails = 0;
	RPCwrapper(data, generalReqCB, 0, 30000);
}

function showResStatusPane(reqid) {
	var currdetailid = dojo.byId('detailreqid').value;
	/*if(! dojo.widget.byId('resStatusPane')) {
		window.location.reload();
		return;
	}*/
	var obj = dijit.byId('resStatusPane');
	if(currdetailid != reqid) {
		dojo.byId('detailreqid').value = reqid;
		dojo.byId('resStatusText').innerHTML = _('Loading...');
	}
	var disp = dijit.byId('resStatusPane').domNode.style.visibility;
	if(disp == 'hidden')
		showWindow('resStatusPane');
	if(currdetailid != reqid) {
		if(typeof(refresh_timer) != "undefined")
			clearTimeout(refresh_timer);
		resRefresh();
	}
}

function showWindow(name) {
	var x = mouseX;
	var y = mouseY;
	var obj = dijit.byId(name);
	var coords = obj._naturalState;
	if(coords.t == 0 && coords.l == 0) {
		coords.l = x;
		var newtop = y - (coords.h / 2);
		coords.t = newtop;
		obj.resize(coords);
	}
	obj.show();
}

function notifyResReady(names) {
	if(! ("Notification" in window) || ! Notification.permission) {
		//console.log('notifications not supported');
		return;
	}
	var note = new Notification("VCL Reservations ready", { tag: 'reqready', body: names });
}

function connectRequest(cont) {
	RPCwrapper({continuation: cont}, connectRequestCB, 1);
}

function connectRequestCB(data, ioArgs) {
	dijit.byId('connectDlgContent').set('content', data.items.html);
	if('timeoutid' in data.items)
		dojo.byId(data.items.timeoutid).value = data.items.timeout;
	dijit.byId('connectDlg').show();
	if('refresh' in data.items && data.items.refresh == 1)
		resRefresh();
	else
		setTimeout(checkConnectTimeout, 15000);
}

function endReservation(cont) {
	if(dojo.byId('deletecontholder'))
		dojo.byId('deletecontholder').value = cont;
	RPCwrapper({continuation: cont}, endReservationCB, 1, 30000);
}

function endServerReservation() {
	dijit.byId('serverDeleteDlgBtn').set('disabled', true);
	var data = {continuation: dojo.byId('deletecontholder').value,
	            skipconfirm: 1};
	RPCwrapper(data, endReservationCB, 1, 30000);
}

function endReservationCB(data, ioArgs) {
	if(data.items.error) {
		alert(data.items.msg);
		if('refresh' in data.items && data.items.refresh)
			setTimeout(resRefresh, 800);
		return;
	}
	if(data.items.status == 'serverconfirm') {
		dijit.byId('serverDeleteDlgBtn').set('disabled', false);
		dijit.byId('serverdeletedlg').show();
		return;
	}
	if(dijit.byId('serverdeletedlg') &&
	   dijit.byId('serverdeletedlg').open) {
		dijit.byId('serverdeletedlg').hide();
		dijit.byId('serverDeleteDlgBtn').set('disabled', false);
	}
	dojo.byId('endrescont').value = data.items.cont;
	dojo.byId('endresid').value = data.items.requestid;
	dojo.byId('endResDlgContent').innerHTML = data.items.content;
	dijit.byId('endResDlgBtn').set('label', data.items.btntxt);
	dijit.byId('endResDlg').show();
}

function submitDeleteReservation() {
	if(dojo.byId('radioprod')) {
		if(dojo.byId('radioprod').checked) {
			var cont = dojo.byId('radioprod').value;
			RPCwrapper({continuation: cont}, endReservationCB, 1, 30000);
			return;
		}
		else if(dojo.byId('radioend').checked)
			var data = {continuation: dojo.byId('radioend').value};
		else
			return;
	}
	else {
		var data = {continuation: dojo.byId('endrescont').value};
	}
	dojo.byId('endResDlgContent').innerHTML = '';
	dijit.byId('endResDlg').hide();
   document.body.style.cursor = 'wait';
	RPCwrapper(data, generalReqCB, 0, 30000);
}

function removeReservation(cont) {
	RPCwrapper({continuation: cont}, removeReservationCB, 1, 30000);
}

function removeReservationCB(data, ioArgs) {
	if(data.items.error) {
		alert(data.items.msg);
		if(data.items.error == 2)
			window.location.href = data.items.url;
		return;
	}
	dojo.byId('remrescont').value = data.items.cont;
	dojo.byId('remResDlgContent').innerHTML = data.items.content;
	dijit.byId('remResDlg').show();
}

function submitRemoveReservation() {
	var data = {continuation: dojo.byId('remrescont').value};
	dojo.byId('remResDlgContent').innerHTML = '';
	dijit.byId('remResDlg').hide();
   document.body.style.cursor = 'wait';
	RPCwrapper(data, generalReqCB, 0, 30000);
}

function editReservation(cont) {
   document.body.style.cursor = 'wait';
	RPCwrapper({continuation: cont}, editReservationCB, 1, 30000);
}

function editReservationCB(data, ioArgs) {
	if(data.items.status == 'resgone') {
		document.body.style.cursor = 'default';
		dijit.byId('editResDlg').show();
		resGone('edit');
		resRefresh();
		return;
	}
	dojo.byId('editResDlgContent').innerHTML = data.items.html;
	dojo.byId('editResDlgPartialMsg').innerHTML = '';
	dojo.byId('editResDlgErrMsg').innerHTML = '';
	AJdojoCreate('editResDlgContent');
	if(data.items.status == 'nomodify') {
		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;
		if(dojo.byId('indefinitelabel'))
			dojo.addClass('indefinitelabel', 'disabledlabel');
		if(dojo.byId('indefiniteradio'))
			dojo.byId('indefiniteradio').disabled = true;
	}
	else {
		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;
	}
	dijit.byId('editResDlg').show();
   document.body.style.cursor = 'default';
}

function hideEditResDlg() {
	if(dijit.byId('day'))
		dijit.byId('day').destroy();
	if(dijit.byId('editstarttime'))
		dijit.byId('editstarttime').destroy();
	if(dijit.byId('length'))
		dijit.byId('length').destroy();
	if(dijit.byId('openenddate'))
		dijit.byId('openenddate').destroy();
	if(dijit.byId('openendtime'))
		dijit.byId('openendtime').destroy();
	if(dijit.byId('servername'))
		dijit.byId('servername').destroy();
	if(dijit.byId('admingrpsel'))
		dijit.byId('admingrpsel').destroy();
	if(dijit.byId('logingrpsel'))
		dijit.byId('logingrpsel').destroy();
	if(dijit.byId('newnousercheck'))
		dijit.byId('newnousercheck').destroy();
	dojo.byId('editResDlgPartialMsg').innerHTML = '';
	dojo.byId('editResDlgErrMsg').innerHTML = '';
	dojo.byId('editrescont').value = '';
	dojo.byId('editresid').value = '';
	resetEditResBtn();
}

function resetEditResBtn() {
	dojo.byId('editResDlgPartialMsg').innerHTML = '';
	dojo.byId('editResDlgErrMsg').innerHTML = '';
	dijit.byId('editResDlgBtn').set('label', _('Modify Reservation'));
}

function editResOpenEnd() {
	if(! dijit.byId('openenddate').isValid() ||
	   ! dijit.byId('openendtime').isValid()) {
		dojo.byId('enddate').value = '';
		return;
	}
	var d = dijit.byId('openenddate').value;
	var t = dijit.byId('openendtime').value;
	if(d == null || t == null) {
		dojo.byId('enddate').value = '';
		return;
	}
	dojo.byId('enddate').value = dojox.string.sprintf('%d-%02d-%02d %02d:%02d:00',
	                             d.getFullYear(),
	                             (d.getMonth() + 1),
	                             d.getDate(),
	                             t.getHours(),
	                             t.getMinutes());
}

function submitEditReservation() {
	if(dijit.byId('editResDlgBtn').get('label') == _('View Available Times')) {
		dijit.byId('suggestDlgBtn').set('disabled', true);
		showDijitButton('suggestDlgBtn');
		dijit.byId('suggestDlgCancelBtn').set('label', _('Cancel'));
		showSuggestedTimes();
		return;
	}
	var cont = dojo.byId('editrescont').value;
	var data = {continuation: cont};
	if(dijit.byId('day'))
		data.day = dijit.byId('day').value;
	if(dijit.byId('editstarttime')) {
		var t = dijit.byId('editstarttime').value;
		data.starttime = dojox.string.sprintf('%02d%02d',
		                                      t.getHours(),
		                                      t.getMinutes());
		var tmp = dijit.byId('day').value.match(/([0-9]{4})([0-9]{2})([0-9]{2})/);
		var teststart = new Date(tmp[1], tmp[2] - 1, tmp[3], t.getHours(), t.getMinutes(), 0, 0);
		var now = new Date();
		if(teststart < now) {
			dojo.byId('editResDlgErrMsg').innerHTML = _("The submitted start time is in the past.");
			return;
		}
	}
	if(dijit.byId('newnousercheck') && dijit.byId('newnousercheck').get('value') == 1)
		data.newnousercheck = 1;
	else
		data.newnousercheck = 0;
	if(dijit.byId('servername'))
		data.servername = dijit.byId('servername').get('value');
	if(dijit.byId('admingrpsel')) {
		data.admingroupid = dijit.byId('admingrpsel').get('value');
		data.logingroupid = dijit.byId('logingrpsel').get('value');
	}
	else if(dojo.byId('admingrpsel')) {
		data.admingroupid = dojo.byId('admingrpsel').value;
		data.logingroupid = dojo.byId('logingrpsel').value;
	}
	if((! dojo.byId('dateradio') && ! dojo.byId('indefiniteradio') && dijit.byId('length')) ||
	   (dojo.byId('lengthradio') && dojo.byId('lengthradio').checked)) {
		data.length = dijit.byId('length').value;
		data.endmode = 'length';
	}
	else if((dojo.byId('dateradio') && dojo.byId('dateradio').checked) ||
	        (dijit.byId('openenddate') && ! dojo.byId('indefiniteradio')) ||
	        (dijit.byId('openenddate') && dojo.byId('indefiniteradio') && ! dojo.byId('indefiniteradio').checked)) {
		var d = dijit.byId('openenddate').value;
		var t = dijit.byId('openendtime').value;
		data.ending = dojox.string.sprintf('%d%02d%02d%02d%02d',
		              d.getFullYear(),
		              (d.getMonth() + 1),
		              d.getDate(),
		              t.getHours(),
		              t.getMinutes());
		data.endmode = 'ending';
		var testend = new Date(d.getFullYear(), d.getMonth(), d.getDate(), t.getHours(), t.getMinutes(), 0, 0);
		if(dijit.byId('editstarttime') && testend <= teststart) {
			dojo.byId('editResDlgErrMsg').innerHTML = _("The end time must be later than the start time.");
			return;
		}
	}
	else {
		data.endmode = 'indefinite';
	}
	document.body.style.cursor = 'wait';
	RPCwrapper(data, submitEditReservationCB, 1, 30000);
}

function submitEditReservationCB(data, ioArgs) {
   document.body.style.cursor = 'default';
	if(data.items.status != 'success' && 'partialupdate' in data.items) {
		dojo.byId('editResDlgPartialMsg').innerHTML = '<br>' + data.items.partialupdate + '<br><br>';
		resRefresh();
	}
	if(data.items.status == 'error') {
		dojo.byId('editResDlgErrMsg').innerHTML = data.items.errmsg;
		dojo.byId('editrescont').value = data.items.cont;
		dojo.byId('editresid').value = '';
		return;
	}
	else if(data.items.status == 'norequest') {
		dojo.byId('editResDlgContent').innerHTML = data.items.html;
		dojo.byId('editResDlgErrMsg').innerHTML = '';
		dijit.byId('editResDlgBtn').set('style', 'display: none');
		dijit.byId('editResCancelBtn').set('label', _('Okay'));
		resRefresh();
		return;
	}
	else if(data.items.status == 'conflict') {
		dojo.byId('editResDlgErrMsg').innerHTML = data.items.errmsg;
		dojo.byId('editrescont').value = data.items.cont;
		//dojo.byId('editresid').value = '';
		dojo.byId('suggestcont').value = data.items.sugcont;
		dijit.byId('editResDlgBtn').set('label', _('View Available Times'));
		return;
	}
	else if(data.items.status == 'unavailable') {
		dojo.byId('editResDlgErrMsg').innerHTML = data.items.errmsg;
		dojo.byId('editrescont').value = data.items.cont;
		dojo.byId('editresid').value = '';
		return;
	}
	dijit.byId('editResDlg').hide();
	resRefresh();
}

function checkResGone(reqids) {
	var editresid = dojo.byId('editresid').value;
	if(editresid == '' || editresid == 'undefined')
		return;
	for(var i = 0; i < reqids.length; i++) {
		if(editresid == reqids[i])
			return;
	}
	resGone('edit');
}

function resGone(type) {
	if(type == 'edit') {
		dojo.byId('editResDlgContent').innerHTML = _('The reservation you selected<br>to edit has expired.<br><br>');
	}
	else if(type == 'reboot') {
		dojo.byId('editResDlgContent').innerHTML = _('The reservation you selected<br>to reboot has expired.<br><br>');
	}
	else if(type == 'reinstall') {
		dojo.byId('editResDlgContent').innerHTML = _('The reservation you selected<br>to reinstall has expired.<br><br>');
	}
	dojo.byId('editresid').value = '';
	dojo.byId('editResDlgPartialMsg').innerHTML = '';
	dojo.byId('editResDlgErrMsg').innerHTML = '';
	dijit.byId('editResDlgBtn').set('style', 'display: none');
	dijit.byId('editResCancelBtn').set('label', _('Okay'));
	recenterDijitDialog('editResDlg');
}

function hideRebootResDlg() {
	dojo.byId('softreboot').checked = true;
	dojo.byId('rebootrescont').value = '';
	dojo.byId('rebootResDlgErrMsg').innerHTML = '';
}

function rebootRequest(cont) {
	dojo.byId('rebootrescont').value = cont;
	dijit.byId('rebootdlg').show();
}

function submitRebootReservation() {
	var data = {continuation: dojo.byId('rebootrescont').value};
	document.body.style.cursor = 'wait';
	if(dojo.byId('hardreboot').checked)
		data.reboottype = 1;
	else
		data.reboottype = 0;
	dijit.byId('rebootdlg').hide();
	RPCwrapper(data, generalReqCB, 0, 30000);
}

function hideReinstallResDlg() {
	dojo.addClass('reinstallbtns', 'hidden');
	dojo.byId('reinstallResDlgContent').innerHTML = '';
	dojo.byId('reinstallResDlgErrMsg').innerHTML = '';
	dojo.byId('reinstallrescont').value = '';
}

function showReinstallRequest(cont) {
	dojo.removeClass('reinstallloading', 'hidden');
	dijit.byId('reinstalldlg').show();
	var data = {continuation: cont};
	RPCwrapper(data, showReinstallRequestCB, 1, 30000);
	document.body.style.cursor = 'wait';
}

function showReinstallRequestCB(data, ioArgs) {
	document.body.style.cursor = 'default';
	if(data.items.status == 'resgone') {
		dijit.byId('reinstalldlg').hide();
		resGone('reinstall');
		dijit.byId('editResDlg').show();
		setTimeout(resRefresh, 1500);
		return;
	}
	dojo.addClass('reinstallloading', 'hidden');
	dojo.removeClass('reinstallbtns', 'hidden');
	dojo.byId('reinstallrescont').value = data.items.cont;
	dojo.byId('reinstallResDlgContent').innerHTML = data.items.txt;
	recenterDijitDialog('reinstalldlg');
}

function submitReinstallReservation() {
	var data = {continuation: dojo.byId('reinstallrescont').value};
	var inputs = document.getElementsByName('revisionid');
	for(var i = 0; i < inputs.length; i++) {
		if(inputs[i].checked) {
			data.revisionid = inputs[i].value;
			break;
		}
	}
	document.body.style.cursor = 'wait';
	RPCwrapper(data, submitReinstallReservationCB, 1, 30000);
}

function submitReinstallReservationCB(data, ioArgs) {
	document.body.style.cursor = 'default';
	if(data.items.status == 'resgone') {
		dijit.byId('reinstalldlg').hide();
		resGone('reinstall');
		dijit.byId('editResDlg').show();
		setTimeout(resRefresh, 1500);
		return;
	}
	if(data.items.status == 'invalidrevisionid') {
		dojo.byId('reinstallResDlgErrMsg').innerHTML = _('An invalid version was submitted.');
		dojo.byId('reinstallrescont').value = data.items.cont;
		return;
	}
	if(data.items.status == 'success') {
		dijit.byId('reinstalldlg').hide();
		resRefresh();
	}
}

function checkConnectTimeout() {
	var nextcheck = 15;
	if(! dojo.byId('connecttimeout'))
		return;
	var timeout = parseInt(dojo.byId('connecttimeout').value);
	if(timeout == 0)
		return;
	var tmp = new Date();
	var now = (tmp.getTime() - tmp.getMilliseconds()) / 1000;
	if(timeout <= now) {
		dojo.byId('connecttimeout').value = 0;
		var cont = dojo.byId('refreshcont').value;
		RPCwrapper({continuation: cont}, checkConnectTimeoutCB, 1, 30000);
		return;
	}
	else if(timeout - now < nextcheck) {
		nextcheck = timeout - now;
	}
	setTimeout(checkConnectTimeout, nextcheck * 1000);
}

function checkConnectTimeoutCB(data, ioArgs) {
	if(data.items.status == 'timeout') {
		dijit.byId('timeoutdlg').show();
		return;
	}
	else if(data.items.status == 'inuse') {
		setTimeout(checkConnectTimeout, 300000);
	}
}

function previewClickThrough() {
	RPCwrapper({continuation: dojo.byId('previewclickthroughcont').value},
	            previewClickThroughCB, 1);
	return false;
}

function previewClickThroughCB(data, ioArgs) {
	dojo.byId('clickthroughPreviewDlgContent').innerHTML = data.items.text;
	dijit.byId('clickthroughpreviewdlg').show();
}
