
var days=["일","월","화","수","목","금","토"];
var days_s=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
/*입력조건으로 부터 생성 조건 지정*/
function initCalendar(bodyId,tableId,tableClass,tableTitle,tableType,yearAndMon){
	//alert("===testCalendar====");
	if(!yearAndMon){
		//alert("입력날짜가 없습니다.!")
		targetDate = new Date();	
		firstDate = new Date(targetDate.getFullYear(),targetDate.getMonth(), 1);
	}else{
		//alert("입력날짜가 있습니다.!")
		yearMonth=yearAndMon.split("-")
		targetDate = new Date(yearMonth[0],yearMonth[1]-1);
		firstDate = new Date(targetDate.getFullYear(),targetDate.getMonth(), 1);
	}
	/*날짜 관련부분*/
	nowYear = targetDate.getFullYear();
	nowMonth = targetDate.getMonth() + 1
	
	firstDay = firstDate.getDay();
	
	chckNow(nowYear,nowMonth)
	leapYear(nowYear,nowMonth);
	
	
	//alert(targetDate + "==" + nowYear + "년 " + nowMonth + "월 " + "1일 " + "(" + days[firstDay] + ") 날자수는" + nowDayCnt);
	mkCalendar(bodyId,nowYear,nowMonth,nowDate,nowDayCnt,firstDay,tableId,tableClass,tableTitle)
	//일정용 Ajax
	ajaxTable=document.getElementById(tableId);
	ajaxTable.setAttribute("tableType",tableType);
	scheduleAjax(ajaxTable);
}	

/*윤년계산*/	
function leapYear(nowYear,nowMonth){
		if ((nowYear % 100 != 0 && nowYear % 4 == 0) || (nowYear % 400 == 0)) {
			febDays = 29
		}else {
			febDays = 28
		}
	var daysOfMonth = [31, febDays, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	nowDayCnt = daysOfMonth[nowMonth - 1]
	return nowDayCnt;
}

/*이번달 체크*/
function chckNow(nowYear,nowMonth){
	chckToday = new Date();
	if (nowYear == chckToday.getFullYear() && nowMonth == chckToday.getMonth() + 1) {
		nowDate = chckToday.getDate();
	}
	else {
		nowDate = 100;
	}
	return nowDate;
}

/*Calendar 생성*/	
function mkCalendar(bodyId,nowYear,nowMonth,nowDate,nowDayCnt,firstDay,tableId,tableClass,tableTitle){	
	HtmlBody=document.getElementById(bodyId);
	
	mkTable(tableId,tableClass);
		if(tableTitle==true){
			mkTableCaption(nowYear,nowMonth);
			newTable.appendChild(tableCaption);
		}
		mkColgroup();
		newTable.appendChild(newColgroup); 
		
		mkTableHead(nowYear,nowMonth,tableTitle);
		newTable.appendChild(newThead);	
		
		mkTbody(nowDate,nowDayCnt,firstDay);
		newTable.appendChild(newTbody);
	
	HtmlBody.appendChild(newTable);
}

	/*Table 생성*/
	function mkTable(tableId,tableClass){
		newTable=document.createElement("Table");
		newTable.id=tableId;
		newTable.className=tableClass;
		return(newTable);
	}
	
		/*Caption의  생성*/
		function mkTableCaption(nowYear,nowMonth){
				tableCaption=document.createElement("CAPTION");
					var preSpan=document.createElement("SPAN");
					preSpan.className="bntSpan";
						/*mkButton()*/	
						mkButton("button","clendarBtn","preYear")
						mkSpan("<<")
						newBtn.appendChild(newSpan);
						preSpan.appendChild(newBtn);
						mkButton("button","clendarBtn","preMonth")
						mkSpan("<")
						newBtn.appendChild(newSpan);
						preSpan.appendChild(newBtn);
					tableCaption.appendChild(preSpan)
						
					var dateSpan=document.createElement("SPAN");
					dateSpan.className="titelSpan";
						mkSpan(nowYear,"yearText","yearData")
						mkSpan.id="nowYear";
						dateSpan.appendChild(newSpan);
						bar=document.createTextNode("년 ")
						dateSpan.appendChild(bar);
						mkSpan(nowMonth,"monthText","monthData")
						mkSpan.id="nowMonth";
						dateSpan.appendChild(newSpan);
						bar=document.createTextNode("월 ")
						dateSpan.appendChild(bar);
					tableCaption.appendChild(dateSpan)
					
					nextSpan=document.createElement("SPAN");
					nextSpan.className="bntSpan";
						/*mkButton()*/
						mkButton("button","clendarBtn","nextMonth")
						mkSpan(">")
						newBtn.appendChild(newSpan);
						nextSpan.appendChild(newBtn);
						
						mkButton("button","clendarBtn","nextYear")
						mkSpan(">>")
						newBtn.appendChild(newSpan);
						nextSpan.appendChild(newBtn);
							
					tableCaption.appendChild(nextSpan)
				return(tableCaption);		
			}
	
		/*Colgroup 생성*/
		function mkColgroup(){
			newColgroup=document.createElement("COLGROUP");
			newColgroup.id="days";
			newColgroup.span="7";
			return(newColgroup);
		}
		
		/*Thead 생성*/
		function mkTableHead(nowYear,nowMonth,tableTitle){
			newThead=document.createElement("THEAD");
			theadTr=document.createElement("TR");
			for(ia=0;ia<7;ia++){
				newTh=document.createElement("Th");
					newTh.className="days"+days_s[ia];
				mkSpan(days[ia],"span"+days_s[ia])
				newTh.appendChild(newSpan);
				
				theadTr.appendChild(newTh);
			}
			newThead.appendChild(theadTr);
			return(newThead);
		}
			
		/*TBody 생성*/
		function mkTbody(nowDate,nowDayCnt,firstDay){
			//alert(nowDate)
			newTbody=document.createElement("TBODY");
			dayText=0
			/*날짜 표시 첫 줄  생성*/
			tBodyFirtTr=document.createElement("TR");
				for(i=0;i<7;i++){
					tbodyTd=document.createElement("TD");
					tbodyTd.className="days"+days_s[i];
					if(i>=firstDay){
						dayText++
						dayTextNode=dayText
					}else{
						dayTextNode=""
					}
					creatDateText(dayTextNode);
					dateTextNode.setAttribute("dateAttr",nowYear+"-"+textLength(nowMonth,2)+"-"+textLength(dayText,2));
					if(nowDate==dayText){
						tbodyTd.className=tbodyTd.className+" toDay"
					}
					tbodyTd.appendChild(dateTextNode);
					tBodyFirtTr.appendChild(tbodyTd);
				}
			newTbody.appendChild(tBodyFirtTr);
			/*날짜 표시 첫 줄  생성*/
			
			/*나머지 줄의 생성*/
			rowCnt=Math.ceil((nowDayCnt-dayText)/7)
			for(r=0;r<rowCnt;r++){
				tBodyTr=document.createElement("TR");
					for(t=0;t<7;t++){
					tbodyTd=document.createElement("TD");
					tbodyTd.className="days"+days_s[t];
					if(dayText<nowDayCnt&&dayText!=0){
						dayText++
						dayTextNode=dayText
					}else{
						dayText=0
						dayTextNode=""
					}
					creatDateText(dayTextNode);
					dateTextNode.setAttribute("dateAttr",nowYear+"-"+textLength(nowMonth,2)+"-"+textLength(dayText,2));
					if(nowDate==dayText){
						tbodyTd.className=tbodyTd.className+" toDay"
					}
					tbodyTd.appendChild(dateTextNode);
					tBodyTr.appendChild(tbodyTd);
				}
				newTbody.appendChild(tBodyTr);	
			}
			return(newTbody);
		}	

function creatDateText(dayText){
	dateTextNodeId="TextNode_"+dayText;
	dateTextNode=mkSpan(dayText,"",dateTextNodeId)
	return(dateTextNode)
}
function textLength(text,rLength){
	text=text.toString()
	lenChk=text.length;
	//if (lenChk < rLength) {
		while (lenChk < rLength) {
			text = "0" + text
			lenChk++
		}
	//}
	return(text);
	
}
function mkSpan(spanText,spanClass,spanId){
	newSpan=document.createElement("SPAN");
	newTextNode=document.createTextNode(spanText);
	newSpan.className=spanClass;
	newSpan.id=spanId;
	newSpan.appendChild(newTextNode);
	return(newSpan);	
}

function mkButton(btnType, btnClass, btnId){
	newBtn=document.createElement("BUTTON");
	newBtn.className=btnClass;
	newBtn.id=btnId;
	newBtn.onclick= function(){modifDate(this)};
	newBtn.setAttribute("type",btnType);
	return(newBtn)
}

function modifDate(modBtn){
	//해당테이블의 선택
	calCaption=modBtn.parentNode.parentNode
	calTable=modBtn.parentNode.parentNode.parentNode;
	//현재 달력의 날자 획득
		nowYearSpan=calCaption.getElementsByTagName("SPAN")[4];
		nowYear=nowYearSpan.firstChild.nodeValue;
		nowMonthSpan=calCaption.getElementsByTagName("SPAN")[5];
		nowMonth=nowMonthSpan.firstChild.nodeValue;
	
	//버튼에 따른 날짜의 변경
	if(modBtn.id=="preYear"){ nowYear--;}
	if (modBtn.id == "preMonth") {
		nowMonth--
		if (nowMonth <= 0) {
			nowMonth = 12;
			nowYear--;
		}
	}
	if(modBtn.id=="nextYear"){ nowYear++ }
	if(modBtn.id=="nextMonth"){ 
		nowMonth++ 
		if(nowMonth>=13){
			nowMonth=1;
			nowYear++;
		}
	}
		nowYearSpan.firstChild.nodeValue=nowYear;
		nowMonthSpan.firstChild.nodeValue=nowMonth;
	
	//해당월 1일의 요일 확인
	ckFristDate=new Date(nowYear,nowMonth-1,1);
	firstDay=ckFristDate.getDay();
	//월별 날짜 수확인
	leapYear(nowYear,nowMonth)
	//alert(firstDay+"=="+nowDayCnt)
	mkModiArray(firstDay,nowDayCnt);
	modifTable(calTable, dateArray);
	
	//이번달 확인
	chckNow(nowYear,nowMonth)
	if(nowDate!=100){todayClass(calTable,nowDate)}
	scheduleAjax(calTable);	
}

//변경날짜용 배열 생성
function mkModiArray(firstDay, nowDayCnt){
	dateArray = new Array();
	dayText=1
	arrayCnt=0
	for (da=-firstDay; da<nowDayCnt; da++){
		if(da>=0){
			dateArray[arrayCnt]=dayText
			dayText++	
		}else{
			dateArray[arrayCnt]=null
		}
		arrayCnt++
	}
	return (dateArray);	
}

function modifTable(calTable, dateArray){
	newTrCnt = Math.ceil(dateArray.length/7);
	calTbody=calTable.getElementsByTagName("TBODY")[0]
	calTr=calTbody.getElementsByTagName("TR")
	
	modifTrCnt=calTr.length-newTrCnt
	if(modifTrCnt!=0){ modifTr(calTbody,modifTrCnt)}
	
	resetTbody(calTbody);
	insertNewDate(calTbody,dateArray);
}

function modifTr(calTbody,modifTrCnt){
	//alert("modifTr=="+modifTrCnt)
	if(modifTrCnt>0){removeTr(calTbody,modifTrCnt)}
	if(modifTrCnt<0){addTr(calTbody,modifTrCnt)}
}

	/*Tr의 추가*/
	function addTr(calTbody,modifTrCnt){
		//alert("addTr=="+modifTrCnt)
		for(trCnt=modifTrCnt;trCnt<0;trCnt++){
			newTr=document.createElement("TR");
			for(i=0;i<7;i++){
					tbodyTd=document.createElement("TD");
					if(i==0){
						tbodyTd.className="daysSun"
					}else if(i==6){
						tbodyTd.className="daysSat"
					}
						newTextNode=mkSpan("","","");
					
					tbodyTd.appendChild(newTextNode);
					newTr.appendChild(tbodyTd);
				}
			calTbody.appendChild(newTr);
		}
	}
	
	/*Tr의 삭제*/
	function removeTr(calTbody, modifTrCnt){
		nowTr = calTbody.getElementsByTagName("TR")
		nowLength = nowTr.length-1;
		removeCnt = nowLength - modifTrCnt;
		for(r=nowLength;r>removeCnt;r--){
			calTbody.removeChild(nowTr[r]);	
		}
		//alert("nowLength-modifTrCnt-removeCnt" + nowLength + "/" + modifTrCnt + "/" + removeCnt)
	}

function resetTbody(calTbody){
	calTd=calTbody.getElementsByTagName("TD");
	//alert("==resetTbody=="+calTd.length);
	for (tdCnt = 0; tdCnt < calTd.length; tdCnt++) {
		calTd[tdCnt].firstChild.nodeValue = " "
		if (calTd[tdCnt].className != "daysSun" && calTd[tdCnt].className != "daysSat") {
			calTd[tdCnt].className = "";
		}
		var dateNode=calTd[tdCnt].firstChild;
		dateNode.setAttribute("title","");
		dateNode.onclick=""
		dateNode.className="";	
		
		var reMoveDiv=calTd[tdCnt].getElementsByTagName("DIV")[0];
		if(reMoveDiv){
			calTd[tdCnt].removeChild(reMoveDiv);
		}
	}
}

function insertNewDate(calTbody,dateArray){
	calTd=calTbody.getElementsByTagName("TD");
	for(tdCnt=0;tdCnt<calTd.length;tdCnt++){
		if(!dateArray[tdCnt]){
			dateText=" "
		}else{
			dateText=dateArray[tdCnt];
		}
		calTd[tdCnt].firstChild.firstChild.nodeValue=dateText;
		calTd[tdCnt].firstChild.id="TextNode_"+dateText;
		calTd[tdCnt].firstChild.setAttribute("dateAttr",nowYear+"-"+textLength(nowMonth,2)+"-"+textLength(dateText,2));
	}
}

function todayClass(calTable,nowDate){
	calTds=calTable.getElementsByTagName("TD");
	for(tdsCnt=0;tdsCnt<calTds.length;tdsCnt++){
		if(calTds[tdsCnt].firstChild.firstChild.nodeValue==nowDate){
			calTds[tdsCnt].className=calTds[tdsCnt].className+" toDay"
		}
	}
}

/*XML 데이터 적용*/
function scheduleAjax(mTable){
	var requestDateVaue=nowYear+"-"+textLength(nowMonth,2);
	var requestUrl="/data/calendar.php?dates="+requestDateVaue;
	requstXML(requestUrl);
	var tableType=mTable.getAttribute("tableType");
	var tBodyTd=mTable.getElementsByTagName("TBODY")[0].getElementsByTagName("TD");
	var sDays=XMLDoc.getElementsByTagName("day");
	for(var i=0;i<sDays.length;i++){
		var dateText=sDays[i].getElementsByTagName("date")[0].firstChild.nodeValue;
		var schedules=sDays[i].getElementsByTagName("schedule");
		var scheduleCnt=schedules.length;
		for(var j=0;j<tBodyTd.length;j++){
			var dateNode=tBodyTd[j].firstChild;
			if(parseInt(dateNode.firstChild.nodeValue)==dateText){
				dateNode.setAttribute("title","("+scheduleCnt+")개의 일정이 있습니다.");
				dateNode.onclick=function(){test(this)}
				dateNode.className="schedule";
				
				//첫번째 일정 표시
				if (tableType != "mini") {
					var scheduleDiv = document.createElement("DIV");
					var title = schedules[0].getElementsByTagName("title")[0].firstChild.nodeValue;
					var href = schedules[0].getElementsByTagName("href")[0].firstChild.nodeValue;
					mkA(title, href);
					scheduleDiv.appendChild(newA);
					
					
					if (tableType == "full") {
						for (var k = 1; k < scheduleCnt; k++) {
							var title = schedules[k].getElementsByTagName("title")[0].firstChild.nodeValue;
							var href = schedules[k].getElementsByTagName("href")[0].firstChild.nodeValue;
							mkA(title, href);
							scheduleDiv.appendChild(newA);
						}
					}
					else {
						var cntX = scheduleCnt - 1
						if (cntX > 0) {
							spanText = "외 (" + cntX + ")건의 일정"
							mkSpan(spanText, "scheduleDsc");
							newSpan.onclick = function(){
								test(this)
							}
							scheduleDiv.appendChild(newSpan);
						}
					}
					tBodyTd[j].appendChild(scheduleDiv);
				}
			}
		}
	}
}

function mkA(AText,href){
	newA=document.createElement("A");
	newTextNode=document.createTextNode(AText);
	newA.appendChild(newTextNode);
	newA.setAttribute("href",href);
	newA.setAttribute("title",AText);
	newA.style.display="block";
	return(newA);	
}

function test(dateNode){
	var sTd=dateNode.parentNode;
	if(sTd.tagName!="TD"){
		sTd=sTd.parentNode;
	}
	var date=sTd.firstChild.getAttribute("dateattr");
	location="/data/schedule.html?dates="+date;
//	location="/data/schedule_write_view.php?dates="+date;
	//alert(date);
}


/* =============HttpRequest의 생성=====================================*/
	function createXmlHttp(){
		if (window.XMLHttpRequest) {
			xmlHttp = new XMLHttpRequest()
		}else if(window.ActiveXObject){
			try{
				xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
			}catch(e){
				try{
					xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
				}catch(e){
					xmlHttp=false;
				}
			}
		}
		return xmlHttp;
	}
	
	function requstXML(RequestUrl){ //Ajax.js의 비동기통신함수를 생성요청
		createXmlHttp();		
		var temp=new Date();
		var url=RequestUrl+"&time="+temp.getMilliseconds();
		//alert("작성된 URL : "+url);
		xmlHttp.onreadystatechange=responseXml;
		xmlHttp.open("GET",url,false);
		xmlHttp.send(null);
	}
	
	function responseXml(){
		if(xmlHttp.readyState==4){
			if(xmlHttp.status==200){
				//alert("XML파싱");
				XMLDoc=xmlHttp.responseXML;
				return;
			}else if(xmlHttp.status==404){
				//alert("요청한 문서를 찾을수 없음");
			}else{
				//alert("Error:Status code is"+ xmlHttp.status);
			}
		}
	}
