﻿//localcontrol.js

function OnLocalControlPageLoad()
{
    ControlPreTriggerAddListener(this.OnPreTriggerLocalControl);
    ControlCellClickAddListener(this.OnCellClickLocalControl);
    GridResultHandler(this.OnHandleGridResults);
    ToolbarResultHandler(this.OnHandleToolbarResults);
    ChooseFormHandler(this.OnHandleFormChoices);
    ServiceObjectProvider(this.OnProvideServiceObject);
    ToolbarInitializeHandler(this.OnHandleToolbarInitialize);
    MenuSelectHandler(this.OnMenuSelect);
    InfoPaneltemHandler(this.OnInfoPanelItem);

    //the default form has been set and loaded in Default.aspx the initial client side setup is set here
    InitializeTrayListItem("tray.muddly");
    ProcessXmlListItem(":=derive|muddly.welcome", "formset", "muddly.welcome", "", "tabset.home", "tab.muddly.welcome");
}

function OnMenuSelect( evtObj, menuID )
{
    switch (menuID)
    {
        case "submenu.muddly.introduction":
            {
                InitializeTrayListItem("tray.muddly");
                ProcessXmlListItem(  ":=derive|muddly.welcome", "formset", "muddly.welcome", "", "tabset.home", "tab.muddly.welcome");
            }
            break;
        case "submenu.muddly.gallery":
            {
                InitializeTrayListItem("tray.muddly");
                ProcessXmlListItem(  ":=derive|muddly.screenshot", "formset", "muddly.screenshot", "toolbar.gallery", "tabset.home", "tab.muddly.screenshot");
            }
            break;
        case "submenu.muddly.demonstration":
            {
                InitializeTrayListItem("tray.muddly");
                ProcessXmlListItem(  ":=derive|muddly.movie", "formset", "muddly.movie", "", "tabset.home", "tab.muddly.movie");
            }
            break;

        case "submenu.support.faq":
            {
                InitializeTrayListItem("tray.faq.qa.forum");
                ProcessXmlListItem(  ":=derive|muddly.faq", "formset", "muddly.faq", "", "tabset.faq.qa.forum", "tab.muddly.faq");
            }
            break;
        case "submenu.support.qa":
            {
                InitializeTrayListItem("tray.faq.qa.forum");
                ProcessXmlListItem(  ":=derive|muddly.qa", "formset", "muddly.qa", "toolbar.qa", "tabset.faq.qa.forum", "tab.muddly.qa");
            }
            break;
        case "submenu.support.forum":
            {
                InitializeTrayListItem("tray.faq.qa.forum");
                ProcessXmlListItem(  ":=derive|muddly.forum", "formset", "muddly.forum", "", "tabset.faq.qa.forum", "tab.muddly.forum");
            }
            break;

        case "submenu.downloads.muddly.vista":
            {
                InitializeTrayListItem("tray.muddly");
                ProcessXmlListItem(  ":=derive|download.muddly.vista", "formset", "download.muddly.vista", "toolbar.download.muddly", "tabset.download.muddly", "tab.download.muddly.vista");
            }
            break;
        case "submenu.downloads.muddly.xp":
            {
                InitializeTrayListItem("tray.muddly");
                ProcessXmlListItem(  ":=derive|download.muddly.xp", "formset", "download.muddly.xp", "toolbar.download.muddly", "tabset.download.muddly", "tab.download.muddly.xp");
            }
            break;

        case "submenu.downloads.skins":
            {
                InitializeTrayListItem("tray.skins");
                ProcessXmlListItem(  ":=derive|muddly.skins", "formset", "muddly.skins", "", "tabset.skins", "tab.muddly.skins");
            }
            break;
        default:
            break;
    }
}

function OnInfoPanelItem(evtObj, infoId)
{
    var value = null;
    switch (infoId)
    {
        case "login.info":
            {
                value = GetAssociatedValue("user.name");
                if (!IsNullOrEmpty(value))
                {
                    InitializeTrayListItem("tray.membership");
                    ProcessXmlListItem(  ":=derive|user.account.view", "formset", "user.account.view", "", "tabset.user.account", "tab.user.account");
                }
            }
            break;
        case "login.link":
            {
                value = GetAssociatedValue("user.name");
                if (!IsNullOrEmpty(value))
                {
                    UserLogout();
                }
                else
                {
                    InitializeTrayListItem("tray.membership");
                    ProcessXmlListItem(  ":=derive|user.account.login", "formset", "user.account.login", "toolbar.user.account.login", "tabset.user.account.login", "tab.user.account.login");
                }
            }
            break;
        default:
            break;
    }
}


function OnProvideServiceObject()
{
    var oServiceProxy = new MuddlyScriptService();
    if (!IsNullOrEmpty( oServiceProxy ) )
    {
        oServiceProxy.set_timeout(60000);
    }
    return oServiceProxy;
}

function OnHandleFormChoices(aStrForms)
{
    var strForm = "";
    if (aStrForms[0] == "user.account.add")
    {
        //if user is logged in use edit (value 2)
        var value = GetAssociatedValue("user.name");
        if (!IsNullOrEmpty(value))
        {
            strForm = aStrForms[1];
        }
        else
        {
            strForm = aStrForms[0];
        }
    }
    return strForm;
}

function OnHandleToolbarResults(strFormID, strTargetId, strResult)
{
    var toolbarItem = GetFormToolbarItem(strFormID, strTargetId);
    if ( !IsNullOrEmpty(toolbarItem ))
    {
        toolbarItem.Data = strResult;
    }
}

function OnHandleToolbarInitialize( )
{
    InitializeLoginLink();

    var value = GetAssociatedValue("user.name");
    if (!IsNullOrEmpty(value))
    {
        DrawToolbarUser(value);

        InitializeLoginLink("log.out");
    }
    else
    {
        InitializeLoginLink("log.in");
    }
}



function OnHandleGridResults(strFormID, strTargetId, strResult)
{
    var aResultRows = strResult.split("~");
    var aColumnNames = null;
    var aDataRow = null;
    var nGroupByPrevious = -1;
    var nGroupByCurrent = -1;
    var formGrid = GetFormGrid(strFormID, strTargetId);

    if ( !IsNullOrEmpty(formGrid ))
    {
        //reset grid
        for (i = 0; i < formGrid.Columns.length; i++)
        {
            formGrid.Columns[i].Data = new Array();
        }
        formGrid.CurrentRow = -1;
        formGrid.CurrentColumn = -1;
        formGrid.RowCount = -1;

        switch (strTargetId)
        {
            case "qa.grid":
                {
                    for (var i = 0; i < aResultRows.length; i++)
                    {
                        var aPairs = aResultRows[i].split("=");

                        switch (aPairs[0])
                        {
                            case "row.index":
                                {
                                    formGrid.QueryRowIndex = parseInt(aPairs[1], 10);
                                }
                                break;
                            case "row.increment":
                                {
                                    formGrid.QueryRowIncrement = parseInt(aPairs[1], 10);
                                }
                                break;
                            case "category.filter":
                                {
                                    formGrid.QueryFilter = aPairs[1];
                                }
                                break;
                            case "column.names":
                                {
                                    aColumnNames = aPairs[1].split("|");
                                }
                                break;
                            case "entire.count.for.query":
                                {
                                    formGrid.EntireCount = parseInt(aPairs[1], 10);
                                }
                                break;
                            case "column.data":
                                {
                                    if (formGrid.RowCount == -1)
                                    {
                                        formGrid.RowCount = 1;
                                    }
                                    else
                                    {
                                        ++formGrid.RowCount;
                                    }
                                    aDataRow = aPairs[1].split("|");
                                    if ( !IsNullOrEmpty(aColumnNames ))
                                    {
                                        for (var j = 0; j < aDataRow.length; j++)
                                        {
                                            for (var k = 0; k < formGrid.Columns.length; k++)
                                            {
                                                if (formGrid.Columns[k].Source == aColumnNames[j])
                                                {
                                                    //test code re testing a group key
                                                    if (aColumnNames[j] == "id")
                                                    {
                                                        nGroupByPrevious = nGroupByCurrent;
                                                        nGroupByCurrent = aDataRow[j];
                                                    }

                                                    if (aColumnNames[j] == "id" || aColumnNames[j] == "question" || aColumnNames[j] == "created" || aColumnNames[j] == "questionCategory" || aColumnNames[j] == "questionTopic")
                                                    {
                                                        if (nGroupByPrevious == nGroupByCurrent)
                                                        {
                                                            formGrid.Columns[k].Data.push("-");
                                                        }
                                                        else
                                                        {
                                                            formGrid.Columns[k].Data.push(aDataRow[j]);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        formGrid.Columns[k].Data.push(aDataRow[j]);
                                                    }
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                                break;
                            default:
                                break;
                        }
                    }

                    var gridCaption = document.getElementById(formGrid.Id + ".grid.caption");
                    if ( !IsNullOrEmpty(gridCaption ))
                    {
                        gridCaption.childNodes[0].nodeValue = formGrid.QueryRowIndex + " to " + (formGrid.QueryRowIndex + formGrid.RowCount) + " of " + formGrid.EntireCount;
                    }
                    var gridFooter = document.getElementById(formGrid.Id + ".grid.footer");
                    if ( !IsNullOrEmpty(gridFooter ))
                    {
                        gridFooter.childNodes[0].nodeValue = (formGrid.EntireCount - (formGrid.QueryRowIndex + formGrid.RowCount)) + " results ahead";
                    }

                    if (formGrid.QueryRowIndex > 0)
                    {
                        SetHeaderSetItemEnabled("toolbar.qa", "toolbar.qa.first", true);
                        SetHeaderSetItemEnabled("toolbar.qa", "toolbar.qa.previous", true);
                    }
                    else
                    {
                        SetHeaderSetItemEnabled("toolbar.qa", "toolbar.qa.first", false);
                        SetHeaderSetItemEnabled("toolbar.qa", "toolbar.qa.previous", false);
                    }
                    if (formGrid.EntireCount - (formGrid.QueryRowIndex + formGrid.RowCount) > 0)
                    {
                        SetHeaderSetItemEnabled("toolbar.qa", "toolbar.qa.last", true);
                        SetHeaderSetItemEnabled("toolbar.qa", "toolbar.qa.next", true);
                    }
                    else
                    {
                        SetHeaderSetItemEnabled("toolbar.qa", "toolbar.qa.last", false);
                        SetHeaderSetItemEnabled("toolbar.qa", "toolbar.qa.next", false);
                    }
                }
                break;
            default:
                break;
        }
    }
}

function OnCellClickLocalControl(strFormID, strGridId)
{
    var formGrid = GetFormGrid(strFormID, strGridId);
    if ( !IsNullOrEmpty(formGrid ))
    {
        switch (formGrid.Id)
        {
            case "qa.grid":
                {
                    var strId = formGrid.Columns[0].Data[formGrid.CurrentRow];
                    SetAssociatedValue("qa.grid.selected.id", strId);

                    var strQuestion = formGrid.Columns[1].Data[formGrid.CurrentRow];
                    SetAssociatedValue("qa.grid.selected.question", strQuestion);

                    var strCategory = formGrid.Columns[3].Data[formGrid.CurrentRow];
                    SetAssociatedValue("qa.grid.selected.category", strCategory);

                    var strTopic = formGrid.Columns[4].Data[formGrid.CurrentRow];
                    SetAssociatedValue("qa.grid.selected.topic", strTopic);

                    var strAnswerId = formGrid.Columns[5].Data[formGrid.CurrentRow];
                    SetAssociatedValue("qa.grid.answer.id", strAnswerId);

                    var strAnswer = formGrid.Columns[6].Data[formGrid.CurrentRow];
                    SetAssociatedValue("qa.grid.selected.answer", strAnswer);

                    var strUserName = formGrid.Columns[7].Data[formGrid.CurrentRow];
                    SetAssociatedValue("qa.grid.selected.asking.user.name", strUserName);

                    var strAnsweringUserName = formGrid.Columns[8].Data[formGrid.CurrentRow];
                    SetAssociatedValue("qa.grid.selected.answering.user.name", strAnsweringUserName);
                }
                break;
            default:
                break;
        }
    }
}

// a script that calls ControlAddListener must provide an IListenGetUpdateProceed that returns a boolean
function IListenGetUpdateProceedLocalControl(strMessage, strPrefix)
{
    var bProceed = true;
    return bProceed;
}

// a script that calls ControlAddListener must provide an IListenPreTrigger that returns either a null
// or a string token that will be appended to the hidden field value during the update
function OnPreTriggerLocalControl(strMessage, aDetails)
{
    var strHiddenFieldExtraToken = null;
    var bProcessed = false;
    var strToken = "";
    var strTokenValue = "";
    var action = "";
    var strMessageBody = "";
    var formSet = GetActiveFormSet();
    var aParameters = strMessage.split(".");
    var i = 0;

    if (aParameters.length > 0)
    {
        action = aParameters[aParameters.length - 1];
        strToken = aParameters[0];
        strTokenValue = strMessage.substring(strToken.length + 1);

        for (i = 1; i < aParameters.length - 1; i++)
        {
            if (strMessageBody !== "")
            {
                strMessageBody += ".";
            }
            strMessageBody += aParameters[i];
        }
    }
    if (strToken == "tab")
    {
        var strForm = null;
        var strForms = null;
        bProcessed = true;
        var currentTabSet = GetCurrentTabSet();
        if ( !IsNullOrEmpty(currentTabSet ))
        {
            for (i = 0; i < currentTabSet.TabCount; i++)
            {
                if (currentTabSet.TabInfo[i].Name == strMessage)
                {
                    strForms = currentTabSet.TabInfo[i].FormSets;
                    break;
                }
            }
            if ( !IsNullOrEmpty(strForms ))
            {
                var aFormNames = strForms.split("|");
                if (aFormNames.length > 1)
                {
                    if ( !IsNullOrEmpty(m_ChooseFormHandler ))
                    {
                        strForm = m_ChooseFormHandler(aFormNames);
                    }
                }
                else
                {
                    strForm = aFormNames[0];
                }
                strHiddenFieldExtraToken = "tab." + strForm;
                SynchForm(strForm, "", "", "");
            }
        }
    }
    else if (strToken == "toolbar")
    {
        bProcessed = true;

        switch (action)
        {
            case "download":
                {
                    //todo: dont CancelTrigger but adapt this to use formSet.SubmissionAction (see below) to move to a 'next steps' page
                    strHiddenFieldExtraToken = "CancelTrigger";
                    formSet = GetActiveFormSet();
                    if ( !IsNullOrEmpty(formSet ))
                    {
                        switch (formSet.FormID)
                        {
                            case "download.muddly.xp":
                                {
                                    window.open("xpdownload.htm", "_blank");
                                }
                                break;
                            case "download.muddly.vista":
                                {
                                    window.open("vistadownload.htm", "_blank");

                                }
                                break;
                            default:
                                break;
                        }
                    }
                }
                break;
            case "submit":
                {
                    if ( !IsNullOrEmpty(formSet ))
                    {
                        strHiddenFieldExtraToken = PrepareSubmission();
                        if (strHiddenFieldExtraToken != "CancelTrigger")
                        {
                            if (!IsNullOrEmpty(formSet.SubmissionAction ) )
                            {
                                if (!IsNullOrEmpty(formSet.SubmissionAction.SubmissionFormSet))
                                {
                                    SynchForm(formSet.SubmissionAction.SubmissionFormSet, formSet.SubmissionAction.SubmissionHeaderSet, formSet.SubmissionAction.SubmissionTabSet, formSet.SubmissionAction.SubmissionTabSetItem);
                                    if (formSet.SubmissionAction.ServiceCalls.length > 0)
                                    {
                                        for (i = 0; i < formSet.SubmissionAction.ServiceCalls.length; i++)
                                        {
                                            var serviceCallInfo = new ServiceCallInfo(formSet.SubmissionAction.ServiceCalls[i].FormSetID, formSet.SubmissionAction.ServiceCalls[i].Method, formSet.SubmissionAction.ServiceCalls[i].Parameters, formSet.SubmissionAction.ServiceCalls[i].TargetID, null);

                                            if (serviceCallInfo.Parameters == "prepareSubmission")
                                            {
                                                serviceCallInfo.Parameters = strHiddenFieldExtraToken;
                                            }
                                            m_ServiceQ.push(serviceCallInfo);
                                        }
                                    }
                                }
                                if (!IsNullOrEmpty(formSet.SubmissionAction.NewLocation))
                                {
                                    m_strRelocate = formSet.SubmissionAction.NewLocation;
                                }
                            }
                            ClearDown();
                        }
                    }
                }
                break;
            case "cancel":
                {
                    ClearDown();
                }
                break;
            case "category":
            case "topic":
            case "next":
            case "previous":
            case "first":
            case "last":
                {
                    strHiddenFieldExtraToken = "CancelTrigger";
                    if ( !IsNullOrEmpty(formSet ))
                    {
                        switch (formSet.FormID)
                        {
                            case "muddly.qa":
                                {
                                    for (i = 0; i < formSet.ProcInfo.length; i++)
                                    {
                                        var procInfoItem = formSet.ProcInfo[i];
                                        if ( !IsNullOrEmpty(procInfoItem ))
                                        {
                                            var bContinue = false;
                                            var aCommands = procInfoItem.Commands.split("|");

                                            for (var j = 0; j < aCommands.length; j++)
                                            {
                                                var strCommand = aCommands[j];
                                                if ( !IsNullOrEmpty(strCommand  )&& strCommand == action)
                                                {
                                                    bContinue = true;
                                                    break;
                                                }
                                            }
                                            if (bContinue && !IsNullOrEmpty(procInfoItem.Source ))
                                            {
                                                if (procInfoItem.Source == "service.call")
                                                {
                                                    var formGrid = GetFormGrid("muddly.qa", "qa.grid");
                                                    if ( !IsNullOrEmpty(formGrid ))
                                                    {
                                                        var strCategoryFilter = "0";
                                                        var strTopicFilter = "0";
                                                        if (action == "next")
                                                        {
                                                            formGrid.QueryRowIndex += formGrid.QueryRowIncrement;
                                                        }
                                                        else if (action == "previous")
                                                        {
                                                            formGrid.QueryRowIndex -= formGrid.QueryRowIncrement;
                                                            if (formGrid.QueryRowIndex < 0)
                                                            {
                                                                formGrid.QueryRowIndex = 0;
                                                            }
                                                        }
                                                        else if (action == "first")
                                                        {
                                                            formGrid.QueryRowIndex = 0;
                                                        }
                                                        else if (action == "last")
                                                        {
                                                            formGrid.QueryRowIndex = (formGrid.EntireCount - formGrid.RowCount);
                                                        }
                                                        else if (action == "category")
                                                        {
                                                            formGrid.QueryRowIndex = 0;
                                                            if (IsNullOrEmpty(aDetails[1]))
                                                            {
                                                                aDetails[1] = "0";
                                                            }
                                                            strCategoryFilter = aDetails[1];
                                                            strTopicFilter = "0";
                                                        }
                                                        else if (action == "topic")
                                                        {
                                                            if (IsNullOrEmpty(aDetails[1]))
                                                            {
                                                                aDetails[1] = "0";
                                                            }
                                                            strCategoryFilter = formGrid.QueryFilter;
                                                            strTopicFilter = aDetails[1];
                                                        }

                                                        SetAssociatedValue("qa.grid.startRowIndex", formGrid.QueryRowIndex.toString());
                                                        SetAssociatedValue("qa.grid.maximumRows", formGrid.QueryRowIncrement.toString());
                                                        SetAssociatedValue("qa.grid.categoryFilter", strCategoryFilter);
                                                        SetAssociatedValue("qa.grid.topicFilter", strTopicFilter);

                                                        var oServiceCallInfo = new ServiceCallInfo(formSet.FormID, procInfoItem.SourceKey, procInfoItem.Parameters, procInfoItem.Target, null);
                                                        m_ServiceQ.push(oServiceCallInfo);
                                                        ProcessServiceQueue();

                                                        if (action == "category" || action == "topic")
                                                        {
                                                            if (formSet.ValueChangeInfo.length > 0)
                                                            {
                                                                for (j = 0; j < formSet.ValueChangeInfo.length; j++)
                                                                {
                                                                    if (formSet.ValueChangeInfo[j].ColumnName == aDetails[0])
                                                                    {
                                                                        var element = document.getElementById(formSet.ValueChangeInfo[j].ColumnName);
                                                                        ProcessValueChangeInfoItem(formSet, element, formSet.ValueChangeInfo[j]);
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                break;
                            case "muddly.screenshot":
                                {
                                    LoadGallery("muddly.screenshots", action);
                                }
                                break;
                            default:
                                break;
                        }
                    }
                }
                break;
            default:

                break;
        }
    }
    return strHiddenFieldExtraToken;
}


if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

