function xssSecure(text) {
	var filterPattern = new Array('[', '<', '>', '{', '}', '\\', ']', '&');

	jQuery.each(filterPattern, function(key, pattern) {
		text = text.split(pattern).join(' ');
	});

	return text;
}

function insertIframe(id, beforeElement) {
	var $iframe = jQuery('<iframe></iframe>');

	$iframe.attr({
		id: id,
		src: "javascript:'<html></html>';",
		frameBorder: '0',
		scrolling: 'no'
	});

	$iframe.insertBefore(beforeElement);

	return $iframe;
}
function checkbox(id) {
	var checked = jQuery('input[name=check_'+id+']')[0].checked;
	var cvalue = jQuery(jQuery('input[name=value_'+id+']')[0]).val();
	jQuery('#'+id).val(cvalue);
	if(checked === false) {
		jQuery('#'+id).val('');
	}
}


function in_array(needle, haystack) {

	var found = false, key;

	for (key in haystack) {
		if(haystack[key].toLowerCase() === needle.toLowerCase()) {
			found = true;
			break;
		}
	}
	return found;
}
function highlightMatch(input, value) {
	var lengthOfValue = value.length;
	var lengthOfInput = input.length;

	var position = value.toLowerCase().indexOf(input.toLowerCase(), 0);
	var matchedValue = value.substring(0, position) + '<span class="highlight">' + value.substring(position, position + lengthOfInput) + '</span>' + value.substring(position + lengthOfInput);

	return matchedValue;
}


var currentSelectedValue = -1;
var countResultValues = 0;
function selectNext(keyCode, $list) {
	if (keyCode != 40) {
		return;
	}

	if (currentSelectedValue == (countResultValues - 1)) {
		currentSelectedValue = 0;
	} else {
		++currentSelectedValue;
	}

	var $elements = $list.children();
	$elements.className = 'unselected';
	$elements[currentSelectedValue].className = 'selected';

	return true;
}
function selectPrevious(keyCode, $list) {
	if (keyCode != 38) {
		return;
	}

	if (currentSelectedValue === 0 || currentSelectedValue === -1) {
		currentSelectedValue = (countResultValues - 1);
	} else {
		--currentSelectedValue;
	}

	var $elements = $list.children();
	$elements.className = 'unselected';
	$elements[currentSelectedValue].className = 'selected';

	return true;
}
function displayList($this, id, contentArray) {
	var suggestItems = '';

	var counter = 0;

	jQuery('#' + id).remove();


	if (jQuery(contentArray).length == 1) {
		return counter;
	}

	jQuery(contentArray).each(function() {

		var inputText = $this.val().toLowerCase();


		var suggestionText = this.toLowerCase();

		if (suggestionText.indexOf(inputText) >= 0) {
			if (counter <= 20) {
				++counter;
				suggestItems += '<li>' + highlightMatch(inputText, this) + '</li>';
			}
		}
	});

	$this.after('<ul id="' + id + '" class="list">' + suggestItems + '</ul>');

	var $list = jQuery('#' + id);


	if ($list.height() > 150) {
		$list.css({
			'height': 150 + 'px',
			'overflow': 'auto'
		});
	}


	jQuery('li', $list).bind('click.sugitem', function (event) {
		event.preventDefault();
		event.stopPropagation();
		$this.val(jQuery(this).text());
		$list.slideUp(function(){
			jQuery(this).remove();
		});
		currentSelectedValue = -1;
		countResultValues = 0;
	});

	return counter;
}
function keydownHandler(event) {
  	var keycode = null;

	// IE
	if (!event) {
		event = window.event;
	}

	if (event.keyCode) {
		keycode = event.keyCode;
	} else if (event.which) {
		keycode = event.which;
	}

	if (keycode == 13) {
		event.preventDefault();
		event.stopPropagation();
	}
}

function keyupHandler($this, event, id, contentArray) {
	var keycode = null;


	if (!event) {
		event = window.event;
	}

	if (event.keyCode) {
		keycode = event.keyCode;
	} else if (event.which) {
		keycode = event.which;
	}


	if (keycode == 13) {
		event.preventDefault();
		event.stopPropagation();


		var selectedValue = jQuery('.selected', jQuery('ul.list'));


		if (selectedValue.length) {
			$this.val(selectedValue.text());
			currentSelectedValue = -1;
			countResultValues = 0;
			jQuery('ul.list').remove();
			return;
		}
	}


	countResultValues = displayList($this, id, contentArray);

	if (countResultValues == 0) return;

	$list = jQuery('ul.list');


	if (selectNext(keycode, $list) || selectPrevious(keycode, $list)) {
		return;
	}
}

jQuery.extend(jQuery.validator.messages, {
	required: "Dieses Feld ist ein Pflichtfeld.",
	maxlength: jQuery.format("Geben Sie bitte maximal {0} Zeichen ein."),
	minlength: jQuery.format("Geben Sie bitte mindestens {0} Zeichen ein."),
	rangelength: jQuery.format("Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein."),
	email: "Geben Sie bitte eine gültige E-Mail-Adresse ein.",
	url: "Geben Sie bitte eine gültige URL ein.",
	numberDE: "Geben Sie bitte eine Nummer ein.",
	digits: "Geben Sie bitte nur Ziffern ein.",
	equalTo: "Bitte denselben Wert wiederholen.",
	range: jQuery.format("Geben Sie bitte einen Wert zwischen {0} und {1}."),
	max: jQuery.format("Geben Sie bitte einen Wert kleiner oder gleich {0} ein."),
	min: jQuery.format("Geben Sie bitte einen Wert größer oder gleich {0} ein."),
	creditcard: "Geben Sie bitte ein gültige Kreditkarten-Nummer ein."
});
jQuery.validator.setDefaults({
   onkeyup: false
});
jQuery.validator.addMethod("dfv_forms_captcha", function(value, element) {
//data: 'eID=tx_dfvforms_dyn\u0026cpt='+jQuery('.dfv_forms_captcha').val()+'',
	returner = false;
		jQuery.ajax({
			url: 'index.php',
			type: 'POST',
			data: 'eID=tx_dfvforms_dyn\u0026cpt='+element.value+'',
			dataType: 'json',
			async: false,
			success: function(data) {
				returner = data;
			},
			error: function(XMLhttp, state, errortype) {
				return false;
			}
	});
	return returner;
}, "Der eingetragene Code war leider falsch.");

jQuery.validator.addMethod("age", function(value, element) {
	var elementClassArray = [];
	elementClassArray = element.className.split(' ');
	var classDate = [];
	var rangeDate = null;
	var elementDate = [];
	var userDate = null;

	for (var i=0; i<elementClassArray.length; i++) {
		if (elementClassArray[i].indexOf("range-high-") < 0) {
			continue;
		}

		classDate = elementClassArray[i].split('-');
		rangeDate = new Date(classDate[2], classDate[3]-1, classDate[4]);

		elementDate = value.split('.');
		userDate = new Date(elementDate[2], elementDate[1]-1, elementDate[0]);

		if (userDate.getTime() > rangeDate.getTime()) {
			return false;
		}
	}
	return true;

}, "Sie müssen volljährig sein.");

jQuery.validator.addMethod("maxage", function(value, element) {
	var elementClassArray = [];
	elementClassArray = element.className.split(' ');
	var classDate = [];
	var rangeDate = null;
	var elementDate = [];
	var userDate = null;

	for (var i=0; i<elementClassArray.length; i++) {
		if (elementClassArray[i].indexOf("range-low-") < 0) {
			continue;
		}

		classDate = elementClassArray[i].split('-');
		rangeDate = new Date(classDate[2], classDate[3]-1, classDate[4]);

		elementDate = value.split('.');
		userDate = new Date(elementDate[2], elementDate[1]-1, elementDate[0]);

		if (userDate.getTime() < rangeDate.getTime()) {
			return false;
		}
	}
	return true;

}, "Geburtstdatum übersteigt Höchstalter.");

jQuery.validator.addMethod("minage", function(value, element) {
	var elementClassArray = [];
	elementClassArray = element.className.split(' ');
	var classDate = [];
	var rangeDate = null;
	var elementDate = [];
	var userDate = null;

	for (var i=0; i<elementClassArray.length; i++) {
		if (elementClassArray[i].indexOf("range-high-") < 0) {
			continue;
		}


		classDate = elementClassArray[i].split('-');
		rangeDate = new Date(classDate[2], classDate[3]-1, classDate[4]);


		elementDate = value.split('.');
		userDate = new Date(elementDate[2], elementDate[1]-1, elementDate[0]);

		if (userDate.getTime() > rangeDate.getTime()) {
			return false;
		}
	}
	return true;

}, "Geburtsdatum niedriger als Mindestalter.");

jQuery.validator.addMethod("bindedfields", function(value, element) {
	var elementClassArray = [];
	elementClassArray = element.className.split(' ');
	var productArray = [];
	var checkmainrisk = false;
	var notvalidvalue = null;

	for (var i=0; i<elementClassArray.length; i++) {

		if (elementClassArray[i].indexOf("productcheck-list") == 0) {
				productArray = elementClassArray[i].substring(18).split('-');
		}

		if (elementClassArray[i].indexOf("notvalid-value-") == 0) {
				notvalidvalue = elementClassArray[i].substring(15)
		}
	}

	for (var i=0; i<productArray.length; i++) {
		if (jQuery('#'+productArray[i]).val()!=notvalidvalue){
				checkmainrisk = true
		}

	}

	return checkmainrisk;

}, "Bitte eine Hauptleistung auswählen.");

jQuery.validator.addMethod("range", function(value, element) {
	var elementClassArray = [];
	elementClassArray = element.className.split(' ');
	var classDate = [];
	var rangeDate = null;
	var elementDate = [];
	var userDate = null;

	for (i=0; i<elementClassArray.length; i++) {
		if (elementClassArray[i].indexOf("range-high-") >= 0) {


			classDate = elementClassArray[i].split('-');
			rangeDate = new Date(classDate[2], classDate[3]-1, classDate[4]);


			elementDate = value.split('.');
			userDate = new Date(elementDate[2], elementDate[1]-1, elementDate[0]);

			if (userDate.getTime() > rangeDate.getTime()) {
				return false;
			}
		}
		if (elementClassArray[i].indexOf("range-low-") >= 0) {
			classDate = elementClassArray[i].split('-');


			classDate = elementClassArray[i].split('-');
			rangeDate = new Date(classDate[2], classDate[3]-1, classDate[4]);


			elementDate = value.split('.');
			userDate = new Date(elementDate[2], elementDate[1]-1, elementDate[0]);

			if (userDate.getTime() < rangeDate.getTime()) {
				return false;
			}
		}
	}
	return true;
}, "Bitte ein Datum aus dem vorgegebenen Bereich wählen.");

jQuery.validator.addMethod("alphanumeric", function(value, element) {
	return this.optional(element) || !/\W/i.test(value);
}, "Bitte verwenden Sie nur Buchstaben (a-z) oder Zahlen (0-9). Sonderzeichen sind nicht erlaubt.");

jQuery.validator.addMethod("alpha", function(value, element) {
	return this.optional(element) || /^[a-zA-ZÄÖÜöäüß¶\-]+$/i.test(value);
}, "Bitte verwenden Sie nur Buchstaben (a-z). Zahlen und Sonderzeichen sind nicht erlaubt.");

jQuery.validator.addMethod("first_day", function(value, element) {

	var elementClassArray = [];
	elementClassArray = element.className.split(' ');
	var classDate = [];
	var rangeDate = null;
	var elementDate = [];
	var userDate = null;
	for (i=0; i<elementClassArray.length; i++) {
		if (elementClassArray[i].indexOf("range-low-") >= 0) {
			classDate = elementClassArray[i].split('-');


			classDate = elementClassArray[i].split('-');
			rangeDate = new Date(classDate[2], classDate[3] - 1, classDate[4]);


			elementDate = value.split('.');
			userDate = new Date(elementDate[2], elementDate[1] - 1, elementDate[0]);

			if (userDate.getTime() < rangeDate.getTime()) {
				return false;
			}
		}
	}


	var regex = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/;
	var d = new Date();
	var tstamp_now = d.getTime();
	var v = new Date(value.replace(regex, '$2/$1/$3'));
	var tstamp_value = v.getTime();

	var day = value.split('.');

	return tstamp_now < tstamp_value && parseInt(day[0]) == 1;
}, "Versicherungsbeginn ist immer der erste Tag eines Monats in der Zukunft.");

jQuery.validator.addMethod("date-de", function(value, element) {
	var regex = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/;
	if (!regex.test(value)) {
		return false;
	}
	var d = new Date(value.replace(regex, '$2/$1/$3'));
	return (( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) && (parseInt(RegExp.$1, 10) == d.getDate()) && (parseInt(RegExp.$3, 10) == d.getFullYear() ));
}, "Bitte geben Sie ein gültiges Datum ein. (tt.mm.jjjj)");

jQuery.validator.addMethod("regex", function(value, element) {
	var regex = '';
	var classnames = jQuery(element).attr('class').split(' ');
	for (var i=0; i<classnames.length; i++) {
		if (classnames[i].indexOf('regex-') != -1) {
			regex = classnames[i].replace(/regex-/,'');
		}
	}
	return this.optional(element) || eval(regex).test(value);
}, "Ihre Eingabe ist fehlerhaft.");


var returner = false;
var cities = [];
var city_flag = [];

/**
 * Funktion zur Validierung der PLZ und Speichern der zugehoerigen Orte in einem Array
 *
 */
function validateZip (value, element) {
	city_flag[element.id] = true;
	jQuery.ajax({
		url: 'index.php',
		type: 'POST',
		data: 'eID=tx_dfvforms_plz&plz='+xssSecure(value),
		dataType: 'json',
		async: false,
		success: function(data) {
			returner = false;
			if (data.length > 0) {
				if (typeof cities[element.id] != 'undefined') {
					city_flag[element.id] = true;
				}
				cities[element.id] = data;
				returner = true;
			} else {
				cities[element.id] = '';
			}
		},
		error: function(XMLhttp, state, errortype) {
			console.log('Fehler: ' + state);

		}
	});
	return returner;
}

function calldynCon(value, elid) {
	returner = true;
		jQuery.ajax({
			url: 'index.php',
			type: 'POST',
			data: value,
			dataType: 'json',
			async: false,
			success: function(data) {
				var arr_elid = elid.split(';');
				for(i = 0; i < arr_elid.length; i++){
					var arr_item = arr_elid[i].split(':');
					if (arr_item.length==2){
						switch(arr_item[0]){
							case 'html':
								if (jQuery('.'+arr_item[1])){
									if(jQuery.browser.msie){
										jQuery('.'+arr_item[1]).html('&nbsp;'+data.r_html+'&nbsp;'); // IE Hack mit +&nbsp;
									}else{
										jQuery('.'+arr_item[1]).html(data.r_html);
									}
								};
							break;
							case 'select':
								if (data.r_select!=null){
								var optionsValues = '';
									jQuery.each(jQuery.parseJSON(data.r_select), function() {
										optionsValues += '<option value="' + this.optionValue + '" ';
										if (this.selected == '1'){
										optionsValues += ' selected ';
										}
										optionsValues += '>' + this.optionDisplay + '</option>';
									});
								jQuery('.'+arr_item[1]).children('select').html(optionsValues);
								}
							break;
							case 'visible':
								if (jQuery.browser.msie) {
									jQuery('.'+arr_item[1]).show();
								}else{
									jQuery('.'+arr_item[1]).show('fast');
								}
							break;
						}
					}else{
						if(jQuery.browser.msie){
							jQuery('.'+arr_item[0]).html('&nbsp;'+data.r_html+'&nbsp;'); // IE Hack mit +&nbsp;
						}else{
							jQuery('.'+arr_item[0]).html(data.r_html);
						}
					}
			}
			},
			error: function(XMLhttp, state, errortype) {
				console.log('Fehler: ' + state);
				//returner = true;
			}
		});
	return returner;
}




jQuery.validator.addMethod("zip", function(value, element) {
	if (isNaN(value) || value.length != 5) return false;
	if (value.length == 5) {
		validateZip(value, element);
		return true;
	}
	return true;
}, "Bitte eine gültige Postleitzahl eingeben.");

var suggestArray = [];

function validateNotallowed(value, id) {
	if (value.length <= 0) {
		return true;
	}


	eval('suggestArray["'+id+'"] = ' + jQuery('#suggest-'+id).val() + ';');
 	return in_array(value, suggestArray[id]);
}


function autosuggest() {
	jQuery('.dfv_forms_suggest').bind('focus.suggest', function() {

		eval('suggestArray["'+this.id+'"] = ' + jQuery('#suggest-'+this.id).val() + ';');
	});

		jQuery('.dfv_forms_suggest').bind('keydown.suggest', keydownHandler);


	jQuery('.dfv_forms_suggest').bind('keyup.suggest', function(event){
		var contentArray = suggestArray[jQuery(this).attr('id')];


		if (jQuery(this).val() == '') {
			jQuery('#suggestlist').remove();
			return;
		}

		keyupHandler(jQuery(this), event, 'suggestlist', contentArray);
	});


	jQuery('.dfv_forms_suggest').bind('blur', function(event) {
		$this = jQuery(this);
		// Validierung nachdem die Liste entfernt wurde
		setTimeout(function() {
			jQuery('#suggestlist').remove();
			currentSelectedValue = -1;
			countResultValues = 0;
			if ($this.is('.notallowed')) {
				var notallowed = validateNotallowed($this.val(), $this.attr('id'));
				jQuery('.notallowederror').remove();
				if (!notallowed) {
					var error = '<label class="notallowederror" for="' + $this.attr('id') + '" generated="true">Bitte eine Option wählen.</label>'
					$this.after(error);
				}
			}

		}, 500);
	});
}

function suggestCity(event) {

	var zipuid;

	jQuery('.city').bind('focus.city', function(event) {
		$this = jQuery(this);

		var prev_div = $this.parent().prev();
		zipuid = jQuery('input', prev_div).attr('id');

		if (city_flag[zipuid] !== true) {
			return;
		}


		if (!cities[zipuid] || cities[zipuid].length <= 0) {
			$this.val('');
			return;
		}
		city_flag[zipuid] = false;


		if (cities[zipuid].length == 1) {
			$this.val(cities[zipuid][0]);
			return;
		}

		$this.val('');

		if (cities[zipuid].length > 1) {
			displayList(jQuery(this), 'citylist', cities[zipuid]);
			return;
		}
	});


	jQuery('.city').bind('keydown.suggest', keydownHandler);

	jQuery('.city').bind('keyup.suggest', function(event){
		keyupHandler(jQuery(this), event, 'citylist', cities[zipuid]);
	});


	jQuery('.city').bind('blur.city', function() {
		setTimeout(function() {
			jQuery('#citylist').remove();
			currentSelectedValue = -1;
			countResultValues = 0;
		}, 500);
	});

}


function helplinkClickBind($this, event) {
	event.preventDefault();
	event.stopPropagation();

	jQuery('#iframe_tt').remove();

	var x = event.pageX;
	var y = event.pageY;
	var $tooltip = jQuery('#tt');

	$tooltip.css({
		left: (x - 365) + 'px',
		top: (y - 10) + 'px'
	});

  $tooltip.stop().fadeTo('fast', 1);

	jQuery('#span_tt').html(jQuery('img', $this).attr('alt'));
	jQuery('#h1_tt').text(jQuery('img', $this).attr('title'));

	if (jQuery.browser.msie && jQuery.browser.version < 7) {

		var $iframe = insertIframe('iframe_tt', $tooltip);
		var $tooltipContent = jQuery('#tooltip_content');
		var $offset = $tooltipContent.offset();

		$iframe.css({
			'left': (x - 365) + 'px',
			'top': (y - 10) + 'px',
			'height': $tooltipContent.height(),
			'width': $tooltipContent.width(),
			'opacity': 0
		});
	}
}



function showInfobox() {
	jQuery('.helplink').hover(function (event) {
		helplinkClickBind(jQuery(this), event);
	}, function () {
		jQuery('#tt').stop().fadeTo('fast', 0).css({top: (-3000) + 'px'});
		jQuery('#iframe_tt').stop().fadeTo('fast', 0).css({top: (-3000) + 'px'});
		jQuery('#iframe_tt').remove();
	});
}


function exitClickBind($this, event) {
	event.preventDefault();
	event.stopPropagation();

	jQuery.blockUI({ message: jQuery('#exit') });

	// Buttons (zurueck, verlassen) mit onclicks belegen
	jQuery('#back_link').bind('click', function () {
		 jQuery.unblockUI();
	});

	jQuery('#exit_link').bind('click', function () {

	   var to_link = $this.attr('href');

	   if (to_link.search(/http/) < 0) {
         window.location = jQuery('base').attr('href') + to_link;
		} else {
         window.location = to_link;
		}

	});
}

function preventExit() {
	jQuery.blockUI.defaults = {
		css: {
			padding:        0,
			margin:         0,
			width:          '40%',
			top:            '20%',
			left:           '30%',
			textAlign:      'left',
			color:          '#000',
			border:         '3px solid #aaa',
			backgroundColor:'#fff',
			cursor:         'default'
		},
		overlayCSS:  {
			backgroundColor:'#000',
			opacity:        '0.6'
		}
	};

	jQuery('a').not(jQuery('#dfv_forms_div a')).not(jQuery('a.popup_link')).not(jQuery('a[onclick]')).not(jQuery('a.popup')).click(function(event) {
		exitClickBind(jQuery(this), event);
	});
}

function deleteLE() {
	jQuery('.trash-link').click(function(event) {
		$this = jQuery(this);
		event.preventDefault();
		event.stopPropagation();
		jQuery.ajax({
			url: $this.attr('href'),
			type: 'GET'
		});
		$this.parent().fadeOut(function() {
			$this.parent().remove();
		});
	});
}

function enableDatesInDatepicker() {
	function enableDays() {
		jQuery('.dfvforms_datum').each(function(){
			if(jQuery(this).hasClass('first_day')) {
				var datepickerID = jQuery(this).attr('id');
				var dp = datePickerController.getDatePicker(datepickerID);
				dp.setEnabledDates(["******01"]);
			}
		});
	}
	if(typeof(datePickerController) !== 'undefined'){
		datePickerController.addEvent(window, "load", enableDays);
	}

}

jQuery(function ($) {
	jQuery('.tx_dfvforms_pi1_fieldwrap_html_text > input.dfv_forms_text').after(function() {
		if (this.alt&&this.alt.length>0) return "<span class='dfv_forms_text_after'>"+this.alt+"</span>";
	});

	enableDatesInDatepicker();

	if (jQuery.browser.msie) {
		jQuery('.date-picker-control').css('display', 'none');

		jQuery('.date_wrap').addClass('datewrap');
		jQuery('.date_wrap').removeClass('date_wrap');
		jQuery('.datewrap input').css('width', '180px');
		jQuery('.datewrap').css('width', '185px');
		jQuery('.datewrap').css('float', 'left');


		jQuery('.tx-dfv_forms-pi1_formwrap_1688 .date_wrap').addClass('datewrap');
		jQuery('.tx-dfv_forms-pi1_formwrap_1688 .date_wrap').removeClass('date_wrap');
		jQuery('.tx-dfv_forms-pi1_formwrap_1688 .datewrap input').css('width', '190px');
		jQuery('.tx-dfv_forms-pi1_formwrap_1688 .datewrap').css('width', '195px');
		jQuery('.tx-dfv_forms-pi1_formwrap_1688 .datewrap').css('padding-left', '2px');
		jQuery('.tx-dfv_forms-pi1_formwrap_1688 .datewrap').css('float', 'left');

	}

	jQuery.each(jQuery('.tx_dfvforms_pi1_form'), function() {
		jQuery(this).validate();
	});

	autosuggest();

	jQuery('.tx_dfvforms_pi1_form').bind("submit.stop", function(event) {
		if ( jQuery('label.notallowederror', '.tx_dfvforms_pi1_form').length > 0 || jQuery('input[type="submit"]', '.tx_dfvforms_pi1_form').length <= 0 ) {
			event.preventDefault();
			event.stopPropagation();
		}
	});

	suggestCity();

	showInfobox();

	if (jQuery('#exit').length) {
		preventExit();
	}

	jQuery('.popup_link').bind("click.open", function(event) {
		event.preventDefault();
		event.stopPropagation();
		var my_window = window.open(jQuery(this).attr('href'), "Zweitfenster", "width=440,height=372,scrollbars=yes");
		my_window.focus();
	});

	if (jQuery('.sent').length) {
		var alerttext = jQuery('strong','.sent').text();
		alert(alerttext);
	}
});
