blob: 0864f9a2f0d7462f85a796ac04a25dcfad80cd24 [file] [log] [blame]
/*
* 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 currvms = '';
var curprofileid = '';
var fromok = 0;
var allvms = '';
var curprofile = '';
function getVMHostData(cont) {
var hostid = dojo.byId('vmhostid').value;
document.body.style.cursor = 'wait';
dijit.byId('messages').hide();
dojo.byId('vmhostdata').className = 'hidden';
dojo.byId('movevms').className = 'hidden';
dojo.byId('vmstate').innerHTML = '';
var selobj1 = dojo.byId('currvms');
for(var i = selobj1.options.length - 1; i >= 0; i--) {
selobj1.remove(i);
}
var selobj2 = dojo.byId('freevms');
for(i = selobj2.options.length - 1; i >= 0; i--) {
selobj2.remove(i);
}
var selobj3 = dojo.byId('movevmssel');
for(i = selobj3.options.length - 1; i >= 0; i--) {
selobj3.remove(i);
}
dojo.xhrPost({
url: 'index.php',
load: VMHostDataCB,
handleAs: "json",
error: errorHandler,
content: {continuation: cont,
vmhostid: hostid},
timeout: 15000
});
}
function VMHostDataCB(data, ioArgs) {
if(data.items.failed) {
alert('You do not have access to manage this host.');
document.body.style.cursor = 'default';
return;
}
dojo.byId('vmhostdata').className = 'shown';
curprofileid = data.items.profileid;
// leave this block for allowing changing of profiles later
/*var selobj = dojo.byId('vmprofileid');
for(var i = 0; i < selobj.options.length; i++) {
if(selobj.options[i].value == data.items.profile.id) {
selobj.selectedIndex = i;
break;
}
}*/
var profile = data.items.profile;
var obj = dijit.byId('vmprofile');
obj.setTitle(profile.profilename);
var ct = '<table>';
ct += '<tr><th align=right>Image:</th><td>' + profile.image + '</td></tr>';
ct += '<tr><th align=right>Resource Path:</th><td>' + profile.resourcepath + '</td></tr>';
ct += '<tr><th align=right>Folder Path:</th><td>' + profile.folderpath + '</td></tr>';
ct += '<tr><th align=right>Repository Path:</th><td>' + profile.repositorypath + '</td></tr>';
ct += '<tr><th align=right>Repository Image Type:</th><td>' + profile.repositoryimagetype + '</td></tr>';
ct += '<tr><th align=right>Virtual Disk Path:</th><td>' + profile.datastorepath + '</td></tr>';
ct += '<tr><th align=right>Virtual Disk Image Type:</th><td>' + profile.datastoreimagetype + '</td></tr>';
ct += '<tr><th align=right>Virtual Disk Mode:</th><td>' + profile.vmdisk + '</td></tr>';
ct += '<tr><th align=right>VM Working Directory Path:</th><td>' + profile.vmpath + '</td>';
ct += '<tr><th align=right>VM Network 0:</th><td>' + profile.virtualswitch0 + '</td></tr>';
ct += '<tr><th align=right>VM Network 1:</th><td>' + profile.virtualswitch1 + '</td></tr>';
ct += '<tr><th align=right>VM Network 2:</th><td>' + profile.virtualswitch2 + '</td></tr>';
ct += '<tr><th align=right>VM Network 3:</th><td>' + profile.virtualswitch3 + '</td></tr>';
ct += '</table>';
ct += '</table>';
ct += '</table>';
obj.setContent(ct);
if(obj.open)
obj.toggle();
allvms = data.items.allvms;
currvms = data.items.currvms;
var inobj = dojo.byId('currvms');
for(var i = 0; i < data.items.currvms.length; i++) {
inobj.options[inobj.options.length] = new Option(data.items.currvms[i].name, data.items.currvms[i].id);
}
dojo.byId('assignedcnt').innerHTML = dojo.byId('currvms').options.length;
var outobj = dojo.byId('freevms');
for(var i = 0; i < data.items.freevms.length; i++) {
outobj.options[outobj.options.length] = new Option(data.items.freevms[i].name, data.items.freevms[i].id);
}
if(data.items.noaccess.length) {
dojo.removeClass('noaccessdiv', 'hidden');
var tmp = new Array();
for(var i = 0; i < data.items.noaccess.length; i++) {
tmp.push(data.items.noaccess[i].name);
}
dojo.byId('noaccess').innerHTML = tmp.join('<br>');
}
else {
dojo.addClass('noaccessdiv', 'hidden');
dojo.byId('noaccess').innerHTML = '';
}
if(data.items.movevms.length) {
dojo.byId('movevms').className = 'shown';
obj = dojo.byId('movevmssel');
var movevms = data.items.movevms;
for(var i = 0; i < movevms.length; i++) {
var label = movevms[i]['hostname'] + ' (' + movevms[i]['time'] + ')';
obj.options[obj.options.length] = new Option(label, data.items.movevms[i].id);
}
}
//dojo.byId('changevmcont').value = data.items.continuation;
document.body.style.cursor = 'default';
}
function showVMstate() {
var selobj = dojo.byId('currvms');
var cnt = 0;
var state = '';
for(var i = 0; i < selobj.options.length; i++) {
if(selobj.options[i].selected) {
cnt++;
state = currvms[i].state;
}
}
if(cnt == 1)
dojo.byId('vmstate').innerHTML = state;
else
dojo.byId('vmstate').innerHTML = '';
}
function vmToHost(cont) {
document.body.style.cursor = 'wait';
var hostid = dojo.byId('vmhostid').value;
var obj = dojo.byId('freevms');
var listids = new Array();
for(var i = obj.options.length - 1; i >= 0; i--) {
if(obj.options[i].selected) {
listids.push(obj.options[i].value);
}
}
if(listids.length == 0) {
document.body.style.cursor = 'default';
return;
}
dojo.xhrPost({
url: 'index.php',
load: vmToHostCB,
handleAs: "json",
error: errorHandler,
content: {continuation: cont,
listids: listids.join(','),
hostid: hostid},
timeout: 15000
});
}
function vmToHostCB(data, ioArgs) {
if(data.items.failed) {
if(data.items.failed == 'nohostaccess')
alert('You do not have access to manage this VM host.');
document.body.style.cursor = 'default';
return;
}
/*
for each vmid sent back we
search through allvms until we find it keeping track of the previous item with inout == 1
we set allvms[vmid].inout to 1
we find the previous item in the select.options array
we insert a new option right after that one
*/
var vms = data.items.vms;
var addrem = data.items.addrem; // 1 for add, 0 for rem
var fails = data.items.fails;
var obj = dojo.byId('freevms');
for(var i = obj.options.length - 1; i >= 0; i--) {
if(obj.options[i].selected) {
var remove = 1;
for(var j = 0; j < fails.length; j++) {
if(obj.options[i].value == fails[j].id) {
obj.options[i].selected = false;
remove = 0;
break;
}
}
if(remove)
obj.remove(i);
}
}
var obj = dojo.byId('currvms');
for(var i = 0; i < vms.length; i++) {
var lastid = -1;
for(var j = 0; j < allvms.length; j++) {
if(allvms[j].id == vms[i].id) {
allvms[j].inout = addrem;
if(lastid < 0) {
if(addrem)
currvms.splice(0, 0, vms[i]);
var before = obj.options[0];
var newoption = new Option(allvms[j].name, allvms[j].id);
try {
obj.add(newoption, before);
}
catch(ex) {
obj.add(newoption, 0);
}
break;
}
else {
for(var k = 0; k < obj.options.length; k++) {
if(obj.options[k].value == lastid) {
if(addrem)
currvms.splice(0, 0, vms[i]);
var before = obj.options[k + 1];
var newoption = new Option(allvms[j].name, allvms[j].id);
if(before)
try {
obj.add(newoption, before);
}
catch(ex) {
obj.add(newoption, k + 1);
}
else
obj.options[obj.options.length] = newoption;
break;
}
}
}
break;
}
if(allvms[j].inout == addrem)
lastid = allvms[j].id;
}
}
dojo.byId('assignedcnt').innerHTML = dojo.byId('currvms').options.length;
document.body.style.cursor = 'default';
if(fails.length) {
var msg = '';
var msg1 = 'There was a problem that prevented the following\n'
+ 'VM(s) from being added to the host:\n\n';
var msg2 = 'You do not have access to add the following vm(s):\n\n';
var msg3 = ''; // problem
var msg4 = ''; // no access
for(var i = 0; i < fails.length; i++) {
if(fails[i].reason == 'noaccess')
msg4 += fails[i].name + '\n';
else
msg3 += fails[i].name + '\n';
}
if(msg3 != '')
msg += msg1 + msg3 + '\n';
if(msg4 != '')
msg += msg2 + msg4 + '\n';
alert(msg);
}
}
function vmFromHost(cont) {
document.body.style.cursor = 'wait';
var hostid = dojo.byId('vmhostid').value;
var obj = dojo.byId('currvms');
var listids = new Array();
for(var i = obj.options.length - 1; i >= 0; i--) {
if(obj.options[i].selected)
listids.push(obj.options[i].value);
}
if(listids.length == 0) {
document.body.style.cursor = 'default';
return;
}
dojo.xhrPost({
url: 'index.php',
load: vmFromHostCB,
handleAs: "json",
error: errorHandler,
content: {continuation: cont,
listids: listids.join(','),
hostid: hostid},
timeout: 15000
});
}
function vmFromHostCB(data, ioArgs) {
if(data.items.failed) {
alert('You do not have access to manage this VM host.');
document.body.style.cursor = 'default';
return;
}
/*
for each vmid sent back we
search through allvms until we find it keeping track of the previous item with inout == 1
we set allvms[vmid].inout to 1
we find the previous item in the select.options array
we insert a new option right after that one
*/
var vms = data.items.vms;
var addrem = data.items.addrem; // 1 for add, 0 for rem
var checks = data.items.checks;
var fails = data.items.fails;
var obj = dojo.byId('currvms');
for(var i = obj.options.length - 1; i >= 0; i--) {
if(obj.options[i].selected) {
var remove = 1;
for(var j = 0; j < checks.length; j++) {
if(obj.options[i].value == checks[j].id) {
obj.options[i].selected = false;
remove = 0;
break;
}
}
for(var j = 0; j < fails.length; j++) {
if(obj.options[i].value == fails[j].id) {
obj.options[i].selected = false;
remove = 0;
break;
}
}
if(remove) {
obj.remove(i);
dojo.byId('vmstate').innerHTML = '';
currvms.splice(i, 1);
}
}
}
for(var i = 0; i < vms.length; i++) {
for(var j = 0; j < allvms.length; j++) {
if(allvms[j].id == vms[i].id) {
allvms.splice(j, 1);
break;
}
}
}
if(data.items.vms.length) {
dojo.byId('movevms').className = 'shown';
obj = dojo.byId('movevmssel');
var vms = data.items.vms;
for(var i = 0; i < vms.length; i++) {
var label = vms[i]['hostname'] + ' (' + vms[i]['time'] + ')';
obj.options[obj.options.length] = new Option(label, data.items.vms[i].reqid);
}
}
if(fails.length) {
var msg1 = '';
var msg2 = '';
for(var i = 0; i < fails.length; i++) {
if(fails[i].reason == 'noaccess')
msg1 += fails[i].name + '\n';
else if(fails[i].reason == 'nomgtnode')
msg2 += fails[i].name + '\n';
}
if(msg1.length)
alert('You do not have access to remove the following vm(s):\n\n' + msg1);
if(msg2.length)
alert('The following vms could not be removed because no management node was available for them:\n\n' + msg2);
}
var checks = data.items.checks;
if(checks.length) {
var content = 'The following computer(s) have reservations on them that cannot be<br>'
+ 'moved. Click <strong>Move Later</strong> to move the computer(s) off of the host<br>'
+ 'at the listed time(s) or click <strong>Cancel</strong> to leave the computer(s) on<br>'
+ 'the host:<br><br>';
for(var i = 0; i < checks.length; i++) {
content += 'computer: ' + checks[i].hostname + '<br>';
content += 'free at: ' + checks[i].end + '<br><br>';
}
var func = function() {vmFromHostDelayed(data.items.cont);};
setMessageWindow('Delayed Move', 'Move Later', content, func);
}
dojo.byId('assignedcnt').innerHTML = dojo.byId('currvms').options.length;
document.body.style.cursor = 'default';
}
function vmFromHostDelayed(cont) {
dojo.xhrPost({
url: 'index.php',
load: reloadVMhostCB,
handleAs: "json",
error: errorHandler,
content: {continuation: cont},
timeout: 15000
});
}
function reloadVMhostCB(data, ioArgs) {
if(data.items.failed) {
alert('You do not have access to manage this VM host.');
document.body.style.cursor = 'default';
return;
}
if(data.items.fails.length) {
var msg1 = '';
var msg2 = '';
for(var i = 0; i < data.items.fails.length; i++) {
if(data.items.fails[i].reason == 'noaccess')
msg1 += data.items.fails[i].name + '\n';
else if(data.items.fails[i].reason == 'nomgtnode')
msg2 += data.items.fails[i].name + '\n';
}
if(msg1.length)
alert('You do not have access to remove the following vm(s):\n\n' + msg1);
if(msg2.length)
alert('No management node was available to move the following VMs off of this host; therefore, nothing will be done at this time:\n\n' + msg2);
}
if(data.items.msg == 'SUCCESS')
getVMHostData(data.items.cont);
else
document.body.style.cursor = 'default';
}
function setMessageWindow(title, okbtntext, content, submitFunc) {
obj = dijit.byId('messages');
obj.titleNode.innerHTML = title;
dojo.byId('messagestext').innerHTML = content;
dojo.byId('messagesokbtn').innerHTML = okbtntext;
dojo.byId('messagesokbtn').onclick = submitFunc;
obj.show();
}
function cancelVMmove(cont) {
document.body.style.cursor = 'wait';
var hostid = dojo.byId('vmhostid').value;
var obj = dojo.byId('movevmssel');
var listids = new Array();
for(var i = obj.options.length - 1; i >= 0; i--) {
if(obj.options[i].selected)
listids.push(obj.options[i].value);
}
if(listids.length == 0) {
document.body.style.cursor = 'default';
return;
}
dojo.xhrPost({
url: 'index.php',
load: reloadVMhostCB,
handleAs: "json",
error: errorHandler,
content: {continuation: cont,
listids: listids.join(','),
hostid: hostid},
timeout: 15000
});
}
function getVMprofileData(cont) {
document.body.style.cursor = 'wait';
dojo.byId('vmprofiledata').className = 'hidden';
var profileid = dojo.byId('profileid').value;
dojo.xhrPost({
url: 'index.php',
load: getVMprofileDataCB,
handleAs: "json",
error: errorHandler,
content: {continuation: cont,
profileid: profileid},
timeout: 15000
});
}
function getVMprofileDataCB(data, ioArgs) {
if(data.items.failed) {
alert('You do not have access to manage this vm profile.');
document.body.style.cursor = 'default';
return;
}
curprofile = data.items.profile;
var obj = dijit.byId('pimage');
var store = new dojo.data.ItemFileReadStore({data: data.items.images});
obj.store = store;
if(curprofile.imageid != 0)
obj.setValue(curprofile.imageid);
var obj = dijit.byId('pvmdisk');
var store = new dojo.data.ItemFileReadStore({data: data.items.vmdisk});
obj.store = store;
if(curprofile.vmdisk != 0)
obj.setValue(curprofile.vmdisk);
dijit.byId('pname').noValueIndicator = '(empty)';
dijit.byId('presourcepath').noValueIndicator = '(empty)';
dijit.byId('pfolderpath').noValueIndicator = '(empty)';
dijit.byId('prepositorypath').noValueIndicator = '(empty)';
dijit.byId('pdspath').noValueIndicator = '(empty)';
dijit.byId('pvmpath').noValueIndicator = '(empty)';
dijit.byId('pvs0').noValueIndicator = '(empty)';
dijit.byId('pvs1').noValueIndicator = '(empty)';
dijit.byId('pvs2').noValueIndicator = '(empty)';
dijit.byId('pvs3').noValueIndicator = '(empty)';
dijit.byId('pusername').noValueIndicator = '(empty)';
dijit.byId('pname').setValue(curprofile.profilename);
dijit.byId('presourcepath').setValue(curprofile.resourcepath);
dijit.byId('pfolderpath').setValue(curprofile.folderpath);
dijit.byId('prepositorypath').setValue(curprofile.repositorypath);
dijit.byId('prepositoryimgtype').setValue(curprofile.repositoryimagetypeid);
dijit.byId('pdspath').setValue(curprofile.datastorepath);
dijit.byId('pdatastoreimgtype').setValue(curprofile.datastoreimagetypeid);
dijit.byId('pvmpath').setValue(curprofile.vmpath);
dijit.byId('pvs0').setValue(curprofile.virtualswitch0);
dijit.byId('pvs1').setValue(curprofile.virtualswitch1);
dijit.byId('pvs2').setValue(curprofile.virtualswitch2);
dijit.byId('pvs3').setValue(curprofile.virtualswitch3);
dijit.byId('pusername').setValue(curprofile.username);
dijit.byId('pgenmac0').setValue(curprofile.eth0generated);
dijit.byId('pgenmac1').setValue(curprofile.eth1generated);
if(curprofile.pwdlength == 0) {
dojo.byId('ppassword').value = '';
dojo.byId('ppwdconfirm').value = '';
}
else {
dojo.byId('ppassword').value = '********';
dojo.byId('ppwdconfirm').value = 'xxxxxxxx';
}
dojo.byId('ppwdmatch').innerHTML = '';
dojo.byId('vmprofiledata').className = 'shown';
document.body.style.cursor = 'default';
}
function newProfile(cont) {
var title = 'Create New Profile';
var btn = 'Create Profile';
var content = 'Enter name of new profile:<br>'
+ '<input type=text id=newprofile><br>'
+ '<font color=red><em><span id=nperrormsg></span></em></font><br>';
var func = function() {
var newname = dojo.byId('newprofile').value;
var regex = new RegExp('^[-A-Za-z0-9:\(\)# ]{3,56}$');
if(! newname.match(regex)) {
alert('Name must be between 3 and 56 characters\nand can only include letters, numbers,\nspaces, and these characters -:()#');
return;
}
document.body.style.cursor = 'wait';
dojo.xhrPost({
url: 'index.php',
load: newProfileCB,
handleAs: "json",
error: errorHandler,
content: {continuation: cont,
newname: newname},
timeout: 15000
});
};
setMessageWindow(title, btn, content, func);
}
function newProfileCB(data, ioArgs) {
if(data.items.failed) {
document.body.style.cursor = 'default';
dojo.byId('nperrormsg').innerHTML =
'A profile with this name already exists';
return;
}
dijit.byId('messages').hide();
alert('Be sure to finish configuring this profile');
var obj = dojo.byId('profileid');
obj.options[obj.options.length] = new Option(data.items.profile.profilename, data.items.profile.id);
obj.options[obj.options.length - 1].selected = true;
dojo.removeClass('selectprofilediv', 'hidden');
// TODO insert new entry in correct order
getVMprofileDataCB(data, ioArgs);
}
function delProfile(cont) {
var title = 'Delete Profile';
var btn = 'Delete Profile';
var content = "Delete the following profile?<br>";
content += "<table summary=\"\">";
content += "<tr>";
content += "<th align=right>Name:</th>";
content += "<td>" + curprofile.profilename + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Image:</th>";
content += "<td>" + curprofile.image + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Resource Path:</th>";
content += "<td>" + curprofile.resourcepath + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Folder Path:</th>";
content += "<td>" + curprofile.folderpath + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Repository Path:</th>";
content += "<td>" + curprofile.repositorypath + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Repository Image Type:</th>";
content += "<td>" + curprofile.repositoryimagetype + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Virtual Disk Path:</th>";
content += "<td>" + curprofile.datastorepath + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Virtual Disk Image Type:</th>";
content += "<td>" + curprofile.datastoreimagetype + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Virtual Disk Mode:</th>";
content += "<td>" + curprofile.vmdisk + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>VM Working Directory Path:</th>";
content += "<td>" + curprofile.vmpath + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>VM Network 0:</th>";
content += "<td>" + curprofile.virtualswitch0 + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>VM Network 1:</th>";
content += "<td>" + curprofile.virtualswitch1 + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>VM Network 2:</th>";
content += "<td>" + curprofile.virtualswitch2 + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>VM Network 3:</th>";
content += "<td>" + curprofile.virtualswitch3 + "</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Generate eth0 MAC:</th>";
if(curprofile.eth0generated == 0)
content += "<td>No</td>";
else
content += "<td>Yes</td>";
content += "</tr>";
content += "<tr>";
content += "<th align=right>Generate eth1 MAC:</th>";
if(curprofile.eth1generated == 0)
content += "<td>No</td>";
else
content += "<td>Yes</td>";
content += "</tr>";
content += "</table>";
var func = function() {
var profileid = dojo.byId('profileid').value;
if(profileid == curprofileid)
dojo.byId('vmhostdata').className = 'hidden';
document.body.style.cursor = 'wait';
dojo.xhrPost({
url: 'index.php',
load: delProfileCB,
handleAs: "json",
error: errorHandler,
content: {continuation: cont,
profileid: profileid},
timeout: 15000
});
};
setMessageWindow(title, btn, content, func);
}
function delProfileCB(data, ioArgs) {
if(data.items.failed) {
if(data.items.failed == 'noaccess') {
alert('You do not have access to manage this vm profile.');
}
else if(data.items.failed == 'inuse') {
alert('This profile is currently in use on a vmhost. You must reload\nthe host with another profile to delete this one.');
}
dijit.byId('messages').hide();
document.body.style.cursor = 'default';
return;
}
dijit.byId('messages').hide();
var obj = dojo.byId('profileid');
obj.remove(obj.selectedIndex);
dojo.byId('vmprofiledata').className = 'hidden';
if(obj.options.length == 0)
dojo.addClass('selectprofilediv', 'hidden');
document.body.style.cursor = 'default';
}
function updateProfile(id, field) {
dojo.removeClass('selectprofilediv', 'hidden');
if(dijit.byId(id))
var newvalue = dijit.byId(id).value;
else
var newvalue = dojo.byId(id).value;
if(curprofile[field] == newvalue && field != 'password')
return;
if(field == 'password') {
if(dojo.byId('ppassword').value == '********' &&
dojo.byId('ppwdconfirm').value == 'xxxxxxxx') {
dojo.byId('savestatus').innerHTML = '(No change)';
setTimeout(function() {dojo.byId('savestatus').innerHTML = '';}, 3000);
return;
}
dojo.byId('savestatus').innerHTML = 'Saving...';
}
document.body.style.cursor = 'wait';
var profileid = dojo.byId('profileid').value;
var cont = dojo.byId('pcont').value;
if(profileid == curprofileid)
dojo.byId('vmhostdata').className = 'hidden';
dojo.xhrPost({
url: 'index.php',
load: updateProfileCB,
error: errorHandler,
content: {continuation: cont,
profileid: profileid,
item: field,
newvalue: newvalue},
timeout: 15000
});
}
function updateProfileCB(data, ioArgs) {
eval(data);
document.body.style.cursor = 'default';
}
function checkProfilePassword() {
var pobj = dojo.byId('ppassword');
var cobj = dojo.byId('ppwdconfirm');
var mobj = dojo.byId('ppwdmatch');
if(pobj.value == "" && cobj.value == "") {
mobj.innerHTML = '';
}
else if(pobj.value == cobj.value) {
mobj.innerHTML = '<font color="#008000">match</font>';
}
else {
mobj.innerHTML = '<font color="red">no match</font>';
}
}