﻿// Reference a file-based JavaScript 
/// <reference path="~/content/js/jquery/jquery-1.4.2.js" />
/// <reference path="~/content/js/danskit/danskit.notifier.js" />
/// <reference path="~/content/js/danskit/danskit.common.js" />
/// <reference path="~/content/js/danskit/danskit.pagestrings.js" />
/// <reference path="~/content/js/jquery/jquery.validate-min.js" />

var ctrlSuffix_txtZipCode = "ZipCode";

$(document).ready(function () {
    SetupDefaultValidation();
    SetupCityAutoComplete();

    // add styling to all fieldset- and legend tags:
    $("legend").addClass("ui-state-default ui-corner-all");
    $("button, input:submit, input:button, .button").button();
    $('select').not('.multiselect').selectmenu({ style: 'dropdown', maxHeight: 250, close: function (e) { $("form").validate().element($(this)); } });
    $(".datepicker, .date").datepicker({
        dateFormat: 'dd-mm-yy',
        nextText: 'Frem',
        prevText: 'Tilbage',
        changeYear: true,
        changeMonth: true,
        firstDay: 1,
        yearRange: '1900:2099',
        dayNames: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
        dayNamesShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],
        dayNamesMin: ['Sø', 'Ma', 'Ti', 'On', 'To', 'Fr', 'Lø'],
        monthNames: ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December'],
        monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec']


    });

    SetupForeignAddressHandling();

});

function SetupForeignAddressHandling() {

    var foreignAddressCheckBoxes = $("input:checkbox[name$='cbForeignAddress']");
    var closestFieldset = $(foreignAddressCheckBoxes).closest("fieldset");
    var denmarkAddressPanel = $(closestFieldset).find("div[id$='pnlDanishAddress']");
    var foreignAddressPanel = $(closestFieldset).find("div[id$='pnlForeignAddress']");

    $(denmarkAddressPanel).show();
    $(foreignAddressPanel).hide();

    $(foreignAddressCheckBoxes).each(function (index) {
        $(this).change( foreignAddressCheckBoxChange );
    });
}

function foreignAddressCheckBoxChange() {

    var closestFieldset = $(this).closest("fieldset");
    var denmarkAddressPanel = $(closestFieldset).find("div[id$='pnlDanishAddress']");
    var foreignAddressPanel = $(closestFieldset).find("div[id$='pnlForeignAddress']");
    var selectLanguage = $(foreignAddressPanel).find("select");

    c = $(this).is(':checked');

    if (c) {
        $(denmarkAddressPanel).hide();
        $(foreignAddressPanel).show();
    } else {
        $(denmarkAddressPanel).show();
        $(foreignAddressPanel).hide();
    }


    $(selectLanguage).selectmenu('refresh');



};


function SetupCityAutoComplete() {

	// find controls:
	var cityControls = $('input[name$=' + ctrlSuffix_txtZipCode + ']');

	if (cityControls.length > 0) {
		var dataSource = Strings.Urls._CompanyHandlerUrl;

		$(cityControls).each(function (index) {

		    $(this).change(function () {
		        var city = GetCity($(this).val());
	            $(this).parent().children('input[name$=City]').val(city);
		    });

		    $(this).autocomplete({
		        source: function (request, response) {
		            $.ajax(
						{
						    contentType: "application/json"
							, url: dataSource
								, data: {
								    m: "GetCityByZip"
								, maxRows: 10
								, q: request.term
								}
							, success: function (data, textStatus, XMLHttpRequest) {
							    response($.map(data, function (item) {
							        return {
							            label: item.ZipCode + " (" + item.City + ")",
							            value: item.ZipCode,
							            zipCode: item.ZipCode,
							            city: item.City
							        }
							    }))
							}
							, complete: function (XMLHttpRequest, textStatus) {
							    // alert(textStatus);
							}
							, error: function (XMLHttpRequest, textStatus, errorThrown) {
							    // alert(errorThrown);
							}
						})
		        },
		        minLength: 2,
		        select: function (event, ui) {
		            if (this != undefined) {
		                if (ui.item != undefined) {
		                    $(this).parent().children('input[name$=City]').val(ui.item.city);
		                    $(this).val(ui.item.zipCode);
		                }
		            }
		        },
		        open: function () {
		            $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
		        },
		        close: function () {
		            $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
		        }
		    })
				.data("autocomplete")._renderItem = function (ul, item) {
				    $(item).removeClass("ui-corner-all").addClass("ui-corner-top");
				    return $("<li></li>")
						.data("item.autocomplete", item)
						.append("<a class='ui-menu-item-link'> <div class='ui-menu-item-title'>" + item.zipCode + "</div> <div class='ui-menu-item-subtitle'>" + item.city + "</div> </a>")
						.appendTo(ul);

				};
		});

	} //end outer-if

} // end function


/* VALIDATION: 
 * *********** */ 
function SetupDefaultValidation() {
	
    $.validator.setDefaults({ 
        debug: true 
        , submitHandler: DefaultValidatorSubmitHandler
		, success: DefaultOnValidatorSuccess
		, invalidHandler: DefaultOnValidatorInvalid
		, errorPlacement: DefaultOnValidatorErrorPlacement
		, ignore: ".ignore" 
		, highlight: function (input, errorCss) { 
            var input = $(input);
            switch (input.tagName()) {                
                case 'select':                    
                    if( input.css('display') == 'none')  {
                        var selectmenu = $("+ .ui-selectmenu", input);
                        selectmenu.addClass("error");
                    }
                    break;
                default:
                    input.addClass("ui-state-highlight error"); 
                    break;
            }
                
        }
		, unhighlight: function (input) { 
                var input = $(input);
            switch (input.tagName()) {                
                case 'select':                    
                    if( input.css('display') == 'none')  {
                        var selectmenu = $("+ .ui-selectmenu", input);
                        selectmenu.removeClass("error"); 
                    }
                    break;
                default:
                    input.removeClass("ui-state-highlight error"); 
                    break;
            }
        }
		, showErrors: function (errorMap, errorList) {
				
			for (var i = 0; errorList[i]; i++) {
				var element = this.errorList[i].element;
				// remove existing error label thus forcing the validator to recreate it
				// (that is: recreation == call to errorplacement function)
				this.errorsFor(element).remove();
			}
			this.defaultShowErrors();
		}
        , onfocusout: function(element) { this.element(element); }
        , onkeyup: function(element) { this.element(element); }
    
    });

	$.extend($.validator.messages, {
		required: PageStrings._Required,
		remote: PageStrings._PleaseFix,
		email: PageStrings._ValidEmail,
		url: PageStrings._ValidUrl,
		date: PageStrings._ValidDate,
		dateISO: PageStrings._ValidIsoDate,
		number: PageStrings._ValidNumber,
		digits: PageStrings._OnlyDigits,
		creditcard: PageStrings._ValidCardNumber,
		equalTo: PageStrings._EqualTo,
		accept: PageStrings._ValidExtension,
		maxlength: $.validator.format(PageStrings._MaxLength),
		minlength: $.validator.format(PageStrings._MinLength),
		rangelength: $.validator.format(PageStrings._RangeLength),
		range: $.validator.format(PageStrings._ValidatorBetween),
		max: $.validator.format(PageStrings._ValidatorLessOrEqual),
		min: $.validator.format(PageStrings._ValidatorGreaterOrEqual)
	});


	// Add custom validation aliases (methods) and messages:      
      $.validator.addMethod("requiredCompanyName", $.validator.methods.required, PageStrings._CompanyNameRequired);
      $.validator.addMethod("minlengthCompanyName", $.validator.methods.minlength, $.format(PageStrings._CompanyMinLength));
	  $.validator.addClassRules("vCompanyName", { requiredCompanyName: true, minlengthCompanyName: 2 });

	  $.validator.addMethod("requiredContactPerson", $.validator.methods.required, PageStrings._ContactRequired);
	  $.validator.addClassRules("vContactPerson", { requiredCompanyName: true, minlengthCompanyName: 2 });


	  $.validator.addMethod("requiredPhoneNumber", $.validator.methods.required, PageStrings._PhoneRequired);
	  $.validator.addMethod("minlengthPhoneNumber", $.validator.methods.minlength, $.format(PageStrings._PhoneMinLength));
	  $.validator.addMethod("digitsPhoneNumber", $.validator.methods.digits, $.format(PageStrings._PhoneDigits));
	  $.validator.addClassRules("vPhoneNumber", { minlengthPhoneNumber: 8, requiredPhoneNumber: true, digitsPhoneNumber: true });

	  $.validator.addMethod("requiredFirstName", $.validator.methods.required, PageStrings._FirstNameRequired);
	  $.validator.addMethod("minlengthFirstName", $.validator.methods.minlength, $.format(PageStrings._FirstNameMinLength));
	  $.validator.addClassRules("vFirstName", { requiredFirstName: true, minlengthFirstName: 2 });

	  $.validator.addMethod("requiredLastName", $.validator.methods.required, PageStrings._LastNameRequired);
	  $.validator.addMethod("minlengthLastName", $.validator.methods.minlength, $.format(PageStrings._LastNameMinLength));
	  $.validator.addClassRules("vLastName", { requiredLastName: true, minlengthLastName: 2 });

	  $.validator.addMethod("requiredUserName", $.validator.methods.required, PageStrings._UserNameRequired);
	  $.validator.addMethod("minlengthUserName", $.validator.methods.minlength, $.format(PageStrings._UserNameMinLength));
	  $.validator.addClassRules("vUsername", { requiredUserName: true, minlengthUserName: 2 });

	  $.validator.addMethod("requiredEmail", $.validator.methods.required, PageStrings._EmailRequired);        
	  $.validator.addClassRules("vEmail", {  requiredEmail: true, email: true});

	  $.validator.addMethod("requiredGender", $.validator.methods.required, PageStrings._GenderRequired);       
	  $.validator.addClassRules("vGender", { requiredGender: true });

	  $.validator.addMethod("requiredBirthDay", $.validator.methods.required, PageStrings._BirthdayRequired);
	  $.validator.addMethod("dateBirthDay", $.validator.methods.date, PageStrings._BirthdayValid);
	  $.validator.addClassRules("vBirthDay", { requiredBirthDay: true, dateBirthDay: true });

	  $.validator.addMethod("requiredDate", $.validator.methods.required, PageStrings._DateRequired);
	  $.validator.addMethod("dateDate", $.validator.methods.date, PageStrings._DateValid);
	  $.validator.addClassRules("vDate", { requiredDate: true, dateDate: true });

	  $.validator.addMethod("requiredAddressCo", $.validator.methods.required, PageStrings._COAddressRequired);
	  $.validator.addClassRules("vAddressCo", { requiredAddressCo: true} );

	  $.validator.addMethod("requiredAddressStreet", $.validator.methods.required, PageStrings._StreetNameRequired);
	  $.validator.addClassRules("vAddressStreet", { requiredAddressStreet: true });

	  $.validator.addMethod("requiredZipCode", $.validator.methods.required, PageStrings._ZipCodeRequired);
	  $.validator.addMethod("validZipCode", ValidateZipCode, PageStrings._ZipCodeValid);
	  $.validator.addClassRules("vZipCode", { requiredZipCode: true, digits: true, minlength: 4, maxlength: 4, validZipCode: true });

	  $.validator.addMethod("requiredForeignZipCode", $.validator.methods.required, PageStrings._ZipCodeRequired);
	  $.validator.addClassRules("vForeignZipCode", { requiredForeignZipCode: true });

	  $.validator.addMethod("requiredForeignCity", $.validator.methods.required, PageStrings._CityRequired);
	  $.validator.addClassRules("vCityForeign", { requiredForeignCity: true });

	  $.validator.addMethod("requiredPassword", $.validator.methods.required, PageStrings._PasswordRequired);      
	  $.validator.addClassRules("vPassword", { requiredPassword: true, minlength: 5 });

	  $.validator.addMethod("requiredConfirmPassword", $.validator.methods.required, PageStrings._ZipCodeRequired);      
	  $.validator.addClassRules("vConfirmPassword", { requiredConfirmPassword: true, equalTo: "#vPassword" });

	  $.validator.addMethod("requiredAcceptConditions", $.validator.methods.required, PageStrings._ConditionsAccept);
      $.validator.addClassRules("vAcceptConditions", { requiredAcceptConditions: true });

      $.validator.addMethod("requiredChooseMembership", $.validator.methods.required, PageStrings._SelectMembership);
      $.validator.addClassRules("vChooseMembership", { requiredChooseMembership: true });

      $.validator.addMethod("requiredChooseService", $.validator.methods.required, PageStrings._SelectOption);
      $.validator.addClassRules("vChooseService", { requiredChooseService: true });

      $.validator.addMethod("requiredChooseEventOption", $.validator.methods.required, PageStrings._SelectOptionPeriod);
      $.validator.addClassRules("vChooseEventOption", { requiredChooseEventOption: true });
        
//      // a custom method for validating the date range
//    $.validator.addMethod("dateRange", function() {
//        return new Date($("#fromDate").val()) < new Date($("#toDate").val());
//    }, "Please specify a correct date range, the first must be before the second.");

//    // a new class rule to group all three methods
//    $.validator.addClassRules({
//    requiredDateRange: {required:true, date:true, dateRange:true}
//    });


    // hook-up validation for all forms:
	//var val = $("form").validate({});
}

function DefaultOnValidatorErrorPlacement(error, element) {

    // nha/tsm, 21.02.2011
    if (!$(element).is(":visible")) {
        var statusfooter = $(".status-footer:visible");
        if (0 != statusfooter.length) {
            statusfooter.html('&nbsp;');
            statusfooter.append(error);
        }
    }

	var status = $(element).closest("div").parent().find(".status");

	if (0 == status.length) {
	    status = $(element).closest("table").find(".status");
	}

	if (status) {
	    status.html('&nbsp;');
	    status.append(error);
	}
}

function DefaultValidatorSubmitHandler(form) {
	// specifying a submitHandler prevents the default submit
	$.notify({ title: "Default Submit Handler", text: "(Submit to server)<br>TODO: Override this default SubmitHandler on the page triggering the validation.<p>Note that no data are posted to the server by the default submithandler as it <i>returns false</i>.</p>", clear: true });
    return false;     
}

function DefaultOnValidatorSuccess(label) {
    label.removeClass('error');  
	label.html('&nbsp;').addClass('valid');    
	//$.notify_clear();
}

function DefaultOnValidatorInvalid(form, validator) {

    var errors = validator.numberOfInvalids();
    var strMarkedFields = (errors == 1) ? PageStrings._TheMarkedField : $.format(PageStrings._TheNMarkedFields, errors);
    var msg = PageStrings._PleaseFillIn + strMarkedFields;

    $.notify({ type: 'error', title: PageStrings._ErrorInEnteredData, text: msg, autohide: false, clear: true });
    $.scrollTo($(".error:first").not("label"),2500, { offset: -40, easing: 'swing' });
    //$.scrollTo(100, 2000, { easing: 'easeInOutBack' });
}

function ValidateZipCode(zipCode) {
    var valid = false;

    city = GetCity(zipCode);

    if ('' != city) {
        valid = true;
    }

    return valid;
}

function GetCity(zipCode) {
    var dataSource = Strings.Urls._CompanyHandlerUrl;
    var city = '';

    $.ajax({
        contentType: "application/json"
        , async: false
		, url: dataSource
		, data: {
		    m: "GetCityByZip"
			, maxRows: 1
			, q: zipCode
		}
		, success: function (data, textStatus, XMLHttpRequest) {
		    if (1 === data.length) {
		        if (data[0].ZipCode === zipCode) {
		            city = data[0].City;
		        }
		    }
		}
		, complete: function (XMLHttpRequest, textStatus) {
		    // alert(textStatus);
		}
		, error: function (XMLHttpRequest, textStatus, errorThrown) {
		    // alert(errorThrown);
		}
    });

    return city;
}

