﻿window.AddressApplied = false;
function HandleAddressDataValidation(errMsgNum, result) {

    if (result.Result.ValidationResult.ErrorMessages[errMsgNum] == 'AddressDataFailed') {

        // Apply the corrected data fields from the AddressCheck
        // [BH]
        if (result.Result.ValidationResult.AddressData != null && result.Result.ValidationResult.AddressData != 'undefined') {
            var state = result.Result.ValidationResult.AddressData[0].AdressStatusResult;
            if (state == 2 || state == 1) {
                var addressData = result.Result.ValidationResult.AddressData[0];

                for (var failedFieldsCount = 0; failedFieldsCount < result.Result.ValidationResult.FailedFields.length; failedFieldsCount++) {
                    var failedField = result.Result.ValidationResult.FailedFields[failedFieldsCount].Key;

                    if (failedField.indexOf("Street") != -1) {
                        $j("#TB" + failedField).val(addressData.Street);
                    }

                    if (failedField.indexOf("Zip") != -1) {
                        $j("#TB" + failedField).val(addressData.Postalcode);
                    }

                    if (failedField.indexOf("City") != -1) {
                        $j("#TB" + failedField).val(addressData.Locality);
                    }
                }

            }


            if (state == 3 && window.AddressApplied == false) {
                window.AddressApplied = true;
                var addressData = result.Result.ValidationResult.AddressData[0];

                for (var failedFieldsCount = 0; failedFieldsCount < result.Result.ValidationResult.FailedFields.length; failedFieldsCount++) {
                    var failedField = result.Result.ValidationResult.FailedFields[failedFieldsCount].Key;

                    if (failedField.indexOf("Street") != -1) {
                        $j("#DDL" + failedField).empty();
                        $j("#DDL" + failedField).append("<option>-- Bitte wählen --</option>");
                        for (var adIdx = 0; adIdx < result.Result.ValidationResult.AddressData.length; adIdx++) {
                            var newStreet = result.Result.ValidationResult.AddressData[adIdx].Street;

                            $j("#DDL" + failedField).append("<option>" + newStreet + "</option>");
                        }

                        $j("#AreaList" + failedField).css("display", "inline");
                        $j("#AreaTextBox" + failedField).css("display", "none");
                    }

                    if (failedField.indexOf("Zip") != -1) {
                        $j("#TB" + failedField).val(addressData.Postalcode);
                    }

                    if (failedField.indexOf("City") != -1) {
                        $j("#TB" + failedField).val(addressData.Locality);
                    }
                }

                $j('select.ui_select_250').selectmenu({
                    style: 'dropdown',
                    maxHeight: 150,
                    width: 250

                });
            }
        }
        else {
            // The address doctor cannot validate the values.
            // [BH]
            for (var errorMessageCounter = 0; errorMessageCounter < result.Result.ValidationResult.ErrorMessages.length; errorMessageCounter++) {
                if (result.Result.ValidationResult.ErrorMessages[errorMessageCounter] == 'AddressDataFailed') {
                    result.Result.ValidationResult.ErrorMessages[errorMessageCounter] = 'AddressDataValidationError';
                }
            }
        }
    }

}

// This class represents the CustomerDataStep and contains the placeholder as item 
CustomerDataStep = function (containerId) {
    this.Name = containerId;
    this.Container = $get(containerId);
    this.SwitchViews = new Array();
    this.Visible = false;
    this.LastStep = false;
    this.Active = false;
    this.Completed = false;
    this.NextStep = null;
    this.PreviousStep = null;
    this.FieldsToValidate = new Object();
    this.EditLink = $get(this.Name + "_EditLink");
    this.EditArea = $get(this.Name + "_EditArea");

    this.ErrorBox = null;
    this.ErrorCodes = new Array();
    this.ErrorMessageContainer = new Array();
    this.ProceedOnUnchanged = false;
}

CustomerDataStep.prototype =
{
    ResetErrorMessages: function () {
        $j(".errorMsg").each(function () {
            $j(this).removeClass("hidden");
            $j(this).addClass("hidden");
        });
    },

    ShowErrorMessageContainer: function (messageCode) {
        if (messageCode != "") {

            ErrorContainer = $j("#ErrorMessage_" + messageCode);

            if (ErrorContainer.length > 0)
                ErrorContainer.removeClass("hidden");
            else
                alert(messageCode + "fehlt");
            ErrorContainer.addClass("visible");
        }
    },

    OverrideLastStep: function () {
        ExecuteOverride(this.Name);
    },

    RenderContainer: function () {
        // Don't allow null-containers.
        if (!this.Container) {
            alert("Container must not be null for '" + this.Name + "'.");
            return;
        }

        // Set Visibility
        if (this.Visible == true) {
            this.Container.style.display = "block";
        }
        else {
            this.Container.style.display = "none";
        }

        if (this.Active == true) {
            this.SwitchChildrenAccessibility(this.Container);

            if (this.EditArea) {
                this.EditArea.disabled = "";
                // this.DisableControlsAnyway();
                this.EnableCustomerStep('#' + this.Name);
            }
            this.JumpTo();

            if (this.EditLink)
                this.EditLink.style.display = "none";
        }
        else {
            if (this.EditArea)
                this.EditArea.disabled = "disabled";
            this.DisableCustomerStep('#' + this.Name);

            this.SwitchChildrenAccessibility(this.Container, 'disable');

            if (this.EditLink) {
                this.EditLink.disabled = "";
                this.EditLink.style.display = "block";
            }
        }
    },

    DisableControlsAnyway: function () {
        $j(".DisableAnyway").attr('disable', 'true');
    },


    DisableCustomerStep: function (customerStepID) {
        var rb_grey = "/Images/Website/radiobutton/radiobutton_aktiv_grau.png";
        var rb_grey_inactive = "/Images/Website/radiobutton/radiobutton_inaktiv.png";
        var cb_grey = "/Images/Website/checkbox/checkbox_aktiv_grau.png";
        var cb_grey_inactive = "/Images/Website/checkbox/checkbox_inaktiv.png";

        /* Set Font-Color */
        var currentStep = $j(customerStepID);
        currentStep.addClass("txt_silver");
        /* set RadioButtons */

        var radioList = $j(".radio", currentStep);
        radioList.each(function () {
            var curr = $j(this);

            if ($j("input", curr).hasClass("RbCheckbox")) {
                $j("img", curr).attr("src", ($j("input[type~=radio]", $j(this)).attr("checked") == true) ? cb_grey : cb_grey_inactive);
            } else {
                $j("img", curr).attr("src", ($j("input[type~=radio]", $j(this)).attr("checked") == true) ? rb_grey : rb_grey_inactive);
            }
        });

        /* Set Checkboxes */
        var checkboxList = $j(".checkbox", currentStep);
        checkboxList.each(function () {
            var curr = $j(this);
            var itemChecked = $j("input", curr).hasClass("CbChecked");

            var imageList = $j("img", curr);
            imageList.each(function () {
                var loopedImg = $j(this);

                if (loopedImg.length >= 1) {
                    if (loopedImg[0].src.search(/check/) > 0) {
                        $j(loopedImg[0]).attr("src", (itemChecked) ? cb_grey : cb_grey_inactive);
                    }
                }
            });
        });
    },


    EnableCustomerStep: function (customerStepID) {
        var rb_green = "/Images/Website/radiobutton/radiobutton_aktiv_gruen.png";
        var rb_green_inactive = "/Images/Website/radiobutton/radiobutton.png";
        var cb_green = "/Images/Website/checkbox/checkbox.png";
        var cb_green_inactive = "/Images/Website/checkbox/checkbox_aktiv_gruen.png";

        /* Set Font-Color */
        var currentStep = $j(customerStepID);
        while (currentStep.hasClass("txt_silver"))
            currentStep.removeClass("txt_silver");
        /* set RadioButtons */

        var radioList = $j(".radio", currentStep);
        radioList.each(function () {
            var curr = $j(this);

            if ($j("input", curr).hasClass("RbCheckbox")) {
                $j("img", curr).attr("src", ($j("input[type~=radio]", $j(this)).attr("checked") == true) ? cb_green_inactive : cb_green);
            } else {
                $j("img", curr).attr("src", ($j("input[type~=radio]", $j(this)).attr("checked") == true) ? rb_green : rb_green_inactive);
            }
        });

        /* Set Checkboxes */
        var checkboxList = $j(".checkbox", currentStep);
        checkboxList.each(function () {
            var curr = $j(this);
            var itemChecked = $j("input", curr).hasClass("CbChecked");

            var imageList = $j("img", curr);
            imageList.each(function () {
                var loopedImg = $j(this);

                if (loopedImg.length >= 1) {
                    if (loopedImg[0].src.search(/check/) > 0) {
                        $j(loopedImg[0]).attr("src", (itemChecked) ? cb_green_inactive : cb_green);
                    }
                }
            });
        });
    },



    SwitchViewTo: function (switchViewToDisplay) {
        if (this.SwitchViews.length > 0) {
            for (var swNum = 0; swNum < this.SwitchViews.length; swNum++) {
                if (this.SwitchViewIsAncestorOfSwitchView(this.SwitchViews[swNum].id, switchViewToDisplay) || (switchViewToDisplay == this.SwitchViews[swNum].id)) {
                    this.SwitchViews[swNum].style.display = 'block';
                }
                else {
                    this.SwitchViews[swNum].style.display = 'none';
                }
            }
        }
    },

    SwitchViewIsAncestorOfSwitchView: function (potentialAncestor, switchView) {
        var currentSwitchView = $get(switchView);

        while (currentSwitchView && currentSwitchView.parentSwitchView) {
            if (currentSwitchView.parentSwitchView == potentialAncestor)
                return true;

            currentSwitchView = $get(currentSwitchView.parentSwitchView);
        }

        return false;
    },

    CheckIfSwitchViewIsVisible: function (switchView) {

        if (switchView) {
            var currentSwitchView = $get(switchView);

            // Check all parents of the current item for visibility.
            // [MB]
            while (currentSwitchView) {
                if (currentSwitchView.style.display == 'none')
                    return false;

                if (currentSwitchView.parentSwitchView) {
                    currentSwitchView = $get(currentSwitchView.parentSwitchView);
                }
                else {
                    currentSwitchView = null;
                }
            }
        }
        return true;
    },

    GetValues: function () {
        var fieldList = this.GetFieldsRecursive(this.Container, null);

        var rbLists = new Array();
        var dtDdlLists = new Array();
        var Values = new Array();

        for (var fieldNum = 0; fieldNum < fieldList.length; fieldNum++) {

            // Skip hidden fields.
            // [MB]
            if (!this.CheckIfSwitchViewIsVisible(fieldList[fieldNum].assignedSwitchView))
                continue;

            // Hack for DeliveryStreet, which is a DDL AND a TB
            // [TI]
            if (fieldList[fieldNum].id == "DDLDeliveryStreet" && fieldList[fieldNum].parentNode.style.display == 'none')
                continue;
            else if (fieldList[fieldNum].id == "TBDeliveryStreet" && fieldList[fieldNum].parentNode.style.display == 'none')
                continue;
            /*if (fieldList[fieldNum].id == "TBPhoneNumber01" && fieldList[fieldNum].parentNode.style.display == 'none')
            continue;*/

            var currentField = fieldList[fieldNum];
            this.MarkControlValid(currentField);
            var fieldType = "text";
            var dateTimePartObject = GetDateTimeDdlPart(currentField.id);
            var contractKeyValuePair = new Object();
            contractKeyValuePair.Key = GetFieldFromControl(currentField);
            this.FieldsToValidate[contractKeyValuePair.Key] = currentField;

            if (ControlIsRadiobutton(currentField)) {
                fieldType = "radio";

                // If the list has already been evaluated - skip the current field.
                // [MB]
                if (CheckIfValueIsInList(rbLists, currentField.name))
                    continue;

                contractKeyValuePair.Value = StripTags(this.ExtractRadioButtonValue(fieldList, currentField.name));

                // Add the current rbl to the list of evaluated rbls.
                // [MB]
                rbLists[rbLists.length] = currentField.name;
            }
            else if (dateTimePartObject) {
                fieldType = "date";

                // If the list has already been evaluated - skip the current field.
                // [MB]
                if (CheckIfValueIsInList(dtDdlLists, dateTimePartObject.dtKey))
                    continue;

                contractKeyValuePair.Value = StripTags(this.GetDateTimeStringFromDdls(fieldList, dateTimePartObject.dtKey));
                contractKeyValuePair.FieldType = "DateTime";
                contractKeyValuePair.Key = dateTimePartObject.dtKey;

                // Add the current rbl to the list of evaluated rbls.
                // [MB]
                dtDdlLists[dtDdlLists.length] = dateTimePartObject.dtKey;
            }
            else if (ControlIsDropdownlist(currentField)) {
                if ((currentField.options.length > 0)) {
                    var selectedOption = currentField.options[currentField.selectedIndex];
                    contractKeyValuePair.Value = StripTags((selectedOption.value == "") ? selectedOption.text : selectedOption.value);
                }
                else {
                    contractKeyValuePair.Value = "";
                }
            }
            else if (ControlIsCheckbox(currentField)) {
                if (!currentField.checked)
                    contractKeyValuePair.Value = "";
                else
                    contractKeyValuePair.Value = StripTags(currentField.value);
            }
            else {
                contractKeyValuePair.Value = StripTags(currentField.value);
            }

            // Store field associations.
            // [MB]
            this.FieldsToValidate[contractKeyValuePair.Key] = currentField;
            this.FieldsToValidate[contractKeyValuePair.Key].FieldType = fieldType;

            // Store the value of the field.
            // [MB]
            Values[Values.length] = contractKeyValuePair;
        }



        return Values;
    },

    ExtractRadioButtonValue: function (fieldList, rbName) {
        var rbList = this.GetRadioButtonsFromGroup(fieldList, rbName);

        for (var rbNum = 0; rbNum < rbList.length; rbNum++) {
            if (rbList[rbNum].checked)
                return rbList[rbNum].value;
        }
    },

    GetValue: function (fieldList, Key) {
        for (var fieldNum = 0; fieldNum < fieldList.length; fieldNum++) {
            if (fieldList[fieldNum].Key == Key)
                return fieldList[fieldNum].Value;
        }
    },

    GetRadioButtonsFromGroup: function (fieldList, rbName) {
        var listOfRbs = new Array();

        for (var itemNum = 0; itemNum < fieldList.length; itemNum++) {
            if (fieldList[itemNum].name == rbName)
                listOfRbs[listOfRbs.length] = fieldList[itemNum];
        }

        return listOfRbs;
    },

    GetDateTimeStringFromDdls: function (fieldList, dtKey) {
        var dtParts = this.GetDateTimeDdls(fieldList, dtKey);

        if ("CreditCardValidTo" == dtKey) {
            dtParts.month++;
            dtParts.month += ""; // <-- Hack for converting Int into string (otherwise i got no length-prop) [MB]

            if (dtParts.month > 12) {
                dtParts.year++;
                dtParts.month = "01";
            }

            dtParts.month = PadStringLeft(dtParts.month, "0", 2)
        }

        return dtParts.day + "." + dtParts.month + "." + dtParts.year;
    },

    GetDateTimeDdls: function (fieldList, dtKey) {
        var dtPrefix = "ddl" + dtKey.toLowerCase();
        var dtPrefixLength = dtPrefix.length;
        var dtParts = new Object();

        for (var itemNum = 0; itemNum < fieldList.length; itemNum++) {
            if (fieldList[itemNum].id.toLowerCase().substr(0, dtPrefixLength) == dtPrefix) {
                var currentValue = "";

                if (fieldList[itemNum].type == "hidden") {
                    currentValue = fieldList[itemNum].value;
                }
                else {
                    if ((fieldList[itemNum].options.length > 0)) {
                        var selectedOption = fieldList[itemNum].options[fieldList[itemNum].selectedIndex];
                        currentValue = (selectedOption.value == "") ? selectedOption.text : selectedOption.value;
                    }
                }

                var dtPartKey = fieldList[itemNum].id.toLowerCase().substr(dtPrefixLength, fieldList[itemNum].id.length - dtPrefixLength);
                dtParts[dtPartKey] = currentValue;
                dtParts[dtPartKey + "Control"] = fieldList[itemNum];
            }
        }

        return dtParts;
    },

    SwitchChildrenAccessibility: function (parentElement, mode) {
        var fieldList = this.GetFieldsRecursive(parentElement, null);

        for (var fieldNum = 0; fieldNum < fieldList.length; fieldNum++)
            fieldList[fieldNum].disabled = (mode == 'disable');
    },

    GetFieldsRecursive: function (parentElement, switchViewContainer) {
        var fieldList = new Array();

        if (parentElement && parentElement.childNodes) {
            // Loop through children.
            // [MB]
            for (var childNum = 0; childNum < parentElement.childNodes.length; childNum++) {
                var subNode = parentElement.childNodes[childNum];
                if (subNode) {
                    if (subNode.childNodes) {
                        var nextSwitchViewContainer = switchViewContainer;

                        // If we have childnodes, check if we are in an switchview container.
                        // [MB]
                        if (subNode.nodeName == "DIV" && subNode.className == "switchview") {
                            if (!subNode.swInitialized) {
                                this.SwitchViews[this.SwitchViews.length] = subNode;
                                this.SwitchViews[this.SwitchViews.length - 1].parentSwitchView = switchViewContainer;
                                subNode.style.display = "none";
                                subNode.swInitialized = true;
                            }

                            nextSwitchViewContainer = subNode.id;
                        }

                        // Get the subnodes.
                        // [MB]
                        var subItemFields = this.GetFieldsRecursive(subNode, nextSwitchViewContainer);

                        // Copy all fields from the lower tree into the list.
                        // [MB]
                        for (var subFieldNum = 0; subFieldNum < subItemFields.length; subFieldNum++) {
                            fieldList[fieldList.length] = subItemFields[subFieldNum];
                            fieldList[fieldList.length - 1].assignedSwitchView = subItemFields[subFieldNum].assignedSwitchView;
                        }
                    }

                    // Add node to fieldlist
                    // [MB]
                    if (subNode.nodeName == "INPUT" || subNode.nodeName == "SELECT" || subNode.nodeName == "TEXTAREA") {
                        fieldList[fieldList.length] = subNode;
                        fieldList[fieldList.length - 1].assignedSwitchView = switchViewContainer;
                    }
                }
            }
        }

        return fieldList;
    },

    JumpTo: function () {
        var point = Sys.UI.DomElement.getLocation(this.Container)
        var newYPoint = (parseInt(point.y) + parseInt(document.body.scrollTop));
        //alert(this.Name + ": " + newYPoint);
        window.scrollTo(0, newYPoint);
    },



    Validate: function () {
        this.FieldsToValidate = new Object();

        // Getting all field values from the current step.
        // [MB]
        var Values = this.GetValues();

        // Creating an request object.
        // [MB]
        var requestObject = {
            Parameter: {
                InstanceIdentifier: $get("ctl00_ctl00_CphMain_CphMain_phcontent_2_HfOrderInstanceId").value,
                OrderFields: Values
            },
            Source: "Shop.JS"
        }
        //        requestObject.Parameter.OrderFields = [];
        //        requestObject.Parameter.OrderFields[requestObject.Parameter.OrderFields.length] = { Key: "abc", Value: "def" };
        //        requestObject.Parameter.OrderFields[requestObject.Parameter.OrderFields.length] = { Key: "abc", Value: "def" };
        //        requestObject.Parameter.OrderFields[requestObject.Parameter.OrderFields.length] = { Key: "abc", Value: "def" };
        //        requestObject.Parameter.OrderFields[requestObject.Parameter.OrderFields.length] = { Key: "abc", Value: "def" };
        //        

        // ReplaceSpecial Fields
        // [TI]


        // Querying the service.
        // [MB]
        if (requestObject.Parameter.OrderFields[0].Key == "TComContractExists" && requestObject.Parameter.OrderFields[0].Value == undefined)
            requestObject.Parameter.OrderFields[0].Value = "";
        if (requestObject.Parameter.OrderFields.length > 1) {
            if (requestObject.Parameter.OrderFields[1].Key == "AddressAddition" && requestObject.Parameter.OrderFields[1].Value == "Adresszusatz")
                requestObject.Parameter.OrderFields[1].Value = "";
        }

        if (requestObject.Parameter.OrderFields.length > 6) {
            if (requestObject.Parameter.OrderFields[6].Key == "DeliveryAddressAddition" && requestObject.Parameter.OrderFields[6].Value == "Adresszusatz")
                requestObject.Parameter.OrderFields[6].Value = "";
        };

        if (requestObject.Parameter.OrderFields.length > 7) {
            if (requestObject.Parameter.OrderFields[7].Key == "CustomerNumber" && requestObject.Parameter.OrderFields[7].Value == "Kundennummer")
                requestObject.Parameter.OrderFields[7].Value = "";
        };

        if (requestObject.Parameter.OrderFields.length > 5) {
            if (requestObject.Parameter.OrderFields[5].Key == "CustomerNumber" && requestObject.Parameter.OrderFields[5].Value == "Kundennummer")
                requestObject.Parameter.OrderFields[5].Value = "";
        };

        TELE2.Shop.Services.IOrderService.UpdateOrderFields(requestObject, ValidationCallback, ValidationFailed);
    },




    ValidationCallback: function (result, flowLogic) {

        if (flowLogic && (flowLogic.ActiveStep.Name == this.Name)) {
            this.ResetErrorMessages();

            // If we had no errors - go to the next step.
            // [MB]
            if (result.Result.ValidationResult.Success) {
                this.Completed = true;
                if (flowLogic.ActiveStep.Name == "ExistingTComContract") {
                    if ($j("#RbOperatorType_false").attr('checked')) {
                        this.LastStep = true;
                        this.NextStep = null;
                    }
                }
                if (flowLogic.ActiveStep.Name == "OurRecommendation" || flowLogic.ActiveStep.Name == "OurRecommendationFVM") {
                    if ($j('#CBUseRecommendation').attr('checked')) {
                        var param = $j('#RecommendedProductId').attr('upsaleId');
                        actionHelper.SubmitAction('AddToBasketAndGoToSummary', param);
                        return;
                    }
                    else {
                        this.LastStep = true;
                        this.NextStep = null;
                    }
                }

                if (!this.LastStep) {
                    flowLogic.RenderCustomerDataSteps();
                    return;
                }
                else {
                    flowLogic.RedirectToSummaryPage();
                    return;
                }
            }
            else {
                if (result.Success) {
                    // Display the given faults.
                    // [MB]
                    if (result.Result.ValidationResult.ErrorMessages) {

                        window.AddressApplied = false;
                        for (var errMsgNum = 0; errMsgNum < result.Result.ValidationResult.ErrorMessages.length; errMsgNum++) {
                            HandleAddressDataValidation(errMsgNum, result);

                            this.ShowErrorMessageContainer(result.Result.ValidationResult.ErrorMessages[errMsgNum]);
                        }

                    }

                    // Mark the invalid fields.
                    // [MB]
                    if (result.Result.ValidationResult.FailedFields) {
                        this.MarkInvalidControls(result.Result.ValidationResult.FailedFields);
                    }
                }
                else {
                    DebugDisplayErrorMessages(result);
                }
            }
        }
    },

    MarkInvalidControls: function (failedFields) {
        var fieldList = this.GetFieldsRecursive(this.Container, null);

        for (var failedFieldNum = 0; failedFieldNum < failedFields.length; failedFieldNum++) {
            var fieldToValidate = this.FieldsToValidate[failedFields[failedFieldNum].Key];
            if (fieldToValidate) {
                if (GetDateTimeDdlPart(fieldToValidate.id)) {
                    var dateTimeDdls = this.GetDateTimeDdls(fieldList, failedFields[failedFieldNum].Key);

                    if (dateTimeDdls.dayControl)
                        this.MarkControlInvalid(dateTimeDdls.dayControl);

                    if (dateTimeDdls.monthControl)
                        this.MarkControlInvalid(dateTimeDdls.monthControl);

                    if (dateTimeDdls.yearControl)
                        this.MarkControlInvalid(dateTimeDdls.yearControl);
                }
                else if (ControlIsRadiobutton(fieldToValidate)) {
                    var rbList = this.GetRadioButtonsFromGroup(fieldList, failedFields[failedFieldNum].Key);

                    for (var rbNum = 0; rbNum < rbList.length; rbNum++) {
                        this.MarkControlInvalid(rbList[rbNum]);
                    }
                }
                else {
                    this.MarkControlInvalid(fieldToValidate);
                }
            }
        }
    },

    MarkControlInvalid: function (control) {
        if (ControlIsDropdownlist(control)) {
            control.style.backgroundColor = '#FF9999';
        }
        else if (ControlIsRadiobutton(control)) {

        }
        else if (ControlIsCheckbox(control)) {

        }
        else {
            if (!$j(control).parent().hasClass("fieldError")) {
                $j(control).parent().addClass("fieldError");
            }
        }
    },

    MarkControlValid: function (control) {
        if (ControlIsDropdownlist(control)) {
            control.style.backgroundColor = '';
        }
        else if (ControlIsRadiobutton(control)) {
            control.style.border = '';
        }
        else if (ControlIsCheckbox(control)) {

        }
        else {
            if ($j(control).parent().hasClass("fieldError")) {
                $j(control).parent().removeClass("fieldError");
            }
        }
    }
}
//Type.registerClass("CustomerDataStep", null, Sys.IDisposable);

function ValidationCallback(result) {
    if (flowLogic)
        flowLogic.ActiveStep.ValidationCallback(result, flowLogic);
}

function ValidationCallbackAll(result) {

    if (flowLogic) {
        $j(".errorMsg").each(function () {
            $j(this).removeClass("hidden");
            $j(this).addClass("hidden");
        });

        if (result.Result.ValidationResult.ErrorMessages.length > 0) {

            window.AddressApplied = false;

            for (var errMsgNum = 0; errMsgNum < result.Result.ValidationResult.ErrorMessages.length; errMsgNum++) {
                var messageCode = result.Result.ValidationResult.ErrorMessages[errMsgNum];

                HandleAddressDataValidation(errMsgNum, result);

                if (messageCode != "") {
                    var errorContainer = $j("#ErrorMessage_" + messageCode);

                    if (errorContainer.length > 0) {
                        errorContainer.removeClass("hidden");
                    }
                    else {
                        alert(messageCode + "fehlt");
                    }

                    errorContainer.addClass("visible");
                }
            }


            if (result.Result.ValidationResult.FailedFields) {
                for (var i = 0; i < flowLogic.Steps.length; i++) {
                    flowLogic.Steps[i].MarkInvalidControls(result.Result.ValidationResult.FailedFields);
                }
            }



            flowLogic.RenderCustomerDataSteps(true);
            // Jump To container of first
            var messageCode = result.Result.ValidationResult.ErrorMessages[0];
            var errorContainer = document.getElementById("ErrorMessage_" + messageCode);

            var point = Sys.UI.DomElement.getLocation(errorContainer)
            var newYPoint = (parseInt(point.y));
            //alert(this.Name + ": " + newYPoint);
            window.scrollTo(0, newYPoint);
        }
        else {
            if ($j('#CBUseRecommendation').attr('checked')) {
                var param = $j('#RecommendedProductId').attr('upsaleId');
                actionHelper.SubmitAction('AddToBasketAndGoToSummary', param);
                return;
            }



            flowLogic.RedirectToSummaryPage();
        }
    }
}


function ValidationFailed(result) {
    if (flowLogic)
        flowLogic.ActiveStep.ValidationCallback(result, flowLogic);
}


FlowLogic = function () {
    this.ActiveStep = null;
    this.Steps = new Array();
    this.EditMode = false;
    this.SwitchViewInits = new Object();
}

FlowLogic.prototype =
{
    ProceedAllCustomerDataSteps: function () {
        var addressCarrier = $j("#DeliveryAddressCarrier");
        if (addressCarrier.length > 0) {
            addressCarrier[0].swInitialized = true;

            if (($j("#CBUseDeliveryAddress").attr("checked") == true) || ($j("#CBUseDeliveryAddress").attr("checked") == "checked")) {
                addressCarrier[0].style.display = "block";
            }
            else {
                addressCarrier[0].style.display = "none";
            }
        }


        this.EditMode = false;
        var Values = new Array();
        for (var i = 0; i < this.Steps.length; i++) {
            var StepValues = this.Steps[i].GetValues();
            for (var j = 0; j < StepValues.length; j++) {
                Values.push(StepValues[j]);
            }
        }
        this.ValidateAllSteps(Values);


    },
    ValidateAllSteps: function (Values) {
        this.FieldsToValidate = new Object();

        // Creating an request object.
        // [MB]
        var requestObject = {
            Parameter: {
                InstanceIdentifier: $get("ctl00_ctl00_CphMain_CphMain_phcontent_2_HfOrderInstanceId").value,
                OrderFields: Values
            },
            Source: "Shop.JS"
        }
        //        requestObject.Parameter.OrderFields = [];
        //        requestObject.Parameter.OrderFields[requestObject.Parameter.OrderFields.length] = { Key: "abc", Value: "def" };
        //        requestObject.Parameter.OrderFields[requestObject.Parameter.OrderFields.length] = { Key: "abc", Value: "def" };
        //        requestObject.Parameter.OrderFields[requestObject.Parameter.OrderFields.length] = { Key: "abc", Value: "def" };
        //        requestObject.Parameter.OrderFields[requestObject.Parameter.OrderFields.length] = { Key: "abc", Value: "def" };
        //        

        // ReplaceSpecial Fields
        // [TI]


        // Querying the service.
        // [MB]
        if (requestObject.Parameter.OrderFields[0].Key == "TComContractExists" && requestObject.Parameter.OrderFields[0].Value == undefined)
            requestObject.Parameter.OrderFields[0].Value = "";
        if (requestObject.Parameter.OrderFields.length > 1) {
            if (requestObject.Parameter.OrderFields[1].Key == "AddressAddition" && requestObject.Parameter.OrderFields[1].Value == "Adresszusatz")
                requestObject.Parameter.OrderFields[1].Value = "";
        }

        if (requestObject.Parameter.OrderFields.length > 6) {
            if (requestObject.Parameter.OrderFields[6].Key == "DeliveryAddressAddition" && requestObject.Parameter.OrderFields[6].Value == "Adresszusatz")
                requestObject.Parameter.OrderFields[6].Value = "";
        };

        if (requestObject.Parameter.OrderFields.length > 7) {
            if (requestObject.Parameter.OrderFields[7].Key == "CustomerNumber" && requestObject.Parameter.OrderFields[7].Value == "Kundennummer")
                requestObject.Parameter.OrderFields[7].Value = "";
        };

        if (requestObject.Parameter.OrderFields.length > 5) {
            if (requestObject.Parameter.OrderFields[5].Key == "CustomerNumber" && requestObject.Parameter.OrderFields[5].Value == "Kundennummer")
                requestObject.Parameter.OrderFields[5].Value = "";

        };


        if (requestObject && requestObject.Parameter && requestObject.Parameter.OrderFields) {
            var terminateExistingContractFound = false;
            var phoneNumber01IsDefault = true;

            var tecIdx = -1;
            var pn01Idx = -1;
            for (var orderFieldIdx = 0; orderFieldIdx < requestObject.Parameter.OrderFields.length; orderFieldIdx++) {
                var curOrderField = requestObject.Parameter.OrderFields[orderFieldIdx];

                if (curOrderField.Key == "TerminateExistingContract") {
                    tecIdx = orderFieldIdx;

                    if (curOrderField.Value == "true")
                        terminateExistingContractFound = true;
                }
                else if (curOrderField.Key == "PhoneNumber01") {
                    pn01Idx = orderFieldIdx;

                    if (curOrderField.Value == "Rufnummer")
                        phoneNumber01IsDefault = true;

                }
            }


            if (!terminateExistingContractFound && phoneNumber01IsDefault) {
                if ((requestObject.Parameter.OrderFields.length >= tecIdx) && (tecIdx != -1))
                    requestObject.Parameter.OrderFields[tecIdx].Value = "false";

                if ((requestObject.Parameter.OrderFields.length >= pn01Idx) && (pn01Idx != -1))
                    requestObject.Parameter.OrderFields[pn01Idx].Value = "";



                var newOrderFieldsArray = [];
                for (var i = 0; i < requestObject.Parameter.OrderFields.length; i++) {
                    if (i == pn01Idx)
                        continue;

                    var arrIdx = newOrderFieldsArray.length;

                    newOrderFieldsArray[arrIdx] = {
                        Key: requestObject.Parameter.OrderFields[i].Key,
                        Value: requestObject.Parameter.OrderFields[i].Value
                    };

                    if (requestObject.Parameter.OrderFields[i].FieldType) {
                        newOrderFieldsArray[arrIdx].FieldType = requestObject.Parameter.OrderFields[i].FieldType;
                    }
                }
                requestObject.Parameter.OrderFields = newOrderFieldsArray;

            }
        }



        TELE2.Shop.Services.IOrderService.UpdateOrderFields(requestObject, ValidationCallbackAll, ValidationCallbackAll);
    },

    ProceedCustomerDataStep: function () {
        this.EditMode = false;
        if (this.ActiveStep) {
            // If activeStep is valid, set to completed, else show ValidationErrors.
            // [MB]
            this.ActiveStep.Validate();
        }
    },



    AddCustomerDataStep: function (stepType, containerId) {
        if (!this.ActiveStep) {
            var newStep = null;
            switch (stepType) {
                case "CustomerDataStep":
                    newStep = new CustomerDataStep(containerId);
                    break;
            }

            if (newStep) {
                this.Steps[this.Steps.length] = newStep;
            }
        }
    },

    // Set the startup values for the steps.
    InitializeSteps: function () {
        if (this.Steps && this.Steps.length > 0) {
            this.ActiveStep = this.Steps[0];
            this.ActiveStep.Active = true;
            this.ActiveStep.Visible = true;

            var stepCount = this.Steps.length;

            for (var stepNumber = 0; stepNumber < stepCount; stepNumber++) {
                if (stepNumber > 0) {
                    this.Steps[stepNumber - 1].NextStep = this.Steps[stepNumber];
                    this.Steps[stepNumber].PreviousStep = this.Steps[stepNumber - 1];
                }

                if (stepNumber == (stepCount - 1))
                    this.Steps[stepNumber].LastStep = true;
            }
        }
    },


    Init: function () {
        this.InitializeSteps();
        this.RenderCustomerDataSteps();

        if (GetQueryVariable("stepName")) {
            this.EditSteps(GetQueryVariable("stepName"));
        }

    },

    InitForFVM: function () {
        this.Steps[this.Steps.length - 1].LastStep = true;
    },

    EditSteps: function (activeStepName) {
        var stepReached = false;
        this.EditMode = true;

        if (GetQueryVariable("stepName")) {
            for (var i = 0; i < this.Steps.length - 1; i++) {
                this.Steps[i].Completed = true;
            }
        }
        for (var i = 0; i < this.Steps.length; i++) {
            //this.Steps[i].Completed = true;
            this.Steps[i].Visible = false;
            this.Steps[i].Active = false;

            if (this.Steps[i].Name == activeStepName) {
                this.Steps[i].Completed = false;
                stepReached = true;
            }
            else if (stepReached && this.Steps[i].Name != activeStepName) {
                //                this.Steps[i].Completed = false;
                // TODO: Löschen der Werte nachfolgender Schritte
                // [TI]
            }
        }
        this.ActiveStep = $get(activeStepName);
        this.ActiveStep.Compelted = false;
        this.RenderCustomerDataSteps();
    },

    GetStepByName: function (stepName) {
        for (var stepNum = 0; stepNum < this.Steps.length; stepNum++) {
            if (this.Steps[stepNum].Name == stepName)
                return this.Steps[stepNum];
        }
    },
    OverrideOmnitureSettings: function (itemName) {
        pageName = originPageName + '.' + itemName;
        channelName = originChannelName;
        s.prop9 = channelName;
        s.pageName = pageName;

        var s_code = s.t(); if (s_code) document.write(s_code);
    },

    RenderCustomerDataSteps: function (skipUpdatingContainer) {
        if (this.Steps) {
            // determine visibility of steps and activeStep
            // set all steps to visible and completeted until activeStep is reached
            var aStep = this.Steps[0];

            while (aStep && aStep.Completed) {
                aStep.Visible = true;
                aStep.Active = false;
                aStep = aStep.NextStep;
            }

            if (aStep != null) {
                if (this.ActiveStep != null) {
                    this.OverrideOmnitureSettings(this.ActiveStep.Name);
                }
                this.ActiveStep = aStep;
                this.ActiveStep.Visible = true;
                this.ActiveStep.Active = true;
                //this.ActiveStep.Completed = false;
                // TODO: Speichern active step in Session
            }


            // render container with new properties
            for (var i = 0; i < this.Steps.length; i++) {
                if (this.Steps[i].Container) {
                    if (!skipUpdatingContainer)
                        this.Steps[i].RenderContainer();
                }
                else {
                    alert("container for step " + i + " is missing.");
                    break;
                }
            }

            if (window.pageIsLoaded && !skipUpdatingContainer) {
                $j("#CDSContainer .customerStep").each(function (idx, e) {
                    var shapeElements = $j("shape", loopedStep);
                    var fillColor = null;

                    if (shapeElements && (shapeElements.length > 0))
                        fillColor = shapeElements.attr("fill").color.value;

                    var loopedStep = $j(this);
                    if (loopedStep.hasClass("txt_silver")) {
                        // Positive match because of the error messages.
                        // [MB]
                        if (!fillColor || (fillColor != "#999")) {
                            Cufon.replace(loopedStep, {
                                fontFamily: 'botonRegular',
                                color: '#999'
                            });
                        }
                    }
                    else {
                        // Positive match because of the error messages.
                        // [MB]
                        if (!fillColor || (fillColor != "#000")) {
                            Cufon.replace(loopedStep, {
                                fontFamily: 'botonRegular',
                                color: '#000'
                            });
                        }
                    }
                });
            }
        }
    },



    // Registers a hint at the steps, which field controls a switch view.
    // [MB]
    RegisterSwitchViewInit: function (associatedField, switchViewEvaluationMethod) {
        this.SwitchViewInits[associatedField] = switchViewEvaluationMethod;
    },

    // Redirects to the summary page - and adding the pid, if available.
    // [MB]
    RedirectToSummaryPage: function () {
        var pidCarrier = $get("pid");


        if (pidCarrier && (pidCarrier.value != "")) {
            window.location = $get("ctl00_ctl00_CphMain_CphMain_phcontent_2_HfNextPageUrl").value + pidCarrier.value;
        }
        else {
            window.location = $get("ctl00_ctl00_CphMain_CphMain_phcontent_2_HfNextPageUrl").value;
        }
    }
}
//Type.registerClass("FlowLogic", null, Sys.IDisposable);
var flowLogic = new FlowLogic();
