   var _bookingalert = 'Sorry, there is an existing booking for the selected time';
   var _days = new Array('Mon','Tue','Wed','Thu','Fri','Sat');
   var _daysLong = new Array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
   var _months = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
   var _daystart = 8;
   var _dayend   = 17;
   var _hourOffset = 30;
   var _selDay   = '';
   var _selStart = '';
   var _selEnd   = '';
   var _selCurrent = false;
   
   function mark(cal, day, start, end)
   {
      var d = parseInt(day.match(/[0-9]+/))
      var s = parseInt(start.match(/[0-9]+/));
      var e = parseInt(end.match(/[0-9]+/));
      if (s > e)
      {
         t = e;
         e = s;
         s = t;
      }
      _dayLength = _dayend - _daystart -1;
      _blockSize = parseInt($('input[name="'+ cal +'Blocksize"]').attr('value'));
      switch (_blockSize)
      {
         case (_dayLength/2):
            if (s >= _daystart + _dayLength / 2)
            {
               s = _daystart + 1 + _dayLength / 2;
               e = _dayend -1;
            } else {
               s = _daystart;
               if (e > _daystart + _dayLength / 2)
               {
                  e = _dayend -1;
               } else {
                  e = _daystart - 1 + _dayLength / 2 ; 
               }
            }
            break;
         case _dayLength:
            s = _daystart;
            e = _dayend;
            break;
      }
      var t = $('span', $('li', $('#'+ cal +' .header').eq(1)).eq(d)).eq(0).text().split('/');
      
      if (s>11)
      {
         sT = (s-12) +':'+ _hourOffset +' PM'
      } else if (s==11) {
         sT = '12:'+ _hourOffset +' PM';
      } else {
         sT = s +':'+ _hourOffset +' AM';
      }
      $('input[name="'+ cal +'Start"]').attr('value', sT);
      if (e>11)
      {
         eT = (e-11) +':'+ _hourOffset +' PM'
      } else if (e==11) {
         eT = '12:'+ _hourOffset +' PM';
      } else {
         eT =  (e+1) +':'+ _hourOffset +' AM'; 
      }
      $('input[name="'+ cal +'End"]').attr('value', eT);
      $('input[name="'+ cal +'Day"]').attr('value', _daysLong[d] +', '+ t[0] +' '+ _months[t[1]-1] +' '+ t[2] +' '+ sT +' - '+ eT) ;
      $('#'+ cal +' form').css('display', 'block');
      
      for (var i = _daystart; i <= _dayend; i++)
      {
         if (i>=s && i<=e)
         {
            $('#'+ cal +' .d'+ d +' .h'+ i).addClass('select');
         } else {
            $('#'+ cal +' .d'+ d +' .h'+ i).removeClass('select');
         }
      }
   }
   
   // create calendars
   $(document).ready(function(){
      $('.calendar').each(function(){buildCalendar(this)});
   });
  

   function buildCalendar(obj)
   {
      if ($('div', obj).hasClass('week'))
      {
         var thisCal = obj;
         var tDate = new Date();
         _startDate = parseInt($('input[name="'+ thisCal.id +'StartTime"]').attr('value'));
         
         
         if (_startDate==0)
         {
            var sDate = new Date();
            $('input[name="'+ thisCal.id +'StartTime"]').attr('value', Math.floor(sDate.getTime() / 1000))
         } else {
            var sDate = new Date(_startDate * 1000);
         }
         
         if (sDate.getTime() < tDate.getTime() - (7 * 86400000))
         {
            var sDate = new Date(tDate.getTime() - (7 * 86400000));
            $('input[name="'+ thisCal.id +'StartTime"]').attr('value', Math.floor(sDate.getTime() / 1000))
         }
         var x = sDate.getDay();
         switch (x)
         {
            case 6:y=+2;break;
            case 0:y=+1;break;
            case 1:y=+0;break;
            case 2:y=-1;break;
            case 3:y=-2;break;
            case 4:y=-3;break;
            case 5:y=-4;break;
         }
         sDate.setTime(sDate.getTime() + y * 86400000);
         sDate.setHours(0);
         sDate.setMinutes(0);
         sDate.setSeconds(0);
         sDate.setMilliseconds(0);
         
         var t = $('input[name="'+ thisCal.id +'Ajax"]').attr('value').split(/\?/);
         
         $.ajax({
           url: t[0], 
           context: obj,
           cache: false,
           data:  t[1] +'&start='+ $('input[name="'+ thisCal.id +'StartTime"]').attr('value'),
           error: function(xh, x){alert(x)},
           success: function(data){
               $('.week', this).append(function(){
                  $(this).empty();
                  // create date entries
                  var booked = Array();
                  $('entry', data).each(function(){
                     booked[booked.length] = Array($(this).attr('start') * 1000, $(this).attr('end') * 1000, $(this).attr('title'));    
                  });
                  var x  = _days.length;
                  var hh = '';
                  var bh = '';
                  // header
                  hh += '<ul class="header"><li class="prev d0">&lt;</li><li class="month">'+ _months[sDate.getMonth()] +' '+ sDate.getFullYear() +'</li><li class="next">&gt;</li></ul>';            
                  hh += '<ul class="header" style="clear:left">';
                  // create days... 
                  for (var i=0; i < x; i++)
                  {
                     if (tDate.getDate() +'-'+ tDate.getMonth() +'-'+ tDate.getFullYear() == sDate.getDate() +'-'+ sDate.getMonth() +'-'+ sDate.getFullYear())
                     {
                        hh += '<li class="d'+ i +' today">'+ _days[i] +'<span>'+ sDate.getDate() +'/'+ (sDate.getMonth()+1) +'<b>/'+ tDate.getFullYear() +'</b></span></li>';
                     } else {
                        hh += '<li class="d'+ i +'">'+ _days[i] +'<span>'+ sDate.getDate() +'/'+ (sDate.getMonth()+1) +'<b>/'+ tDate.getFullYear() +'</b></span></li>';
                     }
                     bh += '<li class="d'+ i +'"><ul>';
                     
                     
                     // create hours...
                     for (var k = _daystart; k < _dayend; k++)
                     {
                        sDate.setHours(k);
                        sDate.setMinutes(_hourOffset);
                        var sT = sDate.getTime() + 86400000;
                        var b = false;
                        for (var l=0; l<booked.length; l++)
                        {
                           if (booked[l][0] <= sT && booked[l][1] >= sT + 3600000)
                           {
                              b = true;
                              break;
                           }
                        }
                        if (b)
                        {
                           bh += '<li class="h'+ k +' booked"><b>'+ k +'</b></li>';
                        } else {
                           bh += '<li class="h'+ k +'"><b>'+ k +'</b></li>';
                        }
                     }
                     bh += '</ul></li>';
                     sDate.setTime(sDate.getTime() + 86400000);
                  }            
                  return ''+ hh + '</ul><ul class="body">'+ bh +'</ul>';
               });
               
               $('.header .prev').click(function(){
                  $('input[name="'+ thisCal.id +'StartTime"]').attr('value', parseInt($('input[name="'+ thisCal.id +'StartTime"]').attr('value')) - 7*86400);
                  buildCalendar(thisCal);
               });
               
               $('.header .next').click(function(){
                  $('input[name="'+ thisCal.id +'StartTime"]').attr('value', parseInt($('input[name="'+ thisCal.id +'StartTime"]').attr('value')) + 7*86400);
                  buildCalendar(thisCal);
               });         
               
               // then attach event handlers for day hover 
               $('.body li', $(obj)).hover(function(){$(this).addClass('active')},function(){$(this).removeClass('active')}); 
               
               // cleanup selection on leaving calendar
               $(thisCal).mouseleave(function(){
                  if (_selCurrent)
                  {
                     _selDay   = '';
                     _selStart = '';
                     _selEnd   = '';
                     $(thisCal).find('.select').removeClass('select');
                     _selCurrent = false;
                  }
               });  
               
               // mouseenter
               $('.body li li', $(obj)).mouseenter(function(){
                  if (_selCurrent)
                  {  
                     if ($(this).parents('li').attr('class') == _selDay)
                     {
                        if ($(this).attr('class').indexOf('booked')<0)
                        {
                           mark(thisCal.id, _selDay, _selStart, $(this).attr('class'));
                        }
                     }
                  }
               });            
               
               // mousedown... 
               $('.body li li', $(obj)).mousedown(function(){
                  $(this).parents('.calendar').find('.select').removeClass('select');
                  if ($(this).attr('class').indexOf('booked')<0)
                  {
                    _selCurrent = true;
                    _selDay     = $(this).parents('li').attr('class');
                    _selStart   = $(this).attr('class');
                    _selEnd     = $(this).attr('class');
                    mark(thisCal.id, _selDay, _selStart, $(this).attr('class'));
                  } else {
                     alert(_bookingalert);
                  }
               }); 
      
               // mouseup
               $('.body li li', $(obj)).mouseup(function(){
                  if (_selCurrent)
                  {  
                     if ($(this).parents('li').attr('class') == _selDay)
                     {
                        if ($(this).attr('class').indexOf('booked')<0)
                        {
                           mark(thisCal.id, _selDay, _selStart, $(this).attr('class'));
                        }
                     }
                     _selCurrent = false;
                  }
               });
             }
           });        
   }     
 }
 
 function val(obj)
 {
    var c = true;
    for (var i=0; i<obj.length; i++)
    {
       if (obj[i].value.length==0)
       {
          var c = false;
          obj[i].style.borderColor = '#acd553';
       } else {
          obj[i].style.borderColor = '';
       }
    }
    if (!c)
    {
       alert('Please fill in all fields');
    }    
    return c;
 }
