You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by jf...@apache.org on 2014/09/11 18:01:49 UTC

svn commit: r1624325 [13/13] - in /vcl/trunk/web: ./ .ht-inc/ .ht-inc/authmethods/ css/ js/ js/resources/

Added: vcl/trunk/web/js/resources/image.js
URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/resources/image.js?rev=1624325&view=auto
==============================================================================
--- vcl/trunk/web/js/resources/image.js (added)
+++ vcl/trunk/web/js/resources/image.js Thu Sep 11 16:01:48 2014
@@ -0,0 +1,676 @@
+/*
+* 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;
+}
+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') {
+		if(value == "0")
+			return '<span class="rederrormsg">false</span>';
+		if(value == "1")
+			return '<span class="ready">true</span>';
+	}
+	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);
+		dojo.byId('connectmethodlist').innerHTML = data.items.data.connectmethods.join('<br>');
+		dijit.byId('connectmethodttd').set('href', data.items.data.connectmethodurl);
+		dijit.byId('subimagedlg').set('href', data.items.data.subimageurl);
+		dojo.byId('revisiondiv').innerHTML = data.items.data.revisionHTML;
+		AJdojoCreate('revisiondiv');
+		dijit.byId('addeditdlg').show();
+	}
+	else if(data.items.status == 'noaccess') {
+		alert('Access denied to edit this item');
+	}
+}
+
+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();
+	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 = '';
+}
+
+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))
+		return;
+	if(! checkValidatedObj('cores', errobj))
+		return;
+	if(! checkValidatedObj('cpuspeed', errobj))
+		return;
+	if(! checkValidatedObj('concurrent', errobj))
+		return;
+	if(! checkValidatedObj('reload', errobj))
+		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'] == 1 || data['concurrent'] > 255) {
+		errobj.innerHTML = 'Max Concurrent Usage must be 0 or from 2 to 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;
+	}
+	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');
+
+	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();
+	}
+	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('clickthroughdlg').show();
+			return;
+		}
+		else if(data.items.action == 'add') {
+			dijit.byId('clickthroughdlg').hide();
+			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, 'reloadtime', data.items.data.reloadtime);
+				},
+				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('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 = '';
+		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('deletemsg').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 startImage(cont) {
+	RPCwrapper({continuation: cont}, startImageCB, 1);
+}
+
+function startImageCB(data, ioArgs) {
+	if(data.items.status == 'error') {
+		alert(data.items.errmsg);
+		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.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();
+		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() {
+	var data = {continuation: dojo.byId('updateimage').value,
+	            comments: dijit.byId('newcomments').value};
+	RPCwrapper(data, updateImageCB, 1);
+}
+
+function updateImageCB(data, ioArgs) {
+	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('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() {
+	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();
+		return;
+	}
+	else if(data.items.status == 'error') {
+		alert(data.items.errmsg);
+		dijit.byId('updateimagedlg').hide();
+		dijit.byId('clickthroughdlg').hide();
+		return;
+	}
+	dijit.byId('updateimagedlg').hide();
+	dijit.byId('clickthroughdlg').hide();
+	resRefresh();
+}

Added: vcl/trunk/web/js/resources/managementnode.js
URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/resources/managementnode.js?rev=1624325&view=auto
==============================================================================
--- vcl/trunk/web/js/resources/managementnode.js (added)
+++ vcl/trunk/web/js/resources/managementnode.js Thu Sep 11 16:01:48 2014
@@ -0,0 +1,298 @@
+/*
+* 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 ManagementNode() {
+	Resource.apply(this, Array.prototype.slice.call(arguments));
+	this.selids = [];
+	this.selectingall = false;
+}
+ManagementNode.prototype = new Resource();
+
+ManagementNode.prototype.colformatter = function(value, rowIndex, obj) {
+	if(obj.field == 'imagelibenable' ||
+	   obj.field == 'deleted') {
+		if(value == "0")
+			return '<span class="rederrormsg">false</span>';
+		if(value == "1")
+			return '<span class="ready">true</span>';
+	}
+	return value;
+}
+
+ManagementNode.prototype.nocasesort = function(a, b) {
+	var al = a.toLowerCase();
+	var bl = b.toLowerCase();
+	if(al.match(/[0-9]/) ||
+	   bl.match(/[0-9]/)) {
+		return resource.comparehostnames(al, bl);
+	}
+	if(al < bl)
+		return -1;
+	if(bl < al)
+		return 1;
+	return 0;
+}
+
+ManagementNode.prototype.comparehostnames = function(a, b) {
+	// get hostname
+	var tmp = a.split('.');
+	var h1 = tmp.shift();
+	var letters1 = h1.replace(/([^a-zA-Z])/g, '');
+
+	tmp = b.split('.');
+	var h2 = tmp.shift();
+	var letters2 = h2.replace(/([^a-zA-Z])/g, '');
+
+	// if non-numeric part is different, return based on that
+	cmp = letters1.localeCompare(letters2);
+	if(cmp)
+		return cmp;
+
+	// at this point, the only difference is in the numbers
+	var digits1 = h1.replace(/([^\d-])/g, '');
+	var digits1Arr = digits1.split('-');
+	var digits2 = h2.replace(/([^\d-])/g, '');
+	var digits2Arr = digits2.split('-');
+
+	var len1 = digits1Arr.length;
+	var len2 = digits2Arr.length;
+	for(var i = 0; i < len1 && i < len2; i++) {
+		if(parseInt(digits1Arr[i]) < parseInt(digits2Arr[i]))
+			return -1;
+		else if(parseInt(digits1Arr[i]) > parseInt(digits2Arr[i]))
+			return 1;
+	}
+
+	return 0;
+}
+
+var resource = new ManagementNode();
+
+function addNewResource(title) {
+	dijit.byId('addeditdlg').set('title', title);
+	dijit.byId('addeditbtn').set('label', title);
+	dojo.byId('editresid').value = 0;
+	resetEditResource();
+	dijit.byId('addeditdlg').show();
+}
+
+function inlineEditResourceCB(data, ioArgs) {
+	if(data.items.status == 'success') {
+		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.hostname);
+		dijit.byId('owner').set('value', data.items.data.owner);
+		dijit.byId('ipaddress').set('value', data.items.data.IPaddress);
+		dijit.byId('stateid').set('value', data.items.data.stateid);
+		dijit.byId('sysadminemail').set('value', data.items.data.sysadminemail);
+		dijit.byId('sharedmailbox').set('value', data.items.data.sharedmailbox);
+		dijit.byId('premoduleid').set('value', data.items.data.predictivemoduleid);
+		dijit.byId('checkininterval').set('value', data.items.data.checkininterval);
+		dijit.byId('installpath').set('value', data.items.data.installpath);
+		dijit.byId('timeservers').set('value', data.items.data.timeservers);
+		dijit.byId('keys').set('value', data.items.data.keys);
+		dijit.byId('sshport').set('value', data.items.data.sshport);
+		if(parseInt(data.items.data.imagelibenable))
+			dijit.byId('imagelibenable').set('value', true);
+		else
+			dijit.byId('imagelibenable').set('value', false);
+		dijit.byId('imagelibgroupid').set('value', data.items.data.imagelibgroupid);
+		dijit.byId('imagelibuser').set('value', data.items.data.imagelibuser);
+		dijit.byId('imagelibkey').set('value', data.items.data.imagelibkey);
+		dijit.byId('publicIPconfig').set('value', data.items.data.publicIPconfig);
+		dijit.byId('publicnetmask').set('value', data.items.data.publicnetmask);
+		dijit.byId('publicgateway').set('value', data.items.data.publicgateway);
+		dijit.byId('publicdnsserver').set('value', data.items.data.publicdnsserver);
+		dijit.byId('availablenetworks').set('value', data.items.data.availablenetworks.join(','));
+		dijit.byId('federatedauth').set('value', data.items.data.federatedauth);
+		dojo.byId('addeditdlgerrmsg').innerHTML = '';
+		dijit.byId('addeditdlg').show();
+	}
+	else if(data.items.status == 'noaccess') {
+		alert('Access denied to edit this item');
+	}
+}
+
+function resetEditResource() {
+	var fields = ['name', 'owner', 'ipaddress', 'stateid', 'sysadminemail', 'sharedmailbox', 'premoduleid', 'checkininterval', 'installpath', 'timeservers', 'keys', 'sshport', 'imagelibenable', 'imagelibgroupid', 'imagelibuser', 'imagelibkey', 'publicIPconfig', 'publicnetmask', 'publicgateway', 'publicdnsserver', 'availablenetworks', 'federatedauth'];
+	for(var i = 0; i < fields.length; i++) {
+		dijit.byId(fields[i]).reset();
+	}
+	dojo.byId('addeditdlgerrmsg').innerHTML = '';
+}
+
+function saveResource() {
+	var errobj = dojo.byId('addeditdlgerrmsg');
+	var fields = ['name', 'owner', 'ipaddress', 'sysadminemail', 'sharedmailbox', 'installpath', 'timeservers', 'keys', 'imagelibuser', 'imagelibkey', 'publicnetmask', 'publicgateway', 'publicdnsserver'];
+	for(var i = 0; i < fields.length; i++) {
+		if(! checkValidatedObj(fields[i], errobj))
+			return;
+	}
+
+	if(dojo.byId('editresid').value == 0)
+		var data = {continuation: dojo.byId('addresourcecont').value};
+	else
+		var data = {continuation: dojo.byId('saveresourcecont').value};
+
+	if(dijit.byId('imagelibenable').get('checked'))
+		data['imagelibenable'] = 1;
+	else
+		data['imagelibenable'] = 0;
+	if(data['imagelibenable'] == 1) {
+		if(dijit.byId('imagelibuser').get('value') == '') {
+			dojo.byId('addeditdlgerrmsg').innerHTML = 'Please fill in Image Library User';
+			return;
+		}
+		if(dijit.byId('imagelibkey').get('value') == '') {
+			dojo.byId('addeditdlgerrmsg').innerHTML = 'Please fill in Image Library SSH Identity Key File';
+			return;
+		}
+	}
+
+	data['publicIPconfig'] = dijit.byId('publicIPconfig').get('value');
+	if(data['publicIPconfig'] == 'static') {
+		if(dijit.byId('publicnetmask').get('value') == '') {
+			dojo.byId('addeditdlgerrmsg').innerHTML = 'Please fill in Public Netmask';
+			return;
+		}
+		if(dijit.byId('publicgateway').get('value') == '') {
+			dojo.byId('addeditdlgerrmsg').innerHTML = 'Please fill in Public Gateway';
+			return;
+		}
+		if(dijit.byId('publicdnsserver').get('value') == '') {
+			dojo.byId('addeditdlgerrmsg').innerHTML = 'Please fill in Public DNS Server';
+			return;
+		}
+	}
+
+	if(! dijit.byId('availablenetworks').get('value').match(/^[0-9\.\/,]*$/)) {
+		dojo.byId('addeditdlgerrmsg').innerHTML = 'Invalid entry submitted for Available Public Networks';
+		return;
+	}
+
+	if(! dijit.byId('federatedauth').get('value').match(/^[-0-9a-zA-Z_\.:;,]*$/)) {
+		dojo.byId('addeditdlgerrmsg').innerHTML = 'Invalid entry submitted for Affiliations using Federated Authentication for Linux Images';
+		return;
+	}
+
+	for(var i = 0; i < fields.length; i++) {
+		data[fields[i]] = dijit.byId(fields[i]).get('value');
+	}
+	data['stateid'] = dijit.byId('stateid').get('value');
+	data['premoduleid'] = dijit.byId('premoduleid').get('value');
+	data['checkininterval'] = dijit.byId('checkininterval').get('value');
+	data['sshport'] = dijit.byId('sshport').get('value');
+	data['imagelibgroupid'] = dijit.byId('imagelibgroupid').get('value');
+	data['availablenetworks'] = dijit.byId('availablenetworks').get('value');
+	data['federatedauth'] = dijit.byId('federatedauth').get('value');
+
+	dijit.byId('addeditbtn').set('disabled', true);
+	RPCwrapper(data, saveResourceCB, 1);
+}
+
+function saveResourceCB(data, ioArgs) {
+	if(data.items.status == 'error') {
+		dojo.byId('addeditdlgerrmsg').innerHTML = '<br>' + data.items.msg;
+		dijit.byId('addeditbtn').set('disabled', false);
+		return;
+	}
+	else if(data.items.status == 'adderror') {
+		alert(data.items.errormsg);
+	}
+	else if(data.items.status == 'success') {
+		if(data.items.action == 'add') {
+			if(typeof resourcegrid !== 'undefined') {
+				resourcegrid.store.newItem(data.items.data);
+				resourcegrid.sort();
+			}
+			dojo.forEach(dijit.findWidgets(dojo.byId('groupdlgcontent')), function(w) {
+				w.destroyRecursive();
+			});
+			if(data.items.nogroups == 0) {
+				dojo.byId('groupdlgcontent').innerHTML = data.items.groupingHTML;
+				AJdojoCreate('groupdlgcontent');
+				dojo.byId('resources').value = data.items.data.id;
+				populateLists('resources', 'ingroups', 'inresourcename', 'outresourcename', 'resgroupinggroupscont');
+				dijit.byId('groupdlg').show();
+				dijit.byId('groupingnote').show();
+			}
+		}
+		else {
+			resourcegrid.store.fetch({
+				query: {id: data.items.data.id},
+				onItem: function(item) {
+					resourcegrid.store.setValue(item, 'name', data.items.data.hostname);
+					resourcegrid.store.setValue(item, 'owner', data.items.data.owner);
+					resourcegrid.store.setValue(item, 'IPaddress', data.items.data.IPaddress);
+					resourcegrid.store.setValue(item, 'checkininterval', data.items.data.checkininterval);
+					resourcegrid.store.setValue(item, 'imagelibenable', data.items.data.imagelibenable);
+					resourcegrid.store.setValue(item, 'imagelibgroup', data.items.data.imagelibgroup);
+					resourcegrid.store.setValue(item, 'imagelibkey', data.items.data.imagelibkey);
+					resourcegrid.store.setValue(item, 'imagelibuser', data.items.data.imagelibuser);
+					resourcegrid.store.setValue(item, 'installpath', data.items.data.installpath);
+					resourcegrid.store.setValue(item, 'keys', data.items.data.keys);
+					resourcegrid.store.setValue(item, 'lastcheckin', data.items.data.lastcheckin);
+					resourcegrid.store.setValue(item, 'predictivemodule', data.items.data.predictivemodule);
+					resourcegrid.store.setValue(item, 'publicIPconfig', data.items.data.publicIPconfig);
+					resourcegrid.store.setValue(item, 'publicdnsserver', data.items.data.publicdnsserver);
+					resourcegrid.store.setValue(item, 'publicgateway', data.items.data.publicgateway);
+					resourcegrid.store.setValue(item, 'publicnetmask', data.items.data.publicnetmask);
+					resourcegrid.store.setValue(item, 'sharedmailbox', data.items.data.sharedmailbox);
+					resourcegrid.store.setValue(item, 'sshport', data.items.data.sshport);
+					resourcegrid.store.setValue(item, 'state', data.items.data.state);
+					resourcegrid.store.setValue(item, 'sysadminemail', data.items.data.sysadminemail);
+					resourcegrid.store.setValue(item, 'timeservers', data.items.data.timeservers);
+				},
+				onComplete: function(items, result) {
+					// when call resourcegrid.sort directly, the table contents disappear; not sure why
+					setTimeout(function() {resourcegrid.sort();}, 10);
+				}
+			});
+		}
+		dijit.byId('addeditdlg').hide();
+		resetEditResource();
+		setTimeout(function() {dijit.byId('addeditbtn').set('disabled', false);}, 250);
+	}
+}
+
+function toggleImageLibrary() {
+	if(dijit.byId('imagelibenable').checked) {
+		dijit.byId('imagelibgroupid').set('disabled', false);
+		dijit.byId('imagelibuser').set('disabled', false);
+		dijit.byId('imagelibkey').set('disabled', false);
+	}
+	else {
+		dijit.byId('imagelibgroupid').set('disabled', true);
+		dijit.byId('imagelibuser').set('disabled', true);
+		dijit.byId('imagelibkey').set('disabled', true);
+	}
+}
+
+function togglePublic() {
+	if(dijit.byId('publicIPconfig').get('value') == 'static') {
+		dijit.byId('publicnetmask').set('disabled', false);
+		dijit.byId('publicgateway').set('disabled', false);
+		dijit.byId('publicdnsserver').set('disabled', false);
+	}
+	else {
+		dijit.byId('publicnetmask').set('disabled', true);
+		dijit.byId('publicgateway').set('disabled', true);
+		dijit.byId('publicdnsserver').set('disabled', true);
+	}
+}

Added: vcl/trunk/web/js/resources/schedule.js
URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/resources/schedule.js?rev=1624325&view=auto
==============================================================================
--- vcl/trunk/web/js/resources/schedule.js (added)
+++ vcl/trunk/web/js/resources/schedule.js Thu Sep 11 16:01:48 2014
@@ -0,0 +1,298 @@
+/*
+* 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.
+*/
+
+var resource = new Resource();
+
+var scheduleTimeData = {
+	identifier: 'id',
+	items: []
+}
+
+function addNewResource(title) {
+	dijit.byId('addeditdlg').set('title', title);
+	dijit.byId('addeditbtn').set('label', title);
+	dojo.byId('editresid').value = 0;
+	dijit.byId('addeditdlg').show();
+}
+
+function inlineEditResourceCB(data, ioArgs) {
+	if(data.items.status == 'success') {
+		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.rscid;
+		dijit.byId('name').set('value', data.items.data.name);
+		dijit.byId('owner').set('value', data.items.data.owner);
+
+		if(! scheduleStore.nextid)
+			scheduleStore.nextid = 0;
+		var times = data.items.data.times;
+		for(var i = 0; i < times.length; i++) {
+			var id = ++scheduleStore.nextid;
+			var btn = new dijit.form.Button({
+				label: "Remove",
+				onClick: createRemoveFunc(removeTime, id)
+			});
+			var sday = new Date(0);
+			var day = Math.floor(times[i].start / 1440);
+			var minutes = Math.floor(times[i].start - (day * 1440));
+			sday.setFullYear(2000);
+			sday.setMonth(9);
+			sday.setDate(day + 1);
+			sday.setHours(Math.floor(minutes / 60));
+			sday.setMinutes(minutes % 60);
+			var eday = new Date(0);
+			day = Math.floor(times[i].end / 1440);
+			minutes = Math.floor(times[i].end - (day * 1440));
+			eday.setFullYear(2000);
+			eday.setMonth(9);
+			eday.setDate(day + 1);
+			eday.setHours(Math.floor(minutes / 60));
+			eday.setMinutes(minutes % 60);
+			scheduleStore.newItem({id: id, startday: sday, endday: eday, remove: btn});
+		}
+		setTimeout(function() {scheduleGrid.sort();}, 10);
+
+		dijit.byId('addeditdlg').show();
+	}
+	else if(data.items.status == 'noaccess') {
+		alert('Access denied to edit this item');
+	}
+}
+
+function addEditDlgHide() {
+	dijit.byId('addeditdlg').hide();
+	dijit.byId('name').reset();
+	dijit.byId('owner').reset();
+	dojo.byId('addeditdlgerrmsg').innerHTML = '';
+	dijit.byId('startday').reset();
+	dijit.byId('starttime').reset();
+	dijit.byId('endday').reset();
+	dijit.byId('endtime').reset();
+	scheduleStore.fetch({
+		query: {id: '*'},
+		onItem: function(item) {
+			scheduleStore.deleteItem(item);
+		}
+	});
+	var newstore = new dojo.data.ItemFileWriteStore({
+		data: {
+			identifier: 'id',
+		 	items: []
+		}
+	});
+	var oldstore = scheduleStore;
+	scheduleStore = newstore;
+	scheduleGrid.setStore(scheduleStore);
+	if(scheduleStore.nextid)
+		scheduleStore.nextid = 0;
+}
+
+function saveResource() {
+	var submitbtn = dijit.byId('addeditbtn');
+	var errobj = dojo.byId('addeditdlgerrmsg');
+	if(! checkValidatedObj('name', errobj))
+		return;
+	if(ownerchecking) {
+		submitbtn.set('disabled', true);
+		setTimeout(function() {
+			saveResource();
+			submitbtn.set('disabled', false);
+		}, 1000);
+		return;
+	}
+	if(! checkValidatedObj('owner', errobj))
+		return;
+
+	var times = new Array();
+	var items = scheduleStore._arrayOfAllItems;
+	for(var i = 0; i < items.length; i++) {
+		if(items[i] == null)
+			continue;
+		var start = minuteInWeek(items[i].startday[0]);
+		var end = minuteInWeek(items[i].endday[0]);
+		times.push(dojox.string.sprintf('%d:%d', start, end));
+	}
+	if(times.length == 0) {
+		dojo.byId('addeditdlgerrmsg').innerHTML = "You must have at least one entry for the schedule's times.";
+		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['times'] = times.join(',');
+
+	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);
+	}
+	else if(data.items.status == 'success') {
+		if(data.items.action == 'add') {
+			if(typeof resourcegrid !== 'undefined') {
+				resourcegrid.store.newItem(data.items.data);
+				resourcegrid.sort();
+			}
+			dojo.forEach(dijit.findWidgets(dojo.byId('groupdlgcontent')), function(w) {
+				w.destroyRecursive();
+			});
+			if(data.items.nogroups == 0) {
+				dojo.byId('groupdlgcontent').innerHTML = data.items.groupingHTML;
+				AJdojoCreate('groupdlgcontent');
+				dojo.byId('resources').value = data.items.data.id;
+				populateLists('resources', 'ingroups', 'inresourcename', 'outresourcename', 'resgroupinggroupscont');
+				dijit.byId('groupdlg').show();
+				dijit.byId('groupingnote').show();
+			}
+		}
+		else {
+			resourcegrid.store.fetch({
+				query: {id: data.items.data.id},
+				onItem: function(item) {
+					resourcegrid.store.setValue(item, 'name', data.items.data.name);
+					resourcegrid.store.setValue(item, 'owner', data.items.data.owner);
+				},
+				onComplete: function(items, result) {
+					// when call resourcegrid.sort directly, the table contents disappear; not sure why
+					setTimeout(function() {resourcegrid.sort();}, 10);
+				}
+			});
+		}
+		addEditDlgHide();
+		setTimeout(function() {dijit.byId('addeditbtn').set('disabled', false);}, 250);
+	}
+}
+
+function addTime() {
+	if(! checkValidatedObj('starttime'))
+		return;
+	if(! checkValidatedObj('endtime'))
+		return;
+	var endday = parseInt(dijit.byId('endday').value);
+	var endtimeobj = dijit.byId('endtime').value;
+	if(dijit.byId('startday').value != 0 &&
+	   endday == 0 &&
+	   (endtimeobj.getHours() != 0 ||
+	   endtimeobj.getMinutes() != 0)) {
+		alert("If the start day is not Sunday, the end day cannot\nbe Sunday with a time later than 12:00 AM.");
+		return;
+	}
+	var sday = new Date(0);
+	sday.setFullYear(2000);
+	sday.setMonth(9);
+	sday.setDate(parseInt(dijit.byId('startday').value) + 1);
+	sday.setHours(dijit.byId('starttime').value.getHours());
+	sday.setMinutes(dijit.byId('starttime').value.getMinutes());
+	var eday = new Date(0);
+	eday.setFullYear(2000);
+	eday.setMonth(9);
+	if(endday == 0 && 
+	   endtimeobj.getHours() == 0 &&
+		endtimeobj.getMinutes() == 0) {
+		eday.setDate(endday + 8);
+		eday.setHours(endtimeobj.getHours());
+		eday.setMinutes(endtimeobj.getMinutes());
+	}
+	else {
+		eday.setDate(endday + 1);
+		eday.setHours(endtimeobj.getHours());
+		eday.setMinutes(endtimeobj.getMinutes());
+	}
+
+	if(eday < sday) {
+		alert('The ending day/time cannot be earlier than the starting day/time');
+		return;
+	}
+
+	var items = scheduleStore._arrayOfAllItems;
+	for(var i = 0; i < items.length; i++) {
+		if(items[i] == null)
+			continue;
+		if(sday < items[i].endday[0] && eday > items[i].startday[0]) {
+			alert("The submitted days/times overlap with\nan existing set of days/times.");
+			return;
+		}
+	}
+
+	if(! scheduleStore.nextid)
+		scheduleStore.nextid = 0;
+	var id = ++scheduleStore.nextid;
+	var btn = new dijit.form.Button({
+		label: "Remove",
+		onClick: createRemoveFunc(removeTime, id)
+	});
+	scheduleStore.newItem({id: id, startday: sday, endday: eday, remove: btn});
+	scheduleGrid.sort();
+}
+
+function createRemoveFunc(func, id) {
+	return function() {func(id);}
+}
+
+function removeTime(id) {
+	scheduleStore.fetch({
+		query: {id: id},
+	   onItem: function(item) {
+			scheduleStore.deleteItem(item);
+		}
+	});
+}
+
+function formatDay(val) {
+	return getDay(val.getDay());
+}
+
+function formatTime(val) {
+	return getTime(val);
+}
+
+function getDay(day) {
+	var days = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
+	return days[day];
+}
+
+function getTime(obj) {
+	var hour = obj.getHours();
+	var min = obj.getMinutes();
+	if(hour == 12)
+		return dojox.string.sprintf('12:%02d PM', min);
+	if(hour == 0)
+		return dojox.string.sprintf('12:%02d AM', min);
+	if(parseInt(hour / 12))
+		return dojox.string.sprintf('%d:%02d PM', hour % 12, min);
+	return dojox.string.sprintf('%d:%02d AM', hour, min);
+}
+
+function minuteInWeek(val) {
+	var min = val.getMinutes();
+	min += val.getHours() * 60;
+	min += (val.getDate() - 1) * 1440;
+	return min;
+}

Modified: vcl/trunk/web/js/serverprofiles.js
URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/serverprofiles.js?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/js/serverprofiles.js (original)
+++ vcl/trunk/web/js/serverprofiles.js Thu Sep 11 16:01:48 2014
@@ -22,48 +22,11 @@ var profilesstoredata = {
 var allprofiles = '';
 var allgroups = '';
 
-function RPCwrapper(data, CB, dojson) {
-	if(dojson) {
-		dojo.xhrPost({
-			url: 'index.php',
-			load: CB,
-			handleAs: "json",
-			error: errorHandler,
-			content: data,
-			timeout: 15000
-		});
-	}
-	else {
-		dojo.xhrPost({
-			url: 'index.php',
-			load: CB,
-			error: errorHandler,
-			content: data,
-			timeout: 15000
-		});
-	}
-}
-
 function generalReqCB(data, ioArgs) {
 	eval(data);
 	document.body.style.cursor = 'default';
 }
 
-function populateProfileStore(cont) {
-	RPCwrapper({continuation: cont}, populateProfileStoreCB, 1);
-}
-
-function populateProfileStoreCB(data, ioArgs) {
-	var store = profilesstore;
-	for(var i = 0; i < data.items.length; i++) {
-		store.newItem({id: data.items[i].id, name: data.items[i].name, desc: data.items[i].desc, access: data.items[i].access});
-	}
-	dijit.byId('deployprofileid').setStore(profilesstore, '', {query: {id:new RegExp("^(?:(?!70000).)*$")}});
-	dijit.byId('profileid').setStore(profilesstore, '', {query: {id:new RegExp("^(?:(?!70000).)*$"),access:'admin'}});
-	dijit.byId('profiles').setStore(profilesstore, '', {query: {id:new RegExp("^(?:(?!70000).)*$"),access:'admin'}});
-	getGroups();
-}
-
 function selectProfileChanged() {
 	if(dijit.byId('profileid').get('value') == 70000)
 		return;
@@ -75,19 +38,6 @@ function selectProfileChanged() {
 		dijit.byId('profileid').setStore(profilesstore, '', {query: {id:new RegExp("^(?:(?!70000).)*$"),access:'admin'}});
 }
 
-function deployProfileChanged() {
-	profilesstore.fetch({
-		query: {id: dijit.byId('deployprofileid').get('value')},
-		onItem: function(item, request) {
-			var desc = profilesstore.getValue(item, 'desc');
-			if(desc == '') {
-				desc = '(No description)';
-			}
-			dojo.byId('deploydesc').innerHTML = desc;
-		}
-	});
-}
-
 function newServerProfile(cont) {
 	dijit.byId('profileid').setStore(profilesstore, '', {query: {id: '*',access:'admin'}});
 	dijit.byId('profileid').set('value', '70000');
@@ -101,7 +51,7 @@ function clearProfileItems() {
 	dijit.byId('profilename').set('value', '');
 	dijit.byId('profiledesc').set('value', '');
 	dijit.byId('profileimage').reset();
-	//dijit.byId('profilefixedIP').set('value', '');
+	dijit.byId('profilefixedIP').set('value', '');
 	//dijit.byId('profilefixedMAC').set('value', '');
 	if(dijit.byId('profileadmingroup'))
 		dijit.byId('profileadmingroup').reset();
@@ -117,8 +67,8 @@ function clearProfileItems() {
 function saveServerProfile(cont) {
 	if((dijit.byId('profileimage') && ! dijit.byId('profileimage').isValid()) ||
 	   (dijit.byId('profileadmingroup') && ! dijit.byId('profileadmingroup').isValid()) ||
-	   (dijit.byId('profilelogingroup') && ! dijit.byId('profilelogingroup').isValid()) /*||
-	   ! dijit.byId('profilefixedIP').isValid() ||
+	   (dijit.byId('profilelogingroup') && ! dijit.byId('profilelogingroup').isValid()) ||
+	   ! dijit.byId('profilefixedIP').isValid() /*||
 	   ! dijit.byId('profilefixedMAC').isValid()*/) {
 		alert('Please correct the fields with invalid input');
 		return;
@@ -142,11 +92,14 @@ function saveServerProfile(cont) {
 	            name: dijit.byId('profilename').get('value'),
 	            desc: dijit.byId('profiledesc').get('value'),
 	            imageid: imageid,
-	            //fixedIP: dijit.byId('profilefixedIP').get('value'),
 	            //fixedMAC: dijit.byId('profilefixedMAC').get('value'),
 	            admingroupid: admingroupid,
 	            logingroupid: logingroupid,
-	            monitored: dijit.byId('profilemonitored').get('value')};
+	            monitored: dijit.byId('profilemonitored').get('value'),
+	            fixedIP: dijit.byId('profilefixedIP').get('value'),
+	            netmask: dijit.byId('profilenetmask').get('value'),
+	            router: dijit.byId('profilerouter').get('value'),
+	            dns: dijit.byId('profiledns').get('value')};
 	RPCwrapper(data, saveServerProfileCB, 1);
 }
 
@@ -197,39 +150,6 @@ function saveServerProfileCB(data, ioArg
 	setTimeout(clearSaveStatus, 10000);
 }
 
-function getServerProfileData(cont, id, cb) {
-	if(id == 'profileid') {
-		dijit.byId('fetchProfilesBtn').set('label', 'Working...');
-		dijit.byId('fetchProfilesBtn').set('disabled', true);
-	}
-	var data = {continuation: cont,
-	            id: dijit.byId(id).get('value')};
-	RPCwrapper(data, cb, 1);
-	document.body.style.cursor = 'wait';
-}
-
-function getServerProfileDataDeployCB(data, ioArgs) {
-	document.body.style.cursor = 'default';
-	if(data.items.error) {
-		alert('You do not have access to apply this server profile.');
-		return;
-	}
-	dijit.byId('deployname').set('value', data.items.name);
-	dojo.byId('appliedprofileid').value = data.items.id;
-	dijit.byId('deployimage').set('value', data.items.imageid);
-	//dijit.byId('deployfixedIP').set('value', data.items.fixedIP);
-	//dijit.byId('deployfixedMAC').set('value', data.items.fixedMAC);
-	if(dijit.byId('deployadmingroup'))
-		dijit.byId('deployadmingroup').set('value', data.items.admingroupid);
-	else
-		dojo.byId('deployadmingroup').value = data.items.admingroupid;
-	if(dijit.byId('deploylogingroup'))
-		dijit.byId('deploylogingroup').set('value', data.items.logingroupid);
-	else
-		dojo.byId('deploylogingroup').value = data.items.logingroupid;
-	dijit.byId('deploymonitored').set('value', parseInt(data.items.monitored));
-}
-
 function getServerProfileDataManageCB(data, ioArgs) {
 	document.body.style.cursor = 'default';
 	dijit.byId('fetchProfilesBtn').set('label', 'Configure Profile');
@@ -242,7 +162,6 @@ function getServerProfileDataManageCB(da
 	dijit.byId('profilename').set('value', data.items.name);
 	dijit.byId('profiledesc').set('value', data.items.description);
 	dijit.byId('profileimage').set('value', data.items.imageid);
-	//dijit.byId('profilefixedIP').set('value', data.items.fixedIP);
 	//dijit.byId('profilefixedMAC').set('value', data.items.fixedMAC);
 	if(dijit.byId('profileadmingroup'))
 		dijit.byId('profileadmingroup').set('value', data.items.admingroupid);
@@ -253,6 +172,23 @@ function getServerProfileDataManageCB(da
 	else
 		dojo.byId('profilelogingroup').value = data.items.logingroupid;
 	dijit.byId('profilemonitored').set('value', parseInt(data.items.monitored));
+	dijit.byId('profilefixedIP').set('value', data.items.fixedIP);
+	if(dijit.byId('profilefixedIP').isValid() && dijit.byId('profilefixedIP') != '') {
+		dijit.byId('profilenetmask').set('value', data.items.netmask);
+		dijit.byId('profilerouter').set('value', data.items.router);
+		dijit.byId('profiledns').set('value', data.items.dns);
+		dijit.byId('profilenetmask').set('disabled', false);
+		dijit.byId('profilerouter').set('disabled', false);
+		dijit.byId('profiledns').set('disabled', false);
+	}
+	else {
+		dijit.byId('profilenetmask').set('value', '');
+		dijit.byId('profilerouter').set('value', '');
+		dijit.byId('profiledns').set('value', '');
+		dijit.byId('profilenetmask').set('disabled', true);
+		dijit.byId('profilerouter').set('disabled', true);
+		dijit.byId('profiledns').set('disabled', true);
+	}
 	dojo.removeClass('serverprofiledata', 'hidden');
 }
 
@@ -377,14 +313,11 @@ function getProfilesCB(data, ioArgs) {
 	allprofiles = data.items.all;
 	if(allprofiles.length == 0) {
 		dojo.addClass('profileslist', 'hidden');
-		if(! dijit.byId('deployprofileid').options.length)
-			dojo.addClass('deployprofileslist', 'hidden');
 		dojo.addClass('groupprofilesspan', 'hidden');
 		dojo.removeClass('noprofilegroupsspan', 'hidden');
 	}
 	else {
 		dojo.removeClass('profileslist', 'hidden');
-		dojo.removeClass('deployprofileslist', 'hidden');
 		if(dijit.byId('profileGroups').options.length) {
 			dojo.removeClass('groupprofilesspan', 'hidden');
 			dojo.addClass('noprofilegroupsspan', 'hidden');
@@ -569,36 +502,6 @@ function addRemProfileCB(data, ioArgs) {
 		getProfiles();
 }
 
-function setStartNow() {
-	dijit.byId('deploystarttime').set('required', false);
-	dijit.byId('deploystartdate').set('required', false);
-	dojo.addClass('deployerr', 'hidden');
-	dijit.byId('deploybtn').set('label', 'Deploy Server');
-}
-
-function setStartLater() {
-	dojo.byId('startlater').checked = true;
-	dijit.byId('deploystarttime').set('required', true);
-	dijit.byId('deploystartdate').set('required', true);
-	dojo.addClass('deployerr', 'hidden');
-	dijit.byId('deploybtn').set('label', 'Deploy Server');
-}
-
-function setEndIndef() {
-	dijit.byId('deployendtime').set('required', false);
-	dijit.byId('deployenddate').set('required', false);
-	dojo.addClass('deployerr', 'hidden');
-	dijit.byId('deploybtn').set('label', 'Deploy Server');
-}
-
-function setEndAt() {
-	dojo.byId('endat').checked = true;
-	dijit.byId('deployendtime').set('required', true);
-	dijit.byId('deployenddate').set('required', true);
-	dojo.addClass('deployerr', 'hidden');
-	dijit.byId('deploybtn').set('label', 'Deploy Server');
-}
-
 function submitDeploy() {
 	var cont = dojo.byId('deploycont').value;
 	if((dijit.byId('deployimage') && ! dijit.byId('deployimage').isValid()) ||
@@ -685,12 +588,22 @@ function submitDeploy() {
 		data.logingroupid = dijit.byId('deploylogingroup').get('value');
 	else
 		data.logingroupid = dojo.byId('deploylogingroup').value;
-	//data.ipaddr = dijit.byId('deployfixedIP').get('value');
+	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')
+	/*if(dijit.byId('deploymonitored').get('value') == 'on')
 		data.monitored = 1;
 	else
-		data.monitored = 0;
+		data.monitored = 0;*/
 	if(dojo.byId('startnow').checked) {
 		data.startmode = 0;
 	}

Added: vcl/trunk/web/js/siteconfig.js
URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/siteconfig.js?rev=1624325&view=auto
==============================================================================
--- vcl/trunk/web/js/siteconfig.js (added)
+++ vcl/trunk/web/js/siteconfig.js Thu Sep 11 16:01:48 2014
@@ -0,0 +1,54 @@
+/*
+* 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 generalSiteConfigCB(data, ioArgs) {
+	if(data.items.status == 'success') {
+		dojo.removeClass(data.items.msgid, 'cfgerror');
+		dojo.addClass(data.items.msgid, 'cfgsuccess');
+		dojo.byId(data.items.msgid).innerHTML = data.items.msg;
+		dijit.byId(data.items.btn).set('disabled', false);
+		clearmsg(data.items.msgid, 20);
+	}
+	else if(data.items.status == 'failed') {
+		dojo.removeClass(data.items.msgid, 'cfgsuccess');
+		dojo.addClass(data.items.msgid, 'cfgerror');
+		dojo.byId(data.items.msgid).innerHTML = data.items.errmsg;
+		dijit.byId(data.items.btn).set('disabled', false);
+		//clearmsg(data.items.msgid, 20);
+	}
+	else if(data.items.status == 'noaccess') {
+		alert(data.items.msg);
+	}
+}
+
+function clearmsg(id, wait) {
+	setTimeout(function() {
+		dojo.byId(id).innerHTML = '';
+		dojo.removeClass(id, 'cfgerror');
+		dojo.removeClass(id, 'cfgsuccess');
+	}, wait * 1000);
+}
+
+function saveTimeSource() {
+	var data = {continuation: dojo.byId('timesourcecont').value,
+	            timesource: dijit.byId('timesource').value};
+	dijit.byId('timesourcebtn').set('disabled', true);
+	RPCwrapper(data, generalSiteConfigCB, 1);
+}
+
+function saveConnectedUserCheck() {
+}

Modified: vcl/trunk/web/js/sitemaintenance.js
URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/sitemaintenance.js?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/js/sitemaintenance.js (original)
+++ vcl/trunk/web/js/sitemaintenance.js Thu Sep 11 16:01:48 2014
@@ -14,27 +14,6 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-function RPCwrapper(data, CB, dojson) {
-	if(dojson) {
-		dojo.xhrPost({
-			url: 'index.php',
-			load: CB,
-			handleAs: "json",
-			error: errorHandler,
-			content: data,
-			timeout: 15000
-		});
-	}
-	else {
-		dojo.xhrPost({
-			url: 'index.php',
-			load: CB,
-			error: errorHandler,
-			content: data,
-			timeout: 15000
-		});
-	}
-}
 
 function generalReqCB(data, ioArgs) {
 	eval(data);

Modified: vcl/trunk/web/js/statistics.js
URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/statistics.js?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/js/statistics.js (original)
+++ vcl/trunk/web/js/statistics.js Thu Sep 11 16:01:48 2014
@@ -15,28 +15,6 @@
 * limitations under the License.
 */
 
-function RPCwrapper(data, CB, dojson) {
-	if(dojson) {
-		dojo.xhrPost({
-			url: 'index.php',
-			load: CB,
-			handleAs: "json",
-			error: errorHandler,
-			content: data,
-			timeout: 300000
-		});
-	}
-	else {
-		dojo.xhrPost({
-			url: 'index.php',
-			load: CB,
-			error: errorHandler,
-			content: data,
-			timeout: 300000
-		});
-	}
-}
-
 function generalReqCB(data, ioArgs) {
 	eval(data);
 	document.body.style.cursor = 'default';
@@ -44,20 +22,20 @@ function generalReqCB(data, ioArgs) {
 
 function generateGraphs() {
 	var cont = dojo.byId('statdaycont').value;
-	RPCwrapper({continuation: cont}, generateColGraphsCB, 1);
+	RPCwrapper({continuation: cont}, generateColGraphsCB, 1, 300000);
 	var cont = dojo.byId('statreshourcont').value;
-	RPCwrapper({continuation: cont}, generateHourGraphsCB, 1);
+	RPCwrapper({continuation: cont}, generateHourGraphsCB, 1, 300000);
 	if(dojo.byId('statconcurrescont')) {
 		var cont = dojo.byId('statconcurrescont').value;
-		RPCwrapper({continuation: cont}, generateColGraphsCB, 1);
+		RPCwrapper({continuation: cont}, generateColGraphsCB, 1, 300000);
 	}
 	if(dojo.byId('statconcurbladecont')) {
 		var cont = dojo.byId('statconcurbladecont').value;
-		RPCwrapper({continuation: cont}, generateColGraphsCB, 1);
+		RPCwrapper({continuation: cont}, generateColGraphsCB, 1, 300000);
 	}
 	if(dojo.byId('statconcurvmcont')) {
 		var cont = dojo.byId('statconcurvmcont').value;
-		RPCwrapper({continuation: cont}, generateColGraphsCB, 1);
+		RPCwrapper({continuation: cont}, generateColGraphsCB, 1, 300000);
 	}
 }
 

Modified: vcl/trunk/web/js/vm.js
URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/vm.js?rev=1624325&r1=1624324&r2=1624325&view=diff
==============================================================================
--- vcl/trunk/web/js/vm.js (original)
+++ vcl/trunk/web/js/vm.js Thu Sep 11 16:01:48 2014
@@ -601,8 +601,8 @@ function getVMprofileDataCB(data, ioArgs
 	dijit.byId('pvs2').noValueIndicator = '(empty)';
 	dijit.byId('pvs3').noValueIndicator = '(empty)';
 	dijit.byId('pusername').noValueIndicator = '(empty)';
-    dijit.byId('prsakey').noValueIndicator = '(empty)';
-    dijit.byId('prsapub').noValueIndicator = '(empty)';
+	dijit.byId('prsakey').noValueIndicator = '(empty)';
+	dijit.byId('prsapub').noValueIndicator = '(empty)';
 
 	dijit.byId('pname').setValue(curprofile.profilename);
 	dijit.byId('presourcepath').setValue(curprofile.resourcepath);
@@ -618,8 +618,8 @@ function getVMprofileDataCB(data, ioArgs
 	dijit.byId('pusername').setValue(curprofile.username);
 	dijit.byId('pgenmac0').setValue(curprofile.eth0generated);
 	dijit.byId('pgenmac1').setValue(curprofile.eth1generated);
-    dijit.byId('prsapub').setValue(curprofile.rsapub);
-    dijit.byId('prsakey').setValue(curprofile.rsakey);
+	dijit.byId('prsapub').setValue(curprofile.rsapub);
+	dijit.byId('prsakey').setValue(curprofile.rsakey);
 	dojo.byId('ppassword').value = curprofile.password;
 	dojo.byId('ppwdconfirm').value = curprofile.password;
 	checkProfilePassword();