
/**
 * Validation RFQ specific classes is found here
 *
 * @namespace
 * @requires jQuery, jQuery validation plugin
 */
var RFQValidation = {

    /**
     * Method for initializing additional handlers for jQuery validation plugin.
     * @param {jQuery.validator} validator Validator instance to add new handlers.
     * @class
     */
    initHandlers: function(validator) {

        validator.addMethod("regexp",
            function(value, element, regex) {
                var re = new RegExp(regex);
                return this.optional(element) || re.test(value);
            }
        );

        validator.addMethod("assertTrue",
            function(value, element) {
                if (element.checked) return true;
                return false;
            }
        );

        validator.addMethod("equalsCheck",
            function(value, element, param) {
                // TODO (in IE it make infinite loop)
                var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo",
                    function() {
                        $(element).valid();
                        // TODO workaround (in IE it make a js-error)
                        throw "break";
                    }
                );
                return value == target.val();
            }
        );
    },

    /**
     * hangs validation to the given form
     * @param {String} id the form id (without a number '#' sign).
     * @param {} version of the validation, 1 = new (for the new forms)
     * @class
     */
    validateForm: function(id, version) {

        version = version || 0;

        ValidatorFactory.getValidator(id, function(data) {

            if (version === 1) {

                data.validClass = "valid";
                data.errorClass = "invalid";
                data.errorElement = "em";
                data.errorPlacement=function(error, element) {
                    if (element.attr("id") === "subCategoryId" || element.attr("id") === "subAreaId") {
                        error.css("margin-left", "385px");
                    }
                    element.closest(".row").append(error);

                };

                $("#" + id).validate(data);

            } else {
                data.validClass = "valid";
                data.errorClass = "invalid";
                // if (you want to switch off any event type set it to false)
                // don't set to true it removed default jQuery handler
                //          data.onkeyup = false;

                /*
                 * fix https://jira.exigenservices.com/browse/EBFS-1509
                 * to avoid change state of checkboxes
                 * replaces an error messages type from 'label' to 'div'
                 */
                data.errorElement="div";
                data.errorLabelContainer = "#error-fields";

                $("#" + id + " " + data.errorLabelContainer + " " + data.errorElement).live('click', function() {
                        /** @type {HTMLDivElement} this err message element */

                    var elementName = $(this).attr("htmlfor");
                    var element = $("#"+elementName);
                    if(element) {
                        element.focus();
                    }
                });
            }
            $("#" + id).validate(data);
        });
    },

    /**
     * transform Spring server side error messages to jQuery validator error label container.
     * @class
     */
    transformSpringErrors: function(form) {
        $("span.error", $("#" + form)).each(function() {
            var $error = $(this),
                forAttr = $error.parent().attr("id").match(".*[^Errors]"),
                $newError = $('<em />').text($error.text()).addClass("invalid").attr("for", forAttr);

            $error.closest(".row").append($newError);
            $error.remove();

        });
    },
    /*
    FormUtil : {
		tuneFocus : function(form, elementsSelector) {

            form.find(elementsSelector).focus(function() {

                var elSpan = $(this).parent().find('span.message');

                if (!$(this).hasClass('valid') && !$(this).hasClass('invalid') && $(elSpan).text() !== "") {
					$(elSpan).css('display', 'block');

                } else if (!$(this).hasClass('valid') && $(elSpan).text() == "") {
                    var message = $(elSpan).metadata().message;
					$(elSpan).removeClass('invalid').text(message).css('display', 'block');
				}
			});

            form.find(elementsSelector).blur(function() {

                var elSpan = $(this).parent().find('span.message');
                $(elSpan).css('display', 'none');

                if ($(this).hasClass('valid')) {
                    $(elSpan).removeClass('invalid').addClass('valid').show();
                    var message = $(elSpan).text();
                    if (message) {
                    	$(elSpan).addClass("{message: '" + message + "'}").text("");
                    }

                } else if ($(this).hasClass('invalid')) {
                    $(elSpan).removeClass('valid').addClass('invalid').show();
                    var message = $(elSpan).text();
                    if (message) {
                    	$(elSpan).addClass("{message: '" + message + "'}").text("");
                    }

                } else {
                    $(elSpan).removeClass('valid').removeClass('invalid');
                }
            });
		}
	},*/

    /**
	 * @class
	 */
    /*
    CreateSupplierForm: {
        configure: function() {

            var form = $("form#create-supplier-account");
            var orgNr1 = "";

            if (form.find("input#orgNr1") && form.find("input#orgNr3"))
            //if ($("form#create-supplier-account input#orgNr1").length && $("form#create-supplier-account input#orgNr2").length)
            {
                orgNr1 = "#orgNr1,";
            }

            RFQValidation.FormUtil.tuneFocus(form,
                'input[type="text"]:not(".captcha, ' + orgNr1 + ' #campaignCode")');

            if ($("form#create-supplier-account input#orgNr1").length && $("form#create-supplier-account input#orgNr2").length)
            {
                $('form#create-supplier-account input#orgNr1').blur(function()
                {
                    var elSpan = $(this).parent().find('span.message');
                    $(elSpan).css('display', 'none');
                });
            }
        }
    },*/
    prepareForm: function($form, selectorString) {

        if ($form.attr("id") === "create-user-account") {
            var $counter = $form.find(".charcount");
        }

        //datepicker
        $("#startDate", $form).attr('readonly', true).datepicker();


        //upload files
        $('#attach-file', $form).MultiFile({
            list: '#attach-file-list',
            namePattern: '$name_$i',
            STRING: {
                remove: 'Ta bort',
                denied: 'Inkorrekt filformat'
            }
        });

        //description
        $("#description", $form).focus(function(){
            var _desc = $(this),
                updateCounter = function() {
                    setTimeout(function(){
                        $counter.text(_desc.val().length);
                    });

                };

            $counter.fadeIn();
            _desc.keypress(updateCounter);

            if (!_desc.hasClass('valid')) {
                $("#registerConsumerDescriptionInstruction")
                    .load(contextPath + "/service/message" + "?key=register.consumer.instruction.subcategory" + $('#subCategoryId').val() + "&defaultkey=register.consumer.instruction.default");
            }

        }).blur(function(){
            $counter.unbind().fadeOut();
        });

        function confirmations(selectorString, form) {

            var dualOrgNo = ($("#orgNr2", form).length) ? true : false;

            form.find(selectorString).focus(function(e){

                var $input = $(e.target),
                    $span = $input.siblings(".message"),
                    message;

                if (!$input.is('.valid, .invalid') && $span.text() !== "") {
                    if ($input.is('#description')) {
                        $span.css("display", "block");
                    } else {
                        $span.css("display", "block");
                    }
                } else if (!$input.is('.valid') && $span.text() =="") {
                    message = $span.metadata().message;
                    $span.removeClass('invalid').text(message).show();
                }

            }).blur(function(e){

                var $input = $(e.target),
                    $span = $input.siblings(".message"),
                    message;

                if ($input.is('.valid')) { //if valid, then show checkbox

                    if (dualOrgNo && $input.is("#orgNr1")) {
                        return false;
                    }

                    $span.addClass("valid").removeClass("invalid").show(); //if message has valid-class, show the check
                    message = $span.text();

                    if (message) {
                        $span.addClass("{message: '" + message + "'}").text("");

                    }

                } else if ($input.is(".invalid")) {

                    $span.removeClass("valid").addClass("invalid").hide();
                    message = $span.text();

                    if (message) {
                        $span.addClass("{message: '" + message + "'}").text("");
                    }


                } else {
                    $span.removeClass("valid invalid").hide();
                }
            });
        }

        confirmations(selectorString, $form);

    },
    /**
     * Method for initializing RFQ Validation JavaScript
     * @class
     */
    Init: function() {

        RFQValidation.initHandlers($.validator);


        var id = document.getElementsByTagName("body")[0].id,
            $form,
            formId,
            selectorString,
            prepareAndValidate = function(formId, selectorString, version) {

                selectorString = selectorString || false;
                version = version || 0;

                if (selectorString) {
                    RFQValidation.prepareForm($("#" + formId), selectorString);
                }

                RFQValidation.transformSpringErrors(formId);
                RFQValidation.validateForm(formId, version);
            };


        switch(id) {
            case "page-create-consumer-account":
                formId = "create-user-account";
                selectorString = 'input[type="text"]:not(".date-pick, .captcha"), textarea';
                prepareAndValidate(formId, selectorString, 1);
                break;
            case "page-create-supplier-account":
                formId = "create-supplier-account";
                selectorString = 'input[type="text"]:not(".captcha, #campaignCode")';
                prepareAndValidate(formId, selectorString, 1);
                break;
            case "page-edit-supplier-account":
                prepareAndValidate('update-supplier-account', false, 0);
                break;
            case "page-activate-supplier-account":
                prepareAndValidate('activate-supplier-account', false, 0);
                break;
            case "page-request":
                selectorString = 'input[type="text"]:not(".date-pick"), textarea';
                prepareAndValidate('answer-request', selectorString, 1);
                break;
            case "page-tracking-profile":
                TrackingProfile.init();
        }
    }
};

var TrackingProfile = {};

TrackingProfile.init = function() {

    var Elements = {
        context: '#supplier-tracking-profile',
        category: '#categoryId',
        subCategory: '#subCategories',
        subArea: '#subAreaId',
        saved: '#mySavedSubscriptions',
        subAreaSelected: '#selectedSubAreaList',
        subCategorySelected: '#subCategoriesSelected',
        categoryWrapper: "#categoryWrapper",
        areaWrapper: "#areaWrapper"
    };
        
    //Add & Remove subcategories
    $(".categorySelector", $(Elements.context)).click(function(e){
        e.preventDefault();
        var id = $(e.target).attr("id");

        switch(id) {
            case "addServiceCategory":
                TrackingProfile.swap($(Elements.subCategory), $(Elements.subCategorySelected));
                break;
            case "removeServiceCategory":
                TrackingProfile.swap($(Elements.subCategorySelected), $(Elements.subCategory));
                break;
            case "addAllServiceCategories":
                TrackingProfile.swapAll($(Elements.subCategory), $(Elements.subCategorySelected));
                break;
            case "removeAllServiceCategories":
                TrackingProfile.swapAll($(Elements.subCategorySelected), $(Elements.subCategory));
                break;
        }
    });

    //Add & Remove areas
    $(".areaSelector", $(Elements.context)).click(function(e){
        e.preventDefault();
        var id = $(e.target).attr("id");
        switch(id) {
            case "addServiceLocation":
                TrackingProfile.swap($(Elements.subArea), $(Elements.subAreaSelected));
                break;
            case "removeServiceLocation":
                TrackingProfile.swap($(Elements.subAreaSelected), $(Elements.subArea));
                break;
            case "addAllServiceLocations":
                TrackingProfile.swapAll($(Elements.subArea), $(Elements.subAreaSelected));
                break;
            case "removeAllServiceLocations":
                TrackingProfile.swapAll($(Elements.subAreaSelected), $(Elements.subArea));                    
                break;
        }
    });

    //Set default
    var $areaWrapper = $(Elements.categoryWrapper),
        $categoryWrapper = $(Elements.areaWrapper),
        savedId = ($("#savedSubscriptionId").val() !=="") ? $("#savedSubscriptionId").val() : false;

    if (savedId) {
        //colorize loaded selects
        TrackingProfile.colorizeSelect('#subCategories, #subCategoriesSelected, #selectedSubAreaList');
    } else {
        $categoryWrapper.hide();
        $areaWrapper.hide();
        TrackingProfile.changeCategory($(Elements.category).val());
    }

    
    //area change
    $("#areaId", $(Elements.context)).change(function(){
        TrackingProfile.areaChange($(this).val());
    });

    //load default
    //TrackingProfile.areaChange($('#areaId', $(Elements.context)).val());

    //category change
    var $categorySelect = $(Elements.category, $(Elements.context));

    $categorySelect.change(function(){
        TrackingProfile.changeCategory($(this).val());
    });
    
    //validate form
    $(Elements.context).submit(TrackingProfile.validate);

};


TrackingProfile.changeCategory = function(categoryId) {

    categoryId = (categoryId !== "" && categoryId !== "-1") ? categoryId : false;

    var context = $("#supplier-tracking-profile"),
        $categoryWrapper = $("#categoryWrapper", context),
        exists = function(categoryId) {
            return ($("#mySavedSubscriptions", context).find('a[id="editSubscription' + categoryId + '"]').length > 0);
        };

    if (!!categoryId) {

        if(exists(categoryId)) {
            $categoryWrapper.slideUp();            
            $("#saveButtonLink", context).hide();
            TrackingProfile.alertUser('#validationDoubledCategoryAlert', context, true);
        } else {
            TrackingProfile.loadSubCategories(categoryId);
            $categoryWrapper.slideDown();
            $("#saveButtonLink", context).show();
            $("#validationDoubledCategoryAlert").fadeOut();
        }

        //$('.checkAll', $("#supplier-tracking-profile")).show();
        //$('#checkAll', $("#supplier-tracking-profile")).attr("checked", false);

    } else {
        $categoryWrapper.slideUp();
        //$("#checkboxWrapper").empty();
        //$(".checkAll", $("#supplier-tracking-profile")).fadeOut();
    }
};

TrackingProfile.areaChange = function(areaId) {

    areaId = (areaId !== "" && areaId !== "-1") ? areaId : false;

    var context = $("#supplier-tracking-profile"),
        $areaWrapper = $("#areaWrapper", context);

    if (!!areaId) {
        $areaWrapper.slideDown();
        var $optionList = $("#selectedSubAreaList").children(),
            optArr = [];

        if ($optionList.length > 0) {
            $optionList.each(function(){
                optArr.push($(this).attr("value"));
            });
        }

        //update the form
        $("#subAreaId").load(contextPath + "/references/subAreaOptionList", {
            areaId: areaId,
            excludedAreaIdList: optArr
        }, function(){
            TrackingProfile.colorizeSelect('#subAreaId, #selectedSubAreaList, #areaId');
        });
    } else {
        $areaWrapper.slideUp();
    }
};

TrackingProfile.loadSubCategories = function(categoryId) {
    var $wrapper = $("#subCategories"),
        $selected = $("#subCategoriesSelected"),
        id = (categoryId !== "") ? categoryId : false;

    if (id) {
        $wrapper.load(contextPath + "/references/subCategoryCheckboxList" +"?categoryId=" + id, function(){
            $selected.empty();
            //colorize
            TrackingProfile.colorizeSelect($wrapper);
        });
    }
};

TrackingProfile.alertUser = function(elem, context, persistent) {

        persistent = persistent || false;

        $(elem, context).fadeIn(function(){
            if (!persistent) {
                setTimeout(function(){
                    $(elem, context).fadeOut();
                }, 5000);
            }
        });
}

TrackingProfile.validate = function() {
    var form = $(this),
        allOk = true;

    // select all options in "selected sub areas" list to perform sending their IDs

    var areaArr = new Array,
        catArr = new Array,
        areaSelect = $("#selectedSubAreaList", form),
        catSelect = $("#subCategoriesSelected", form),
        areaOptionArray = areaSelect.find("option"),
        catOptionArray = catSelect.find("option");


    for (var i = 0, ii = areaOptionArray.length; i < ii; i++) {
        areaArr[i] = $(areaOptionArray[i]).attr("value");
    }

    for (var j = 0, jj = catOptionArray.length; j < jj; j++) {
        catArr[j] = $(catOptionArray[j]).attr("value");
    }

    areaSelect.val(areaArr);
    catSelect.val(catArr);

    //Create validations
    var anyCategories = ($("#subCategoriesSelected", form).find("option").length > 0),
        anyAreas = ($("#selectedSubAreaList", form).find("option").length > 0);

    if (!anyCategories) {
        TrackingProfile.alertUser('#validationEmptySubCategoryAlert', form);
        allOk = false;
    }

    if (!anyAreas) {
        TrackingProfile.alertUser('#validationEmptySubAreaAlert', form);
        allOk = false;
    }

    return allOk;

};

TrackingProfile.swap = function(from, to) {
    $(from)
        .find(':selected')
        .appendTo(to);

    TrackingProfile.colorizeSelect([from, to]);
};

TrackingProfile.swapAll = function(from, to) {
    $(from)
        .children()
        .appendTo(to);
    TrackingProfile.colorizeSelect([from, to]);
};

/*
TrackingProfile.checkAll = function() {
    var group = ':checkbox[name=' + $(this).attr('name') + ']';
    $(group).attr('checked', $(this).attr('checked'));
};
*/



TrackingProfile.colorizeSelect = function(elems){

    $(elems).each(function(){

        $.each($(this).children("option"), function(index){
            var row = $(this).removeClass("odd");
            if (index %2 === 0) {
                row.addClass("odd"); 
            }
        });
    });

};


// add listener to dom tree
$(document).ready(RFQValidation.Init);

