/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

function Image() {
	Resource.apply(this, Array.prototype.slice.call(arguments));
	this.selids = [];
	this.selectingall = false;
	this.restype = 'image';
}
Image.prototype = new Resource();

Image.prototype.colformatter = function(value, rowIndex, obj) {
	if(obj.field == 'deleted' ||
	   obj.field == 'test' ||
	   obj.field == 'forcheckout' ||
	   obj.field == 'checkuser' ||
	   obj.field == 'rootaccess' ||
	   obj.field == 'sethostname' ||
	   obj.field == 'adauthenabled') {
		if(value == "0")
			return '<span class="rederrormsg">' + _('false') + '</span>';
		if(value == "1")
			return '<span class="ready">' + _('true') + '</span>';
	}
	if((obj.field == 'addomain' && value == null) ||
	   (obj.field == 'baseOU' && value == null))
		return '(' + _('unset') + ')';
	if(obj.field == 'maxinitialtime') {
		if(value == 0) {
			return _('Default for User');
		}
		else if(value < 60) {
			return value + ' ' + _('minutes');
		}
		else if(value == 60) {
			return _('1 hour');
		}
		else if(value < 2880) {
			return parseInt(value / 60) + ' ' + _('hours');
		}
		else if(value <= 64800) {
			return parseInt(value / 1440) + ' ' + _('days');
		}
		else {
			return parseInt(value / 10080) + ' ' + _('weeks');
		}
	}
	return value;
}

var resource = new Image();

function inlineEditResourceCB(data, ioArgs) {
	if(data.items.status == 'success') {
		if(dijit.byId('advancedoptions').open)
			dijit.byId('advancedoptions').toggle();
		dojo.byId('saveresourcecont').value = data.items.cont;
		dijit.byId('addeditdlg').set('title', data.items.title);
		dijit.byId('addeditbtn').set('label', _('Save Changes'));
		dojo.byId('editresid').value = data.items.resid;
		dijit.byId('name').set('value', data.items.data.prettyname);
		dijit.byId('owner').set('value', data.items.data.owner);
		dijit.byId('description').set('value', data.items.data.description);
		dijit.byId('usage').set('value', data.items.data.usage);
		dijit.byId('ram').set('value', data.items.data.minram);
		dijit.byId('cores').set('value', data.items.data.minprocnumber);
		dijit.byId('cpuspeed').set('value', data.items.data.minprocspeed);
		dijit.byId('networkspeed').set('value', data.items.data.minnetwork);
		dijit.byId('concurrent').set('value', data.items.data.maxconcurrent);
		dijit.byId('reload').set('value', data.items.data.reloadtime);
		dijit.byId('checkout').set('value', data.items.data.forcheckout);
		dijit.byId('checkuser').set('value', data.items.data.checkuser);
		dijit.byId('rootaccess').set('value', data.items.data.rootaccess);
		dijit.byId('sethostname').set('value', data.items.data.sethostname);
		dijit.byId('maxinitialtime').set('value', data.items.data.maxinitialtime);
		if(data.items.data.ostype == 'windows' || data.items.data.ostype == 'linux')
			dojo.removeClass('sethostnamediv', 'hidden');
		else
			dojo.addClass('sethostnamediv', 'hidden');
		dojo.byId('connectmethodlist').innerHTML = data.items.data.connectmethods.join('<br>');
		dijit.byId('connectmethodttd').set('href', data.items.data.connectmethodurl);
		if(data.items.data.ostype == 'windows') {
			dojo.removeClass('imageadauthbox', 'hidden');
			if('addomainvals' in data.items.data)
				var advalcnt = Object.keys(data.items.data.addomainvals).length;
			else
				var advalcnt = 0;
			if(data.items.data.addomainid != null) {
				dijit.byId('adauthenable').set('checked', true);
				if('extraaddomainid' in data.items.data) {
					var option = {value: data.items.data.extraaddomainid, label: data.items.data.addomain};
					dijit.byId('addomainid').addOption([option]);
					dijit.byId('addomainid').extraaddomainid = data.items.data.extraaddomainid;
					dijit.byId('addomainid').extraaddomainou = data.items.data.extraaddomainou;
				}
				dijit.byId('addomainid').set('value', data.items.data.addomainid);
				dijit.byId('baseou').set('value', data.items.data.baseOU);
				if(advalcnt == 1 && ('extraaddomainid' in data.items.data))
					dijit.byId('baseou').set('disabled', true);
			}
			else {
				dijit.byId('adauthenable').set('checked', false);
				dijit.byId('addomainid').reset();
				dijit.byId('baseou').reset();
				if(advalcnt == 0)
					dijit.byId('adauthenable').set('disabled', true);
			}
		}
		else {
			dojo.addClass('imageadauthbox', 'hidden');
			dijit.byId('adauthenable').set('checked', false);
			dijit.byId('addomainid').reset();
			dijit.byId('baseou').reset();
		}
		dijit.byId('subimagedlg').set('href', data.items.data.subimageurl);
		dojo.byId('revisiondiv').innerHTML = data.items.data.revisionHTML;
		dojo.byId('addeditdlgerrmsg').innerHTML = '';
		AJdojoCreate('revisiondiv');
		dijit.byId('addeditdlg').show();
	}
	else if(data.items.status == 'noaccess') {
		alert(_('Access denied to edit this item'));
	}
}

function initAddDialog() {
	if(dijit.byId('addomainid').options.length == 0) {
		dijit.byId('adauthenable').set('disabled', true);
	}
}

function delayedEditResize() {
	setTimeout(function() {resizeRecenterDijitDialog('addeditdlg');}, 300);
}

function resetEditResource() {
	dijit.byId('name').reset();
	dijit.byId('owner').reset();
	dijit.byId('description').reset();
	dijit.byId('usage').reset();
	dijit.byId('imgcomments').reset();
	dijit.byId('ram').reset();
	dijit.byId('cores').reset();
	dijit.byId('cpuspeed').reset();
	dijit.byId('networkspeed').reset();
	dijit.byId('concurrent').reset();
	if(dijit.byId('reload'))
		dijit.byId('reload').reset();
	dijit.byId('checkout').reset();
	dijit.byId('checkuser').reset();
	dijit.byId('rootaccess').reset();
	dijit.byId('sethostname').reset();
	if(dijit.byId('sysprep'))
		dijit.byId('sysprep').reset();
	if(dojo.byId('connectmethodids'))
		dojo.byId('connectmethodids').value = '';
	dojo.byId('addeditdlgerrmsg').innerHTML = '';
	if(dijit.byId('advancedoptions').open)
		dijit.byId('advancedoptions').toggle();
	dojo.byId('connectmethodlist').innerHTML = '';
	dojo.byId('addeditdlgerrmsg').innerHTML = '';
	dijit.byId('adauthenable').reset();
	dijit.byId('addomainid').reset();
	dijit.byId('baseou').reset();
}

function saveResource() {
	var submitbtn = dijit.byId('addeditbtn');
	var errobj = dojo.byId('addeditdlgerrmsg');
	if(! checkValidatedObj('name', errobj))
		return;
	/*if(! dijit.byId('owner')._hasBeenBlurred && dijit.byId('owner').get('value') == '') {
		dijit.byId('owner')._hasBeenBlurred = true;
		dijit.byId('owner').validate();
		submitbtn.set('disabled', true);
		setTimeout(function() {
			saveResource();
			submitbtn.set('disabled', false);
		}, 1000);
		return;
	}*/
	if(ownerchecking) {
		submitbtn.set('disabled', true);
		setTimeout(function() {
			saveResource();
			submitbtn.set('disabled', false);
		}, 1000);
		return;
	}
	if(! checkValidatedObj('owner', errobj))
		return;
	if(! checkValidatedObj('ram', errobj)) {
		if(! dijit.byId('advancedoptions').open)
			dijit.byId('advancedoptions').toggle();
		setTimeout(function() {dijit.byId('ram').focus();}, 300);
		return;
	}
	if(! checkValidatedObj('cores', errobj)) {
		if(! dijit.byId('advancedoptions').open)
			dijit.byId('advancedoptions').toggle();
		setTimeout(function() {dijit.byId('cores').focus();}, 300);
		return;
	}
	if(! checkValidatedObj('cpuspeed', errobj)) {
		if(! dijit.byId('advancedoptions').open)
			dijit.byId('advancedoptions').toggle();
		setTimeout(function() {dijit.byId('cpuspeed').focus();}, 300);
		return;
	}
	if(! checkValidatedObj('concurrent', errobj)) {
		if(! dijit.byId('advancedoptions').open)
			dijit.byId('advancedoptions').toggle();
		setTimeout(function() {dijit.byId('concurrent').focus();}, 300);
		return;
	}
	if(! checkValidatedObj('reload', errobj)) {
		if(! dijit.byId('advancedoptions').open)
			dijit.byId('advancedoptions').toggle();
		setTimeout(function() {dijit.byId('reload').focus();}, 300);
		return;
	}
	if(dijit.byId('adauthenable').checked && ! checkValidatedObj('baseou', errobj)) {
		if(! dijit.byId('advancedoptions').open)
			dijit.byId('advancedoptions').toggle();
		setTimeout(function() {dijit.byId('baseou').focus();}, 300);
		return;
	}

	if(dojo.byId('editresid').value == 0)
		var data = {continuation: dojo.byId('addresourcecont').value};
	else
		var data = {continuation: dojo.byId('saveresourcecont').value};

	data['name'] = dijit.byId('name').get('value');
	data['owner'] = dijit.byId('owner').get('value');

	data['networkspeed'] = parseInt(dijit.byId('networkspeed').get('value'));
	if((+log10(data['networkspeed']).toFixed(2) % 1) != 0) { // log10(1000) -> 2.9999999999999996
		errobj.innerHTML = _('Invalid network speed specified');
		return;
	}
	data['concurrent'] = dijit.byId('concurrent').get('value');
	if(data['concurrent'] < 0 || data['concurrent'] > 255) {
		errobj.innerHTML = _('Max Concurrent Usage must be between 0 and 255');
		return;
	}
	data['checkout'] = parseInt(dijit.byId('checkout').get('value'));
	if(data['checkout'] != 0 && data['checkout'] != 1) {
		errobj.innerHTML = _('Invalid value specified for \'Available for checkout\'');
		return;
	}
	data['checkuser'] = parseInt(dijit.byId('checkuser').get('value'));
	if(data['checkuser'] != 0 && data['checkuser'] != 1) {
		errobj.innerHTML = _('Invalid value specified for \'Check for logged in user\'');
		return;
	}
	data['rootaccess'] = parseInt(dijit.byId('rootaccess').get('value'));
	if(data['rootaccess'] != 0 && data['rootaccess'] != 1) {
		errobj.innerHTML = _('Invalid value specified for \'Users have administrative access\'');
		return;
	}
	data['sethostname'] = parseInt(dijit.byId('sethostname').get('value'));
	if(data['sethostname'] != 0 && data['sethostname'] != 1) {
		if(dojo.hasClass('sethoatnamediv', 'hidden')) {
			data['sethostname'] = 0;
		}
		else {
			errobj.innerHTML = _('Invalid value specified for \'Set computer hostname\'');
			return;
		}
	}
	data['maxinitialtime'] = parseInt(dijit.byId('maxinitialtime').get('value'));
	if(data['maxinitialtime'] < 0 || data['maxinitialtime'] > 201600) {
		errobj.innerHTML = _('Invalid Max Reservation Duration selected');
		return;
	}
	if(dijit.byId('sysprep')) {
		data['sysprep'] = parseInt(dijit.byId('sysprep').get('value'));
		if(data['sysprep'] != 0 && data['sysprep'] != 1) {
			errobj.innerHTML = _('Invalid value specified for \'Use sysprep\'');
			return;
		}
		if(! /[0-9,]+/.test(dojo.byId('connectmethodids').value)) {
			errobj.innerHTML = _('Invalid Connect Methods specified');
			return;
		}
		data['connectmethodids'] = dojo.byId('connectmethodids').value;
	}

	data['desc'] = dijit.byId('description').get('value');
	data['usage'] = dijit.byId('usage').get('value');
	if(dijit.byId('imgcomments'))
		data['imgcomments'] = dijit.byId('imgcomments').get('value');
	data['ram'] = dijit.byId('ram').get('value');
	data['cores'] = dijit.byId('cores').get('value');
	data['cpuspeed'] = dijit.byId('cpuspeed').get('value');
	if(dijit.byId('reload'))
		data['reload'] = dijit.byId('reload').get('value');
	if(dijit.byId('adauthenable').checked) {
		data['adauthenabled'] = 1;
		data['addomainid'] = dijit.byId('addomainid').get('value');
		data['baseou'] = dijit.byId('baseou').get('value');
	}
	else {
		data['adauthenabled'] = 0;
		data['addomainid'] = 0;
		data['baseou'] = '';
	}

	submitbtn.set('disabled', true);
	RPCwrapper(data, saveResourceCB, 1);
}

function submitClickThrough() {
	var submitbtn = dijit.byId('clickthroughDlgBtn');
	var data = {continuation: dojo.byId('addresourcecont').value};
	submitbtn.set('disabled', true);
	RPCwrapper(data, saveResourceCB, 1);
}

function saveResourceCB(data, ioArgs) {
	if(data.items.status == 'error') {
		dojo.byId('addeditdlgerrmsg').innerHTML = '<br>' + data.items.msg;
		dijit.byId('addeditbtn').set('disabled', false);
		return;
	}
	else if(data.items.status == 'adderror') {
		alert(data.items.errormsg);
		dijit.byId('clickthroughdlg').hide();
		dijit.byId('clickthroughDlgBtn').set('disabled', false);
	}
	else if(data.items.status == 'success') {
		if(data.items.action == 'clickthrough') {
			dojo.byId('addresourcecont').value = data.items.cont;
			dojo.byId('clickthroughDlgContent').innerHTML = data.items.agree;
			dijit.byId('addeditbtn').set('disabled', false);
			dijit.byId('clickthroughDlgBtn').set('disabled', false);
			dijit.byId('clickthroughdlg').show();
			return;
		}
		else if(data.items.action == 'add') {
			dijit.byId('clickthroughdlg').hide();
			dijit.byId('clickthroughDlgBtn').set('disabled', false);
			resRefresh();
		}
		else {
			resourcegrid.store.fetch({
				query: {id: data.items.data.id},
				onItem: function(item) {
					resourcegrid.store.setValue(item, 'name', data.items.data.prettyname);
					resourcegrid.store.setValue(item, 'owner', data.items.data.owner);
					resourcegrid.store.setValue(item, 'minram', data.items.data.minram);
					resourcegrid.store.setValue(item, 'minprocnumber', data.items.data.minprocnumber);
					resourcegrid.store.setValue(item, 'minprocspeed', data.items.data.minprocspeed);
					resourcegrid.store.setValue(item, 'minnetwork', data.items.data.minnetwork);
					resourcegrid.store.setValue(item, 'maxconcurrent', parseInt(data.items.data.maxconcurrent));
					resourcegrid.store.setValue(item, 'forcheckout', data.items.data.forcheckout);
					resourcegrid.store.setValue(item, 'checkuser', data.items.data.checkuser);
					resourcegrid.store.setValue(item, 'rootaccess', parseInt(data.items.data.rootaccess));
					resourcegrid.store.setValue(item, 'sethostname', parseInt(data.items.data.sethostname));
					resourcegrid.store.setValue(item, 'maxinitialtime', parseInt(data.items.data.maxinitialtime));
					resourcegrid.store.setValue(item, 'reloadtime', data.items.data.reloadtime);
					resourcegrid.store.setValue(item, 'adauthenabled', data.items.data.adauthenabled);
					resourcegrid.store.setValue(item, 'addomainid', data.items.data.addomainid);
					resourcegrid.store.setValue(item, 'addomain', data.items.data.addomain);
					resourcegrid.store.setValue(item, 'baseOU', data.items.data.baseOU);
				},
				onComplete: function(items, result) {
					// when call resourcegrid.sort directly, the table contents disappear; not sure why
					setTimeout(function() {resourcegrid.sort();}, 10);
				}
			});
		}
		dijit.byId('name').reset();
		dijit.byId('owner').reset();
		dijit.byId('networkspeed').reset();
		dijit.byId('concurrent').reset();
		dijit.byId('checkout').reset();
		dijit.byId('checkuser').reset();
		dijit.byId('rootaccess').reset();
		dijit.byId('sethostname').reset();
		dijit.byId('description').reset();
		dijit.byId('usage').reset();
		if(dijit.byId('imgcomments')) {
			dijit.byId('imgcomments').reset();
		}
		dijit.byId('ram').reset();
		dijit.byId('cores').reset();
		dijit.byId('cpuspeed').reset();
		if(dijit.byId('reload'))
			dijit.byId('reload').reset();
		dijit.byId('addeditdlg').hide();
		dojo.byId('addeditdlgerrmsg').innerHTML = '';
		if('extraaddomainid' in dijit.byId('addomainid')) {
			dijit.byId('addomainid').removeOption({value: dijit.byId('addomainid').extraaddomainid});
			delete dijit.byId('addomainid').extraaddomainid;
			delete dijit.byId('addomainid').extraaddomainou;
		}
		dijit.registry.filter(function(widget, index){return widget.id.match(/^comments/);}).forEach(function(widget) {widget.destroy();});
		setTimeout(function() {dijit.byId('addeditbtn').set('disabled', false);}, 250);
	}
}

function updateCurrentConMethods() {
	var tmp = dijit.byId('addcmsel').get('value');
	if(tmp == '') {
		dijit.byId('addcmsel').set('disabled', true);
		dijit.byId('addcmbtn').set('disabled', true);
	}
	else {
		dijit.byId('addcmsel').set('disabled', false);
		dijit.byId('addcmbtn').set('disabled', false);
	}
	// update list of current methods
	var obj = dojo.byId('curmethodsel');
	for(var i = obj.options.length - 1; i >= 0; i--)
		obj.remove(i);
	cmstore.fetch({
		query: {active: 1},
		onItem: function(item) {
			var obj = dojo.byId('curmethodsel').options;
			obj[obj.length] = new Option(item.display[0], item.name[0], false, false);
		},
		onComplete: function() {
			sortSelect(dojo.byId('curmethodsel'));
			updateConnectionMethodList();
		}
	});
}

function addSubimage() {
	dijit.byId('addbtn').attr('label', _('Working...'));
	var data = {continuation: dojo.byId('addsubimagecont').value,
	            imageid: dijit.byId('addsubimagesel').value};
	RPCwrapper(data, addSubimageCB, 1);
}

function addSubimageCB(data, ioArgs) {
	if(data.items.error) {
		dijit.byId('addbtn').attr('label', _('Add Subimage'));
		alert(data.items.msg);
		return;
	}
	var obj = dojo.byId('cursubimagesel');
	if(obj.options[0].text == _('(None)')) {
		obj.disabled = false;
		obj.remove(0);
	}
	dojo.byId('addsubimagecont').value = data.items.addcont;
	dojo.byId('remsubimagecont').value = data.items.remcont;
	var index = obj.options.length;
	obj.options[index] = new Option(data.items.name, data.items.newid, false, false);
	sortSelect(obj);
	dojo.byId('subimgcnt').innerHTML = obj.options.length;
	dijit.byId('addbtn').attr('label', _('Add Subimage'));
}

function remSubimages() {
	var obj = dojo.byId('cursubimagesel');
	var imgids = new Array();
	for(var i = obj.options.length - 1; i >= 0; i--) {
		if(obj.options[i].selected)
			imgids.push(obj.options[i].value);
	}
	if(! imgids.length)
		return;
	var ids = imgids.join(',');
	dijit.byId('rembtn').attr('label', _('Working...'));
	var data = {continuation: dojo.byId('remsubimagecont').value,
	            imageids: ids};
	RPCwrapper(data, remSubimagesCB, 1);
}

function remSubimagesCB(data, ioArgs) {
	if(data.items.error) {
		dijit.byId('rembtn').attr('label', _('Remove Selected Subimage(s)'));
		alert(data.items.msg);
		return;
	}
	var obj = dojo.byId('cursubimagesel');
	for(var i = obj.options.length - 1; i >= 0; i--) {
		if(obj.options[i].selected)
			obj.remove(i);
	}
	if(! obj.options.length) {
		obj.disabled = true;
		obj.options[0] = new Option(_('(None)'), 'none', false, false);
		dojo.byId('subimgcnt').innerHTML = 0;
	}
	else
		dojo.byId('subimgcnt').innerHTML = obj.options.length;
	dojo.byId('addsubimagecont').value = data.items.addcont;
	dojo.byId('remsubimagecont').value = data.items.remcont;
	dijit.byId('rembtn').attr('label', _('Remove Selected Subimage(s)'));
}

function selectConMethodRevision(url) {
	var revid = dijit.byId('conmethodrevid').get('value');
	dijit.byId('addcmsel').set('disabled', true);
	dijit.byId('addcmbtn').set('disabled', true);
	var oldstore = cmstore;
	cmstore = new dojo.data.ItemFileWriteStore({url: url + '&revid=' + revid});
	dijit.byId('addcmsel').setStore(cmstore, '', {query: {active: 0}});
}

function addConnectMethod() {
	cmstore.fetch({
		query: {name: dijit.byId('addcmsel').value},
		onItem: addConnectMethod2
	});
}

function addConnectMethod2(item) {
	if(cmstore.getValue(item, 'autoprovisioned') == 0) {
		dojo.byId('autoconfirmcontent').innerHTML = cmstore.getValue(item, 'display');
		dijit.byId('autoconfirmdlg').show();
		return;
	}
	addConnectMethod3();
}

function addConnectMethod3() {
	dojo.byId('cmerror').innerHTML = '';
	dijit.byId('addcmbtn').attr('label', _('Working...'));
	var data = {continuation: dojo.byId('addcmcont').value,
	            newid: dijit.byId('addcmsel').value};
	if(dijit.byId('conmethodrevid'))
		data.revid = dijit.byId('conmethodrevid').get('value');
	else
		data.revid = 0;
	RPCwrapper(data, addConnectMethodCB, 1);
}

function addConnectMethodCB(data, ioArgs) {
	if(data.items.error) {
		dijit.byId('addcmbtn').attr('label', _('Add Method'));
		alert(data.items.msg);
		return;
	}
	cmstore.fetch({
		query: {name: data.items.newid},
		onItem: function(item) {
			cmstore.setValue(item, 'active', 1);
		}
	});
	dijit.byId('addcmsel').setStore(cmstore, '', {query: {active: 0}});
	dojo.byId('addcmcont').value = data.items.addcont;
	dojo.byId('remcmcont').value = data.items.remcont;
	dijit.byId('addcmbtn').attr('label', _('Add Method'));
}

function remConnectMethod() {
	var obj = dojo.byId('curmethodsel');
	var cmids = new Array();
	for(var i = obj.options.length - 1; i >= 0; i--) {
		if(obj.options[i].selected)
			cmids.push(obj.options[i].value);
	}
	if(! cmids.length)
		return;
	if(cmids.length == obj.options.length) {
		dojo.byId('cmerror').innerHTML = _('There must be at least one item in Current Methods');
		setTimeout(function() {dojo.byId('cmerror').innerHTML = '';}, 20000);
		return;
	}
	var ids = cmids.join(',');
	dijit.byId('remcmbtn').attr('label', _('Working...'));
	var data = {continuation: dojo.byId('remcmcont').value,
	            ids: ids};
	if(dijit.byId('conmethodrevid'))
		data.revid = dijit.byId('conmethodrevid').get('value');
	else
		data.revid = 0;
	RPCwrapper(data, remConnectMethodCB, 1);
}

function remConnectMethodCB(data, ioArgs) {
	if(dijit.byId('addcmsel').get('disabled')) {
		dijit.byId('addcmsel').set('disabled', false);
		dijit.byId('addcmbtn').set('disabled', false);
	}
	if(data.items.error) {
		dijit.byId('rembtn').attr('label', _('Remove Selected Methods'));
		alert(data.items.msg);
		return;
	}
	var obj = dojo.byId('curmethodsel');
	for(var i = obj.options.length - 1; i >= 0; i--) {
		if(obj.options[i].selected) {
			cmstore.fetch({
				query: {name: obj.options[i].value},
				onItem: function(item) {
					cmstore.setValue(item, 'active', 0);
				}
			});
			obj.remove(i);
		}
	}
	dijit.byId('addcmsel').setStore(cmstore, '', {query: {active: 0}});
	dojo.byId('addcmcont').value = data.items.addcont;
	dojo.byId('remcmcont').value = data.items.remcont;
	updateConnectionMethodList();
	dijit.byId('remcmbtn').attr('label', _('Remove Selected Methods'));
}

function updateConnectionMethodList() {
	var options = dojo.byId('curmethodsel').options;
	var items = new Array();
	var ids = new Array();
	for(var i = 0; i < options.length; i++) {
		items.push(options[i].text);
		ids.push(options[i].value);
	}
	dojo.byId('connectmethodlist').innerHTML = items.join('<br>');
	if(dojo.byId('connectmethodids'))
		dojo.byId('connectmethodids').value = ids.join(',');
}

function log10(x) {
	return Math.log(x) / Math.LN10;
}

function updateRevisionProduction(cont) {
   document.body.style.cursor = 'wait';
	RPCwrapper({continuation: cont}, generalCB);
}

function updateRevisionComments(id, cont) {
   document.body.style.cursor = 'wait';
	var data = {continuation: cont,
	            comments: dijit.byId(id).value};
	RPCwrapper(data, updateRevisionCommentsCB, 1);
}

function updateRevisionCommentsCB(data, ioArgs) {
	//var obj = dijit.byId('comments' + data.items.id);
	//obj.setValue(data.items.comments);
	document.body.style.cursor = 'default';
}

function deleteRevisions(cont, idlist) {
	var ids = idlist.split(',');
	var checkedids = new Array();
	for(var i = 0; i < ids.length; i++) {
		var id = ids[i];
		var obj = document.getElementById('chkrev' + id);
		var obj2 = document.getElementById('radrev' + id);
		if(obj.checked) {
			if(obj2.checked) {
				alert(_('You cannot delete the production revision.'));
				return;
			}
			checkedids.push(id);
		}
	}
	if(checkedids.length == 0)
		return;
	checkedids = checkedids.join(',');
	var data = {continuation: cont,
	            checkedids: checkedids};
	RPCwrapper(data, deleteRevisionsCB, 1);
}

function deleteRevisionsCB(data, ioArgs) {
	if('status' in data.items && data.items.status == 'error') {
		dojo.byId('addeditdlgerrmsg').innerHTML = data.items.msg;
		return;
	}
	dijit.registry.filter(function(widget, index){return widget.id.match(/^comments/);}).forEach(function(widget) {widget.destroy();});
	var obj = document.getElementById('revisiondiv');
	obj.innerHTML = data.items.html;
	AJdojoCreate('revisiondiv');
}

function hideStartImageDlg() {
	dojo.byId('newimage').checked = true;
}

function hideUpdateImageDlg() {
	dojo.byId('newimage').checked = true;
	dojo.byId('updateimage').value = '';
	dojo.byId('previouscomments').innerHTML = '';
	dijit.byId('newcomments').reset();
}

function hideClickThroughDlg() {
	if(dijit.byId('addeditdlg').open)
		dijit.byId('addeditdlg').hide();
	if(dijit.byId('updateimagedlg').open)
		dijit.byId('updateimagedlg').hide();
}

function startImage(cont) {
	RPCwrapper({continuation: cont}, startImageCB, 1);
}

function startImageCB(data, ioArgs) {
	if(data.items.status == 'error') {
		alert(data.items.errmsg);
		return;
	}
	if(data.items.status == 'resgone') {
		alert(data.items.errmsg);
		resRefresh();
		return;
	}
	if(data.items.status == 'rootaccessnoimage') {
		dijit.byId('startimagedisableddlg').show();
		return;
	}
	// configure add image dialog, extra work, but saves an AJAX call after selection
	resetEditResource();
	var methodids = new Array();
	var methods = new Array();
	for(var key in data.items.connectmethods) {
		if(isNaN(key))
			continue;
		methodids.push(key);
		methods.push(data.items.connectmethods[key]);
	}
	dojo.byId('connectmethodids').value = methodids.join(',');
	dojo.byId('connectmethodlist').innerHTML = methods.join('<br>');
	dijit.byId('owner').set('value', data.items.owner);
	dijit.byId('connectmethodttd').set('href', data.items.connectmethodurl);
	dojo.byId('addresourcecont').value = data.items.newcont;
	if(data.items.enableupdate == 1) {
		dojo.byId('updateimage').value = data.items.updatecont;
		dojo.byId('previouscomments').innerHTML = data.items.comments;
		dojo.byId('updateimage').disabled = '';
		dojo.removeClass('updateimagelabel', 'disabledlabel');
	}
	else {
		dojo.byId('updateimage').disabled = 'disabled';
		dojo.addClass('updateimagelabel', 'disabledlabel');
	}
	dijit.byId('addeditbtn').set('label', _('Create Image'));
	dijit.byId('addeditbtn').set('disabled', false);
	dijit.byId('clickthroughDlgBtn').set('disabled', false);
	if(data.items.ostype == 'windows' || data.items.ostype == 'linux') {
		dojo.removeClass('sethostnamediv', 'hidden');
		if(data.items.ostype == 'windows')
			dijit.byId('sethostname').set('value', 0);
		else
			dijit.byId('sethostname').set('value', 1);
	}
	else
		dojo.addClass('sethostnamediv', 'hidden');
	dijit.byId('adauthenable').set('checked', false);
	dijit.byId('addomainid').reset();
	dijit.byId('baseou').reset();
	if(data.items.ostype == 'windows') {
		dojo.removeClass('sysprepdiv', 'hidden');
		dojo.removeClass('imageadauthbox', 'hidden');
	}
	else {
		dojo.addClass('sysprepdiv', 'hidden');
		dojo.addClass('imageadauthbox', 'hidden');
	}

	if(data.items.checkpoint) {
		dojo.addClass('imageendrescontent', 'hidden');
		dojo.removeClass('imagekeeprescontent', 'hidden');
	}
	else {
		dojo.removeClass('imageendrescontent', 'hidden');
		dojo.addClass('imagekeeprescontent', 'hidden');
	}

	// show selection dialog
	dijit.byId('startimagedlg').show();
}

function submitCreateUpdateImage() {
	if(dojo.byId('newimage').checked) {
		dijit.byId('addeditdlg').show();
		initAddDialog();
		dijit.byId('startimagedlg').hide();
		return;
	}
	else if(dojo.byId('updateimage').checked) {
		//var data = {continuation: dojo.byId('updateimage').value};
		dijit.byId('updateimagedlg').show();
		dijit.byId('startimagedlg').hide();
		return;
	}
}

function submitUpdateImage() {
	dijit.byId('updateImageDlgBtn').set('disabled', true);
	var data = {continuation: dojo.byId('updateimage').value,
	            comments: dijit.byId('newcomments').value};
	RPCwrapper(data, updateImageCB, 1);
}

function updateImageCB(data, ioArgs) {
	dijit.byId('updateImageDlgBtn').set('disabled', false);
	if(data.items.status == 'error') {
		alert(data.items.errmsg);
		dijit.byId('updateimagedlg').hide();
		return;
	} else if(data.items.status == 'success') {
		if(data.items.action == 'clickthrough') {
			dojo.byId('updateimage').value = data.items.cont;
			dojo.byId('clickthroughDlgContent').innerHTML = data.items.agree;
			dijit.byId('clickthroughDlgBtn').set('disabled', false);
			dijit.byId('clickthroughdlg').show();
			return;
		}
	}
	else if(data.items.status == 'noaccess') {
		alert(_('You must be the owner of the image to update it.'));
		dijit.byId('updateimagedlg').hide();
		return;
	}
}

function clickThroughAgree() {
	dijit.byId('clickthroughDlgBtn').set('disabled', true);
	if(dijit.byId('addeditdlg').open)
		saveResource();
	else if(dijit.byId('updateimagedlg').open)
		submitUpdateImageClickthrough();
}

function submitUpdateImageClickthrough() {
	var data = {continuation: dojo.byId('updateimage').value};
	RPCwrapper(data, submitUpdateImageClickthroughCB, 1);
}

function submitUpdateImageClickthroughCB(data, ioArgs) {
	if(data.items.status == 'noaccess') {
		alert(_('You must be the owner of the image to update it.'));
		dijit.byId('updateimagedlg').hide();
		dijit.byId('clickthroughdlg').hide();
		dijit.byId('clickthroughDlgBtn').set('disabled', false);
		return;
	}
	else if(data.items.status == 'error') {
		alert(data.items.errmsg);
		dijit.byId('updateimagedlg').hide();
		dijit.byId('clickthroughdlg').hide();
		dijit.byId('clickthroughDlgBtn').set('disabled', false);
		return;
	}
	imagestore.fetch({
		query: {id: data.items.imageid},
		onItem: function(item, request) {
			imagestore.setValue(item, 'revisions', 1);
		}
	});
	dijit.byId('updateimagedlg').hide();
	dijit.byId('clickthroughdlg').hide();
	dijit.byId('clickthroughDlgBtn').set('disabled', false);
	resRefresh();
}

function toggleADauth() {
	if(dijit.byId('adauthenable').checked) {
		dijit.byId('addomainid').set('disabled', false);
		dijit.byId('baseou').set('disabled', false);
	}
	else {
		dijit.byId('addomainid').set('disabled', true);
		dijit.byId('baseou').set('disabled', true);
	}
	selectADauth();
}

function selectADauth() {
	var obj = dijit.byId('addomainid');
	if('extraaddomainid' in obj && obj.get('value') == obj.extraaddomainid) {
		dijit.byId('baseou').set('value', obj.extraaddomainou);
		dijit.byId('baseou').set('disabled', true);
	}
	else if(dijit.byId('adauthenable').checked) {
		dijit.byId('baseou').set('disabled', false);
	}
}
