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