karw.formChange = new Class({
	
	Implements: [Events,Options],
	
	hashCode: null,
	putObject: null,
	formId: 'changeform',
	formElement: null,
	UID: null,
	
	loader: null,
	
	initialize: function(hash){
		this.hashCode = hash;
		this.formElement = $(this.formId);
		this.loader = new karw.Loader();
		if(!hash){
			this.failMessage();
		}else{		
			this.retreiveCustomer();
		}
		
	},
	
	retreiveCustomer: function(){
		karw.setShowGenericFormError(false);
		this.loader.setMessage("Uw gegevens worden opgehaald");
		this.loader.show();
		var request = new Request.JSON({
			url: karw.context+ '/IGGammaServices/resources/client/customer/'+this.hashCode+'?random='+Math.random(),
			method: 'get',
			onSuccess: this.fillCustomerData.bind(this),
			onFailure: this.failMessage.bind(this)
		}).send();	
	},
	
	fillCustomerData: function(response){
		this.UID = response.id;
		if($type(response.initials) != "object"){
			this.formElement.getElement('input.initials').value = response.initials;
		}
		if($type(response.prefix) != "object"){
			this.formElement.getElement('input.prefix').value = response.prefix;
		}
		if($type(response.surname) != "object"){
			this.formElement.getElement('input.surname').value = response.surname;
		}

		if($type(response.address.city) != "object"){
			if($chk(response.address.city)){
				this.formElement.getElement('input.city').value = response.address.city;
			}
		}
		if($type(response.address.street) != "object"){
			if($chk(response.address.street)){
				this.formElement.getElement('input.street').value = response.address.street;
			}
		}
		if($type(response.address.zipcode) != "object"){
			if($chk(response.address.zipcode)){
				this.formElement.getElement('input.zipcode').value = response.address.zipcode;
			}
		}
		if($type(response.address.numberSuffix) != "object"){
			if($chk(response.address.numberSuffix)){
				this.formElement.getElement('input.numbersuffix').value = response.address.numberSuffix;
			}
		}
		
		this.formElement.getElements('option[class=country]').each(function(item,index){
			if(item.value == response.address.country){
				item.selected = true;
			}
		}.bind(this));
		
		
		
		if($type(response.address.number) != "object"){
			if($chk(response.address.number)){
				this.formElement.getElement('input.number').value = response.address.number;
			}
		}
		
		if($type(response.phone) != "object"){
			this.formElement.getElement('input.phone').value = response.phone;
		}
		
		if($type(response.birthdate) != "object"){
			var birthdateArr = response.birthdate.split('-');
			var convDate = birthdateArr[2]+'-'+birthdateArr[1]+'-'+birthdateArr[0];
			//var convDate = birthdateArr[1]+'/'+birthdateArr[0]+'/'+birthdateArr[2];
			this.formElement.getElement('input.birthdate').value = convDate;
			this.formElement.getElement('input.birthdate').setAttribute('value',convDate);
		}
		
		
		if($type(response.email) != "object"){
			this.formElement.getElement('input.email').value = response.email;
		}
		
		this.formElement.getElements('input[class=sex]').each(function(item,index){

			if(item.value == response.sex){
				item.checked = true;
			}
		}.bind(this));
		
		$$('input.DatePicker').DatePicker({
			dayChars:'3',
			dayNames:['Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag'],
			format:'dd-mm-yyyy',
			monthNames:['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'],
			yearOrder: 'desc',
			yearRange:90
		});	
		
		
		this.getOptOuts();
	},
	
	getOptOuts: function(){
		var request = new Request.JSON({
			url: karw.context+ '/IGGammaServices/resources/client/optOuts/'+this.hashCode+'?random='+Math.random(),
			method: 'get',
			onSuccess: this.fillOptoutData.bind(this),
			onFailure: this.failMessage.bind(this)
		}).send();	
		
	},
	
	fillOptoutData: function(response){
		this.loader.hide();
		this.putObject = response;
		if($chk(response.collection)){
			var optoutArray = response.collection.customerOptOut;
			for(i=0;i<optoutArray.length;i++){
				var option = optoutArray[i];
				if($chk(option)){
					var checkBox = new Element('input');
					checkBox.id = "checkbox"+option.mailingType.id;
					checkBox.type='checkbox';
					checkBox.value = option.mailingType.type; 
					
					var label = new Element('span');
					label.innerHTML = option.mailingType.type; 
					
					var row = new Element('div');
					checkBox.injectInside(row);
					label.injectInside(row);
					
					row.injectInside($('opt_options2'));
					if(option.optedOut == 'false' || option.optedOut === false){
						checkBox.checked = 'true';
					}
				}
			}
			this.formElement.setStyle('display','block');
			
			this.enableSubmit();
		}else{
			this.failMessage();
		}
	},
	enableSubmit: function(){
		this.submitButton = this.formElement.getElement('.btn-verzenden');
		this.submitButton.addEvent('click',this.submitAction.bind(this));
	},
	submitAction: function(){
		this.loader.setMessage("Uw gegevens worden opgeslagen");
		this.loader.show();
		var initial = this.formElement.getElement('input.initials').value;
		var prefix = this.formElement.getElement('input.prefix').value;
		var surname = this.formElement.getElement('input.surname').value;
		var city = this.formElement.getElement('input.city').value;
		var street = this.formElement.getElement('input.street').value;
		var phone = this.formElement.getElement('input.phone').value;
		//var country = this.formElement.getElement('input.country').value;
		var country = null;
		this.formElement.getElements('option[class=country]').each(function(item,index){
			if(item.selected === true){
				country = item.value;
			}
		}.bind(this));
		var number = this.formElement.getElement('input.number').value;
		var birthdateArr = this.formElement.getElement('input.birthdate').value.split('-');
		var convDate = birthdateArr[2]+'-'+birthdateArr[1]+'-'+birthdateArr[0];
		//var convDate = birthdateArr[1]+'/'+birthdateArr[0]+'/'+birthdateArr[2];
		
		var birthdate = convDate;
		var zipcode = this.formElement.getElement('input.zipcode').value;
		var numbers = this.formElement.getElement('input.numbersuffix').value;
		var email = this.formElement.getElement('input.email').value;
		var sex = null;
		this.formElement.getElements('input[class=sex]').each(function(item,index){
			if(item.checked === true){
				sex = item.value;
			}
		}.bind(this));
		
		
		var cityObject = {"city":city,"country":country,"id":this.UID,"number":number,numberSuffix:"","street":street,"zipcode":zipcode}
		var hashObject = {"address":cityObject,"birthdate":birthdate,"email":email,"id":this.UID,"initials": initial, "optIn":true,"phone":phone,"prefix":prefix,"sex":sex,"surname":surname}

		var request = new Request({
			url: karw.context+ '/IGGammaServices/resources/client/customer/'+this.hashCode+'?random='+Math.random(),
			emulation:false,
			data: JSON.encode(hashObject),
			onSuccess: this.submitActionOpts.bind(this),
			onFailure: this.failMessageCustomer.bind(this)
		});
		request.setHeader("Content-Type","application/json; charset=utf-8");
		request.put();
		
	},
	
	submitActionOpts: function(){
		// don't handle opOuts for customers without e-mail address
		if (this.formElement.getElement('input.email').value > "") {
			var putObject = this.putObject;
			var oldOpts = putObject.collection.customerOptOut;
			for(i=0;i<oldOpts.length;i++){
				if($chk(oldOpts[i])){
					var checkbox = $('checkbox'+oldOpts[i].mailingType.id);
					if(checkbox.checked === true){
						oldOpts[i].optedOut = false;
					}else{
						oldOpts[i].optedOut = true;
					}
				}
			}
			putObject.collection.customerOptOut = oldOpts;
			var jsonString = JSON.encode(this.putObject).replace(',null]',']');
			
			var request = new Request({
				url: karw.context+ '/IGGammaServices/resources/client/optOuts/'+this.hashCode+'?random='+Math.random(),
				emulation:false,
				data: jsonString,
				onSuccess: this.doSubmitAction.bind(this),
				onFailure: this.failMessage.bind(this)
			});
			request.setHeader("Content-Type","application/json; charset=utf-8");
			request.put();
		} else {
			this.doSubmitAction();
		}
	},
	
	doSubmitAction: function(response){
		
		this.loader.hide();
		var checkboxes = this.formElement.getElements('input[type=checkbox]');
		var messageBox = $('success').getElement('p');
		for(i=0;i<checkboxes.length;i++){
			if(checkboxes[i].checked === false){
				var divEl = new Element('div');
				divEl.appendText("- "+checkboxes[i].value);
				divEl.injectInside(messageBox);
			}
		}
		this.formElement.setStyle('display','none');
		$('success').setStyle('display','block');
		
	},
	failMessageCustomer: function(xhr){
		
		this.loader.hide();
		var errorArea = $('error_email_exists');
		if(errorArea){
			errorArea.addClass('hidden');						
		}
		if((xhr.status == "422") || (xhr.status == "409")){
			

			
			var responseTextArray = xhr.responseText.split(", ");
			
			for(i=0;i<responseTextArray.length;i++){
				var error = responseTextArray[i].split(" ");
				if(error[0] == "PARAMETER_MISSING" || error[0] == "PARAMETER_INVALID"){
					var field = this.formElement.getElement('input.'+error[1]);
					if(field === null){
						var field = this.formElement.getElement('input#'+error[1]);
					}
					var mainRow = false;
					while(mainRow === false){
						
						var field = field.getParent();
						if(field.hasClass('form-row')){
							var mainElement = field;
							mainRow = true;
						}
					}					
					
					mainElement.addClass('fault');
					var errorArea = mainElement.getElement('.sub-area');
					if(errorArea){
						if(error[1] == 'zipcode'){
							forms_showZipcodeError(errorArea, this.formElement, '2');
						}
						errorArea.setStyles({'opacity':'1','border-color':'#ff0000'});						
					}
					
				}
				if(error[0] == "NO_OPTIN" ){
					var field = this.formElement.getElement('span#optin_text');
					field.setStyle('color','#ff0000');
					var errorArea = this.formElement.getElement('.error_optin');
					errorArea.setStyles({'opacity':'1','border-color':'#ff0000'});
				}
				if(error[0] == "EMAIL_EXISTS" ){
					var field = this.formElement.getElement('input.email');
					if(field === null){
						var field = this.formElement.getElement('input#email');
					}
					var mainRow = false;
					while(mainRow === false){
						var field = field.getParent();
						if(field.hasClass('form-row')){
							var mainElement = field;
							mainRow = true;
						}
					}					
					mainElement.addClass('fault');
					var errorArea = $('error_email_exists');
					if(errorArea){
						errorArea.removeClass('hidden');						
					}
					
				}
				if(error[0] == 'NEW_CARD'){
					this.formElement.setStyle('display','none');
					var newcard = new karw.formNewcard();				
				}
			}
		} else {
			karw.setShowGenericFormError(true);
		};
	},
	
	failMessage: function(x){
		
		this.loader.hide();
		$('failure').setStyle('display','block');
	}
});