// Tigra Calendar v4.0.2 (01/12/2009) American (mm/dd/yyyy)
// http://www.softcomplex.com/products/tigra_calendar/
// Public Domain Software... You're welcome.

// default settins
var A_TCALDEF =
{
  'months' : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
  'weekdays' : ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
  'yearscroll': true, // show year scroller
  'weekstart': 0, // first day of week: 0-Su or 1-Mo
  'centyear'  : 70, // 2 digit years less than 'centyear' are in 20xx, othewise in 19xx.
  'imgpath' : GLURLMVXImagens+'/icones/' // directory with calendar images
}
// date parsing function
function f_tcalParseDate (s_date)
{
  var re_date = /^\s*(\d{1,2})\/(\d{1,2})\/(\d{2,4})\s*$/;
  if (!re_date.exec(s_date)) return alert ("Invalid date: '" + s_date + "'.\nAccepted format is '"+GLFormatoData+"'.");
  var n_day, n_month, n_year;
  switch (GLFormatoData)
  {
    case 'dd/mm/aaaa':
      n_day = Number(RegExp.$1); n_month = Number(RegExp.$2); n_year = Number(RegExp.$3);
    break;
    case 'mm/dd/aaaa':
      n_day = Number(RegExp.$2); n_month = Number(RegExp.$1); n_year = Number(RegExp.$3);
    break;
    default:
      return alert ("Invalid date format: '"+GLFormatoData+"'.");
    break;
  }


  if (n_year < 100) n_year += (n_year < this.a_tpl.centyear ? 2000 : 1900);
  if (n_month < 1 || n_month > 12) return alert ("Invalid month value: '" + n_month + "'.\nAllowed range is 01-12.");
  var d_numdays = new Date(n_year, n_month, 0);
  if (n_day > d_numdays.getDate()) return alert("Invalid day of month value: '" + n_day + "'.\nAllowed range for selected month is 01 - " + d_numdays.getDate() + ".");

  return new Date (n_year, n_month - 1, n_day);
}

// date generating function
function f_tcalGenerDate (d_date)
{
  var result;
  switch (GLFormatoData)
  {
    case 'dd/mm/aaaa':
      result = ((d_date.getDate() < 10 ? '0' : '') + d_date.getDate() + "/" + (d_date.getMonth() < 9 ? '0' : '') + (d_date.getMonth() + 1) + "/" + d_date.getFullYear());
    break;
    case 'mm/dd/aaaa':
      result = ((d_date.getMonth() < 9 ? '0' : '') + (d_date.getMonth() + 1) + "/" + (d_date.getDate() < 10 ? '0' : '') + d_date.getDate() + "/" + d_date.getFullYear());
    break;
    default:
      return alert ("Invalid date format: '"+GLFormatoData+"'.");
    break;
  }
  return result; 
}

// implementation
function tcal (a_cfg, a_tpl)
{
  // apply default template if not specified
  if (!a_tpl) a_tpl = A_TCALDEF;

  // register in global collections
  if (!window.A_TCALS) window.A_TCALS = [];
  if (!window.A_TCALSIDX) window.A_TCALSIDX = [];

  this.s_id = a_cfg.id ? a_cfg.id : A_TCALS.length;
  window.A_TCALS[this.s_id] = this;
  window.A_TCALSIDX[window.A_TCALSIDX.length] = this;

  // assign methods
  this.f_show = f_tcalShow;
  this.f_hide = f_tcalHide;
  this.f_toggle = f_tcalToggle;
  this.f_update = f_tcalUpdate;
  this.f_relDate = f_tcalRelDate;
  this.f_parseDate = f_tcalParseDate;
  this.f_generDate = f_tcalGenerDate;

  // create calendar icon
  this.s_iconId = 'tcalico_' + this.s_id;
  this.e_icon = f_getElement(this.s_iconId);
  if (!this.e_icon)
  {
    document.write('<img src="' + a_tpl.imgpath + 'cal.gif" id="' + this.s_iconId + '" onclick="A_TCALS[\'' + this.s_id +
                   '\'].f_toggle()" class="tcalIcon" alt="Open Calendar" />');
    this.e_icon = f_getElement(this.s_iconId);
  }
  // save received parameters
  this.a_cfg = a_cfg;
  this.a_tpl = a_tpl;
}

function f_tcalShow (d_date)
{
  // find input field
  if (!this.a_cfg.controlname) throw("TC: control name is not specified");
  this.e_input = f_getElement(this.a_cfg.controlname);

  if (!this.e_input || !this.e_input.tagName || this.e_input.tagName != 'INPUT')
    throw("TC: element '" + this.a_cfg.controlname + "' does not exist or is not of INPUT type.");

  // dynamically create HTML elements if needed
  this.e_div = f_getElement('tcal');
  if (!this.e_div)
  {
    this.e_div = document.createElement("DIV");
    this.e_div.id = 'tcal';
    document.body.appendChild(this.e_div);
  }

  this.e_iframe =  f_getElement('tcalIF')
  if (b_ieFix && !this.e_iframe)
  {
    this.e_iframe = document.createElement("IFRAME");
    this.e_iframe.style.filter = 'alpha(opacity=0)';
    this.e_iframe.id = 'tcalIF';
    this.e_iframe.src = this.a_tpl.imgpath + 'pixel.gif';
    document.body.appendChild(this.e_iframe);
  }

  // hide all calendars
  f_tcalHideAll();

  // generate HTML and show calendar
  this.e_icon = f_getElement(this.s_iconId);
  if (!this.f_update()) return;

  this.e_div.style.visibility = 'visible';
  if (this.e_iframe) this.e_iframe.style.visibility = 'visible';

  // change icon and status
  this.e_icon.title = 'Close Calendar';
  this.b_visible = true;
}

function f_tcalHide (n_date)
{
  if (n_date) this.e_input.value = this.f_generDate(new Date(n_date));

  // no action if not visible
  if (!this.b_visible) return;

  // hide elements
  if (this.e_iframe) this.e_iframe.style.visibility = 'hidden';
  this.e_div.style.visibility = 'hidden';

  // change icon and status
  this.e_icon = f_getElement(this.s_iconId);
  this.e_icon.src = this.a_tpl.imgpath + 'cal.gif';
  this.e_icon.title = 'Open Calendar';
  this.b_visible = false;
}

function f_tcalToggle ()
{
  return this.b_visible ? this.f_hide() : this.f_show();
}

function f_tcalUpdate (d_date)
{
  var d_client = new Date();
  d_client.setHours(0);
  d_client.setMinutes(0);
  d_client.setSeconds(0);
  d_client.setMilliseconds(0);

  var d_today = this.a_cfg.today ? this.f_parseDate(this.a_cfg.today) : d_client;
  var d_selected = this.e_input.value == '' ? (this.a_cfg.selected ? this.f_parseDate(this.a_cfg.selected) : d_today) : this.f_parseDate(this.e_input.value.substring(0,10));

  // figure out date to display
  if (!d_date)
    // selected by default
    d_date = d_selected;
  else if (typeof(d_date) == 'number')
    // get from number
    d_date = new Date(d_date);
  else if (typeof(d_date) == 'string')
    // parse from string
    this.f_parseDate(d_date);

  if (!d_date) return false;

  // first date to display
  var d_firstday = new Date(d_date);
  d_firstday.setDate(1);
  d_firstday.setDate(1 - (7 + d_firstday.getDay() - this.a_tpl.weekstart) % 7);

  var a_class, s_html = '<table class="ctrl"><tbody><tr>'
    + (this.a_tpl.yearscroll ? '<td' + this.f_relDate(d_date, -1, 'y') + ' title="Previous Year">&laquo;</td>' : '')
    + '<td' + this.f_relDate(d_date, -1) + ' title="Previous Month">&lt;</td><th>'
    + this.a_tpl.months[d_date.getMonth()] + ' ' + d_date.getFullYear()
      + '</th><td' + this.f_relDate(d_date, 1) + ' title="Next Month">&gt;</td>'
    + (this.a_tpl.yearscroll ? '<td' + this.f_relDate(d_date, 1, 'y') + ' title="Next Year">&raquo;</td></td>' : '')
    + '</tr></tbody></table><table><tbody><tr class="wd">';

  // print weekdays titles
  for (var i = 0; i < 7; i++)
    s_html += '<th>' + this.a_tpl.weekdays[(this.a_tpl.weekstart + i) % 7] + '</th>';
  s_html += '</tr>' ;

  // print calendar table
  var d_current = new Date(d_firstday);
  while (d_current.getMonth() == d_date.getMonth() || d_current.getMonth() == d_firstday.getMonth())
  {
    // print row heder
    s_html +='<tr>';
    for (var n_wday = 0; n_wday < 7; n_wday++) {

      a_class = [];
      // other month
      if (d_current.getMonth() != d_date.getMonth())
        a_class[a_class.length] = 'othermonth';
      // weekend
      if (d_current.getDay() == 0 || d_current.getDay() == 6)
        a_class[a_class.length] = 'weekend';
      // today
      if (d_current.valueOf() == d_today.valueOf())
        a_class[a_class.length] = 'today';
      // selected
      if (d_current.valueOf() == d_selected.valueOf())
        a_class[a_class.length] = 'selected';

      s_html += '<td onclick="A_TCALS[\'' + this.s_id + '\'].f_hide(' + d_current.valueOf() + ')"' + (a_class.length ? ' class="' + a_class.join(' ') + '">' : '>') + d_current.getDate() + '</td>'
      d_current.setDate(d_current.getDate() + 1);
    }
    // print row footer
    s_html +='</tr>';
  }
  s_html +='</tbody></table>';

  // update HTML, positions and sizes
  this.e_div.innerHTML = s_html;

  var n_width  = this.e_div.offsetWidth;
  var n_height = this.e_div.offsetHeight;
  var n_top  = f_getPosition (this.e_icon, 'Top') + this.e_icon.offsetHeight;
  var n_left = f_getPosition (this.e_icon, 'Left') - n_width + this.e_icon.offsetWidth;
  if (n_left < 0) n_left = 0;

  this.e_div.style.left = n_left + 'px';
  this.e_div.style.top  = n_top + 'px';

  if (this.e_iframe)
  {
    this.e_iframe.style.left = n_left + 'px';
    this.e_iframe.style.top  = n_top + 'px';
    this.e_iframe.style.width = (n_width + 6) + 'px';
    this.e_iframe.style.height = (n_height + 6) +'px';
  }
  return true;
}

function f_getPosition (e_elemRef, s_coord)
{
  var n_pos = 0, n_offset, e_elem = e_elemRef;

  while (e_elem)
  {
    n_offset = e_elem["offset" + s_coord];
    n_pos += n_offset;
    e_elem = e_elem.offsetParent;
  }
  // margin correction in some browsers
  if (b_ieMac)
    n_pos += parseInt(document.body[s_coord.toLowerCase() + 'Margin']);
  else if (b_safari)
    n_pos -= n_offset;

  e_elem = e_elemRef;
  while (e_elem != document.body)
  {
    n_offset = e_elem["scroll" + s_coord];
    if (n_offset && e_elem.style.overflow == 'scroll')
      n_pos -= n_offset;
    e_elem = e_elem.parentNode;
  }
  return n_pos;
}

function f_tcalRelDate (d_date, d_diff, s_units)
{
  var s_units = (s_units == 'y' ? 'FullYear' : 'Month');
  var d_result = new Date(d_date);
  d_result['set' + s_units](d_date['get' + s_units]() + d_diff);
  if (d_result.getDate() != d_date.getDate())
    d_result.setDate(0);
  return ' onclick="A_TCALS[\'' + this.s_id + '\'].f_update(' + d_result.valueOf() + ')"';
}

function f_tcalHideAll()
{
  if(window.A_TCALSIDX) for (var i = 0; i < window.A_TCALSIDX.length; i++)  window.A_TCALSIDX[i].f_hide();
}

f_getElement = document.all ? function (s_id) { return document.all[s_id] } : function (s_id) { return document.getElementById(s_id) };

if (document.addEventListener) window.addEventListener('scroll', f_tcalHideAll, false);
if (window.attachEvent) window.attachEvent('onscroll', f_tcalHideAll);

// global variables
var s_userAgent = navigator.userAgent.toLowerCase();
var re_webkit = /WebKit\/(\d+)/i;
var b_mac = s_userAgent.indexOf('mac') != -1;
var b_ie5 = s_userAgent.indexOf('msie 5') != -1;
var b_ie6 = s_userAgent.indexOf('msie 6') != -1 && s_userAgent.indexOf('opera') == -1;
var b_ieFix = b_ie5 || b_ie6;
var  b_ieMac  = b_mac && b_ie5;
var  b_safari = b_mac && re_webkit.exec(s_userAgent) && Number(RegExp.$1) < 500;
