
function gridCalendar(CalendarId)
{
   var gcalDateNow = new Date(Date.parse(new Date().toDateString()));
   var gcalBaseYear = 1899; var gcalDropDownYears = gcalDateNow.getFullYear() - 1899 + 11;
   var gcalLanguage;
   var CalendarID = CalendarId;
   if (!CalendarID)
      CalendarID = 'GridCalendar';
   var self = this;
   this.gcalSetDefaultLanguage = function()
   {
      try { gcalSetLanguage() }
      catch (exception)
      {
         gcalToday = 'Today:';
         gcalClear = 'Clear';
         gcalDrag = 'click here to drag';
         gcalArrMonthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
         gcalArrWeekInits = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
         gcalInvalidDateMsg = 'The entered date is invalid.\n';
         gcalOutOfRangeMsg = 'The entered date is out of range.';
         gcalDoesNotExistMsg = 'The entered date does not exist.';
         gcalInvalidAlert = ['Invalid date (', ') ignored.'];
         gcalDateDisablingError = ['Error ', ' is not a Date object.'];
         gcalRangeDisablingError = ['Error ', ' should consist of two elements.']
      }
   };
   var gcalWeekStart = 0;
   var gcalWeekNumberDisplay = false;
   var gcalWeekNumberBaseDay = 4;
   var gcalShowInvalidDateMsg = true, gcalShowOutOfRangeMsg = true, gcalShowDoesNotExistMsg = true, gcalShowInvalidAlert = true, gcalShowDateDisablingError = true, gcalShowRangeDisablingError = true;
   var gcalArrDelimiters = ['/', '-', '.', ',', ' '];
   var gcalDateDisplayFormat = 'mm/dd/yyyy';
   var gcalDateOutputFormat = 'mm/dd/yyyy'; var gcalZindex = 1;
   var gcalBlnStrict = false; var gcalClearButton = true;
   var gcalAutoPosition = true;
   var gcalEnabledDay = [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true];
   var gcalDisabledDates = new Array();
   var gcalActiveToday = true; var gcalOutOfMonthDisable = false;
   var gcalOutOfMonthHide = false;
   var gcalOutOfRangeDisable = true;
   var gcalFormatTodayCell = true;
   var gcalTodayCellBorderColour = 'red';
   var gcalAllowDrag = false;
   var gcalClickToHide = false;
   var gcalStartDate = new Date();
   var gcalShowDate = new Date();

   var html = '';

   /*if (!document.getElementById('gcalCSS'))
   {
      html = '<style id="gcalCSS" type="text/css">' + '.gcal {padding:1px;vertical-align:middle;}' + 'iframe.gcal {position:absolute;z-index:' + gcalZindex + ';top:0px;left:0px;visibility:hidden;' + 'width:1px;height:1px;}' + 'table.gcal {padding:0px;visibility:hidden;' + 'position:absolute;cursor:default;' + 'width:200px;top:0px;left:0px;' + 'z-index:' + (gcalZindex + 1) + ';text-align:center;}' + '</style>';
      //document.writeln('<style id="gcalCSS" type="text/css">' + '.gcal {padding:1px;vertical-align:middle;}' + 'iframe.gcal {position:absolute;z-index:' + gcalZindex + ';top:0px;left:0px;visibility:hidden;' + 'width:1px;height:1px;}' + 'table.gcal {padding:0px;visibility:hidden;' + 'position:absolute;cursor:default;' + 'width:200px;top:0px;left:0px;' + 'z-index:' + (gcalZindex + 1) + ';text-align:center;}' + '</style>');
   }*/
   this.gcalTargetEle = null;
   var gcalTriggerEle, gcalMonthSum = 0, gcalBlnFullInputDate = false, gcalPassEnabledDay = new Array(), gcalSeedDate = new Date(), gcalParmActiveToday = true, gcalWeekStart = gcalWeekStart % 7, gcalToday, gcalClear, gcalDrag, gcalArrMonthNames, gcalArrWeekInits, gcalInvalidDateMsg, gcalOutOfRangeMsg, gcalDoesNotExistMsg, gcalInvalidAlert, gcalDateDisablingError, gcalRangeDisablingError; Date.prototype.gcalFormat = function(gcalFormat) { var charCount = 0, codeChar = '', result = ''; for (var i = 0; i <= gcalFormat.length; i++) { if (i < gcalFormat.length && gcalFormat.charAt(i) == codeChar) { charCount++ } else { switch (codeChar) { case 'y': case 'Y': result += (this.getFullYear() % Math.pow(10, charCount)).toString().gcalPadLeft(charCount); break; case 'm': case 'M': result += (charCount < 3) ? (this.getMonth() + 1).toString().gcalPadLeft(charCount) : gcalArrMonthNames[this.getMonth()]; break; case 'd': case 'D': result += this.getDate().toString().gcalPadLeft(charCount); break; default: while (charCount-- > 0) { result += codeChar } } if (i < gcalFormat.length) { codeChar = gcalFormat.charAt(i); charCount = 1 } } } return result }; String.prototype.gcalPadLeft = function(padToLength) { var result = ''; for (var i = 0; i < (padToLength - this.length); i++) { result += '0' } return (result + this) }; Function.prototype.runsAftergcal = function() { var func = this, args = new Array(arguments.length); for (var i = 0; i < args.length; ++i) { args[i] = arguments[i] } return function() { for (var i = 0; i < arguments.length; ++i) { args[args.length] = arguments[i] } return (args.shift() == gcalTriggerEle) ? func.apply(this, args) : null } };
   this.gcalID = function(id)
   {
      if (document.getElementById(id) || (!document.getElementById(id) && document.getElementsByName(id).length == 0))
      {
         return document.getElementById(id)
      }
      else
      {
         if (document.getElementsByName(id).length == 1)
         {
            return document.getElementsByName(id)[0]
         }
         else
         {
            if (document.getElementsByName(id).length > 1)
            {
               alert('gcal' + ' \nCannot uniquely identify element named: ' + id + '.\nMore than one identical NAME attribute defined' + '.\nSolution: Assign the required element a unique ID attribute value.')
            }
         }
      }
   };

   var gcalNextActionReturn, gcalNextAction;
   this.showCal = function(gcalEle, gcalSource)
   {
      self.gcalShow(gcalEle, gcalSource)
   };

   this.gcalShow = function(gcalEle, gcalSource)
   {
      self.init();
      if (typeof gcalEle == 'string')
         gcalEle = document.getElementById(gcalEle);

      if (!gcalSource)
      { gcalSource = window.event }
      if (gcalEle.readOnly || gcalEle.disabled)
         return;
      if (gcalSource.tagName)
      {
         var gcalSourceEle = gcalSource;
         if (self.gcalID('gcalIE_' + CalendarID))
         {
            window.event.cancelBubble = true
         }
         else
         {
            gcalSourceEle.parentNode.addEventListener('click', self.gcalStopPropagation, false)
         }
      }
      else
      {
         var gcalSourceEle = (gcalSource.target) ? gcalSource.target : gcalSource.srcElement;
         if (gcalSource.stopPropagation)
         {
            gcalSource.stopPropagation()
         }
         else
         {
            gcalSource.cancelBubble = true
         }
      }
      gcalTriggerEle = gcalSourceEle;
      gcalParmActiveToday = true;
      for (var i = 0; i < 7; i++)
      {
         gcalPassEnabledDay[(i + 7 - gcalWeekStart) % 7] = true; for (var j = 2; j < arguments.length; j++)
         {
            if (arguments[j] == i)
            {
               gcalPassEnabledDay[(i + 7 - gcalWeekStart) % 7] = false;
               if (gcalDateNow.getDay() == i)
               {
                  gcalParmActiveToday = false
               }
            }
         }
      }
      gcalSeedDate = gcalDateNow;
      var gcalDateValue = '';
      if (gcalEle.value)
      { gcalDateValue = gcalEle.value.replace(/^\s+/, '').replace(/\s+$/, '') }
      else
      {
         if (typeof gcalEle.value == 'undefined')
         {
            var gcalChildNodes = gcalEle.childNodes;
            for (var i = 0; i < gcalChildNodes.length; i++)
            {
               if (gcalChildNodes[i].nodeType == 3)
               {
                  gcalDateValue = gcalChildNodes[i].nodeValue.replace(/^\s+/, '').replace(/\s+$/, '');
                  if (gcalDateValue.length > 0)
                  {
                     gcalTriggerEle.gcalTextNode = gcalChildNodes[i];
                     gcalTriggerEle.gcalLength = gcalChildNodes[i].nodeValue.length;
                     break
                  }
               }
            }
         }
      }
      self.gcalSetDefaultLanguage();
      self.gcalID('gcalDragText_' + CalendarID).innerHTML = gcalDrag;
      self.gcalID('gcalMonths_' + CalendarID).options.length = 0;
      for (var i = 0; i < gcalArrMonthNames.length; i++)
      {
         self.gcalID('gcalMonths_' + CalendarID).options[i] = new Option(gcalArrMonthNames[i], gcalArrMonthNames[i])
      }
      self.gcalID('gcalYears_' + CalendarID).options.length = 0;
      for (var i = 0; i < gcalDropDownYears; i++)
      {
         self.gcalID('gcalYears_' + CalendarID).options[i] = new Option((gcalBaseYear + i), (gcalBaseYear + i))
      }
      for (var i = 0; i < gcalArrWeekInits.length; i++)
      {
         self.gcalID('gcalWeekInit_' + CalendarID + i).innerHTML = gcalArrWeekInits[(i + gcalWeekStart) % gcalArrWeekInits.length]
      }
      if (((new Date(gcalBaseYear + gcalDropDownYears, 0, 0)) > gcalDateNow &&
        (new Date(gcalBaseYear, 0, 0)) < gcalDateNow) || gcalClearButton)
      {
         self.gcalID('gcalFoot_' + CalendarID).style.display = '';
         self.gcalID('gcalNow_' + CalendarID).innerHTML = gcalToday + ' ' + gcalDateNow.gcalFormat(gcalDateDisplayFormat);
         self.gcalID('gcalClearButton_' + CalendarID).value = gcalClear;
         if ((new Date(gcalBaseYear + gcalDropDownYears, 0, 0)) > gcalDateNow && (new Date(gcalBaseYear, 0, 0)) < gcalDateNow)
         {
            self.gcalID('gcalNow_' + CalendarID).style.display = '';
            if (gcalClearButton)
            {
               self.gcalID('gcalClear_' + CalendarID).style.display = '';
               self.gcalID('gcalClear_' + CalendarID).style.textAlign = 'left';
               self.gcalID('gcalNow_' + CalendarID).style.textAlign = 'right'
            }
            else
            {
               self.gcalID('gcalClear_' + CalendarID).style.display = 'none';
               self.gcalID('gcalNow_' + CalendarID).style.textAlign = 'center'
            }
         }
         else
         {
            self.gcalID('gcalClear_' + CalendarID).style.textAlign = 'center';
            self.gcalID('gcalClear_' + CalendarID).style.display = '';
            self.gcalID('gcalNow_' + CalendarID).style.display = 'none'
         }
      }
      else { self.gcalID('gcalFoot_' + CalendarID).style.display = 'none' }
      if (gcalDateValue.length == 0)
      {
         gcalBlnFullInputDate = false;
         if ((new Date(gcalBaseYear + gcalDropDownYears, 0, 0)) < gcalSeedDate || (new Date(gcalBaseYear, 0, 1)) > gcalSeedDate)
         {
            gcalSeedDate = new Date(gcalBaseYear + Math.floor(gcalDropDownYears / 2), 5, 1)
         }
      }
      else
      {
         function gcalInputFormat()
         {
            var gcalArrSeed = new Array(), gcalArrInput = gcalDateValue.split(new RegExp('[\\' + gcalArrDelimiters.join('\\') + ']+', 'g'));
            if (gcalArrInput[0] != null)
            {
               if (gcalArrInput[0].length == 0) { gcalArrInput.splice(0, 1) }
               if (gcalArrInput[gcalArrInput.length - 1].length == 0)
               {
                  gcalArrInput.splice(gcalArrInput.length - 1, 1)
               }
            } gcalBlnFullInputDate = false;
            gcalDateOutputFormat = gcalDateOutputFormat.toUpperCase();
            var template = ['D', 'M', 'Y'];
            var result = new Array();
            for (var i = 0; i < template.length; i++)
            {
               if (gcalDateOutputFormat.search(template[i]) > -1) { result[gcalDateOutputFormat.search(template[i])] = template[i] }
            }
            var gcalDateSequence = result.join('');
            switch (gcalArrInput.length)
            {
               case 1:
                  {
                     if (gcalDateOutputFormat.indexOf('Y') > -1 && gcalArrInput[0].length > gcalDateOutputFormat.lastIndexOf('Y'))
                     {
                        gcalArrSeed[0] = parseInt(gcalArrInput[0].substring(gcalDateOutputFormat.indexOf('Y'), gcalDateOutputFormat.lastIndexOf('Y') + 1), 10)
                     }
                     else { gcalArrSeed[0] = 0 }
                     if (gcalDateOutputFormat.indexOf('M') > -1 && gcalArrInput[0].length > gcalDateOutputFormat.lastIndexOf('M'))
                     {
                        gcalArrSeed[1] = gcalArrInput[0].substring(gcalDateOutputFormat.indexOf('M'), gcalDateOutputFormat.lastIndexOf('M') + 1)
                     }
                     else { gcalArrSeed[1] = '6' }
                     if (gcalDateOutputFormat.indexOf('D') > -1 && gcalArrInput[0].length > gcalDateOutputFormat.lastIndexOf('D'))
                     {
                        gcalArrSeed[2] = parseInt(gcalArrInput[0].substring(gcalDateOutputFormat.indexOf('D'), gcalDateOutputFormat.lastIndexOf('D') + 1), 10)
                     }
                     else { gcalArrSeed[2] = 1 }
                     if (gcalArrInput[0].length == gcalDateOutputFormat.length)
                     {
                        gcalBlnFullInputDate = true
                     }
                     break
                  }
               case 2:
                  {
                     gcalArrSeed[0] = parseInt(gcalArrInput[gcalDateSequence.replace(/D/i, '').search(/Y/i)], 10);
                     gcalArrSeed[1] = gcalArrInput[gcalDateSequence.replace(/D/i, '').search(/M/i)];
                     gcalArrSeed[2] = 1;
                     break
                  }
               case 3:
                  {
                     gcalArrSeed[0] = parseInt(gcalArrInput[gcalDateSequence.search(/Y/i)], 10);
                     gcalArrSeed[1] = gcalArrInput[gcalDateSequence.search(/M/i)];
                     gcalArrSeed[2] = parseInt(gcalArrInput[gcalDateSequence.search(/D/i)], 10);
                     gcalBlnFullInputDate = true; break
                  } default:
                  {
                     gcalArrSeed[0] = 0;
                     gcalArrSeed[1] = 0;
                     gcalArrSeed[2] = 0
                  }
            }
            var gcalExpValDay = new RegExp('^(0?[1-9]|[1-2][0-9]|3[0-1])$'), gcalExpValMonth = new RegExp('^(0?[1-9]|1[0-2]|' + gcalArrMonthNames.join('|') + ')$', 'i'), gcalExpValYear = new RegExp('^([0-9]{1,2}|[0-9]{4})$');
            if (gcalExpValYear.exec(gcalArrSeed[0]) == null || gcalExpValMonth.exec(gcalArrSeed[1]) == null || gcalExpValDay.exec(gcalArrSeed[2]) == null)
            {
               if (gcalShowInvalidDateMsg)
               {
                  alert(gcalInvalidDateMsg + gcalInvalidAlert[0] + gcalDateValue + gcalInvalidAlert[1])
               }
               gcalBlnFullInputDate = false;
               gcalArrSeed[0] = gcalBaseYear + Math.floor(gcalDropDownYears / 2);
               gcalArrSeed[1] = '6'; gcalArrSeed[2] = 1
            }
            return gcalArrSeed
         };
         gcalArrSeedDate = gcalInputFormat();
         if (gcalArrSeedDate[0] < 100)
         {
            gcalArrSeedDate[0] += (gcalArrSeedDate[0] > 50) ? 1900 : 2000
         }
         if (gcalArrSeedDate[1].search(/\d+/) < 0)
         {
            for (i = 0; i < gcalArrMonthNames.length; i++)
            {
               if (gcalArrSeedDate[1].toUpperCase() == gcalArrMonthNames[i].toUpperCase())
               {
                  gcalArrSeedDate[1] = i + 1; break
               }
            }
         }
         gcalSeedDate = new Date(gcalArrSeedDate[0], gcalArrSeedDate[1] - 1, gcalArrSeedDate[2])
      }
      if (isNaN(gcalSeedDate))
      {
         if (gcalShowInvalidDateMsg)
         {
            alert(gcalInvalidDateMsg + gcalInvalidAlert[0] + gcalDateValue + gcalInvalidAlert[1])
         }
         gcalSeedDate = new Date(gcalBaseYear + Math.floor(gcalDropDownYears / 2), 5, 1);
         gcalBlnFullInputDate = false
      }
      else
      {
         if ((new Date(gcalBaseYear, 0, 1)) > gcalSeedDate)
         {
            if (gcalBlnStrict && gcalShowOutOfRangeMsg) { alert(gcalOutOfRangeMsg) }
            gcalSeedDate = new Date(gcalBaseYear, 0, 1);
            gcalBlnFullInputDate = false
         }
         else
         {
            if ((new Date(gcalBaseYear + gcalDropDownYears, 0, 0)) < gcalSeedDate)
            {
               if (gcalBlnStrict && gcalShowOutOfRangeMsg)
               {
                  alert(gcalOutOfRangeMsg)
               } gcalSeedDate = new Date(gcalBaseYear + Math.floor(gcalDropDownYears) - 1, 11, 1);
               gcalBlnFullInputDate = false
            }
            else
            {
               if (gcalBlnStrict && gcalBlnFullInputDate && (gcalSeedDate.getDate() != gcalArrSeedDate[2] || (gcalSeedDate.getMonth() + 1) != gcalArrSeedDate[1] || gcalSeedDate.getFullYear() != gcalArrSeedDate[0]))
               {
                  if (gcalShowDoesNotExistMsg) alert(gcalDoesNotExistMsg);
                  gcalSeedDate = new Date(gcalSeedDate.getFullYear(), gcalSeedDate.getMonth() - 1, 1);
                  gcalBlnFullInputDate = false
               }
            }
         }
      }
      for (var i = 0; i < gcalDisabledDates.length; i++)
      {
         if (!((typeof gcalDisabledDates[i] == 'object') && (gcalDisabledDates[i].constructor == Date)))
         {
            if ((typeof gcalDisabledDates[i] == 'object') && (gcalDisabledDates[i].constructor == Array))
            {
               var gcalPass = true;
               if (gcalDisabledDates[i].length != 2)
               {
                  if (gcalShowRangeDisablingError)
                  {
                     alert(gcalRangeDisablingError[0] + gcalDisabledDates[i] + gcalRangeDisablingError[1])
                  }
                  gcalPass = false
               } else
               {
                  for (var j = 0; j < gcalDisabledDates[i].length; j++)
                  {
                     if (!((typeof gcalDisabledDates[i][j] == 'object') && (gcalDisabledDates[i][j].constructor == Date)))
                     {
                        if (gcalShowRangeDisablingError)
                        {
                           alert(gcalDateDisablingError[0] + gcalDisabledDates[i][j] + gcalDateDisablingError[1])
                        } gcalPass = false
                     }
                  }
               }
               if (gcalPass && (gcalDisabledDates[i][0] > gcalDisabledDates[i][1])) { gcalDisabledDates[i].reverse() }
            }
            else { if (gcalShowRangeDisablingError) { alert(gcalDateDisablingError[0] + gcalDisabledDates[i] + gcalDateDisablingError[1]) } }
         }
      }
      gcalMonthSum = 12 * (gcalSeedDate.getFullYear() - gcalBaseYear) + gcalSeedDate.getMonth();
      self.gcalID('gcalYears_' + CalendarID).options.selectedIndex = Math.floor(gcalMonthSum / 12);
      self.gcalID('gcalMonths_' + CalendarID).options.selectedIndex = (gcalMonthSum % 12);
      self.gcalID('gcalDrag_' + CalendarID).style.display = (gcalAllowDrag) ? '' : 'none'; self.gcalShowMonth(0);
      self.gcalTargetEle = gcalEle;
      var offsetTop = parseInt(gcalEle.offsetTop, 10) + parseInt(gcalEle.offsetHeight, 10), offsetLeft = parseInt(gcalEle.offsetLeft, 10);
      var ot = parseInt(gcalEle.getClientRects()[0].top, 10) + parseInt(gcalEle.offsetHeight, 10);
      var ol = parseInt(gcalEle.getClientRects()[0].left, 10);
      var pst = (document.documentElement.scrollTop) ? document.documentElement.scrollTop : 0;
      var psl = (document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : 0;
      offsetTop = ot + pst;
      offsetLeft = ol + psl;
      if (gcalAutoPosition)
      {
         var gcalWidth = parseInt(self.gcalID('gcal_' + CalendarID).offsetWidth, 10), gcalHeight = parseInt(self.gcalID('gcal_' + CalendarID).offsetHeight, 10), gcalWindowLeft = (document.body && document.body.scrollLeft) ? document.body.scrollLeft : (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : 0, gcalWindowWidth = (typeof (innerWidth) == 'number') ? innerWidth : (document.documentElement && document.documentElement.clientWidth) ? document.documentElement.clientWidth : (document.body && document.body.clientWidth) ? document.body.clientWidth : 0, gcalWindowTop = (document.body && document.body.scrollTop) ? document.body.scrollTop : (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : 0, gcalWindowHeight = (typeof (innerHeight) == 'number') ? innerHeight : (document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : (document.body && document.body.clientHeight) ? document.body.clientHeight : 0; offsetLeft -= (offsetLeft - gcalWidth + parseInt(self.gcalTargetEle.offsetWidth, 10) >= gcalWindowLeft && offsetLeft + gcalWidth > gcalWindowLeft + gcalWindowWidth) ? (gcalWidth - parseInt(self.gcalTargetEle.offsetWidth, 10)) : 0; offsetTop -= (offsetTop - gcalHeight - parseInt(self.gcalTargetEle.offsetHeight, 10) >= gcalWindowTop && offsetTop + gcalHeight > gcalWindowTop + gcalWindowHeight) ? (gcalHeight + parseInt(self.gcalTargetEle.offsetHeight, 10)) : 0
      }
      self.gcalID('gcal_' + CalendarID).style.top = offsetTop + 'px';
      self.gcalID('gcal_' + CalendarID).style.left = offsetLeft + 'px';
      self.gcalID('gcalIframe_' + CalendarID).style.top = offsetTop + 'px';
      self.gcalID('gcalIframe_' + CalendarID).style.left = offsetLeft + 'px';
      self.gcalID('gcalIframe_' + CalendarID).style.width = (self.gcalID('gcal_' + CalendarID).offsetWidth - (self.gcalID('gcalIE_' + CalendarID) ? 2 : 4)) + 'px';
      self.gcalID('gcalIframe_' + CalendarID).style.height = (self.gcalID('gcal_' + CalendarID).offsetHeight - (self.gcalID('gcalIE_' + CalendarID) ? 2 : 4)) + 'px';
      self.gcalID('gcalIframe_' + CalendarID).style.visibility = 'inherit';
      self.gcalID('gcal_' + CalendarID).style.visibility = 'inherit';
   };

   this.gcalHide = function()
   {
      self.gcalID('gcal_' + CalendarID).style.visibility = 'hidden';
      self.gcalID('gcalIframe_' + CalendarID).style.visibility = 'hidden';
      if (typeof gcalNextAction != 'undefined' && gcalNextAction != null)
         gcalNextActionReturn = gcalNextAction(); gcalNextAction = null

      if (document.getElementById('hidCalender'))
      {
         if (document.getElementById('hidCalender').value == 1)
         {
            document.getElementById('hidCalender').value = '';
            if (self.gcalTargetEle)
            {
               try
               {
                  var MSIE = navigator.userAgent.toUpperCase().indexOf('MSIE') > -1 ? true : false;
                  if (MSIE)
                  {
                     self.gcalTargetEle.fireEvent('onchange');
                  }
                  else //For mozilla
                  {
                     var evt = document.createEvent('HTMLEvents');
                     evt.initEvent("change", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                     self.gcalTargetEle.dispatchEvent(evt);
                  }
                  self.gcalTargetEle.focus();
               }
               catch (err) { }
            }
         }
      }
   };

   this.gcalCancel = function(gcalEvt)
   {
      if (gcalClickToHide) { self.gcalHide() } self.gcalStopPropagation(gcalEvt)
   };

   this.gcalStopPropagation = function(gcalEvt)
   {
      if (gcalEvt.stopPropagation) { gcalEvt.stopPropagation() }
      else { gcalEvt.cancelBubble = true }
   };

   this.gcalBeginDrag = function(event)
   {
      var elementToDrag = self.gcalID('gcal_' + CalendarID);
      var deltaX = event.clientX, deltaY = event.clientY, offsetEle = elementToDrag;
      do { deltaX -= parseInt(offsetEle.offsetLeft, 10); deltaY -= parseInt(offsetEle.offsetTop, 10); offsetEle = offsetEle.offsetParent }
      while (offsetEle.tagName != 'BODY' && offsetEle.tagName != 'HTML');
      if (document.addEventListener)
      {
         document.addEventListener('mousemove', moveHandler, true);
         document.addEventListener('mouseup', upHandler, true)
      } else
      {
         elementToDrag.attachEvent('onmousemove', moveHandler);
         elementToDrag.attachEvent('onmouseup', upHandler); elementToDrag.setCapture()
      }
      self.gcalStopPropagation(event);
      function moveHandler(gcalEvt)
      {
         if (!gcalEvt) gcalEvt = window.event;
         elementToDrag.style.left = (gcalEvt.clientX - deltaX) + 'px';
         elementToDrag.style.top = (gcalEvt.clientY - deltaY) + 'px';
         self.gcalID('gcalIframe_' + CalendarID).style.left = (gcalEvt.clientX - deltaX) + 'px';
         self.gcalID('gcalIframe_' + CalendarID).style.top = (gcalEvt.clientY - deltaY) + 'px';
         self.gcalStopPropagation(gcalEvt)
      };
      function upHandler(gcalEvt)
      {
         if (!gcalEvt) gcalEvt = window.event;
         if (document.removeEventListener)
         {
            document.removeEventListener('mousemove', moveHandler, true);
            document.removeEventListener('mouseup', upHandler, true)
         }
         else
         {
            elementToDrag.detachEvent('onmouseup', upHandler);
            elementToDrag.detachEvent('onmousemove', moveHandler);
            elementToDrag.releaseCapture()
         } self.gcalStopPropagation(gcalEvt)
      }
   };

   this.gcalNowOutput = function() { self.gcalSetOutput(gcalDateNow) };

   this.gcalShowMonth = function(gcalBias)
   {
      gcalShowDate = new Date(Date.parse(new Date().toDateString())), gcalStartDate = new Date();
      gcalShowDate.setHours(12);
      gcalSelYears = self.gcalID('gcalYears_' + CalendarID);
      gcalSelMonths = self.gcalID('gcalMonths_' + CalendarID);
      if (gcalSelYears.options.selectedIndex > -1)
      {
         gcalMonthSum = 12 * (gcalSelYears.options.selectedIndex) + gcalBias;
         if (gcalSelMonths.options.selectedIndex > -1)
         {
            gcalMonthSum += gcalSelMonths.options.selectedIndex
         }
      }
      else { if (gcalSelMonths.options.selectedIndex > -1) { gcalMonthSum += gcalSelMonths.options.selectedIndex } }
      gcalShowDate.setFullYear(gcalBaseYear + Math.floor(gcalMonthSum / 12), (gcalMonthSum % 12), 1);
      self.gcalID('gcalWeek_' + CalendarID + '_').style.display = (gcalWeekNumberDisplay) ? '' : 'none';
      if (window.opera)
      {
         self.gcalID('gcalMonths_' + CalendarID).style.display = 'inherit';
         self.gcalID('gcalYears_' + CalendarID).style.display = 'inherit'
      }
      gcalTemp = (12 * parseInt((gcalShowDate.getFullYear() - gcalBaseYear), 10)) + parseInt(gcalShowDate.getMonth(), 10);
      if (gcalTemp > -1 && gcalTemp < (12 * gcalDropDownYears))
      {
         gcalSelYears.options.selectedIndex = Math.floor(gcalMonthSum / 12);
         gcalSelMonths.options.selectedIndex = (gcalMonthSum % 12); gcalCurMonth = gcalShowDate.getMonth();
         gcalShowDate.setDate((((gcalShowDate.getDay() - gcalWeekStart) < 0) ? -6 : 1) + gcalWeekStart - gcalShowDate.getDay());
         var gcalCompareDateValue = new Date(gcalShowDate.getFullYear(), gcalShowDate.getMonth(), gcalShowDate.getDate()).valueOf();
         gcalStartDate = new Date(gcalShowDate);
         if ((new Date(gcalBaseYear + gcalDropDownYears, 0, 0)) > gcalDateNow && (new Date(gcalBaseYear, 0, 0)) < gcalDateNow)
         {
            var gcalNow = self.gcalID('gcalNow_' + CalendarID);

            if (gcalDisabledDates.length == 0)
            {
               if (gcalActiveToday && gcalParmActiveToday)
               {
                  gcalNow.onclick = self.gcalNowOutput; gcalNow.className = 'gcalNow';
                  if (self.gcalID('gcalIE_' + CalendarID))
                  {
                     gcalNow.onmouseover = self.gcalChangeClass; gcalNow.onmouseout = self.gcalChangeClass
                  }
               }
               else
               {
                  gcalNow.onclick = null; gcalNow.className = 'gcalNowDisabled';
                  if (self.gcalID('gcalIE_' + CalendarID))
                  {
                     gcalNow.onmouseover = null;
                     gcalNow.onmouseout = null
                  }
                  if (document.addEventListener)
                  {
                     gcalNow.addEventListener('click', self.gcalStopPropagation, false)
                  }
                  else { gcalNow.attachEvent('onclick', self.gcalStopPropagation) }
               }
            }
            else
            {
               for (var k = 0; k < gcalDisabledDates.length; k++)
               {
                  if (!gcalActiveToday || !gcalParmActiveToday || ((typeof gcalDisabledDates[k] == 'object') && (((gcalDisabledDates[k].constructor == Date) && gcalDateNow.valueOf() == gcalDisabledDates[k].valueOf()) || ((gcalDisabledDates[k].constructor == Array) && gcalDateNow.valueOf() >= gcalDisabledDates[k][0].valueOf() && gcalDateNow.valueOf() <= gcalDisabledDates[k][1].valueOf()))))
                  {
                     gcalNow.onclick = null; gcalNow.className = 'gcalNowDisabled';
                     if (self.gcalID('gcalIE_' + CalendarID))
                     {
                        gcalNow.onmouseover = null;
                        gcalNow.onmouseout = null
                     }
                     if (document.addEventListener)
                     {
                        gcalNow.addEventListener('click', self.gcalStopPropagation, false)
                     }
                     else { gcalNow.attachEvent('onclick', self.gcalStopPropagation) }
                     break
                  }
                  else
                  {
                     gcalNow.onclick = self.gcalNowOutput; gcalNow.className = 'gcalNow';
                     if (self.gcalID('gcalIE_' + CalendarID)) { gcalNow.onmouseover = self.gcalChangeClass; gcalNow.onmouseout = self.gcalChangeClass }
                  }
               }
            }
         }



         var gcalCells = self.gcalID('gcalCells_' + CalendarID);
         for (i = 0; i < gcalCells.childNodes.length; i++)
         {
            var gcalRows = gcalCells.childNodes[i];
            if (gcalRows.nodeType == 1 && gcalRows.tagName == 'TR')
            {
               if (gcalWeekNumberDisplay)
               {
                  gcalTmpEl = gcalRows.childNodes[0];
                  gcalTmpEl.innerHTML = self.gcalWeekNumber(gcalShowDate);
                  gcalTmpEl.style.borderColor = (gcalTmpEl.currentStyle) ? gcalTmpEl.currentStyle['backgroundColor'] : (window.getComputedStyle) ? document.defaultView.getComputedStyle(gcalTmpEl, null).getPropertyValue('background-color') : ''; gcalTmpEl.style.display = ''
               }
               else { gcalRows.childNodes[0].style.display = 'none' }
               for (j = 1; j < gcalRows.childNodes.length; j++)
               {
                  var gcalCols = gcalRows.childNodes[j];
                  if (gcalCols.nodeType == 1 && gcalCols.tagName == 'TD')
                  {
                     gcalRows.childNodes[j].innerHTML = gcalShowDate.getDate();
                     var gcalCell = gcalRows.childNodes[j], gcalDisabled = ((gcalOutOfRangeDisable && (gcalShowDate < (new Date(gcalBaseYear, 0, 1, gcalShowDate.getHours())) || gcalShowDate > (new Date(gcalBaseYear + gcalDropDownYears, 0, 0, gcalShowDate.getHours())))) || (gcalOutOfMonthDisable && (gcalShowDate < (new Date(gcalShowDate.getFullYear(), gcalCurMonth, 1, gcalShowDate.getHours())) || gcalShowDate > (new Date(gcalShowDate.getFullYear(), gcalCurMonth + 1, 0, gcalShowDate.getHours()))))) ? true : false;
                     if (gcalOutOfMonthHide && (gcalShowDate < (new Date(gcalShowDate.getFullYear(), gcalCurMonth, 1, gcalShowDate.getHours())) || gcalShowDate > (new Date(gcalShowDate.getFullYear(), gcalCurMonth + 1, 0, gcalShowDate.getHours()))))
                        gcalCell.style.visibility = 'hidden';
                     else
                        gcalCell.style.visibility = 'inherit';
                     for (var k = 0; k < gcalDisabledDates.length; k++)
                     {
                        if ((typeof gcalDisabledDates[k] == 'object') && (gcalDisabledDates[k].constructor == Date) && gcalCompareDateValue == gcalDisabledDates[k].valueOf())
                        {
                           gcalDisabled = true
                        }
                        else
                        {
                           if ((typeof gcalDisabledDates[k] == 'object') && (gcalDisabledDates[k].constructor == Array) && gcalCompareDateValue >= gcalDisabledDates[k][0].valueOf() && gcalCompareDateValue <= gcalDisabledDates[k][1].valueOf()) { gcalDisabled = true }
                        }
                     }
                     if (gcalDisabled || !gcalEnabledDay[j - 1 + (7 * ((i * gcalCells.childNodes.length) / 6))] || !gcalPassEnabledDay[(j - 1 + (7 * (i * gcalCells.childNodes.length / 6))) % 7])
                     {
                        gcalRows.childNodes[j].onclick = null;
                        if (self.gcalID('gcalIE_' + CalendarID))
                        {
                           gcalRows.childNodes[j].onmouseover = null;
                           gcalRows.childNodes[j].onmouseout = null
                        } gcalCell.className = (gcalShowDate.getMonth() != gcalCurMonth) ? 'gcalCellsExMonthDisabled' : (gcalBlnFullInputDate && gcalShowDate.toDateString() == gcalSeedDate.toDateString()) ? 'gcalInputDateDisabled' : (gcalShowDate.getDay() % 6 == 0) ? 'gcalCellsWeekendDisabled' : 'gcalCellsDisabled'; gcalCell.style.borderColor = (gcalFormatTodayCell && gcalShowDate.toDateString() == gcalDateNow.toDateString()) ? gcalTodayCellBorderColour : (gcalCell.currentStyle) ? gcalCell.currentStyle['backgroundColor'] : (window.getComputedStyle) ? document.defaultView.getComputedStyle(gcalCell, null).getPropertyValue('background-color') : ''
                     }
                     else
                     {
                        gcalRows.childNodes[j].onclick = self.gcalCellOutput;
                        if (self.gcalID('gcalIE_' + CalendarID))
                        {
                           gcalRows.childNodes[j].onmouseover = self.gcalChangeClass; gcalRows.childNodes[j].onmouseout = self.gcalChangeClass
                        }
                        gcalCell.className = (gcalShowDate.getMonth() != gcalCurMonth) ? 'gcalCellsExMonth' : (gcalBlnFullInputDate && gcalShowDate.toDateString() == gcalSeedDate.toDateString()) ? 'gcalInputDate' : (gcalShowDate.getDay() % 6 == 0) ? 'gcalCellsWeekend' : 'gcalCells'; gcalCell.style.borderColor = (gcalFormatTodayCell && gcalShowDate.toDateString() == gcalDateNow.toDateString()) ? gcalTodayCellBorderColour : (gcalCell.currentStyle) ? gcalCell.currentStyle['backgroundColor'] : (window.getComputedStyle) ? document.defaultView.getComputedStyle(gcalCell, null).getPropertyValue('background-color') : ''
                     }
                     gcalShowDate.setDate(gcalShowDate.getDate() + 1);
                     gcalCompareDateValue = new Date(gcalShowDate.getFullYear(), gcalShowDate.getMonth(), gcalShowDate.getDate()).valueOf()
                  }
               }

            }
         }
      }
      if (window.opera)
      {
         self.gcalID('gcalMonths_' + CalendarID).style.display = 'inline';
         self.gcalID('gcalYears_' + CalendarID).style.display = 'inline';
         self.gcalID('gcal_' + CalendarID).style.visibility = 'hidden';
         self.gcalID('gcal_' + CalendarID).style.visibility = 'inherit'
      }
   };

   this.gcalSetOutput = function(gcalOutputDate)
   {
      if (typeof self.gcalTargetEle.value == 'undefined')
      {
         gcalTriggerEle.gcalTextNode.replaceData(0, gcalTriggerEle.gcalLength, gcalOutputDate.gcalFormat(gcalDateOutputFormat))
      } else
      {
         self.gcalTargetEle.value = gcalOutputDate.gcalFormat(gcalDateOutputFormat)
      }
      if (document.getElementById('hidCalender'))
         document.getElementById('hidCalender').value = '1';
      self.gcalHide();
   };

   this.gcalCellOutput = function(gcalEvt)
   {
      var gcalEle = self.gcalEventTrigger(gcalEvt), gcalOutputDate = new Date(gcalStartDate);
      if (gcalEle.nodeType == 3) gcalEle = gcalEle.parentNode;
      gcalOutputDate.setDate(gcalStartDate.getDate() + parseInt(gcalEle.id.substr(9), 10));
      self.gcalSetOutput(gcalOutputDate)
   };

   this.gcalChangeClass = function(gcalEvt)
   {
      var gcalEle = self.gcalEventTrigger(gcalEvt);
      if (gcalEle.nodeType == 3)
      {
         gcalEle = gcalEle.parentNode
      } switch (gcalEle.className)
      {
         case 'gcalCells': gcalEle.className = 'gcalCellsHover'; break;
         case 'gcalCellsHover': gcalEle.className = 'gcalCells'; break;
         case 'gcalCellsExMonth': gcalEle.className = 'gcalCellsExMonthHover'; break;
         case 'gcalCellsExMonthHover': gcalEle.className = 'gcalCellsExMonth'; break;
         case 'gcalCellsWeekend': gcalEle.className = 'gcalCellsWeekendHover'; break;
         case 'gcalCellsWeekendHover': gcalEle.className = 'gcalCellsWeekend'; break;
         case 'gcalNow': gcalEle.className = 'gcalNowHover'; break;
         case 'gcalNowHover': gcalEle.className = 'gcalNow'; break;
         case 'gcalInputDate': gcalEle.className = 'gcalInputDateHover'; break;
         case 'gcalInputDateHover': gcalEle.className = 'gcalInputDate'
      } return true
   };

   this.gcalEventTrigger = function(gcalEvt)
   {
      if (!gcalEvt) { gcalEvt = event }
      return gcalEvt.target || gcalEvt.srcElement
   };

   this.gcalWeekNumber = function(gcalInDate)
   {
      var gcalInDateWeekBase = new Date(gcalInDate);
      gcalInDateWeekBase.setDate(gcalInDateWeekBase.getDate() - gcalInDateWeekBase.getDay() + gcalWeekNumberBaseDay + ((gcalInDate.getDay() > gcalWeekNumberBaseDay) ? 7 : 0));
      var gcalFirstBaseDay = new Date(gcalInDateWeekBase.getFullYear(), 0, 1);
      gcalFirstBaseDay.setDate(gcalFirstBaseDay.getDate() - gcalFirstBaseDay.getDay() + gcalWeekNumberBaseDay);
      if (gcalFirstBaseDay < new Date(gcalInDateWeekBase.getFullYear(), 0, 1))
      {
         gcalFirstBaseDay.setDate(gcalFirstBaseDay.getDate() + 7)
      }
      var gcalStartWeekOne = new Date(gcalFirstBaseDay - gcalWeekNumberBaseDay + gcalInDate.getDay());
      if (gcalStartWeekOne > gcalFirstBaseDay) { gcalStartWeekOne.setDate(gcalStartWeekOne.getDate() - 7) }
      var gcalWeekNo = '0' + (Math.round((gcalInDateWeekBase - gcalFirstBaseDay) / 604800000, 0) + 1);
      return gcalWeekNo.substring(gcalWeekNo.length - 2, gcalWeekNo.length)
   };

   html += "<!--[if IE]><div id='gcalIE_" + CalendarID + "'></div><![endif]-->";
   html += "<!--[if lt IE 7]><div id='gcalIElt7_" + CalendarID + "'></div><![endif]-->";
   html += "<iframe class='gcal' style='padding:1px;vertical-align:middle;position:absolute;z-index:" + gcalZindex + ";top:0px;left:0px;visibility:hidden;width:1px;height:1px;' " + (self.gcalID('gcalIElt7_' + CalendarID) ? "src='/gcalblank.html '" : '') +
         "id='gcalIframe_" + CalendarID + "' name='gcalIframe' frameborder='0'>" + "</iframe>" +
         "<table class='gcal' id='gcal_" + CalendarID + "' style='padding:1px;vertical-align:middle;padding:0px;visibility:hidden;position:absolute;cursor:default;width:200px;top:0px;left:0px;z-index:" + (gcalZindex + 1) + ";text-align:center;'>" +
         "<tr class='gcal' style='padding:1px;vertical-align:middle;'>" +
         "<td class='gcal' style='padding:1px;vertical-align:middle;'>" +
         "<table class='gcalHead' id='gcalHead_" + CalendarID + "' width='100%' " + "cellspacing='0' cellpadding='0'>" +
         "<tr id='gcalDrag_" + CalendarID + "' style='display:none;'>" +
         "<td colspan='4' class='gcalDrag'>" +
         "<span id='gcalDragText_" + CalendarID + "'></span>" +
         "</td>" +
         "</tr>" +
         "<tr class='gcalHead' >" +
         "<td class='gcalHead'>" + "<input class='gcalHead' id='gcalHeadLeft_" + CalendarID + "' type='button' value='<' " + " /></td>" +
         "<td class='gcalHead'>" + "<select id='gcalMonths_" + CalendarID + "' class='gcalHead' " + ">" + "</select>" + "</td>" +
         "<td class='gcalHead'>" + "<select id='gcalYears_" + CalendarID + "' class='gcalHead' " + ">" + "</select>" + "</td>" +
         "<td class='gcalHead'>" + "<input class='gcalHead' id='gcalHeadRight_" + CalendarID + "' type='button' value='>' " + " /></td>" +
         "</tr>" +
         "</table>" +
         "</td>" +
         "</tr>" +
         "<tr class='gcal' style='padding:1px;vertical-align:middle;'>" + "<td class='gcal' style='padding:1px;vertical-align:middle;'>" + "<table class='gcalCells' align='center'>" + "<thead>" +
         "<tr><td class='gcalWeekNumberHead' id='gcalWeek_" + CalendarID + "_' ></td>";
   for (i = 0; i < 7; i++)
   {
      html += "<td class='gcalWeek' id='gcalWeekInit_" + CalendarID + i + "'></td>";
   }
   html += "</tr>" + "</thead>" + "<tbody id='gcalCells_" + CalendarID + "'>";
   for (i = 0; i < 6; i++)
   {
      html += "<tr>" + "<td class='gcalWeekNo' id='gcalWeek_" + CalendarID + "_" + i + "'></td>";
      for (j = 0; j < 7; j++)
      {
         html += "<td class='gcalCells' id='gcalCell_" + (j + (i * 7)) + "'></td>";
      }
      html += "</tr>";
   }
   html += "</tbody>" + "<tfoot>" + "<tr id='gcalFoot_" + CalendarID + "'>" + "<td colspan='8' style='padding:0px;'>" +
         "<table width='100%'>" + "<tr>" + "<td id='gcalClear_" + CalendarID + "' class='gcalClear'>" +
         "<input type='button' id='gcalClearButton_" + CalendarID + "' class='gcalClear' " + " />" +
         "</td>" + "<td class='gcalNow' id='gcalNow_" + CalendarID + "'></td>" + "</tr>" + "</table>" + "</td>" + "</tr>" + "</tfoot>" + "</table>" +
         "</td>" + "</tr>" + "</table>";


   this.init = function()
   {
      if (document.getElementById('gcal_span_' + CalendarID)) return;
      var bdy = document.getElementsByTagName('body')[0];
      var spn = document.createElement('span');
      spn.id = 'gcal_span_' + CalendarID;
      bdy.appendChild(spn);
      spn = document.getElementById('gcal_span_' + CalendarID);
      spn.innerHTML = html;

      if (document.addEventListener)
      {
         self.gcalID('gcal_' + CalendarID).addEventListener('click', self.gcalCancel, false);
         self.gcalID('gcalHeadLeft_' + CalendarID).addEventListener('click', self.gcalStopPropagation, false);
         self.gcalID('gcalMonths_' + CalendarID).addEventListener('click', self.gcalStopPropagation, false);
         self.gcalID('gcalMonths_' + CalendarID).addEventListener('change', self.gcalStopPropagation, false);
         self.gcalID('gcalYears_' + CalendarID).addEventListener('click', self.gcalStopPropagation, false);
         self.gcalID('gcalYears_' + CalendarID).addEventListener('change', self.gcalStopPropagation, false);
         self.gcalID('gcalHeadRight_' + CalendarID).addEventListener('click', self.gcalStopPropagation, false)
         self.gcalID('gcalCells_' + CalendarID).addEventListener('click', self.gcalStopPropagation, false)
         self.gcalID('gcalDrag_' + CalendarID).cells[0].addEventListener('mousedown', self.gcalBeginDrag, false)
         self.gcalID('gcalHeadLeft_' + CalendarID).addEventListener('click', function() { self.gcalShowMonth(-1); }, false)
         self.gcalID('gcalMonths_' + CalendarID).addEventListener('change', function() { self.gcalShowMonth(0); }, false)
         self.gcalID('gcalYears_' + CalendarID).addEventListener('change', function() { self.gcalShowMonth(0); }, false)
         self.gcalID('gcalHeadRight_' + CalendarID).addEventListener('click', function() { self.gcalShowMonth(1); }, false)
         self.gcalID('gcalClearButton_' + CalendarID).addEventListener('click', function() { self.gcalTargetEle.value = ''; self.gcalHide(); }, false)
      }
      else
      {
         self.gcalID('gcal_' + CalendarID).attachEvent('onclick', self.gcalCancel);
         self.gcalID('gcalHeadLeft_' + CalendarID).attachEvent('onclick', self.gcalStopPropagation);
         self.gcalID('gcalMonths_' + CalendarID).attachEvent('onclick', self.gcalStopPropagation);
         self.gcalID('gcalMonths_' + CalendarID).attachEvent('onchange', self.gcalStopPropagation);
         self.gcalID('gcalYears_' + CalendarID).attachEvent('onclick', self.gcalStopPropagation);
         self.gcalID('gcalYears_' + CalendarID).attachEvent('onchange', self.gcalStopPropagation);
         self.gcalID('gcalHeadRight_' + CalendarID).attachEvent('onclick', self.gcalStopPropagation)
         self.gcalID('gcalCells_' + CalendarID).attachEvent('onclick', self.gcalStopPropagation)
         self.gcalID('gcalDrag_' + CalendarID).cells[0].attachEvent('onmousedown', self.gcalBeginDrag)
         self.gcalID('gcalHeadLeft_' + CalendarID).attachEvent('onclick', function() { self.gcalShowMonth(-1); })
         self.gcalID('gcalMonths_' + CalendarID).attachEvent('onchange', function() { self.gcalShowMonth(0); })
         self.gcalID('gcalYears_' + CalendarID).attachEvent('onchange', function() { self.gcalShowMonth(0); })
         self.gcalID('gcalHeadRight_' + CalendarID).attachEvent('onclick', function() { self.gcalShowMonth(1); })
         self.gcalID('gcalClearButton_' + CalendarID).attachEvent('onclick', function() { self.gcalTargetEle.value = ''; self.gcalHide(); })

      }
      if (document.addEventListener)
      {
         document.addEventListener('click', self.gcalHide, false)
      }
      else
      {
         document.attachEvent('onclick', self.gcalHide)
      }
   };

}