· 6 years ago · Nov 22, 2019, 02:10 PM
1// Firecall WebApp
2// Author: Leon Cowle
3
4// GLOBAL VARS/FUNC declarations
5
6// Roles (permissions):
7// I first used "const" for all these, but IE6 doesn't understand that. DAMN YOU IE6!
8var rolePBLC = 0; // Public : generic, lowest rights role
9var roleADMN = 1; // Admin : super unlimited administrator, i.e. IDM team
10var rolePADM = 2; // Profile Admin : e.g TPM, can create profiles, add targets to them, but not check them out
11var roleGADM = 4; // Group Admin : Can auth new people into group
12var roleGMEM = 8; // Group Member : Can create/checkout/delete profiles
13var roleTMEM = 16; // Type Member : can create profiles (still restricted to certain types, though)
14// END GLOBAL declarations
15
16// ========= Reusable Funcs ============================================================
17
18// Pad a string out with zeros on the left
19// mystr = "bob";
20// mystr.zeropad(5) === "00bob"
21String.prototype.zeropad = function(len) {
22 var str = this;
23 while (str.length < len) {
24 str = '0' + str;
25 }
26 return str;
27}
28
29// Add cgi_escape method to type "string".
30String.prototype.cgi_escape = function () {
31 return this.replace(/&/g, "&").replace(/</g,
32 "<").replace(/>/g, ">");
33};
34
35// like Python's "dir" :-)
36function dir(ob) {
37 out = [];
38 for (attr in ob) {
39 out.push(attr);
40 }
41 out.sort();
42 return out;
43}
44
45function stripWhiteSpace(text) {
46 return text.replace(/^\s+/,'').replace(/\s+$/,'');
47}
48
49function preventClick(e) {
50 YAHOO.util.Event.preventDefault(e);
51};
52
53function getElemVal(elname) {
54 try {
55 var el = document.getElementById(elname);
56 if(typeof(el) == "undefined") throw "error"; // Not sure which error will occur
57 if(!el) throw "error"; // Not sure which error will occur
58 if(el == null) throw "error"; // Not sure which error will occur
59 } catch(err) {
60 fc_dialog_msg("HTML Element '" + elname + "' doesn't exist in the DOM.", "alarm");
61 return null;
62 };
63 return el.value;
64}
65
66function setElemVal(elname, elvalue) {
67 try {
68 var el = document.getElementById(elname);
69 if(typeof(el) == "undefined") throw "error"; // Not sure which error will occur
70 if(!el) throw "error"; // Not sure which error will occur
71 if(el == null) throw "error"; // Not sure which error will occur
72 } catch(err) {
73 fc_dialog_msg("HTML Element '" + elname + "' doesn't exist in the DOM.", "alarm");
74 return null;
75 };
76 el.value = elvalue;
77}
78
79// Populate target type select boxes with YAHOO.firecall.targetTypes options
80function addTargetOptions(selectbox, zeroit) {
81 if(typeof(zeroit) == "undefined") zeroit = true;
82 var selElem = document.getElementById(selectbox);
83 var newOpt;
84 if(zeroit) selElem.options.length = 0; // ensure it's empty to start with
85 for(var i in YAHOO.firecall.targetTypes) {
86 selElem.options[selElem.options.length] = new Option(YAHOO.firecall.targetTypes[i]["optText"], YAHOO.firecall.targetTypes[i]["optValue"]);
87 };
88}
89
90// Find the option with value "value" in the selectbox select list, and select it.
91function changeSelectItem(selectbox, value) {
92 for(var i=0;i<document.getElementById(selectbox).options.length;i++) {
93 if(document.getElementById(selectbox).options[i].value == value) {
94 document.getElementById(selectbox).selectedIndex=i;
95 }
96 }
97}
98
99// return days from a seconds value
100function daysFromSeconds(secsStr) {
101 if ( parseInt(secsStr).toString() != secsStr) return "NaN";
102 var seconds = parseInt(secsStr);
103 if( YAHOO.lang.isNumber(seconds) ) return parseInt(seconds / 86400);
104 return "NaN";
105}
106
107// return hours from a seconds value
108function hrsFromSeconds(secsStr) {
109 if ( parseInt(secsStr).toString() != secsStr) return "NaN";
110 var seconds = parseInt(secsStr);
111 if( YAHOO.lang.isNumber(seconds) ) return parseInt(seconds / 3600);
112 return "NaN";
113}
114
115// return seconds from a days value
116function secsFromDays(daysStr) {
117 if ( parseInt(daysStr).toString() != daysStr) return "NaN";
118 var days = parseInt(daysStr);
119 if ( YAHOO.lang.isNumber(days) ) return days * 24 * 60 * 60;
120 return "NaN";
121}
122
123// return seconds from an hours value
124function secsFromHrs(hrsStr) {
125 if ( parseInt(hrsStr).toString() != hrsStr) return "NaN";
126 var hrs = parseInt(hrsStr);
127 if ( YAHOO.lang.isNumber(hrs) ) return hrs * 60 * 60;
128 return "NaN";
129}
130
131// hide/unhide divs func
132// unhide_me(<divname>, true) ==> hide all others, and unhide <divname>
133// unhide_me(<divname>, false) ==> don't hide anyone, just unhide <divname>
134// unhide_me(<divname>) ==> same as 'true'
135function unhide_me(divname, hideothers) {
136 if(typeof(hideothers) != "boolean") hideothers=true;
137 if(hideothers) {
138 // first ensure all divs with hideme class are (re)hidden
139 var hidemedivs = YAHOO.util.Dom.getElementsByClassName('hideme','div');
140 for (var i=0;i<hidemedivs.length;i+=1) {
141 if (!YAHOO.util.Dom.hasClass(hidemedivs[i], "invisiblestart")) {
142 YAHOO.util.Dom.addClass(hidemedivs[i], "invisiblestart");
143 }
144 }
145 };
146 document.getElementById("errormsgdiv").innerHTML = ""; // clear the errormsg div of any displayed errors
147 if (divname === "") return; // so that I can call this func simply to hide any open page
148 // next, reset the "divname" div to its original HTML code
149 // this clears variables in the div and removes YUI objects (so prevents double/triple/etc objects)
150 document.getElementById(divname).innerHTML = YAHOO.firecall.originalHTML[divname];
151 // next, unhide "divname"
152 YAHOO.util.Dom.removeClass(divname, "invisiblestart");
153}
154
155function fc_dialog_msg(msgtext, msgseverity) {
156 var myICON, myHEAD, mydiag, handleOK;
157 if (typeof(msgseverity) == "undefined") msgseverity = "info";
158 if (msgseverity === "alarm") {
159 myICON = YAHOO.widget.SimpleDialog.ICON_ALARM;
160 myHEAD = "Alert!";
161 } else if (msgseverity === "warning") {
162 myICON = YAHOO.widget.SimpleDialog.ICON_WARN;
163 myHEAD = "Warning...";
164 } else if (msgseverity === "info") {
165 myICON = YAHOO.widget.SimpleDialog.ICON_INFO;
166 myHEAD = "Information"
167 } else {
168 alert(msgtext);
169 return;
170 }
171 handleOK = function () {
172 this.hide();
173 this.destroy();
174 };
175
176 // Set a global counter, so message boxes appear as seperate entities, not the same name
177 if(typeof(YAHOO.firecall.mydiagcounter) == "undefined") YAHOO.firecall.mydiagcounter = 0;
178 YAHOO.firecall.mydiagcounter = YAHOO.firecall.mydiagcounter + 1;
179 mydiag = new YAHOO.widget.SimpleDialog("mydiag" + YAHOO.firecall.mydiagcounter.toString(),
180 { width: "400px",
181 fixedcenter: true,
182 visible: true,
183 draggable: true,
184 close: false,
185 text: msgtext,
186 icon: myICON,
187 constraintoviewport: true,
188 buttons: [ { text: "OK", handler: handleOK, isDefault: true } ]
189 });
190 mydiag.setHeader(myHEAD);
191 mydiag.render("bd"); // render it onto/into the div "bd"
192}
193
194function fc_dialog_2but(msgtext, msgseverity, but1text, but2text, handleBut1, handleBut2) {
195 var myICON, myHEAD, mydiag;
196 if (msgseverity === "alarm") {
197 myICON = YAHOO.widget.SimpleDialog.ICON_ALARM;
198 myHEAD = "Alert!";
199 } else if (msgseverity === "warning") {
200 myICON = YAHOO.widget.SimpleDialog.ICON_WARN;
201 myHEAD = "Warning...";
202 } else if (msgseverity === "info") {
203 myICON = YAHOO.widget.SimpleDialog.ICON_INFO;
204 myHEAD = "Information"
205 } else {
206 fc_dialog_msg("Unknown message severity passed to fc_dialog_2but() func.", "alarm");
207 return;
208 }
209 function handleBut1CB() {
210 this.hide();
211 this.destroy();
212 return handleBut1();
213 };
214 function handleBut2CB() {
215 this.hide();
216 this.destroy();
217 return handleBut2();
218 };
219 // Set a global counter, so message boxes appear as seperate entities, not the same name
220 if(typeof(YAHOO.firecall.mydiagcounter) == "undefined") YAHOO.firecall.mydiagcounter = 0;
221 YAHOO.firecall.mydiagcounter = YAHOO.firecall.mydiagcounter + 1;
222 mydiag = new YAHOO.widget.SimpleDialog("mydiag" + YAHOO.firecall.mydiagcounter.toString(),
223 { width: "400px",
224 fixedcenter: true,
225 visible: true,
226 draggable: true,
227 close: false,
228 text: msgtext,
229 icon: myICON,
230 constraintoviewport: true,
231 buttons: [ { text: but1text, handler: handleBut1CB },
232 { text: but2text, handler: handleBut2CB } ]
233 });
234 mydiag.setHeader(myHEAD);
235 mydiag.render("bd"); // render it onto/into the div "bd"
236}
237
238function createAutoComplete( sUrl, sInputEl, sSuggestionsEl ) {
239 var main_autocomplete_ds = new YAHOO.util.XHRDataSource(sUrl);
240 main_autocomplete_ds.responseType = YAHOO.util.XHRDataSource.TYPE_JSON;
241 main_autocomplete_ds.responseSchema = {
242 resultsList: "data",
243 fields: [ "item", "metadata" ]
244 };
245 var main_ac_requestEvent = main_autocomplete_ds.createEvent("requestEvent", { fireOnce: true });
246 main_ac_requestEvent.subscribe( function(res) {
247 var x = sInputEl.replace(/_.*/, ""); // attempt to get 2/3/4 letter function code
248 if( x == "" ) x = "unknown";
249 YAHOO.firecall.xhr_ac["fromWhere"] = "autocomplete";
250 YAHOO.firecall.xhr_ac["fromFunc"] = x;
251 YAHOO.firecall.xhr_ac["xhrDesc"] = sUrl.replace(/http:\/\/[^/]*/, "").replace(/\?.*/, ""); // sanitise FQDN URLs
252 });
253 try {
254 main_autocomplete = new YAHOO.widget.AutoComplete(sInputEl, sSuggestionsEl, main_autocomplete_ds, { autoHighlight: true, animVert: true, animHoriz: false, animSpeed: 0.1, minQueryLength: 3, forceSelection: true, typeAhead: true, maxResultsDisplayed: 20, useShadow: true, useIFrame: true, prehighlightClassName: "yui-ac-prehighlight", queryQuestionMark: false } );
255 } catch(err) {
256 fc_dialog_msg("There was an error setting up an autocomplete for " + sInputEl + ". Error msg: " + err + ". Please contact support.", "alarm");
257 };
258 return main_autocomplete
259}
260
261function allFormsSuccessCB(res) {
262 var repData = YAHOO.lang.JSON.parse(res.responseText);
263 if (repData["result"] == true) {
264 // worked
265 unhide_me("");
266 if (typeof(res.argument["fromWhere"]) == "string" && res.argument["fromWhere"] !== "") {
267 fc_dialog_msg("The '" + res.argument["fromWhere"] + "' request was successful.","info");
268 } else {
269 fc_dialog_msg("The request was successful.","info");
270 }
271 } else {
272 document.getElementById("errormsgdiv").innerHTML = repData["data"].toString().cgi_escape(); // the error msg is stored in the "data" key
273 }
274}
275
276function allFormsFailureCB(res) {
277}
278
279// ===== End Reusable Funcs ============================================================
280
281function load_listCheckedOutProfs(JSONdata,showAll) {
282 unhide_me("listcheckedoutprofs");
283
284 var lcop_relprofsButton = new YAHOO.widget.Button("releaseprofs");
285 var lcop_extprofsButton = new YAHOO.widget.Button("extendprofs");
286
287 YAHOO.util.Event.addListener(document.getElementById("lcop_refresh"), "click", function () {
288 load_listCheckedOutProfs("",showAll);
289 return;
290 });
291
292 function formatPW(elCell, oRecord, oColumn, sData) {
293 elCell.innerHTML = "<pre>" + oRecord.getData("profpwd") + "</pre>";
294 };
295
296 var myColumnDefs = [
297 {key:"profname", label:"Profile Name", sortable:true, resizeable:true},
298 {key:"profpwd", label:"Password", sortable:true, resizeable:true, formatter:formatPW},
299 {key:"profexp", label:"Expires in", sortable:true, resizeable:true}
300 ];
301
302 // Test for the presence of the showAll option
303 if(typeof(showAll) == "undefined") {
304 var showAll=false;
305 };
306
307 // Set up the DataSource.
308 // This DataSource will contain the user's checked out profiles (& details) in a JSON format
309 // Which the DataTable below will automagically display upon receipt
310 if( typeof(JSONdata) == "undefined" || JSONdata == "") {
311 // We were not passed any JSON data, so set up remote XHR datasource.
312 var lcop_myDataSource = new YAHOO.util.DataSource("/request/mypasswords.rpy?all=" + showAll.toString());
313 // Also unhide the release/extend buttons
314 YAHOO.util.Dom.removeClass("profileactionbuttons", "invisiblestart");
315 // for our XHRLOG:
316 var lcop_ds_requestEvent = lcop_myDataSource.createEvent("requestEvent", { fireOnce: true });
317 lcop_ds_requestEvent.subscribe( function(res) {
318 YAHOO.firecall.xhr_ac["fromWhere"] = "Show Checked-out Profiles";
319 YAHOO.firecall.xhr_ac["fromFunc"] = "lcop";
320 YAHOO.firecall.xhr_ac["xhrDesc"] = "/request/mypasswords.rpy";
321 });
322 } else {
323 // We WERE passed some JSON data, so set up a local datasource.
324 var lcop_myDataSource = new YAHOO.util.LocalDataSource(JSONdata);
325 }
326 lcop_myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
327 lcop_myDataSource.connMethodPost = false;
328 lcop_myDataSource.maxCacheEntries = 0;
329 lcop_myDataSource.responseSchema = {
330 resultsList: "data",
331 fields: ["profname","profpwd","profexp"]
332 };
333
334 var lcop_myDataTable = new YAHOO.widget.DataTable("profilestablediv", myColumnDefs, lcop_myDataSource);
335
336 // Subscribe to events for row selection
337 lcop_myDataTable.subscribe("rowMouseoverEvent", lcop_myDataTable.onEventHighlightRow);
338 lcop_myDataTable.subscribe("rowMouseoutEvent", lcop_myDataTable.onEventUnhighlightRow);
339 lcop_myDataTable.subscribe("rowClickEvent", lcop_myDataTable.onEventSelectRow);
340 // lcop_myDataTable.subscribe("rowClickEvent", lcop_myDataTable.clearTextSelection);
341
342 lcop_relprofsButton.addListener("click", function() {
343 var releaseProfs = "";
344 sel_rowsArray = lcop_myDataTable.getSelectedTrEls(); // returns array of HTMLelements (i.e. DOM elements).
345 for (var i=0; i<sel_rowsArray.length; i++){
346 releaseProfs += "profiles=" + lcop_myDataTable.getRecord(sel_rowsArray[i]).getData('profname') + "&";
347 };
348 if(releaseProfs != "") {
349 function releaseYes() {
350 function relSuccessCB(res) {
351 try {
352 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
353 } catch(err) {
354 fc_dialog_msg("Oops. Technical error parsing JSON results from checkinprofile.rpy. Contact support.", "alarm");
355 return;
356 };
357 if(responseJSON["result"] == true) {
358 // Successfully released/checked-in, so simply list all my checked out profs again
359 fc_dialog_msg(responseJSON["data"], "info");
360 load_listCheckedOutProfs("",showAll);
361 } else if (responseJSON["result"] == false) {
362 fc_dialog_msg(responseJSON["data"], "alarm");
363 } else {
364 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
365 };
366 };
367 YAHOO.util.Connect.asyncRequest('POST', '/request/checkinprofile.rpy', { success: relSuccessCB, argument: { "fromWhere": "Check-in/release Profile(s)", "fromFunc": "lcop", "xhrDesc": "/request/checkinprofile.rpy" } }, releaseProfs);
368 };
369 fc_dialog_2but("Do you want to release the selected profile(s)?", "info", "Yes", "No", releaseYes, null);
370 } else {
371 fc_dialog_msg("Please select one or more profiles to release first.","alarm");
372 };
373 });
374
375 lcop_extprofsButton.addListener("click", function() {
376 var extendProfs = "";
377 sel_rowsArray = lcop_myDataTable.getSelectedTrEls(); // returns array of HTMLelements (i.e. DOM elements).
378 for (var i=0; i<sel_rowsArray.length; i++){
379 extendProfs += "profiles=" + lcop_myDataTable.getRecord(sel_rowsArray[i]).getData('profname') + "&";
380 };
381 if(extendProfs != "") {
382 var hrs="anyNonNumber";
383 while(parseInt(hrs)!=hrs-0) {
384 hrs=prompt("How many hours (1-72) *FROM NOW* do you want it to expire?","2");
385 if ( hrs === null ) return; // user clicked Cancel
386 if(parseInt(hrs)!=hrs-0 || parseInt(hrs)<0 || parseInt(hrs)>72) { hrs="anyNonNumber"; };
387 };
388 extendProfs += "hours=" + hrs;
389 function extSuccessCB(res) {
390 try {
391 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
392 } catch(err) {
393 fc_dialog_msg("Oops. Technical error parsing JSON results from extendprofile.rpy. Contact support.", "alarm");
394 return;
395 };
396 if(responseJSON["result"] == true) {
397 // Successfully extended, so simply list all my checked out profs again
398 fc_dialog_msg(responseJSON["data"], "info");
399 load_listCheckedOutProfs("",showAll);
400 } else if (responseJSON["result"] == false) {
401 fc_dialog_msg(responseJSON["data"], "alarm");
402 } else {
403 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
404 };
405 };
406 YAHOO.util.Connect.asyncRequest('POST', '/request/extendprofile.rpy', { success: extSuccessCB, argument: { "fromWhere": "Extend Profile(s)", "fromFunc": "lcop", "xhrDesc": "/request/extendprofile.rpy" } }, extendProfs);
407 } else {
408 fc_dialog_msg("Please select one or more profiles to alter first.","alarm");
409 };
410 });
411};
412
413// This func was in the menu, but we've decided to remove it
414// It can easily be put back. It will display the "manage my checked out profiles" form, but
415// show ALL checked out profiles. I.e. for use by Client Admin.
416// We've replaced it with the "View someone else's checked out profile" form.
417function load_listAllCheckedOutProfs() {
418 load_listCheckedOutProfs("",true);
419};
420
421function load_CheckOutProf(e) {
422 unhide_me("checkoutprofilesdiv");
423 var cop_addToListButton = new YAHOO.widget.Button("cop_addToListButton");
424 var cop_checkOutButton = new YAHOO.widget.Button("cop_checkOutButton");
425 var cop_showsearchform = new YAHOO.widget.Button("cop_showsearchform");
426
427 if(testRole(roleADMN)) {
428 // User has "admin" rights, so allow them to check out on behalf of someone else
429 YAHOO.util.Dom.removeClass("cop_adminonlyTR1","cop_adminonly");
430 YAHOO.util.Dom.removeClass("cop_adminonlyTR2","cop_adminonly");
431 YAHOO.util.Dom.removeClass("cop_adminonlyTR3","cop_adminonly");
432 YAHOO.util.Dom.removeClass("cop_adminonlyTR4","cop_adminonly");
433 };
434
435 var cop_checkout_autocomplete = createAutoComplete("/request/findprofiles.rpy?searchtype=profmbr&", "cop_profname", "cop_ac_box");
436
437 // The following func fires when an item is selected in the autocomplete suggestion box
438 // Perform some tests on the item selected
439 function cop_itemSelectHandler(sType, aArgs) {
440 var oMyAcInstance = aArgs[0]; // your AutoComplete instance
441 var elListItem = aArgs[1]; // the <li> element selected in the suggestion container
442 var oData = aArgs[2]; // object literal of data for the result
443
444 if(typeof(oData[1]) != "string") return;
445
446 if(oData[1] != "") {
447 fc_dialog_msg("The profile '" + oData[0] + "' is already checked out. Please select another or check it in (release) it first.", "warning");
448 document.getElementById("cop_profname").value = "";
449 return;
450 };
451
452 if(cop_isAlreadyInList(oData[0])) {
453 document.getElementById("cop_profname").value = "";
454 return;
455 };
456 };
457 cop_checkout_autocomplete.itemSelectEvent.subscribe(cop_itemSelectHandler);
458 // Following func styles the entries in the autocomplete suggestion box (i.e. make the "checked out by..." bit red and italic)
459 cop_checkout_autocomplete.formatResult = function(oResultItem, sQuery) {
460 return oResultItem[0] + " <i style='color:red'>" + oResultItem[1] + "</i>";
461 };
462
463 function cop_isAlreadyInList(profname) {
464 for(i=0;i<document.getElementById("cop_profiles").options.length;i++) {
465 if ( document.getElementById("cop_profiles").options[i].value.toLowerCase() == profname.toLowerCase() ) {
466 fc_dialog_msg(profname + " is already in the list!", "alarm");
467 return true;
468 };
469 };
470 return false;
471 };
472
473 // Create handler for "Add Profile To List" button, i.e. add myInput's value to the select box.
474 cop_addToListButton.addListener("click", function () {
475 if ( getElemVal("cop_profname") === '' ) return;
476 if (cop_isAlreadyInList(getElemVal("cop_profname"))) return false;
477 // new Option(text, value, defaultSelected, selected)
478 document.getElementById("cop_profiles").options[document.getElementById("cop_profiles").options.length] = new Option(getElemVal("cop_profname"), getElemVal("cop_profname"), false, false);
479 document.getElementById("cop_profname").value='';
480 return false;
481 });
482
483 // Create handler for the "Show Search Form" button
484 cop_showsearchform.addListener("click", function() {
485 if( YAHOO.util.Dom.hasClass("searchprofiles", "invisiblestart") ) {
486 load_searchProfiles(true);
487 } else {
488 YAHOO.util.Dom.addClass("searchprofiles", "invisiblestart");
489 };
490 });
491
492 // Create handler for the "Check Out Profiles" button, i.e. check 'em out, baby!
493 cop_checkOutButton.addListener("click", function () {
494
495 var cop_proflist = document.getElementById("cop_profiles");
496
497 // If there's something in the search field when checkout button is hit (and the list is empty),
498 // assume user wanted that one profile checked out & add it to the list first.
499 if (cop_proflist.options.length === 0 && getElemVal("cop_profname") !== '') {
500 cop_addToListButton.fireEvent("click");
501 };
502
503 // Various validation tests:
504 try {
505 if (cop_proflist.options.length === 0) throw "Nothing to check out. Please provide a profile name to checkout.";
506 if (getElemVal("cop_profname") !== '') throw "You have text in the search field AND options in the list. Please click Add to add the profile in the search field to the list first, or clear it before hitting Check Out.";
507 if ( isNaN(getElemVal("cop_hours")) ) throw "Checkout period should be an integer value between 1 and 72 hours (inclusive).";
508 if ( getElemVal("cop_reason") == "" ) throw "Please provide a valid reason for checking out this/these profile(s)."
509 } catch(err) {
510 fc_dialog_msg(err, "alarm");
511 return;
512 };
513
514 function cop_checkoutCB(res) {
515 // Success checkout
516 load_listCheckedOutProfs(res.responseText,false);
517 };
518
519 var i;
520 for(i=0;i<cop_proflist.options.length;i++) cop_proflist.options[i].selected = true; // select all items in the list (so setFrom will detect them)
521 document.getElementById("cop_profiles").disabled = false; // un-disable the profile list
522 var cop_Form = document.getElementById("cop_formcontainer");
523 YAHOO.util.Connect.setForm(cop_Form);
524 document.getElementById("cop_profiles").disabled = true; // re-disable the profile list
525 for(i=0;i<cop_proflist.options.length;i++) cop_proflist.options[i].selected = false;// unselect them all (otherwise colours can be weird)
526 var cop_Connect = YAHOO.util.Connect.asyncRequest('POST', "/request/checkoutprofile.rpy", { success:cop_checkoutCB, argument: { "fromWhere": "Checkout Profile(s)", "fromFunc": "cop", "xhrDesc": "/request/checkoutprofile.rpy" } } );
527 });
528}
529
530function load_manageManualProfPassword(optProfile) {
531 unhide_me("changemanualprofpw");
532 var mmp_getprofbutton = new YAHOO.widget.Button("mmp_getprofbutton");
533 var mmp_getnewpwbutton = new YAHOO.widget.Button("mmp_getnewpwbutton");
534 var mmp_modprofbutton = new YAHOO.widget.Button("mmp_modprofbutton");
535 var mmp_autocomplete = createAutoComplete("/request/findprofiles.rpy?searchtype=manual&", "mmp_profname", "mmp_ac_box");
536 mmp_getprofbutton.addListener("click", function() {
537 function mmp_getProfDataCB(res) {
538 try {
539 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
540 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
541 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
542 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-object 'data' field in JSON response";
543 if( typeof(responseJSON["data"]["expiretime"]) != "number") throw "Missing/non-number 'expiretime' field in JSON response";
544 if( typeof(responseJSON["data"]["targets"].length) != "number") throw "Missing/non-list 'targets' field in JSON response";
545 } catch(err) {
546 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
547 return;
548 };
549 // (m)anage (m)anual (p)rofile (g)et (p)rofile (d)ata
550 var mmp_gpd_expiretime = responseJSON["data"]["expiretime"];
551 var mmp_gpd_expiretimeStr = "";
552 YAHOO.util.Dom.removeClass("mmp_expdays", "red-font");
553 if ( mmp_gpd_expiretime >= 86400 ) {
554 mmp_gpd_expiretimeStr = daysFromSeconds(mmp_gpd_expiretime.toString());
555 } else if ( mmp_gpd_expiretime < 86400 && mmp_gpd_expiretime >= 0 ) {
556 mmp_gpd_expiretimeStr = 0;
557 } else {
558 YAHOO.util.Dom.addClass("mmp_expdays", "red-font");
559 mmp_gpd_expiretimeStr = "exp";
560 };
561 var mmp_gdp_table = "<table id='mmp_targettable' name='mmp_targettable'><tbody>";
562 mmp_gdp_table = mmp_gdp_table + "<tr><th>Account Name</th><th>Identifier (hostname/dbname/etc)</th></tr>";
563 for(var i=0;i<responseJSON["data"]["targets"].length;i++) {
564 mmp_gdp_table = mmp_gdp_table + "<tr><td>" + responseJSON["data"]["targets"][i]["account"] + "</td>";
565 mmp_gdp_table = mmp_gdp_table + "<td>" + responseJSON["data"]["targets"][i]["data"] + "</td></tr>";
566 };
567 mmp_gdp_table = mmp_gdp_table + "</tbody></table>";
568 document.getElementById("mmp_targettablecontainer").innerHTML = mmp_gdp_table;
569 setElemVal("mmp_expdays", mmp_gpd_expiretimeStr);
570 };
571 if ( getElemVal("mmp_profname") === "" ) {
572 fc_dialog_msg("Please select a profile first...", "warning");
573 return;
574 };
575 setElemVal( "mmp_profname_hidden", getElemVal("mmp_profname") );
576 var mmp_getProfDataConnect = YAHOO.util.Connect.asyncRequest('GET', "/request/manualpassword.rpy?profilename=" + getElemVal("mmp_profname"), { success:mmp_getProfDataCB, argument: { "fromWhere": "Get Manually Managed Profile Data", "fromFunc": "mmp", "xhrDesc": "/request/manualpassword.rpy" } } );
577 });
578
579 // Check if I was called with a profile name. If so, fill in the profname field, and fire the click events
580 if( typeof(optProfile) == "string") {
581 setElemVal("mmp_profname", optProfile);
582 mmp_getprofbutton.fireEvent("click");
583 };
584
585 mmp_getnewpwbutton.addListener("click", function() {
586 try {
587 if( getElemVal("mmp_profname") === "" ) throw "Please select a profile first and click Get Profile Targets button...";
588 if( getElemVal("mmp_profname") != getElemVal("mmp_profname_hidden") ) throw "You've chosen a different profile, so please click Get Profile Targets button first...";
589 } catch(err) {
590 fc_dialog_msg(err, "warning");
591 return;
592 };
593 function mmp_getNewPasswordCB(res) {
594 try {
595 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
596 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
597 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
598 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-object 'data' field in JSON response";
599 if( typeof(responseJSON["data"]["newpassword"]) == "undefined") throw "Missing 'newpassword' field in JSON response";
600 if( typeof(responseJSON["data"]["password"]) == "undefined") throw "Missing 'password' field in JSON response";
601 if( typeof(responseJSON["data"]["oldpassword"]) == "undefined") throw "Missing 'oldpassword' field in JSON response";
602 } catch(err) {
603 fc_dialog_msg(err, "alarm");
604 return;
605 };
606 setElemVal("mmp_oldpassword", responseJSON["data"]["oldpassword"] );
607 setElemVal("mmp_newpassword", responseJSON["data"]["newpassword"] );
608 setElemVal("mmp_curpassword", responseJSON["data"]["password"] );
609 };
610 var mmp_getNewPasswordConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/manualpassword.rpy", { success:mmp_getNewPasswordCB, argument: { "fromWhere": "Generate New Manual Password", "fromFunc": "mmp", "xhrDesc": "/request/manualpassword.rpy" } }, "action=genpwd&profilename=" + getElemVal("mmp_profname") );
611 });
612
613 mmp_modprofbutton.addListener("click", function() {
614 fc_dialog_2but("Have you changed this password on all the targets? So, are you sure you want to commit the new password into the Firecall database?", "info", "Commit!", "Cancel", function () {
615 var mmp_modprofbuttonConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/manualpassword.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Commit Manual Profile Password", "fromFunc": "mmp", "xhrDesc": "/request/manualpassword.rpy" } }, "action=commitpwd&profilename=" + getElemVal("mmp_profname") );
616 }, null);
617 });
618};
619
620function load_getCheckedOutProf() {
621 unhide_me("getcheckedoutprofile");
622 var gcop_getprofbutton = new YAHOO.widget.Button("gcop_getprofbutton");
623 var gcop_checkinprof = new YAHOO.widget.Button("gcop_checkinprof");
624
625 var gcop_autocomplete = createAutoComplete("/request/findprofiles.rpy?searchtype=checkedout&", "gcop_profname", "gcop_ac_box");
626
627 gcop_getprofbutton.addListener("click", function() {
628 if( getElemVal("gcop_profname") == "" ) {
629 fc_dialog_msg("Please choose a profile name first.", "warning");
630 return;
631 };
632 if( getElemVal("gcop_comment") == "" ) {
633 fc_dialog_msg("Please provide a reason you need to view a profile checked-out by someone else.", "warning");
634 return;
635 };
636 function gcop_getProfCB(res) {
637 try {
638 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
639 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
640 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
641 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-object 'data' field in JSON response";
642 if( typeof(responseJSON["data"]["expday"]) != "string") throw "Missing 'expday' field in JSON response";
643 if( typeof(responseJSON["data"]["exphrs"]) != "string") throw "Missing 'exphrs' field in JSON response";
644 if( typeof(responseJSON["data"]["expmin"]) != "string") throw "Missing 'expmin' field in JSON response";
645 if( typeof(responseJSON["data"]["expsec"]) != "string") throw "Missing 'expsec' field in JSON response";
646 if( typeof(responseJSON["data"]["password"]) != "string") throw "Missing 'password' field in JSON response";
647 if( typeof(responseJSON["data"]["checkedoutby"]) != "string") throw "Missing 'checkedoutby' field in JSON response";
648 } catch(err) {
649 fc_dialog_msg(err, "alarm");
650 return;
651 };
652 setElemVal("gcop_checkedoutby", responseJSON["data"]["checkedoutby"]);
653 setElemVal("gcop_expday", responseJSON["data"]["expday"]);
654 setElemVal("gcop_exphrs", responseJSON["data"]["exphrs"]);
655 setElemVal("gcop_expmin", responseJSON["data"]["expmin"]);
656 setElemVal("gcop_expsec", responseJSON["data"]["expsec"]);
657 setElemVal("gcop_password", responseJSON["data"]["password"]);
658 };
659 var gcop_getProfConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/viewcheckedout.rpy", { success:gcop_getProfCB, argument: { "fromWhere": "Get Checked Out Profile", "fromFunc": "gcop", "xhrDesc": "/request/viewcheckedout.rpy" } }, "gcop_profname=" + getElemVal("gcop_profname") + "&gcop_comment=" + getElemVal("gcop_comment") );
660 });
661
662 gcop_checkinprof.addListener("click", function() {
663 if( getElemVal("gcop_profname") == "" ) {
664 fc_dialog_msg("Please choose a profile name first.", "warning");
665 return;
666 }; if( getElemVal("gcop_password") == "" ) {
667 fc_dialog_msg("Please first click 'Get Profile Data', before force-checking it in.", "warning");
668 return;
669 };
670 var gcop_checkinprofConnect = YAHOO.util.Connect.asyncRequest('POST', '/request/checkinprofile.rpy', { success: allFormsSuccessCB, argument: { "fromWhere": "Force Release Checked-out Prof", "fromFunc": "gcop", "xhrDesc": "/request/checkinprofile.rpy" } }, "profiles=" + getElemVal("gcop_profname") );
671 });
672}
673
674function load_createNewProf(e) {
675 unhide_me("createnewprofile");
676 var cnp_Button = new YAHOO.widget.Button("cnp_createbutton");
677
678 var cnp_autocomplete = createAutoComplete("/request/findgroups.rpy?searchtype=all&", "cnp_newprofprigrp", "cnp_ac_box");
679
680 // Populate the types dropdownlist
681 addTargetOptions("cnp_proftype");
682
683 // Put an event handler on 'focusout' of the profilename box, to validate the new profile name
684 YAHOO.util.Event.on("cnp_newprofname", "focusout", function () {
685 if ( getElemVal("cnp_newprofname") == "" ) return; // ignore it if no profile name typed
686
687 // Test if for illegal chars. Using cgi escape here, as this covers most chars we're interested in. Easy win.
688 if ( getElemVal("cnp_newprofname") != escape(getElemVal("cnp_newprofname")) ) {
689 // Clear the validation message div
690 YAHOO.util.Dom.removeClass("cnp_validprof", "cnp_validprofYay");
691 YAHOO.util.Dom.removeClass("cnp_validprof", "cnp_validprofNay");
692 document.getElementById("cnp_validprof").innerHTML = "'" + getElemVal("cnp_newprofname").toString().cgi_escape() + "' contains illegal characters. Please correct.";
693 YAHOO.util.Dom.addClass("cnp_validprof", "cnp_validprofNay");
694 return;
695 };
696
697 function isValidProfNameSuccessCB(res) {
698 try {
699 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
700 if(typeof(responseJSON["result"]) == "undefined") throw "Unexpected/Invalid JSON result";
701 if(responseJSON["result"] != true) throw "AJAX Request failed.";
702 } catch(err) {
703 // ignore it. just means we can't do dynamic profile name check. no biggy.
704 return;
705 };
706
707 // Only reach here if 'responseJSON["result"] == true', i.e. server request succeeded, even if result is empty list
708
709 // Clear the validation message div
710 YAHOO.util.Dom.removeClass("cnp_validprof", "cnp_validprofYay");
711 YAHOO.util.Dom.removeClass("cnp_validprof", "cnp_validprofNay");
712 document.getElementById("cnp_validprof").innerHTML = "";
713
714 for(var i in responseJSON["data"]) {
715 if(responseJSON["data"][i]["item"] == getElemVal("cnp_newprofname")) {
716 document.getElementById("cnp_validprof").innerHTML = "'" + getElemVal("cnp_newprofname").toString().cgi_escape() + "' already exists. Please choose another name.";
717 YAHOO.util.Dom.addClass("cnp_validprof", "cnp_validprofNay");
718 return;
719 }
720 }
721 document.getElementById("cnp_validprof").innerHTML = "'" + getElemVal("cnp_newprofname").toString().cgi_escape() + "' is available to use...";
722 YAHOO.util.Dom.addClass("cnp_validprof", "cnp_validprofYay");
723 };
724 var cnp_isValidProfNameConnect = YAHOO.util.Connect.asyncRequest('GET', "/request/findprofiles.rpy?searchtype=all&query=" + document.getElementById("cnp_newprofname").value, { success:isValidProfNameSuccessCB, argument: { "fromWhere": "Check Validity of Profile Name", "fromFunc": "cnp", "xhrDesc": "/request/findprofiles.rpy" } } );
725 });
726
727 cnp_Button.addListener("click", function() {
728 if ( getElemVal("cnp_newprofname") == "" ) {
729 fc_dialog_msg("Please provide a new profile name.", "warning");
730 return;
731 };
732 if ( getElemVal("cnp_newprofprigrp") == "" ) {
733 fc_dialog_msg("Please provide a primary group for the new profile.", "warning");
734 return;
735 };
736 try {
737 document.getElementById("cnp_maxhrs").value = secsFromHrs(getElemVal("cnp_maxhrs_hrs"));
738 document.getElementById("cnp_pwdcheck").value = secsFromDays(getElemVal("cnp_pwdcheck_days"));
739 document.getElementById("cnp_pwdchange").value = secsFromDays(getElemVal("cnp_pwdchange_days"));
740 if ( isNaN(getElemVal("cnp_maxhrs")) ) throw "Maximum checkout time is not a valid (integer) number. Please correct."
741 if ( isNaN(getElemVal("cnp_pwdcheck")) ) throw "Password check time is not a valid (integer) number. Please correct."
742 if ( isNaN(getElemVal("cnp_pwdchange")) ) throw "Password change time is not a valid (integer) number. Please correct."
743 } catch(err) {
744 fc_dialog_msg(err, "alarm");
745 return;
746 }
747 document.getElementById("cnp_validprof").innerHTML = "";
748 YAHOO.util.Connect.setForm("cnp_formcontainer");
749 var cnp_Connect = YAHOO.util.Connect.asyncRequest('POST', "/request/createprofile.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Create New Profile", "fromFunc": "cnp", "xhrDesc": "/request/createprofile.rpy" } });
750 });
751}
752
753function load_modifydeleteProf(e) {
754 unhide_me("moddelprofile");
755 document.getElementById("mdp_oldprofname").disabled = false;
756 var mdp_getprofbutton = new YAHOO.widget.Button("mdp_getprofbutton");
757 var mdp_modprofbutton = new YAHOO.widget.Button("mdp_modprofbutton");
758 var mdp_delprofbutton = new YAHOO.widget.Button("mdp_delprofbutton");
759 var mdp_checkpassword = new YAHOO.widget.Button("mdp_checkpassword");
760 var mdp_changepassword = new YAHOO.widget.Button("mdp_changepassword");
761 var mdp_donehideform = new YAHOO.widget.Button("mdp_donehideform");
762
763 var mdp_autocomplete = createAutoComplete("/request/findprofiles.rpy?searchtype=profadmin&", "mdp_oldprofname", "mdp_ac_box");
764
765 function mdp_fillFormCB(res) {
766 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
767 if(responseJSON["result"] == true) {
768 mdp_getprofbutton.destroy();
769 document.getElementById("mdp_oldprofname").disabled = true;
770 document.getElementById("mdp_newprofname").value = document.getElementById("mdp_oldprofname").value;
771 document.getElementById("mdp_profprigrp").value = responseJSON["data"]["primarygroup"];
772 addTargetOptions("mdp_proftype"); // create the correct options
773 changeSelectItem("mdp_proftype", responseJSON["data"]["profiletype"]); // select the correct option
774 document.getElementById("mdp_maxhrs_hrs").value = hrsFromSeconds(responseJSON["data"]["maxcheckouttime"]);
775 document.getElementById("mdp_pwdcheck_days").value = daysFromSeconds(responseJSON["data"]["checkinterval"]);
776 document.getElementById("mdp_pwdchange_days").value = daysFromSeconds(responseJSON["data"]["changefreq"]);
777 } else if (responseJSON["result"] == false) {
778 fc_dialog_msg(responseJSON["data"], "alarm");
779 } else {
780 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
781 }
782 }
783 mdp_getprofbutton.addListener("click", function() {
784 // Click the "Get Profile Data" button handler
785 if(document.getElementById("mdp_oldprofname").value == "") {
786 fc_dialog_msg("Please enter the name of a profile.", "warning");
787 return false;
788 };
789 var mdp_getprofdata = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpprofile.rpy", { success:mdp_fillFormCB, argument: { "fromWhere": "Get Profile Data", "fromFunc": "mdp", "xhrDesc": "/request/dumpprofile.rpy" } }, "dp_profname=" + document.getElementById("mdp_oldprofname").value);
790 });
791
792 mdp_modprofbutton.addListener("click", function() {
793 // Click the "Modify Profile" button handler
794 if(!document.getElementById("mdp_oldprofname").disabled) {
795 fc_dialog_msg("Please select a profile to modify first!", "alarm");
796 return;
797 };
798 try {
799 document.getElementById("mdp_maxhrs").value = secsFromHrs(getElemVal("mdp_maxhrs_hrs"));
800 document.getElementById("mdp_pwdcheck").value = secsFromDays(getElemVal("mdp_pwdcheck_days"));
801 document.getElementById("mdp_pwdchange").value = secsFromDays(getElemVal("mdp_pwdchange_days"));
802 if ( isNaN(getElemVal("mdp_maxhrs")) ) throw "Maximum checkout time is not a valid (integer) number. Please correct."
803 if ( isNaN(getElemVal("mdp_pwdcheck")) ) throw "Password check time is not a valid (integer) number. Please correct."
804 if ( isNaN(getElemVal("mdp_pwdchange")) ) throw "Password change time is not a valid (integer) number. Please correct."
805 } catch(err) {
806 fc_dialog_msg(err, "alarm");
807 return;
808 };
809 document.getElementById("mdp_oldprofname").disabled = false; // have to have it non disabled for the form to encode it
810 YAHOO.util.Connect.setForm(document.getElementById("mdp_formcontainer"));
811 document.getElementById("mdp_oldprofname").disabled = true; // have to have it non disabled for the form to encode it
812 var mdp_modprofile = YAHOO.util.Connect.asyncRequest('POST', "/request/modifyprofile.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Modify Profile", "fromFunc": "mdp", "xhrDesc": "/request/modifyprofile.rpy" } });
813 });
814
815 mdp_delprofbutton.addListener("click", function() {
816 // Click the "Delete Profile" button handler
817 if(!document.getElementById("mdp_oldprofname").disabled) {
818 fc_dialog_msg("Please select a profile to delete first!", "alarm");
819 return;
820 }
821 if(document.getElementById("mdp_oldprofname").value !== document.getElementById("mdp_newprofname").value) {
822 fc_dialog_msg("You can't provide a new name for a profile to be deleted!", "alarm");
823 return false;
824 }
825 var mdp_nowDelProf = function() {
826 document.getElementById("mdp_oldprofname").disabled = false; // have to have it non disabled for the form to encode it
827 YAHOO.util.Connect.setForm(document.getElementById("mdp_formcontainer"));
828 document.getElementById("mdp_oldprofname").disabled = true; // have to have it non disabled for the form to encode it
829 var mdp_delprofile = YAHOO.util.Connect.asyncRequest('POST', "/request/deleteprofile.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Delete Profile", "fromFunc": "mdp", "xhrDesc": "/request/deleteprofile.rpy" } });
830 };
831 fc_dialog_2but("Are you sure you want to delete the '" + document.getElementById("mdp_oldprofname").value + "' profile?", "warning", "Delete", "Cancel", mdp_nowDelProf, null);
832 });
833
834 mdp_checkpassword.addListener("click", function() {
835 if(getElemVal("mdp_oldprofname") == "") {
836 fc_dialog_msg("Please specify a profile name first!", "alarm");
837 return;
838 };
839 if(getElemVal("mdp_oldprofname") !== getElemVal("mdp_newprofname")) {
840 fc_dialog_msg("You've typed a new profile name that's different to the one you retrieved the data for. It is therefore not possible to know which one you want to check the password of.", "alarm");
841 return;
842 };
843 function mdp_checkpasswordCB(res) {
844 YAHOO.util.Dom.addClass("mdp_waitcheckchange", "invisiblestart");
845 try {
846 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
847 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
848 if( typeof(responseJSON["data"]) != "string" ) throw "Missing/non-string 'data' field in JSON response";
849 } catch(e) {
850 fc_dialog_msg("There was a technical problem checking the password. Please try again or contact support. Details: " + e, "alarm");
851 return;
852 };
853 if(responseJSON["result"]) {
854 fc_dialog_msg("The password currently stored in Firecall matched the password of the profile target(s)!", "info");
855 } else {
856 fc_dialog_msg("The password check failed! The server responded with:<br><br>" + responseJSON["data"].cgi_escape() + "<br><br>Please note: Failed password checks can result in the server attempting to change the password now (depending on the reason the check failed). Please recheck in a few minutes.", "warning");
857 };
858 };
859 YAHOO.util.Dom.removeClass("mdp_waitcheckchange", "invisiblestart");
860 var mdp_checkpasswordConnect = YAHOO.util.Connect.asyncRequest('POST', '/request/forcepasswordaction.rpy?mdp_action=check&mdp_oldprofname=' + getElemVal("mdp_oldprofname"), { success: mdp_checkpasswordCB, argument: { "fromWhere": "Check Profile Password", "fromFunc": "mdp", "xhrDesc": "/request/forcepasswordaction.rpy" } });
861 });
862
863 mdp_changepassword.addListener("click", function() {
864 if(getElemVal("mdp_oldprofname") == "") {
865 fc_dialog_msg("Please specify a profile name first!", "alarm");
866 return;
867 };
868 if(getElemVal("mdp_oldprofname") !== getElemVal("mdp_newprofname")) {
869 fc_dialog_msg("You've typed a new profile name that's different to the one you retrieved the data for. It is therefore not possible to know which one you want to change the password of.", "alarm");
870 return;
871 };
872 function mdp_changepasswordCB(res) {
873 YAHOO.util.Dom.addClass("mdp_waitcheckchange", "invisiblestart");
874 try {
875 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
876 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
877 if( typeof(responseJSON["data"]) != "string" ) throw "Missing/non-string 'data' field in JSON response";
878 } catch(e) {
879 fc_dialog_msg("There was a technical problem checking the password. Please try again or contact support. Details: " + e, "alarm");
880 return;
881 };
882 if(responseJSON["result"]) {
883 fc_dialog_msg("The password has been successfully changed on all the profile's targets.", "info");
884 } else {
885 fc_dialog_msg("The password change failed! The server responded with:<br><br>" + responseJSON["data"].cgi_escape() + "<br><br>Please try again or contact support.", "alarm");
886 };
887 };
888 YAHOO.util.Dom.removeClass("mdp_waitcheckchange", "invisiblestart");
889 var mdp_changepasswordConnect = YAHOO.util.Connect.asyncRequest('POST', '/request/forcepasswordaction.rpy?mdp_action=change&mdp_oldprofname=' + getElemVal("mdp_oldprofname"), { success: mdp_changepasswordCB, argument: { "fromWhere": "Change Profile Password", "fromFunc": "mdp", "xhrDesc": "/request/forcepasswordaction.rpy" } });
890 });
891
892 mdp_donehideform.addListener("click", function() {
893 unhide_me("");
894 });
895}
896
897function load_addtargettoProf(e) {
898 unhide_me("addtgttoprof");
899 document.getElementById("atp_profname").disabled = false;
900 var atp_getprofbutton = new YAHOO.widget.Button("atp_getprofbutton");
901 var atp_valtgtbutton = new YAHOO.widget.Button("atp_valtgtbutton");
902 var atp_modprofbutton = new YAHOO.widget.Button("atp_modprofbutton");
903
904 var atp_autocomplete = createAutoComplete("/request/findprofiles.rpy?searchtype=typembr&", "atp_profname", "atp_ac_box");
905
906 function atp_fillFormCB(res) {
907 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
908 if(responseJSON["result"] == true) {
909 atp_getprofbutton.destroy();
910 document.getElementById("atp_profname").disabled = true;
911 var atp_newvalidatedtargetValu, atp_newvalidatedtargetName, tmpAccount, tmpIdentifier;
912 var atp_proftargetsEl = document.getElementById("atp_proftargets");
913 for(var i=0;i<responseJSON["data"]["profiledata"].length;i++) {
914 // Iterate over the profile data (targets) array
915 tmpAccount = responseJSON["data"]["profiledata"][i]["account"];
916 tmpIdentifier = responseJSON["data"]["profiledata"][i]["data"];
917 atp_newvalidatedtargetValu = tmpAccount + "\t" + tmpIdentifier;
918 atp_newvalidatedtargetName = "Account: '" + tmpAccount + "' , Identifier: '" + tmpIdentifier + "'";
919 atp_proftargetsEl.options[atp_proftargetsEl.options.length] = new Option(atp_newvalidatedtargetName, atp_newvalidatedtargetValu);
920 }
921 document.getElementById("atp_proftargets").disabled = true;
922 document.getElementById("atp_tgtidenttxt").innerHTML = "Identifier for this target (" + YAHOO.firecall.targetTypes[responseJSON["data"]["profiletype"]]["optIdentifier"] + ")";
923 } else if (responseJSON["result"] == false) {
924 fc_dialog_msg(responseJSON["data"], "alarm");
925 } else {
926 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
927 }
928 }
929 atp_getprofbutton.addListener("click", function() {
930 // Click the "Get Profile Data" button handler
931 if(document.getElementById("atp_profname").value == "") {
932 fc_dialog_msg("Please enter the name of a profile.", "warning");
933 return false;
934 };
935 var atp_getprofdata = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpprofile.rpy", { success:atp_fillFormCB, argument: { "fromWhere": "Get Profile Data", "fromFunc": "atp", "xhrDesc": "/request/dumpprofile.rpy" } }, "dp_profname=" + document.getElementById("atp_profname").value);
936 });
937 atp_valtgtbutton.addListener("click", function() {
938 // Click the "Validate New Target" button handler
939 if (getElemVal("atp_profname") == "") {
940 fc_dialog_msg("Please provide a profile name.", "warning");
941 return false;
942 };
943 if (getElemVal("atp_tgtaccount") == "") {
944 fc_dialog_msg("Please provide an account name.", "warning");
945 return false;
946 };
947 //if (getElemVal("atp_tgtidentifier") == "") {
948 // fc_dialog_msg("Please provide a target identifier.", "warning");
949 // return false;
950 //};
951 function atp_validateCB(res) {
952 var atp_validateJSON = YAHOO.lang.JSON.parse(res.responseText);
953 if(atp_validateJSON["result"] == true) {
954 // OK, so the account:identifier validated correctly.
955 // Let's add it to the list of new targets
956 var atp_newvalidatedtargetValu = res.argument["account"] + "\t" + res.argument["identifier"];
957 var atp_newvalidatedtargetName = "Account: '" + res.argument["account"] + "' , Identifier: '" + res.argument["identifier"] + "'";
958 var atp_newtgtSelectbox = document.getElementById("atp_newproftargets");
959 for(var i=0;i<atp_newtgtSelectbox.options.length;i++) {
960 if(atp_newtgtSelectbox.options[i].value === atp_newvalidatedtargetValu) {
961 fc_dialog_msg("Target '" + atp_newvalidatedtarget + "' already validated and ready to add to profile.", "warning");
962 return;
963 }
964 }
965 document.getElementById("atp_tgtaccount").value = "";
966 document.getElementById("atp_tgtidentifier").value = "";
967 // new Option(text, value, defaultSelected, selected)
968 atp_newtgtSelectbox.options[atp_newtgtSelectbox.options.length] = new Option(atp_newvalidatedtargetName, atp_newvalidatedtargetValu, false, true);
969 //atp_newtgtSelectbox.options[atp_newtgtSelectbox.options.length-1].selected = true;
970 atp_newtgtSelectbox.disabled = true;
971 } else if (atp_validateJSON["result"] == false) {
972 fc_dialog_msg(atp_validateJSON["data"], "alarm");
973 } else {
974 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
975 }
976 };
977 document.getElementById("atp_profname").disabled = false;
978 YAHOO.util.Connect.setForm(document.getElementById("atp_formcontainer"));
979 document.getElementById("atp_profname").disabled = true;
980 var atp_valnewtgt = YAHOO.util.Connect.asyncRequest('POST', "/request/validate.rpy", { success:atp_validateCB, argument: { "fromWhere": "Validate New Target", "fromFunc": "atp", "xhrDesc": "/request/validate.rpy", "account": getElemVal("atp_tgtaccount"), "identifier": getElemVal("atp_tgtidentifier") } } );
981 });
982 // OK, now let's commit the changes (handler for commit button)
983 atp_modprofbutton.addListener("click", function() {
984 var atp_newtgtSelectbox = document.getElementById("atp_newproftargets");
985 if(atp_newtgtSelectbox.options.length === 0) {
986 fc_dialog_msg("Please validate the target(s) first before attempting to commit the changes to the profile.", "warning");
987 return;
988 };
989 document.getElementById("atp_profname").disabled = false;
990 document.getElementById("atp_newproftargets").disabled = false;
991 YAHOO.util.Connect.setForm(document.getElementById("atp_formcontainer"));
992 document.getElementById("atp_profname").disabled = true;
993 document.getElementById("atp_newproftargets").disabled = true;
994 var atp_commitChanges = YAHOO.util.Connect.asyncRequest('POST', "/request/addprofiletarget.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Add Target(s) to Profile", "fromFunc": "atp", "xhrDesc": "/request/addprofiletarget.rpy" } });
995 });
996}
997
998function load_deltargetfromProf(e) {
999 unhide_me("deltgtfromprof");
1000 var dtp_getprofbutton = new YAHOO.widget.Button("dtp_getprofbutton");
1001 var dtp_modprofbutton = new YAHOO.widget.Button("dtp_modprofbutton");
1002
1003 var dtp_autocomplete = createAutoComplete("/request/findprofiles.rpy?searchtype=profadmin&searchtype=typembr&", "dtp_profname", "dtp_ac_box");
1004
1005 function dtp_fillFormCB(res) {
1006 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1007 if(responseJSON["result"] == true) {
1008 var dtp_newvalidatedtargetValu, dtp_newvalidatedtargetName, tmpAccount, tmpIdentifier;
1009 var dtp_proftargetsEl = document.getElementById("dtp_proftargets");
1010 for(var i=0;i<responseJSON["data"]["profiledata"].length;i++) {
1011 // Iterate over the profile data (targets) array
1012 tmpAccount = responseJSON["data"]["profiledata"][i]["account"];
1013 tmpIdentifier = responseJSON["data"]["profiledata"][i]["data"];
1014 dtp_newvalidatedtargetValu = tmpAccount + "\t" + tmpIdentifier;
1015 dtp_newvalidatedtargetName = "Account: '" + tmpAccount + "' , Identifier: '" + tmpIdentifier + "'";
1016 dtp_proftargetsEl.options[dtp_proftargetsEl.options.length] = new Option(dtp_newvalidatedtargetName, dtp_newvalidatedtargetValu);
1017 }
1018 } else if (responseJSON["result"] == false) {
1019 fc_dialog_msg(responseJSON["data"], "alarm");
1020 } else {
1021 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
1022 }
1023 }
1024 dtp_getprofbutton.addListener("click", function() {
1025 // Click the "Get Profile Data" button handler
1026 if(document.getElementById("dtp_profname").value == "") {
1027 fc_dialog_msg("Please enter the name of a profile.", "warning");
1028 return false;
1029 };
1030 // Clear the targets list if it containts items (maybe user already clicked 'Get Profile Data' button?)
1031 document.getElementById("dtp_proftargets").options.length=0;
1032 var dtp_getprofdata = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpprofile.rpy", { success:dtp_fillFormCB, argument: { "fromWhere": "Get Profile Data", "fromFunc": "dtp", "xhrDesc": "/request/dumpprofile.rpy" } }, "dp_profname=" + document.getElementById("dtp_profname").value);
1033 });
1034
1035 dtp_modprofbutton.addListener("click", function() {
1036 var dtp_proftargetsEl = document.getElementById("dtp_proftargets");
1037 if(dtp_proftargetsEl.options.length === 0) {
1038 fc_dialog_msg("This profile doesn't seem to have any targets associated with it.", "warning");
1039 return;
1040 };
1041 YAHOO.util.Connect.setForm(document.getElementById("dtp_formcontainer"));
1042 var dtp_commitChanges = YAHOO.util.Connect.asyncRequest('POST', "/request/removeprofiletarget.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Remove Target(s) from Profile", "fromFunc": "dtp", "xhrDesc": "/request/removeprofiletarget.rpy" } });
1043 });
1044}
1045
1046function load_addGroupToProf(e) {
1047 unhide_me("addgrptoprof");
1048 var agtp_addbutton = new YAHOO.widget.Button("agtp_addbutton");
1049 var agtp_getprofbutton = new YAHOO.widget.Button("agtp_getprofbutton");
1050
1051 var agtp_autocomplete1 = createAutoComplete("/request/findprofiles.rpy?searchtype=profadmin&", "agtp_profname", "agtp_ac_box1");
1052 var agtp_autocomplete2 = createAutoComplete("/request/findgroups.rpy?searchtype=all&", "agtp_groupname", "agtp_ac_box2");
1053
1054 function agtp_fillFormCB(res) {
1055 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1056 if(responseJSON["result"] == true) {
1057 var agtp_profgroupsEl = document.getElementById("agtp_profgroups");
1058 var agtp_newVal, agtp_newTxt;
1059 for(var i in responseJSON["data"]["groups"]) {
1060 agtp_newVal = i;
1061 if(responseJSON["data"]["primarygroup"] === i) {
1062 agtp_newTxt = i + " (primary group)";
1063 } else {
1064 agtp_newTxt = i;
1065 };
1066 agtp_profgroupsEl.options[agtp_profgroupsEl.options.length] = new Option(agtp_newTxt, agtp_newVal);
1067 };
1068 } else if (responseJSON["result"] == false) {
1069 fc_dialog_msg(responseJSON["data"], "alarm");
1070 } else {
1071 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
1072 };
1073 };
1074 agtp_getprofbutton.addListener("click", function() {
1075 // Click the "Get Profile Data" button handler
1076 if(document.getElementById("agtp_profname").value == "") {
1077 fc_dialog_msg("Please enter the name of a profile.", "warning");
1078 return false;
1079 };
1080 // Clear the targets list if it containts items (maybe user already clicked 'Get Profile Data' button?)
1081 document.getElementById("agtp_profgroups").options.length=0;
1082 var agtp_getprofdata = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpprofile.rpy", { success:agtp_fillFormCB, argument: { "fromWhere": "Get Profile Data", "fromFunc": "agtp", "xhrDesc": "/request/dumpprofile.rpy" } }, "dp_profname=" + document.getElementById("agtp_profname").value);
1083 });
1084
1085 agtp_addbutton.addListener("click", function() {
1086 if (getElemVal("agtp_groupname") == "") {
1087 fc_dialog_msg("Please specify a group to add.", "warning");
1088 return;
1089 };
1090 for (var i=0;i<document.getElementById("agtp_profgroups").options.length;i++) {
1091 if(document.getElementById("agtp_profgroups").options[i].value == getElemVal("agtp_groupname")) {
1092 fc_dialog_msg("The group '" + getElemVal("agtp_groupname") + "' is already in this profile!", "warning");
1093 return false;
1094 }
1095 }
1096 YAHOO.util.Connect.setForm(document.getElementById("agtp_formcontainer"));
1097 var agtp_commitChanges = YAHOO.util.Connect.asyncRequest('POST', "/request/addprofilegroup.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Add Group(s) to Profile", "fromFunc": "agtp", "xhrDesc": "/request/addprofilegroup.rpy" } });
1098 });
1099}
1100
1101function load_remGroupFromProf(e) {
1102 unhide_me("remgrpfromprof");
1103 var rgfp_button = new YAHOO.widget.Button("rgfp_button");
1104 var rgfp_getprofbutton = new YAHOO.widget.Button("rgfp_getprofbutton");
1105
1106 var rgfp_autocomplete = createAutoComplete("/request/findprofiles.rpy?searchtype=profadmin&", "rgfp_profname", "rgfp_ac_box");
1107
1108 function rgfp_fillFormCB(res) {
1109 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1110 if(responseJSON["result"] == true) {
1111 var rgfp_profgroupsEl = document.getElementById("rgfp_profgroups");
1112 var rgfp_newVal, rgfp_newTxt;
1113 document.getElementById("rgfp_primarygroup").value = responseJSON["data"]["primarygroup"];
1114 for(var i in responseJSON["data"]["groups"]) {
1115 rgfp_newVal = i;
1116 if(responseJSON["data"]["primarygroup"] === i) {
1117 continue; // ignore the primary group of the profile
1118 } else {
1119 rgfp_newTxt = i;
1120 };
1121 rgfp_profgroupsEl.options[rgfp_profgroupsEl.options.length] = new Option(rgfp_newTxt, rgfp_newVal);
1122 };
1123 } else if (responseJSON["result"] == false) {
1124 fc_dialog_msg(responseJSON["data"], "alarm");
1125 } else {
1126 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
1127 };
1128 };
1129 rgfp_getprofbutton.addListener("click", function() {
1130 // Click the "Get Profile Data" button handler
1131 if(document.getElementById("rgfp_profname").value == "") {
1132 fc_dialog_msg("Please enter the name of a profile.", "warning");
1133 return false; };
1134 // Clear the targets list if it containts items (maybe user already clicked 'Get Profile Data' button?)
1135 document.getElementById("rgfp_profgroups").options.length=0;
1136 var rgfp_getprofdata = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpprofile.rpy", { success:rgfp_fillFormCB, argument: { "fromWhere": "Get Profile Data", "fromFunc": "rgfp", "xhrDesc": "/request/dumpprofile.rpy" } }, "dp_profname=" + document.getElementById("rgfp_profname").value);
1137 });
1138
1139 rgfp_button.addListener("click", function() {
1140 var count = 0;
1141 for(var i=0;i<document.getElementById("rgfp_profgroups").options.length;i++) {
1142 if(document.getElementById("rgfp_profgroups").options[i].selected == true) {
1143 count++;
1144 }
1145 }
1146 if (count == 0) {
1147 fc_dialog_msg("Please specify one or more groups to remove.", "warning");
1148 return;
1149 };
1150 YAHOO.util.Connect.setForm(document.getElementById("rgfp_formcontainer"));
1151 var rgfp_commitChanges = YAHOO.util.Connect.asyncRequest('POST', "/request/removeprofilegroup.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Remove Group(s) from Profile", "fromFunc": "rgfp", "xhrDesc": "/request/removeprofilegroup.rpy" } });
1152 });
1153}
1154
1155function load_createGroup(e) {
1156 unhide_me("createnewgroup");
1157 var cng_createGroupButton = new YAHOO.widget.Button("cng_createGroupButton");
1158 cng_createGroupButton.addListener("click", function () {
1159 try {
1160 if ( getElemVal("cng_groupname") == "" ) throw "Please provide a name for the new group."
1161 if ( getElemVal("cng_groupadmin") == "" ) throw "Please choose the Administrator for this group."
1162 } catch(err) {
1163 fc_dialog_msg(err, "alarm");
1164 return
1165 };
1166 YAHOO.util.Connect.setForm(document.getElementById("cng_formcontainer"));
1167 var cng_Connect = YAHOO.util.Connect.asyncRequest('POST', "/request/creategroup.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Create New Group", "fromFunc": "cng", "xhrDesc": "/request/creategroup.rpy" } });
1168 });
1169}
1170
1171function load_modifyDeleteGroup(e) {
1172 unhide_me("modifydeletegroup");
1173 var mdg_getGroupDataButton = new YAHOO.widget.Button("mdg_getGroupDataButton");
1174 var mdg_modifyGroupButton = new YAHOO.widget.Button("mdg_modifyGroupButton");
1175 var mdg_deleteGroupButton = new YAHOO.widget.Button("mdg_deleteGroupButton");
1176
1177 var mdg_autocomplete = createAutoComplete("/request/findgroups.rpy?searchtype=all&", "mdg_oldgroupname", "mdg_ac_box");
1178
1179 mdg_getGroupDataButton.addListener("click", function () {
1180 if ( getElemVal("mdg_oldgroupname") == "" ) {
1181 fc_dialog_msg("Please provide the name of an existing group to modify or delete.", "alarm");
1182 return;
1183 };
1184 function mdg_fillFormDataSuccessCB(res) {
1185 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1186 if(responseJSON["result"] == true) {
1187 document.getElementById("mdg_oldgroupname").disabled = true;
1188 document.getElementById("mdg_groupname").value = getElemVal("mdg_oldgroupname");
1189 document.getElementById("mdg_groupdesc").value = responseJSON["data"]["description"];
1190 } else if (responseJSON["result"] == false) {
1191 fc_dialog_msg(responseJSON["data"], "alarm");
1192 } else {
1193 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
1194 };
1195 };
1196 var mdg_getgroupdataConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpgroup.rpy", { success:mdg_fillFormDataSuccessCB, argument: { "fromWhere": "Get Group Data", "fromFunc": "mdg", "xhrDesc": "/request/dumpgroup.rpy" } }, "dg_groupname=" + document.getElementById("mdg_oldgroupname").value);
1197 });
1198
1199 mdg_modifyGroupButton.addListener("click", function () {
1200 try {
1201 if ( !document.getElementById("mdg_oldgroupname").disabled ) throw "Please first get the group data (use the button above)."
1202 if ( getElemVal("mdg_groupname") == "" ) throw "Please provide a new group name (or leave it the same as the current group name if you don't want to rename the group)."
1203 } catch(err) {
1204 fc_dialog_msg(err, "alarm");
1205 return;
1206 };
1207 document.getElementById("mdg_oldgroupname").disabled = false;
1208 YAHOO.util.Connect.setForm(document.getElementById("mdg_formcontainer"));
1209 document.getElementById("mdg_oldgroupname").disabled = true;
1210 var mdg_modifyGroupConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/modifygroup.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Modify Group", "fromFunc": "mdg", "xhrDesc": "/request/modifygroup.rpy" } });
1211 });
1212
1213 mdg_deleteGroupButton.addListener("click", function () {
1214 try {
1215 if ( !document.getElementById("mdg_oldgroupname").disabled ) throw "Please first get the group data (use the button above)."
1216 if ( getElemVal("mdg_groupname") !== getElemVal("mdg_oldgroupname") ) throw "The new name field has been modified, so I'm not sure which group you want to delete. Please search again and don't modify the new name field if you want to delete a group."
1217 } catch(err) {
1218 fc_dialog_msg(err, "alarm");
1219 return;
1220 };
1221 document.getElementById("mdg_oldgroupname").disabled = false;
1222 YAHOO.util.Connect.setForm(document.getElementById("mdg_formcontainer"));
1223 document.getElementById("mdg_oldgroupname").disabled = true;
1224 var mdg_deleteGroupConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/deletegroup.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Delete Group", "fromFunc": "mdg", "xhrDesc": "/request/deletegroup.rpy" } });
1225 });
1226}
1227
1228function load_addGroupMembers(e) {
1229 unhide_me("addgroupmembers");
1230 var agm_addbutton = new YAHOO.widget.Button("agm_addgroupmembersbutton");
1231 var agm_getgroupmembers = new YAHOO.widget.Button("agm_getgroupmembers");
1232 var agm_addtolist = new YAHOO.widget.Button("agm_addtolist");
1233 var agm_autocomplete = createAutoComplete("/request/findgroups.rpy?searchtype=all&", "agm_groupname", "agm_ac_box");
1234
1235 agm_getgroupmembers.addListener("click", function() {
1236 function agm_fillGroupData() {
1237 function agm_getMembersSuccessCB(res) {
1238 try {
1239 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1240 } catch(err) {
1241 fc_dialog_msg("There was a problem with the data returned from the server. " + err, "alarm");
1242 return;
1243 };
1244
1245 // Clear all fields
1246 document.getElementById("agm_groupmembers").options.length = 0;
1247 document.getElementById("agm_groupadmins").options.length = 0;
1248 setElemVal("agm_grpdesc", "");
1249 document.getElementById("agm_newgroupmembers").options.length = 0;
1250 document.getElementById("agm_newgroupadmins").options.length = 0;
1251 setElemVal("agm_membername", "");
1252 document.getElementById("agm_admin").checked = false;
1253
1254 // Display the returned group data
1255 setElemVal("agm_hiddengroupname", getElemVal("agm_groupname")); // Set the hidden groupname field
1256 setElemVal("agm_grpdesc", responseJSON["data"]["description"]);
1257 var mbrOpt;
1258 for(var i in responseJSON["data"]["members"]) {
1259 if(responseJSON["data"]["members"][i]["admin"]) {
1260 mbrOpt = document.getElementById("agm_groupadmins").options;
1261 } else {
1262 mbrOpt = document.getElementById("agm_groupmembers").options;
1263 };
1264 mbrOpt[mbrOpt.length] = new Option(responseJSON["data"]["members"][i]["username"], responseJSON["data"]["members"][i]["username"]);
1265 };
1266 };
1267 var agm_getMembersConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpgroup.rpy", { success:agm_getMembersSuccessCB, argument: { "fromWhere": "Get Group Data", "fromFunc": "agm", "xhrDesc": "/request/dumpgroup.rpy" } }, "dg_groupname=" + getElemVal("agm_groupname") );
1268 };
1269
1270 // Test if form was already filled out, and confirm to override it.
1271 if(document.getElementById("agm_newgroupmembers").options.length != 0 || document.getElementById("agm_newgroupadmins").options.length != 0) {
1272 fc_dialog_2but("Getting Group Info again will clear the queues below. Continue?", "info", "Continue", "Cancel", agm_fillGroupData, null)
1273 } else {
1274 agm_fillGroupData();
1275 };
1276 });
1277
1278 agm_addtolist.addListener("click", function() {
1279 if(getElemVal("agm_membername") == "") {
1280 fc_dialog_msg("Please enter the comsi id of the person to add first.", "warning");
1281 return;
1282 };
1283
1284 // Test all 4 select box lists for the presense of "agm_membername"
1285 var testOpt, testArr, i, x;
1286 testArr = [ "agm_groupmembers", "agm_groupadmins" ];
1287 for(x=0;x<testArr.length;x++) {
1288 testOpt = document.getElementById(testArr[x]).options;
1289 for(i=0;i<testOpt.length;i++) {
1290 if(testOpt[i].value == getElemVal("agm_membername")) {
1291 fc_dialog_msg("'" + getElemVal("agm_membername") + "' is already a member of this group.", "alarm");
1292 return;
1293 }
1294 };
1295 };
1296 testArr = [ "agm_newgroupadmins", "agm_newgroupmembers" ];
1297 for(x=0;x<testArr.length;x++) {
1298 testOpt = document.getElementById(testArr[x]).options;
1299 for(i=0;i<testOpt.length;i++) {
1300 if(testOpt[i].value == getElemVal("agm_membername")) {
1301 fc_dialog_msg("'" + getElemVal("agm_membername") + "' is already queued to be added.", "warning");
1302 return;
1303 }
1304 };
1305 };
1306
1307 if(document.getElementById("agm_admin").checked) {
1308 var queueOpt = document.getElementById("agm_newgroupadmins").options;
1309 } else {
1310 var queueOpt = document.getElementById("agm_newgroupmembers").options;
1311 };
1312
1313 queueOpt[queueOpt.length] = new Option(getElemVal("agm_membername"), getElemVal("agm_membername"));
1314 setElemVal("agm_membername","");
1315 document.getElementById("agm_admin").checked = false;
1316 });
1317
1318 agm_addbutton.addListener("click", function() {
1319 if(getElemVal("agm_groupname") != getElemVal("agm_hiddengroupname")) {
1320 fc_dialog_msg("You've modified the group name, but not clicked the 'Get Group Information' button yet. Therefore the current member list and description might be incorrect, and possibly not applicable to the new member queue below. Please click 'Get Group Information' now. Note: this will remove any queued members below too -- this is to safeguard against adding members to an incorrect group.", "warning");
1321 return;
1322 };
1323 // TEST: if both new queues are empty, check if there is anything filled in the new ID field, and add it to the relevant queue first
1324 // do this by pretending the "Add member to queue" button was clicked (i.e. fire the click event for that button)
1325 if(document.getElementById("agm_newgroupmembers").options.length == 0 && document.getElementById("agm_newgroupadmins").options.length == 0) agm_addtolist.fireEvent("click");
1326 // TEST: if both new queues are STILL empty, then return (the above fireEvent would have already taken care of a relevant dialog msg).
1327 if(document.getElementById("agm_newgroupmembers").options.length == 0 && document.getElementById("agm_newgroupadmins").options.length == 0) return;
1328 // TEST: if the ID field is NOT empty and one/both of the new queues are NOT empty, then we're confused. Alert user and return.
1329 if(getElemVal("agm_membername") != "") {
1330 fc_dialog_msg("Please click 'Add member to queue' button, or clear the 'id' field first.", "alarm");
1331 return;
1332 };
1333
1334 // Select all the new queues options (for the FORM POST works correctly):
1335 var queueOpt, i;
1336 queueOpt = document.getElementById("agm_newgroupmembers").options;
1337 for(i=0;i<queueOpt.length;i++) queueOpt[i].selected = true;
1338 queueOpt = document.getElementById("agm_newgroupadmins").options;
1339 for(i=0;i<queueOpt.length;i++) queueOpt[i].selected = true;
1340
1341 YAHOO.util.Connect.setForm(document.getElementById("agm_formcontainer"));
1342 var agm_Connect = YAHOO.util.Connect.asyncRequest('POST', "/request/addgroupmember.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Add Group Member(s)", "fromFunc": "agm", "xhrDesc": "/request/addgroupmember.rpy" } });
1343 });
1344}
1345
1346function load_remGroupMembers(e) {
1347 unhide_me("remgroupmembers");
1348 var rgm_getgroupmembers = new YAHOO.widget.Button("rgm_getgroupmembers");
1349 var rgm_remgroupmembers = new YAHOO.widget.Button("rgm_remgroupmembersbutton");
1350 var rgm_autocomplete = createAutoComplete("/request/findgroups.rpy?searchtype=all&", "rgm_groupname", "rgm_ac_box");
1351
1352 rgm_getgroupmembers.addListener("click", function() {
1353 function rgm_getMembersSuccessCB(res) {
1354 try {
1355 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1356 } catch(err) {
1357 fc_dialog_msg("There was a problem with the data returned from the server. " + err, "alarm");
1358 return;
1359 };
1360
1361 // Clear all fields
1362 document.getElementById("rgm_groupmembers").options.length = 0;
1363 document.getElementById("rgm_groupadmins").options.length = 0;
1364 setElemVal("rgm_grpdesc", "");
1365
1366 // Display the returned group data
1367 setElemVal("rgm_hiddengroupname", getElemVal("rgm_groupname")); // Set the hidden groupname field
1368 setElemVal("rgm_grpdesc", responseJSON["data"]["description"]);
1369 var mbrOpt;
1370 for(var i in responseJSON["data"]["members"]) {
1371 if(responseJSON["data"]["members"][i]["admin"]) {
1372 mbrOpt = document.getElementById("rgm_groupadmins").options;
1373 } else {
1374 mbrOpt = document.getElementById("rgm_groupmembers").options;
1375 };
1376 mbrOpt[mbrOpt.length] = new Option(responseJSON["data"]["members"][i]["username"], responseJSON["data"]["members"][i]["username"]);
1377 };
1378 };
1379 var rgm_getMembersConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpgroup.rpy", { success:rgm_getMembersSuccessCB, argument: { "fromWhere": "Get Group Data", "fromFunc": "rgm", "xhrDesc": "/request/dumpgroup.rpy" } }, "dg_groupname=" + getElemVal("rgm_groupname") );
1380 });
1381
1382 rgm_remgroupmembers.addListener("click", function() {
1383 if(getElemVal("rgm_groupname") != getElemVal("rgm_hiddengroupname")) {
1384 fc_dialog_msg("You've modified the group name, but not clicked the 'Get Group Information' button yet. Therefore the current member list and description might be incorrect. Please click 'Get Group Information' now -- this check is to safeguard against removing members from an incorrect group.", "warning");
1385 return;
1386 };
1387 var selectedAny = false;
1388 var queueOpt, i;
1389 queueOpt = document.getElementById("rgm_groupmembers").options;
1390 for(i=0;i<queueOpt.length;i++) if(queueOpt[i].selected) selectedAny = true;
1391 queueOpt = document.getElementById("rgm_groupadmins").options;
1392 for(i=0;i<queueOpt.length;i++) if(queueOpt[i].selected) selectedAny = true;
1393 if(!selectedAny) {
1394 fc_dialog_msg("You've not selected any member(s) to remove. Please do so first.", "warning");
1395 return;
1396 };
1397 YAHOO.util.Connect.setForm(document.getElementById("rgm_formcontainer"));
1398 var rgm_Connect = YAHOO.util.Connect.asyncRequest('POST', "/request/removegroupmember.rpy", { success:allFormsSuccessCB, argument: { "fromWhere": "Remove Group Member(s)", "fromFunc": "rgm", "xhrDesc": "/request/removegroupmember.rpy" } });
1399 });
1400}
1401
1402function load_showProfile(opt_profname) {
1403 if(typeof(opt_profname) == "string") {
1404 unhide_me("displayprofileidetails", false); // don't hide other divs (i.e. called from Request Approval code)
1405 } else {
1406 unhide_me("displayprofileidetails", true); // hide all other divs
1407 };
1408 var dpd_getprofbutton = new YAHOO.widget.Button("dpd_getprofbutton");
1409
1410 var dpd_autocomplete = createAutoComplete("/request/findprofiles.rpy?searchtype=all&", "dpd_profname", "dpd_ac_box");
1411
1412 function dpd_fillFormCB(res) {
1413 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1414 if(responseJSON["result"] == true) {
1415 // First clear all elements, incase it was already full of data from a previous display
1416 document.getElementById("dpd_profprigrp").value = "";
1417 document.getElementById("dpd_proftargets").options.length = 0;
1418 document.getElementById("dpd_checkedoutby").value = " (nobody)";
1419 setElemVal("dpd_failedattempts", "");
1420 setElemVal("dpd_lastfailederror", " n/a");
1421
1422 // Fill the fields
1423 document.getElementById("dpd_profprigrp").value = responseJSON["data"]["primarygroup"];
1424 addTargetOptions("dpd_proftype"); // create the correct options
1425 changeSelectItem("dpd_proftype", responseJSON["data"]["profiletype"]); // select the correct option
1426 document.getElementById("dpd_maxhrs_hrs").value = hrsFromSeconds(responseJSON["data"]["maxcheckouttime"]);
1427 document.getElementById("dpd_pwdcheck_days").value = daysFromSeconds(responseJSON["data"]["checkinterval"]);
1428 document.getElementById("dpd_pwdchange_days").value = daysFromSeconds(responseJSON["data"]["changefreq"]);
1429 if(responseJSON["data"]["checkedoutby"] !== "") document.getElementById("dpd_checkedoutby").value = " " + responseJSON["data"]["checkedoutby"];
1430 setElemVal("dpd_failedattempts", " " + responseJSON["data"]["failattempts"]);
1431 if(responseJSON["data"]["faildescription"] !== "") setElemVal("dpd_lastfailederror", " " + responseJSON["data"]["faildescription"]);
1432
1433 // Fill the Targets select box
1434 var dpd_newvalidatedtargetValu, dpd_newvalidatedtargetName, tmpAccount, tmpIdentifier;
1435 var dpd_proftargetsEl = document.getElementById("dpd_proftargets");
1436 for(var i=0;i<responseJSON["data"]["profiledata"].length;i++) {
1437 // Iterate over the profile data (targets) array
1438 tmpAccount = responseJSON["data"]["profiledata"][i]["account"];
1439 tmpIdentifier = responseJSON["data"]["profiledata"][i]["data"];
1440 dpd_newvalidatedtargetValu = tmpAccount + "\t" + tmpIdentifier;
1441 dpd_newvalidatedtargetName = "Account: '" + tmpAccount + "' , Identifier: '" + tmpIdentifier + "'";
1442 dpd_proftargetsEl.options[dpd_proftargetsEl.options.length] = new Option(dpd_newvalidatedtargetName, dpd_newvalidatedtargetValu);
1443 }
1444
1445 // Draw TreeView for groups and group members
1446 var secGrpsTree = new YAHOO.widget.TreeView("secGrpsTree");
1447 for(var i in responseJSON["data"]["groups"]) {
1448 var grpNameNode = new YAHOO.widget.TextNode(i, secGrpsTree.getRoot(), false);
1449 for(var j in responseJSON["data"]["groups"][i]) {
1450 var grpMember = new YAHOO.widget.TextNode(responseJSON["data"]["groups"][i][j], grpNameNode, false);
1451 }
1452 };
1453 secGrpsTree.draw();
1454 } else if (responseJSON["result"] == false) {
1455 fc_dialog_msg(responseJSON["data"], "alarm");
1456 } else {
1457 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
1458 };
1459 };
1460 dpd_getprofbutton.addListener("click", function() {
1461 // Click the "Get Profile Data" button handler
1462 if(document.getElementById("dpd_profname").value == "") {
1463 fc_dialog_msg("Please enter the name of a profile.", "warning");
1464 return false; };
1465 var dpd_getprofdata = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpprofile.rpy", { success:dpd_fillFormCB, argument: { "fromWhere": "Get Profile Data", "fromFunc": "dpd", "xhrDesc": "/request/dumpprofile.rpy" } }, "dp_profname=" + document.getElementById("dpd_profname").value);
1466 });
1467
1468 // Was I called with a parameter, therefore a provided profname!?
1469 // If so, mimic as if it was filled into the input field and the Get Profile Data button clicked
1470 if(typeof(opt_profname) == "string") {
1471 setElemVal("dpd_profname", opt_profname);
1472 dpd_getprofbutton.fireEvent("click");
1473 };
1474}
1475
1476function load_showGroup(opt_grpname) {
1477 if(typeof(opt_grpname) == "string") {
1478 unhide_me("displaygroupdetails", false); // don't hide other divs (i.e. called from Request Approval code)
1479 } else {
1480 unhide_me("displaygroupdetails", true); // hide all other divs
1481 };
1482 var dgd_getgrpbutton = new YAHOO.widget.Button("dgd_getgrpbutton");
1483 var dgd_autocomplete = createAutoComplete("/request/findgroups.rpy?searchtype=all&", "dgd_grpname", "dgd_ac_box");
1484
1485 dgd_getgrpbutton.addListener("click", function() {
1486 if( getElemVal("dgd_grpname") == "" ) {
1487 fc_dialog_msg("Please provide a group name first...", "warning");
1488 return;
1489 };
1490 function dgd_getgrpbuttonCB(res) {
1491 try {
1492 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1493 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
1494 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-object 'data' field in JSON response";
1495 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
1496 if( typeof(responseJSON["data"]["priprofiles"].length) != "number") throw "Missing/non-list 'profiles' field in JSON response";
1497 if( typeof(responseJSON["data"]["members"].length) != "number") throw "Missing/non-list 'members' field in JSON response";
1498 if( typeof(responseJSON["data"]["description"]) != "string") throw "Missing/non-string 'description' field in JSON response";
1499 } catch(err) {
1500 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
1501 return;
1502 };
1503 // Fill in all the values
1504 setElemVal("dgd_groupdesc", responseJSON["data"]["description"]);
1505
1506 // Draw TreeView for groups, priprofs and secprofs
1507 var dgd_grpdetailstree = new YAHOO.widget.TreeView("dgd_grpdetailstree");
1508 var dgd_treeAdmins = new YAHOO.widget.TextNode("Group Administrator(s)", dgd_grpdetailstree.getRoot(), false);
1509 var dgd_treeMembers = new YAHOO.widget.TextNode("Group Member(s)", dgd_grpdetailstree.getRoot(), false);
1510 var dgd_treePriProfs = new YAHOO.widget.TextNode("Profiles with '" + getElemVal("dgd_grpname") + "' as PRIMARY group.", dgd_grpdetailstree.getRoot(), false);
1511 var dgd_treeSecProfs = new YAHOO.widget.TextNode("Profiles with '" + getElemVal("dgd_grpname") + "' as SECONDARY group.", dgd_grpdetailstree.getRoot(), false);
1512 var x;
1513 var dgd_treeAdminsPresent = false
1514 var dgd_treeMembersPresent = false;
1515 var dgd_treePriProfsPresent = false;
1516 var dgd_treeSecProfsPresent = false;
1517 for(var i=0;i<responseJSON["data"]["members"].length;i++) {
1518 if ( responseJSON["data"]["members"][i]["admin"] ) {
1519 x = new YAHOO.widget.TextNode(responseJSON["data"]["members"][i]["username"], dgd_treeAdmins, false);
1520 dgd_treeAdminsPresent = true;
1521 } else {
1522 x = new YAHOO.widget.TextNode(responseJSON["data"]["members"][i]["username"], dgd_treeMembers, false);
1523 dgd_treeMembersPresent = true;
1524 };
1525 };
1526 for(var i=0;i<responseJSON["data"]["priprofiles"].length;i++) {
1527 x = new YAHOO.widget.TextNode(responseJSON["data"]["priprofiles"][i], dgd_treePriProfs, false);
1528 dgd_treePriProfsPresent = true;
1529 };
1530 for(var i=0;i<responseJSON["data"]["secprofiles"].length;i++) {
1531 x = new YAHOO.widget.TextNode(responseJSON["data"]["secprofiles"][i], dgd_treeSecProfs, false);
1532 dgd_treeSecProfsPresent = true;
1533 };
1534 if(!dgd_treeAdminsPresent) x = new YAHOO.widget.TextNode("<none>", dgd_treeAdmins, false);
1535 if(!dgd_treeMembersPresent) x = new YAHOO.widget.TextNode("<none>", dgd_treeMembers, false);
1536 if(!dgd_treePriProfsPresent) x = new YAHOO.widget.TextNode("<none>", dgd_treePriProfs, false);
1537 if(!dgd_treeSecProfsPresent) x = new YAHOO.widget.TextNode("<none>", dgd_treeSecProfs, false);
1538 dgd_grpdetailstree.draw();
1539 };
1540 var dgd_getgrpbuttonConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/dumpgroup.rpy", { success:dgd_getgrpbuttonCB, argument: { "fromWhere": "Get Group Data", "fromFunc": "dgd", "xhrDesc": "/request/dumpgroup.rpy" } }, "dg_groupname=" + getElemVal("dgd_grpname") );
1541 });
1542
1543 // Was I called with a parameter, therefore a provided grpname!?
1544 // If so, mimic as if it was filled into the input field and the Get Group Data button clicked
1545 if(typeof(opt_grpname) == "string") {
1546 setElemVal("dgd_grpname", opt_grpname);
1547 dgd_getgrpbutton.fireEvent("click");
1548 };
1549}
1550
1551function load_showUser(opt_username) {
1552 unhide_me("displayuserdetails");
1553 var dud_getuserbutton = new YAHOO.widget.Button("dud_getuserbutton");
1554
1555 dud_getuserbutton.addListener("click", function() {
1556 if ( getElemVal("dud_username") == "" ) {
1557 fc_dialog_msg("Please first type the comsi ID of the person you're looking for.", "warning");
1558 return;
1559 };
1560 function dud_getuserCB(res) {
1561 try {
1562 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1563 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
1564 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-object 'data' field in JSON response";
1565 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
1566 if( typeof(responseJSON["data"]["groupsmember"]) != "object") throw "Missing/non-list 'groupsmember' field in JSON response";
1567 if( typeof(responseJSON["data"]["groupsmember"].length) != "number") throw "Missing/non-list 'groupsmember' field in JSON response";
1568 if( typeof(responseJSON["data"]["groupsadmin"]) != "object") throw "Missing/non-list 'groupsadmin' field in JSON response";
1569 if( typeof(responseJSON["data"]["groupsadmin"].length) != "number") throw "Missing/non-list 'groupsadmin' field in JSON response";
1570 if( typeof(responseJSON["data"]["profiles"]) != "object") throw "Missing/non-list 'profiles' field in JSON response";
1571 if( typeof(responseJSON["data"]["profiles"].length) != "number") throw "Missing/non-list 'profiles' field in JSON response";
1572 if( typeof(responseJSON["data"]["types"]) != "object") throw "Missing/non-list 'types' field in JSON response";
1573 if( typeof(responseJSON["data"]["types"].length) != "number") throw "Missing/non-list 'types' field in JSON response";
1574 } catch(err) {
1575 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
1576 return;
1577 };
1578
1579 // Draw TreeView for groups, priprofs and secprofs
1580 var dud_userdetailstree = new YAHOO.widget.TreeView("dud_detailtree");
1581 var dud_userdetailstreeRoot = dud_userdetailstree.getRoot();
1582 var dud_grpAdmins = new YAHOO.widget.TextNode({label:"Administrator of these groups", ask:true}, dud_userdetailstreeRoot, false);
1583 var dud_grpMember = new YAHOO.widget.TextNode({label:"Normal member of these groups", ask:true}, dud_userdetailstreeRoot, false);
1584 var dud_typesMbr = new YAHOO.widget.TextNode({label:"Can create profiles of these types",ask:true}, dud_userdetailstreeRoot, false);
1585 var dud_profiles = new YAHOO.widget.TextNode({label:"Profiles user can checkout", ask:true}, dud_userdetailstreeRoot, false);
1586
1587 dud_userdetailstree.subscribe("expand", function(node) {
1588 // Provide a warning if the node contains more than 200 entries.
1589 if(node.getNodeCount()>200 && node.data.ask) {
1590 fc_dialog_msg("This node contains " + node.getNodeCount().toString() + " entries, and might take a while to load. If you're sure you want to do it, please click the plus icon again (and be patient).", "info");
1591 node.data.ask = false;
1592 return false;
1593 };
1594 return true;
1595 });
1596
1597 var dud_grpAdminsPresent = false;
1598 var dud_grpMemberPresent = false;
1599 var dud_typesMbrPresent = false;
1600 var dud_profilesPresent = false;
1601
1602 var tmp;
1603 for(var i=0;i<responseJSON["data"]["groupsadmin"].length;i++) {
1604 dud_grpAdminsPresent = true;
1605 tmp = new YAHOO.widget.TextNode(responseJSON["data"]["groupsadmin"][i], dud_grpAdmins, false);
1606 };
1607 for(var i=0;i<responseJSON["data"]["groupsmember"].length;i++) {
1608 dud_grpMemberPresent = true;
1609 tmp = new YAHOO.widget.TextNode(responseJSON["data"]["groupsmember"][i], dud_grpMember, false);
1610 };
1611 for(var i=0;i<responseJSON["data"]["types"].length;i++) {
1612 dud_typesMbrPresent = true;
1613 tmp = new YAHOO.widget.TextNode(responseJSON["data"]["types"][i], dud_typesMbr, false);
1614 };
1615 for(var i=0;i<responseJSON["data"]["profiles"].length;i++) {
1616 dud_profilesPresent = true;
1617 tmp = new YAHOO.widget.TextNode(responseJSON["data"]["profiles"][i], dud_profiles, false);
1618 };
1619 if(!dud_grpAdminsPresent) tmp = new YAHOO.widget.TextNode("<none>", dud_grpAdmins, false);
1620 if(!dud_grpMemberPresent) tmp = new YAHOO.widget.TextNode("<none>", dud_grpMember, false);
1621 if(!dud_typesMbrPresent) tmp = new YAHOO.widget.TextNode("<none>", dud_typesMbr, false);
1622 if(!dud_profilesPresent) tmp = new YAHOO.widget.TextNode("<none>", dud_profiles, false);
1623
1624 dud_userdetailstree.draw();
1625 };
1626 var dud_getuserConnect = YAHOO.util.Connect.asyncRequest('GET', "/request/dumpuser.rpy?dud_username=" + getElemVal("dud_username"), { success: dud_getuserCB, argument: { "fromWhere": "Get User Data", "fromFunc": "dud", "xhrDesc": "/request/dumpuser.rpy" } } );
1627 });
1628
1629 // Was I called with a parameter, therefore a provided person name!?
1630 // If so, mimic as if it was filled into the input field and the Get User Data button clicked
1631 if(typeof(opt_username) == "string") {
1632 setElemVal("dud_username", opt_username);
1633 dud_getuserbutton.fireEvent("click");
1634 };
1635}
1636
1637function load_listAllGroups() {
1638 load_listAllProfsGrps("Groups");
1639}
1640
1641function load_listAllProfiles() {
1642 load_listAllProfsGrps("Profiles");
1643}
1644
1645function load_listAllUsers() {
1646 load_listAllProfsGrps("Users");
1647}
1648
1649function load_listAllProfsGrps(sType) {
1650 unhide_me("displayallprofsgrps");
1651 document.getElementById("dapg_header").innerHTML = sType;
1652 document.getElementById("dapg_container").innerHTML = "<div id='dapg_plswait'><img src='/pub/images/wait-trans.gif' /><br>(can take quite a while in Internet Explorer 6)</div>";
1653
1654 function dapg_listAllProfsGrpsCB(res) {
1655 // ### LOOK HERE ###
1656 // This try/catch statement is a good clean example of how to do the JSON parsing, and how to test the basic result and display
1657 // any needed errors. It SHOULD probably be done this way in all other functions too.
1658 try {
1659 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1660 // STANDARD FIRECALL JSON RESULT PARSE TESTS
1661 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
1662 if( !responseJSON["result"] ) {
1663 if( typeof(responseJSON["data"]) != "string" ) throw "JSON 'result' was 'false', but JSON 'data' wasn't a string";
1664 throw "JSON 'result' was 'false' and JSON 'data' contained '" + responseJSON["data"] + "'";
1665 };
1666 // END STD FC JSON TESTS
1667 // Specific tests on the returned data for this particular function:
1668 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-list 'data' field in JSON response";
1669 if( typeof(responseJSON["data"].length) != "number") throw "Missing/non-list 'data' field in JSON response";
1670 } catch(err) {
1671 fc_dialog_msg("There was an internal error processing the request. Please contact support. Technical details: " + err, "alarm");
1672 return;
1673 };
1674 // ### END LOOK HERE ###
1675 var dapg_tableHTML = "";
1676 for(var i=0;i<responseJSON["data"].length;i++) {
1677 dapg_tableHTML += "<tr><td id='dapg_row" + i.toString().zeropad(4) + "' class='aligncenter'>" + responseJSON["data"][i] + "</td></tr>";
1678 };
1679 if( responseJSON["data"].length == 0 ) dapg_tableHTML = "<tr><td>There are no " + sType + " defined in the Firecall database.</td></tr>";
1680 document.getElementById("dapg_container").innerHTML = "<table id='dapg_tablecontainer' name='dapg_tablecontainer'><tbody>" + dapg_tableHTML + "</tbody></table>";
1681 for(var i=0;i<responseJSON["data"].length;i++) {
1682 YAHOO.util.Event.on("dapg_row" + i.toString().zeropad(4), "mouseenter", function() {
1683 YAHOO.util.Dom.addClass(this.id, "yellowbg");
1684 });
1685 YAHOO.util.Event.on("dapg_row" + i.toString().zeropad(4), "mouseleave", function() {
1686 YAHOO.util.Dom.removeClass(this.id, "yellowbg");
1687 });
1688 YAHOO.util.Event.on("dapg_row" + i.toString().zeropad(4), "click", function() {
1689 unhide_me(""); // hide myself first and then call showGroup/showProfile
1690 if( sType == "Profiles" ) {
1691 load_showProfile(document.getElementById(this.id).innerHTML);
1692 } else if( sType == "Groups" ) {
1693 load_showGroup(document.getElementById(this.id).innerHTML);
1694 } else if( sType == "Users" ) {
1695 load_showUser(document.getElementById(this.id).innerHTML);
1696 };
1697 });
1698 };
1699 };
1700 if( sType == "Profiles" ) {
1701 var dapg_listAllProfsGrpsConnect = YAHOO.util.Connect.asyncRequest('GET', "/request/listprofiles.rpy", { success: dapg_listAllProfsGrpsCB, argument: { "fromWhere": "List All Profiles", "fromFunc": "dapg", "xhrDesc": "/request/listprofiles.rpy" } } );
1702 } else if( sType == "Groups" ) {
1703 var dapg_listAllProfsGrpsConnect = YAHOO.util.Connect.asyncRequest('GET', "/request/listgroups.rpy", { success: dapg_listAllProfsGrpsCB, argument: { "fromWhere": "List All Groups", "fromFunc": "dapg", "xhrDesc": "/request/listgroups.rpy" } } );
1704 } else if( sType == "Users" ) {
1705 var dapg_listAllProfsGrpsConnect = YAHOO.util.Connect.asyncRequest('GET', "/request/listusers.rpy", { success: dapg_listAllProfsGrpsCB, argument: { "fromWhere": "List All Users", "fromFunc": "dapg", "xhrDesc": "/request/listusers.rpy" } } );
1706 } else {
1707 fc_dialog_msg("load_listAllProfsGrps() called with something other than 'Profiles', 'Groups' or 'Users' as argument. Please contact support.", "alarm");
1708 };
1709}
1710
1711function load_searchProfiles(optFromCheckOut) {
1712 if( typeof(optFromCheckOut) != "boolean" ) optFromCheckOut = false;
1713 if(optFromCheckOut) {
1714 // Called from CheckoutProf form
1715 unhide_me("searchprofiles", false);
1716 // unhide "invisiblestart" elements
1717 // these are elements that should only be visible when called from the CheckoutProf form
1718 var hiddenEls = YAHOO.util.Dom.getElementsByClassName("invisiblestart", "", "searchprofiles");
1719 for(var i=0;i<hiddenEls.length;i++) YAHOO.util.Dom.removeClass(hiddenEls[i], "invisiblestart");
1720 // hide "hidewhen2divsvisible" elements
1721 // these are elements that should NOT be visible when called from the CheckoutProf form
1722 hiddenEls = YAHOO.util.Dom.getElementsByClassName("hidewhen2divsvisible", "", "searchprofiles");
1723 for(var i=0;i<hiddenEls.length;i++) YAHOO.util.Dom.addClass(hiddenEls[i], "invisiblestart");
1724 } else {
1725 // Called from menu
1726 unhide_me("searchprofiles", true);
1727 };
1728 var sp_searchbutton = new YAHOO.widget.Button("sp_searchbutton");
1729 addTargetOptions("sp_proftype", false);
1730
1731 sp_searchbutton.addListener("click", function() {
1732 if( getElemVal("sp_searchtgtacct") == "" && getElemVal("sp_searchtgtident") == "" ) {
1733 fc_dialog_msg("Please provide an account name or a target identifier (or both, of course).", "warning");
1734 return;
1735 };
1736 function sp_searchbuttonCB(res) {
1737 try {
1738 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1739 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
1740 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-object 'data' field in JSON response";
1741 if( typeof(responseJSON["data"].length) != "number" ) throw "Missing/non-list 'data' field in JSON response";
1742 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
1743 } catch(err) {
1744 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
1745 return;
1746 };
1747
1748 // Build a datatable with results
1749 var sp_matchesColDefs = [
1750 {key:"profname", label:"Profile Name", sortable:false, resizeable:false },
1751 {key:"proftype", label:"Profile Type", sortable:false, resizeable:false },
1752 {key:"tgtaccount", label:"Target Account Name", sortable:false, resizeable:false },
1753 {key:"tgtidentifier", label:"Target Identifier", sortable:false, resizeable:false }
1754 ];
1755 var sp_matches_ds = new YAHOO.util.LocalDataSource(responseJSON);
1756 sp_matches_ds.responseType = YAHOO.util.DataSource.TYPE_JSON;
1757 sp_matches_ds.maxCacheEntries = 0;
1758 sp_matches_ds.responseSchema = {
1759 resultsList: "data",
1760 fields: ["profname","proftype","tgtaccount","tgtidentifier"]
1761 };
1762 sp_matchesDataTable = new YAHOO.widget.DataTable("sp_matchestable", sp_matchesColDefs, sp_matches_ds);
1763
1764 // Subscribe to events for row selection
1765 if(optFromCheckOut) {
1766 // only handle 'click' events when Search form was called from the CheckOut form
1767 sp_matchesDataTable.subscribe("rowMouseoverEvent", sp_matchesDataTable.onEventHighlightRow);
1768 sp_matchesDataTable.subscribe("rowMouseoutEvent", sp_matchesDataTable.onEventUnhighlightRow);
1769 sp_matchesDataTable.subscribe("rowClickEvent", sp_matchesDataTable.onEventSelectRow);
1770 sp_matchesDataTable.subscribe("rowClickEvent", sp_matchesDataTable.clearTextSelection);
1771 sp_matchesDataTable.subscribe("rowClickEvent", function(e, tgt) {
1772 var recStr = this.getLastSelectedRecord();
1773 var recObj = this.getRecord(recStr);
1774 var recProfName = recObj.getData("profname");
1775
1776 // Check if it's in the cop_profiles selectbox already. If not, add it, baby!
1777 var cop_profiles = document.getElementById("cop_profiles").options;
1778 for(var j=0;j<cop_profiles.length;j++) {
1779 if( cop_profiles[j].value.toLowerCase() == recProfName.toLowerCase() ) {
1780 fc_dialog_msg(recProfName + " is already in the checkout queue!", "warning");
1781 this.unselectAllRows(); // clear selection and return
1782 return;
1783 };
1784 };
1785 cop_profiles[cop_profiles.length] = new Option(recProfName, recProfName, false, false);
1786
1787 this.unselectAllRows(); // and clear selection again
1788 });
1789 };
1790
1791 };
1792 YAHOO.util.Connect.setForm("sp_formcontainer");
1793 var sp_seachbuttonConnect = YAHOO.util.Connect.asyncRequest('POST', "/request/searchprofiles.rpy", { success: sp_searchbuttonCB, argument: { "fromWhere": "Search Profile Data", "fromFunc": "sp", "xhrDesc": "/request/searchprofiles.rpy" } } );
1794 });
1795}
1796
1797function reports_menu_click(p_sType, p_aArgs) {
1798 var e = p_aArgs[0]; // DOM Event
1799 YAHOO.util.Event.preventDefault(e); // Prevent default behaviour of item that was clicked on
1800
1801 // Figure out what the url was that was associated with the menu item clicked
1802 // Differs between IE6 and other browsers. /me swears & waves fist at IE6
1803 if (e.srcElement) {
1804 var rep_url = e.srcElement; // IE6 (7/8?)
1805 } else if (e.target) {
1806 var rep_url = e.target; // FF & Chrome
1807 } else {
1808 fc_dialog_msg("The browser you're using doesn't seem to pass the link clicked through. Please contact support.", "alarm");
1809 return false;
1810 }
1811
1812 // this.id seems to be the menu item's ID that was clicked.
1813 var menu_item_id = this.id;
1814
1815 // This section GETs the reportform HTML and displays it
1816 function srf_showRepFormCB(res) {
1817 unhide_me("showreportform");
1818
1819 // Build a new <div>, which will be the reportform table, using some static HTML and the dynamically returned report HTML:
1820 var srf_tablediv = document.createElement("div");
1821 try {
1822 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1823 } catch(err) {
1824 fc_dialog_msg(err, "alarm");
1825 return;
1826 };
1827 srf_tablediv.innerHTML = " <table id='srf_tablecontainer' name='srf_tablecontainer'> " + responseJSON["data"] + " \
1828<tr> \
1829 <td colspan=2> \
1830 <hr> \
1831 </td> \
1832</tr> \
1833<tr> \
1834 <td colspan=2 class='aligncenter'> \
1835Please select the format of the report:<br> \
1836 </td> \
1837</tr> \
1838<tr> \
1839 <td colspan=2 class='aligncenter'> \
1840 <input type='hidden' name='srf_repformat' id='srf_repformat' value='csv' /> \
1841 <button type='button' id='srf_buttondisplay' name='srf_buttondisplay' >Display On-Screen</button> \
1842 <button type='submit' id='srf_buttondownload' name='srf_buttondownload'>Download CSV/Excel</button> \
1843 </td> \
1844</tr> \
1845</table> \
1846";
1847 // Add this new <div> into the form in a way IE6 is happy with -- I hope!
1848 document.getElementById("srf_form").appendChild(srf_tablediv);
1849
1850 // YUI-ify the 2 buttons
1851 var srf_submitbuttondisplay = new YAHOO.widget.Button("srf_buttondisplay");
1852 var srf_submitbuttondownload = new YAHOO.widget.Button("srf_buttondownload");
1853
1854 // Take the value in the hidden field "srf_headertext" and shove it into the srf_header <div> :-)
1855 document.getElementById("srf_header").innerHTML = "<p>REPORT: " + getElemVal("srf_headertext") + "</p>";
1856
1857 // Now test for, and set up any autocomplete(s)
1858 var srf_ac_queryurl, srf_ac_queryinputbox, srf_ac_query_ac_box;
1859 var srf_ac_array = [];
1860 var srf_ac_divs = YAHOO.util.Dom.getElementsByClassName("autocompletediv", "", "srf_tablecontainer");
1861 for(var i=0;i<srf_ac_divs.length;i++) {
1862 srf_ac_queryurl = YAHOO.util.Dom.getElementsByClassName( "srf_ac_queryurl", "input", srf_ac_divs[i]);
1863 srf_ac_queryinputbox = YAHOO.util.Dom.getElementsByClassName("srf_ac_queryinputbox", "input", srf_ac_divs[i]);
1864 srf_ac_query_ac_box = YAHOO.util.Dom.getElementsByClassName( "srf_ac_query_ac_box", "input", srf_ac_divs[i]);
1865 try {
1866 if(srf_ac_queryurl.length != 1) throw "Missing (or more than one) 'srf_ac_queryurl' hidden field in report";
1867 if(srf_ac_queryinputbox.length != 1) throw "Missing (or more than one) 'srf_ac_queryinputbox' hidden field in report";
1868 if(srf_ac_query_ac_box.length != 1) throw "Missing (or more than one) 'srf_ac_query_ac_box' hidden field in report";
1869 if(srf_ac_queryurl[0].value == "") throw "Missing value for 'srf_ac_queryurl' hidden field in report";
1870 if(srf_ac_queryinputbox[0].value == "") throw "Missing value for 'srf_ac_queryinputbox' hidden field in report";
1871 if(srf_ac_query_ac_box[0].value == "") throw "Missing value for 'srf_ac_query_ac_box' hidden field in report";
1872 srf_ac_queryurl = srf_ac_queryurl[0].value;
1873 srf_ac_queryinputbox = srf_ac_queryinputbox[0].value;
1874 srf_ac_query_ac_box = srf_ac_query_ac_box[0].value;
1875 // OK, set up the autocomplete, baby!!
1876 srf_ac_array[i] = createAutoComplete(srf_ac_queryurl, srf_ac_queryinputbox, srf_ac_query_ac_box);
1877 } catch(err) {
1878 fc_dialog_msg(err, "alarm");
1879 return;
1880 };
1881 }; // finished building any autocomplete YUI objects
1882
1883 // Set the form's target to the report's URL
1884 // This is important, because one of the 2 buttons is a submit button (to download the CSV version of the report)
1885 document.getElementById('srf_form').action = rep_url;
1886
1887 // Add event handler only to display button
1888 // Download button will do a physical post (in order to download csv)
1889 srf_submitbuttondisplay.addListener("click", function () {
1890 function show_report_results_CB(res) {
1891 // Function to cgi_escape all data in the report table
1892 var formatData = function(elCell, oRecord, oColumn, sData) {
1893 if (typeof sData === "string") {
1894 elCell.innerHTML = sData.cgi_escape();
1895 };
1896 };
1897 // Now get the column headers:
1898 // shift 1st item, which is an array of column headers
1899 // Leaves rest of array of results intact
1900 var repData = YAHOO.lang.JSON.parse(res.responseText);
1901 var repColHeaders = repData.shift();
1902 var myColumnDefs = [];
1903 var myColumnKeys = [];
1904 for (var i=0;i<repColHeaders.length;i++) {
1905 myColumnDefs.push({key:"col"+i.toString().zeropad(2), label:repColHeaders[i], minWidth:120, sortable:true, resizeable:true, formatter:formatData});
1906 myColumnKeys.push("col"+i.toString().zeropad(2));
1907 }
1908 var repDS = new YAHOO.util.LocalDataSource(repData);
1909 repDS.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
1910 repDS.responseSchema = {
1911 fields: myColumnKeys
1912 };
1913 var repDataTable = new YAHOO.widget.DataTable("srr_div", myColumnDefs, repDS, {caption:"(note: on-screen reports are limited to 5000 lines - for larger reports, please download the CSV version)"});
1914 };
1915 var srf_saveRepHeader = getElemVal("srf_headertext"); // do this before the unhide func, which resets all HTML
1916 unhide_me("showreportresult");
1917 document.getElementById('srr_header').innerHTML = "<p>REPORT RESULT: " + srf_saveRepHeader + "</p>";
1918 document.getElementById("srr_div").innerHTML = "<img src='/pub/images/wait-trans.gif' />";
1919 document.getElementById('srf_repformat').value="json";
1920 var formObject = document.getElementById('srf_form');
1921 YAHOO.util.Connect.setForm(formObject);
1922 var srr_fetch_report_results = YAHOO.util.Connect.asyncRequest('POST', rep_url, {success:show_report_results_CB, argument: { "fromWhere": "Get Report Result", "fromFunc": "srr", "xhrDesc": rep_url }});
1923 }); // end srf_submitbuttondisplay.addListener
1924 }; // end srf_showRepFormCB
1925
1926 rep_url = rep_url.toString(); // need this to make the following asyncRequest work in Chrome ?!
1927 var srf_get_report_fields = YAHOO.util.Connect.asyncRequest('GET', rep_url, { success:srf_showRepFormCB, argument: { "fromWhere": "Get Report Form", "fromFunc": "srf", "xhrDesc": rep_url } });
1928}
1929
1930function reqShowRequest(optReqID) {
1931 function saf_reqShowCB(res) {
1932 try {
1933 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1934 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
1935 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
1936 if( typeof(responseJSON["data"]) != "string" ) throw "Missing/non-string 'data' field in JSON response";
1937 } catch(err) {
1938 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
1939 return;
1940 };
1941 unhide_me("showapprovalform");
1942 var saf_tablediv = document.createElement("div");
1943 saf_tablediv.innerHTML = "<table id='saf_tablecontainer' name='saf_tablecontainer'><tbody>" +
1944 responseJSON["data"] +
1945 "<tr><td colspan=2><hr></td></tr>" +
1946 "<tr><td class='alignright'>Auth Comments</td>" +
1947 "<td><textarea rows=4 cols=80 id='saf_comments' name='saf_comments'></textarea></td>" +
1948 "<tr><td colspan=2 class='aligncenter'>" +
1949 "<input type=button id='saf_approvebut' name='saf_approvebut' value='Approve' />" +
1950 "<input type=button id='saf_rejectbut' name='saf_rejectbut' value='Reject' />" +
1951 "<input type=button id='saf_backbut' name='saf_backbut' value='Back' />" +
1952 "<input type=hidden id='saf_requestid' name='saf_requestid' value='' />" +
1953 "<input type=hidden id='saf_action' name='saf_action' value='' />" +
1954 "</td></tr>" +
1955 "</tbody></table>";
1956 document.getElementById("saf_formcontainer").appendChild(saf_tablediv);
1957 // Determine whether I should display the "Display Profile" or "Display Group" forms too
1958 // Used by recertification requests involving profiles/groups
1959 try {
1960 var saf_objname = document.getElementById("saf_objname").value;
1961 var saf_objtype = document.getElementById("saf_objtype").value;
1962 if( saf_objtype == "group" ) {
1963 load_showGroup(saf_objname);
1964 var saf_elsToHide = YAHOO.util.Dom.getElementsByClassName("hidewhen2divsvisible","","displaygroupdetails");
1965 } else if( saf_objtype == "profile" ) {
1966 load_showProfile(saf_objname);
1967 var saf_elsToHide = YAHOO.util.Dom.getElementsByClassName("hidewhen2divsvisible","","displayprofileidetails");
1968 } else {
1969 throw "";
1970 };
1971 for(var i=0;i<saf_elsToHide.length;i++) {
1972 YAHOO.util.Dom.addClass(saf_elsToHide[i], "invisiblestart");
1973 };
1974 } catch(err) {
1975 // nothing. ignore it when they're not present
1976 };
1977
1978 var saf_approveBut = new YAHOO.widget.Button('saf_approvebut');
1979 var saf_rejectBut = new YAHOO.widget.Button('saf_rejectbut');
1980 var saf_backBut = new YAHOO.widget.Button('saf_backbut');
1981 function saf_actionBut() {
1982 // requestacion.rpy which takes a requestid, and a actionapproved
1983 function saf_actionCB(res) {
1984 try {
1985 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
1986 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
1987 if( typeof(responseJSON["data"]) != "string" ) throw "Missing/non-string 'data' field in JSON response";
1988 if( !responseJSON["result"] ) throw responseJSON["data"];
1989 } catch(err) {
1990 fc_dialog_msg(err, "alarm");
1991 reqApprovals();
1992 return;
1993 };
1994 fc_dialog_msg(responseJSON["data"], "info");
1995 reqApprovals();
1996 };
1997 switch(this.getAttributeConfig("id").value) {
1998 case "saf_approvebut": // Set the hidden form elements to what the server expects
1999 setElemVal('saf_requestid', optReqID);
2000 setElemVal('saf_action', "1"); // 1 is approve
2001 YAHOO.util.Connect.setForm(document.getElementById("saf_formcontainer"));
2002 var saf_actionConnect = YAHOO.util.Connect.asyncRequest('POST', '/request/requestaction.rpy', { success:saf_actionCB, argument: { "fromWhere": "Approve a Request", "fromFunc": "saf", "xhrDesc": "/request/requestaction.rpy" } });
2003 break;
2004 case "saf_rejectbut": // Set the hidden form elements to what the server expects
2005 setElemVal('saf_requestid', optReqID);
2006 setElemVal('saf_action', "0"); // 0 is reject
2007 YAHOO.util.Connect.setForm(document.getElementById("saf_formcontainer"));
2008 var saf_actionConnect = YAHOO.util.Connect.asyncRequest('POST', '/request/requestaction.rpy', { success:saf_actionCB, argument: { "fromWhere": "Reject a Request", "fromFunc": "saf", "xhrDesc": "/request/requestaction.rpy" } });
2009 break;
2010 case "saf_backbut": reqApprovals();
2011 break;
2012 };
2013 };
2014 // Add the function above as handler for all three buttons
2015 saf_approveBut.addListener("click", saf_actionBut);
2016 saf_rejectBut.addListener("click", saf_actionBut);
2017 saf_backBut.addListener("click", saf_actionBut);
2018 };
2019 var saf_reqShowConnect = YAHOO.util.Connect.asyncRequest('GET', "/request/requestshow.rpy?requestid=" + optReqID, { success:saf_reqShowCB, argument: { "fromWhere": "Show Request Details", "fromFunc": "saf", "xhrDesc": "/request/requestshow.rpy" } } );
2020}
2021
2022function reqApprovals() {
2023 function reqApprovalListCB(res) {
2024 try {
2025 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
2026 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
2027 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-list 'data' field in JSON response";
2028 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
2029 var sal_approvalList = responseJSON["data"];
2030 if( typeof(sal_approvalList.length) != "number" ) throw "JSON 'data' field isn't a list";
2031 for(var i=0;i<sal_approvalList.length;i++) {
2032 if( typeof(sal_approvalList[i]["requestid"]) == "undefined") throw "Missing 'requestid' field in JSON response";
2033 if( typeof(sal_approvalList[i]["summary"]) == "undefined") throw "Missing 'summary' field in JSON response";
2034 };
2035 } catch(err) {
2036 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
2037 return;
2038 };
2039 unhide_me("showapprovallist");
2040 var sal_tablediv = document.createElement("div");
2041 var dynHTML = "";
2042 for(var i=0;i<sal_approvalList.length;i++) {
2043 dynHTML = dynHTML + "<tr><td>" + sal_approvalList[i]["summary"] + "</td><td class='aligncenter'><button id='sal_req_" + sal_approvalList[i]["requestid"] + "' class='sal_reqlistbutton'>View Detail</button></td></tr>";
2044 };
2045 if( dynHTML === "" ) {
2046 // Still empty, therefore no outstanding approval requests.
2047 dynHTML = "<tr><td colspan=2> There are no outstanding approval requests to action! </td></tr>";
2048 };
2049 sal_tablediv.innerHTML = "<table id='sal_tablecontainer' name='sal_tablecontainer'>" +
2050 "<tr><th>Request Summary</th><th>Process Request</th></tr>" +
2051 dynHTML +
2052 "</table>";
2053 // Add this new <div> into the form in a way IE6 is happy with -- I hope!
2054 document.getElementById("sal_container").appendChild(sal_tablediv);
2055 var sal_reqListButtons = YAHOO.util.Dom.getElementsByClassName("sal_reqlistbutton", "button", "sal_tablecontainer");
2056 var sal_reqListButtonsYUI = [];
2057 // YUI-ify the View buttons:
2058 for(var i=0;i<sal_reqListButtons.length;i++) {
2059 sal_reqListButtonsYUI[i] = new YAHOO.widget.Button(sal_reqListButtons[i]);
2060 sal_reqListButtonsYUI[i].addListener("click", function() {
2061 var sal_buttId = this.getAttributeConfig("id").value;
2062 var sal_re_regex = new RegExp("^sal_req_\(.*\)$");
2063 var sal_re_match = sal_re_regex.exec(sal_buttId);
2064 if (sal_re_match == null) {
2065 fc_dialog_msg("There was an internal error. Technical details: The button couldn't be matched to the 'requestid', due to the regular expressing failing. Please contact support.", "alarm");
2066 return;
2067 } else {
2068 // sal_re_match[0] == whole string matched
2069 // sal_re_match[1] == first group matched (bits between () in regex)
2070 var sal_requestId = sal_re_match[1];
2071 reqShowRequest(sal_requestId);
2072 };
2073 });
2074 };
2075 };
2076 var sal_reqListUrl = YAHOO.util.Dom.getElementsByClassName("yuimenuitemlabel", "a", "reqID1")[0];
2077 sal_reqListUrl = sal_reqListUrl.toString();
2078 var sal_reqApprovalListConnect = YAHOO.util.Connect.asyncRequest('GET', sal_reqListUrl, {success:reqApprovalListCB, argument: { "fromWhere": "List Approval Requests", "fromFunc": "sal", "xhrDesc": sal_reqListUrl }} );
2079};
2080
2081function reqRaiseNewRequest(req_url) {
2082 function rnr_showReqFormCB(res) {
2083 try {
2084 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
2085 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
2086 if( typeof(responseJSON["data"]) != "string" ) throw "Missing/non-string 'data' field in JSON response";
2087 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
2088 } catch(err) {
2089 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
2090 return;
2091 };
2092 unhide_me("raisenewrequest");
2093 var rnr_tablediv = document.createElement("div");
2094 rnr_tablediv.innerHTML = "<table id='rnr_tablecontainer' name='rnr_tablecontainer'><tbody>" +
2095 "<tr><th colspan=2><div id='rnr_header'></div></th></tr>" +
2096 responseJSON["data"] +
2097 "<tr><td class='alignright'>(optional) Request Justification</td>" +
2098 "<td><textarea class='select1px40em' rows='4' cols='80' id='rnr_comments' name='rnr_comments'></textarea></td></tr>" +
2099 "<tr><td colspan=2 class='aligncenter'>" +
2100 "<input type=button id='rnr_raiseReqBut' name='rnr_raiseReqBut' value='Send Auth Request' />" +
2101 "</td></tr>" +
2102 "</tbody></table>";
2103 document.getElementById("rnr_formcontainer").appendChild(rnr_tablediv);
2104 document.getElementById('rnr_header').innerHTML = getElemVal('rnr_headertext');
2105 // Now test for, and set up any autocomplete(s)
2106 var rnr_ac_queryurl, rnr_ac_queryinputbox, rnr_ac_query_ac_box;
2107 var rnr_ac_array = [];
2108 var rnr_ac_divs = YAHOO.util.Dom.getElementsByClassName("autocompletediv", "", "rnr_tablecontainer");
2109 for(var i=0;i<rnr_ac_divs.length;i++) {
2110 rnr_ac_queryurl = YAHOO.util.Dom.getElementsByClassName( "rnr_ac_queryurl", "input", rnr_ac_divs[i]);
2111 rnr_ac_queryinputbox = YAHOO.util.Dom.getElementsByClassName("rnr_ac_queryinputbox", "input", rnr_ac_divs[i]);
2112 rnr_ac_query_ac_box = YAHOO.util.Dom.getElementsByClassName( "rnr_ac_query_ac_box", "input", rnr_ac_divs[i]);
2113 try {
2114 if(rnr_ac_queryurl.length != 1) throw "Missing (or more than one) 'rnr_ac_queryurl' hidden field in report";
2115 if(rnr_ac_queryinputbox.length != 1) throw "Missing (or more than one) 'rnr_ac_queryinputbox' hidden field in report";
2116 if(rnr_ac_query_ac_box.length != 1) throw "Missing (or more than one) 'rnr_ac_query_ac_box' hidden field in report";
2117 if(rnr_ac_queryurl[0].value == "") throw "Missing value for 'rnr_ac_queryurl' hidden field in report";
2118 if(rnr_ac_queryinputbox[0].value == "") throw "Missing value for 'rnr_ac_queryinputbox' hidden field in report";
2119 if(rnr_ac_query_ac_box[0].value == "") throw "Missing value for 'rnr_ac_query_ac_box' hidden field in report";
2120 rnr_ac_queryurl = rnr_ac_queryurl[0].value;
2121 rnr_ac_queryinputbox = rnr_ac_queryinputbox[0].value;
2122 rnr_ac_query_ac_box = rnr_ac_query_ac_box[0].value;
2123 // OK, set up the autocomplete, baby!!
2124 rnr_ac_array[i] = createAutoComplete(rnr_ac_queryurl, rnr_ac_queryinputbox, rnr_ac_query_ac_box);
2125 } catch(err) {
2126 fc_dialog_msg(err, "alarm");
2127 return;
2128 };
2129 }; // finished building any autocomplete YUI objects
2130 var rnr_raiseReqBut = new YAHOO.widget.Button('rnr_raiseReqBut');
2131 rnr_raiseReqBut.addListener("click", function() {
2132 function rnr_raiseReqButCB(res) {
2133 try {
2134 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
2135 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
2136 if( typeof(responseJSON["data"]) != "string" ) throw "Missing/non-string 'data' field in JSON response";
2137 if( !responseJSON["result"] ) throw responseJSON["data"];
2138 } catch(err) {
2139 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
2140 return;
2141 };
2142 fc_dialog_msg("The request was successfully raised.", "info");
2143 unhide_me("");
2144 };
2145 YAHOO.util.Connect.setForm(document.getElementById("rnr_formcontainer"));
2146 var rnr_raiseReqButConnect = YAHOO.util.Connect.asyncRequest('POST', req_url, {success:rnr_raiseReqButCB, argument: { "fromWhere": "Raise New Request", "fromFunc": "rnr", "xhrDesc": req_url }});
2147 });
2148 };
2149 var rnr_showReqFormConnect = YAHOO.util.Connect.asyncRequest('GET', req_url, { success:rnr_showReqFormCB, argument: { "fromWhere": "Show Raise Request Form", "fromFunc": "rnr", "xhrDesc": req_url } } );
2150};
2151
2152function requests_menu_click(p_sType, p_aArgs) {
2153 var e = p_aArgs[0]; // DOM Event
2154 YAHOO.util.Event.preventDefault(e); // Prevent default behaviour of item that was clicked on
2155
2156 // Figure out what the url was that was associated with the menu item clicked
2157 // Differs between IE6 and other browsers. /me swears & waves fist at IE6
2158 if (e.srcElement) {
2159 var req_url = e.srcElement; // IE6 (7/8?)
2160 } else if (e.target) {
2161 var req_url = e.target; // FF & Chrome
2162 } else {
2163 fc_dialog_msg("The browser you're using doesn't seem to pass the link clicked through. Please contact support.", "alarm");
2164 return false;
2165 }
2166 // this.id seems to be the menu item's ID that was clicked.
2167 var menu_item_id = this.id;
2168 // Chrome breaks if I don't do this:
2169 req_url = req_url.toString();
2170
2171 if(menu_item_id == "reqID1") {
2172 // Special case for the "Action my approval requests"
2173 reqApprovals();
2174 return;
2175 } else {
2176 // Any of the other Requests Menu items (i.e. raise new request options)
2177 reqRaiseNewRequest(req_url);
2178 };
2179}
2180
2181function handleMenuClick(p_sType, p_aArgs) {
2182 var oEvent = p_aArgs[0]; // DOM Event
2183 YAHOO.util.Event.preventDefault(oEvent); // Prevent default behaviour of item that was clicked on
2184
2185 // Set up dict of functions:
2186 var menuHandleFuncs = new Array();
2187 menuHandleFuncs["topmenu11"] = load_listCheckedOutProfs;
2188 menuHandleFuncs["topmenu12"] = load_CheckOutProf;
2189 menuHandleFuncs["topmenu13"] = load_manageManualProfPassword;
2190 menuHandleFuncs["topmenu14"] = load_getCheckedOutProf;
2191 menuHandleFuncs["topmenu15"] = load_createNewProf;
2192 menuHandleFuncs["topmenu16"] = load_modifydeleteProf;
2193 menuHandleFuncs["topmenu17"] = load_addtargettoProf;
2194 menuHandleFuncs["topmenu18"] = load_deltargetfromProf;
2195 menuHandleFuncs["topmenu19"] = load_addGroupToProf;
2196 menuHandleFuncs["topmenu20"] = load_remGroupFromProf;
2197 menuHandleFuncs["topmenu31"] = load_createGroup;
2198 menuHandleFuncs["topmenu32"] = load_modifyDeleteGroup;
2199 menuHandleFuncs["topmenu33"] = load_addGroupMembers;
2200 menuHandleFuncs["topmenu34"] = load_remGroupMembers;
2201 menuHandleFuncs["topmenu51"] = load_showProfile;
2202 menuHandleFuncs["topmenu52"] = load_showGroup;
2203 menuHandleFuncs["topmenu53"] = load_showUser;
2204 menuHandleFuncs["topmenu54"] = load_listAllGroups;
2205 menuHandleFuncs["topmenu55"] = load_listAllProfiles;
2206 menuHandleFuncs["topmenu57"] = load_listAllUsers;
2207 menuHandleFuncs["topmenu56"] = load_searchProfiles;
2208
2209 // Now call the relevant function based on the menu item clicked:
2210 if (menuHandleFuncs[this.id]) {
2211 menuHandleFuncs[this.id]();
2212 } else {
2213 fc_dialog_msg("Oops! There doesn't seem to be a handler for this menu item!", "alarm")
2214 };
2215}
2216
2217function testRole(role) {
2218//The consts are defined at the top of this file
2219//const rolePBLC = 0; // Public : generic, lowest rights role
2220//const roleADMN = 1; // Admin : super unlimited administrator, i.e. IDM team
2221//const rolePADM = 2; // Profile Admin : e.g TPM, can create profiles, add targets to them, but not check them out
2222//const roleGADM = 4; // Group Admin : Can auth new people into group
2223//const roleGMEM = 8; // Group Member : Can create/checkout/delete profiles
2224//const roleTMEM = 16; // Type Member : can create profiles (still restricted to certain types, though)
2225
2226 // always return true for an admin, because they can do anything in the system
2227 if ( (YAHOO.firecall.userRole | roleADMN) == YAHOO.firecall.userRole ) return true;
2228
2229 if(typeof(role) === "object") {
2230 var myrole = role;
2231 } else {
2232 var myrole = [role];
2233 }
2234
2235 for(var i in myrole) {
2236 if ( (YAHOO.firecall.userRole | myrole[i]) == YAHOO.firecall.userRole ) return true;
2237 }
2238 return false;
2239}
2240
2241// ==================================== ONLOAD STUFF ====================================
2242
2243function main_buildMenuBar() {
2244
2245 var oTopMenuBar = new YAHOO.widget.MenuBar("fctopnavmenu", {
2246 autosubmenudisplay: true,
2247 hidedelay: 750,
2248 lazyload: true });
2249
2250
2251 // BUILD the menus
2252 var aSubmenuData = [
2253 {
2254 id: "topmenu10-submenu",
2255 itemdata: [
2256 { text:"Display a Profile", id:"topmenu51", onclick: { fn: handleMenuClick }, disabled:!testRole(rolePBLC) },
2257 { text:"List All Profiles", id:"topmenu55", onclick: { fn: handleMenuClick }, disabled:!testRole(rolePBLC) },
2258 { text:"Search Profiles", id:"topmenu56", onclick: { fn: handleMenuClick }, disabled:!testRole(rolePBLC) },
2259 { text:"-----------------------------------------------------------", id:"divider11", onclick: { fn: handleMenuClick }, disabled:true },
2260 { text:"Manage my checked-out profiles", id:"topmenu11", onclick: { fn: handleMenuClick }, disabled:!testRole(roleGMEM) },
2261 { text:"Check out one or more profiles", id:"topmenu12", onclick: { fn: handleMenuClick }, disabled:!testRole(roleGMEM) },
2262 { text:"-----------------------------------------------------------", id:"divider12", onclick: { fn: handleMenuClick }, disabled:true },
2263 { text:"Change manually managed profile password", id:"topmenu13", onclick: { fn: handleMenuClick }, disabled:!testRole(roleADMN) },
2264 { text:"View currently checked-out profile details", id:"topmenu14", onclick: { fn: handleMenuClick }, disabled:!testRole(roleADMN) },
2265 { text:"-----------------------------------------------------------", id:"divider13", onclick: { fn: handleMenuClick }, disabled:true },
2266 { text:"Create a new profile", id:"topmenu15", onclick: { fn: handleMenuClick }, disabled:!testRole(roleTMEM) },
2267 { text:"Manage an existing profile", id:"topmenu16", onclick: { fn: handleMenuClick }, disabled:!testRole([roleTMEM, rolePADM]) },
2268 { text:"-----------------------------------------------------------", id:"divider14", onclick: { fn: handleMenuClick }, disabled:true },
2269 { text:"Add target(s) to a profile", id:"topmenu17", onclick: { fn: handleMenuClick }, disabled:!testRole(roleTMEM) },
2270 { text:"Delete target(s) from a profile", id:"topmenu18", onclick: { fn: handleMenuClick }, disabled:!testRole([roleTMEM, rolePADM]) },
2271 { text:"-----------------------------------------------------------", id:"divider16", onclick: { fn: handleMenuClick }, disabled:true },
2272 { text:"Add a group to a profile", id:"topmenu19", onclick: { fn: handleMenuClick }, disabled:!testRole(rolePADM) },
2273 { text:"Remove group(s) from a profile", id:"topmenu20", onclick: { fn: handleMenuClick }, disabled:!testRole(rolePADM) }
2274 ]
2275 },
2276 {
2277 id: "topmenu30-submenu",
2278 itemdata: [
2279 { text:"Display a Group", id:"topmenu52", onclick: { fn: handleMenuClick }, disabled:!testRole(rolePBLC) },
2280 { text:"Display a User", id:"topmenu53", onclick: { fn: handleMenuClick }, disabled:!testRole(rolePBLC) },
2281 { text:"---------------------------------------------", id:"divider31", onclick: { fn: handleMenuClick }, disabled:true },
2282 { text:"List All Groups", id:"topmenu54", onclick: { fn: handleMenuClick }, disabled:!testRole(rolePBLC) },
2283 { text:"List All Users", id:"topmenu57", onclick: { fn: handleMenuClick }, disabled:!testRole(rolePBLC) },
2284 { text:"---------------------------------------------", id:"divider32", onclick: { fn: handleMenuClick }, disabled:true },
2285 { text:"Create a new group", id:"topmenu31", onclick: { fn: handleMenuClick }, disabled:!testRole(roleADMN) },
2286 { text:"Modify/Delete an existing group", id:"topmenu32", onclick: { fn: handleMenuClick }, disabled:!testRole(roleADMN) },
2287 { text:"---------------------------------------------", id:"divider33", onclick: { fn: handleMenuClick }, disabled:true },
2288 { text:"Add group member(s)", id:"topmenu33", onclick: { fn: handleMenuClick }, disabled:!testRole(roleGADM) },
2289 { text:"Remove group member(s)", id:"topmenu34", onclick: { fn: handleMenuClick }, disabled:!testRole(roleGADM) }
2290 ]
2291 }
2292 ];
2293
2294 oTopMenuBar.getItem(0).cfg.setProperty("submenu", aSubmenuData[0]);
2295 oTopMenuBar.getItem(1).cfg.setProperty("submenu", aSubmenuData[1]);
2296
2297 // Add Reports menu to top level menu bar
2298 oTopMenuBar.addItems([ { text: "Reports", url: "", id: "topmenuREP" } ]);
2299 oTopMenuBar.addItems([ { text: "Requests", url: "", id: "topmenuREQ" } ]);
2300 oTopMenuBar.addItems([ { text: "Help", url: "", id: "topmenuHLP" } ]);
2301
2302 // Stop the top menu items' hrefs doing anything:
2303 YAHOO.util.Event.addListener("topmenu10", "click", preventClick);
2304 YAHOO.util.Event.addListener("topmenu30", "click", preventClick);
2305 YAHOO.util.Event.addListener("topmenuREP", "click", preventClick);
2306 YAHOO.util.Event.addListener("topmenuREQ", "click", preventClick);
2307 YAHOO.util.Event.addListener("topmenuHLP", "click", preventClick);
2308
2309
2310 // Calculate the index of the reports menu
2311 var repMenuIndex = -1;
2312 for (var i=0;i<oTopMenuBar.getItems().length;i++) {
2313 if (oTopMenuBar.getItems()[i].id === "topmenuREP") {
2314 repMenuIndex = i;
2315 }
2316 }
2317 var reqMenuIndex = -1;
2318 for (var i=0;i<oTopMenuBar.getItems().length;i++) {
2319 if (oTopMenuBar.getItems()[i].id === "topmenuREQ") {
2320 reqMenuIndex = i;
2321 }
2322 }
2323 var hlpMenuIndex = -1;
2324 for (var i=0;i<oTopMenuBar.getItems().length;i++) {
2325 if (oTopMenuBar.getItems()[i].id === "topmenuHLP") {
2326 hlpMenuIndex = i;
2327 }
2328 }
2329
2330 // ############################################################################################################
2331 // ################################### BEGIN Dynamically Build Reports Menu ###################################
2332 // Callback func to insert returned JSON object into the Reports menu
2333 //function callback_listReports(oRequest,oParsedResponse,oPayload) {
2334 function callback_listReports(res) {
2335 try {
2336 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
2337 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
2338 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
2339 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-list 'data' field in JSON response";
2340 if( typeof(responseJSON["data"].length) != "number" ) throw "Missing/non-list 'data' field in JSON response";
2341 } catch(err) {
2342 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
2343 return;
2344 };
2345
2346 // First add an onclick handler into each of the returned menu options
2347 for(var i=0; i<responseJSON["data"].length; i++) {
2348 responseJSON["data"][i]["onclick"] = { fn: reports_menu_click };
2349 }
2350 // Add the submenu menuitems into the Reports menu
2351 oTopMenuBar.getItem(repMenuIndex).cfg.setProperty("submenu", { id: "Reports", itemdata: responseJSON["data"] } );
2352 // Re-render top nav menu with Reports menu subitems included
2353 oTopMenuBar.render();
2354 }
2355 var main_getRepListConnect = YAHOO.util.Connect.asyncRequest('GET', "/reports", { success:callback_listReports, argument: { "fromWhere": "Get Reports Menu Items", "fromFunc": "menu", "xhrDesc": "/reports" } });
2356 // ################################### END Dynamically Build Reports Menu ###################################
2357 // ############################################################################################################
2358
2359
2360 // ############################################################################################################
2361 // ################################### BEGIN Dynamically Build Requests Menu ###################################
2362 // Callback func to insert returned JSON object into the Requests menu
2363 //function callback_listRequests(oRequest,oParsedResponse,oPayload) {
2364 function callback_listRequests(res) {
2365 try {
2366 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
2367 if( typeof(responseJSON["result"]) != "boolean" ) throw "Missing/non-boolean 'result' field in JSON response";
2368 if( !responseJSON["result"] ) throw "Internal error in the webserver (JSON 'result' was 'false')";
2369 if( typeof(responseJSON["data"]) != "object" ) throw "Missing/non-list 'data' field in JSON response";
2370 if( typeof(responseJSON["data"].length) != "number" ) throw "Missing/non-list 'data' field in JSON response";
2371 } catch(err) {
2372 fc_dialog_msg("There was an internal error. Technical details: " + err + ". Please contact support.", "alarm");
2373 return;
2374 };
2375 var RequestsMenuItems = [];
2376 var j;
2377 RequestsMenuItems[0] = { "id":"reqID1", "text":"Action my approval requests", "url":"/request/requestlist.rpy", "onclick":{fn:requests_menu_click} };
2378 RequestsMenuItems[1] = { "id":"reqID1div", "text":"----------------------------------------------", "url":"", disabled:true };
2379 // Now add the returned menu options in RequestsMenuItems
2380 for(var i=0;i<responseJSON["data"].length;i++) {
2381 j = RequestsMenuItems.length;
2382 RequestsMenuItems[j] = {};
2383 RequestsMenuItems[j]["text"] = responseJSON["data"][i]["name"];
2384 RequestsMenuItems[j]["id"] = responseJSON["data"][i]["action"];
2385 RequestsMenuItems[j]["url"] = "/request/requestcreate.rpy?requestaction=" + responseJSON["data"][i]["action"];
2386 RequestsMenuItems[j]["onclick"] = { fn: requests_menu_click };
2387 }
2388 // Add the submenu menuitems into the Requests menu
2389 oTopMenuBar.getItem(reqMenuIndex).cfg.setProperty("submenu", { id: "Requests", itemdata: RequestsMenuItems } );
2390 // Re-render top nav menu with Requests menu subitems included
2391 oTopMenuBar.render();
2392 }
2393 var main_getListOfRequestTypes = YAHOO.util.Connect.asyncRequest('GET', "/request/requesttypes.rpy", { success:callback_listRequests, argument: { "fromWhere": "Get Requests Menu Items", "fromFunc": "menu", "xhrDesc": "/request/requesttypes.rpy" } });
2394
2395 // ################################### END Dynamically Build Requests Menu ###################################
2396 // ############################################################################################################
2397
2398 function hlpMenuClick(p_sType, p_aArgs) {
2399 var e = p_aArgs[0]; // DOM Event
2400 YAHOO.util.Event.preventDefault(e); // Prevent default behaviour of item that was clicked on
2401
2402 // Figure out what the url was that was associated with the menu item clicked
2403 // Differs between IE6 and other browsers. /me swears & waves fist at IE6
2404 if (e.srcElement) {
2405 var rep_url = e.srcElement; // IE6 (7/8?)
2406 } else if (e.target) {
2407 var rep_url = e.target; // FF & Chrome
2408 } else {
2409 fc_dialog_msg("The browser you're using doesn't seem to pass the link clicked through. Please contact support.", "alarm");
2410 return false;
2411 }
2412
2413 // this.id seems to be the menu item's ID that was clicked.
2414 var menu_item_id = this.id;
2415 // Chrome breaks if I don't do this:
2416 rep_url = rep_url.toString();
2417 if ( rep_url.match("about$") == "about" ) {
2418 // Ok, reach here for "About" Help Menu Option
2419 fc_dialog_msg("<u><center>Commerzbank Firecall</center></u><br>Version: 1.0.0<br>Support Team: CoBa Engineering (Unix & Tools teams)<br>Primary Contacts:<br> Server: Peter Saunders<br> Website Support: Richard Bayer<br> CLI/Unittests: Alex Dost<br> Initial Website Design: Leon Cowle<br>Status: Production", "info");
2420 return;
2421 } else if ( rep_url.match("ajaxlogtoggle$") == "ajaxlogtoggle" ) {
2422 if ( YAHOO.util.Dom.hasClass("log", "invisiblestart")) {
2423 YAHOO.util.Dom.removeClass("log", "invisiblestart");
2424 document.getElementById("spacer").style.height = "83%";
2425 } else {
2426 YAHOO.util.Dom.addClass("log", "invisiblestart");
2427 document.getElementById("spacer").style.height = "94%";
2428 };
2429 return;
2430 };
2431 window.location = rep_url;
2432 };
2433 var hlpMenuEmailAddresses = "mailto:peter.saunders@commerzbank.com;alexander.dost@commerzbank.com;richard.bayer@commerzbank.com?Subject=";
2434 var hlpMenuFeatureRequest = escape("Please provide as much detail as possible. Thanks.");
2435 var hlpMenuSubmitBugReport = escape("Is it reproducible?\n\nMain menu under which it occurred:\n\nSubmenu under which it occurred:\n\nShort description of bug:\n\nAny other detail you feel will be useful to Support Team to reproduce this error:\n\n(FOR SUPPORT USE ONLY - DO NOT EDIT!) XHRLOG:\n");
2436 var hlpMenuItems = [];
2437 hlpMenuItems[0] = { "id": "hlpID0", "text": "Firecall Documentation", "url":"/pub/docs", onclick:{fn:hlpMenuClick} };
2438 hlpMenuItems[1] = { "id": "hlpID1", "text": "--------------------------------------", disabled:true };
2439 hlpMenuItems[2] = { "id": "hlpID2", "text": "Raise a Feature Request", "url":hlpMenuEmailAddresses + "Firecall Feature Request&Body=" + hlpMenuFeatureRequest, onclick:{fn:hlpMenuClick} };
2440 hlpMenuItems[3] = { "id": "hlpID3", "text": "Submit a Bug Report", "url":hlpMenuEmailAddresses + "Firecall Bug Report&Body=" + hlpMenuSubmitBugReport, onclick:{fn:hlpMenuClick} };
2441 hlpMenuItems[4] = { "id": "hlpID4", "text": "--------------------------------------", disabled:true };
2442 hlpMenuItems[5] = { "id": "hlpID5", "text": "Toggle debuging log window", "url": "ajaxlogtoggle", onclick:{fn:hlpMenuClick} };
2443 hlpMenuItems[6] = { "id": "hlpID6", "text": "About", "url":"about", onclick:{fn:hlpMenuClick} };
2444 oTopMenuBar.getItem(hlpMenuIndex).cfg.setProperty("submenu", { id: "Help", itemdata: hlpMenuItems } );
2445 oTopMenuBar.render();
2446
2447}
2448
2449YAHOO.util.Event.onDOMReady(function () {
2450 // create a namespace for me to store global objects in
2451 YAHOO.namespace("firecall");
2452
2453 // save the original HTML state of all the divs that get hidden/unhidden
2454 // so we can restore them each time before they get unhidden
2455 YAHOO.firecall.originalHTML = new Array();
2456 var hideme_elements = YAHOO.util.Dom.getElementsByClassName('hideme','div');
2457 for(var i=0; i<hideme_elements.length;i++) {
2458 YAHOO.firecall.originalHTML[hideme_elements[i].id] = document.getElementById(hideme_elements[i].id).innerHTML;
2459 }
2460
2461 YAHOO.firecall.xhrLog = {};
2462 YAHOO.firecall.xhr_ac = {};
2463 YAHOO.firecall.xhr_ac["fromWhere"] = "";
2464 YAHOO.firecall.xhr_ac["fromFunc"] = "";
2465 YAHOO.firecall.xhr_ac["xhrDesc"] = "";
2466
2467
2468 //###################################################################### START GLOBAL CALLBACKS
2469 // VERY important step
2470 // Bind callback handlers (start, success & failure) to the global AJAX (YAHOO.util.Connect) object.
2471 // i.e. these callbacks will be called for EVERY ajax call (in conjunction with their own respective callbacks)
2472 // We do 4 things in these global handlers:
2473 // 1. Update YAHOO.firecall.xhrLog global dictionary with details of every AJAX (XHR) call
2474 // 2. Redraw the "log" div (whether it's visible or not) with the last 5 AJAX calls' details
2475 // 3. Test whether we were given the login page back (by testing for a HTTP header that only the login page sends)
2476 // (if yes, then inform user and redirect the entire site back to the login screen)
2477 // 4. Show an error message for any failure callbacks (i.e. http errors)
2478 YAHOO.firecall.YUC = YAHOO.util.Connect;
2479 YAHOO.firecall.relogin = 0;
2480 var handleEvents = {
2481
2482 drawLogTable: function() {
2483 // OK, draw log table
2484 var main_logTable = "<p>Status of Network Requests to the Firecall Server</p><table id='logTable' name='logTable'><tbody>";
2485 main_logTable += "<tr><th>Transaction ID</td><th>Called from where</th><th>Function Descriptor</th><th>XHR Url Called</th><th>Status</th></tr>";
2486 var keys = [];
2487 for(var i in YAHOO.firecall.xhrLog) {
2488 keys.push(parseInt(i));
2489 }
2490 keys = keys.sort(function(a,b){return a - b}); // quick hack to sort numerically
2491 if(keys.length < 5) {
2492 var fromShow = 0;
2493 } else {
2494 var fromShow = keys.length-5;
2495 };
2496 for(var i=fromShow;i<keys.length;i++) {
2497 main_logTable += "<tr>";
2498 main_logTable += "<td>" + keys[i].toString() + "</td>";
2499 main_logTable += "<td>" + YAHOO.firecall.xhrLog[keys[i]]["fromWhere"] + "</td>";
2500 main_logTable += "<td>" + YAHOO.firecall.xhrLog[keys[i]]["fromFunc"] + "</td>";
2501 main_logTable += "<td>" + YAHOO.firecall.xhrLog[keys[i]]["xhrDesc"] + "</td>";
2502 main_logTable += "<td>" + YAHOO.firecall.xhrLog[keys[i]]["Result"] + "</td>";
2503 main_logTable += "</tr>";
2504 };
2505 main_logTable += "</tbody></table>";
2506 document.getElementById("log").innerHTML = main_logTable;
2507 // end, draw log table
2508 },
2509
2510 start: function(eventType, args) {
2511 // do something when startEvent fires.
2512 // Argument eventType will have a string value of: startEvent
2513 // Argument args is an array, and the response object will be the
2514 // first element in the array. The response object will have one
2515 // property: tId (the transaction ID).
2516 var arg_fromWhere = args[1]["fromWhere"];
2517 var arg_fromFunc = args[1]["fromFunc"];
2518 var arg_xhrDesc = args[1]["xhrDesc"].replace(/http:\/\/[^/]*/, "").replace(/\?.*/, ""); // sanitise (remove) FQDN URLs
2519 YAHOO.firecall.xhrLog[args[0].tId] = { "fromWhere": arg_fromWhere, "fromFunc": arg_fromFunc, "xhrDesc": arg_xhrDesc, "Result": "In Progress" };
2520 handleEvents.drawLogTable();
2521 },
2522
2523 success: function(eventType, args) {
2524 // do something when successEvent fires.
2525 // OK, now look at my arguments
2526 if(typeof(YAHOO.firecall.xhrLog[args[0].tId]) == "undefined") {
2527 // CRAP workaround, because can't get XHRDataSource to call the "start" handler or to pass arguments to these handlers.
2528 if( YAHOO.firecall.xhr_ac["fromWhere"] != "" ) {
2529 YAHOO.firecall.xhrLog[args[0].tId] = {};
2530 YAHOO.firecall.xhrLog[args[0].tId]["fromWhere"] = YAHOO.firecall.xhr_ac["fromWhere"];
2531 YAHOO.firecall.xhrLog[args[0].tId]["fromFunc"] = YAHOO.firecall.xhr_ac["fromFunc"];
2532 YAHOO.firecall.xhrLog[args[0].tId]["xhrDesc"] = YAHOO.firecall.xhr_ac["xhrDesc"];
2533 YAHOO.firecall.xhr_ac["fromWhere"] = "";
2534 YAHOO.firecall.xhr_ac["fromFunc"] = "";
2535 YAHOO.firecall.xhr_ac["xhrDesc"] = "";
2536 } else {
2537 YAHOO.firecall.xhrLog[args[0].tId] = { "fromWhere": "unknown XHR/AJAX call", "fromFunc": "unknown", "xhrDesc": "unknown" };
2538 };
2539 };
2540 YAHOO.firecall.xhrLog[args[0].tId]["Result"] = "Successful";
2541 handleEvents.drawLogTable();
2542
2543 // check for result:false header
2544 // which only exists when there has been a serious, unknown error.
2545 if(typeof(args[0].getResponseHeader["X-Firecall-Unexpected-Error"]) == "string") {
2546 fc_dialog_msg("A serious, unknown error has occurred. <br><br>Technical details: the server created the 'X-Firecall-Unexpected-Error' http header. Header contained this message: '" + args[0].getResponseHeader["X-Firecall-Unexpected-Error"] + "'<br><br>Please try again, or contact Support.", "alarm");
2547 return false;
2548 };
2549
2550 // Now check for login page!
2551 if(YAHOO.firecall.relogin == 1) return; // Elementary locking, so only 1 ajax call can trigger this code.
2552 var loginPage = args[0].getResponseHeader["X-Firecall-Login-Page"];
2553 if(typeof(loginPage) == "undefined") return;
2554 if(loginPage != "1") return;
2555 YAHOO.firecall.relogin = 1;
2556 // If we reach here, then the AJAX response was the login page. So inform the user, and redirect to the login page.
2557 reloginDiag = new YAHOO.widget.SimpleDialog("reloginDiag", {
2558 width: "400px",
2559 fixedcenter: true,
2560 visible: true,
2561 draggable: true,
2562 close: true,
2563 text: "Your current session has timed out and/or the server has been restarted. Hit OK to login again.",
2564 icon: YAHOO.widget.SimpleDialog.ICON_INFO,
2565 constraintoviewport: true,
2566 buttons: [ { text: "OK", handler: function() { window.location = "/"; } } ]
2567 });
2568 reloginDiag.setHeader("Information");
2569 reloginDiag.render("bd"); // render it onto/into the div "bd"
2570 },
2571
2572 failure: function(eventType, args) {
2573 // do something when failureEvent fires.
2574 // OK, now look at my arguments
2575 if(typeof(YAHOO.firecall.xhrLog[args[0].tId]) == "undefined") {
2576 // CRAP workaround, because can't get XHRDataSource to pass arguments to these handlers.
2577 if( YAHOO.firecall.xhr_ac["fromWhere"] != "" ) {
2578 YAHOO.firecall.xhrLog[args[0].tId] = {};
2579 YAHOO.firecall.xhrLog[args[0].tId]["fromWhere"] = YAHOO.firecall.xhr_ac["fromWhere"];
2580 YAHOO.firecall.xhrLog[args[0].tId]["fromFunc"] = YAHOO.firecall.xhr_ac["fromFunc"];
2581 YAHOO.firecall.xhrLog[args[0].tId]["xhrDesc"] = YAHOO.firecall.xhr_ac["xhrDesc"];
2582 YAHOO.firecall.xhr_ac["fromWhere"] = "";
2583 YAHOO.firecall.xhr_ac["fromFunc"] = "";
2584 YAHOO.firecall.xhr_ac["xhrDesc"] = "";
2585 } else {
2586 YAHOO.firecall.xhrLog[args[0].tId] = { "fromWhere": "unknown XHR/AJAX call", "fromFunc": "unknown", "xhrDesc": "unknown" };
2587 };
2588 };
2589 YAHOO.firecall.xhrLog[args[0].tId]["Result"] = "Failure";
2590 handleEvents.drawLogTable();
2591
2592 // Display error message for this failed AJAX call
2593 fc_dialog_msg("There was a technical (e.g. http/network) error when attempting to do the '" + YAHOO.firecall.xhrLog[args[0].tId]["fromWhere"] + "' request. The following error string was generated: " + args[0].statusText + "<br><br>Please try again, or contact Support.", "alarm");
2594 }
2595 };
2596 YAHOO.firecall.YUC.startEvent.subscribe(handleEvents.start, handleEvents);
2597 YAHOO.firecall.YUC.successEvent.subscribe(handleEvents.success, handleEvents);
2598 YAHOO.firecall.YUC.failureEvent.subscribe(handleEvents.failure, handleEvents);
2599 //###################################################################### END GLOBAL CALLBACKS
2600
2601 YAHOO.firecall.targetTypes = new Array();
2602 // Make a call to get target types list (to populate select boxes with)
2603 function main_getTargetTypesSuccessCB(res) {
2604 try {
2605 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
2606 } catch(err) {
2607 fc_dialog_msg("Oops. Technical error parsing JSON results from listtypes.rpy. Please contact support.", "alarm");
2608 return;
2609 };
2610 if(responseJSON["result"] == true) {
2611 // Successfully got a list of target types
2612 for(var i in responseJSON["data"]) {
2613 // responseJSON["data"][i] is an object like this: { "optValue": "xxxxxx", "optText": "yyyy", "optIdentifier": "zzzzzz" }
2614 YAHOO.firecall.targetTypes[responseJSON["data"][i]["optValue"]] = responseJSON["data"][i];
2615 };
2616 } else if (responseJSON["result"] == false) {
2617 fc_dialog_msg(responseJSON["data"], "alarm");
2618 } else {
2619 fc_dialog_msg("There was a problem on the server. Please try again or contact support.", "alarm");
2620 };
2621 };
2622 var main_targettypesConnect = YAHOO.util.Connect.asyncRequest('GET', '/request/listtypes.rpy', { success: main_getTargetTypesSuccessCB, argument: { "fromWhere": "Get Target Types", "fromFunc": "main", "xhrDesc": "/request/listtypes.rpy" } });
2623
2624 // ############################################################################ BEGIN GET ROLE PERMISSIONS
2625 YAHOO.firecall.userRole = -1;
2626 function main_getUserRoleSuccessCB(res) {
2627 try {
2628 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
2629 if ( typeof(responseJSON["result"]) != "boolean" ) throw "JSON parsing error.";
2630 } catch(err) {
2631 main_getUserRoleFailureCB();
2632 return;
2633 };
2634 if(responseJSON["result"] == true) {
2635 YAHOO.firecall.userRole = parseInt(responseJSON["data"]);
2636 if ( typeof(YAHOO.firecall.userRole) != "number" ) {
2637 main_getUserRoleFailureCB();
2638 return;
2639 };
2640 } else if (responseJSON["result"] == false) {
2641 main_getUserRoleFailureCB();
2642 return;
2643 } else {
2644 main_getUserRoleFailureCB();
2645 return;
2646 };
2647 // Now kick off the menu building code
2648 YAHOO.util.Event.onContentReady("fctopnavmenu", main_buildMenuBar);
2649 };
2650 var main_getRoleConnect = YAHOO.util.Connect.asyncRequest('GET', "/request/permissions.rpy", { success:main_getUserRoleSuccessCB, argument: { "fromWhere": "Get User Permissions", "fromFunc": "main", "xhrDesc": "/request/permissions.rpy" } });
2651 // ############################################################################ END GET ROLE PERMISSIONS
2652
2653 // ############################################################################ BEGIN CHECK FOR REQUEST URL HEADER
2654 function main_getRequestURLCB(res) {
2655 try {
2656 var responseJSON = YAHOO.lang.JSON.parse(res.responseText);
2657 if ( typeof(responseJSON["result"]) != "boolean" ) throw "";
2658 if ( !responseJSON["result"] ) return; // "result" was false, so user didn't redirect here
2659 if ( typeof(responseJSON["data"]) != "object" ) throw "";
2660 if ( typeof(responseJSON["data"]["form"]) != "string" ) throw "";
2661 if ( typeof(responseJSON["data"]["target"]) != "string" ) throw "";
2662 } catch(err) {
2663 main_getRequestURLFailureCB();
2664 return;
2665 };
2666 switch(responseJSON["data"]["form"]) {
2667 case "manualpassword": load_manageManualProfPassword(responseJSON["data"]["target"]);
2668 break;
2669 case "requestshow" : reqShowRequest(responseJSON["data"]["target"]);
2670 break;
2671 default: main_getRequestURLFailureCB;
2672 };
2673 };
2674 var main_getRequestURLConnect = YAHOO.util.Connect.asyncRequest('GET', "/origurl", { success:main_getRequestURLCB, argument: { "fromWhere": "Get Original URL", "fromFunc": "main", "xhrDesc": "/origurl" } } );
2675 // ############################################################################ END CHECK FOR REQUEST URL HEADER
2676});
2677
2678// ==================================== ONLOAD STUFF END ================================