﻿var __DefinitionDisplayLayoutControls = new Array();

function  InitializeDefinitionDisplayLayoutControls()
{
    for(var index=0;index<__DefinitionDisplayLayoutControls.length;index++)
    {
        __DefinitionDisplayLayoutControls[index].load();
     } 
}

function EvaluateRules()
{
    for(var index=0;index<__DefinitionDisplayLayoutControls.length;index++)
        __DefinitionDisplayLayoutControls[index].evaluateRules();
}

addEvent(window,'load',InitializeDefinitionDisplayLayoutControls);

function DefinitionDisplayLayoutControl(id, readonly,printMode, isSubform, showPageButtons)
{        
    this.id = id;
    this.currentPage = -1;
    this.fieldIds = new Array();
    this.ruleSets = new Array();
    this.fields = new Array();
    this.groups = new Array();
    this.readonly = typeof(readonly) != 'undefined' ? readonly : false;
    this.printMode = typeof(printMode) != 'undefined' ? printMode : false;
    this.showPageEventHandlers = new Array();
    this.isSubform = isSubform;
    this.formRuleLogger = new FormRuleLogger(this,false);
    this.showPageButtons = showPageButtons;
    
    __DefinitionDisplayLayoutControls.push(this);
}
DefinitionDisplayLayoutControl.prototype.addError = function(fieldName,errorMessage)
{
    var errorUl = document.getElementById("ac-errorul");
    if(!errorUl)
    {
        var myDiv = document.getElementById(this.id);
        this.errorDiv = myDiv.parentNode.insertBefore(document.createElement("div"),myDiv);
        this.errorDiv.className = "AC-ErrorMessage";
        this.errorDiv.innerHTML = "<h5>The following problems have been found:</h5><div class=\"AC-ErrorsList\"><ul id='ac-errorul'></ul>";
    }
    var errorUl = document.getElementById("ac-errorul");
    var errorLI = errorUl.appendChild(document.createElement("LI"));
    errorLI.innerHTML = "<A href=\"#\" onclick=\"DefinitionDisplayLayoutControl_"+this.id.replace(/\-/g,"_")+".scrollIntoView('"+fieldName+"');return false;\">"+errorMessage+"</A>";
}
DefinitionDisplayLayoutControl.prototype.scrollIntoView = function(fieldName)
{
    var definitionField = this.getField(fieldName);
    if(definitionField)
    {
        this.showPage(definitionField.pageIndex);
        definitionField.scrollIntoView();
    }
}
DefinitionDisplayLayoutControl.prototype.focus = function(fieldName)
{
    var definitionField = this.getField(fieldName);
    if(definitionField)
    {
        this.showPage(definitionField.pageIndex);
        definitionField.focus();
    }
}

DefinitionDisplayLayoutControl.prototype.showPage = function(page,scrollIntoView)
{
    var currentPageHiddenField = document.getElementById(this.id  + "_CurrentPageField");
    
    if(!this.printMode)
    {
        if(this.currentPage == -1 && currentPageHiddenField != null)
            this.currentPage = parseInt(currentPageHiddenField.value);
        
        if(typeof page == 'undefined')
            page = this.currentPage;
             
        var index = 0;
        var button = document.getElementById(this.id  + "_NumberedButton" + index);
        
        // make sure all the buttons and pages are set - changed so that the buttons don't disable, keeps the style more consistant
        while(button != null)
        {
            button.className="pagebutton";
            button.style.display = this.showPageButtons ? '' : 'none' ;
            document.getElementById(this.id  + "_Page_" + (index + 1)).style.display="none";
            
            index++;
            button = document.getElementById(this.id  + "_NumberedButton" + index);
        }
        
        // now activate the selected page and deactivate the selected button
        var button = document.getElementById(this.id  + "_NumberedButton" + (page-1));
        
        if(button != null)
            button.className="pagebutton selected";
        
        var pageElement = document.getElementById(this.id  + "_Page_" + page);
               
        if(pageElement != null)
        {
            pageElement.style.display="block";
            
            var myDiv = document.getElementById(this.id);

            if(scrollIntoView && myDiv.scrollIntoView)
                myDiv.scrollIntoView(true);
        }
        
        if( currentPageHiddenField != null )
            currentPageHiddenField.value=page;
        
        this.currentPage = page;
    }
    else
    {    
        var index = 0;
        var button = document.getElementById(this.id  + "_NumberedButton" + index);
        
        // make sure all the buttons and pages are set - changed so that the buttons don't disable, keeps the style more consistant
        while(button != null)
        {
            //button.disabled=false;
            button.style.display = "none";
            document.getElementById(this.id  + "_Page_" + (index + 1)).style.display="block";
            
            index++;
            button = document.getElementById(this.id  + "_NumberedButton" + index);
        }
    }
    
    for(var count = 0 ; count < this.showPageEventHandlers.length; count++)
        this.showPageEventHandlers[count].onPageChanged(this);
}

DefinitionDisplayLayoutControl.prototype.nextPage = function()
{
    if(this.currentPage == -1)
        this.currentPage = parseInt(document.getElementById(this.id  + "_CurrentPageField").value);
        
    var nextPage = document.getElementById(this.id  + "_Page_" +  (this.currentPage + 1) );
    
    if(nextPage != null)
        this.showPage( this.currentPage + 1,true);
        
    nextPage = document.getElementById(this.id  + "_Page_" +  (this.currentPage + 1) );
    
    return nextPage != null;
}

DefinitionDisplayLayoutControl.prototype.previousPage = function()
{
    if(this.currentPage == -1)
        this.currentPage = parseInt(document.getElementById(this.id  + "_CurrentPageField").value);
        
    var previousPage = document.getElementById(this.id  + "_Page_" +  (this.currentPage - 1) );
    
    if(previousPage != null)
        this.showPage( this.currentPage - 1,true);

    previousPage = document.getElementById(this.id  + "_Page_" +  (this.currentPage - 1) );

    return previousPage != null;
}

DefinitionDisplayLayoutControl.prototype.isLastPage = function()
{
    if(this.currentPage == -1)
        this.currentPage = parseInt(document.getElementById(this.id  + "_CurrentPageField").value);
                
    var nextPage = document.getElementById(this.id  + "_Page_" +  (this.currentPage + 1) );
    
    return nextPage == null;
}

DefinitionDisplayLayoutControl.prototype.isFirstPage = function()
{
    if(this.currentPage == -1)
        this.currentPage = parseInt(document.getElementById(this.id  + "_CurrentPageField").value);
        
    var previousPage = document.getElementById(this.id  + "_Page_" +  (this.currentPage - 1) );

    return previousPage == null;

}

DefinitionDisplayLayoutControl.prototype.load = function()
{
    var myDiv = document.getElementById(this.id);
    if(myDiv)
    {
        this.initializeFields();
        
        this.initializeRules();
        this.wireDefinitionRules();
        this.evaluateRules();

        if(!this.isSubform)
            this.showPage();
    }
}
DefinitionDisplayLayoutControl.prototype.initializeRules= function()
{
    var myDiv = document.getElementById(this.id);
    var ruleXml = myDiv.getAttribute("fieldRules");
    if(ruleXml)
    {
        ruleXml = unescape(ruleXml);
        var xmlDoc = GetXmlParser();
        LoadXml(xmlDoc,ruleXml);
        var ruleSetNodes = xmlDoc.getElementsByTagName("DefinitionRuleSet");
        for(var index=0;index<ruleSetNodes.length;index++)
        {
            var ruleSet = new RuleSet();
            ruleSet.buildFromXmlNode(ruleSetNodes[index],true);
            this.ruleSets.push(ruleSet);
        }
    }
}
DefinitionDisplayLayoutControl.prototype.initializeFields= function(divId)
{
    for(var index=0;index<this.fieldIds.length;index++)
        this.fields.push(new DefinitionFieldControl(this.fieldIds[index],this));
}
DefinitionDisplayLayoutControl.prototype.addField = function(divId)
{
    this.fieldIds.push(divId);
}

DefinitionDisplayLayoutControl.prototype.wireDefinitionRules = function()
{
    for(var index=0;index<this.ruleSets.length;index++)
        this.ruleSets[index].wireEventHandlers(this);
}
DefinitionDisplayLayoutControl.prototype.evaluateRules = function()
{
    for(var index=0;index<this.ruleSets.length;index++)
    {
        this.formRuleLogger.log('Evaluating rule set ' + index);
        this.ruleSets[index].evaluate(this);
    }
    
    this.formRuleLogger.show();
}

DefinitionDisplayLayoutControl.prototype.getField = function(fieldName)
{
    var result = null;
    
    fieldName=((fieldName.indexOf(".")> 0)?fieldName.split(".")[0]:fieldName);
    for(var index=0;index<this.fields.length;index++)
        if(this.fields[index].fieldName == fieldName)
        {
            result = this.fields[index];
            break;
        }
                
    return result;    
}

// this method is used to provide an alternate way for the definition display layout control to get field values when the 
// controls are not displayed, like when in print mode
DefinitionDisplayLayoutControl.prototype.addFieldValue = function(fieldName,value)
{
    if(!this.fieldValues)
        this.fieldValues = new Object();
    
    this.fieldValues[fieldName] = value;    
}


/*
fields.
*/
function DefinitionFieldControl(divId, definitionDisplayLayoutControl)
{
    this.divId = divId;
    this.definitionDisplayLayoutControl = definitionDisplayLayoutControl;
    var domField = document.getElementById(divId);
    this.domField = domField;
    
    if(domField)
    {
        this.fieldName = domField.getAttribute("fieldName");
        this.fieldType = domField.getAttribute("fieldType");
        this.pageIndex = domField.getAttribute("pageIndex");
        this.name = domField.getAttribute("name");
    }
}
DefinitionFieldControl.prototype.scrollIntoView = function()
{
    var div = this.domField;
    div.scrollIntoView();
}
DefinitionFieldControl.prototype.focus = function()
{
    var div = this.domField;
    if (div)
    {
        div.scrollIntoView(false);
        var valueControl = this.findValueControl(div);
        if (valueControl)
            valueControl.focus();
    }
}

// This method should return a list of selected values
DefinitionFieldControl.prototype.getFieldValue = function(subFieldName)
{
    var myDiv = this.domField;
    var result = null;
    
    if(this.fieldType == 'PostalAddress')
    {   
        var postalAddressControl =new PostalAddressControl(myDiv.id);
        result = postalAddressControl.getComponent(subFieldName);
    }
    else if(this.fieldType == 'RadioButtonList' || this.fieldType == 'RadioButtonListByDiv')
    {
        // Find all INPUT controls of type radio under the given div
        var radioButtons = myDiv.getElementsByTagName("INPUT");
        for (var index=0;index<radioButtons.length;index++)
        {
            if (radioButtons[index].type == 'radio')
            {
                // If the radio button is checked then this is the selected value (only one radio button can be selected)
                if (radioButtons[index].checked) 
                {
                    result = radioButtons[index].value;
                    break;
                }
            }
        }
    }
    else if(this.fieldType == 'CheckBoxList' || this.fieldType == 'CheckBoxListByDiv')
    {
        // Find all INPUT controls of type checkbox under the given div
        var checkboxes = myDiv.getElementsByTagName("INPUT");
        var returnValues = new Array();
        for(var index=0;index<checkboxes.length;index++)
        {
            if(checkboxes[index].type == 'checkbox')
            {
                // If the checkbox is checked then add it to an array (more than one checkbox can be checked)
                if (checkboxes[index].checked)
                    returnValues.push(checkboxes[index].parentNode.attributes['valueID'].value);
            }
        }
        result = returnValues;
    }
    else if(this.fieldType == 'HierarchicalList')
    {
        // Find all SELECT controls under the given div
        var dropDowns = myDiv.getElementsByTagName("SELECT");
        var returnValues = new Array();
        // For each SELECT control check if there is a selected value with text
        for(var index=0;index<dropDowns.length;index++)
        {
            if(dropDowns[index].selectedIndex >= 0 && dropDowns[index].options[dropDowns[index].selectedIndex].value)
                returnValues.push(dropDowns[index].options[dropDowns[index].selectedIndex].value)
        }
        result = returnValues;
    }
    else if(this.fieldType == 'DateChooser' || this.fieldType == 'DateTimeChooser')
    {
        // Find all INPUT controls under the given div
        var inputs = myDiv.getElementsByTagName("INPUT");
        for(var index=0;index<inputs.length;index++)
        {
            if(inputs[index].type == 'text')
            {
                result = inputs[index].value;
                break;
            }
        }
    }    
    else 
    {
        // Find all INPUT and SELECT controls under a given div and retrieve the value
        var inputs = myDiv.getElementsByTagName("INPUT");
        var selects = myDiv.getElementsByTagName("SELECT");
        
        for(var index=0;index<inputs.length;index++)
        {
            if(inputs[index].type == 'checkbox')
            {
                result = inputs[index].checked.toString().toLowerCase();
                break;
            }
            else(inputs[index].type == 'text')
            {
                result = inputs[index].value;
                break;
            }
        }
        
        for(var index=0;index<selects.length;index++)
        {
            var returnValues = new Array();
            if(selects[index].multiple)
            {
                for(var index2=0;index2<selects[index].options.length;index2++)
                {
                    if(selects[index].options[index2].selected)
                        returnValues.push(selects[index].options[index2].value);
                }
                result = returnValues;
            }
            else                    
                result = selects[index].options[selects[index].selectedIndex].value;                    
        }
    }
     
    if(result == null && this.definitionDisplayLayoutControl.fieldValues) 
        result = this.definitionDisplayLayoutControl.fieldValues[this.fieldName];
    
    return result;
}

// This method will add the necessary click/change events to the controls
DefinitionFieldControl.prototype.wireEventHandler = function(subField) 
{
    var myDiv = this.domField;
    if (this.fieldType == 'PostalAddress') {
        var postalAddressControl = new PostalAddressControl(myDiv.firstChild.id);
        addEvent(postalAddressControl.findComponentField(subField), 'change', EvaluateRules);
    }
    else if (this.fieldType == 'RadioButtonList' || this.fieldType == 'RadioButtonListByDiv') {
        // Find all INPUT controls of type 'radio' under the given div and add a click event
        var radioButtons = myDiv.getElementsByTagName("INPUT");
        for (var index = 0; index < radioButtons.length; index++) {
            if (radioButtons[index].type == 'radio')
                addEvent(radioButtons[index], 'click', EvaluateRules);
        }
    }
    else if (this.fieldType == 'HierarchicalList') {
        // Find all SELECT controls under the given div and add a change event
        var dropdowns = myDiv.getElementsByTagName("SELECT");
        for (var index = 0; index < dropdowns.length; index++) {
            addEvent(dropdowns[index], 'change', EvaluateRules);
        }
    }
    else if (this.fieldType == 'CheckBox' || this.fieldType == 'CheckBoxList' || this.fieldType == 'CheckBoxListByDiv') {
        // Find all INPUT controls of type 'checkbox' under the given div and add a click event
        var checkBoxes = myDiv.getElementsByTagName("INPUT");
        for (var index = 0; index < checkBoxes.length; index++) {
            if (checkBoxes[index].type == 'checkbox')
                addEvent(checkBoxes[index], 'click', EvaluateRules);
        }
    }
    else if (this.fieldType == 'DateChooser' || this.fieldType == 'DateTimeChooser') {
        // Find all INPUT controls under the given div
        var inputs = myDiv.getElementsByTagName("INPUT");
        for (var index = 0; index < inputs.length; index++) {
            if (inputs[index].type == 'text') {
                addEvent(inputs[index], 'change', EvaluateRules);
                break;
            }
        }
    }
    else {
        // Find all INPUT and SELECT controls and assign click/change events
        var inputs = myDiv.getElementsByTagName("INPUT");
        var selects = myDiv.getElementsByTagName("SELECT");

        for (var index = 0; index < inputs.length; index++) {
            if (inputs[index].type == 'checkbox' || inputs[index].type == 'radio')
                addEvent(inputs[index], 'click', EvaluateRules);
            else (inputs[index].type == 'text')
                addEvent(inputs[index], 'change', EvaluateRules);
        }

        for (var index = 0; index < selects.length; index++) {
            addEvent(selects[index], 'change', EvaluateRules);
        }
    }
}

// This method will find the first INPUT or SELECT control under a given control
DefinitionFieldControl.prototype.findValueControl= function(control)
{
    var inputs = control.getElementsByTagName("INPUT");
    var selects = control.getElementsByTagName("SELECT");
    
    if(inputs.length>0)
        return inputs[0];
    else if(selects.length>0)
        return selects[0];
    else
        return null;
}


if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();