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

function setResTypeButtons() {
	var item = dijit.byId('deployimage').get('item');
	var checkout = imagestore.getValue(item, 'checkout');
	var imaging = imagestore.getValue(item, 'imaging');
	var server = imagestore.getValue(item, 'server');
	if(server) {
		dojo.byId('serverrdo').disabled = false;
	}
	else {
		if(dojo.byId('serverrdo').checked) {
			if(checkout) {
				dojo.byId('basicrdo').checked = true;
			}
			else if(imaging) {
				dojo.byId('imagingrdo').checked = true;
			}
		}
		dojo.byId('serverrdo').checked = false;
		dojo.byId('serverrdo').disabled = true;
	}
	if(checkout) {
		dojo.byId('basicrdo').disabled = false;
	}
	else {
		if(dojo.byId('basicrdo').checked) {
			if(imaging) {
				dojo.byId('imagingrdo').checked = true;
			}
			else if(server) {
				dojo.byId('serverrdo').checked = true;
			}
		}
		dojo.byId('basicrdo').checked = false;
		dojo.byId('basicrdo').disabled = true;
	}
	if(imaging) {
		dojo.byId('imagingrdo').disabled = false;
	}
	else {
		if(dojo.byId('imagingrdo').checked) {
			if(checkout) {
				dojo.byId('basicrdo').checked = true;
			}
			else if(server) {
				dojo.byId('serverrdo').checked = true;
			}
		}
		dojo.byId('imagingrdo').checked = false;
		dojo.byId('imagingrdo').disabled = true;
	}
	selectResType();
}

function selectResType() {
	showHideTypeInputs();
	if(dojo.byId('basicrdo').checked || dojo.byId('imagingrdo').checked) {
		if(dojo.byId('endat') && ! dojo.byId('endat').checked &&
		   dojo.byId('endduration')) {
			dojo.byId('endduration').checked = true;
			delayedUpdateWaitTime(0, 50);
		}
	}
	if(dojo.byId('basicrdo').checked) {
		var imageid = getSelectValue('deployimage');
		var item = dijit.byId('deployimage').get('item');
		if(item) {
			var max = imagestore.getValue(item, 'maxinitialtime');
		}
		if(max)
			setMaxRequestLength(max);
		else
			setMaxRequestLength(defaultMaxTime);
		if(! durationchanged)
			dojo.byId('reqlength').value = 60;
	}
	if(dojo.byId('imagingrdo').checked) {
		setMaxRequestLength(maximaging);
		if(! durationchanged)
			dojo.byId('reqlength').value = 480;
	}
	if(dojo.byId('serverrdo').checked) {
		dijit.byId('deploystarttime').set('required', true);
		dijit.byId('deploystartdate').set('required', true);
		if(dojo.hasClass('anystart', 'hidden') &&
		   dojo.byId('startlater') &&
		   dojo.byId('startlater').checked) {
			delayedUpdateWaitTime(0, 50);
		}
		if(dojo.byId('endat') && ! dojo.byId('endat').checked) {
			dojo.byId('endindef').checked = true;
			delayedUpdateWaitTime(0, 50);
		}
	}
	resetDeployBtnLabel();
	resizeRecenterDijitDialog('newResDlg');
}

function showHideTypeInputs() {
	dojo.removeClass('restyperadios', 'hidden');
	dojo.removeClass('whenstartblock', 'hidden');
	dojo.removeClass('durationblock', 'hidden');
	dojo.removeClass('waittime', 'hidden');
	if(dojo.byId('basicrdo').checked || dojo.byId('imagingrdo').checked) {
		dojo.removeClass('limitstart', 'hidden');
		dojo.removeClass('durationend', 'hidden');
		dojo.addClass('whentitleserver', 'hidden');
		dojo.addClass('nrnamespan', 'hidden');
		dojo.addClass('nrservergroupspan', 'hidden');
		dojo.addClass('nrfixedipdiv2', 'hidden');
		dojo.addClass('anystart', 'hidden');
		dojo.addClass('indefiniteend', 'hidden');
		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('basicrdo').checked) {
		if(dijit.byId('nousercheck'))
			dojo.removeClass('nousercheckspan', 'hidden');
		dojo.removeClass('whentitlebasic', 'hidden');
		dojo.addClass('whentitleimaging', 'hidden');
		dojo.removeClass('whentitleimaging', 'hidden');
		dojo.addClass('whentitlebasic', 'hidden');
		if(dijit.byId('nousercheck'))
			dojo.addClass('nousercheckspan', 'hidden');
	}
	if(dojo.byId('serverrdo').checked) {
		if(dijit.byId('nousercheck'))
			dojo.addClass('nousercheckspan', 'hidden');
		dojo.addClass('waittime', 'hidden');
		dojo.addClass('deployerr', 'hidden');
		dojo.addClass('whentitlebasic', 'hidden');
		dojo.addClass('whentitleimaging', 'hidden');
		dojo.addClass('limitstart', 'hidden');
		dojo.addClass('durationend', 'hidden');
		dojo.removeClass('whentitleserver', '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
	}
}

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;
	setResTypeButtons();
	var imageid = getSelectValue('deployimage');
	var item = dijit.byId('deployimage').get('item');
	var max = imagestore.getValue(item, 'maxinitialtime');
	if(max && max < defaultMaxTime)
		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 type;
	if(dojo.byId('basicrdo').checked)
		type = 'basic';
	else if(dojo.byId('imagingrdo').checked)
		type = 'imaging';
	else if(dojo.byId('serverrdo').checked)
		type = 'server';
	var data = {continuation: dojo.byId('waitcontinuation').value,
	            desconly: 1,
	            type: type,
	            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();
}
