var today = new Date();
var todayDate = today.getFullYear()+'-'+fillZero(today.getMonth(),2)+'-'+fillZero(today.getDate(),2);
function POPopen( oID )
{
    for (i = 0; i < popupIDs.length; i++)
        document.getElementById(popupIDs[i]).style.display = 'none';
	document.getElementById("POP_"+oID).style.display = 'block';
}

function POPclose( oID )
{
	document.getElementById("POP_"+oID).style.display = 'none';
}

function SOBookingPanelopen(ID)
{
    //document.getElementById(visibleSOId).value = ID;
    var panel = document.getElementById("SOBookingTable"+ID);
    if (panel)
    {
        var link = lookupElement(panel, "MoreDetails");
        if (link)
        {
            //link.click();
            setLocalUpdate(ID);
            document.location.href=link.href;
	    }
    }
}

function dragStart(td)
{
    if (minStay == maxStay) return false;
    //window.status = 'dragStart';
    predragging = true;
    dragStartCell = td;
}

function dragEnd(td)
{
    //window.status = 'dragEnd';
    if (dragging)
    {
        highlight(dragStartCell, lookupCellX(td) - lookupCellX(dragStartCell) + 1, 'high', false);
        updateSel(dragStartCell, lookupCellX(td) - lookupCellX(dragStartCell) + 1);
        dragStartCell = null;
        predragging = false;
        dragging = false;
    }
}

function setLength(num)
{
    checkSelValid();
    updateSel(selCell, num);
}

function aroreserve_date2ts(date)
{
    date = date.split('-');
    date = date[1]+'/'+date[2]+'/'+date[0];
    d = Date.parse(date);
    return d;
}

function aroreserve_parseDate(date)
{
    date = date.split('-');
    date = date[1]+'/'+date[2]+'/'+date[0];
    d = new Date(date);
    return d;
}

function setDate(date)
{
    var diff = Math.round((aroreserve_date2ts(date) - aroreserve_date2ts(startDate)) / (3600 * 24 * 1000));
    if (checkPast(date) && checkDiff(diff) && checkLimitDate(date))
    {
        selDate = date;
        updateSel(lookupCell(diff, selRow), selLength);
    }
}

function setDateSO(date)
{
    //alert(date);
    var diff = Math.round((aroreserve_date2ts(date) - aroreserve_date2ts(startDate)) / (3600 * 24 * 1000));
    if (checkPast(date) && checkDiff(diff))
        updateSelSO(lookupCell(diff, selRow), selLength);
}

function checkDiff(d)
{
    //alert('diff='+diff);
    if (d == 0)
        return true;
    if (d < 0 || d > (numDays - selLength))
    {
        loading();
        cmd = '__doPostBack(\''+changeSource+'\',\'SCROLL\')';
        setTimeout(cmd, 0);
        return false;
    }
    return true;
}

function checkPast(date)
{
    var curDate = aroreserve_date2ts(date);
    if (curDate)
    {
        var diff2 = Math.round((new Date() - curDate) / (3600 * 24 * 1000));
        if (diff2 > 0)
        {
            selectDateCombo(today);
            selectDateComboSO(today);
            var diff = Math.round(today - aroreserve_date2ts(startDate)) / (3600 * 24 * 1000);
            checkDiff(diff);
            return false;
        }
    }
    else
        resetDate();
    return true;
}

function checkLimitDate(date)
{
    curDate = aroreserve_date2ts(date);
    if (curDate)
    {
        if (checkinLimits != "" && checkinLimits.indexOf(curDate.getDay().toString(), 0) == -1 )
        {
            alert(msg_CheckinLimits + msg_CheckinLimits_Days);
            //resetDate();
            return false;
        }
    }
    else
        resetDate();
    return true;
}

function loading()
{
    if (soLocalUpdate > 0)
    {
        var loadingSection = document.getElementById('soLoadingSection'+soLocalUpdate);
        if (loadingSection)
            loadingSection.style.display = '';        
        soLocalUpdate = 0;
    }
    else
    {
        if (document.getElementById('bookingTable')) document.getElementById('bookingTable').style.visibility = 'hidden';
        if (document.getElementById('gaLoadingSection')) document.getElementById('gaLoadingSection').style.display = '';
    
        for (i = 0; i < specialOfferIDs.length; i++)
        {
            var section = document.getElementById('soBookingSection'+specialOfferIDs[i]);
            if (section && (soLocalUpdate == 0 || soLocalUpdate == specialOfferIDs[i]))
            {
                section.style.display = 'none';
                section = document.getElementById('soLoadingSection'+specialOfferIDs[i]);
                if (section)
                    section.style.display = '';
            }
        }
        if (document.getElementById('soLoadingSection')) document.getElementById('soLoadingSection').style.display = '';
    }
}

function loaded()
{
    if (document.getElementById('bookingTable')) document.getElementById('bookingTable').style.visibility = 'visible';
    if (document.getElementById('gaLoadingSection')) document.getElementById('gaLoadingSection').style.display = 'none';
    if (document.getElementById('soBookingSection')) document.getElementById('soBookingSection').style.display = '';
    for (i = 0; i < specialOfferIDs.length; i++)
    {
        var section = document.getElementById('soLoadingSection'+specialOfferIDs[i]);
        if (section)
            section.style.display = 'none';
    }
    if (document.getElementById('soLoadingSection')) document.getElementById('soLoadingSection').style.display = 'none';
}

function setLocalUpdate(id)
{
    soLocalUpdate = id;
}

function restoreSel()
{
    //alert('restoreSel('+selTable+','+selRow+')');
    if (typeof(selTable)!="undefined" && selTable)
    {
        table = document.getElementById(selTable);
        cell = table.rows[firstRow+selRow].cells[firstCol];
        if (selTable == 'bookingTable')
            updateSel(cell, selLength);
        else
            updateSelSO(cell, selLength);
    }
}

function resetDate()
{
    //setDate(startDate);
//setDate(startDate);
	var diff = Math.round((aroreserve_date2ts(startDate) - aroreserve_date2ts(startDate)) / (3600 * 24 * 1000));
    if (/*checkPast(startDate) && */checkDiff(diff) /*&& checkLimitDate(startDate)*/)
    {
        selDate = startDate;
        updateSel(lookupCell(diff, selRow), selLength);
    }
}

function dateChanged(form, name)
{
    // handle callback from SO date picker
    if (typeof(soMonthComboId)!="undefined")
    {
        if (typeof(monthComboId)=="undefined" || name.indexOf("$SODateSelection") > 0)
        {
            dateChangedSO(form, name);
            return;
        }
    }
    changeSource = name;
    monthCombo = form.elements[monthComboId];
    dayCombo = form.elements[dayComboId];
    date = monthCombo.options[monthCombo.selectedIndex].value+'-'+dayCombo.options[dayCombo.selectedIndex].value;
    setDate(date);
}

function dateChangedSO(form, name)
{
    changeSource = name;
    monthCombo = form.elements[soMonthComboId];
    dayCombo = form.elements[soDayComboId];
    date = monthCombo.options[monthCombo.selectedIndex].value+'-'+dayCombo.options[dayCombo.selectedIndex].value;
    setDateSO(date);
}

function mouseClick(td)
{
    predragging = false;
    dragging = false;
    //window.status = 'mouseClick';
    updateSel(td, selLength);
}

function mouseIn(td)
{
    HoverMode = 'GA';
    if (predragging)
    {
        dragging = true;
        predragging = false;
    }
    td.style.cursor = 'pointer';
    if (dragging)
        highlight(dragStartCell, lookupCellX(td) - lookupCellX(dragStartCell) + 1, 'high', true);
    else
        highlight(td, selLength, 'high', true);
}

function mouseOut(td)
{
    //window.status = 'mouseOut';
    if (dragging)
        highlight(dragStartCell, lookupCellX(td) - lookupCellX(dragStartCell) + 1, 'high', false);
    else
        highlight(td, selLength, 'high', false);
}

function highlight(cell, next, cls, set)
{
    if (!checkAvail(cell, next))
    {
        cell.style.cursor = 'not-allowed';
        cell.title = msg_CannotCheckin;
        return false;
    }
    if (!checkLimitCell(cell))
    {
        cell.style.cursor = 'not-allowed';
        cell.title = msg_CheckinLimits + msg_CheckinLimits_Days;
        if (cell.childNodes.length > 0 && cell.childNodes[0].title)
            cell.childNodes[0].title = msg_CheckinLimits + msg_CheckinLimits_Days;
        return false;
    }
    //cell.title = 'Price per person sharing';
    row = cell.parentNode;
    var left = 0;
    for (i = 0; i < row.cells.length; i++)
        if (left > 0)
        {
            setClass(row.cells[i], left==1?(cls+'End'):(cls+'Mid'), set);
            left--;
        }
        else if (row.cells[i] == cell)
        {
            setClass(row.cells[i], next==1?(cls+'StartEnd'):(cls+'Start'), set);
            left = next - 1;
        }
    return true;
}

function unhighlight()
{
    var table = document.getElementById('bookingTable');
    for (i = firstRow; i < lastRow; i++)
    {
        for (j = firstCol; j < lastCol; j++)
        {
            setClass(table.rows[i].cells[j], 'selectStartEnd', false);
            setClass(table.rows[i].cells[j], 'selectStart', false);
            setClass(table.rows[i].cells[j], 'selectEnd', false);
            setClass(table.rows[i].cells[j], 'selectMid', false);
        }
        setClass(table.rows[i].cells[j], 'nav', false);        
    }
}

function highlightCol(el, next, cls, set)
{
    table = row.parentNode.parentNode;
    colX = lookupCellX(el);
    for (j = 0; j < table.rows.length; j++)
    {
        var left = 0;
        for (i = 1; i < table.rows[j].cells.length - 1; i++)
            if (left > 0)
            {
                setClass(table.rows[j].cells[i], cls, set);
                left--;
            }
            else if (i == colX)
            {
                setClass(table.rows[j].cells[i], cls, set);
                left = next - 1;
            }
    }
    return true;
}

function checkSelValid()
{
    if (selCell && (selCell.parentNode == null || !selCell.parentNode.tagName || selCell.parentNode.tagName != 'TR'))
        selCell = null;
}

function highlightSel(sel, len)
{
    checkSelValid();

    if (selCell)
    {
        unhighlight();
        //highlight(selCell, selLength, 'select', false);
        highlightCol(selCell, selLength, 'range', false);
        updateNum(false);
    }
    selLength = len;
    selCell = sel;
    if (selCell)
    {
        if (!highlight(selCell, selLength, 'select', true))
            selCell = null;
        else
        {
            highlightCol(selCell, selLength, 'range', true);
            //updateNum(true);
        }
    }
}

function updateSel(sel, len)
{
    if (sel == null)
    {
        selLength = len;
        return;
    }
    // verify stay length is in valid range
    if (len < minStay) len = minStay;
    if (len > maxStay) len = maxStay;
    highlightSel(sel, len);
    updateBox();
    updateNum(true);
}

function lookupstaylength(cell)
{
	//	alert(cell);
	if (typeof(stayLength)=="undefined") return;
    for (i = 0; i < stayLength.options.length; i++)
    {
        if (stayLength.options[i].value == cell)
            return i;
    }
    return -1;
}

function updateBox()
{
    stayLength = document.getElementById(stayLengthId);
    if (stayLength)
    {
        stayLength.selectedIndex = lookupstaylength(selLength);
    }
    /* by KK
    for (i=0;i<stayLength.options.length;i++)
        if (stayLength.options[i].value==selLength)
        {
            stayLength.selectedIndex = i;
            break;
        }
    */
    checkSelValid();

    if (selCell)
    {
        var x = lookupCellX(selCell) - 1;
        var d = aroreserve_parseDate(startDate);
        d = new Date(d.getFullYear(), d.getMonth(), d.getDate() + x);
        var selMonth = d.getFullYear() + '-' + fillZero(d.getMonth()+1, 2);
        var selDay = d.getDate();

        var m = document.getElementById(monthComboId);
        for (var i = 0; i < m.options.length; i++)
            if (m.options[i].value == selMonth)
                m.selectedIndex = i;
        updateMonthDays(m);

        var day = document.getElementById(dayComboId);        
        for (var i = 0; i < day.options.length; i++)
            if (day.options[i].value == selDay)
                day.selectedIndex = i;
        
        checkDiff(x);
    }
    else if (selDate)
    {
        var d = aroreserve_date2ts(selDate);
        var diff = Math.round((d - aroreserve_date2ts(startDate)) / (3600 * 24 * 1000));
        d = aroreserve_parseDate(selDate);
        var selMonth = d.getFullYear() + '-' + fillZero(d.getMonth()+1, 2);
        var selDay = d.getDate();

        var m = document.getElementById(monthComboId);
        for (var i = 0; i < m.options.length; i++)
            if (m.options[i].value == selMonth)
                m.selectedIndex = i;
        updateMonthDays(m);

        var day = document.getElementById(dayComboId);        
        for (var i = 0; i < day.options.length; i++)
            if (day.options[i].value == selDay)
                day.selectedIndex = i;
        
        checkDiff(diff);
    }
}

function updateNum(set)
{
    table = document.getElementById('bookingTable');
    checkSelValid();
    
    if (selCell)
    {
        var y = lookupCellY(selCell);
        var selRow = y - firstRow;
        var selTable = 'bookingTable';
        var lastCell = table.rows[y].cells[table.rows[y].cells.length - 1]; 
        setClass(lastCell, 'nav', set);
        var select = findSelect(lastCell.childNodes);
        if (select && select.selectedIndex == 0) select.selectedIndex = 1;
    }
    else
    {
        var y = -1;
        var selRow = 0;
        var selTable = '';
        var select = null;
    }
    foreachControl('NumberRooms', function(c){c.selectedIndex = 0;}, select);
    set = selCell != null;
    var button = lookupElement(table, 'BookNow');
    if (button && button.tagName == 'INPUT')
    {
        button.parentNode.className = set ? 'nav' : '';
        button.disabled = !set;
        foreachControl('BookOffer', function(c){c.parentNode.className='';c.disabled=true;});
    }
}

function updateNumRooms(dropdown)
{
    var y = lookupCellY(dropdown.parentNode) - firstRow;
    var x = lookupCellX(selCell) - firstCol;
    var startCell = lookupCell(x, y);
    var state = dropdown.selectedIndex > 0;
    if (!highlight(startCell, selLength, 'select', state))
    {
        return false;
    }
    else
    {
        setClass(dropdown.parentNode, 'nav', state);
    }
}

function findSelect(children)
{
    for (j = 0; j < children.length; j++)
        if (children[j].tagName && children[j].tagName == 'SELECT')
            return children[j];
}

function fillZero(num, len)
{
    str = num.toString();
    for (i = 0; i < len-str.length; i++)
        str = '0'+str;
    return str;
}

function lookupCell(x, y)
{
    if (!selTable) selTable = 'bookingTable';
    table = document.getElementById(selTable);
    if (table == null)
        return null;
    return table.rows[y + firstRow].cells[x + firstCol];
}

function lookupCellX(cell)
{
    row = cell.parentNode;
    for (i = 0; i < row.cells.length; i++)
        if (row.cells[i] == cell)
            return i;
    return -1;
}

function lookupCellY(cell)
{
    row = cell.parentNode;
    table = row.parentNode;
    while (table.tagName != 'TABLE')
        table = table.parentNode;
    for (i = 0; i < table.rows.length; i++)
        if (table.rows[i] == row)
            return i;
    return -1;
}

function setClass(el, cls, set)
{
    var re = new RegExp('\\b'+cls+'\\b', "g");
    if (set)
    {
        if (!re.exec(el.className))
            el.className += (el.className?' ':'') + cls;
    }
    else
    {
        if (el.className == cls)
        {
            el.className = '';
        }
        else
        {
            el.className = el.className.replace(re, '');
        }
    }
}

function checkLimitCell(cell)
{
    var limits = '';
    msg_CheckinLimits_Days = '';
    var d;
    if (HoverMode == 'GA') 
    {
        limits = checkinLimits;
        d = aroreserve_parseDate(startDate);
    }
    else if (typeof(soCheckinLimits[CurrentOfferID]) != "undefined") 
    {
        limits = soCheckinLimits[CurrentOfferID];
        d = new Date(SOStartDates[CurrentOfferID]);
    }
    if (limits == '' || limits == '0123456') return true;
    var x = lookupCellX(cell) - 1;
    d = new Date(d.getFullYear(), d.getMonth(), d.getDate() + x);
    var result = limits.indexOf(d.getDay().toString(), 0) >= 0;
    if (!result)
    {
        for (i=0;i<7;i++)
            if (limits.indexOf(i)>=0) msg_CheckinLimits_Days += (msg_CheckinLimits_Days.length > 0 ? ', ' : '') + weekdayNames[i];
    }
    return result;
}

function checkAvail(cell, next)
{
    var row = cell.parentNode;
    var left = 0;
    for (i = 0; i < row.cells.length; i++)
        if (left > 0)
        {
            if (row.cells[i].className.indexOf('unavail') >= 0)
                return false;
            left--;
        }
        else if (row.cells[i] == cell)
        {
            if (row.cells[i].className.indexOf('unavail') >= 0)
                return false;
            left = next - 1;
        }
    return true;
}

function endsWith(str, suffix)
{
    return str.substr(str.length-suffix.length, suffix.length) == suffix;
}

function lookupElement(container, suffix)
{
    var i, element;
    for (i = 0; i < container.childNodes.length; i++)
    {
        if (container.childNodes[i].id && endsWith(container.childNodes[i].id, suffix))
            return container.childNodes[i];
        else if (container.childNodes[i].tagName && container.childNodes[i].childNodes.length > 0)
        {
            element = lookupElement(container.childNodes[i], suffix);
            if (element) return element;
        }
    }
    return false;
}


function mouseInSO(td, selectionlen)
{
    HoverMode = 'SO';
    CurrentOfferID = getOfferID(td);
    
    td.style.cursor = 'pointer';
    if (dragging)
        highlight(dragStartCell, lookupCellX(td) - lookupCellX(dragStartCell) + 1, 'high', true);
    else
        highlight(td, selectionlen, 'high', true);
}

function mouseOutSO(td, selectionlen)
{
    highlight(td, selectionlen, 'high', false);
}

function mouseClickSO(td, selectionlen)
{
    predragging = false;
    dragging = false;
    CurrentOfferID = getOfferID(td);
    //window.status = 'mouseClick';
    updateSelSO(td, selectionlen);
}

function updateSelSO(sel, len, type)
{
    checkSelValid();
    if (selCell)
    {
        highlight(selCell, selLength, 'select', false);
        highlightCol(selCell, selLength, 'range', false);
        updateNumSO(false);
    }
    selLength = len;
    selCell = sel;
    if (sel)
    {
        if (!highlight(sel, len, 'select', true))
            selCell = null;
        else
            highlightCol(sel, len, 'range', true);
    }
    updateBoxSO();
    updateNumSO(true);
}

function updateBoxSO()
{
    //stayLength = document.getElementById(soStayLengthId);
    //if (stayLength)
    //    stayLength.selectedIndex = selLength - 1;
    checkSelValid();
    if (selCell)
    {
        if (soMonthComboId == null)
            return;
        x = lookupCellX(selCell) - 1;
        if (CurrentOfferID > 0)
            if (SOStartDates[CurrentOfferID] ==undefined)
            {
                d = aroreserve_parseDate(selDate);
            } else {
                d = new Date(SOStartDates[CurrentOfferID]);
            }
        else
            d = aroreserve_parseDate(selDate);
        d = new Date(d.getFullYear(), d.getMonth(), d.getDate() + x);
        selMonth = d.getFullYear() + '-' + fillZero(d.getMonth()+1, 2);
        selDay = d.getDate();
        m = document.getElementById(soMonthComboId);
        if (m == null)
            return;
        for (i = 0; i < m.options.length; i++)
            if (m.options[i].value == selMonth)
                m.selectedIndex = i;
        updateMonthDays(m);

        day = document.getElementById(soDayComboId);        
        for (i = 0; i < day.options.length; i++)
            if (day.options[i].value == selDay)
                day.selectedIndex = i;
        
        checkDiff(x);
    }
    else if (selDate)
    {
        if (monthComboId == null)
            return;
        d = aroreserve_date2ts(selDate);
        diff = Math.round((d - aroreserve_date2ts(startDate)) / (3600 * 24 * 1000));
        d = new Date(d);
        selMonth = d.getFullYear() + '-' + fillZero(d.getMonth()+1, 2);
        selDay = d.getDate();

        m = document.getElementById(monthComboId);
        if (m == null)
            return;
        for (i = 0; i < m.options.length; i++)
            if (m.options[i].value == selMonth)
                m.selectedIndex = i;
        updateMonthDays(m);

        day = document.getElementById(dayComboId);        
        for (i = 0; i < day.options.length; i++)
            if (day.options[i].value == selDay)
                day.selectedIndex = i;
        
        checkDiff(diff);
    }
}

function updateNumSO(set)
{
    //alert('updateNumSO('+set+') '+selCell);
    table = document.getElementById('soBookingTable');
    checkSelValid();
    if (selCell)
    {
        y = lookupCellY(selCell);
        selRow = y - firstRow;
        selTable = table.id;
        
        latebutton = lookupElement(selCell.parentNode.parentNode, 'BookLateRoom');
        //alert(latebutton);
        if (latebutton != null && latebutton != false)
            lastCell = table.rows[y].cells[table.rows[y].cells.length - 2]; 
        else 
            lastCell = table.rows[y].cells[table.rows[y].cells.length - 1]; 
        setClass(lastCell, 'nav', set);
        select = findSelect(lastCell.childNodes);
        if (select)
        {
            select.selectedIndex = 1;
            foreachControl('NumberRooms', function(c){c.selectedIndex = 0;}, select);
        }
    }

    if (selCell)
        tbody = selCell.parentNode.parentNode;
    else if (visibleSOId)
        tbody = document.getElementById('SOBookingPanel'+document.getElementById(visibleSOId).value);

    if (tbody)
    {
        button = lookupElement(tbody, 'BookOffer');
        if (button && button.tagName == 'INPUT')
        {
            button.parentNode.className = set ? 'nav' : '';
            button.disabled = !set;
            foreachControl('BookNow', function(c){c.parentNode.className='';c.disabled=true;});
            foreachControl('BookOffer', function(c){c.parentNode.className='';c.disabled=true;}, button);
        }
    }
}

function selectDateCombo(d)
{
    if (typeof(monthComboId)=="undefined") return;
    var selMonth = d.getFullYear() + '-' + fillZero(d.getMonth()+1, 2);
    var selDay = d.getDate();

    var m = document.getElementById(monthComboId);
    for (var i = 0; i < m.options.length; i++)
        if (m.options[i].value == selMonth)
            m.selectedIndex = i;
    updateMonthDays(m);

    var day = document.getElementById(dayComboId);        
    for (var i = 0; i < day.options.length; i++)
        if (day.options[i].value == selDay)
            day.selectedIndex = i;
}

function selectDateComboSO(d)
{
    if (typeof(soMonthComboId)=="undefined") return;
    var selMonth = d.getFullYear() + '-' + fillZero(d.getMonth()+1, 2);
    var selDay = d.getDate();

    var m = document.getElementById(soMonthComboId);
    for (var i = 0; i < m.options.length; i++)
        if (m.options[i].value == selMonth)
            m.selectedIndex = i;
    updateMonthDays(m);

    var day = document.getElementById(soDayComboId);        
    for (var i = 0; i < day.options.length; i++)
        if (day.options[i].value == selDay)
            day.selectedIndex = i;
}

function getOfferID(cell)
{
    var p = cell.parentNode; // TR
    p = p.parentNode; // TBODY
    p = p.parentNode; // TABLE

    return p.id.substr("SOBookingTable".length);
}

var CurrentOfferID = 0;
var SOStartDates = {};
function setStartDateSO(OfferID, date)
{
    SOStartDates[OfferID] = aroreserve_date2ts(date);
}

function getSelValue(list)
{
    var dd = document.getElementById(list);
    if (dd)
    {
        return dd.options[dd.selectedIndex].value;
    }
}

function foreachControl(suffix, handler, except)
{
    for (i = 0; i < document.forms[0].elements.length; i++)
        if (endsWith(document.forms[0].elements[i].id, suffix) && (!except || document.forms[0].elements[i].id != except.id))
            handler(document.forms[0].elements[i]);
}

function updateMonthDays(m)
{
    var base = m.id.replace('monthcombo', '');
    var code = "updateMonthDays" + base + "(document.getElementById('" + base + "daycombo'), 0, " + m.selectedIndex + ")";
    eval(code);
}
