karw.formChange = new Class({
	
	Implements: [Events,Options],
	
	hashCode: null,
	putObject: null,
	formId: 'changeform',
	prevformElement: null,
	formElement: null,
	UID: null,
	response: null,
	customerPropsID:null,
	responseEmail: null,
	loader: null,
	customerPropsBouwmarktID : null,
		
	initialize: function(hash, prevFormElement){	
		this.prevformElement = prevFormElement;
		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+ '/IGKarweiServices/resources/client/customer/'+this.hashCode+'?random='+Math.random(),
			method: 'get',
			onSuccess: this.fillCustomerData.bind(this),
			onFailure: this.failMessage.bind(this)
		}).send();	
	},

	updateProfileStoreFormUpdated : function(store) {
		if (store != null && store.code != null && store.name != null ){				
			var storeName = store.name.trim();				
			
			if (store.status == "OPENS_SHORTLY"){
				storeName += ' (Binnenkort geopend)';
			} else if (store.status == "CLOSED_TEMPORARILY"){
				storeName += ' (Tijdelijk gesloten)';
			} else if (store.status == "CLOSED"){
				storeName += ' (Locatie gesloten)';
			} 
			
	    	$('locationformstorename').set('text', storeName);
			$('locationformstorecode').set('value',store.code);
		} else {							
			$('locationformstorename').set('text','Locatie gesloten');
		}
	},
	
	updateProfileStoreFormFail : function(store) {
		$('locationformstorename').set('text','Onbekend');		
	},
	
	extractStoreCodeFromCustormerProps : function(customerProps) {

		// no props
		if (customerProps == null){
			return null;
		}
				
		// props is single item
		if (customerProps.property=='bouwmarkt1'){
			this.customerPropsBouwmarktID = customerProps.id; 		
			return customerProps.value;	
		}
				
		// props is array
		var result = null;
		try {
			customerProps.each(function(entry){
				if (entry.property == 'bouwmarkt1'){				
					this.customerPropsBouwmarktID = entry.id; 		
					result = entry.value;
					return;
				}
			});
		} catch(e){			
		}

		// none found
		return result;		
	}, 
	
	fillCustomerData : function(response) {
				
		psl.addEvent('profileStoreUpdated', this.updateProfileStoreFormUpdated );
		psl.addEvent('profileStoreFailed',  this.updateProfileStoreFormFail );
				
		var storeCode = this.extractStoreCodeFromCustormerProps(response.customerProps);
		if (storeCode == null || storeCode == "Karwei") {
			this.updateProfileStoreFormFail();
		} else {
			psl.fireProfileStore(storeCode);	
		}

		this.UID = response.id;
		this.response = response;
		
		if(!response.customerCards){
			this.formElement.getElements('.mandatory.card').each(function(elm){
				elm.setStyle('display','none');
			});
		}
		if($type(response.initials) != "object"){
			this.setValueToFieldwithWarning(this.formElement.getElement('input.initials'), response.initials, this.getValuePrevForm('input#initials'));
		}
		if($type(response.prefix) != "object"){
			this.setValueToFieldwithWarning(this.formElement.getElement('input.prefix'), response.prefix, this.getValuePrevForm('input#prefix'));
		}
		if($type(response.surname) != "object"){
			this.setValueToFieldwithWarning(this.formElement.getElement('input.surname'), response.surname, this.getValuePrevForm('input#surname'));
		}

		if($type(response.address.city) != "object"){
			if($chk(response.address.city)){
				this.setValueToFieldwithWarning(this.formElement.getElement('input.city'), response.address.city, null);
			}
		}
		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;								
				lightboxMap['preferredStoreLocation'].content.getElementById('pslpostcode').set('value', response.address.zipcode);
				lightboxMap['preferredStoreLocation'].content.getElementById('pslpostcodeheader').set('text', 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){
			console
			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);
		}
		
		this.setValueToFieldwithWarning(this.formElement.getElement('input.email'), response.email, this.getValuePrevForm('input#email'));
		this.responseEmail=response.email;
			
		var sexInvoer = null;
		if($chk(this.prevformElement) && $chk(this.prevformElement.getElements('input[class=sex]'))){
			this.prevformElement.getElements('input[class=sex]').each(function(item,index){
				if(item.checked === true){
					sexInvoer = item.value;
				}
			});
		}
		this.formElement.getElements('input[class=sex]').each(function(item,index){

			if(item.value == this.response.sex){
				item.checked = true;
				if($chk(sexInvoer) && item.value != sexInvoer){
					setWarning(this.formElement.getElement('input[class=sex]'));
				}
			}
		}.bind(this));
		
		if($type(response.customerProps) == "object"){
			if(response.customerProps.property == 'ziezo_subscribed' && response.customerProps.value=='1'){
				$('ziezo_inner').inject('ziezo');
				$('ziezo_inner').setStyle('display', 'block');
				this.customerPropsID=response.customerProps.id;
			}
		}
		else if(response.customerProps!=null){
			response.customerProps.each(function(item,index){
				if(item.property == 'ziezo_subscribed' && item.value=='1'){
					$('ziezo_inner').inject('ziezo');
					$('ziezo_inner').setStyle('display', 'block');
					this.customerPropsID=item.id;
				}
			}.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();
		trackNewsLetterChanged();
	},
	
	setValueToFieldwithWarning: function(field, responseValue, inputValue){
		if($type(responseValue) != "object"){
			field.value = responseValue;
		}
		if($chk(inputValue) && responseValue != inputValue){
			setWarning(field);
		}
	},

	getValuePrevForm: function(fieldName){
		if($chk(this.prevformElement) && $chk(this.prevformElement.getElement(fieldName))){
			return this.prevformElement.getElement(fieldName).value;
		}
		return "";
	},
	
	getOptOuts: function(){
		var request = new Request.JSON({
			url: karw.context+ '/IGKarweiServices/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;
			var emailmandatory = false;
			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 span = new Element('span');
					span.innerHTML = option.mailingType.type; 
					
//					var label = new Element('div');
//					checkBox.injectInside(label);
//					span.injectInside(label);

					var label = new Element('label');
					checkBox.injectInside(label);
					span.injectInside(label);
					label.addClass('clickable');
//					label.injectInside(row);
					
					label.injectInside($('opt_options2'));
					if(option.optedOut == 'false' || option.optedOut === false){
						checkBox.checked = 'true';
						emailmandatory = true;
					}
					checkBox.addEvent('click', function(checkbox){
						if(checkbox.checked){
							this.formElement.getElement('.mandatory.email').setStyle("display", "inline");
						}
						else {
							this.formElement.getElement('.mandatory.email').setStyle("display", "none");
						}
					}.bind(this, checkBox));
				}
			}
			this.formElement.setStyle('display','block');
			$$('a.more_info div.tooltip').each(function(el){
				el.setStyle('top', '-' + (el.getHeight()+12) + 'px');
				el.setStyle('display','none');
			});
			
			this.enableSubmit();
			this.emailblur(emailmandatory);
		}else{
			this.failMessage();
		}
	},
	enableSubmit: function(){
		this.submitButton = this.formElement.getElement('.btn-verzenden');
		this.submitButton.addEvent('click',this.submitAction.bind(this));
		
		this.emailField = this.formElement.getElement('input.email');
		this.emailField.addEvent('keyup', this.emailblur.bind(this));
	},
	emailblur: function(showAlert) {
		if(showAlert){
			this.formElement.getElement('.mandatory.email').setStyle("display", "inline");
		}
		else {
			this.formElement.getElement('.mandatory.email').setStyle("display", "none");
		}
		if(this.emailField && this.emailField.value) {
			this.formElement.getElement('.emaillistwarning').setStyle("display", "none");
			this.formElement.getElement('.emaillist').getElements('input').each(function(item){
				item.disabled = "";
			});
		}
		else {
			this.formElement.getElement('.emaillist').getElements('input').each(function(item){
				item.disabled = "disabled";
			});
			this.formElement.getElement('.emaillistwarning').setStyle("display", "block");
//			if(showAlert != false){
//				alert("Als je je emailadres verwijdert, stopt de verzending van de door jou aangevraagde KARWEI-mailings.");
//			}
		}
	},
	submitAction: function(){
		this.loader.setMessage("Uw gegevens worden opgeslagen");
		this.loader.show();
		
		var storecode = this.formElement.getElement('input#locationformstorecode').value;//$('locationformstorecode').get('text');  
		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 numbersuffix = 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":numbersuffix,"street":street,"zipcode":zipcode}
		if(this.customerPropsID!=null && this.formElement.getElement('input[name=optIn]').checked==false){
			var customerProps = [{"id":this.customerPropsID,"property":"ziezo_subscribed","value":"0"}];
			var hashObject = {"address":cityObject,"birthdate":birthdate,"customerProps":customerProps,"email":email,"id":this.UID,"initials": initial, "optIn":true,"phone":phone,"prefix":prefix,"sex":sex,"surname":surname}
		}
		else {
			var hashObject = {"address":cityObject,"birthdate":birthdate,"email":email,"id":this.UID,"initials": initial, "optIn":true,"phone":phone,"prefix":prefix,"sex":sex,"surname":surname}
		}
		
		if (storecode && storecode!='') {
			if (!hashObject.customerProps){
				hashObject.customerProps = [];
			}
			
			if (this.customerPropsBouwmarktID != null){
				hashObject.customerProps.push({'id': this.customerPropsBouwmarktID , 'property': 'bouwmarkt1', 'value': storecode});				
			} else {
				hashObject.customerProps.push({ 'property': 'bouwmarkt1', 'value': storecode});
			}

		}
		
		var request = new Request({
			method:'put',
			data: JSON.encode(hashObject),
			emulation: false,
			urlEncoded: false,
			url: karw.context+ '/IGKarweiServices/resources/client/customer/'+this.hashCode+'?source=KHweb-' + gTemplateName + '&random='+Math.random(),
			onSuccess: this.submitActionOpts.bind(this),
			onFailure: this.failMessageCustomer.bind(this)
		});	
		request.setHeader("Content-Type","application/json; charset=utf-8");
		request.send();
	},
	
	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({
				method: 'put',
				url: karw.context+ '/IGKarweiServices/resources/client/optOuts/'+this.hashCode+'?source=KHweb-' + gTemplateName + '&random='+Math.random(),
				emulation:false,
				urlEncoded: false,
				data: jsonString,
				onSuccess: this.doSubmitAction.bind(this),
				onFailure: this.failMessage.bind(this)
			});
			request.setHeader("Content-Type","application/json; charset=utf-8");
			request.send();
		} 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');
		if(this.formElement.getElement('input.email').value=="" || this.formElement.getElement('input.email').value==this.responseEmail){//email adres is niet aangepast.
			trackNewsLetterChangedVerify();
		}
	},
	failMessageCustomer: function(xhr){
		s.sendFormEvent('e', s.pageName, this.formId, xhr.responseText);
		
		this.loader.hide();
		resetErrors(this.formElement);

		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 mainElement = setFault(field);

					var errorArea = mainElement.getElement('.sub-area');
					if(errorArea){
						if(error[1] == 'zipcode'){
							forms_showZipcodeError(errorArea, this.formElement, '2');
						}
						else if(error[1] == 'email'){
							showErrorMessage(errorArea, '.email_valid');
						}
						else if(error[1] == 'number'){
							showErrorMessage(errorArea, '.error_nonumber');
						}
					}
				}
				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" || error[0] == 'ALREADY_REGISTERED' ){
					var field = this.formElement.getElement('input.email');
					if(field === null){
						var field = this.formElement.getElement('input#email');
					}
					var mainElement = setFault(field);
					
					var errorArea = mainElement.getElement('.sub-area');
					showErrorMessage(errorArea, '.error_email_exists');
				}
				if(error[0] == 'NEW_CARD'){
					this.formElement.setStyle('display','none');
					var newcard = new karw.formNewcard();				
				}
				if(error[0] == 'PARAMETER_OUTSIDE_RANGE'){
					var field = this.formElement.getElement('input.number');
					if(field === null){
						var field = this.formElement.getElement('input#number');
					}
					var mainElement = setFault(field);
					
					var errorArea = mainElement.getElement('.sub-area');
					if(errorArea){
						showErrorMessage(errorArea, '.error_number_tolarge');
					}
				}
			}
		} else {
			karw.setShowGenericFormError(true);
		};
	},
	
	failMessage: function(x){
		
		this.loader.hide();
		$('failure').setStyle('display','block');
	}
});
