/**
 * jCalendar 0.5
 *
 * Some code based on jQuery Date Picker (http://kelvinluck.com/assets/jquery/datePicker/)
 *
 * Copyright (c) 2007 Theodore Serbinski (http://tedserbinski.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 */
jQuery.jcalendar = function() {
	var days = ['일', '월', '화', '수', '목', '금', '토'];
	var navLinks = {p:' < ', n:' > ', t:' Today '};
	var _firstDayOfWeek;
	var _firstDate;
	var _lastDate;
	var _selectedDate;
    var today = new Date();
    
	var _drawCalendar = function(dateIn, a, inp) {
        var today = new Date();
        var d;
        d = dateIn;
        d.setDate(1);

		var firstMonth = true;
		var firstDate = _firstDate.getDate();
        
		// create prev and next links
        var lastMonth = d.getMonth() == 0 ? new Date(d.getFullYear()-1, 11, 1) : new Date(d.getFullYear(), d.getMonth()-1, 1);
		var prevLink = jQuery('<a href="" class="link-prev"><img src="'+$('#imageHost').val()+'/doum/images/temp/calendar_pre_month.jpg" /></a>').click(function() {
			jQuery.jcalendar.changeMonth(lastMonth, this, inp);
			return false;
		});
        
        var nextMonth = new Date(d.getFullYear(), d.getMonth()+1, 1);
		var nextLink = jQuery('<a href="" class="link-next"><img src="'+$('#imageHost').val()+'/doum/images/temp/calendar_next_month.jpg" /></a>').click(function() {
            jQuery.jcalendar.changeMonth(nextMonth, this, inp);
			return false;
		});

        var curMon = d.getMonth() + 1;
        var curYear = d.getFullYear();

		var headRow = jQuery("<tr></tr>");
        var headDate = jQuery("<tr></tr>");
        var headDate = headDate.append(jQuery("<th colspan=7></th>").attr('class', 'thTop').append(prevLink).append('&nbsp;' + curYear + '년  ' + curMon + '월' + '&nbsp;').append(nextLink));

        for (var i=_firstDayOfWeek; i<_firstDayOfWeek+7; i++) {
			var weekday = i%7;
			var wordday = days[weekday];
			headRow.append('<th scope="col" abbr="'+ wordday +'" title="'+ wordday +'" class="'+ (weekday == 0 || weekday == 6 ? 'weekend' : 'weekday') +'">'+ wordday +'</th>');
		}
		headRow = jQuery("<thead></thead>").append(headDate).append(headRow);
 
		var tBody = jQuery("<tbody></tbody>");
		var lastDay = (new Date(d.getFullYear(), d.getMonth()+1, 0)).getDate();
		var curDay = _firstDayOfWeek - d.getDay();
		if (curDay > 0) curDay -= 7;

		var todayDate = today.getDate();
		var thisMonth = d.getMonth() == today.getMonth() && d.getFullYear() == today.getFullYear();

    // render calendar
        do {
 		    var thisRow = jQuery("<tr></tr>");
            for (var i=0; i<7; i++) {
                if (weekday == 5) { 
                    weekdayClass = 'weekend1'; 
                } else if (weekday == 6) { 
                    weekdayClass = 'weekend2';
                } else {
                    weekdayClass = 'weekday';
                }
            
  			    var weekday = (_firstDayOfWeek + i) % 7;
  			    var atts = {'class':weekdayClass};

  			    if (curDay < 0 || curDay >= lastDay) {
      				dayStr = ' ';
  			    } else {
      				d.setDate(curDay+1);
      				// attach a click handler to every day to select it if clicked
  	     			// we use the rel attribute to keep track of the day that is being clicked
  		    		dayStr = jQuery('<a href="" rel="'+ d +'">'+ (curDay+1) +'</a>').click(function(e) {
                        if (_selectedDate) {
                            _selectedDate.removeClass('selected');
                        }
          			    _selectedDate = jQuery(this);
              			_selectedDate.addClass('selected');
                
                        var curDate = new Date(_selectedDate.attr('rel'));
                        var cYear = curDate.getFullYear();
                        var cMonth = curDate.getMonth() + 1;
                        var cDay = curDate.getDate();

                        if (("" + cMonth).length == 1) {cMonth = "0" + cMonth};
                        if (("" + cDay).length == 1) {cDay = "0" + cDay};
                        $(inp).val(cYear + '-' + cMonth + '-' + cDay);    
      					$('.jcalendar').slideUp("normal")
                        return false;
      				});
                    if ($(inp).val().substring(8,10) == d.getDate()) {
      				  _selectedDate = dayStr;
      				  _selectedDate.addClass('selected');
      				}
      			}
      			thisRow.append(jQuery("<td></td>").attr(atts).append(dayStr));
      			curDay++;
            }
			tBody.append(thisRow);
		} while (curDay < lastDay);

        jQuery('div.jcalendar').html('<div class="jcalendar-links"></div><table cellspacing="0"></table>');
		jQuery('div.jcalendar table').append(headRow, tBody);
        jQuery('.jcalendar-cont').append(prevLink, nextLink);
	};

	return {
		show: function(a, inp) {
 			_firstDate = a._startDate;
			_lastDate = a._endDate;
			_firstDayOfWeek = a._firstDayOfWeek;

			// pass in the selected form date if one was set
			var selected = new Date($(a).val().substring(0,4), $(a).val().substring(5,7)-1, $(a).val().substring(8,10));
			_drawCalendar(selected, a, inp);
		},
		changeMonth: function(d, e, inp) {
			_drawCalendar(d, e, inp);
		},
		setDateWindow: function(i, w) {
			if (w == undefined) w = {};
			i._startDate = new Date();
			i._endDate = new Date();
			i._firstDayOfWeek = w.firstDayOfWeek == undefined ? 0 : w.firstDayOfWeek;
		}
	};
}();

jQuery.fn.jcalendar = function() {
	this.each(function() {
        $(this).after('<div class="jcalendar" style="display: none;"></div>');
        jQuery.jcalendar.setDateWindow(this, this);
    	jQuery.jcalendar.show(this, this);
        $('.jcalendar').css({ left: $(this).offset().left, top: $(this).offset().top + 30 });
	});
	return this;
};
