/* Countrywise list of address validations (zip code, state, city) */

var addressValidation = new Array();
	
	addressValidation["HU"] = {
		postalCodeFormat: "^\\d{4}$",
		hasZipCodeDatabase: true
	};
	
	addressValidation["DE"] = {
		postalCodeFormat: "^([0124678][0-9]{4})$",
		hasZipCodeDatabase: false
	};
	
	addressValidation["EN"] = {
		postalCodeFormat: false,
		hasZipCodeDatabase: true
	};

/* Countrywise list of vat number formats */

/*  Masking help:
	a = character(A-Z)
	9 = number (0-9)
	* = alphanumeric character (A-Z,0-9)
*/
var vatNumberFormat = new Array();
	
	vatNumberFormat["HU"] = "99999999-9-99";
	vatNumberFormat["EU"] = "aa?*************";

/* Validation options for registration form */

var regformValidateOptions = {
	errorElement: 'span',
	errorPlacement: function(error, element) { if(element.attr("name") == "regtype") { error.appendTo("#regtype_error").show(); } else { error.insertAfter(element); } },
	rules: {
		reg_password: {
			minlength: 6
		},
		reg_password_confirm: {
			equalTo: '#reg_password'
		},
		reg_person_zip_code: {
			required: true,
			validateZip: true,
			remoteZipCheck : true
		},
		reg_company_zip_code: {
			required: true,
			validateZip: true,
			remoteZipCheck : true
		},
		reg_delivery_zip_code: {
			required: true,
			validateZip: true,
			remoteZipCheck : true
		}
	},
	messages: {
		reg_person_zip_code: localizedStrings["incorrect_zipcode"],
		reg_company_zip_code: localizedStrings["incorrect_zipcode"],
		reg_delivery_zip_code: localizedStrings["incorrect_zipcode"]
	},
	submitHandler: function(form) {
		var regType = $('input[name="regtype"]:checked').val();
		if(regType != undefined) {
			if(regType == "P") {
				$("#reg-company").remove();
			} else {
				$("#reg-person").remove();
			}
			var data = {};
			$('#regform :input').each(function(T, Z){
				if (Z.name == 'regtype') {
					if (Z.checked === true) data[Z.name] = $(Z).val();
				} else if (Z.name == 'reg_newsletter') {
					if (Z.checked === true) data[Z.name] = $(Z).val();
				} else if (Z.name == 'reg_person_sex') {
					if (Z.checked === true) data[Z.name] = $(Z).val();
    			} else {
					data[Z.name] = $(Z).val();
				}
			});
			$('#fdata').val(JSON.stringify(data));
			form.submit();
		}
	},
	focusInvalid: false,
	onkeyup: false
}

/* Validation options for message form */

var messageFormValidateOptions = {
	errorElement: 'span',
	errorPlacement: function(error, element) { if(element.attr("name") == "message_content") { error.appendTo("#message-error").show(); } else { error.insertAfter(element); } },
	messages: {
		message_content: localizedStrings["message_content_missing"]
	}
}

// Change personal data
var personDataFormValidateOptions = {
	errorElement: 'span',
	rules: {
		reg_person_zip_code: {
			required: true,
			validateZip: true,
			remoteZipCheck : true
		}
	},
	messages: {
		reg_person_zip_code: localizedStrings["incorrect_zipcode"]
	},
	focusInvalid: false,
	onkeyup: false
}

// Change company data
var companyDataFormValidateOptions = {
	errorElement: 'span',
	rules: {
		reg_company_zip_code: {
			required: true,
			validateZip: true,
			remoteZipCheck : true
		}
	},
	messages: {
		reg_company_zip_code: localizedStrings["incorrect_zipcode"]
	},
	focusInvalid: false,
	onkeyup: false
}

// Change delivery data
var deliveryDataFormValidateOptions = {
	errorElement: 'span',
	rules: {
		reg_delivery_zip_code: {
			required: true,
			validateZip: true,
			remoteZipCheck : true
		}
	},
	messages: {
		reg_delivery_zip_code: localizedStrings["incorrect_zipcode"]
	},
	focusInvalid: false,
	onkeyup: false
}

// Change password
var changePasswordFormValidateOptions = {
	errorElement: 'span',
	rules: {
		profile_new_password: {
			minlength: 6
		},
		profile_new_password_confirm: {
			equalTo: '#profile_new_password'
		}
	},
	focusInvalid: false,
	onkeyup: false
}

// Delete account
var deleteAccountFormValidateOptions = {
	errorElement: 'span',
	rules: {
		account_password_confirm: {
			minlength: 6
		}
	},
	submitHandler: function(form) {
		var confirmDeleteAccount = confirm(localizedStrings["account_delete_confirm"]);
		
		if(confirmDeleteAccount)
			form.submit();
		else
			return false;
	},
	focusInvalid: false,
	onkeyup: false
}

/* Additional functions */

function getCityByZipCode(countryCode, zipCode, stateFieldElem, cityFieldElem) {
	$.ajax({
		url: 'ajax/getCityByZipCode.ajax.php',
		data: { country: countryCode, zip: zipCode},
		type: 'get',
		dataType: "xml",
		cache: false,
		success: function(xml) {
				var responseResult = $(xml).find("result").text();
				if(responseResult == "SUCCESS") {
					cityFieldElem.val($(xml).find("city").text());
					stateFieldElem.val($(xml).find("state").text());
				} else {
					
				}
			},
		error: function (xhr, ajaxOptions, thrownError) {
			// Error handling
		}
	});
}

// Extending the validator for zip code check
jQuery.validator.addMethod("validateZip", function(value, element, params) {
    
	var fieldSet = $("#"+element.id).closest("fieldset");
	var countryField = fieldSet.find(".country-field");
	
	var countryCode = countryField.val();
	
	if(countryCode != "" && addressValidation[countryCode] != undefined) {
		
		var formatTest = true;
			
		if(addressValidation[countryCode].postalCodeFormat != false) {
			var regTest = new RegExp(addressValidation[countryCode].postalCodeFormat);
			if (!regTest.test(value))
				formatTest = false;
		}
		
		if(formatTest)
			return true;
		else
			return false;
	}
	
	return true;
	
}, localizedStrings["invalid_zip_format"]);

$.validator.addMethod("remoteZipCheck", function(value, element, params) {
	
	var fieldSet = $("#"+element.id).closest("fieldset");
	var countryField = fieldSet.find(".country-field");
	var zipCodeField = fieldSet.find(".zipcode-field");
	var stateField = fieldSet.find(".state-field");
	var cityField = fieldSet.find(".city-field");
	
	var countryCode = countryField.val();
	var zipCode = zipCodeField.val();
	
	if(countryCode != "" && addressValidation[countryCode] != undefined && addressValidation[countryCode].hasZipCodeDatabase != false) {
		return $.validator.methods.remote.call(this, value, element, {
			url: "ajax/checkZipCode.ajax.php",
			type: "get",
			data: { country: countryCode},
			complete: function(data) {
				if(data.responseText === "true") {
					if(countryCode != "" && addressValidation[countryCode] != undefined && addressValidation[countryCode].hasZipCodeDatabase == true)
						getCityByZipCode(countryCode, zipCode, stateField, cityField);
				} else {
					cityField.val(localizedStrings["please_give_zipcode"]);
					stateField.val(localizedStrings["please_give_zipcode"]);
				}
			}
		});
	} else {
		return true;
	}
}, localizedStrings["zipcode_not_exists"]);