var opts;

/*-----------------------------------------------------------------------------------------*/

var def_opts = {
  firstDay: 1,
  
  field1: '#target_checkin', 
  field2: '#target_checkout',
  trigger1: '#lnk_target_checkin',
  trigger2: '#lnk_target_checkout',
  wrapper1: '#div_target_checkin', 
  wrapper2: '#div_target_checkout', 
  show_speed: ( $.browser.msie ? 0 : 200 ),
  cur_date: new Date()
  
};  

var langs = {
  closeText: 'Uždaryti',
  prevText: '&#x3c;Atgal',
  nextText: 'Pirmyn&#x3e;',
  currentText: 'Šiandien',
  monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis', 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
  dayNames: ['Pr','An','Tr','Ke','Pe','Še','Se']
};

/*-----------------------------------------------------------------------------------------*/
  
function DS_init(user_opts)
{
  $.extend(user_opts, def_opts);
  opts = user_opts;
  user_opts = null;
  
  $(opts.wrapper1).html('');
  $(opts.wrapper1).hide();
  
  $(opts.wrapper2).html('');
  $(opts.wrapper2).hide();

  $(opts.trigger1).click(function(e) {
    DS_show(1);
    return false;
  });
  
  $(opts.field1).click(function(e) {
    DS_show(1);
    return false;
  });
  

  $(opts.trigger2).click(function(e) {
    DS_show(2);
    return false;
  });
  
  $(opts.field2).click(function(e) {
    DS_show(2);
    return false;
  });  
   
  $(document).click( function(e) { 
    try{
      e = e || window.event;
      
      var class_name = e.target.className;
      if (class_name.indexOf('DS_') == -1)
      {
        $(opts.wrapper1).hide( opts.show_speed );        
        setTimeout(function(){$(opts.wrapper1).html('');}, opts.show_speed);
        
        $(opts.wrapper2).hide( opts.show_speed );        
        setTimeout(function(){$(opts.wrapper2).html('');}, opts.show_speed);
      }
    }catch(err){}    
  }); 
  

}

/*-----------------------------------------------------------------------------------------*/

function DS_show(n)
{
  var _cont = opts.wrapper1;
  if (n==1)
  {                                
    $(opts.wrapper1).html( DS_buildCalendar(n, '') );
    $(opts.wrapper1).show( opts.show_speed );
    
    $(opts.wrapper2).hide( opts.show_speed );
    setTimeout(function(){$(opts.wrapper2).html('');}, opts.show_speed);
    
  }
  else
  {
    $(opts.wrapper2).html( DS_buildCalendar(n, '') );
    $(opts.wrapper2).show( opts.show_speed );
    
    $(opts.wrapper1).hide( opts.show_speed );    
    setTimeout(function(){$(opts.wrapper1).html('');}, opts.show_speed);
    
  }
  
}

/*-----------------------------------------------------------------------------------------*/

function DS_buildCalendar(n, date)
{
  var _dateInput;
  
  DS_checkCurDate();
  
  if (date == '')
  {
    date = DS_normalDate( opts.cur_date );
    if (n==1) _dateInput = $(opts.field1).val(); else _dateInput = $(opts.field2).val();
    if ( !_isDate(_dateInput) ) _dateInput = '';
    if (_dateInput != '') date = _dateInput;
  }
  
  var _cur_date = DS_normalDate( opts.cur_date ).split('-');
  _cur_date[1] = parseInt( (_cur_date[1]*10) / 10 );
  _cur_date[2] = parseInt( (_cur_date[2]*10) / 10 );
  
  
  var _date_js = new Date( DS_jsDate(date) );
  _date_js.setHours(0);
  _date_js.setMinutes(0);
  _date_js.setSeconds(0);
  _date_js.setMilliseconds(0);
  
  if ( _date_js.getTime() <= opts.cur_date.getTime() )
  {
    date = DS_normalDate( opts.cur_date );
  }  
  
  
  
  
  var _html = DS_genCalendarHeaderHtml(n, date);
  
  _html += '<div class="DS_body">';
  _html += DS_genCalendarHtml(n, date, 1);
  
  var next_date = new Date(DS_jsDate(date));
  next_date.setMonth( next_date.getMonth() + 1 );
  _html += DS_genCalendarHtml(n, DS_normalDate(next_date), 2);
  _html += '</div>';  
  
  return _html;
}

/*-----------------------------------------------------------------------------------------*/

function DS_mouseOut(n, e)
{
  if (n==1 && $(opts.field1).val() !='' && $(opts.field2).val() != '') return;
  
  $('.DB_calandar_table a').removeClass('DS_interval');
  
  if (n==2 && $(opts.field1).val() !='' && $(opts.field2).val() != '' && $(opts.field1).val() != $(opts.field2).val() != '')
  {
    var _sel = false;
    
    var _v1_date = new Date( DS_jsDate( $(opts.field1).val() ) );
    _v1_date.setHours(0);
    _v1_date.setMinutes(0);
    _v1_date.setSeconds(0);
    _v1_date.setMilliseconds(0);  
    
    var _v2_date = new Date( DS_jsDate( $(opts.field2).val() ) );
    _v2_date.setHours(0);
    _v2_date.setMinutes(0);
    _v2_date.setSeconds(0);
    _v2_date.setMilliseconds(0);      
    
    try{
      for (var i=1;i<=84;i++)
      {
        var _cdata = new Date( DS_jsDate( $('#dsday'+i).attr('sdate') ) );
        _cdata.setHours(0);
        _cdata.setMinutes(0);
        _cdata.setSeconds(0);
        _cdata.setMilliseconds(0); 
        
        if ( _cdata.getTime() > _v1_date.getTime() && _cdata.getTime() < _v2_date.getTime() ) _sel = true; else _sel = false;
        
        
        if ( $('#dsday'+i).attr('sdate') == $(opts.field2).val() )
        {
          $('#dsday'+i).removeClass('DS_today').addClass('DS_today');
          _sel = false; 
        }
        //if ( _isDate( $(opts.field1).val() ) && _isDate( $(opts.field2).val() ) && $(opts.field1).val() != $(opts.field2).val() )
        if ( _sel && _isDate( $(opts.field1).val() ) ) $('#dsday'+i).removeClass('DS_interval').addClass('DS_interval');
        
        if ( $('#dsday'+i).attr('sdate') == $(opts.field1).val() )
        {
          $('#dsday'+i).removeClass('DS_today').addClass('DS_today');
          _sel = true;  
        }
      }   
    }catch(e){}    
  }
    
}

/*-----------------------------------------------------------------------------------------*/

function DS_mouseOver(num, n, panel)
{
  $('.DB_calandar_table a').removeClass('DS_interval');
    
  if (n==2 && $(opts.field1).val() !='' && $(opts.field2).val() != '' && $(opts.field1).val() != $(opts.field2).val() != '')
  {
    try{
      for (var i=1;i<=84;i++)
      {
        if ( $('#dsday'+i).attr('sdate') == $(opts.field1).val() )
        {
          $('#dsday'+i).removeClass('DS_today').addClass('DS_today');
        }        
        
        if ( $('#dsday'+i).attr('sdate') == $(opts.field2).val() )
        {
          $('#dsday'+i).removeClass('DS_today').addClass('DS_any');
        }
      }   
    }catch(e){}    
  }    
    
  try{
    for (var i=1;i<=num;i++)
    {
      if ( $('#dsday'+i).attr('sdate') != $(opts.field1).val() ) $('#dsday'+i).removeClass('DS_interval').addClass('DS_interval');
    }
   }catch(e){}
  
}

/*-----------------------------------------------------------------------------------------*/

function DS_selectDatesInterval(d1, d2)
{
  try{
    var _sel = false;
    for (var i=1;i<=84;i++)
    {
      if ( $('#dsday'+i).attr('sdate') == d2 ) _sel = false;
      if ( _sel ) $('#dsday'+i).removeClass('DS_interval').addClass('DS_interval');
      if ( $('#dsday'+i).attr('sdate') == d1 ) _sel = true;
    }
  }catch(e){}
}


/*-----------------------------------------------------------------------------------------*/

function DS_clickOnMonth(n, date)
{
  var _cont = opts.wrapper1;
  if (n!=1) _cont = opts.wrapper2;
  
  if ( $(_cont).html() != '' )
  {
    $(_cont).html( DS_buildCalendar(n, date) );
  }     

}

/*-----------------------------------------------------------------------------------------*/

function DS_clickOnDate(n, date)
{
  var _cont = opts.wrapper1;
  var _field = opts.field1;
  if (n!=1)
  {
    _cont = opts.wrapper2; 
    _field = opts.field2;
  }
  
  $(_field).val(date);
  
  $(_cont).hide( opts.show_speed );
  setTimeout(function(){$(_cont).html('');}, opts.show_speed);
  
  if (n==1)
  {
    $(opts.field2).val(date);
    $(opts.wrapper2).html( DS_buildCalendar(2, date) );
    $(opts.wrapper2).show( opts.show_speed );
  }
}

/*-----------------------------------------------------------------------------------------*/

function DS_genCalendarHeaderHtml(n, date)
{
  var _cur_date = DS_normalDate( opts.cur_date ).split('-');
  _cur_date[1] = parseInt( (_cur_date[1]*10) / 10 );
  _cur_date[2] = parseInt( (_cur_date[2]*10) / 10 );
  
  
  var _date_js = new Date( DS_jsDate(date) );
  _date_js.setHours(0);
  _date_js.setMinutes(0);
  _date_js.setSeconds(0);
  _date_js.setMilliseconds(0);
  
  var prev_btn_class = 'DS_enable_prev';
  var next_btn_class = 'DS_enable_next';
  
  if ( _date_js.getTime() <= opts.cur_date.getTime() )
  {
    prev_btn_class = 'DS_disable_prev';
    date = DS_normalDate( opts.cur_date );
  }
  
  var _tmp = date.split('-');
  _tmp[1] = parseInt( (_tmp[1]*10) / 10 );
  _tmp[2] = parseInt( (_tmp[2]*10) / 10 );
  var _selMonth = _tmp[1] - 1;
  var _d = new Date().getMonth();
  
  var _html = '<div class="DS_header">';
  
  var _cyear = _cur_date[0];
  
  for (var i=0;i<12;i++)
  {
    if (_selMonth == _d)
    {
      _html += '<a href="#" onclick="return false;" class="DS_any DS_monts_active">'+langs.monthNames[_d]+'</a>';
    }
    else
    {
      _html += '<a href="#" class="DS_any" onclick="DS_clickOnMonth('+n+', \''+_cyear+'-'+(_d+1)+'-01\');return false;">'+langs.monthNames[_d]+'</a>';  
    }
    
    _d++;
    if (_d>11)
    {
      _d = 0;
      _cyear++;
    }
  }
  
  _html += '</div>';
  
  var prev_onlick = "";
  var next_onlick = "";
  var _current_date = opts.cur_date;
  _current_date.setDate(1);
  _date_js.setDate(1);
  
  if ( _date_js.getTime() > _current_date.getTime() )
  {
    _tmp = _date_js.getMonth();
    if (_tmp < 1) _tmp = (_date_js.getFullYear() - 1) + '-12'; else _tmp = _date_js.getFullYear() + '-' + _tmp;
    prev_onlick = "DS_clickOnMonth("+n+", '"+_tmp+"-01');";   
  }
  
  _cur_date[0] = _date_js.getFullYear();
  _html += '<table class="DS_navbuttons"><tr>';
  _html += '<td class="DS_nav_prev_next"><span id="DS_nav_prev" class="DS_any '+prev_btn_class+'" onclick="'+prev_onlick+'return false;"></span></td>';
  _html += '<td id="DS_nav_monts1" class="DS_any">'+langs.monthNames[_selMonth]+' '+_cur_date[0]+'</td>';
  _selMonth++;
  if (_selMonth>11)
  {
    _selMonth = 0;
    _cur_date[0]++;
  }
  _html += '<td id="DS_nav_monts2" class="DS_any">'+langs.monthNames[_selMonth]+' '+_cur_date[0]+'</td>';
  
  _current_date.setMonth( _current_date.getMonth() + 11 );
  if ( _date_js.getTime() <= _current_date.getTime() )
  {
    _tmp = _date_js.getMonth();
    if (_tmp >= 11) _tmp = (_date_js.getFullYear() + 1) + '-01'; else _tmp = _date_js.getFullYear() + '-' + (_tmp+2);
    next_onlick = "DS_clickOnMonth("+n+", '"+_tmp+"-01');";   
  }
  
  if ( _date_js.getTime() >= _current_date.getTime() )
  {
    next_onlick = '';
    next_btn_class = 'DS_disable_next';
  }
  
  _html += '<td class="DS_any DS_nav_prev_next"><span id="DS_nav_prev" class="DS_any '+next_btn_class+'" onclick="'+next_onlick+'return false;"></span></td>';
  _html += '</tr></table>';

  return _html;
}

/*-----------------------------------------------------------------------------------------*/

function DS_genCalendarHtml(n, _date, panel)
{
  var first_day_week = DS_getFirstDayOfMonth(_date);
  var last_day_week = DS_getLastDayOfMonth(_date);
  if (first_day_week == 0) first_day_week = 7;
  if (last_day_week == 0) last_day_week = 7;

  
  var prev_days_count = 30;
  var this_days_count = 30;
  var _tmp = _date.split('-');
  _tmp[1] = parseInt( (_tmp[1]*10) / 10 );
  _tmp[2] = parseInt( (_tmp[2]*10) / 10 );
  
  var cur_year = _tmp[0];
  var cur_month = _tmp[1];
  var cur_date = new Date();
  cur_date.setHours(0);
  cur_date.setMinutes(0);
  cur_date.setSeconds(0);
  cur_date.setMilliseconds(0);
  
  var sel_date = '';
  if ( n ==1 ) sel_date = $(opts.field1).val(); else sel_date = $(opts.field2).val();
  if ( _isDate(sel_date) )
  {
    sel_date = new Date( DS_jsDate(sel_date) );
  }
  else
  {
    sel_date = cur_date;
  }
  sel_date.setHours(0);
  sel_date.setMinutes(0);
  sel_date.setSeconds(0);
  sel_date.setMilliseconds(0);  
  
  
  if (_tmp[1]==2)
  {
    this_days_count = 28;
    if ( _tmp[0] % 4 == 0 && (_tmp[0] % 100 != 0 || _tmp[0] % 400 == 0) ) this_days_count = 29;
  }
  else if (_tmp[1]==1  || _tmp[1]==3 || _tmp[1]==5 || _tmp[1]==7 || _tmp[1]==8 || _tmp[1]==10 || _tmp[1]==12)
  {
    this_days_count = 31;
  }  
  
  if (_tmp[1]==1)
  {
    _tmp[1] = 12;
    _tmp[0]--;
  }
  else
  {
    _tmp[1]--;
  }
  
  if (_tmp[1]==2)
  {
    prev_days_count = 28;
    if (_tmp[0] % 4 == 0 && (_tmp[0] % 100 != 0 || _tmp[0] % 400 == 0) ) prev_days_count = 29;
  }
  else if (_tmp[1]==1  || _tmp[1]==3 || _tmp[1]==5 || _tmp[1]==7 || _tmp[1]==8 || _tmp[1]==10 || _tmp[1]==12)
  {
    prev_days_count = 31;
  }    
  
  var days_count = prev_days_count;
  
  
  var _html = '<div class="DS_calendar"><table class="DB_calandar_table" cellpadding="0" cellspacing="0">';
  _html += '<tr>';
  for (var i=0;i<langs.dayNames.length;i++) _html += '<th class="DS_any">'+langs.dayNames[i]+'</th>';
  _html += '</tr>';
  
  
  var disable_day = true;
  var days_part = 1;
  var start_index = 0;
  var dw = days_count - first_day_week +2;
  if (first_day_week==1)
  {
    dw = 1;
    disable_day = false;
    days_count = this_days_count;
    days_part = 2;
  }
  
  var cur_date_loop;
  

  var other_sel_date = '';
  var _otherDate = $(opts.field2).val();
  if (n==2) _otherDate = $(opts.field1).val();
  if ( !_isDate(_otherDate) ) _otherDate = '';  
  
  if ( _otherDate != '' )
  {
    other_sel_date = new Date( DS_jsDate(_otherDate) );
    other_sel_date.setHours(0);
    other_sel_date.setMinutes(0);
    other_sel_date.setSeconds(0);
    other_sel_date.setMilliseconds(0);          
  }
  
  var on_mouse_over = '';
  var _cdate_txt = '';
  var _adt_class = '';
  var _sel_interval = false; 
  var _interval_date;
  

  
  if (  $(opts.field1).val() != '' && $(opts.field2).val() != '')
  {
    if (n == 1 || n==2)
    {
      var _v1_date = new Date( DS_jsDate( $(opts.field1).val() ) );
      _v1_date.setHours(0);
      _v1_date.setMinutes(0);
      _v1_date.setSeconds(0);
      _v1_date.setMilliseconds(0);  
      
      var _v2_date = new Date( DS_jsDate( $(opts.field2).val() ) );
      _v2_date.setHours(0);
      _v2_date.setMinutes(0);
      _v2_date.setSeconds(0);
      _v2_date.setMilliseconds(0);  
      
      var _first_day = new Date( DS_jsDate( _date ) );
      _first_day.setHours(0);
      _first_day.setMinutes(0);
      _first_day.setSeconds(0);
      _first_day.setMilliseconds(0); 
      _first_day.setDate(1); 
      
      
      if ( _first_day.getTime() > _v1_date.getTime() && _first_day.getTime() < _v2_date.getTime() ) _sel_interval = true;
    }
    else
    {
    
    }
  }
  
  
  for (var i=1;i<=6;i++)
  {
    _html += '<tr>';
   
    for (var j=1;j<=7;j++)
    {
      if (days_part==1)
      {
        if (dw > prev_days_count)
        {
          dw = 1; 
          disable_day = false;
          days_part = 2;
        }

      }
      else if (days_part==2)
      {
        if (dw > this_days_count)
        {
          dw = 1; 
          disable_day = true;
          days_part = 3;
        }        
      }
      else
      {
        disable_day = true;
      }
      
      cur_date_loop = new Date( (cur_month)+'/'+dw+'/'+cur_year );      
      cur_date_loop.setHours(0);
      cur_date_loop.setMinutes(0);
      cur_date_loop.setSeconds(0);
      cur_date_loop.setMilliseconds(0);
      
      if (disable_day)
      {
        _html += '<td class="DS_td"><a href="#" class="DS_disabled_day" onclick="return false;">'+dw+'</a></td>';   
      }
      else
      {
        if ( ( cur_date_loop.getTime() < cur_date.getTime() ) ||
             ( n==2 && _otherDate != '' && cur_date_loop.getTime() < other_sel_date.getTime() ) )
        {
          _html += '<td class="DS_td"><a href="#" class="DS_disabled_day" onclick="return false;">'+dw+'</a></td>';   
        }
        else
        {
          _cdate_txt = cur_date_loop.getFullYear()+'-';
          _cdate_txt += (cur_date_loop.getMonth()+1 <=9 ) ? ('0' + (cur_date_loop.getMonth()+1)) : cur_date_loop.getMonth()+1;
          _cdate_txt += '-' + ( (dw <= 9) ? ('0' + dw) : dw );
          
          if ( n==2 && _otherDate != '' ) on_mouse_over = 'onmouseover="DS_mouseOver('+((panel-1)*42+dw)+','+n+','+panel+')"';
          
          //if ( $(opts.field1).val() !='' && $(opts.field2).val() != '' && $(opts.field1).val() != $(opts.field2).val() )
          if ( _isDate( $(opts.field1).val() ) && _isDate( $(opts.field2).val() ) && $(opts.field1).val() != $(opts.field2).val() )
          {       
            
            _interval_date = new Date( DS_jsDate( $(opts.field2).val() ) );
            if ( cur_date_loop.getTime() == _interval_date.getTime() ) _sel_interval = false;
            
            _adt_class = _sel_interval ? ' DS_interval' : '';
            
            _interval_date = new Date( DS_jsDate( $(opts.field1).val() ) );
            if ( cur_date_loop.getTime() == _interval_date.getTime() ) _sel_interval = true;
            
          }            
          
          
          if ( ( cur_date_loop.getTime() == sel_date.getTime() /*&& _otherDate == ''*/) || 
               ( _otherDate != '' && cur_date_loop.getTime() == other_sel_date.getTime() ) )
          {
            _html += '<td class="DS_td"><a href="#" class="DS_today'+_adt_class+'" id="dsday'+((panel-1)*42+dw)+'" onclick="DS_clickOnDate('+n+', \''+_cdate_txt+'\');return false;" '+on_mouse_over+' onmouseout="DS_mouseOut('+n+',event)" sdate="'+_cdate_txt+'">'+dw+'</a></td>';     
          }
          else
          {
            _html += '<td class="DS_td"><a href="#" class="DS_any'+_adt_class+'" id="dsday'+((panel-1)*42+dw)+'" onclick="DS_clickOnDate('+n+', \''+_cdate_txt+'\');return false;" '+on_mouse_over+' onmouseout="DS_mouseOut('+n+',event)" class="DS_any" sdate="'+_cdate_txt+'">'+dw+'</a></td>';     
          }
          
        }
      }
      
      dw++;
   }
   
   _html += '</tr>';
  }
      
  _html += '</table></div>';
  
  return _html;
}

/*-----------------------------------------------------------------------------------------*/

function DS_checkCurDate()
{
  opts.cur_date = new Date();
  
  opts.cur_date.setHours(0);
  opts.cur_date.setMinutes(0);
  opts.cur_date.setSeconds(0);
  opts.cur_date.setMilliseconds(0);  
}

/*-----------------------------------------------------------------------------------------*/

function DS_normalDate(d)
{
  return d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate();
}

/*-----------------------------------------------------------------------------------------*/

function DS_jsDate(d)
{
  if ( !_isDate(d) ) return false;
  
  d = d.split('-');
  
  return parseInt( (d[1]*10)/10 ) + '/' + d[2] + '/' + d[0];
}

/*-----------------------------------------------------------------------------------------*/

function DS_getFirstDayOfMonth(d)
{
  if ( !_isDate(d) ) return false;
  var _tmp = d.split('-');
  _tmp = _tmp[1] + '/1/' + _tmp[0];
  
  var f_day = new Date( _tmp );
  if (f_day) return f_day.getDay();

  return false;
}

/*-----------------------------------------------------------------------------------------*/

function DS_getLastDayOfMonth(d)
{
  if ( !_isDate(d) ) return false;
  var _tmp = d.split('-');
  _tmp[1] = parseInt( (_tmp[1]*10) / 10 );
  _tmp[2] = parseInt( (_tmp[2]*10) / 10 );
    
  var ld = 30;
  if (_tmp[1]==2)
  {
    ld = 28;
    if (_tmp[0] % 4 == 0 && (_tmp[0] % 100 != 0 || _tmp[0] % 400 == 0) ) ld = 29;
  }
  else if (_tmp[1]==1  || _tmp[1]==3 || _tmp[1]==5 || _tmp[1]==7 || _tmp[1]==8 || _tmp[1]==10 || _tmp[1]==12)
  {
    ld = 31;
  }
  _tmp = _tmp[1] + '/' + ld + '/' + _tmp[0];
  
  var f_day = new Date( _tmp );
  if (f_day) return f_day.getDay();

  return false;
  
}

/*-----------------------------------------------------------------------------------------*/

function DS_getDate(d)
{
  if ( /^[0-9]{4}\-((0[1-9])|(1[0-2])|([1-9]))\-(([1-2][0-9])|([0][1-9])|(3[0-1])|([1-9]))$/.test(d) == false ) return '';
  
  return d;
}

/*-----------------------------------------------------------------------------------------*/

function _isDate(sDate)
{
  if (sDate=='') return false;
  var re = /^[0-9]{4}\-(([1-9])|(0[1-9])|(1[0-2]))\-(([1-9])|([1-2][0-9])|([0][1-9])|(3[0-1]))$/
  if (re.test(sDate))
  {
    var dArr = sDate.split("-");
    var d = new Date((dArr[1]-1)+'/'+dArr[2]+'/'+dArr[0]);
    if (d) return true;
  }
  else
  {
    return false;
  }
}

/*-----------------------------------------------------------------------------------------*/
