$(document).ready(function() {
    hn_calendarCnt = 0;
    hn_calendar = function(param) {
        try {
            var param = $.extend({
                ControlID: "",
                StartYear: (new Date).getFullYear(),
                StartMonth: (new Date).getMonth() + 1,
                CalendarCount: 2,
                callback: function(e) { }
            },
			param);
			
            this.Control = $('#' + param.ControlID);
            this.Control.attr('readonly', true);
            this.CalendarNo = hn_calendarCnt;
            hn_calendarCnt++;

            var THAT = this;
            
            this.Control.bind('focus', function(e) {
			    THAT.show();
			}).bind('blur', function(e) {
			    THAT.hide();
			});
			
            this.selectedValue = "";
            this.selectedText = "";
            this.calendarCount = 0;
            this.current_year;
            this.current_month;
            
            this.CalendarBox = $("<div>").css({
                position: "absolute",
                width: 291,
                height: 191,
                border: "1px solid #cccccc",
                backgroundColor: "#FFFFFF",
                overflowX: "hidden",
                zIndex: 5000,
                display: "none",
                padding: 2,
                textAlign: 'left'
            }).appendTo('body').hover(function(e) {
                THAT.Control.unbind('blur');
            }, function(e) {
			    if ($(this).css('display') == 'block') {
			        THAT.Control.focus();
			        THAT.Control.bind('blur',
					function(e) {
					    THAT.hide();
					});
			    }
			});
			
            $('<iframe frameborder="0"/>').appendTo(this.CalendarBox).css({
                width: 293,
                height: '100%',
                position: 'absolute',
                left: -1,
                top: 0,
                zIndex: 5000,
                border: 0
            });
            
            this.innerCalendarBox = $('<div/>').appendTo(this.CalendarBox).css({
                position: 'absolute',
                left: 0,
                top: 0,
                zIndex: 5000
            });
            
            this.CalendarBoxTop = $('<div/>').appendTo(this.CalendarBox).css({
                position: 'absolute',
                left: 0,
                top: 0,
                width: 291,
                height: 20,
                zIndex: 5000
            });

            this.btnPrevious = $('<span style="text-align:left" value=""><img src="http://image8.hanatour.com/Lodge/Common/ico_Larrow_on.gif" style="margin:4 0 0 5"/></span>').appendTo(this.CalendarBoxTop).bind('click',
			function(e) {
			    if ($(this).val() == '') {
			        var now = new Date();
			        if (parseInt(now.getMonth() + 1) + 1 != parseInt(THAT.current_month)) {
			            THAT.innerCalendarBox.animate({
			                left: parseInt(THAT.innerCalendarBox.css('left')) + 145
			            },
						{
						    duration: 500,
						    complete: function() {
						        THAT.btnPrevious.val('');
						    }
						});
			            var date = new Date(THAT.current_year, THAT.current_month - 3, 1);
			            THAT.currentIndex--;
			            THAT.appendCalendar(date.getFullYear(), date.getMonth() + 1, THAT.currentIndex - 1);
			            var date = new Date(THAT.current_year, THAT.current_month - 2, 1);
			            THAT.current_year = date.getFullYear();
			            THAT.current_month = date.getMonth() + 1;
			            $(this).val('start animate');
			        }
			    }
			}).css({
			    cursor: 'pointer',
			    zIndex: 5000
			});
            $('<span style="width:260; text-align:center; font-weight:bold">Calendar</span>').appendTo(this.CalendarBoxTop);
            this.btnNext = $('<span style="text-align:right" value=""><img src="http://image8.hanatour.com/Lodge/Common/ico_Rarrow_on.gif"/></span>').appendTo(this.CalendarBoxTop).bind('click',
			function(e) {
			    if ($(this).val() == '') {
			        THAT.innerCalendarBox.animate({
			            left: parseInt(THAT.innerCalendarBox.css('left')) - 145
			        },
					{
					    duration: 500,
					    complete: function() {
					        THAT.btnNext.val('');
					    }
					});
			        var date = new Date(THAT.current_year, THAT.current_month, 1);
			        THAT.current_year = date.getFullYear();
			        THAT.current_month = date.getMonth() + 1;
			        THAT.currentIndex++;
			        THAT.appendCalendar(THAT.current_year, THAT.current_month, THAT.currentIndex);
			        $(this).val('start animate');
			    }
			}).css({
			    cursor: 'pointer',
			    zIndex: 5000
			});
            this.convertDigit = function(value, digit) {
                var w = digit;
                while (--w != 0) {
                    value = (value.toString().length != digit) ? "0" + value : value;
                }
                return value;
            };
            this.getCalendarXml = function(year, month) {
                var now = new Date(year, month - 1, 1);
                var now_year = now.getFullYear();
                var now_month = month;
                var now_date = now.getDate();
                var now_day = now.getDay();
                var end_date = new Array("", 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
                var now_enddate = end_date[Number(now_month)];
                var nowone = new Date(now_year, now_month - 1, 1);
                var startday = nowone.getDay();
                var xml = new Array();
                xml.push("<response>");
                xml.push("<year>" + now_year + "</year>");
                xml.push("<month>" + this.convertDigit(now_month, 2) + "</month>");
                for (var i = 0; i < startday; i++) {
                    xml.push("<date/>");
                }
                for (var i = 1; i <= now_enddate; i++) {
                    xml.push("<date>" + this.convertDigit(i, 2) + "</date>");
                }
                xml.push("</response>");
                return xml.join('');
            };
            this.show = function() {
                this.reSize();
                this.CalendarBox.show();
                var THAT = this;
                $(window).bind('resize',
				function() {
				    THAT.reSize();
				});
            };
            this.hide = function() {
                this.CalendarBox.hide();
                $(window).unbind('resize');
            };
            this.setValue = function(dateString) {
				if(dateString != undefined && dateString != "") {
					var wd = new Array("ÀÏ", "¿ù", "È­", "¼ö", "¸ñ", "±Ý", "Åä");
					var objDate;
					if (dateString.indexOf('-') >= 0) {
						var date = dateString.split('-');
						var objDate = new Date(date[0], Number(date[1]) - 1, Number(date[2]));
					} else {
						var objDate = new Date(dateString.substring(0, 4), Number(dateString.substring(4, 6))-1, dateString.substring(6, 8));
						dateString = dateString.substring(0, 4) + '-' + dateString.substring(4, 6) + '-' + dateString.substring(6, 8);
					}
					this.selectedValue = dateString;
					this.selectedText = THAT.selectedValue + "(" + wd[objDate.getDay()] + ")";
					this.Control.val(THAT.selectedText);
				}
            };
            this.focus = function() {
                this.Control.focus();
            };
            this.added = new Array();
            this.appendCalendar = function(year, month, monthIndex) {
                try {
                    for (var v in THAT.added) {
                        if (THAT.added[v] == year + '-' + month) {
                            return;
                        }
                    }
                    var xmlString = this.getCalendarXml(year, month);
                    var now = new Date();
                    var xsltpath = "/product/lodge/Calendar.xslt";
                    var params = {
                        CalendarNo: this.CalendarNo,
                        MonthIndex: monthIndex,
                        Tyear: now.getFullYear(),
                        Tmonth: now.getMonth() + 1,
                        Tdate: now.getDate()
                    };
                    var calendarHTML = ju.dt.xmlTransForm(xmlString, xsltpath, params, false);
                    this.innerCalendarBox.append(calendarHTML);
                    $('.calendardate.add' + this.CalendarNo + monthIndex).each(function() {
                        $(this).css('cursor', 'pointer');
                        $(this).hover(function(e) {
                            $(this).css('backgroundColor', '#F8C0E7');
                        },
						function(e) {
						    $(this).css('backgroundColor', '#FFFFFF');
						}).bind('click',
						function(e) {
						    try {
						        THAT.selectedValue = $(this).attr('value');
						        THAT.selectedText = THAT.selectedValue + "(" + $(this).next().toggle().attr('value') + ")";
						        THAT.Control.attr('value', THAT.selectedText);
						        THAT.hide();
						        param.callback();
						    } catch (e) {
						        alert(e.message);
						    }
						});
                    });
                    THAT.added.push(year + '-' + month);
                } catch (e) {
                    alert(e.message);
                }
            };
            this.currentIndex = -1;
            while (param.CalendarCount-- > 0) {
                var date = new Date(param.StartYear, param.StartMonth - 1, 1);
                this.current_year = date.getFullYear();
                this.current_month = date.getMonth() + 1;
                this.currentIndex++;
                this.appendCalendar(this.current_year, this.current_month, this.currentIndex);
                param.StartMonth++;
            };
            this.reSize = function() {
                var pos = this.Control.offset();
                this.CalendarBox.css({
                    left: parseInt(pos.left),
                    top: parseInt(pos.top) + 20
                });
            };
            return this;
        } catch (e) {
            alert(e.message);
        }
    }
});