/*
* 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();
}
