	$(document).ready(function(){
		dateChanger.init();
	});

	var dateChanger =
	{
		// temporary vars for day change
		_currentYearElem: null,
		_currentMonthElem: null,
		_currentDayElem: null,
		currentDaySelectedIndex: null,
		
		// year-month-day collection
		elemRelations: [],
		
		// days' type
		daysType:
		{
			type28: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28],
			type29: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],
			type30: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],
			type31: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
		},
		
		
		init: function()
		{
			var safari = (navigator.userAgent.indexOf("Safari") != -1)? true : false;
			if(safari) return;
			
			// target setting
			dateChanger.regElemRelation($(birth_year),$(birth_month),$(birth_day));
			
			dateChanger.bindEvents();
			dateChanger.onloadDayChange();
		},
		
		
		onloadDayChange: function(){
			for(var i=0,current; current=dateChanger.elemRelations[i]; i++)
				dateChanger.dayChangeFromYear(current["year"].get(0));
		},
		bindEvents: function()
		{
			for(var i=0,current; current=dateChanger.elemRelations[i]; i++)
			{
				current["year"].change(function(){
					dateChanger.dayChangeFromYear(this);
				});
				current["month"].change(function(){
					dateChanger.dayChangeFromMonth(this);
				});
			}
		},
		dayChangeFromYear: function(elem){
			dateChanger._currentYearElem = $(elem);
			dateChanger._currentMonthElem = dateChanger.findRelatedElem(elem,"month");
			dateChanger._currentDayElem = dateChanger.findRelatedElem(elem,"day");
			dateChanger.getCurrentSelectedIndex();
			var currentYear = dateChanger._currentYearElem.val();
			var currentMonth = dateChanger._currentMonthElem.val();
			dateChanger.refreshDayElem(currentYear,currentMonth,dateChanger._currentDayElem);
			dateChanger.returnCurrentSelectedIndex();
		},
		dayChangeFromMonth: function(elem){
			dateChanger._currentYearElem = dateChanger.findRelatedElem(elem,"year");
			dateChanger._currentMonthElem = $(elem);
			dateChanger._currentDayElem = dateChanger.findRelatedElem(elem,"day");
			dateChanger.getCurrentSelectedIndex();
			var currentYear = dateChanger._currentYearElem.val();
			var currentMonth = dateChanger._currentMonthElem.val();
			dateChanger.refreshDayElem(currentYear,currentMonth,dateChanger._currentDayElem);
			dateChanger.returnCurrentSelectedIndex();
		},
		getCurrentSelectedIndex: function(){
			dateChanger.currentDaySelectedIndex = dateChanger._currentDayElem.get(0).selectedIndex;
		},
		returnCurrentSelectedIndex: function(){
			try{
				dateChanger._currentDayElem.get(0).selectedIndex = dateChanger.currentDaySelectedIndex;
			}catch(e){}
		},
		findRelatedElem: function(elem,requestElemType)
		{
			for(var i=0,current; current=dateChanger.elemRelations[i]; i++)
			{
				for(var key in current)
				{
					if(elem==current[key].get(0)) return current[requestElemType];
				}
			}
			return false;
		},
		regElemRelation: function(yearElem,monthElem,dayElem)
		{
			if(!(yearElem.length==1||monthElem==1||dayElem.length==1)) return;
			dateChanger.elemRelations.push(
				{
					year : yearElem,
					month: monthElem,
					day: dayElem
				}
			);
		},
		refreshDayElem: function(year,month,$dayElem)
		{
			var type = dateChanger.checkDaysType(year,month);
			$dayElem.find("option").remove();
			for(var i=0,current; current=dateChanger.daysType[type][i]; i++)
			{
				var option = document.createElement("option");
					option.setAttribute("value",current);
				var optionText = document.createTextNode(current);
					option.appendChild(optionText);
				$dayElem.get(0).appendChild(option);
			}
		},
		checkDaysType: function(year,month)
		{
			return (month==2) ? 
				((dateChanger.isLeapYear(year)) ? "type29" : "type28") :
					((month==4|month==6|month==9|month==11) ? "type30" : "type31");
		},
		isLeapYear: function(year)
		{
			return (year%4==0) ? 
				(year%100!=0) ? true :
					((year%400==0) ? true : false) :
				false;
		}
	}
