text: // Core javascript helper functions
  
  // basic browser identification & version
  var isOpera = (navigator.userAgent.indexOf("Opera") >= 0) && parseFloat(navigator.appVersion);
  var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]);
  
  // quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]);
  function quickElement() {
      'use strict';
      var obj = document.createElement(arguments[0]);
      if (arguments[2]) {
          var textNode = document.createTextNode(arguments[2]);
          obj.appendChild(textNode);
      }
      var len = arguments.length;
      for (var i = 3; i < len; i += 2) {
          obj.setAttribute(arguments[i], arguments[i + 1]);
      }
      arguments[1].appendChild(obj);
      return obj;
  }
  
  // "a" is reference to an object
  function removeChildren(a) {
      'use strict';
      while (a.hasChildNodes()) {
          a.removeChild(a.lastChild);
      }
  }
  
  // ----------------------------------------------------------------------------
  // Find-position functions by PPK
  // See https://www.quirksmode.org/js/findpos.html
  // ----------------------------------------------------------------------------
  function findPosX(obj) {
      'use strict';
      var curleft = 0;
      if (obj.offsetParent) {
          while (obj.offsetParent) {
              curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft);
              obj = obj.offsetParent;
          }
          // IE offsetParent does not include the top-level
          if (isIE && obj.parentElement) {
              curleft += obj.offsetLeft - obj.scrollLeft;
          }
      } else if (obj.x) {
          curleft += obj.x;
      }
      return curleft;
  }
  
  function findPosY(obj) {
      'use strict';
      var curtop = 0;
      if (obj.offsetParent) {
          while (obj.offsetParent) {
              curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop);
              obj = obj.offsetParent;
          }
          // IE offsetParent does not include the top-level
          if (isIE && obj.parentElement) {
              curtop += obj.offsetTop - obj.scrollTop;
          }
      } else if (obj.y) {
          curtop += obj.y;
      }
      return curtop;
  }
  
  //-----------------------------------------------------------------------------
  // Date object extensions
  // ----------------------------------------------------------------------------
  (function() {
      'use strict';
      Date.prototype.getTwelveHours = function() {
          var hours = this.getHours();
          if (hours === 0) {
              return 12;
          }
          else {
              return hours <= 12 ? hours : hours - 12;
          }
      };
  
      Date.prototype.getTwoDigitMonth = function() {
          return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1);
      };
  
      Date.prototype.getTwoDigitDate = function() {
          return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
      };
  
      Date.prototype.getTwoDigitTwelveHour = function() {
          return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours();
      };
  
      Date.prototype.getTwoDigitHour = function() {
          return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
      };
  
      Date.prototype.getTwoDigitMinute = function() {
          return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
      };
  
      Date.prototype.getTwoDigitSecond = function() {
          return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
      };
  
      Date.prototype.getHourMinute = function() {
          return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
      };
  
      Date.prototype.getHourMinuteSecond = function() {
          return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();
      };
  
      Date.prototype.getFullMonthName = function() {
          return typeof window.CalendarNamespace === "undefined"
              ? this.getTwoDigitMonth()
              : window.CalendarNamespace.monthsOfYear[this.getMonth()];
      };
  
      Date.prototype.strftime = function(format) {
          var fields = {
              B: this.getFullMonthName(),
              c: this.toString(),
              d: this.getTwoDigitDate(),
              H: this.getTwoDigitHour(),
              I: this.getTwoDigitTwelveHour(),
              m: this.getTwoDigitMonth(),
              M: this.getTwoDigitMinute(),
              p: (this.getHours() >= 12) ? 'PM' : 'AM',
              S: this.getTwoDigitSecond(),
              w: '0' + this.getDay(),
              x: this.toLocaleDateString(),
              X: this.toLocaleTimeString(),
              y: ('' + this.getFullYear()).substr(2, 4),
              Y: '' + this.getFullYear(),
              '%': '%'
          };
          var result = '', i = 0;
          while (i < format.length) {
              if (format.charAt(i) === '%') {
                  result = result + fields[format.charAt(i + 1)];
                  ++i;
              }
              else {
                  result = result + format.charAt(i);
              }
              ++i;
          }
          return result;
      };
  
  // ----------------------------------------------------------------------------
  // String object extensions
  // ----------------------------------------------------------------------------
      String.prototype.pad_left = function(pad_length, pad_string) {
          var new_string = this;
          for (var i = 0; new_string.length < pad_length; i++) {
              new_string = pad_string + new_string;
          }
          return new_string;
      };
  
      String.prototype.strptime = function(format) {
          var split_format = format.split(/[.\-/]/);
          var date = this.split(/[.\-/]/);
          var i = 0;
          var day, month, year;
          while (i < split_format.length) {
              switch (split_format[i]) {
                  case "%d":
                      day = date[i];
                      break;
                  case "%m":
                      month = date[i] - 1;
                      break;
                  case "%Y":
                      year = date[i];
                      break;
                  case "%y":
                      year = date[i];
                      break;
              }
              ++i;
          }
          // Create Date object from UTC since the parsed value is supposed to be
          // in UTC, not local time. Also, the calendar uses UTC functions for
          // date extraction.
          return new Date(Date.UTC(year, month, day));
      };
  
  })();
  // ----------------------------------------------------------------------------
  // Get the computed style for and element
  // ----------------------------------------------------------------------------
  function getStyle(oElm, strCssRule) {
      'use strict';
      var strValue = "";
      if(document.defaultView && document.defaultView.getComputedStyle) {
          strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
      }
      else if(oElm.currentStyle) {
          strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) {
              return p1.toUpperCase();
          });
          strValue = oElm.currentStyle[strCssRule];
      }
      return strValue;
  }
  