
//********************************************************//
//	Date Picker Ver. 1.0
//  작성자 : 정병태
//  작성일 : 2008-06-10
//********************************************************//

var DatePicker = {};
DatePicker.Version = "1.0";

DatePicker.Month = Class.create({
	initialize : function(handler) {

		this.tmplYear = new Template("<div id='yearGroup_#{year}'><div class='num_gray num_gray_#{one} floL'></div><div class='num_gray num_gray_#{two} floL'></div><div class='num_gray num_gray_#{three} floL'></div><div class='num_gray num_gray_#{four} floL'></div></div>");
		this.tmplMonthYear = new Template("<div id='monthList_#{year}' class='monthList'>#{list}</div>");
		this.tmplMonth = new Template("<div class='month'><div class='num_orange num_orange_#{one} floL'></div><div class='num_orange num_orange_#{two} floL'></div></div>");
		this.tmplMonthName = new Template("<div class='month_name month_name_#{month}'></div>");
		this.tmplDateList = new Template("<div id='date_list_#{month}' class='monthGroup'></div>");
		this.tmplDay = new Template("<span id='day_#{year}_#{month}_#{day}' class='date  #{className}'>#{day}</span>");

		this.handler = handler ? handler : Prototype.emptyFunction;
		this.speed = 8;

		var param = getURL();

		if(param.startDate) this.today = Date.parseExact(param.startDate, "yyyyMMdd");
		else this.today = new Date().clearTime();
		if(param.endDate) this.eday = Date.parseExact(param.endDate, "yyyyMMdd");
		else this.eday = new Date().clearTime();

		this.monthSize = 55;
		this.complete = 3;
		this.changed = false;

		this.offsetDates = $H({});
		this.eventDates = $A();
		this.eventLists = $A();
		this.mouseDownHandler = this.doMouseDown.bindAsEventListener(this);
		this.mouseMoveHandler = this.doMove.bindAsEventListener(this);
		this.mouseStopHandler = this.doMoveStop.bindAsEventListener(this);
		this.mouseDragHandler = this.doDrag;

		$("monthArrowLeft").observe('click', this.prevMonth.bind(this));
		$("monthArrowRight").observe('click', this.nextMonth.bind(this));
		$("monthArrowLeft").observe('mouseover', function() {
			$("monthArrowLeft").addClassName("monthArrowOver");
		});
		$("monthArrowRight").observe('mouseover', function() {
			$("monthArrowRight").addClassName("monthArrowOver");
		});
		$("monthArrowLeft").observe('mouseout', function() {
			$("monthArrowLeft").removeClassName("monthArrowOver");
		});
		$("monthArrowRight").observe('mouseout', function() {
			$("monthArrowRight").removeClassName("monthArrowOver");
		});

		this.picker = $("datePicker");
		this.picker.observe('mousedown', this.mouseDownHandler);
		$("dateSearchOverlay").setOpacity(0.4);
		
		$("dateSearchGuide").show();
		
		this.setMonth(this.today.getFullYear(), this.today.getMonth(),(this.today.getMonth()*(this.monthSize*-1)));
		this.setDateList();
		//this.handler(this.today.getFullYear(),this.today.getMonth(),this.today.getDate(),
			//this.eday.getFullYear(),this.eday.getMonth(),this.eday.getDate());
	},

	startWait : function() {
		$("dateSearchOverlay").show();
	},

	endWait : function() {
		setTimeout(function() {
			$("dateSearchOverlay").hide();
		},300);
	},

	setYear : function(year) {
		var num = new String(year);
		var tmpYearHTML = this.tmplYear.evaluate({year:year,one:num.substr(0,1),two:num.substr(1,1),three:num.substr(2,1),four:num.substr(3,1)});
		$("yearView").update(tmpYearHTML);
	},

	setMonth : function(year, month, left) {
		var tmpMonthHTML = "";
		for(i = 1; i <= 12; i++) {
			var num = new String(i >= 10 ? i : "0"+i);
			var tmpHTML = this.tmplMonth.evaluate({one:num.substr(0,1),two:num.substr(1,1)});
			tmpMonthHTML += tmpHTML;
		}
		var tmpYearHTML = this.tmplMonthYear.evaluate({year:year,list:tmpMonthHTML});
		$("monthView").insert(tmpYearHTML);
		$("monthList_"+year).setStyle({left:left+"px"});
		this.setYear(year);
		this.setMonthName(month);
	},

	prevMonth : function() {
		if(this.complete >= 3) {
			this.today.addMonths(-1).moveToLastDayOfMonth();
			if(this.today.getMonth() < 11) {
				new Effect.Tween("monthList_"+this.today.getFullYear(),{left:(this.today.getMonth()*(this.monthSize*-1))});
			} else {
				this.setMonth(this.today.getFullYear(), this.today.getMonth(), -660);
				new Effect.Tween("monthList_"+this.today.getFullYear(),{left:(this.today.getMonth()*(this.monthSize*-1))});
				new Effect.Tween("monthList_"+new Date(this.today).addYears(1).getFullYear(),{left:55 , onComplete : function() {
					$("monthList_"+new Date(this.today).addYears(1).getFullYear()).remove();
				}.bind(this)});
			}
			this.setMonthName(this.today.getMonth());
			this.prevDateList();
		}
	},

	nextMonth : function() {
		if(this.complete >= 3) {
			this.today.addMonths(1).moveToFirstDayOfMonth();
			if(this.today.getMonth() > 0) {
				new Effect.Tween("monthList_"+this.today.getFullYear(),{left:(this.today.getMonth()*(this.monthSize*-1))});
			} else {
				this.setMonth(this.today.getFullYear(), this.today.getMonth(), 55);
				new Effect.Tween("monthList_"+this.today.getFullYear(),{left:(this.today.getMonth()*(this.monthSize*-1))});
				new Effect.Tween("monthList_"+new Date(this.today).addYears(-1).getFullYear(),{left:-660, onComplete : function() {
					$("monthList_"+new Date(this.today).addYears(-1).getFullYear()).remove();
				}.bind(this)});
			}
			this.setMonthName(this.today.getMonth());
			this.nextDateList();
		}
	},

	setMonthName : function(month) {
		var tmpHTML = this.tmplMonthName.evaluate({month:month});
		$("monthNameView").update(tmpHTML);
	},

	makeDateList : function(year, month, onComplete) {
		var tmpHTML = this.tmplDateList.evaluate({month:month});
		var toMonth = this.today.getMonth();
		$("dateListArea").insert(tmpHTML);
		var tmpDateHTML = "";
		var className = "";
		for(i = 1; i <= Date.getDaysInMonth(year,month); i++) {
			className = this.today.equals(new Date(year,month,i).clearTime()) ? "seleted" : "";
			className = (new Date(year,month,i)).getDay() == 0 ? "holiday" : className;
			tmpDateHTML += this.tmplDay.evaluate({year:year, month:month, day:i, className: className});
		}
		tmpDateHTML += "<img src='/images/date/month_guide.gif' class='monthGuide' align='absmiddle' />";
		$("date_list_"+month).insert(tmpDateHTML);
		
		var tmpElement = new Element("div");
		tmpElement.setStyle({visibility:"hidden"});
		tmpElement.addClassName("monthGroup");
		tmpElement.update($("date_list_"+toMonth).innerHTML);
		$("dateListArea").insert(tmpElement);
		var toMonthWidth = tmpElement.offsetWidth;
		var toMonthOffset = ($("dateListArea").offsetWidth - toMonthWidth +5)/2;
		tmpElement.remove();
		tmpElement = null;

		var left = 0;
		if(month == toMonth) 
			left = toMonthOffset;
		else if(this.today.compareTo(new Date(year, month, 1)) < 0) 
			left = $("date_list_"+toMonth).offsetLeft + toMonthWidth;
		else if(this.today.compareTo(new Date(year, month, 1)) > 0) 
			left = $("date_list_"+toMonth).offsetLeft - $("date_list_"+month).offsetWidth;

		$("date_list_"+month).setStyle({left:left+"px"});
		if(onComplete) onComplete(); 
	},

	setDateList : function() {
		var prevDate = new Date(this.today).addMonths(-1); 
		var nextDate = new Date(this.today).addMonths(1); 
		this.eventLists.each(function(pair) {if(pair) pair();});
		this.eventLists = $A();
		this.makeDateList(this.today.getFullYear(), this.today.getMonth(), function() {
			var offsetLeft = $("date_list_"+this.today.getMonth()).offsetLeft;
			var todayElement = $("day_"+this.today.getFullYear()+"_"+this.today.getMonth()+"_"+this.today.getDate());
			this.todayLeft = todayElement.offsetLeft+offsetLeft;
			this.todayRight = todayElement.offsetLeft+todayElement.offsetWidth+offsetLeft;
			this.setDatesOffset();
			this.movePickerToday();
		}.bind(this));
		this.makeDateList(prevDate.getFullYear(), prevDate.getMonth(),function() {
			$("date_list_"+prevDate.getMonth()).observe("click",this.prevMonth.bind(this));
			this.eventLists.push(function() {$("date_list_"+prevDate.getMonth()).stopObserving("click");});
		}.bind(this));
		this.makeDateList(nextDate.getFullYear(), nextDate.getMonth(),function() {
			$("date_list_"+nextDate.getMonth()).observe("click",this.nextMonth.bind(this));
			this.eventLists.push(function() {$("date_list_"+nextDate.getMonth()).stopObserving("click");});
		}.bind(this));
	},

	hidePicker : function() {
		$("datePicker").hide();
		$("datePoint").hide();
		$("datePointLine").hide();
		$("dateSelectRange").hide();
	},

	resetDateSelected : function() {
		this.offsetDates.each(function(pair) {
			var element = document.getElementById(pair.key);
			var elementClassName = element.className;
			var className = "seleted";
			if(new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))
					 element.className = element.className.replace(
						new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ');
		}.bind(this));
	},

	setDatesOffset : function() {
		this.offsetDates = $H({});
		this.eventDates.each(function(pair) {pair();});
		$("date_list_"+this.today.getMonth()).select("span").each(function(pair) {
			pair.observe("click", this.selectDate.bindAsEventListener(this));
			this.eventDates.push(function() {pair.stopObserving("click");});
			var dayLeft = pair.positionedOffset()[0]+$("date_list_"+this.today.getMonth()).offsetLeft;
			var dayRight = pair.positionedOffset()[0]+pair.offsetWidth+$("date_list_"+this.today.getMonth()).offsetLeft; 
			this.offsetDates.set(pair.id,$A([dayLeft,dayRight-1]));
		}.bind(this));
	},
	

	movePickerToday : function() {
		var todayElement = $("day_"+this.today.getFullYear()+"_"+this.today.getMonth()+"_"+this.today.getDate());
		var dayLeft = todayElement.positionedOffset()[0]+todayElement.up("div").positionedOffset()[0];
		$("datePicker").show().setStyle({left:(dayLeft-($("datePicker").offsetWidth/3)-1)+"px"});
		$("datePoint").show().setStyle({left:(dayLeft+(todayElement.offsetWidth/2)-($("datePoint").offsetWidth/2))+"px"});
		$("datePointLine").show().setStyle({width:"1px",left:(dayLeft+(todayElement.offsetWidth/2))+"px"});
		$("dateSelectRange").show().setStyle({width:(todayElement.offsetWidth+1)+"px", left:dayLeft+"px"});

		this.offsetDates.each(function(pair) {
			var element = document.getElementById(pair.key);
			var elementClassName = element.className;
			var className = "seleted";
			if(todayElement.id == pair.key) {
				if(!new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)) 
						element.className += " "+className;
			} else {
				if(new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))
						 element.className = element.className.replace(
							new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
			}
		}.bind(this));
	},

	selectDate : function(e) {
		var srcObj=(e.srcElement||e.target);
		var dates = srcObj.id.split("_");
		this.today.set({year:parseInt(dates[1],10),month:parseInt(dates[2],10),day:parseInt(dates[3],10)});
		this.eday.set({year:parseInt(dates[1],10),month:parseInt(dates[2],10),day:parseInt(dates[3],10)});

		this.movePickerToday();

		var todayElement = $("day_"+this.today.getFullYear()+"_"+this.today.getMonth()+"_"+this.today.getDate());
		this.todayLeft = todayElement.offsetLeft+$("date_list_"+this.today.getMonth()).offsetLeft;
		this.todayRight = todayElement.offsetLeft+todayElement.offsetWidth+$("date_list_"+this.today.getMonth()).offsetLeft;

		var dates = srcObj.id.split("_");
		this.today.set({year:parseInt(dates[1],10),month:parseInt(dates[2],10),day:parseInt(dates[3],10)});
		this.eday.set({year:parseInt(dates[1],10),month:parseInt(dates[2],10),day:parseInt(dates[3],10)});
		this.handler(this.today.getFullYear(),this.today.getMonth(),this.today.getDate(),
			this.eday.getFullYear(),this.eday.getMonth(),this.eday.getDate());
	},

	prevDateList : function() {
		this.complete = 0;
		this.resetDateSelected();
		var prevDate = new Date(this.today).addMonths(-1);
		var nextDate = new Date(this.today).addMonths(1);
		this.makeDateList(prevDate.getFullYear(), prevDate.getMonth());
		this.hidePicker();
		var tmpElement = new Element("div");
		tmpElement.setStyle({visibility:"hidden"});
		tmpElement.addClassName("monthGroup");
		tmpElement.update($("date_list_"+this.today.getMonth()).innerHTML);
		$("dateListArea").insert(tmpElement);
		var toMonthWidth = tmpElement.offsetWidth;
		var toMonthOffset = ($("dateListArea").offsetWidth - toMonthWidth +5)/2;
		tmpElement.remove();
		tmpElement = null;
		var todayId = "day_"+this.today.getFullYear()+"_"+this.today.getMonth()+"_"+this.today.getDate();

		this.eventLists.each(function(pair) {if(pair) pair();});
		this.eventLists = $A();

		new Effect.Tween("date_list_"+this.today.getMonth(),{
			left:toMonthOffset,
			speed : this.speed,
			onComplete : function() {
				this.complete++;
				var offsetLeft = $("date_list_"+this.today.getMonth()).offsetLeft;
				var todayElement = $("day_"+this.today.getFullYear()+"_"+this.today.getMonth()+"_"+this.today.getDate());
				this.todayLeft = todayElement.offsetLeft+offsetLeft;
				this.todayRight = todayElement.offsetLeft+todayElement.offsetWidth+offsetLeft;

				this.setDatesOffset();
				$("date_list_"+prevDate.getMonth()).observe("click",this.prevMonth.bind(this));
				$("date_list_"+nextDate.getMonth()).observe("click",this.nextMonth.bind(this));
				this.eventLists.push(function() {$("date_list_"+prevDate.getMonth()).stopObserving("click");});
				this.eventLists.push(function() {$("date_list_"+nextDate.getMonth()).stopObserving("click");});

				this.movePickerToday();
				this.eday = new Date(this.today);
				//this.handler(this.today.getFullYear(),this.today.getMonth(),this.today.getDate(),
				//this.eday.getFullYear(),this.eday.getMonth(),this.eday.getDate());
			}.bind(this)
		});
		new Effect.Tween("date_list_"+prevDate.getMonth(),{
			left: ($("date_list_"+prevDate.getMonth()).offsetWidth - toMonthOffset)*-1,
			speed : this.speed,
			onComplete : function() {
				this.complete++;
			}.bind(this)
		});
		new Effect.Tween("date_list_"+nextDate.getMonth(),{
			left: toMonthWidth + toMonthOffset,
			speed : this.speed,
			onComplete : function() {
				this.complete++;
			}.bind(this)
		});

		var nnDate = new Date(nextDate).addMonths(1);
		var nnMonth = nnDate.getMonth();
		if($("date_list_"+nnMonth)) $("date_list_"+nnMonth).remove();
	},

	nextDateList : function() {
		this.complete = 0;
		this.resetDateSelected();
		var prevDate = new Date(this.today).addMonths(-1); 
		var nextDate = new Date(this.today).addMonths(1); 
		this.makeDateList(nextDate.getFullYear(), nextDate.getMonth());
		this.hidePicker();
		var tmpElement = new Element("div");
		tmpElement.setStyle({visibility:"hidden"});
		tmpElement.addClassName("monthGroup");
		tmpElement.update($("date_list_"+this.today.getMonth()).innerHTML);
		$("dateListArea").insert(tmpElement);
		var toMonthWidth = tmpElement.offsetWidth;
		var toMonthOffset = ($("dateListArea").offsetWidth - toMonthWidth +5)/2;
		tmpElement.remove();
		tmpElement = null;

		this.eventLists.each(function(pair) {if(pair) pair();});
		this.eventLists = $A();

		new Effect.Tween("date_list_"+this.today.getMonth(),{
			left:toMonthOffset,
			speed : this.speed,
			onComplete : function() {
				this.complete++;
				var offsetLeft = $("date_list_"+this.today.getMonth()).offsetLeft;
				var todayElement = $("day_"+this.today.getFullYear()+"_"+this.today.getMonth()+"_"+this.today.getDate());
				this.todayLeft = todayElement.offsetLeft+offsetLeft;
				this.todayRight = todayElement.offsetLeft+todayElement.offsetWidth+offsetLeft;
				this.setDatesOffset();
				$("date_list_"+prevDate.getMonth()).observe("click",this.prevMonth.bind(this));
				$("date_list_"+nextDate.getMonth()).observe("click",this.nextMonth.bind(this));
				this.eventLists.push(function() {$("date_list_"+prevDate.getMonth()).stopObserving("click");});
				this.eventLists.push(function() {$("date_list_"+nextDate.getMonth()).stopObserving("click");});

				this.movePickerToday();
				this.eday = new Date(this.today);
				//this.handler(this.today.getFullYear(),this.today.getMonth(),this.today.getDate(),
				//this.eday.getFullYear(),this.eday.getMonth(),this.eday.getDate());
			}.bind(this)
		});
		new Effect.Tween("date_list_"+prevDate.getMonth(),{
			left: ($("date_list_"+prevDate.getMonth()).offsetWidth - toMonthOffset)*-1,
			speed : this.speed,
			onComplete : function() {
				this.complete++;
			}.bind(this)
		});
		new Effect.Tween("date_list_"+nextDate.getMonth(),{
			left: toMonthWidth + toMonthOffset,
			speed : this.speed,
			onComplete : function() {
				this.complete++;
			}.bind(this)
		});
		var ppMonth = new Date(prevDate).addMonths(-1).getMonth();
		if($("date_list_"+ppMonth)) $("date_list_"+ppMonth).remove();
	},

	
	// 해당 객체 위에 마우스를 클릭하면 드래그 속성을 시작한다.
	doMouseDown : function(e) {	
		this.changed = false;
		var srcObj=(e.srcElement||e.target);
		var nodeName = srcObj.nodeName.toUpperCase();
		var offset = Position.cumulativeOffset(this.picker);
		this.picker._x = (e.pageX||e.clientX) - this.picker.offsetLeft;
		document.observe('mousemove', this.mouseMoveHandler);
		document.observe('mouseup', this.mouseStopHandler);
		document.observe('selectstart', this.mouseDragHandler);
		document.observe('dragstart', this.mouseDragHandler);
	},
	
	// 해당 객체 위에서 마우스를 누른 상태에서 이동하면 팝업을 마우스의 위치로 이동시킨다.
	doMove : function(e) {
		var arrayPageSize = getPageSize();
		var element = $("date_list_"+this.today.getMonth());
		var leftLimit = element.offsetLeft;
		var rightLimit = element.offsetLeft+element.offsetWidth;
		if((e.pageX||e.clientX)-this.picker._x < leftLimit-25) this.picker.style.left = (leftLimit-25)+"px";
		else if(((e.pageX||e.clientX)-this.picker._x)+this.picker.offsetWidth > rightLimit+20)  
			this.picker.style.left = (rightLimit-this.picker.offsetWidth)+20+"px";
		else this.picker.style.left = (e.pageX||e.clientX)-this.picker._x+"px";
		this.doMovePicker();
	},

	doMovePicker : function() {
		if(!this.interval) {
			clearTimeout(this.interval);
			var element = document.getElementById("datePointLine");
			var datePointElement = document.getElementById("datePoint");
			var todayElement = $("day_"+this.today.getFullYear()+"_"+this.today.getMonth()+"_"+this.today.getDate());
			if(this.picker.offsetLeft+25 > datePointElement.offsetLeft) {
				element.style.width = (this.picker.offsetLeft+40 - datePointElement.offsetLeft)+"px";
				element.style.left = datePointElement.offsetLeft+"px";
			} else {
				element.style.width = (datePointElement.offsetLeft - this.picker.offsetLeft-(todayElement.offsetWidth))+"px";
				element.style.left = (this.picker.offsetLeft+(todayElement.offsetWidth))+"px";
			}
			this.doMoveSeleter();
		}
	},

	doMoveSeleter : function() {
		var element = document.getElementById("dateSelectRange");
		var datePointElement = document.getElementById("datePoint");
		this.offsetDates.each(function(pair) {
			var dateLeft = pair.value[0];
			var dateRight = pair.value[1];
			if(this.picker.offsetLeft+25 >= dateLeft && this.picker.offsetLeft+25 <= dateRight) {
				if(this.picker.offsetLeft+25 >= datePointElement.offsetLeft) {
					var width = dateRight - this.todayLeft+1;
					element.style.width = width+"px";
					element.style.left = this.todayLeft+"px";
					this.rangeWidth = width;
					this.rangeLeft = this.todayLeft;
				} else {
					var width = this.todayRight-dateLeft+1;
					element.style.width = width+"px";
					element.style.left = dateLeft+"px";
					this.rangeWidth = width;
					this.rangeLeft = dateLeft;
				}
				this.changed = true;
				throw $break;
			}
		}.bind(this));
		var rangeWidth = element.offsetWidth;
		var rangeLeft = element.offsetLeft;
		this.offsetDates.each(function(pair) {
			var element = document.getElementById(pair.key);
			var elementClassName = element.className;
			var className = "seleted";
			var dateLeft = pair.value[0];
			var dateRight = pair.value[1];
			if(rangeLeft <= dateLeft && rangeLeft+rangeWidth >= dateRight) {
				if(!new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)) 
						element.className += " "+className;
			} else {
				if(new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))
						 element.className = element.className.replace(
							new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
			}
		});
	},
	
	doMoveStop : function(e) {
		document.stopObserving('mousemove', this.mouseMoveHandler);
		document.stopObserving('mouseup', this.mouseStopHandler);
		document.stopObserving('selectstart', this.mouseDragHandler);
		document.stopObserving('dragstart', this.mouseDragHandler);
		if(this.changed) {
			this.offsetDates.each(function(pair) {
				var dateLeft = pair.value[0];
				var dateRight = pair.value[1];
				if(this.picker.offsetLeft+25 >= dateLeft && this.picker.offsetLeft+25 <= dateRight) {
					new Effect.Tween(this.picker,{
						left:(dateLeft-(this.picker.offsetWidth/3)-1), 
						onComplete : function() {
							var date = pair.key.split("_");
							this.eday.set({year:parseInt(date[1],10), month:parseInt(date[2],10), day:parseInt(date[3],10)});
							var sdate = this.eday >= this.today ? this.today : this.eday;
							var edate = this.eday <= this.today ? this.today : this.eday;
							this.handler(sdate.getFullYear(),sdate.getMonth(),sdate.getDate(),
								edate.getFullYear(),edate.getMonth(),edate.getDate());
						}.bind(this)
					});
					throw $break;
				}
			}.bind(this));
			this.changed = false;
		}
	},
	
	doDrag : function(e) {
		Event.stop(e);
	}
});