﻿function DaySeclectorInstance(gid, hfield) //상품 상태에 따라 날짜를 disable 시키기 위해 필요.
{
    this.GID = gid;
    this.stateList = null;
    hfield.setAttribute('gid', gid);
    hfield.myObj = this;
}
DaySeclectorInstance.prototype.SetHiddenField = function(gid, hfield)
{
    hfield.setAttribute('gid', gid);
    hfield.myObj = this;
}

//DropDown 이벤트 핸들러...(날짜 또는 시간 바뀔때)
DaySeclectorInstance.prototype.OnEvtDD = function(evt)
{
    var e=evt?evt:window.event?window.event:null;
	var src = e.target ? e.target : (e.srcElement ? e.srcElement : null);
	var tbl = GUtil.FindOuterElementByClass(src, 'tblDateContainer');
	var hfield = GUtil.findElem('hDate', tbl, 'input');
	hfield.myObj.OnEvtDDHandler(evt);
}

//달력 컨트롤 이벤트 핸들러...
DaySeclectorInstance.prototype.OnEvtCalendar = function(calendar, date)
{
    hfield = $(calendar.params['inputField'].id);
	hfield.myObj.OnEvtCalendarHandler(calendar, date);
}

DaySeclectorInstance.prototype.isDisableDate = function(date, hfield) {
    _day = 1000 * 60 * 60 * 24;
    var today = new Date();
    if( ((date.getTime() - today.getTime()) / _day) < -1) return true; //오늘 이전이면....
    
    srcCtl = null;
    if(typeof calendar != 'undefined' && calendar != null && calendar != 'undefined')
        hfield = $(calendar.params['inputField'].id);
    
    srcCtl = hfield.myObj;
    
    //hfield = srcCtl.hDate;//$(calendar.params['inputField'].id);
    srcCtl.GID = hfield.getAttribute('gid');
    
    if(srcCtl.GID == 0 || srcCtl.GID == null || srcCtl.GID == "0" ) return false;        
    if(srcCtl.stateList == null)
    {
        ob_post.AddParam("gid", srcCtl.GID);
        result = ob_post.post("/Helper/WS/GoodState.aspx", "GoodsStateList");            
        
        if(result=='undefined' || result=='' || result==null)
        {  
            srcCtl.GID = 0;
            srcCtl.stateList = "";
        }
        else 
            srcCtl.stateList = result.split('#');
    }
    
    isClosed = false; //예약마감
    if(this.stateList!="")
    {
        for(k=0; k<srcCtl.stateList.length; k++)
        {
            if(srcCtl.stateList[k]=="") continue;
            cond = srcCtl.stateList[k].split('$');
            if(cond.length != 3 ) continue;
            st = GUtil.parseDate(cond[0]);
            et = GUtil.parseDate(cond[1]);

            if(st <= date && date <= et)
            {
                cl = true;
                if(cond[2] == '예약가능') cl = false;
                isClosed = cl;
            }
        }
    }
    
    if(isClosed) return "gclosed";
    return false;
}

DaySeclectorInstance.prototype.CheckCloseGood = function (ddd, hfield) {
    res = this.isDisableDate(ddd, hfield);
    if( res == "gclosed")
    {
        return true;
    }
    return res;
}

//드롭다운에서 직접 변경했을때... (달력 컨트롤 변경시는 아래에 있다...)
DaySeclectorInstance.prototype.OnEvtDDHandler = function (evt) {
    var e=evt?evt:window.event?window.event:null;
    var src = e.target ? e.target : (e.srcElement ? e.srcElement : null);	    
    
    var tbl = GUtil.FindOuterElementByClass(src, 'tblDateContainer');
    var ddyear = GUtil.ElemByClass('ddYear', tbl, 'select' );
    var ddmonth = GUtil.ElemByClass('ddMonth', tbl, 'select' );
    var ddday = GUtil.ElemByClass('ddDay', tbl, 'select' );

    var hfield = GUtil.findElem('hDate', tbl, 'input');
    hfield.value = ddyear.value + "-" + ddmonth.value + "-" + ddday.value;   

    var hM = null;
    ddhour = GUtil.ElemByClass('ddHour', tbl, 'select' );
    if(ddhour!= null && ddhour != 'undefined')
    {
        ddminute = GUtil.ElemByClass('ddMinute', tbl, 'select' );
        hM = ddhour.value + ":" + ddminute.value;
        hfield.value = hfield.value + " " + hM;
    }

    if(src.id.indexOf('ddYear')>=0 ||src.id.indexOf('ddMonth')>=0) //년월이 바뀔때는 월의 마지막 날짜를 지정한다.
    {
        hfield.value = ddyear.value + "-" + ddmonth.value + "-01"; //년,월,일 설정
        if(hM!=null) hfield.value = hfield.value + " " + hM; //시간을 추가하기        
        ddday.selectedIndex = 0;
        DaySelectorDD.SetupMonthDropDown(hfield);
    }

    if(this.CheckCloseGood(new Date(GUtil.parseDate(hfield.value)), hfield) ) //마감된 날짜 선택시 경고 보여주도록 한다.
    {
        alert('상품이 마감된 날짜입니다.\n\n옆의 달력아이콘을 클릭하면 마감된 날짜(회색)를 볼 수 있습니다.');
    }
    else
    {
        try //상품일 경우 마감안되었을 때만 실행하도록...
        {
            if(typeof hfield.onclick != 'undefined' && hfield.onclick != null)
               hfield.onclick(hfield);
        }catch(e){}
    }  
}

//달력의 선택 날짜가 바뀔때... html 컨트롤들의 값을 변경한다. (드롭다운 직접 변경시는 위에 있다)
DaySeclectorInstance.prototype.OnEvtCalendarHandler = function(calendar, date) {
    if(!calendar.dateClicked) return; //달,년도등이 바뀐경우 이벤트 발생시키지 않는다. //원래 없던 것.. 문제 발생시 삭제..
    
    var hfield = $(calendar.params['inputField'].id);
    hfield.value = date;

    var tbl = GUtil.FindOuterElementByClass(hfield, 'tblDateContainer');
    var ddyear = GUtil.ElemByClass('ddYear', tbl, 'select' );
    var ddmonth = GUtil.ElemByClass('ddMonth', tbl, 'select' );
    var ddday = GUtil.ElemByClass('ddDay', tbl, 'select' );
    
    var day = date.split('-');
    ddyear.value = day[0]; if(ddyear.selectedIndex<0) ddyear.selectedIndex = 0;
    ddmonth.value = day[1]; if(ddmonth.selectedIndex<0) ddmonth.selectedIndex = 0;
    ddday.value = day[2]; if(ddday.selectedIndex<0) ddday.selectedIndex = 0;
    
    hfield.value = ddyear.value + '-' + ddmonth.value + '-' + ddday.value;
    
    ddhour = GUtil.ElemByClass('ddHour', tbl, 'select' );
    if(ddhour!= null && ddhour != 'undefined')
    {
        ddminute = GUtil.ElemByClass('ddMinute', tbl, 'select' );
        hfield.value =hfield.value + " " + ddhour.value + ":" + ddminute.value;
    }
    
    if(calendar.dateClicked) //시간 변경은 못잡음.
        calendar.hide();

    //달에 따라 끝 날짜를 바꾸어야 한다.
    DaySelectorDD.SetupMonthDropDown(hfield);
    
    if(this.CheckCloseGood(new Date(GUtil.parseDate(hfield.value)) , hfield)) //마감된 날짜 선택시 경고 보여주도록 한다.
    {
        alert('회색으로 표시된 날짜는 상품이 마감된 날짜 입니다.\n\n 다른 날짜를 선택하세요.');
    }
    else
    {
        try //상품일 경우 마감안되었을 때만 실행하도록...
        {
            if(typeof hfield.onclick != 'undefined' && hfield.onclick != null)
               hfield.onclick(hfield);
        }catch(e){}
    }
}


var DaySelectorDD = {
    //선택된 달에 대해 해당 월별로 마지막날짜를 지정한다.
    SetupMonthDropDown : function (hfield) 
    {
        th = GUtil.parseDate(hfield.value)
        th = new Date(th);
        last = th.getMonthDays(); //해당월의 마지막 날
        
        tbl = GUtil.FindOuterElementByClass(hfield, 'tblDateContainer');        
        ddday = GUtil.ElemByClass('ddDay', tbl, '*' );
        
        for(k = 27; k <= 31; k++)
        {
            if(k <= last)
            {
                if(ddday.options[k-1] == null)
                    ddday.options[k-1] = new Option(k, k);
            }
            else
                ddday.options[k-1] = null;
        }
        
        ddday.options.length = last;
    },

    //strDate : 2006-12-09 12:00 형식으로 받아야 한다.
    SetDateTime : function  (outElem, strDate)
    {
        try
        {
            if(typeof strDate == 'string')
                theDate = Date.parse(strDate.replace(/-/g,"/"));
            else
                theDate = strDate;
        }catch(e)
        { return false; }
        
        var ddyear = GUtil.ElemByClass('ddYear', outElem, 'select' );       if(ddyear == null) return false;
        var ddmonth = GUtil.ElemByClass('ddMonth', outElem, 'select' );     if(ddmonth == null) return false;
        var ddday = GUtil.ElemByClass('ddDay', outElem, 'select' );         if(ddday == null) return false;
        var ddhour = GUtil.ElemByClass('ddHour', outElem, 'select' );       //if(ddhour == null) return false; //시분은 안보일수도..
        var ddminute = GUtil.ElemByClass('ddMinute', outElem, 'select' );   //if(ddminute == null) return false;
        var hdate = GUtil.findElem('hDate', outElem, 'input' );             if(hdate == null) return false;

        try{
            dstr = GUtil.dateToString(theDate);
            tstr = GUtil.timeToString(theDate);
        }catch(e){ return false; }
        
        hdate.value = dstr + ' ' + tstr;
        dstr = dstr.split('-');
        tstr = tstr.split(':');
        if(dstr!=null && dstr.length ==3)
        {
            ddyear.value = dstr[0]; if( ddyear.selectedIndex < 0) ddyear.selectedIndex = 0;
            ddmonth.value = dstr[1]; if( ddmonth.selectedIndex < 0) ddmonth.selectedIndex = 0;
            ddday.value = dstr[2]; if( ddday.selectedIndex < 0) ddday.selectedIndex = 0;
            hdate.value = ddyear.value + '-' + ddmonth.value + '-' + ddday.value;
        }
        if(ddhour != null && typeof ddhour != 'undefined')
        {
            ddhour.value = tstr[0]; if( ddhour.selectedIndex < 0) ddhour.selectedIndex = 0;
            ddminute.value = tstr[1]; if( ddminute.selectedIndex < 0) ddminute.selectedIndex = 0;
            
            hdate.value = ddyear.value + '-' + ddmonth.value + '-' + ddday.value + " " + ddhour.value + ":" + ddminute.value;
        }
        
        return true;
    },

    // 현재 컨트롤들이 가진 날짜 값을 문자열로 반환한다.
    getSelectedDateTimeString : function  (outerElem)
    {
        tag = outerElem.tagName.toLowerCase();
        if(tag == 'input' || tag == 'select')
            outerElem = GUtil.FindOuterElementByClass(outer, 'tblDateContainer');
        
        d_year = GUtil.ElemByClass('ddYear', outerElem, 'select' );
        d_month = GUtil.ElemByClass('ddMonth', outerElem, 'select' );
        d_day = GUtil.ElemByClass('ddDay', outerElem, 'select' );
        d_hour = GUtil.ElemByClass('ddHour', outerElem, 'select' );
        d_minute = GUtil.ElemByClass('ddMinute', outerElem, 'select' );
        
        if(d_hour ==null || typeof d_hour == 'undefined')
            return d_year.value + "-" + d_month.value + "-" + d_day.value;
        else
            return d_year.value + "-" + d_month.value + "-" + d_day.value + " " + d_hour.value + ":" + d_minute.value;
    },
    
    ConfirmCarStEt : function(src, stouter, etouter)
    {
        if(stouter==null || etouter == null) return;
        
        var st = GUtil.parseDate(DaySelectorDD.getSelectedDateTimeString(stouter));
        var et = GUtil.parseDate(DaySelectorDD.getSelectedDateTimeString(etouter));
        
        var hm = GUtil.dateDiffInHourMin(st, et);
        
        if(src != null)
        {
            var cst = GUtil.findElem(src.id, stouter, '*'); //시작일이 바뀌었는지 확인한다.
            var cet = GUtil.findElem(src.id, etouter, '*'); //종료일이 바뀌었는지 확인한다.
            
            if(typeof cst != 'undefined' && cst!=null && (hm[0]<=0 || hm[0] > 24*30) ) //시작일 바뀌었다..
            {
                var dayNext = GUtil.dateAddDayTime(st, 1,0,0);
                DaySelectorDD.SetDateTime(etouter, dayNext);
                
                hm = GUtil.dateDiffInHourMin(st, dayNext);
            }
            else if(typeof cet != 'undefined' && cet!=null && (hm[0]<=0 || hm[0] > 24*30) ) //종료일 바뀌었다..
            {
                var dayBefore = GUtil.dateAddDayTime(et, -1,0,0);
                DaySelectorDD.SetDateTime(stouter, dayBefore);
                
                hm = GUtil.dateDiffInHourMin(dayBefore, et);
            }
        }
        
        if(isNaN(hm[0]) || isNaN(hm[1]))
            return '-잘못된 날짜,시간';
        else if(hm[0]>24*30)
            return '-최대30일까지!';
        else
            return hm[0] + '시간 ' + hm[1] + '분';
    }
}