﻿// --------------------------------------------------------------------------------------------------------
//      View Display Functions
// --------------------------------------------------------------------------------------------------------

/// <reference path="../../scripts/jquery-1.3.2-vsdoc.js" />

function DisableForm(formName) {
    var formSelector = 'form:first';
    if(formName) // formName may be any selector starting w/elementID
        formSelector = '#' + formName;
    
    var formElements = $(formSelector).find('input:text, input:password, input:file, textarea');
    formElements.attr('readonly', 'readonly');
    var checkElements = $(formSelector).find('input:radio, input:checkbox');
    checkElements.attr('disabled', 'disabled');
    var formSelects = $(formSelector).find('select');
    formSelects.attr('disabled', 'disabled');
}


// --------------------------------------------------------------------------------------------------------
//      Form Data Modification Functions
// --------------------------------------------------------------------------------------------------------

function SaveModel(controller, formID) {
    SaveModelByAction(controller, formID, 'Save');
}

function SaveModelByAction(controller, formID, action) {	
    ClearMessage();
    var form = $("#" + formID);
    form.validate();
    if (form.valid())
    {
        ShowSpinner();
        var params = form.serialize();
        CallActionWithParams(controller, action, params);
        ShowInfo("Saving...");
    }
}

function RefreshModel(controller, action, id, containerID) {
    DoAjaxPostWithCallBack(controller, action, 'id=' + id, function(data, status) {
                                                                        if (status=="success") {
                                                                            $("#" + containerID).html(data);
                                                                            HideSpinner();
                                                                        }
                                                                   });
}

function DeleteModel(modelType, controller, id, linkToType) {
    var msg = 'Are you sure you want to delete this ' + modelType + '?';
    if (confirm(msg)) {
        if (linkToType) {
            var secondMsg = 'This ' + modelType + ' is linked to a ' + linkToType + '. Continue with delete?';
            if (confirm(secondMsg)) {
                CallActionWithID(controller, "Delete", id);
            }
        }
        else {
            CallActionWithID(controller, "Delete", id);
        }
        
    }
}


// --------------------------------------------------------------------------------------------------------
//      Sublist Functions
// --------------------------------------------------------------------------------------------------------

// show dialog with sublist item
function EditSublistItem(controller, editOrCreate, params, itemType) 
{
    ClearMessage();
    var showAction = editOrCreate + itemType;
    var formContainer = itemType + "FormContainer";
    LoadInputForm(controller, showAction, params, formContainer, function() {
                                                SaveSublistItem(controller, itemType);
                                            });
}

// show readonly dialog with sublist item
function ViewSublistItem(controller, editOrCreate, params, itemType) 
{
    ClearMessage();
    var showAction = editOrCreate + itemType;
    var formContainer = itemType + "FormContainer";
    LoadInputForm(controller, showAction, params, formContainer, null);
}

// submit sublist item data for saving (provides javascript response)
function SaveSublistItem(controller, itemType) 
{
    var form = $("#" + itemType + "Form");
    form.validate();
    if (form.valid())
    {
    	var paramArray = form.serializeArray();
    	AppendSublistCriteriaParameters(itemType, paramArray);
        CallActionWithParams(controller, "Save" + itemType, $.param(paramArray));
    }
}

// remove sublist item (provides javascript response)
function DeleteSublistItem(controller, itemID, itemType, secondWarning) {
    ClearMessage();
    if (confirm("Are you sure you want to delete this item?")) {

    	var paramArray = [{ name:"itemID", value:itemID }];
    	AppendSublistCriteriaParameters(itemType, paramArray);
    	
        if (secondWarning) {
            if (confirm(secondWarning)) {
                CallActionWithParams(controller, "Delete" + itemType, $.param(paramArray));                
            }
        } else {
            CallActionWithParams(controller, "Delete" + itemType, $.param(paramArray));            
        }
    }
}

// remove sublist item (provides javascript response)
function RemoveSublistItem(controller, itemID, itemType, secondWarning) {

    ClearMessage();
    if (confirm("Are you sure you want to unlink this item?")) {
    	var paramArray = [{ name:"itemID", value:itemID }];
    	AppendSublistCriteriaParameters(itemType, paramArray);

        if (secondWarning) {
            if (confirm(secondWarning)) {
                CallActionWithParams(controller, "Remove" + itemType, $.param(paramArray));
            }
        } else {
            CallActionWithParams(controller, "Remove" + itemType, $.param(paramArray));
        }
    }
}

function RefreshNewSublist(controller, itemType, parentID) {

    UpdateSublistCriteriaParameter(itemType, 'ParentID', parentID);
    RefreshSublist(controller, itemType);
    
}

function RefreshSublist(controller, itemType) 
{
	var paramArray = []; // define as array type to pass byref
	UpdateSublistCriteriaParameter(itemType, 'ListOnly', 'true');
	AppendSublistCriteriaParameters(itemType, paramArray);
	RefreshContent(controller, itemType + "List", $.param(paramArray), itemType + "ListContainer")
}

function ApplySublistFilter(controller, itemType, filterName) 
{
	UpdateSublistCriteriaParameter(itemType, 'FilterName', filterName);
	RefreshSublist(controller, itemType)
}

function ApplySublistSort(controller, itemType, sort) 
{
	UpdateSublistCriteriaParameter(itemType, 'Sort', sort);
	RefreshSublist(controller, itemType)
}

function UpdateSublistCriteriaParameter(itemType, parameterName, parameterValue) 
{
	var form = $("#" + itemType + "CriteriaForm");
	if (form.length > 0) {
		$("#" + itemType + "Criteria_" + parameterName).val(parameterValue);
	}
	else {
		// legacy sublists (sort and filterName)
		$("#" + itemType + "_" + parameterName).val(parameterValue);
	}
}

function AppendSublistCriteriaParameters(itemType, paramArray) 
{
	var criteria;
	var form = $("#" + itemType + "CriteriaForm");

	if (form.length > 0) {
		criteria = form.serializeArray();
	}
	else {
		// legacy sublists
		var parentID = $("#" + itemType + "_ParentID").val();
		var sort = $("#" + itemType + "_Sort").val();
		var filterName = $("#" + itemType + "_FilterName").val();
		criteria = [{ name:"parentID", value:parentID },
					{ name:"sort", value:sort }, 
					{ name:"filterName", value:filterName },
					{ name:"listOnly", value:'true'}];
	}

	$.merge(paramArray, criteria);
}

function SwapSublistItems(controller, itemType, itemID, parentID, delta) {    
    ClearMessage();
    var paramArray = [{ name:"itemID", value:itemID }, { name:"delta", value:delta }];
    AppendSublistCriteriaParameters(itemType, paramArray);
    CallActionWithParams(controller, "Swap" + itemType, $.param(paramArray));
}

// --------------------------------------------------------------------------------------------------------
//      Upload Functions for Sublist items.
// --------------------------------------------------------------------------------------------------------

// show dialog with sublist item
function UploadDocument(documentID, ownerType, ownerTypeID) {
    ClearMessage();
    var showAction = "Upload";
    var formContainer = "documentUploadFormContainer";
    var params = $.param({ "documentID": documentID, "ownerType": ownerType, "ownerTypeID": ownerTypeID });
    
    LoadInputForm("Document", "Upload", params, formContainer, SaveDocument);
}

function SaveDocument() {
    var form = $("#DocumentForm");
    var url = GetUrl("Document", "SaveDocument");
    var options = { "url": url, type: "post", inline: true, dataType: "script" };

    ClearMessage();
    ShowSpinner();

    form.validate();
    if (form.valid()) {
        $(form).ajaxSubmit(options);
    }

}

function LinkDocumentToOwner(ownerType, ownerTypeId, documentId) {
    var params = $.param({ "id": ownerTypeId, "documentId": documentId });
    CallActionWithParams(ownerType, "LinkDocument", params);
}

function RefreshDocumentSublist(ownerType) {
    var itemType = ownerType + "Document";
    CloseDialog();
    HideSpinner();
    RefreshSublist(ownerType, itemType);  // ownerType = controller
}

function RollbackDocument(id) {
    var params = $.param({"id": id });

    if (confirm('Are you sure you want to roll back this document to its previous version?')) {
        CallActionWithParams("Document", "Rollback", params);
    }
}

function DownloadDocument(itemID) {
    RedirectWithID("Document", "Download", itemID);
}

function CopyDownloadLink(itemID) {
    var params = "id=" + itemID;
    LoadInputForm("Document", "CopyLink", params, "copyLinkFormContainer", null);
}


// --------------------------------------------------------------------------------------------------------
//      Pairing Select Fields with "Other" Fields
// --------------------------------------------------------------------------------------------------------

function PairSelectWithOther(selectFieldID, otherFieldID, triggerValue) {
    $("select#" + selectFieldID).change(function() {
        ToggleOtherField(selectFieldID, otherFieldID, triggerValue);
    });

    ToggleOtherField(selectFieldID, otherFieldID, triggerValue);
}

function ToggleOtherField(selectFieldID, otherFieldID, triggerValue) {
    selectFieldID = "select#" + selectFieldID;
    otherFieldID = "#" + otherFieldID;

    if ($(selectFieldID).length && $(otherFieldID).length) {
        var isTriggerValid = false;

        if (triggerValue) {
            isTriggerValid = ($(selectFieldID).val() == triggerValue)
        }
        else {
            var selectField = $(selectFieldID)[0];
            isTriggerValid = (selectField.selectedIndex == selectField.options.length - 1);
        }

        if (isTriggerValid) {
            $(otherFieldID).removeAttr("disabled").addClass("required");
        }
        else {
            $(otherFieldID).attr("disabled", "disabled").removeClass("required").val("").triggerHandler("change");
        }
    }
}

function EnableOtherFieldForPost(otherFieldID) {
    otherFieldID = "#" + otherFieldID;
    $(otherFieldID).removeAttr("disabled");
}

// --------------------------------------------------------------------------------------------------------
//      Syncing Revised Fields
// --------------------------------------------------------------------------------------------------------
function SetSyncField(sourceField, targetField, tabID) {
    var sourceSelector = "#" + sourceField;
    var targetSelector = "#" + targetField;
    var tabSelector = "#" + tabID;


    if ($(sourceSelector).val() != $(targetSelector).val())
    {
        var link = "&nbsp;<a href='#' onclick='CopyField(\"" + sourceField + "\",\"" + targetField + "\");return false'>copy</a>";

        $(sourceSelector).after(link);
        $(sourceSelector).addClass("revisedFieldHighlight");

        if ($(tabSelector) && !$(tabSelector).hasClass("revisedTabHighlight")) {
            $(tabSelector).addClass("revisedTabHighlight");
        }
    }

}

function CopyField(sourceField, targetField) {
    var sourceSelector = "#" + sourceField;
    var targetSelector = "#" + targetField;

    $(targetSelector).val($(sourceSelector).val());
}

function ClearTabHighlight(tabID) {
    var tabSelector = "#" + tabID;
    $(tabSelector).removeClass("revisedTabHighlight");
}

function HighlightTab(tabID) {
    var tabSelector = "#" + tabID;
    $(tabSelector).addClass("revisedTabHighlight");
}

/*
This function expects three or more parameters to work properly. The source field
is the only declared parameters and the remaining are dynamic arguments.
Example Usage:
LinkDuplicateSyncFields('sourceFieldID','targetID1','targetID2');
*/
function LinkDuplicateSyncFields(sourceField) {

    if (arguments.length < 3) {
        alert("Function LinkDulicateSyncFields expects three or more parameters.");
        return;
    }
    var sourceSelector = "#" + sourceField;
    var elementIDs = $.makeArray(arguments);
    
    for (var i = 1; i < arguments.length; i++) {        
        var targetSelector = "#" + arguments[i];
        $(targetSelector).change(function() {
            for (var i = 0; i < elementIDs.length; i++) {                
                if (elementIDs[i] != $(this)[0].id) {
                    $("#" + elementIDs[i]).val($(this).val());
                }
            }
        });
    }
}
