﻿    var controlsEditAddress;
    var controlsAddAddress;
    var addressList = new addressListContainer();

        
    function validateObject(address) {
        address.Type = validateField(address.Type);
        address.Line1 = validateField(address.Line1);
        address.Line2 = validateField(address.Line2);
        address.Line3 = validateField(address.Line3);
        address.City = validateField(address.City);
        address.StateProvince = validateField(address.StateProvince);
        address.PostalCode = validateField(address.PostalCode);
        address.County = validateField(address.County);
        address.Country = validateField(address.Country);
        address.IsPrimary = validateField(address.IsPrimary);
        return address;
    }

    function validateField(value) {
        if (value == undefined)
            return null;
            else
        return value    
    }
    
    function address(addressType, addressLine1, addressLine2, addressLine3, city, state, postal, county, country, primary) {
        this.Type = parseInt(addressType);
        this.Line1 = addressLine1;
        this.Line2 = addressLine2;
        this.Line3 = addressLine3;
        this.City = city;
        this.StateProvince = parseInt(state);
        this.PostalCode = postal;
        this.County = parseInt(county);
        this.Country = parseInt(country);
        this.IsPrimary = primary;
    }

    function controlAddressList(addressType, addressLine1, addressLine2, addressLine3, city, state, postal, county, country, hiddenField, defaultValue, primaryText) {
        this.AddressType = addressType;
        this.AddressLine1 = addressLine1;
        this.AddressLine2 = addressLine2;
        this.AddressLine3 = addressLine3;
        this.City = city;
        this.State = state;
        this.Postal = postal;
        this.County = county;
        this.Country = country;
        this.HiddenField = hiddenField;
        this.DefaultValue = defaultValue;
        this.PrimaryText = primaryText;
    }
 
    function requiredAddressField(addressLine2, addressLine3, state, postal, county) {    
        this.AddressLine2 = addressLine2;
        this.AddressLine3 = addressLine3;   
        this.State = state;
        this.Postal = postal;
        this.County = county;
    }
    
    function validateAddressObject(addressObject) {
    
    var validObject = true;
    
    if (requiredAddressField.AddressLine2)
        if (addressObject.Line2 == null || addressObject.Line2 == undefined || addressObject.Line2 == "")
            validObject = false;
        
    if (requiredAddressField.AddressLine3)
        if (addressObject.Line3 == null || addressObject.Line3 == undefined || addressObject.Line3 == "")
            validObject = false;

    if (requiredAddressField.State)
        if (addressObject.State == null || addressObject.State == undefined || addressObject.State == "")
            validObject = false;

    if (requiredAddressField.Postal)
        if (addressObject.Postal == null || addressObject.Postal == undefined || addressObject.Postal == "")
            validObject = false;

    if (requiredAddressField.County)
        if (addressObject.County == null || addressObject.County == undefined || addressObject.County == "")
            validObject = false;

        return validObject;
    }

    function validadAllAddress() {
    
        var allCurrentAddress = addressList.GetAllAddressObject(controlsAddAddress.HiddenField);
        var validAddress = true;
        for (var i = 0; i < (allCurrentAddress.length - 1); i = i + 1) {
            if (validateAddressObject(allCurrentAddress[i]) == false) {
                validAddress = false;
            }
        }
        return validAddress;    
    }
    
        
    function initializeLists() {
        addressList.initialize();
    }

    $(document).ready(function() {
        initializeLists();
    });
    
    function GetAddressObject(indexObject, addressesHiddenField) {
        var actualAddress;
        if ($("#" + addressesHiddenField).val() != "" && $("#" + addressesHiddenField).val()!= undefined )
            actualAddress = JSON.parse($("#" + addressesHiddenField).val());
        else
            return undefined;            

        return actualAddress[indexObject];
    } 
    
  function validateAddressSave(source, clientside_arguments) {      
            addressList.saveAddressTable();
            clientside_arguments.IsValid = true;      
    }    
        
   function validateTypeAddressValidator(source, clientside_arguments) {
   
    allCurrentAddress =addressList.GetAllAddressObject(controlsAddAddress.HiddenField);
   
    if(addressList.ValidateTypeAddress(controlsAddAddress.AddressType,allCurrentAddress)== true)
        clientside_arguments.IsValid = true;      
    else
        clientside_arguments.IsValid = false;    
                
   }
   
    function addressListContainer() {
            
                var selectedRow;
                var templateRow;
                var removedRow;
                
                this.saveAddressTable = function() {
                    try
                    {
                        var oldIndexObject = $("#addressTable").find("tr[class=selectedrow]").attr("indexId");
                        var oldAddressObject = addressList.GetaddressObjectFromPanel(controlsAddAddress);
                        addressList.EditAddressObject(oldIndexObject, controlsAddAddress.HiddenField, oldAddressObject);                
                    }
                    catch(err)
                    {}
                }
               
                this.ValidateTypeAddress = function(addressType, listAddress) {
                // inicialize the objects
                    var listValuesOptions = $("#" + addressType).find("option");
                    var listValues = new Array();
                    for (var i = 0; i < listValuesOptions.length; i = i + 1) {
                        listValues.push($(listValuesOptions[i]).attr("value"));
                    }                        
                    typeListCount = new Array(listValues.length);

                    var validTypeAddress = true;
                    for (i = 0; i < typeListCount.length; ++i)
                        typeListCount[i] = new Array(2);
                    for (i = 0; i < typeListCount.length; ++i) {
                        typeListCount[i][0] = listValues[i];
                        typeListCount[i][1] = 0;
                    }
                    
                    // Get a sum for each address type        
                    for (i = 0; i < listAddress.length ; ++i) {
                        for (j = 0; j < typeListCount.length; ++j) {
                            if ( !isNaN(listAddress[i].Type)) {
                                if (typeListCount[j][0] == listAddress[i].Type) {
                                    typeListCount[j][1] = parseInt(typeListCount[j][1]) + 1;
                                    if (typeListCount[j][1] > 1)
                                        validTypeAddress = false;
                                }
                            }       
                        }
                    }
                    return validTypeAddress;
                }
                
                this.AddAddressObject = function (addressObject, addressesHiddenField) {
                    var actualAddress;

                    if ($("#" + addressesHiddenField).val() != "" && $("#" + addressesHiddenField).val() != undefined)
                        actualAddress = JSON.parse($("#" + addressesHiddenField).val());
                    else
                        actualAddress = new Array();

                    actualAddress.push(addressObject);

                    $("#" + addressesHiddenField).val(JSON.stringify(actualAddress));

                    return actualAddress;
                }

                this.initialize = function() {

                	var actualAddress = this.GetAllAddressObject(controlsAddAddress.HiddenField);

                	if ((actualAddress.length == 0 || actualAddress.length == undefined)) {
                		FillAdressPanel(new address("", "", "", "", "", "", "", "", controlsAddAddress.DefaultValue, false), controlsAddAddress);                		
                	}
                	else {
                		this.BuildAddressTable(actualAddress, controlsAddAddress.HiddenField);
                	}


                	this.selectRow($("#addressTable").find("tr:first"), false);

                	// listen for changes on address inputs
                	$("#addressContainer").find("#" + controlsAddAddress.AddressType).change(this.updateSelectedRow);
                	$("#addressContainer").find("#" + controlsAddAddress.AddressLine1).change(this.updateSelectedRow);
                	$("#addressContainer").find("#" + controlsAddAddress.AddressLine2).change(this.updateSelectedRow);
                	$("#addressContainer").find("#" + controlsAddAddress.AddressLine3).change(this.updateSelectedRow);
                	$("#addressContainer").find("#" + controlsAddAddress.City).change(this.updateSelectedRow);
                	$("#addressContainer").find("#" + controlsAddAddress.State).change(this.updateSelectedRow);
                	$("#addressContainer").find("#" + controlsAddAddress.Postal).change(this.updateSelectedRow);
                	$("#addressContainer").find("#" + controlsAddAddress.County).change(this.updateSelectedRow);
                	$("#addressContainer").find("#" + controlsAddAddress.Country).change(this.updateSelectedRow);
                }

                this.addRow = function() {
                        var newRow = templateRow.cloneNode(true);
                        document.getElementById('addressTable').appendChild(newRow);
                        this.selectRow(newRow, false);
                }

                this.AddNewRow = function() {
                                    
                    if (Page_ClientValidate("AddressGroup")) {
                        
                        var selectedAddressIndex = $("#addressTable").find("tr[class=selectedrow]").attr("indexId");
                        var currentAddressObject = this.GetaddressObjectFromPanel(controlsAddAddress);
                        this.EditAddressObject(selectedAddressIndex, controlsAddAddress.HiddenField, currentAddressObject);

                        var allAddressObjects = this.AddAddressObject(new address("", "", "", "", "", "", "", "", controlsAddAddress.DefaultValue , false), controlsAddAddress.HiddenField);

                        this.BuildAddressTable(allAddressObjects, controlsAddAddress.HiddenField);

                        FillAdressPanel(new address("", "", "", "", "", "", "", "",controlsAddAddress.DefaultValue, false), controlsAddAddress);

                        this.selectRow($("#addressTable").find("tr:last"), false);
                    }
                }

                this.removeRow = function(row) {
                    var addressIndexDelete = $(row).attr("indexId");
                    var actualSelectedAddressIndex = $("#addressTable").find("tr[class=selectedrow]").attr("indexId");

                    var addressDeleteRowClass = $(row).attr("class");
                    var actualAddress = this.DeleteAddressObject(addressIndexDelete, controlsAddAddress.HiddenField);
                    
                    if (actualAddress.length == 0 || actualAddress.length == undefined) {
                    	FillAdressPanel(new address("", "", "", "", "", "", "", "", controlsAddAddress.DefaultValue, false), controlsAddAddress);
                    }

                    this.BuildAddressTable(this.GetAllAddressObject(controlsAddAddress.HiddenField), controlsAddAddress.HiddenField);

                    if (addressDeleteRowClass == "selectedrow")
                        this.selectRow($("#addressTable").find("tr:first"), false);
                    else {
                        if (addressIndexDelete < actualSelectedAddressIndex)
                            this.selectRow($("#addressTable").find("tr[indexId=" + (actualSelectedAddressIndex - 1) + "]"), false);
                        else
                            this.selectRow($("#addressTable").find("tr[indexId=" + actualSelectedAddressIndex + "]"), false);
                    }
                    
                    Page_ClientValidate("AddressGroup");
                }

                this.selectRow = function(row, isEdit) {
                    var isValidControl = true;

                    if (isEdit == true) {
                        isValidControl = Page_ClientValidate("AddressGroup");
                        if (isValidControl == true) {
                            var oldIndexObject = $("#addressTable").find("tr[class=selectedrow]").attr("indexId");
                            var oldAddressObject = this.GetaddressObjectFromPanel(controlsAddAddress);
                            this.EditAddressObject(oldIndexObject, controlsAddAddress.HiddenField, oldAddressObject);
                        }
                    }
                    if (isValidControl == true) {
                        $(row).parent().find("tr").attr("class", "");
                        $(row).attr("class", "selectedrow")

                        var newIndexObject = $(row).attr("indexId");

                        var addressObject = GetAddressObject(newIndexObject, controlsAddAddress.HiddenField);
                        FillAdressPanel(addressObject, controlsAddAddress);
                    }
                }

                this.updateSelectedRow = function() {
                var addressObjects = addressList.GetAllAddressObject(controlsAddAddress.HiddenField);

                if (addressObjects.length == 0) {
                	var listAddress = addressList.AddAddressObject(addressList.GetaddressObjectFromPanel(controlsAddAddress), controlsAddAddress.HiddenField);
                	addressList.BuildAddressTable(listAddress, educationControls.HiddenField);
                		
                	}
                	var selectedRow = $("#addressTable").find("tr[class=selectedrow]");
                	updateRow(selectedRow);
                }

                function updateRow(row) {
                	var spans = $(row).find("span");
                	if (spans.length > 0) {
                		spans[0].innerHTML = getTextFromValue($("#" + controlsAddAddress.AddressType), $("#" + controlsAddAddress.AddressType).val());
                		spans[1].innerHTML = "&nbsp;" + $("#" + controlsAddAddress.AddressLine1).val();
                		if ($("#" + controlsAddAddress.AddressLine2).val() != undefined)
                			spans[2].innerHTML = "&nbsp;" + $("#" + controlsAddAddress.AddressLine2).val();
                	}
                }

                function FillAdressPanel(addressObject, targetControlAddress) {                    
                    if(undefined != addressObject)
                    {
                        if (!isNaN(addressObject.Type))
                            $("#" + targetControlAddress.AddressType).val(addressObject.Type);
                        else
                            $("#" + targetControlAddress.AddressType).val("");

                        $("#" + targetControlAddress.AddressLine1).val(addressObject.Line1);
                        $("#" + targetControlAddress.AddressLine2).val(addressObject.Line2);
                        $("#" + targetControlAddress.AddressLine3).val(addressObject.Line3);
                        $("#" + targetControlAddress.City).val(addressObject.City);

                        if (!isNaN(addressObject.StateProvince))
                            $("#" + targetControlAddress.State).val(addressObject.StateProvince);
                        else
                            $("#" + targetControlAddress.State).val("");

                        $("#" + targetControlAddress.Postal).val(addressObject.PostalCode);

                        if (!isNaN(addressObject.County))
                            $("#" + targetControlAddress.County).val(addressObject.County);
                        else
                            $("#" + targetControlAddress.County).val("");

                        if (!isNaN(addressObject.Country))
                            $("#" + targetControlAddress.Country).val(addressObject.Country);
                        else
                            $("#" + targetControlAddress.Country).val("");
                    }
                }

                this.GetaddressObjectFromPanel = function (targetControlAddress) {
                    var addressObject = new address("", "", "", "", "", "", "", "", "", false);
                    addressObject.Type = parseInt($("#" + targetControlAddress.AddressType).val());
                    addressObject.Line1 = $("#" + targetControlAddress.AddressLine1).val();
                    addressObject.Line2 = $("#" + targetControlAddress.AddressLine2).val();
                    addressObject.Line3 = $("#" + targetControlAddress.AddressLine3).val();
                    addressObject.City = $("#" + targetControlAddress.City).val();
                    addressObject.StateProvince = parseInt($("#" + targetControlAddress.State).val());
                    addressObject.PostalCode = $("#" + targetControlAddress.Postal).val();
                    addressObject.County = parseInt($("#" + targetControlAddress.County).val());
                    addressObject.Country = parseInt($("#" + targetControlAddress.Country).val());
                    return validateObject(addressObject);
                }

                this.EditAddressObject = function(indexObject, addressesHiddenField, newAddressObject) {
                	var actualAddress;
                	if ($("#" + addressesHiddenField).val() != "")
                		actualAddress = JSON.parse($("#" + addressesHiddenField).val());

                	if (actualAddress != undefined) {
                		actualAddress[indexObject] = validateObject(newAddressObject);
                		$("#" + addressesHiddenField).val(JSON.stringify(actualAddress));
                	}
                }

                this.DeleteAddressObject = function (indexObject, addressesHiddenField) {
                    var actualAddress;

                    if ($("#" + addressesHiddenField).val() != "")
                        actualAddress = JSON.parse($("#" + addressesHiddenField).val());

                    actualAddress.splice(indexObject, 1);
                    $("#" + addressesHiddenField).val(JSON.stringify(actualAddress));

                    return actualAddress;
                }

                this.GetAllAddressObject = function (addressesHiddenField) {
                    if ($("#" + addressesHiddenField).val() != "" && $("#" + addressesHiddenField).val() != undefined)
                        return JSON.parse($("#" + addressesHiddenField).val());
                    else
                        return new Array();
                }

                getTextFromValue = function(targetDropDown, value) {

                    var dropdownText = "";
                    
                    if (value == undefined || isNaN(value) == true)
                        dropdownText = "";

                    var dropdown = document.getElementById($(targetDropDown).attr("id"));
                    if (dropdown!=null )
                    {
                        var index;
                        for (i=0; i<= (dropdown.length-1) ; i=i+1)
                        {
                            if (dropdown.options[i].value == value)
                            {
                                index = i;
                                break;
                            }
                        }                        
                        if(index !=undefined)
                        dropdownText = dropdown.options[index].text
                    }

                    if (dropdownText == undefined)
                        return "";
                    else
                        return dropdownText;
                }                                
                
               this.CopyElementsDropDown = function(elements, targetDropDown) {                    
                        $(targetDropDown).append(elements);
                }

                this.DeleteElementDropDown = function(targetValue, targetDropDown) {
                    if(targetValue!="")
                         $(targetDropDown).find("option[value=" + targetValue + "]").remove()
                }

                this.BuildAddressTable = function(arrayAddress, addressesHiddenField) {

                	$("#addressTable").empty();

                	var removeButton = "";
                	var primaryText = "";
                	for (var i = 0; i <= (arrayAddress.length - 1); i = i + 1) {

                		removeButton = "<a name='removeButton' href='javascript:void(0);'><img height='18' src='../App_Themes/Default/Images/icon_delete_x.gif' width='18' border='0' /></a>";
                		if (i > 0) {
                			primaryText = "";
                		}
                		else {
                			primaryText = controlsAddAddress.PrimaryText;
                		}

                		var addressLine2 = arrayAddress[i].Line2;
                		if (addressLine2 == undefined || addressLine2 == null)
                			addressLine2 = " ";

                		$("#addressTable").append(
                        "<tr indexId='" + i + "'>" +
                            "<td style='width: 100%'>" +
                               "<b>" + primaryText + " &nbsp;</b><span>" + getTextFromValue($("#" + controlsAddAddress.AddressType), arrayAddress[i].Type) + " </span><span>" + arrayAddress[i].Line1 + " </span><span>" + addressLine2 + "</span>" +
                            "</td>" +
                            "<td>" +
                                removeButton +
                            "</td>" +
                        "</tr>");

                		if (arrayAddress.length == 1)
                			addressList.selectRow($("#addressTable").find("tr:first"), false);
                	}

                	$("#addressTable").find("tr").click(
                    function() {
                    	addressList.selectRow(this, true)
                    }
                    );

                	$("#addressTable").find("tr").find("a").click(
                    function() {
                    	addressList.removeRow(this.parentNode.parentNode)
                    }
                    );
                }                                                
            };