/* author: BvE
 * (c)2009 Intelsurance
 */

// globale variabelen
var tabList;


 
// service call calculatie
// param [data] JSON - data welke mee moet met het request
// return: niets, wordt gedelegeerd.
function doServiceCallBereken(data) {
	// zet de premieTargetID op ...
	if($chk($(tabList.options.premieTargetID))){
 		$(tabList.options.premieTargetID).innerHTML = "...";
	}
	
	
	// datum omschrijven naar .net begrijpbare taal
	var datum = data.geboortedatum_hoofdverzekerde.replace('\'','').replace('\'','').split('-');			
	data.geboortedatum_hoofdverzekerde = '\''+datum[2]+'-'+datum[1]+'-'+datum[0]+'\'';
	// doe een json request
	var jsonRequest = new Request.JSON({
		url: "/DIVWebService/proxy/yarvatarProxy.asmx/geefPrijs", 
		onSuccess: function(dataJSON,dataTXT){
			// onSuccess de reply afhandelen (data van .net webservice zit in het object .d)
	    	handleServiceReply(dataJSON.d);
		},
		// bij falen melding aan gebruiker
		onFailure: function(data){
	    	handleServiceReplyError();
		},
		// geef jusite content-type mee aan request
		headers: {"Content-type": "application/json"}
		// request parameters (get request zodat de reply in JSON is)
	}).get(data);
}

// service call calculatie
// return: niets, wordt gedelegeerd.
function doServiceCallAndRedirectForNewCustomer() {
	var totaal = tabList.berekenTotaal();
	var doCall = true;
	var maxTeVerzekerenBedrag = 15000;
	
	if(totaal > maxTeVerzekerenBedrag) {
		doCall = doCall && confirm('Het maximum te verzekeren bedrag is ' + maxTeVerzekerenBedrag + '\nWilt u doorgaan?');
	}
	
	if(doCall) {
		// geef de data uit de gedefinieerde functie
		dataVal = tabList.options.serviceDataFunction();
		
		// als de data ok is
		if(dataVal != false) {
			// zet max verzekerd bedrag
			if(dataVal.verzekerd_kapitaal_hoofdverzekerde > maxTeVerzekerenBedrag) { dataVal.verzekerd_kapitaal_hoofdverzekerde = maxTeVerzekerenBedrag; }
			// zet datum in correct formaat
			var datum = dataVal.geboortedatum_hoofdverzekerde.replace('\'','').replace('\'','').split('-');			
			dataVal.geboortedatum_hoofdverzekerde = '\''+datum[2]+'-'+datum[1]+'-'+datum[0]+'\'';
			
			
			
			// doe een json request
			var jsonRequest = new Request.JSON({
				url: "/DIVWebService/proxy/yarvatarProxy.asmx/geefContract", 
				onSuccess: function(dataJSON,dataTXT){
					// onSuccess de reply afhandelen (data van .net webservice zit in het object .d)
					// geef de DIVPublic link
			    	var DIVlink = getOptionAnswer('DIVPublicLink',dataJSON.d.contract.options);
			    	// als de DIVPublic link ok is, redirect daar naartoe
			    	if(DIVlink) {
			    		document.location=DIVlink;
		    		}
				},
				// bij falen melding aan gebruiker
				onFailure: function(data){
			    	alert('Sorry, kon aanvraag niet verwerken. Probeert u het later nog eens.\nOnze excuses voor het ongemak.');
				},
				// geef jusite content-type mee aan request
				headers: {"Content-type": "application/json"}
			// request parameters (get request zodat de reply in JSON is)
			}).get(dataVal);
		// geef melding aan gebruiker dat de dataVal niet geheel correct is.
		} else { alert('Vul alle benodigde informatie in a.u.b.'); } 
	}
}

// afhandelen reply service
function handleServiceReply(WSReply) {
	// als de status type 2 is, betekend dit een foutmelding
	if(WSReply.status.type == 2) {
		handleServiceReplyError();
	} else {
		// als de premieTargetId gevonden wordt
		if($chk($(tabList.options.premieTargetID))){
			// vraag premie resultaat op uit de reply
	 		var premieResult = getOptionAnswer('PremiumYear',WSReply.contract.options);
	 		
	 		// als dit gevonden is
	 		if(premieResult) {
		 		// reken om van jaar naar maand
		 		var premieMaand = parseFloat(premieResult.replace(',','.'))/12;
		 		// update de data op het scherm
	 			$(tabList.options.premieTargetID).innerHTML = ("" + (premieMaand).toFixed(2).replace('.',','));
 			} else {
	 			// premie niet kunnen vinden, update naar -,--
	 			$(tabList.options.premieTargetID).innerHTML = "-,--";
 			}
 		}
	}
}

// answer van een optie uit een lijst met opties halen
// param: [optionName] string - optie naam
// param: [options] array - array met options
// return: 	indien gevonden: 		string met answer
//			indien niet gevonden:	false
function getOptionAnswer(optionName, options) {
	// retval is default false
	var retval = false;
	
	// loop door de options
	for(var i=0; i < options.length; i++) {
		// als de gevraagde optie gevonden wordt
		if(options[i].name == optionName) {
			// zet de retval
			retval = options[i].answer;
			break; // gevonden, break de loop
		}
	};
	// return retval
	return retval;
}

// afhandelen reply service
function handleServiceReplyError() {
	// als premieTargetID bestaat
	if($chk($(tabList.options.premieTargetID))) {
		// zet data
		$(tabList.options.premieTargetID).innerHTML = '-,--';
	}
}


// zet errorState voor element
// param: [elem] string - elementID wat errorstate moet krijgen
// return: niets
function setError(elem) {
	// als elem bestaat
	if($chk(elem)) {
		// vraag parents aan
		var parent = elem.getParent();
		// mocht de input left bestaan, deze ook een error class toekennen (ivm GWTF input velden)
		if(parent.hasClass('inputleft')){
			parent.addClass('error'); // ken error class toe
		}
		elem.addClass('error');  // ken error class toe
	}
}
 
// verwijder error state van element
// param: [elem] string - elementID waarvan de errorstate verwijderd moet worden'
// return: niets
function removeError(elem) {
	// als elem bestaat
	if($chk(elem)) {
		// vraag parents op
		var parent = elem.getParent();
		// als parent inputLeft bestaat en deze de status error heeft
		if(parent.hasClass('inputleft') && parent.hasClass('error')){
			parent.removeClass('error');  // verwijder error class
		}
		if(elem.hasClass('error')) { // als elem de class error heeft
			elem.removeClass('error'); // verwijder error class
		}
	}
}

// check of value numeriek is (mag ook . getallen zijn)
// param [value] any - waarde om te checken
// return: boolean
function checkNumeric(value){
	// voer reguliere expressie uit
	var anum=/(^\d+$)|(^\d+\.\d+$)/
	if (anum.test(value)) {
		return true; // match
	} else {
		return false; // geen match
	}
}

// check datum [in dd-mm-YYYY]
// param: [date] any - input om te checken of dit een datum is 
// return boolean
function checkDate(date)
{
   // Regular expression used to check if date is in correct format
   var pattern = new RegExp("[0-3][0-9]-(0|1)[0-9]-(19|20)[0-9]{2}");
   if(date.match(pattern))
   {
      var date_array = date.split('-');
      var day = date_array[0];

      // Attention! Javascript consider months in the range 0 - 11
      var month = date_array[1] - 1;
      var year = date_array[2];

      // This instruction will create a date object
      source_date = new Date(year,month,day);
	
      if(year != source_date.getFullYear())
      {
         return false;
      }

      if(month != source_date.getMonth())
      {
         return false;
      }

      if(day != source_date.getDate())
      {
         return false;
      }
   }
   else
   {
      return false;
   }

   return true;
}

// controleer of een waarde tussen of op een min/max range zit
// param [itsValue] float - waarde om te checken )
// param [itsMin] float - minimum waarde waaraan itsValue moet voldoen
// param [itsMax] float - maximum waarden waaraan itsValue moet voldoen
// return: boolean
function checkRange(itsValue,itsMin,itsMax) {
	retval = false; // default retval false
	// als de input numeric is
	if(checkNumeric(itsValue) && checkNumeric(itsMin) && checkNumeric(itsMax)) {
		retval = itsValue >= itsMin && itsValue <=itsMax; // check of itsValue tussen min en max ligt
	} 	
	return retval;
}

// class data
var BcTabList = new Class({
	Implements: [Options,Events],
	options: {
		//tabList: [], // array met tabs
		totaalTargetID: $empty, // id waar het totaal te verzekeren bedrag terecht komt
		premieTargetID: $empty, // id waar de premie terecht komt
		serviceDataFunction: $empty // functie welke de JSON data voor de service call opleverd
	},
	initialize: function (options) {
		 this.setOptions(options);
	 },
	tabList: [], // array met tabs
	currentTab: 0, // huidige actieve tab
	totaalBedrag: 0,
	activateTabPos: function(tabPos) {
		if($chk(this.tabList[tabPos])) {
			this.activateTab(this.tabList[tabPos]);
		};
	},
	activateTab: function(setTab) {
		if($chk(setTab)) {
			activate_found = false;
			check_tab = setTab;
			tabPos = 0;
			this.tabList.each(function(tab) {
				if(activate_found) { 
					tab.deactivateAnchor();
				} else { 
					tabPos++;
					tab.activateAnchor();
				}
				if(tab == check_tab) {
					activate_found = true;
					tab.showTab();
				} else {
					tab.hideTab();
				}
				
			});
			this.currentTab = tabPos-1;
		}
		
	},
	nextTab: function() {
		this.activateTabPos(this.currentTab + 1);
	},
	previousTab: function() {
		this.activateTabPos(this.currentTab - 1);
	},
	addTab: function(anchorID,berekenSchermID,berekenFunctie,checkFunctie,totaalTargetID) {
		var tab = new BcTab({
			AnchorID: anchorID,
			BerekenSchermID: berekenSchermID,
			BerekenFunctie: berekenFunctie,
			CheckFunctie: checkFunctie,
			TotaalTargetID: totaalTargetID
		});
		var list = this;
		tab.addEvent('tabUpdated',function() {
			list.handleTabUpdate();
		})
		this.tabList[this.tabList.length] = tab;
		//this.handleTabUpdate();
	},
	handleTabUpdate: function() {
		var totaal = this.berekenTotaal();
		
		if(totaal != $empty && totaal >= 0) {
			this.totaalBedrag = totaal;
			this.updateHtmlTotaalTarget('' + totaal.toFixed(2).replace('.',','));
			this.updatePremie();
		} else {
			this.totaalBedrag = 0;
			this.updateHtmlTotaalTarget('-,--');
			this.clearPremie();
		}
	},
	updatePremie: function() {
		if($chk(this.options.serviceDataFunction)) {
			doServiceCallBereken(this.options.serviceDataFunction());
		}
	},
	clearPremie: function() {
		if($chk($(this.options.premieTargetID))) {
			$(this.options.premieTargetID).innerHTML = "-,--";
		}
	},
	updateHtmlTotaalTarget: function(strData) {
		if($chk($(this.options.totaalTargetID))) {
			$(this.options.totaalTargetID).innerHTML = strData;
		}
	},
	berekenTotaal: function() {
		var totaal = 0;
		var hasError = false;
		this.tabList.each(function(tab){
			var tabTotaal = tab.TabTotaal;
			
			if($chk(tabTotaal) && tab.berekeningOk) {
				totaal += tabTotaal;
			} else {
				//hasError = true;
			}
		});
		if(hasError) {
			return 0;
		} else {
			return totaal;
		}
	}
});



var BcTab = new Class({
	 Implements: [Options, Events],
	 options: {
		 AnchorID: $empty,
		 BerekenSchermID: $empty,
		 BerekenFunctie: $empty,
		 CheckFunctie: $empty,
		 TotaalTargetID: $empty
	 },
	 initialize: function (options) {
		 this.setOptions(options);
		 this.enableEventHandling();
		 this.handleChange();
	 },
	 TabTotaal:	0,
	 berekeningOk: false,
	 activateAnchor: function() {
		 if($chk($(this.options.AnchorID))) {
			 $(this.options.AnchorID).addClass('active');
		 }
	 },
	 deactivateAnchor: function() {
		 if($chk($(this.options.AnchorID))) {
			 $(this.options.AnchorID).removeClass('active');
		 }
	 },
	 enableEventHandling: function () {
		var tab = this;
		if($chk($(this.options.AnchorID))) {
			$(this.options.AnchorID).addEvent('click',tab.handleAnchorClick.bind(tab));
		}
		if($(this.options.BerekenSchermID)) {
			var elements = $(this.options.BerekenSchermID).getElements("*[class*=yar-input]");
			elements.each(function(elem) {
				elem.addEvents({
					'change': tab.handleChange.bind(tab)
				});
			});
		}
	 },
	 handleAnchorClick: function(e) {
		 e = new Event(e);
		 e.stop();
		 if($chk(tabList)) {
			curTab = tabList.tabList[tabList.currentTab];
			if(curTab.options.CheckFunctie == $empty || curTab.options.CheckFunctie()) { // check for tab == ok or checkfunctie = empty (nothing to check)
				tabList.activateTab(this);
				//this.showTab();
			} else {
				alert('Gelieve alle gemarkeerde velden (correct) in te vullen.');
			}
			
		 }
		 
	 },
	 
	 showTab: function() {
		 if($(this.options.BerekenSchermID)) {
			 $(this.options.BerekenSchermID).setStyles({'display':'block','visibility':'visible'});
			
		 }
	 },
	  hideTab: function() {
		 if($(this.options.BerekenSchermID)) {
			 $(this.options.BerekenSchermID).setStyles({'display':'none','visibility':'hidden'});
			
		 }
	 },
	handleChange: function() {
		
		if(this.checkInput()) {
			result = this.bereken();	
			if(result != $empty && result != 0) {
				this.fireEvent('tabUpdated');
				this.updateHtmlTotaalTarget('' + this.TabTotaal.toFixed(2).replace('.',','));
			} else {
				this.fireEvent('tabUpdated');
				this.updateHtmlTotaalTarget('0,00');
			}
		} else {
			this.TabTotaal = 0;
			this.fireEvent('tabUpdated');
			this.updateHtmlTotaalTarget('0,00');
		}
	},
	
	checkInput: function() {
		if(this.options.CheckFunctie != $empty) {
			return this.options.CheckFunctie();
		} else return true;
	},
	
	updateHtmlTotaalTarget: function(strData) {
		if($chk($(this.options.TotaalTargetID))) {
			$(this.options.TotaalTargetID).innerHTML = strData;
		}
	},
	 
	bereken: function(){					
		this.berekeningOk = false;
		var retval = $empty;
		if(this.options.BerekenFunctie != $empty) {
			var totaal = this.options.BerekenFunctie();
			if($chk(totaal)){
				this.TabTotaal = totaal;
				this.berekeningOk = true;
				retval = this.TabTotaal;
			} else {
				this.tabTotaal = 0;
				this.berekeningOk = false;
				retval = 0;
			}
		}
		return retval;
	}
});