﻿var g_sBaseUrl;
var g_iNextNewID = -1;

Ext.onReady(function()
{
    var txtSearch = getById("SearchField");
    if (txtSearch)
    {
        txtSearch.emptyMessage = "Search";
        initTextAreaEmptyMessage(txtSearch);
    }
});

function submitForm(vElement, sAction, sConfirmMsg)
{
    var oForm;
    
    if (typeof(vElement) == "string")
    {
        oForm = getById(vElement);
    }
    else
    {
        oForm = findAncestor(vElement, "form");
    }
 
    if (oForm)
    {
        if (sConfirmMsg && !confirm(sConfirmMsg))
        {
            return false;
        }
        if (oForm.elements.Action)
        {
            oForm.elements.Action.value = sAction;
        }
        oForm.submit();
    }
    return false;
}

function doSearch(oForm)
{
    var txtSearch = getById("SearchField");
    var sSearch = trim(txtSearch.value);
    return sSearch != "" && sSearch != txtSearch.emptyMessage;
}

function toggleTime(oLink, sDate)
{
    var bSelect = (oLink.className == "Time");
    if (doAjax("AsyncSetAvailability.aspx", "date=" + escape(sDate) + "&selected=" + ((bSelect) ? "1" : "0")))
    {
        oLink.className = (bSelect) ? "Time TimeSelected" : "Time";
    }
    oLink.blur();
    return false;
}

function toggleTimes(oLink, sDate, lTimeCodes, bSelect)
{
    if (doAjax("AsyncSetAvailability.aspx", "date=" + escape(sDate) + "&selected=" + ((bSelect) ? "1" : "0") + "&TimeCodes=" + lTimeCodes.toString()))
    {
        for (var oSubLink = findAncestor(oLink, "div").nextSibling.firstChild; oSubLink; oSubLink = oSubLink.nextSibling)
        {
            oSubLink.className = (bSelect) ? "Time TimeSelected" : "Time";
        }
    }
    oLink.blur();
    return false;
}

function removePhoto(oForm, oFrame)
{
    var oFrame = oFrame.parentNode;
    oFrame.innerHTML = "(Removed)<input type='hidden' name='txtRemovePhoto' value='1' />";
    oFrame.className = "Label";
    oFrame.style.textAlign = "left";
    return false;
}

function toggleFavorite(oLink, userID)
{
    var oImg = oLink.firstChild;
    var span = oLink.lastChild;
    var sIsFavorite = (oImg.src.match("0\\.png$")) ? "1" : "0";
    if (doAjax(g_sBaseUrl + "AsyncSetFavorite.aspx", "id=" + userID + "&favorite=" + sIsFavorite))
    {
        oImg.src = oImg.src.substring(0, oImg.src.length - 5) + sIsFavorite + ".png";
    }
    if (span != oImg)
    {
        span.innerHTML = (sIsFavorite == "1") ? "Remove from favorites" : "Add to favorites";
    }
    oLink.blur();
    return false;
}

function confirmDeleteMsg()
{
    return confirm("Are you sure you want to delete this message?");
}

function getAjax(sUrl, sPayload)
{
    var oHttp = new HttpClient();
    oHttp.noCache = true;
    oHttp.allowAsync = false;
    return oHttp.getAsText(sUrl, sPayload);
}

function doAjax(sUrl, sPayload)
{
    var sContent = getAjax(sUrl, sPayload);
    if (sContent && (sContent.substring(0, 6) == "<html>" || sContent.substring(0, 6) == "<!DOCT"))
    {
        alert("Sorry, your request could not be processed.  You may need to sign in again.");
        return false;
    }
    if (sContent && sContent != "OK")
    {
        alert(sContent);
        return false;
    }
    return true;
}

function changeDomain(lstDomains)
{
    var oForm = lstDomains.form;
    var sUrl = lstDomains.options[lstDomains.selectedIndex].value;
    oForm.action = sUrl;
    oForm.submit();
    return false;
}

function submitAccount(bSignUp)
{
    var oForm = getById('frmAccount');
    if (oForm)
    {
        oForm['NewEmail'].value = oForm['Email'].value;
        oForm['Action'].value = (bSignUp) ? "" : "Sign In";
        if (bSignUp)
        {
            oForm.action += '#SignUp';
        }
        oForm.submit();
    }
    return false;
}

function addFeedbackMenu(id, feedbackCode, date)
{
    var btn = new Ext.Button(
    {
        iconAlign: 'left',
        iconCls: '',
        minWidth: 87,
        text: ' ',
        renderTo: id,
        feedbackCode: feedbackCode,
        date: date,
        menu:
        {
            enableScrolling: false,
            listeners:
            {
                itemClick: clickFeedbackMenu
            },
            items:
            [
                {
                    text: 'Cancelled',
                    group: 'feedback',
                    itemId: 'cancel',
                    iconCls: 'icoCancel',
                    disabled: (feedbackCode & 0x20) == 0x20
                },
                {
                    text: 'We met',
                    group: 'feedback',
                    itemId: 'rating',
                    iconCls: 'icoStar1',
                    disabled: (feedbackCode & 0x20) == 0x20,
                    menu:
                    {
                        cls: 'StarsMenu',
                        enableScrolling: false,
                        listeners:
                        {
                            itemClick: clickFeedbackMenu
                        },
                        items:
                        [
                            {
                                iconCls: 'icoStars5',
                                text: 'Fantastic match',
                                itemId: 'star5'
                            },
                            {
                                iconCls: 'icoStars4',
                                text: 'Excellent match',
                                itemId: 'star4'
                            },
                            {
                                iconCls: 'icoStars3',
                                text: 'Good match',
                                itemId: 'star3'
                            },
                            {
                                iconCls: 'icoStars2',
                                text: 'Fair match',
                                itemId: 'star2'
                            },
                            {
                                iconCls: 'icoStars1',
                                text: 'Poor match',
                                itemId: 'star1'
                            }
                        ]
                    }
                },
                '-',
                {
                    itemId: 'matchAgain',
                    checked: (feedbackCode & 0x40) == 0x40,
                    text: 'Match me with this person again in the future'
                },
                '-',
                {
                    iconCls: 'icoProperties',
                    text: 'View match details',
                    itemId: 'details'
                }
            ]
        }
    });

    updateFeedbackButton(btn);
}

function clickFeedbackMenu(item, e)
{   
    var menu;
    for (menu = item.parentMenu; menu.parentMenu; menu = menu.parentMenu);
    var btn = menu.ownerCt;
    var feedbackCode = btn.initialConfig.feedbackCode;
    
    switch (item.itemId)
    {
        case 'details':
            go("MatchInfo.aspx?date=" + escape(btn.initialConfig.date));
            break;
            
        case 'matchAgain':
            if (feedbackCode & 0x40)
            {
                feedbackCode &= ~0x40;
            }
            else
            {
                feedbackCode |= 0x40;
            }
            break;
            
        case 'rating':
            feedbackCode &= ~0x10;
            break;
          
        case 'star1':
        case 'star2':
        case 'star3':
        case 'star4':
        case 'star5':
            feedbackCode &= ~0x1f;
            feedbackCode += parseInt(item.itemId.substring(4));
            break;
            
        case 'cancel':
            if ((feedbackCode & 0x10) || !confirm("Are you sure you want to cancel this match?\n\nIf you proceed, you and your match will receive a cancellation email."))
            {
                return;
            }
            feedbackCode |= 0x10;
            break;
    }
    
    if (feedbackCode != btn.initialConfig.feedbackCode)
    {
        if (doAjax("AsyncSetAvailability.aspx", "date=" + escape(btn.initialConfig.date) + "&FeedbackCode=" + feedbackCode))
        {
            btn.initialConfig.feedbackCode = feedbackCode;
            updateFeedbackButton(btn);
        }    
    }
}

function updateFeedbackButton(btn)
{
    var feedbackCode = btn.initialConfig.feedbackCode;
    
    if ((feedbackCode & 0x30) != 0)
    {
        btn.setText("Cancelled");
        btn.setIconClass("icoCancel");
    }
    else if ((feedbackCode & 0xf) != 0)
    {
        btn.setIconClass("icoStar1");
        btn.setText((feedbackCode & 0xf) == 1 ? "1 star" : ((feedbackCode & 0xf) + " stars"));
    }
    else
    {
        btn.setIconClass("icoStar0");
        btn.setText("Feedback");
    }
    
    var cell = new Ext.Element(btn.getEl().findParent("td.MatchFound"));
    if ((feedbackCode & 0x30) != 0)
    {
        cell.addClass("MatchCancelled");
    }
    else
    {
        cell.removeClass("MatchCancelled");
    }
}

function UserSelectButtons_init(sUserList, sSelectButton, sDeselectButton, groups)
{
    var items = [];
    for (var i = 0; i < groups.length; i++)
    {
        var group = groups[i];
        items.push(
        {
            iconCls: 'icoGroup',
            items: [],
            memberIDs: group.memberIDs,
            text: group.name
        });
    }

    var bSelect;
    var menu = new Ext.menu.Menu(
    {
        defaultAlign: 'bl',
        enableScrolling: false,
        listeners:
        {
            itemClick: function(item)
            {
                var ids = item.initialConfig.memberIDs;
                var checkboxes = getInputFields(sUserList);
                for (var i = 0; i < checkboxes.length; i++)
                {
                    var checkbox = checkboxes[i];
                    if (indexOf(ids, parseInt(checkbox.value)) >= 0)
                    {
                        checkbox.checked = bSelect;
                    }
                }
            }
        },
        items: items
    });

    getById(sSelectButton).onclick = function()
    {
        bSelect = true;
        menu.show(this);
    };

    getById(sDeselectButton).onclick = function()
    {
        bSelect = false;
        menu.show(this);
    };
}

function initDateField(fieldName)
{
    new Ext.form.DateField(
    {
        applyTo: fieldName
    });
}

function subscribe(calendarID, vButton)
{
    var oButton = Ext.get(vButton).first();
    var bSubscribe = oButton.hasClass("icoSubscribe");

    if (doAjax("AsyncSubscribe.aspx", "CalendarID=" + escape(calendarID) + "&Subscribe=" + ((bSubscribe) ? "1" : "0")))
    {
        if (bSubscribe)
        {
            oButton.addClass("icoSubscribed");
            oButton.removeClass("icoSubscribe");
            oButton.dom.innerHTML = "Subscribed";
        }
        else
        {
            oButton.addClass("icoSubscribe");
            oButton.removeClass("icoSubscribed");
            oButton.dom.innerHTML = "Subscribe";
        }
    }
    return false;
}

function addRow(sGridName)
{
    var oGrid = getById(sGridName);
    var template = oGrid.rows[oGrid.rows.length - 1];
    var row = oGrid.insertRow(oGrid.rows.length - 1);
    
    // Insert row
    for (var i = 0; i < template.cells.length; i++)
    {
        var templateCell = template.cells[i];
        var cell = row.insertCell(-1);
        cell.innerHTML = templateCell.innerHTML.replace(/(name=[\"\']?[^_]+_)[^\"\'\s>]*/gi, "$1" + g_iNextNewID);
        cell.style.textAlign = templateCell.style.textAlign;
    }
    
    // Record new ID
    row.cells[0].innerHTML += '<input type="hidden" name="NewID" value="' + g_iNextNewID + '" />';
    
    // Adjust rank
    var rankField = getRankField(oGrid, oGrid.rows.length - 2);
    if (rankField)
    {
        var priorRank = (oGrid.rows.length <= 2) ? 0 : parseInt(getRankField(oGrid, oGrid.rows.length - 3).value);
        rankField.value = priorRank + 1;
    }
    
    g_iNextNewID--;
    return false;
}

function deleteRow(sGridName, src)
{
    if (!confirm("Are you sure you want to remove this row?"))
    {
        return false;
    }
    var oGrid = getById(sGridName);
    oGrid.deleteRow(findAncestor(src, "tr").rowIndex);
    return false;
}

function getRankField(oGrid, idx)
{
    var row = oGrid.rows[idx];
    var cell = row.cells[row.cells.length - 1];
    var rankCandidate = cell.firstChild.nextSibling;
    return (rankCandidate.type == "hidden") ? rankCandidate : null;
}

function repositionRow(sGridName, src, iAdjustment)
{
    var oGrid = getById(sGridName);
    var row = findAncestor(src, "tr");
    var srcIdx = row.rowIndex;
    var targetIdx = srcIdx + iAdjustment;
    
    // Swap rank values
    var rank1 = getRankField(oGrid, srcIdx);
    if (rank1)
    {
        var rank2 = getRankField(oGrid, targetIdx);
        var tmpRankValue = rank1.value;
        rank1.value = rank2.value;
        rank2.value = tmpRankValue;
    }
    
    // Swap rows
    if (targetIdx >= 1 && targetIdx < oGrid.rows.length - 1)
    {
        if (oGrid.moveRow)
        {
            // IE
            oGrid.moveRow(srcIdx, targetIdx);
        }
        else
        {
            if (targetIdx > srcIdx)
            {
                targetIdx = targetIdx + 1;
            }
            else if (srcIdx > targetIdx)
            {
                srcIdx = srcIdx + 1;
            }

            newRow = oGrid.insertRow(targetIdx);
            newRow.innerHTML = oGrid.rows[srcIdx].innerHTML;
            oGrid.deleteRow(srcIdx);
        }
    }
    return false;
}
