extensions/net.sf.basedb.labenv/trunk/resources/labenv.js

Code
Comments
Other
Rev Date Author Line
3735 10 Feb 16 olle 1
3735 10 Feb 16 olle 2 var LabEnv = function()
3735 10 Feb 16 olle 3 {
3735 10 Feb 16 olle 4   var labenv = {};
3735 10 Feb 16 olle 5   var internal = {};
3735 10 Feb 16 olle 6   
5572 15 Aug 19 nicklas 7   labenv.VERSION = '1.8-dev';
3735 10 Feb 16 olle 8   
3735 10 Feb 16 olle 9   /**
3735 10 Feb 16 olle 10     Autofill a date-string.
3735 10 Feb 16 olle 11     The supplemented date-string will have the format yyyyMMdd when it's returned.
3735 10 Feb 16 olle 12     If the short-date in format MMdd is larger the current date, the year before will be used.
3735 10 Feb 16 olle 13     
3735 10 Feb 16 olle 14     @param shortDate Date in format 'MMdd' or in 'yyMMdd'
3735 10 Feb 16 olle 15     @param allowSixDigitDates Boolean Flag indicating if 6-digit dates should be auto-filled (default = false).
3735 10 Feb 16 olle 16   */
3735 10 Feb 16 olle 17   labenv.autoFillDate = function(shortDate, allowSixDigitDates)
3735 10 Feb 16 olle 18   {
3735 10 Feb 16 olle 19     shortDate = shortDate.replace("-","");
3735 10 Feb 16 olle 20     var fullDate = shortDate;
3735 10 Feb 16 olle 21   
3735 10 Feb 16 olle 22     var currentDate = new Date();
3735 10 Feb 16 olle 23     var currentYear = currentDate.getFullYear();
3735 10 Feb 16 olle 24     var currentMonth = currentDate.getMonth()+1;
3735 10 Feb 16 olle 25     
3735 10 Feb 16 olle 26     if (shortDate.length == 4 && Dates.isDate(shortDate, 'MMdd'))
3735 10 Feb 16 olle 27     {
3735 10 Feb 16 olle 28       var month = parseInt(shortDate.substring(0, 2), 10);
3735 10 Feb 16 olle 29       var day = parseInt(shortDate.substring(2), 10);
3735 10 Feb 16 olle 30       if ((month > currentMonth) || (month == currentMonth && day > currentDate.getDate())) 
3735 10 Feb 16 olle 31       {
3735 10 Feb 16 olle 32         currentYear--;
3735 10 Feb 16 olle 33       }
3735 10 Feb 16 olle 34       fullDate = currentYear+shortDate;
3735 10 Feb 16 olle 35     }
3735 10 Feb 16 olle 36     else if (allowSixDigitDates && shortDate.length == 6 && Dates.isDate(shortDate, 'yyMMdd'))
3735 10 Feb 16 olle 37     {
3735 10 Feb 16 olle 38       var year = parseInt(shortDate.substring(0,2), 10);    
3735 10 Feb 16 olle 39       fullDate = ((2000+year) > currentYear ? "19" : "20") + fullDate;
3735 10 Feb 16 olle 40     }  
3735 10 Feb 16 olle 41     return fullDate;  
3735 10 Feb 16 olle 42   }
3735 10 Feb 16 olle 43   
3735 10 Feb 16 olle 44   labenv.autoFillTime = function(shortTime)
3735 10 Feb 16 olle 45   {
3735 10 Feb 16 olle 46     var fullTimeString = shortTime;
3735 10 Feb 16 olle 47     if (shortTime.length==3)
3735 10 Feb 16 olle 48     {
3735 10 Feb 16 olle 49       fullTimeString = "0"+shortTime;
3735 10 Feb 16 olle 50     }
3735 10 Feb 16 olle 51     return fullTimeString;
3735 10 Feb 16 olle 52   }
3735 10 Feb 16 olle 53
3735 10 Feb 16 olle 54   /**
3735 10 Feb 16 olle 55     Convert a 2-digit year to a 4-digit year. Assuming
3735 10 Feb 16 olle 56     that the short year is between 1 and 100 years old. 
3735 10 Feb 16 olle 57   */
3735 10 Feb 16 olle 58   labenv.fullYear = function(shortYear)
3735 10 Feb 16 olle 59   {
3735 10 Feb 16 olle 60     var thisYear = new Date().getFullYear();
3735 10 Feb 16 olle 61     var fullYear = shortYear + 100*Math.floor((thisYear - shortYear - 1) / 100);
3735 10 Feb 16 olle 62     return fullYear;
3735 10 Feb 16 olle 63   }
3735 10 Feb 16 olle 64   
3735 10 Feb 16 olle 65   labenv.formatNumber = function(number, unit, baseDecimals)
3735 10 Feb 16 olle 66   {
3735 10 Feb 16 olle 67     if (number == null) return '';
3735 10 Feb 16 olle 68     
3735 10 Feb 16 olle 69     var numDecimals;
3735 10 Feb 16 olle 70     if (!baseDecimals) baseDecimals = 3;
3735 10 Feb 16 olle 71     if (number < 10)
3735 10 Feb 16 olle 72     {
3735 10 Feb 16 olle 73       numDecimals = baseDecimals;
3735 10 Feb 16 olle 74     }
3735 10 Feb 16 olle 75     else if (number < 100)
3735 10 Feb 16 olle 76     {
3735 10 Feb 16 olle 77       numDecimals = baseDecimals-1;
3735 10 Feb 16 olle 78     }
3735 10 Feb 16 olle 79     else
3735 10 Feb 16 olle 80     {
3735 10 Feb 16 olle 81       numDecimals = baseDecimals-2;
3735 10 Feb 16 olle 82     }
3735 10 Feb 16 olle 83
3735 10 Feb 16 olle 84     var result = number.toFixed(numDecimals);
3735 10 Feb 16 olle 85     if (unit) result += unit;
3735 10 Feb 16 olle 86     return result;
3735 10 Feb 16 olle 87   }
3735 10 Feb 16 olle 88
3735 10 Feb 16 olle 89   /**
3735 10 Feb 16 olle 90     Reformat a date string in YYYYMMDD or YYYYMMDD HHMM format
3735 10 Feb 16 olle 91     to YYYY-MM-DD HH:MM
3735 10 Feb 16 olle 92   */
3735 10 Feb 16 olle 93   labenv.reformatDate = function(value, defaultValue)
3735 10 Feb 16 olle 94   {
3735 10 Feb 16 olle 95     if (!value) return defaultValue || '';
3735 10 Feb 16 olle 96     if (value.length == 8)
3735 10 Feb 16 olle 97     {
3735 10 Feb 16 olle 98       // YYYYMMDD
3735 10 Feb 16 olle 99       value = value.substr(0, 4) + '-' + value.substr(4, 2) + '-' + value.substr(6, 2);
3735 10 Feb 16 olle 100     }
3735 10 Feb 16 olle 101     else if (value.length == 13)
3735 10 Feb 16 olle 102     {
3735 10 Feb 16 olle 103       // YYYYMMDD HHMM
3735 10 Feb 16 olle 104       value = value.substr(0, 4) + '-' + value.substr(4, 2) + '-' + value.substr(6, 2) + ' ' + value.substr(9, 2) + ':' + value.substr(11, 2);
3735 10 Feb 16 olle 105     }
3735 10 Feb 16 olle 106     return value;
3735 10 Feb 16 olle 107   }
3735 10 Feb 16 olle 108
3735 10 Feb 16 olle 109   /**
3735 10 Feb 16 olle 110     Open a popup window and copy a part of the current window to the popup
3735 10 Feb 16 olle 111     and make it suitable for printin.
3735 10 Feb 16 olle 112   
3735 10 Feb 16 olle 113     @param printElementId The id of a html tag in the current page that should
3735 10 Feb 16 olle 114       be copied to the print window
3735 10 Feb 16 olle 115     @param pageTitle The title of the print window
3735 10 Feb 16 olle 116     @param pageOrientation 'landscape' or 'portrait' (default)
3735 10 Feb 16 olle 117     @param printNote Optional note intended to include instructions how to configure
3735 10 Feb 16 olle 118       the browser for optimal printing (eg. set to landscape and scale to 75%)
3735 10 Feb 16 olle 119   */
3735 10 Feb 16 olle 120   labenv.openPrintWindow = function(printElementId, pageTitle, pageOrientation, printNote, labenvRoot, extraStyles)
3735 10 Feb 16 olle 121   {
3735 10 Feb 16 olle 122     // Default width/height is for 'portrait' orientation
3735 10 Feb 16 olle 123     var width = 900;
3735 10 Feb 16 olle 124     var height = 900;
3735 10 Feb 16 olle 125     if (pageOrientation == 'landscape')
3735 10 Feb 16 olle 126     {
3735 10 Feb 16 olle 127       width = 1300;
3735 10 Feb 16 olle 128       height = 700;
3735 10 Feb 16 olle 129     }
3735 10 Feb 16 olle 130     
3735 10 Feb 16 olle 131     var url = 'print_template.jsp?ID='+App.getSessionId();
3735 10 Feb 16 olle 132     if (extraStyles) url += '&extraStyles='+extraStyles;
3735 10 Feb 16 olle 133     if (labenvRoot) url = labenvRoot+url;
3735 10 Feb 16 olle 134     // Open the print-window 
3735 10 Feb 16 olle 135     internal.printOptions = {
3735 10 Feb 16 olle 136       'printElementId': printElementId,
3735 10 Feb 16 olle 137       'pageTitle': pageTitle, 
3735 10 Feb 16 olle 138       'pageOrientation': pageOrientation, 
3735 10 Feb 16 olle 139       'printNote': printNote
3735 10 Feb 16 olle 140     };
3735 10 Feb 16 olle 141     var printWin = window.open(url, 'PrintWindow', 'width='+width+',height='+height+',toolbar=yes,location=no,directories=no,status=no,menubar=yes,scrollbars=yes,resizable=yes');
3735 10 Feb 16 olle 142   }
3735 10 Feb 16 olle 143
3735 10 Feb 16 olle 144   labenv.finalizePrint = function(printWin)
3735 10 Feb 16 olle 145   {
3735 10 Feb 16 olle 146     // Set page title...
3735 10 Feb 16 olle 147     if (internal.printOptions.pageTitle) 
3735 10 Feb 16 olle 148     {
3735 10 Feb 16 olle 149       printWin.document.title = internal.printOptions.pageTitle;
3735 10 Feb 16 olle 150     }
3735 10 Feb 16 olle 151   
3735 10 Feb 16 olle 152     // ...orientation...
3735 10 Feb 16 olle 153     if (internal.printOptions.pageOrientation)
3735 10 Feb 16 olle 154     {
3735 10 Feb 16 olle 155       var paper = printWin.document.getElementById('paper');
3735 10 Feb 16 olle 156       paper.className += ' ' + internal.printOptions.pageOrientation;
3735 10 Feb 16 olle 157     }
3735 10 Feb 16 olle 158     
3735 10 Feb 16 olle 159     // ... and print note
3735 10 Feb 16 olle 160     if (internal.printOptions.printNote)
3735 10 Feb 16 olle 161     {
3735 10 Feb 16 olle 162       var note = printWin.document.getElementById('printNote');
3735 10 Feb 16 olle 163       note.innerHTML = internal.printOptions.printNote;
3735 10 Feb 16 olle 164     }
3735 10 Feb 16 olle 165     
3735 10 Feb 16 olle 166     // Get the HTML from the <div> tag to be printed
3735 10 Feb 16 olle 167     var printElement = Doc.element(internal.printOptions.printElementId);
3735 10 Feb 16 olle 168     var printHtml = printElement.innerHTML;
3735 10 Feb 16 olle 169     // Replace all <canvas> elements with <img>
3735 10 Feb 16 olle 170     // since that seems the only way to make things work in IE
3735 10 Feb 16 olle 171     printHtml = printHtml.replace(/\<canvas.*?\<\/canvas\>/g, '<img class="canvas-copy">');
3735 10 Feb 16 olle 172   
3735 10 Feb 16 olle 173     // Copy the HTML to the print-area in the print-window
3735 10 Feb 16 olle 174     var printArea = printWin.document.getElementById('printarea');
3735 10 Feb 16 olle 175     printArea.innerHTML = printHtml;
3735 10 Feb 16 olle 176   
3735 10 Feb 16 olle 177     // Copy the <canvas> elements as images to the <img> elements
3735 10 Feb 16 olle 178     // using toDataURL()
3735 10 Feb 16 olle 179     var srcCanvas = printElement.getElementsByTagName('canvas');
3735 10 Feb 16 olle 180     var printImg = printArea.getElementsByClassName('canvas-copy');
3735 10 Feb 16 olle 181     for (var i = 0; i < srcCanvas.length; i++)
3735 10 Feb 16 olle 182     {
4525 15 Jun 17 nicklas 183       var canvas = srcCanvas[i];
4525 15 Jun 17 nicklas 184       var img = printImg[i];
4525 15 Jun 17 nicklas 185       if (canvas.style.width) img.style.width = canvas.style.width;
4525 15 Jun 17 nicklas 186       if (canvas.style.height) img.style.height = canvas.style.height;
4525 15 Jun 17 nicklas 187       img.src = canvas.toDataURL();
3735 10 Feb 16 olle 188     }
3735 10 Feb 16 olle 189   }
3735 10 Feb 16 olle 190   
3735 10 Feb 16 olle 191   return labenv;
3735 10 Feb 16 olle 192 }();
3735 10 Feb 16 olle 193
3735 10 Feb 16 olle 194
3735 10 Feb 16 olle 195
3735 10 Feb 16 olle 196
3735 10 Feb 16 olle 197 var Wizard = function()
3735 10 Feb 16 olle 198 {
3735 10 Feb 16 olle 199   var wizard = {};
3735 10 Feb 16 olle 200   var internal = {};
3735 10 Feb 16 olle 201   var debug = 0;
3735 10 Feb 16 olle 202   
3735 10 Feb 16 olle 203   var currentStep = 1;
3735 10 Feb 16 olle 204   var numLiveAsyncRequests = 0;
3735 10 Feb 16 olle 205   var hasSentRegistration = false;
3735 10 Feb 16 olle 206   var forceConfirm = false;
3735 10 Feb 16 olle 207   var noConfirmOnFirstStep = true;
3735 10 Feb 16 olle 208   var hasFatalError = false;
3735 10 Feb 16 olle 209   
3735 10 Feb 16 olle 210   /**
3735 10 Feb 16 olle 211     Validate the 'date'-input field that is the target of this event
3735 10 Feb 16 olle 212     The date is optional unless 'required' is part if it's className.
3735 10 Feb 16 olle 213     Dates should be either 4 or 8 digits with month+day or year+month+day.
3735 10 Feb 16 olle 214     If 'data-allow-six-digits' is set on the target element, the year
3735 10 Feb 16 olle 215     is allowed to be only 2 digits.
3735 10 Feb 16 olle 216     
3735 10 Feb 16 olle 217     4-digit (and 6-digit) dates auto-padded to 8 digits.
3735 10 Feb 16 olle 218     
3735 10 Feb 16 olle 219     The 'data-valid' attribute is set to 1 or 0 depending on the outcome,
3735 10 Feb 16 olle 220     and 'data-warning' is set if the date is missing on non-required fields.
3735 10 Feb 16 olle 221   */
3735 10 Feb 16 olle 222   wizard.validateDate = function(event)
3735 10 Feb 16 olle 223   {
3735 10 Feb 16 olle 224     var target = event.currentTarget;
3735 10 Feb 16 olle 225     var isValid = false;
3735 10 Feb 16 olle 226     var isWarning = false;
3735 10 Feb 16 olle 227     
3735 10 Feb 16 olle 228     // Reset current status
3735 10 Feb 16 olle 229     wizard.setInputStatus(target);
3735 10 Feb 16 olle 230     
3735 10 Feb 16 olle 231     var date = target.value;
3735 10 Feb 16 olle 232     if (date == '')
3735 10 Feb 16 olle 233     {
3735 10 Feb 16 olle 234       // No date, is this an error or a warning?
3735 10 Feb 16 olle 235       var optional = target.className.indexOf('required') == -1;
3735 10 Feb 16 olle 236       wizard.setInputStatus(target, optional ? 'warning' : 'invalid', 'Missing');
3735 10 Feb 16 olle 237       isValid = optional;
3735 10 Feb 16 olle 238       isWarning = optional;
3735 10 Feb 16 olle 239     }
3735 10 Feb 16 olle 240     else
3735 10 Feb 16 olle 241     {
3735 10 Feb 16 olle 242       var allowSixDigits = Data.int(target, 'allow-six-digits');
3735 10 Feb 16 olle 243       date = LabEnv.autoFillDate(date, allowSixDigits);
3735 10 Feb 16 olle 244       target.value = date;
3735 10 Feb 16 olle 245       
3735 10 Feb 16 olle 246       var d = Dates.parseString(date, 'yyyyMMdd');
3735 10 Feb 16 olle 247       if (d == null)
3735 10 Feb 16 olle 248       {
3735 10 Feb 16 olle 249         Wizard.setInputStatus(target, 'invalid', 'Not a valid date');
3735 10 Feb 16 olle 250       }
3735 10 Feb 16 olle 251       else
3735 10 Feb 16 olle 252       {
3735 10 Feb 16 olle 253         var disallowFutureDate = Data.int(target, 'disallow-future-date');
3735 10 Feb 16 olle 254         var today = new Date();
3735 10 Feb 16 olle 255         if (disallowFutureDate && (d.getTime() > today.getTime()))
3735 10 Feb 16 olle 256         {
3735 10 Feb 16 olle 257           Wizard.setInputStatus(target, 'invalid', 'Future dates are not valid');
3735 10 Feb 16 olle 258         }
3735 10 Feb 16 olle 259         else
3735 10 Feb 16 olle 260         {
3735 10 Feb 16 olle 261           Wizard.setInputStatus(target, 'valid');
3735 10 Feb 16 olle 262           isValid = true;
3735 10 Feb 16 olle 263         }
3735 10 Feb 16 olle 264       }
3735 10 Feb 16 olle 265     }
3735 10 Feb 16 olle 266
3735 10 Feb 16 olle 267     Data.set(target, 'valid', isValid ? 1 : 0);
3735 10 Feb 16 olle 268     Data.set(target, 'warning', isWarning ? 1 : 0);
3735 10 Feb 16 olle 269     
3735 10 Feb 16 olle 270     if (!isValid && target.focus) target.focus();
3735 10 Feb 16 olle 271     return isValid;
3735 10 Feb 16 olle 272   }
3735 10 Feb 16 olle 273
3735 10 Feb 16 olle 274   
3735 10 Feb 16 olle 275   wizard.isValid = function(element)
3735 10 Feb 16 olle 276   {
3735 10 Feb 16 olle 277     return Data.int(element, 'valid', 1);
3735 10 Feb 16 olle 278   }
3735 10 Feb 16 olle 279
3735 10 Feb 16 olle 280   
3735 10 Feb 16 olle 281   /**
3735 10 Feb 16 olle 282     Change display status for an input field.
3735 10 Feb 16 olle 283     @param prefix ID prefix to locate tags
3735 10 Feb 16 olle 284     @param clazz The message clazz (valid, invalid, warning) or empty
3735 10 Feb 16 olle 285     @param message The message (may be empty)
3735 10 Feb 16 olle 286   */
3735 10 Feb 16 olle 287   wizard.setInputStatus = function(prefix, clazz, message)
3735 10 Feb 16 olle 288   {
3735 10 Feb 16 olle 289     if (prefix.id) prefix = prefix.id;
3735 10 Feb 16 olle 290     
3735 10 Feb 16 olle 291     var statusTag = Doc.element(prefix + '.status');
3735 10 Feb 16 olle 292     statusTag.className = 'status ' + (clazz || '');
3735 10 Feb 16 olle 293     
3735 10 Feb 16 olle 294     var trTag = statusTag.parentNode;
3735 10 Feb 16 olle 295     var trClass = Data.get(trTag, 'original-class');
3735 10 Feb 16 olle 296     if (!trClass)
3735 10 Feb 16 olle 297     {
3735 10 Feb 16 olle 298       trClass = trTag.className || 'foo';
3735 10 Feb 16 olle 299       Data.set(trTag, 'original-class', trClass);
3735 10 Feb 16 olle 300     }
3735 10 Feb 16 olle 301     trTag.className = trClass + ' ' + (clazz || '');
3735 10 Feb 16 olle 302     
3735 10 Feb 16 olle 303     var msgTag = Doc.element(prefix + '.message');
3735 10 Feb 16 olle 304     if (msgTag)
3735 10 Feb 16 olle 305     {
3735 10 Feb 16 olle 306       if (message)
3735 10 Feb 16 olle 307       {
3735 10 Feb 16 olle 308         msgTag.innerHTML = message;
3735 10 Feb 16 olle 309         Doc.show(msgTag, Data.get(msgTag, 'display', 'inline'));
3735 10 Feb 16 olle 310       }
3735 10 Feb 16 olle 311       else
3735 10 Feb 16 olle 312       {
3735 10 Feb 16 olle 313         msgTag.innerHTML = message;
3735 10 Feb 16 olle 314         Doc.hide(msgTag);
3735 10 Feb 16 olle 315       }
3735 10 Feb 16 olle 316     }
3735 10 Feb 16 olle 317     else
3735 10 Feb 16 olle 318     {
3735 10 Feb 16 olle 319       statusTag.title = message || '';
3735 10 Feb 16 olle 320     }
3735 10 Feb 16 olle 321   }
3735 10 Feb 16 olle 322
3735 10 Feb 16 olle 323   
3735 10 Feb 16 olle 324   /**
3735 10 Feb 16 olle 325     Event handler for input fields, that go to the
3735 10 Feb 16 olle 326     next wizard step if TAB or ENTER key is pressed.
3735 10 Feb 16 olle 327     A short delay is used to allow other event handler
3735 10 Feb 16 olle 328     to run first (eg. for validation).
3735 10 Feb 16 olle 329   */
3735 10 Feb 16 olle 330   wizard.goNextOnTabOrEnter = function(event)
3735 10 Feb 16 olle 331   {
3735 10 Feb 16 olle 332     if (event.keyCode == 9 || event.keyCode == 13) 
3735 10 Feb 16 olle 333     {
3735 10 Feb 16 olle 334       setTimeout(function() { wizard.goNext(true) }, 200);
3735 10 Feb 16 olle 335     }
3735 10 Feb 16 olle 336   }
3735 10 Feb 16 olle 337   
3735 10 Feb 16 olle 338   /**
3735 10 Feb 16 olle 339     Event handler for input fields, that go to the
3735 10 Feb 16 olle 340     next wizard step if TAB key is pressed.
3735 10 Feb 16 olle 341     A short delay is used to allow other event handler
3735 10 Feb 16 olle 342     to run first (eg. for validation).
3735 10 Feb 16 olle 343   */
3735 10 Feb 16 olle 344   wizard.goNextOnTab = function(event)
3735 10 Feb 16 olle 345   {
3735 10 Feb 16 olle 346     if (event.keyCode == 9) 
3735 10 Feb 16 olle 347     {
3735 10 Feb 16 olle 348       setTimeout(function() { wizard.goNext(true) }, 200);
3735 10 Feb 16 olle 349     }
3735 10 Feb 16 olle 350   }
3735 10 Feb 16 olle 351   
3735 10 Feb 16 olle 352   /**
3735 10 Feb 16 olle 353     Event handler for input fields, that changes
3735 10 Feb 16 olle 354     focus to the next element. The next element
3735 10 Feb 16 olle 355     should be defined by 'data-next-focus' attribute.
3735 10 Feb 16 olle 356     It is recommended that this is consisistent with TAB.
3735 10 Feb 16 olle 357   */
3735 10 Feb 16 olle 358   wizard.focusOnEnter = function(event)
3735 10 Feb 16 olle 359   {
3735 10 Feb 16 olle 360     if (event.keyCode == 13)
3735 10 Feb 16 olle 361     {
3735 10 Feb 16 olle 362       var nextFocus = Doc.element(Data.get(event.currentTarget, 'next-focus'));
3735 10 Feb 16 olle 363       if (nextFocus && nextFocus.focus) nextFocus.focus();
3735 10 Feb 16 olle 364     }
3735 10 Feb 16 olle 365   }
3735 10 Feb 16 olle 366   
3735 10 Feb 16 olle 367   // Event handler for the 'Next' navigation button
3735 10 Feb 16 olle 368   wizard.goNextOnClick = function(event)
3735 10 Feb 16 olle 369   {
3735 10 Feb 16 olle 370     wizard.goNext(false);
3735 10 Feb 16 olle 371   }
3735 10 Feb 16 olle 372   
3735 10 Feb 16 olle 373   /**
3735 10 Feb 16 olle 374     Go to the next step in the wizard. This method will first
3735 10 Feb 16 olle 375     submit 'wizard-validate' event to the current step. If at 
3735 10 Feb 16 olle 376     least one event handler calls 'Event.preventDefault()' the 
3735 10 Feb 16 olle 377     processing is aborted. 
3735 10 Feb 16 olle 378     
3735 10 Feb 16 olle 379     Otherwise, the current step is disabled and the 'wizard-initialize' 
3735 10 Feb 16 olle 380     event is sent to the next step. The event handler is responsible
3735 10 Feb 16 olle 381     for calling 'Wizard.setCurrentStep' to display the next step.
3735 10 Feb 16 olle 382   */
3735 10 Feb 16 olle 383   wizard.goNext = function(auto)
3735 10 Feb 16 olle 384   {
3735 10 Feb 16 olle 385     var verify = Doc.element('verifyGoNext');
3735 10 Feb 16 olle 386     if (verify && !verify.checked) return;
3735 10 Feb 16 olle 387     
3735 10 Feb 16 olle 388     var details = { 'auto': auto };
3735 10 Feb 16 olle 389     
3735 10 Feb 16 olle 390     // Send 'wizard-validate' event to current step
3735 10 Feb 16 olle 391     var step = Doc.element('step-'+currentStep);
3735 10 Feb 16 olle 392     var evt = document.createEvent('CustomEvent');
3735 10 Feb 16 olle 393     evt.initCustomEvent('wizard-validate', true, true, details);
3735 10 Feb 16 olle 394     if (!step.dispatchEvent(evt)) 
3735 10 Feb 16 olle 395     {
3735 10 Feb 16 olle 396       wizard.notifyError();
3735 10 Feb 16 olle 397       return;
3735 10 Feb 16 olle 398     }
3735 10 Feb 16 olle 399
3735 10 Feb 16 olle 400     // Hide all navigation buttons and disable form controls in current step
3735 10 Feb 16 olle 401     internal.hideButtons('navigation');
3735 10 Feb 16 olle 402     internal.disableStep(step);
3735 10 Feb 16 olle 403     
3735 10 Feb 16 olle 404     // Send 'wizard-initialize' to the next step
3735 10 Feb 16 olle 405     var nextStep = Doc.element('step-'+(currentStep+1));
3735 10 Feb 16 olle 406     var evt = document.createEvent('CustomEvent');
3735 10 Feb 16 olle 407     evt.initCustomEvent('wizard-initialize', true, true, details);
3735 10 Feb 16 olle 408     nextStep.dispatchEvent(evt);
3735 10 Feb 16 olle 409   }
3735 10 Feb 16 olle 410   
3735 10 Feb 16 olle 411   wizard.notifyError = function()
3735 10 Feb 16 olle 412   {
3735 10 Feb 16 olle 413     Doc.addClass('wizard', 'flash-error');
3735 10 Feb 16 olle 414     setTimeout(internal.stopFlashing, 2000);
3735 10 Feb 16 olle 415   }
3735 10 Feb 16 olle 416   
3735 10 Feb 16 olle 417   internal.stopFlashing = function()
3735 10 Feb 16 olle 418   {
3735 10 Feb 16 olle 419     Doc.removeClass('wizard', 'flash-error');
3735 10 Feb 16 olle 420   }
3735 10 Feb 16 olle 421   
3735 10 Feb 16 olle 422   /**
3735 10 Feb 16 olle 423     Finalize the registration of the wizard. This method will
3735 10 Feb 16 olle 424     first submit 'wizard-validate' to the current step. If at 
3735 10 Feb 16 olle 425     least one event handler calls 'Event.preventDefault()' the 
3735 10 Feb 16 olle 426     processing is aborted.
3735 10 Feb 16 olle 427     
3735 10 Feb 16 olle 428     Otherwise, the current step is disabled and the 'wizard-submit' 
3735 10 Feb 16 olle 429     event is sent to the 'wizard'. The event handler is responsible
3735 10 Feb 16 olle 430     for finalizing the registration and displaying a proper
3735 10 Feb 16 olle 431     message, for example, by calling Wizard.showFinalMessage()
3735 10 Feb 16 olle 432   */
3735 10 Feb 16 olle 433   wizard.goRegister = function()
3735 10 Feb 16 olle 434   {
3735 10 Feb 16 olle 435     // Check if verification is enabled
3735 10 Feb 16 olle 436     var verify = Doc.element('verifyGoNext');
3735 10 Feb 16 olle 437     if (verify && !verify.checked) return;
3735 10 Feb 16 olle 438     
3735 10 Feb 16 olle 439     // Send 'wizard-validate' event to current step
3735 10 Feb 16 olle 440     var step = Doc.element('step-'+currentStep);
4527 20 Jun 17 nicklas 441     if (step)
3735 10 Feb 16 olle 442     {
4527 20 Jun 17 nicklas 443       var evt = document.createEvent('Event');
4527 20 Jun 17 nicklas 444       evt.initEvent('wizard-validate', false, true);
4527 20 Jun 17 nicklas 445       if (!step.dispatchEvent(evt)) 
4527 20 Jun 17 nicklas 446       {
4527 20 Jun 17 nicklas 447         wizard.notifyError();
4527 20 Jun 17 nicklas 448         return;
4527 20 Jun 17 nicklas 449       }
4527 20 Jun 17 nicklas 450       internal.disableStep(step);
3735 10 Feb 16 olle 451     }
3735 10 Feb 16 olle 452
3735 10 Feb 16 olle 453     internal.hideButtons('navigation');
3735 10 Feb 16 olle 454     
3735 10 Feb 16 olle 455     // Send 'wizard-submit' to the next step
3735 10 Feb 16 olle 456     var wiz = Doc.element('wizard');
3735 10 Feb 16 olle 457     hasSentRegistration = true;
3735 10 Feb 16 olle 458     var evt = document.createEvent('Event');
3735 10 Feb 16 olle 459     evt.initEvent('wizard-submit', false, true);
3735 10 Feb 16 olle 460     wiz.dispatchEvent(evt);
3735 10 Feb 16 olle 461   }
3735 10 Feb 16 olle 462   
3735 10 Feb 16 olle 463   wizard.setNoConfirmOnFirstStep = function(cf)
3735 10 Feb 16 olle 464   {
3735 10 Feb 16 olle 465     noConfirmOnFirstStep = cf;
3735 10 Feb 16 olle 466   }
3735 10 Feb 16 olle 467   
3735 10 Feb 16 olle 468   // Ask the user for confirmation and then restart the wizard
3735 10 Feb 16 olle 469   wizard.cancelWizard = function()
3735 10 Feb 16 olle 470   {
3735 10 Feb 16 olle 471     forceConfirm = true;
3735 10 Feb 16 olle 472     wizard.restartWizard();
3735 10 Feb 16 olle 473   }
3735 10 Feb 16 olle 474   
3735 10 Feb 16 olle 475   // Restart the wizard without asking the user for confirmation
3735 10 Feb 16 olle 476   wizard.restartWizard = function()
3735 10 Feb 16 olle 477   {
3735 10 Feb 16 olle 478     var url = location.href;
3735 10 Feb 16 olle 479     if (url.indexOf('&restart=1') == -1) url += '&restart=1';
3735 10 Feb 16 olle 480     location.href = url;
3735 10 Feb 16 olle 481   }
3735 10 Feb 16 olle 482   
3735 10 Feb 16 olle 483   wizard.goPrint = function()
3735 10 Feb 16 olle 484   {
3735 10 Feb 16 olle 485     window.print();
3735 10 Feb 16 olle 486   }
3735 10 Feb 16 olle 487   
3735 10 Feb 16 olle 488   wizard.setCurrentStep = function(stepNo)
3735 10 Feb 16 olle 489   {
3735 10 Feb 16 olle 490     currentStep = stepNo;
3735 10 Feb 16 olle 491     internal.enableStep(Doc.element('step-'+currentStep));
3735 10 Feb 16 olle 492   }
3735 10 Feb 16 olle 493
3735 10 Feb 16 olle 494   internal.disableStep = function(step)
3735 10 Feb 16 olle 495   {
3735 10 Feb 16 olle 496     step = Doc.element(step);
3735 10 Feb 16 olle 497     internal.disableAllFormElements(step);
3735 10 Feb 16 olle 498     Doc.addClass(step, 'disabled');
3735 10 Feb 16 olle 499     Doc.hide('gonext-message');
3735 10 Feb 16 olle 500     var stepNo = step.getElementsByClassName('step-no')[0];
3735 10 Feb 16 olle 501     Events.addEventHandler(stepNo, 'click', internal.togglePastStep, {'step-id': step.id});
3735 10 Feb 16 olle 502     stepNo.title = 'Show/hide this section';
3735 10 Feb 16 olle 503   }
3735 10 Feb 16 olle 504   
3735 10 Feb 16 olle 505   internal.enableStep = function(step)
3735 10 Feb 16 olle 506   {
3735 10 Feb 16 olle 507     step = Doc.element(step);
3735 10 Feb 16 olle 508     Doc.removeClass(step, 'disabled');
3735 10 Feb 16 olle 509     Doc.show(step);
3735 10 Feb 16 olle 510   }
3735 10 Feb 16 olle 511
3735 10 Feb 16 olle 512   // Toggle visibility of a past step
3735 10 Feb 16 olle 513   // The step is hidden if the 'auto-hide' class is present
3735 10 Feb 16 olle 514   internal.togglePastStep = function(event)
3735 10 Feb 16 olle 515   {
3735 10 Feb 16 olle 516     var step = Data.get(event.currentTarget, 'step-id');
3735 10 Feb 16 olle 517     Doc.addOrRemoveClass(step, 'auto-hide');
3735 10 Feb 16 olle 518   }
3735 10 Feb 16 olle 519   
3735 10 Feb 16 olle 520   /**
3735 10 Feb 16 olle 521     Submit an ansynchronous request for JSON data. 'GET' method
3735 10 Feb 16 olle 522     is used if 'method' parameter is not set.
3735 10 Feb 16 olle 523     The 'callback' should be a method accepting a single
3735 10 Feb 16 olle 524     JSON parameter object. If the 'status' of the response
3735 10 Feb 16 olle 525     is not 'ok' this method will call setFatalError and
3735 10 Feb 16 olle 526     without calling the callback method.
3735 10 Feb 16 olle 527   */
3735 10 Feb 16 olle 528   wizard.asyncJsonRequest = function(url, callback, method, postdata)
3735 10 Feb 16 olle 529   {
3735 10 Feb 16 olle 530     if (debug)
3735 10 Feb 16 olle 531     {
3735 10 Feb 16 olle 532       App.debug((method || 'GET') + ': ' + url);
3735 10 Feb 16 olle 533       if (postdata) App.debug(postdata);
3735 10 Feb 16 olle 534     }
3735 10 Feb 16 olle 535     var request = Ajax.getXmlHttpRequest();
3735 10 Feb 16 olle 536     request.jsonCallback = callback;
3735 10 Feb 16 olle 537     request.open(method || 'GET', url, true);
3735 10 Feb 16 olle 538     if (postdata) 
3735 10 Feb 16 olle 539     {
3735 10 Feb 16 olle 540       request.setRequestHeader("Content-Type", "application/json");
3735 10 Feb 16 olle 541     }
3735 10 Feb 16 olle 542     Ajax.setReadyStateHandler(request, internal.asyncCallbackWrapper, internal.asyncCallbackWrapper);
3735 10 Feb 16 olle 543     numLiveAsyncRequests++;
3735 10 Feb 16 olle 544     request.send(postdata || null);
3735 10 Feb 16 olle 545   }
3735 10 Feb 16 olle 546   
3735 10 Feb 16 olle 547   /**
3735 10 Feb 16 olle 548     Callback wrapper for ansynchronous requests.
3735 10 Feb 16 olle 549   */
3735 10 Feb 16 olle 550   internal.asyncCallbackWrapper = function(request)
3735 10 Feb 16 olle 551   {
3735 10 Feb 16 olle 552     numLiveAsyncRequests--;
3735 10 Feb 16 olle 553     if (debug) App.debug(request.responseText);
3735 10 Feb 16 olle 554     if (!hasFatalError) Wizard.hideWizardStatus();
3735 10 Feb 16 olle 555
3735 10 Feb 16 olle 556     var response = null;
3735 10 Feb 16 olle 557     var messages = null;
3735 10 Feb 16 olle 558     try
3735 10 Feb 16 olle 559     {
3735 10 Feb 16 olle 560       if (request.status != 200)
3735 10 Feb 16 olle 561       {
3735 10 Feb 16 olle 562         throw new Error(request.responseText);
3735 10 Feb 16 olle 563       }
3735 10 Feb 16 olle 564       else
3735 10 Feb 16 olle 565       {
3735 10 Feb 16 olle 566         if (request.getResponseHeader('Content-Type').indexOf('json') != -1)
3735 10 Feb 16 olle 567         {
3735 10 Feb 16 olle 568           response = JSON.parse(request.responseText);
3735 10 Feb 16 olle 569           messages = response.messages;
3735 10 Feb 16 olle 570           if (response.status != 'ok')
3735 10 Feb 16 olle 571           {
3735 10 Feb 16 olle 572             throw new Error(response.message || response.stacktrace);
3735 10 Feb 16 olle 573           }
3735 10 Feb 16 olle 574         }
3735 10 Feb 16 olle 575         else
3735 10 Feb 16 olle 576         {
3735 10 Feb 16 olle 577           response = request.responseText;
3735 10 Feb 16 olle 578         }
3735 10 Feb 16 olle 579         if (request.jsonCallback && request.jsonCallback.call)
3735 10 Feb 16 olle 580         {
3735 10 Feb 16 olle 581           request.jsonCallback.call(null, response);
3735 10 Feb 16 olle 582         }
3735 10 Feb 16 olle 583       }
3735 10 Feb 16 olle 584     }
3735 10 Feb 16 olle 585     catch (err)
3735 10 Feb 16 olle 586     {
3735 10 Feb 16 olle 587       Wizard.setFatalError(err, messages);
3735 10 Feb 16 olle 588     }
3735 10 Feb 16 olle 589   }
3735 10 Feb 16 olle 590
3735 10 Feb 16 olle 591   
3735 10 Feb 16 olle 592   /**
3735 10 Feb 16 olle 593     A fatal error has occurred and the wizard will not be able to continue.
3735 10 Feb 16 olle 594     This method will display the error message, disable all form input fields
3735 10 Feb 16 olle 595     and buttons (except the 'Restart' button).
3735 10 Feb 16 olle 596   */
3735 10 Feb 16 olle 597   wizard.setFatalError = function(err, messages)
3735 10 Feb 16 olle 598   {
3735 10 Feb 16 olle 599     hasFatalError = true;
3735 10 Feb 16 olle 600     var msg = err;
3735 10 Feb 16 olle 601     if (err.toString)
3735 10 Feb 16 olle 602     {
3735 10 Feb 16 olle 603       App.debug(err.toString());
3735 10 Feb 16 olle 604       msg = Strings.encodeTags(err.toString());
3735 10 Feb 16 olle 605       if (err.stack && !messages)
3735 10 Feb 16 olle 606       {
3735 10 Feb 16 olle 607         App.debug(err.stack);
3735 10 Feb 16 olle 608         msg += '<br><pre>'+Strings.encodeTags(err.stack)+'</pre>';
3735 10 Feb 16 olle 609       }
3735 10 Feb 16 olle 610     }
3735 10 Feb 16 olle 611     else
3735 10 Feb 16 olle 612     {
3735 10 Feb 16 olle 613       App.debug(msg);
3735 10 Feb 16 olle 614     }
3735 10 Feb 16 olle 615     
3735 10 Feb 16 olle 616     if (messages) 
3735 10 Feb 16 olle 617     {
3735 10 Feb 16 olle 618       msg = '<div class="messagecontainer error">'+msg+'</div>'+internal.generateMessageList(messages).html;
3735 10 Feb 16 olle 619       wizard.setWizardStatus('success', msg);
3735 10 Feb 16 olle 620     }
3735 10 Feb 16 olle 621     else
3735 10 Feb 16 olle 622     {
3735 10 Feb 16 olle 623       wizard.setWizardStatus('messagecontainer error', msg || 'Unexpected failure!');
3735 10 Feb 16 olle 624     }
3735 10 Feb 16 olle 625     
3735 10 Feb 16 olle 626     Doc.addClass('wizard', 'disabled');
3735 10 Feb 16 olle 627     internal.disableAllFormElements('wizard', true);
3735 10 Feb 16 olle 628     Doc.show('gorestart');
3735 10 Feb 16 olle 629   }
3735 10 Feb 16 olle 630
3735 10 Feb 16 olle 631   
3735 10 Feb 16 olle 632   /**
3735 10 Feb 16 olle 633     Display a 'loading' global wizard-status message.
3735 10 Feb 16 olle 634   */
3735 10 Feb 16 olle 635   wizard.showLoadingAnimation = function(msg)
3735 10 Feb 16 olle 636   {
3735 10 Feb 16 olle 637     wizard.setWizardStatus('loading', msg  || 'Working, please wait...');
3735 10 Feb 16 olle 638   }
3735 10 Feb 16 olle 639
3735 10 Feb 16 olle 640   wizard.showStatusMessage = function(msg)
3735 10 Feb 16 olle 641   {
3735 10 Feb 16 olle 642     App.debug(msg);
3735 10 Feb 16 olle 643     wizard.setWizardStatus('messagecontainer note', msg);
3735 10 Feb 16 olle 644   }
3735 10 Feb 16 olle 645   
3735 10 Feb 16 olle 646   internal.verifyInternalOnClick = function(event)
3735 10 Feb 16 olle 647   {
3735 10 Feb 16 olle 648     var frm = document.forms['labenv'];
3735 10 Feb 16 olle 649     var checked = event.currentTarget.checked;
3735 10 Feb 16 olle 650     Doc.addOrRemoveClass('goregister', 'disabled', !checked);
3735 10 Feb 16 olle 651     Doc.addOrRemoveClass('gonext', 'disabled', !checked);
3735 10 Feb 16 olle 652   }
3735 10 Feb 16 olle 653   
3735 10 Feb 16 olle 654   /**
3735 10 Feb 16 olle 655     Show final registration messages in a list.
3735 10 Feb 16 olle 656   */
3735 10 Feb 16 olle 657   wizard.showFinalMessage = function(messages)
3735 10 Feb 16 olle 658   {
3735 10 Feb 16 olle 659     var msg = internal.generateMessageList(messages);
3735 10 Feb 16 olle 660     wizard.setWizardStatus('success', msg.html);
3735 10 Feb 16 olle 661     return { 'errors': msg.errors, 'warnings': msg.warnings };
3735 10 Feb 16 olle 662   }
3735 10 Feb 16 olle 663   
3735 10 Feb 16 olle 664
3735 10 Feb 16 olle 665   internal.generateMessageList = function(messages)
3735 10 Feb 16 olle 666   {
3735 10 Feb 16 olle 667     var msg = '<ul>';
3735 10 Feb 16 olle 668     var numWarnings = 0;
3735 10 Feb 16 olle 669     var numErrors = 0;
3735 10 Feb 16 olle 670     for (var i = 0; i < messages.length; i++)
3735 10 Feb 16 olle 671     {
3735 10 Feb 16 olle 672       var msgLine = messages[i];
3735 10 Feb 16 olle 673       if (msgLine.indexOf('[Warning]') >= 0)
3735 10 Feb 16 olle 674       {
3735 10 Feb 16 olle 675         msg += '<li class="warning">' + Strings.encodeTags(msgLine.replace('[Warning]', ''));
3735 10 Feb 16 olle 676         numWarnings++;
3735 10 Feb 16 olle 677       }
3735 10 Feb 16 olle 678       else if (msgLine.indexOf('[Error]') >= 0)
3735 10 Feb 16 olle 679       {
3735 10 Feb 16 olle 680         msg += '<li class="error">' + Strings.encodeTags(msgLine.replace('[Error]', ''));
3735 10 Feb 16 olle 681         numErrors++;
3735 10 Feb 16 olle 682       }
3735 10 Feb 16 olle 683       else
3735 10 Feb 16 olle 684       {
3735 10 Feb 16 olle 685         msg += '<li class="ok">' + Strings.encodeTags(msgLine);
3735 10 Feb 16 olle 686       }
3735 10 Feb 16 olle 687     }
3735 10 Feb 16 olle 688     msg += '</ul>';
3735 10 Feb 16 olle 689     return { 'html': msg, 'errors': numErrors, 'warnings': numWarnings };
3735 10 Feb 16 olle 690   }
3735 10 Feb 16 olle 691   
3735 10 Feb 16 olle 692   /**
3735 10 Feb 16 olle 693     Hide the current global wizard-status message.
3735 10 Feb 16 olle 694   */
3735 10 Feb 16 olle 695   wizard.hideWizardStatus = function()
3735 10 Feb 16 olle 696   {
3735 10 Feb 16 olle 697     Doc.hide('wizard-status');
3735 10 Feb 16 olle 698   }
3735 10 Feb 16 olle 699     
3735 10 Feb 16 olle 700   /**
3735 10 Feb 16 olle 701     Initialize the wizard:
3735 10 Feb 16 olle 702     
3735 10 Feb 16 olle 703     * Check that a project is active
3735 10 Feb 16 olle 704   */
3735 10 Feb 16 olle 705   internal.initWizard = function()
3735 10 Feb 16 olle 706   {
3735 10 Feb 16 olle 707     // Check if project is enabled
3735 10 Feb 16 olle 708     var wiz = Doc.element('wizard');
3735 10 Feb 16 olle 709     if (wiz)
3735 10 Feb 16 olle 710     {
3735 10 Feb 16 olle 711       window.addEventListener('beforeunload', internal.confirmLeaveWizard);
3735 10 Feb 16 olle 712     }
3735 10 Feb 16 olle 713     
3735 10 Feb 16 olle 714     var path = document.getElementsByClassName('pathelement');
3735 10 Feb 16 olle 715     if (path && path.length)
3735 10 Feb 16 olle 716     {
3735 10 Feb 16 olle 717       path[path.length-1].innerHTML += '<span id="labenv-version">[LabEnv '+LabEnv.VERSION+']</span>';
3735 10 Feb 16 olle 718     }
3735 10 Feb 16 olle 719   }
3735 10 Feb 16 olle 720   
3735 10 Feb 16 olle 721   internal.confirmLeaveWizard = function(event)
3735 10 Feb 16 olle 722   {
3735 10 Feb 16 olle 723     if (hasFatalError) return;
3735 10 Feb 16 olle 724     if (!forceConfirm)
3735 10 Feb 16 olle 725     {
3735 10 Feb 16 olle 726       if (currentStep == 1 && noConfirmOnFirstStep) return;
3735 10 Feb 16 olle 727       if (hasSentRegistration && numLiveAsyncRequests == 0) return;
3735 10 Feb 16 olle 728     }
3735 10 Feb 16 olle 729     forceConfirm = false;
3735 10 Feb 16 olle 730     event.preventDefault();
3735 10 Feb 16 olle 731   }
3735 10 Feb 16 olle 732   
3735 10 Feb 16 olle 733   // Initialize some event handlers
3735 10 Feb 16 olle 734   internal.initElements = function(element, autoInit)
3735 10 Feb 16 olle 735   {
3735 10 Feb 16 olle 736     if (autoInit == 'focus-on-enter')
3735 10 Feb 16 olle 737     {
3735 10 Feb 16 olle 738       Events.addEventHandler(element, 'keypress', wizard.focusOnEnter);
3735 10 Feb 16 olle 739     }
3735 10 Feb 16 olle 740   }
3735 10 Feb 16 olle 741   
3735 10 Feb 16 olle 742   /**
3735 10 Feb 16 olle 743     Display a global wizard-status message. This may for example be
3735 10 Feb 16 olle 744     an error message, a work-in-progress indicator, etc.
3735 10 Feb 16 olle 745   */
3735 10 Feb 16 olle 746   wizard.setWizardStatus = function(className, msg)
3735 10 Feb 16 olle 747   {
3735 10 Feb 16 olle 748     var status = Doc.element('wizard-status');
3735 10 Feb 16 olle 749     status.className = className;
3735 10 Feb 16 olle 750     status.innerHTML = msg;
3735 10 Feb 16 olle 751     Doc.show(status);
3735 10 Feb 16 olle 752   }
3735 10 Feb 16 olle 753
3735 10 Feb 16 olle 754   // Disable all form elements inside the given container
3735 10 Feb 16 olle 755   internal.disableAllFormElements = function(container, hideButtons)
3735 10 Feb 16 olle 756   {
3735 10 Feb 16 olle 757     container = Doc.element(container);
3735 10 Feb 16 olle 758     var input = container.getElementsByTagName('input');
3735 10 Feb 16 olle 759     for (var i = 0; i < input.length; i++)
3735 10 Feb 16 olle 760     {
3735 10 Feb 16 olle 761       input[i].disabled = true;
3735 10 Feb 16 olle 762     }
3735 10 Feb 16 olle 763     var select = container.getElementsByTagName('select');
3735 10 Feb 16 olle 764     for (var i = 0; i < select.length; i++)
3735 10 Feb 16 olle 765     {
3735 10 Feb 16 olle 766       select[i].disabled = true;
3735 10 Feb 16 olle 767     }
3735 10 Feb 16 olle 768     var text = container.getElementsByTagName('textarea');
3735 10 Feb 16 olle 769     for (var i = 0; i < text.length; i++)
3735 10 Feb 16 olle 770     {
3735 10 Feb 16 olle 771       text[i].disabled = true;
3735 10 Feb 16 olle 772     }
3735 10 Feb 16 olle 773     if (hideButtons)
3735 10 Feb 16 olle 774     {
3735 10 Feb 16 olle 775       internal.hideButtons(container);
3735 10 Feb 16 olle 776     }
3735 10 Feb 16 olle 777   }
3735 10 Feb 16 olle 778
3735 10 Feb 16 olle 779   // Hide all 'basicbuttons':s in the given container
3735 10 Feb 16 olle 780   internal.hideButtons = function(container)
3735 10 Feb 16 olle 781   {
3735 10 Feb 16 olle 782     container = Doc.element(container);
3735 10 Feb 16 olle 783     var buttons = container.getElementsByClassName('basicbutton');
3735 10 Feb 16 olle 784     for (var i = 0; i < buttons.length; i++)
3735 10 Feb 16 olle 785     {
3735 10 Feb 16 olle 786       Doc.hide(buttons[i]);
3735 10 Feb 16 olle 787     }
3735 10 Feb 16 olle 788   }
3735 10 Feb 16 olle 789
3735 10 Feb 16 olle 790   Doc.addFinalizer(internal.initWizard);
3735 10 Feb 16 olle 791   Doc.addElementInitializer(internal.initElements);
3735 10 Feb 16 olle 792   return wizard;
3735 10 Feb 16 olle 793 }();
3735 10 Feb 16 olle 794