Your IP : 18.219.40.177


Current Path : /usr/local/mgr5/skins/orion/src/
Upload File :
Current File : //usr/local/mgr5/skins/orion/src/App.Calendar.js

/**
 * Calendar module
 *
 * show calendar
 *  @param {object} window  global object
 *  @param {function} $ jQuery library
 *  @param {object} em EventMgr library
 */
App.Calendar = function(window, $, em) {
  'use strict';
  function init() {
    loadMessages();
  }

  function addListeners() {
    em.on($calCont(), toolsSelector, 'click', toolMouseupRep);
    em.on($calCont(), calMonthSel, 'click', chooseMonthHandler);
    em.on($calCont(), daysSelector, 'click', daysMousedownRep);
    em.on($calCont(), calMonthSelector, 'mousedown', toolMousedownRep);
    em.on($calCont(), calYearSelector, 'mousedown', toolMousedownRep);
    em.on($calMonthCombo(), calComboboxSelector, 'mouseup', comboMouseupRep);
    em.on($calYearCombo(), calComboboxSelector, 'mouseup', comboMouseupRep);
    em.on($calYearCombo(), calComboboxSelector, 'mouseover', comboMouseover);
    em.on($calYearCombo(), calComboboxSelector, 'mouseout', comboMouseout);
    em.on($calMonthCombo(), calComboboxSelector, 'mouseover', comboMouseover);
    em.on($calMonthCombo(), calComboboxSelector, 'mouseout', comboMouseout);
    addedListener = true;
  }

  var addedListener = false,
      isIe = (/msie/i.test(navigator.userAgent) &&
      !/opera/i.test(navigator.userAgent)),
      clActive = false,
      clCalendar = null,
      clCalendarCell = null,
      clField = null,
      clDate = null,
      clTimeout = null,
      clTtool = null,
      clElYears = null,
      clElMonths = null,
      clElHead = null,
      clElDays = null,
      clElDaysTbody = null,
      clSyncField = null,
      clMsgMonths = ['January', 'February', 'March', 'April', 'May', 'June',
        'July', 'August', 'September', 'October', 'November', 'December'],
      clMsgSmonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug',
        'Sep', 'Oct', 'Nov', 'Dec'],
      clMsgWdays = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
      calMonthSelector = '#calmonth',
      calYearSelector = '#calyear',
      toolsSelector = '.cl-tool-td',
      daysSelector = 'td.cl-days',
      calComboboxSelector = ' div',
      calMonthSel = '.b-cal__month',
      pageInfo = window.pageInfo;

  function loadMessages() {
    var i;
    for (i = 0; i < 12; i++) {
      clMsgMonths[i] = pageInfo.calendar['m' + i];
      clMsgSmonths[i] = pageInfo.calendar['ms' + i];
    }
    for (i = 0; i < 7; i++) { clMsgWdays[i] = pageInfo.calendar['w' + i]; }
  }

  function $calCont() {
    return $('#calendar');
  }

  function $calMonthCombo() {
    return $('#calendar-m');
  }

  function $calYearCombo() {
    return $('#calendar-y');
  }

  function getHtmlNodes() {
    if (!clCalendar) {
      clCalendar = document.getElementById('calendar');
      if (!clCalendar) {
        clCalendar = document.createElement('div');
        clCalendar.setAttribute('class', 'cl');
        clCalendar.setAttribute('id', 'calendar');
        clCalendarCell = document.createElement('div');
        clCalendarCell.setAttribute('class', 'cl-cell');
        clCalendarCell.setAttribute('id', 'calendar-cell');
        clCalendar.appendChild(clCalendarCell);
        document.body.appendChild(clCalendar);
      }
    }
    if (!clCalendarCell) {
      clCalendarCell = document.getElementById('calendar-cell');
    }
    if (!clElYears) {
      clElYears = document.getElementById('calendar-y');
      if (!clElYears) {
        clElYears = document.createElement('div');
        clElYears.setAttribute('id', 'calendar-y');
        clElYears.setAttribute('class', 'cl-ym-y');
        document.body.appendChild(clElYears);
      }
    }
    if (!clElMonths) {
      clElMonths = document.getElementById('calendar-m');
      if (!clElMonths) {
        clElMonths = document.createElement('div');
        clElMonths.setAttribute('id', 'calendar-m');
        clElMonths.setAttribute('class', 'cl-ym-m');
        document.body.appendChild(clElMonths);
      }
    }
    if (!addedListener) {
      addListeners();
    }
  }

  function setPosition(e) {
    // Set position
    // Get object which fire even
    var obj = (e.target) ? e.target : e.srcElement,
        ipos = $(obj).offset(),
        windowWidth = window.innerWidth,
        windowHeight = window.innerHeight,
        cWidth = clCalendar.offsetWidth,
        cHeight = clCalendar.offsetHeight,
        x = ipos.left - cWidth + obj.offsetWidth,
        y = ipos.top + obj.offsetHeight - 1,
        diffY = windowHeight - (y + cHeight),
        diffX = windowWidth - (x + cWidth);
    if (diffX < 0) {
      x = windowWidth - cWidth;
    }
    if (diffY < 0) {
      y = ipos.top - cHeight;
    }
    if (isIe) { x += 1; }
    clCalendar.style.left = x + 'px';
    clCalendar.style.top = y + 'px';
    clCalendar.style.visibility = 'visible';
    clActive = true;
  }

  var calTempl = '<div class="b-cal">' +
      '<div class="b-cal__head cl-head">' +
      '<div class="cl-tool-td" id="prevY"><div class="t-inner"></div></div>' +
      '<div class="cl-tool-td" id="calyear">{{=it.cYear}}</div>' +
      '<div class="cl-tool-td" id="nextY"><div class="t-inner"></div></div>' +
      '<div class="cl-tool-td b-cal__today" id="curMonth"></div>' +
      '</div>' +
      '<div class="cl-days-wrapper b-cal__month-wrapper">' +
      '{{~it.months :value :index}}' +
      '<div class="b-cal__month ' +
          '{{?index === it.month}}b-cal__month_selected{{?}}"' +
          ' data-value="{{=index}}">' +
      '{{=value}}' +
      '</div>' +
      '{{~}}' +
      '</div>' +
      '</div>',
      calTemplFunc = window.doT.template(calTempl);

  /**
   * show Month calendar
   * @param {object} field current field HTML node
   * @param {object} syncField HTML node
   * @param {object} e event object
   */
  function showMonthCal(field, syncField, e) {

    getHtmlNodes();

    buildComboBox();

    document.onmousedown = checkOutclick;

    clField = field;
    clSyncField = syncField;
    clDate = parseDate(field.value, true);

    var html = calTemplFunc({
      cYear: clDate.getFullYear(),
      months: clMsgMonths,
      month: clDate.getMonth()
    });

    clCalendar.setAttribute('data-type', 'month');

    clCalendarCell.innerHTML = html;

    setPosition(e);
  }

  function chooseMonthHandler(e) {
    e.preventDefault();
    if (!this) { return; }
    var month = this.getAttribute('data-value'),
        year = clDate.getFullYear();
    month -= 0;
    setMonth(year, month + 1);
    hide();
  }

  function showRep(field, syncField, e) {
    e = e || window.event;

    getHtmlNodes();

    // Register events
    document.onmousedown = checkOutclick;

    // Parse field date
    clField = field;
    clSyncField = syncField;
    clDate = parseDate(clField.value);

    // Draw calendar
    drawCalendarRep();
    drawDateRep(clDate);

    setPosition(e);
  }

  function hideRep() {
    if (!clCalendar) { clCalendar = document.getElementById('calendar'); }
    document.onmouseup = null;
    document.onmousedown = null;
    clCalendar.style.visibility = 'hidden';
    clActive = false;
  }

  function buildComboBox() {
    // COMBO BOXES
    if (clElYears.innerHTML !== '') { return; }
    var i;
    for (i = 0; i < 12; i++) {
      var elDiv = document.createElement('div');
      elDiv.id = 'ycombo' + i;
      elDiv.className = (i % 2 === 0) ? 'cl-ym-div' : 'cl-ym-diveven';
      elDiv.innerHTML = 'y ' + i;

      clElYears.appendChild(elDiv);

      elDiv = document.createElement('div');
      elDiv.id = 'mcombo' + i;
      elDiv.className = (i % 2 === 0) ? 'cl-ym-div' : 'cl-ym-diveven';
      elDiv.innerHTML = 'm ' + i;

      clElMonths.appendChild(elDiv);
    }
    // COMBO BOXES
  }

  function drawCalendarRep() {
    if (clElHead && clCalendar.getAttribute('data-type') === 'default') {
      return;
    }
    var i;
    clCalendarCell.innerHTML = '';
    // HEAD
    clElHead = document.createElement('div');
    clElHead.className = 'cl-head';

    clCalendarCell.appendChild(clElHead);
    clCalendar.setAttribute('data-type', 'default');
    clElHead.innerHTML = '';
    //HEAD

    buildComboBox();
    // TOOLBAR and DAYS
    var elWrDays = document.createElement('div');
    elWrDays.className = 'cl-days-wrapper';
    clCalendarCell.appendChild(elWrDays);
    clElDays = document.createElement('table');
    clElDays.className = 'cl-days';
    elWrDays.appendChild(clElDays);

    clElDaysTbody = document.createElement('tbody');
    clElDays.appendChild(clElDaysTbody);

    var toolcontent = {
      prevM: '.',
      calmonth: '',
      nextM: '.',
      prevY: '.',
      calyear: '',
      nextY: '.',
      today: ''
    };
    /* jslint forin:true */
    for (var keyVar in toolcontent) {
      var elToolTd = document.createElement('div');
      elToolTd.className = 'cl-tool-td';
      elToolTd.id = keyVar;
      elToolTd.setAttribute('unselectable', true);
      if (toolcontent[keyVar] === '.') {
        elToolTd.innerHTML = '<div class="t-inner"></div>';
      } else {
        elToolTd.innerHTML = toolcontent[keyVar];
      }

      clElHead.appendChild(elToolTd);
    }
    var emptyRow = document.createElement('tr');
    clElDaysTbody.appendChild(emptyRow);

    for (i = 0; i < 7; i++) {
      var elDaysTr = document.createElement('tr');
      if (i === 0) { elDaysTr.className = 'cl-dayst-tr'; }
      clElDaysTbody.appendChild(elDaysTr);

      for (var j = 0; j < 7; j++) {
        var elDaysTd = document.createElement('td');
        if (j === 6) { elDaysTd.style.borderRightWidth = 0; }
        elDaysTd.innerHTML = (i === 0) ? clMsgWdays[j] : '&nbsp;';
        if (j === 0) {
          addClass(elDaysTd, 'cl-first');
        } else if (j === 6) {
          addClass(elDaysTd, 'cl-last');
        }

        elDaysTr.appendChild(elDaysTd);
      }
    }
    // TOOLBAR and DAYS
  }
  /**
   * Draw calendar dates
   * @param {Date} cdate current Date object
   */
  function drawDateRep(cdate) {
    var cyear = cdate.getFullYear();
    var cmon = cdate.getMonth();
    var cday = cdate.getDate();
    var cyearb, cmonb;
    if (cmon === 0) {
      cyearb = cyear - 1;
      cmonb = 11;
    } else {
      cyearb = cyear;
      cmonb = cmon - 1;
    }
    var elMonth = document.getElementById('calmonth');
    var elYear = document.getElementById('calyear');

    elYear.innerHTML = cyear;

    if (!elMonth) { return; }
    elMonth.innerHTML = clMsgMonths[cmon];

    // 1th week day
    var firstdayDate = new Date(cdate.getFullYear(), cdate.getMonth(),
        cdate.getDate());
    firstdayDate.setDate(1);
    var startWday = firstdayDate.getDay();
    if (startWday === 0) { startWday = 7; }

    // last day in month
    var lastDay = getLastday(cyear, cmon);
    var lastDayBehind = getLastday(cyearb, cmonb);
    var cb = lastDayBehind - (startWday - 2);
    var showRows = [1, 1, 1, 1, 1, 1, 1, 1];
    var c = 1;
    var nextm = 1;
    var innerTd;
    for (var i = 2; i < 8; i++) {

      for (var j = 0; j < 7; j++) {
        clElDays.rows[i].className = '';
        if (i % 2 === 0) {
          clElDays.rows[i].cells[j].className = 'cl-days';
        } else {
          clElDays.rows[i].cells[j].className = 'cl-even cl-days';
        }
        if (j >= 5) { addClass(clElDays.rows[i].cells[j], 'cl-weekend'); }
        clElDays.rows[i].cells[j].id = '';
        //prev month
        if (i === 2 && j + 1 < startWday) {
          // ******
          //even day
          if (i % 2 === 0) {
            clElDays.rows[i].cells[j].className = 'cl-behind cl-days';
          } else {
            clElDays.rows[i].cells[j].className = 'cl-even cl-behind cl-days';
          }
          //weekend
          if (j >= 5) { addClass(clElDays.rows[i].cells[j], 'cl-weekend'); }
          innerTd = '<div class="inner-td">' + cb + '</div>';
          clElDays.rows[i].cells[j].innerHTML = innerTd;
          clElDays.rows[i].cells[j].id = cb;
          //add event behind day

          cb++;
        //next month
        } else if (c > lastDay) {
          // ******
          //even day
          if (i % 2 === 0) {
            clElDays.rows[i].cells[j].className = 'cl-days cl-future';
          } else {
            clElDays.rows[i].cells[j].className = 'cl-even cl-future cl-days';
          }
          //weekend
          if (j >= 5) { addClass(clElDays.rows[i].cells[j], 'cl-weekend'); }
          innerTd = '<div class="inner-td">' + nextm + '</div>';
          clElDays.rows[i].cells[j].innerHTML = innerTd;
          clElDays.rows[i].cells[j].id = nextm;
          nextm++;
          if (j === 0) { showRows[i] = 0; }
          //current month
        } else {
          innerTd = '<div class="inner-td">' + c + '</div>';
          clElDays.rows[i].cells[j].innerHTML = innerTd;
          if (c === cday) {
            addClass(clElDays.rows[i].cells[j], 'cl-selected');
          }
          c++;
        }
        if (j === 0) {
          addClass(clElDays.rows[i].cells[j], 'cl-first');
        } else if (j === 6) {
          addClass(clElDays.rows[i].cells[j], 'cl-last');
        }
        if (i === 2) {
          clElDays.rows[i].className = 'first-row';
        } else if (i === 7) {
          if (showRows[i] !== 0) {
            clElDays.rows[i].className = 'last-row';
          } else {
            clElDays.rows[i - 1].className = 'last-row';
          }
        }
      }
    }

    for (var ii = 5; ii < showRows.length; ii++) {
      if (showRows[ii] === 1) {
        clElDays.rows[ii].style.display = 'table-row';
      } else {
        clElDays.rows[ii].style.display = 'none';
      }
    }
  }

  /////// Select clicked day
  function daysMousedownRep(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = (e.target) ? e.target : e.srcElement,
        inner = obj.innerHTML;
    if (!String(inner).match(/\d+/)) { return; }
    /* jslint validthis: true */
    inner = inner.replace(/\D[^\.]/g, '');
    var self = $(this),
        cday = parseInt(inner, 10);
    /* jslint validthis: false */
    if (self.hasClass('cl-behind')) {
      clDate.setMonth(clDate.getMonth() - 1, cday);
    } else if (self.hasClass('cl-future')) {
      clDate.setMonth(clDate.getMonth() + 1, cday);
    } else {
      if (isNaN(cday)) { return; }
    }

    setDate(clDate.getFullYear(), (clDate.getMonth() + 1), cday);
    hideRep();
    stopEvent(e);
  }

  /**
   * set month & year in input
   * @param {Number} y year XXXX
   * @param {Number|String} m month XX
   */
  function setMonth(y, m) {
    if (m < 10) { m = '0' + String(m); }
    if (clField.getAttribute('readonly') === null) {
      var value = y + '-' + m;
      clField.value = value;
      $(clField).trigger('change');
      if (clSyncField && clSyncField.value === '') {
        clSyncField.value = value;
        $(clSyncField).trigger('change');
      }
    }
  }

  /**
   * set full date in input
   * @param {Number|String} y year XXXX
   * @param {Number|String} m month XX
   * @param {Number|String} d day XX
   */
  function setDate(y, m, d) {
    if (m < 10) { m = '0' + String(m); }
    if (d < 10) { d = '0' + String(d); }
    if (clField.getAttribute('readonly') === null) {
      var value = y + '-' + m + '-' + d;
      clField.value = value;
      $(clField).trigger('change');
      if (clSyncField && clSyncField.value === '') {
        clSyncField.value = value;
        $(clSyncField).trigger('change');
      }
    }
  }

  function getLastday(y, m) {
    var months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if (m === 1 && (y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0))) {
      return 29;
    } else { return months[m]; }
  }

  function applyCurMonth() {
    $('.b-cal__month_selected').removeClass('b-cal__month_selected');
    $('.b-cal__month[data-value="' + clDate.getMonth() + '"]').
        addClass('b-cal__month_selected');
    $('#calyear').html(clDate.getFullYear());
  }

  function toolMouseupRep(e) {
    e = e || window.event;
    // Get object which fire event
    /* jslint validthis: true */
    var obj = this;
    /* jslint validthis: false */
    var cday = clDate.getDate();
    var cmonth = clDate.getMonth();
    var cyear = clDate.getFullYear();
    var lastDay, todayDate;
    clDate.setDate(1);
    if (obj.id === 'prevY') {
      clDate.setFullYear(clDate.getFullYear() - 1);
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else { clDate.setDate(cday); }
      drawDateRep(clDate);
    } else if (obj.id === 'prevM') {
      clDate.setMonth(clDate.getMonth() - 1);
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else { clDate.setDate(cday); }
      drawDateRep(clDate);
    } else if (obj.id === 'today') {
      todayDate = new Date();
      if (todayDate.getFullYear() === cyear &&
          todayDate.getMonth() === cmonth && todayDate.getDate() === cday) {
        setDate(cyear, (cmonth + 1), cday);
        hide();
      } else {
        clDate = todayDate;
        drawDateRep(clDate);
      }
    } else if (obj.id === 'curMonth') {
      todayDate = new Date();
      if (todayDate.getFullYear() === cyear &&
          todayDate.getMonth() === cmonth) {
        setMonth(cyear, cmonth + 1);
        hide();
      } else {
        clDate = todayDate;
        applyCurMonth();
      }
    } else if (obj.id === 'nextM') {
      clDate.setMonth(clDate.getMonth() + 1);
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else { clDate.setDate(cday); }
      drawDateRep(clDate);
    } else if (obj.id === 'nextY') {
      clDate.setFullYear(clDate.getFullYear() + 1);
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else { clDate.setDate(cday); }
      drawDateRep(clDate);
    }
    stopEvent(e);
  }

  /**
   * Year & month click handler
   * @param {object} e event object
   */
  function toolMousedownRep(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = (e.target) ? e.target : e.srcElement;
    clTtool = obj;

    if (obj.id === 'calyear') {
      if (clTimeout) { clearTimeout(clTimeout); }
      clTimeout = setTimeout(function() {
        showYear();
      }, 250);
      document.onmouseup = hideMyRep;
    } else if (obj.id === 'calmonth') {
      if (clTimeout) { clearTimeout(clTimeout); }
      clTimeout = setTimeout(function() {
        showMonths();
      }, 250);
      document.onmouseup = hideMyRep;
    }
    stopEvent(e);
  }

  function hideMyRep() {
    if (clTimeout) { clearTimeout(clTimeout); }
    document.onmouseup = null;
    clElYears.style.visibility = 'hidden';
    clElMonths.style.visibility = 'hidden';
    if (clTtool) { removeClass(clTtool, 'cl-tool-selected'); }
  }

  function showMonths() {
    var cmonth = clDate.getMonth();
    for (var i = 0; i < 12; i++) {
      clElMonths.childNodes[i].innerHTML = clMsgSmonths[i];
      if (cmonth === i) {
        addClass(clElMonths.childNodes[i], 'cl-ym-selected');
      } else { removeClass(clElMonths.childNodes[i], 'cl-ym-selected'); }
    }

    var pos = $(clTtool).offset();

    var x = (clTtool.id === 'calmonth') ? pos.left :
        pos.left + clTtool.offsetWidth - clElMonths.offsetWidth;
    if (isIe) { x += 1; }
    clElMonths.style.left = x + 'px';
    clElMonths.style.top = pos.top + clTtool.offsetHeight - 1 + 'px';
    clElMonths.style.visibility = 'visible';
    addClass(clTtool, 'cl-tool-selected');
  }
  /**
   * Show years combo box
   */
  function showYear() {
    var cyear = clDate.getFullYear();
    cyear += 12;
    for (var i = 0; i < 12; i++) {
      clElYears.childNodes[i].innerHTML = cyear - 1 - i * 2;
    }
    var pos = $(clTtool).offset();
    //var pos = mn_get_obj_pos(clTtool);
    var x = (clTtool.id === 'calyear') ? pos.left - 1 :
        pos.left + clTtool.offsetWidth - clElYears.offsetWidth + 1;
    if (isIe) { x += 1; }
    clElYears.style.left = x + 'px';
    clElYears.style.top = pos.top + clTtool.offsetHeight - 1 + 'px';
    clElYears.style.visibility = 'visible';
    addClass(clTtool, 'cl-tool-selected');
  }
  /**
   * close calendar
   */
  function hide() {
    if (!clCalendar) { clCalendar = document.getElementById('calendar'); }
    document.onmousedown = null;
    clCalendar.style.visibility = 'hidden';
    clActive = false;
  }
  /**
   * Out caledar click handler
   * close calendar
   * @param {object} e event object
   */
  function checkOutclick(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = (e.target) ? e.target : e.srcElement;
    while (obj.parentNode) {
      if (obj.id === 'calendar') {
        return;
      }
      obj = obj.parentNode;
    }
    hide();
  }

  /**
   * Combo month & year click handler
   * show chosen year or month
   * @param {object} e event object
   */
  function comboMouseupRep(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = (e.target) ? e.target : e.srcElement;

    var cday = clDate.getDate();
    var lastDay;
    clDate.setDate(1);
    if (String(obj.id).match(/ycombo/)) {
      clDate.setFullYear(parseInt(obj.innerHTML, 10));
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else { clDate.setDate(cday); }
      drawDateRep(clDate);
    } else if (String(obj.id).match(/mcombo(\d+)/)) {
      clDate.setMonth(parseInt(RegExp.$1, 10));
      lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
      if (lastDay < cday) {
        clDate.setDate(lastDay);
      } else { clDate.setDate(cday); }
      drawDateRep(clDate);
    }
  }

  function parseDate(str, month) {
    var isfieldok = false,
        fy = null,
        fm = null,
        fd = null;
    if (month) {
      if (String(str).match(/^(\d\d\d\d)-(\d+)/)) {
        fy = parseInt(RegExp.$1, 10);
        fm = parseInt(RegExp.$2, 10);
        fd = 1;
        if (!isNaN(fy) && !isNaN(fm)) {
          fm -= 1;
          isfieldok = true;
        }
      }
    } else {
      if (String(str).match(/^(\d\d\d\d)-(\d+)-(\d+)/)) {
        fy = parseInt(RegExp.$1, 10);
        fm = parseInt(RegExp.$2, 10);
        fd = parseInt(RegExp.$3, 10);
        if (!isNaN(fy) && !isNaN(fm) && !isNaN(fd)) {
          fm -= 1;
          isfieldok = true;
        }
      }
    }
    var rdate = null;
    if (isfieldok) {
      rdate = new Date(fy, fm, fd);
    } else {
      rdate = new Date();
    }

    return rdate;
  }


  function comboMouseover(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = (e.target) ? e.target : e.srcElement;
    addClass(obj, 'cl-ym-hover');
  }

  function comboMouseout(e) {
    e = e || window.event;
    // Get object which fire event
    var obj = (e.target) ? e.target : e.srcElement;
    removeClass(obj, 'cl-ym-hover');
  }

  // Remove class from element
  function removeClass(el, name) {
    if (!(el && el.className)) { return; }
    var cls = el.className.split(' ');
    var ar = [];
    for (var i = cls.length; i > 0;) {
      if (cls[--i] !== name) { ar[ar.length] = cls[i]; }
    }
    el.className = ar.join(' ');
  }

  // Add class to element
  function addClass(el, name) {
    removeClass(el, name);
    el.className += ' ' + name;
  }

  function stopEvent(e) {
    e = e || window.event;
    if (isIe) {
      e.cancelBubble = true; e.returnValue = false;
    } else {
      e.preventDefault(); e.stopPropagation();
    }
    return false;
  }


  return {
    init: init,
    show: showRep,
    showMonth: showMonthCal
  };
}(window, $, EventMgr);

/*
 try {
  if ( pageInfo.calendar['today'] ) clMsgToday = pageInfo.calendar['today'];
 } catch (ex) {}
 for ( var i=0; i<12; i++ ) {
 clMsgMonths[i] = pageInfo.calendar['m' + i];
  clMsgSmonths[i] = pageInfo.calendar['ms' + i]; }
 for ( var i=0; i<7; i++ ) { clMsgWdays[i] = pageInfo.calendar['w' + i];; }
 */