/*global jQuery document alert Option*/
/**
* jQuery Cookie plugin -> renamed to smilecookie to avoid conflicts
*
* Copyright (c) 2010 Klaus Hartl (stilbuero.de)
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*/
jQuery.smilecookie = function (key, value, options) {

    // key and at least value given, set cookie...
    if (arguments.length > 1 && String(value) !== "[object Object]") {
        options = jQuery.extend({}, options);

        if (value === null || value === undefined) {
            options.expires = -1;
        }

        if (typeof options.expires === 'number') {
            var days = options.expires, t = options.expires = new Date();
            t.setDate(t.getDate() + days);
        }

        value = String(value);

        return (document.cookie = [
            encodeURIComponent(key), '=',
            options.raw ? value : encodeURIComponent(value),
            options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
            options.path ? '; path=' + options.path : '',
            options.domain ? '; domain=' + options.domain : '',
            options.secure ? '; secure' : ''
        ].join(''));
    }

    // key and possibly options given, get cookie...
    options = value || {};
    var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
    return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
};

var smilewidget = function($){
	if (smilewidget){
		alert('smilewidget.js has already been loaded!');
		return smilewidget;
	}
	var settings = undefined,
	that = {},
	actionQueue = [],
	scripts = document.getElementsByTagName("script"), 
	src = scripts[scripts.length-1].src, 
	urlPartNames = {SCHEMA:2, DOMAIN:3, PORT:5, PATH:6, FILE:8, QUERYSTRING:9, HASH:12},
	urlRegex = /^((http[s]?|file):\/)?\/?([^:\/\s]+)(:([^\/]*)?)?((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?$/.exec(src),
	originUrl = '',
	originDomain = '',
	originParentDomain = undefined,
	testEnvironment = false;
	originDomain = (urlRegex[urlPartNames.DOMAIN] || '');
	if (originDomain.indexOf(".") !== originDomain.lastIndexOf(".")){
		// strip first level
		originParentDomain = originDomain.substring(originDomain.indexOf('.'));
	} else {
		originParentDomain = originDomain;
	}
	originUrl = (urlRegex[urlPartNames.SCHEMA]+'://' || '') + originDomain;
	if (urlRegex[urlPartNames.PORT]){
		originUrl = originUrl + ':' + urlRegex[urlPartNames.PORT];
	}
	testEnvironment = originUrl.indexOf("test")!==-1;
	settings = {
			'logging' : testEnvironment,
			'testEnvironment': testEnvironment,
			'cookieDomain' : originParentDomain,
			'pageTrackingEnabled' : true,
			'server' : originUrl,
			'lang' : 'de',
			'aktionscode_code' : 'W',
			'aktionscode_version' : '1A',
			'partnerCode' : undefined,
			'afterDataUpdate' : undefined,
			'googleAnalyticsAccount' : originDomain ===	'app.smile-direct.ch' ? 'UA-3626362-1':
									   originDomain === 'apptest.smile-direct.ch' ? 'UA-3626362-4':
									   originDomain === 'app.smile-direct-test.ch' ? 'UA-25788858-1':
									   undefined,
			'carWidget' : {
				'type' : 'car', 	
				'actionPath' : '/car',
				'vehicleType' : 'pkw',
				'enabled' : false,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined,
				'versicherungsBeginn' : undefined,
				'volltextSucheField' : undefined,
				'brandSelect' : undefined,
				'typeSelect'  : undefined,
				'inverkehrssetzungsJahr' : undefined,
				'templateCode' : undefined
			},
			'mraWidget' : {
				'type' : 'mra', 	
				'actionPath' : '/mra',
				'vehicleType' : 'mra',
				'enabled' : false,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined,
				'versicherungsBeginn' : undefined,
				'fahrzeugArtSelect' : undefined,
				'templateCode' : undefined
			},
			'homeWidget' : {
				'type' : 'home', 	
				'actionPath' : '/home',
				'enabled' : false,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined,
				'versicherungsBeginn' : undefined,
				'hausratCheckbox' : undefined,
				'privathaftpflichtCheckbox' : undefined,
				'produktSelect' : undefined
			},
			'travelWidget' : {
				'type' : 'travel', 	
				'actionPath' : '/travel',
				'enabled' : false,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined,
				'versicherungsBeginn' : undefined,
				'personenkreisSelect' : undefined,
				'produktSelect' : undefined
			},
			'legalWidget' : {
				'type' : 'legal', 	
				'actionPath' : '/legal',
				'enabled' : false,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined,
				'versicherungsBeginn' : undefined,
				'personenkreisSelect' : undefined,
				'privatrechtsschutzCheckbox' : undefined,
				'produktSelect' : undefined
			},
			'vermittlerWidget' : {
				'type' : 'vermittler', 	
				'actionPath' : '/agent',
				'enabled' : false,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined
			},
			'carConfirmationWidget' : {
				'type' : 'carConfirmation', 	
				'actionPath' : '/confirmation/car_start.do',
				'enabled' : false,
				'templateCode' : undefined,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined
			},
			'homeConfirmationWidget' : {
				'type' : 'homeConfirmation', 	
				'actionPath' : '/confirmation/home_start.do',
				'enabled' : false,
				'templateCode' : undefined,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined
			},
			'carSchadenWidget' : {
				'type' : 'carSchaden', 	
				'actionPath' : '/schaden/car',
				'enabled' : false,
				'templateCode' : undefined,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined
			},
			'hauSchadenWidget' : {
				'type' : 'hauSchaden', 	
				'actionPath' : '/schaden/hau',
				'enabled' : false,
				'templateCode' : undefined,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined
			},
			'phpSchadenWidget' : {
				'type' : 'phpSchaden', 	
				'actionPath' : '/schaden/php',
				'enabled' : false,
				'templateCode' : undefined,
				'afterActionUrlUpdated': undefined,
				'afterWidgetInitialized': undefined
			}
	};
	loadAktionsCodeFromCookie();
	log('loading');
	
	function loadAktionsCodeFromCookie(){
		if ($.smilecookie('aktionscode') && $.smilecookie('aktionscode').length > 2){
			settings.aktionscode_code = $.smilecookie('aktionscode').substring(0, 1);
			settings.aktionscode_version = $.smilecookie('aktionscode').substring(1, 3);
			return true;
		} else {
			// no cookie
			return false;
		}
	}
	
	function storeAktionsCodeInCookie(){
		log('storing aktionscode '+settings.aktionscode_code+settings.aktionscode_version+" in cookie");
		$.smilecookie('aktionscode',settings.aktionscode_code+settings.aktionscode_version,{ path: '/'});// ,{ path: '/', domain: settings.cookieDomain }
	}
	
	// empties a select-element and returns its options-array
	function emptySelectBox(selectBox) {
		if (!selectBox){
			return;
		}
		var options = selectBox.attr('options'),
			option0 = undefined;
		if (options){
			option0 = options[0];
			$('option', selectBox).remove();
			// keep entry 0 ('bitte wählen')
			selectBox.append(option0);
		}
		return options;
	}       

	function disable() {
		for (var i=0; i< arguments.length; i+=1){
			$(arguments[i]).attr('disabled', 'disabled');
		}
	}

	function enable() {
		for (var i=0; i< arguments.length; i+=1){
			$(arguments[i]).removeAttr('disabled');
		}
	}
	
	function log(text){
		if (settings.logging && window.console !== undefined && window.console.log !== undefined) {
			console.log('smilewidget: '+text);
		}
	}
	
	function updateActionUrl(widgetSettings){
		var params = '&code='+settings.aktionscode_code+'&version='+settings.aktionscode_version;
		if (settings.partnerCode){
			params = params + '&partner='+settings.partnerCode;
		}
		switch(widgetSettings.type) {
		case 'car':
			if (widgetSettings.versicherungsBeginn && widgetSettings.versicherungsBeginn.val()){
				params = params + '&vbeginn=';
				params = params + widgetSettings.versicherungsBeginn.val().replace(/' '/g,'').replace(/\./g,'');
			}
			if (widgetSettings.volltextSucheField && widgetSettings.volltextSucheField.val()){
				params=params+'&volltextSuche=';
				if (that.carWidget.volltextSucheFieldDefaultText != widgetSettings.volltextSucheField.val()){
					params = params + encodeURIComponent(widgetSettings.volltextSucheField.val());
				}
			}
			if (widgetSettings.brandSelect && widgetSettings.brandSelect.val()){
				params=params+'&brandId=';
				params = params + widgetSettings.brandSelect.val();
			}
			if (widgetSettings.typeSelect && widgetSettings.typeSelect.val()){
				params=params+'&typeId=';
				params = params + widgetSettings.typeSelect.val();
			}
			if (widgetSettings.inverkehrssetzungsJahr && widgetSettings.inverkehrssetzungsJahr.val()){
				params=params+'&inv=';
				params = params + widgetSettings.inverkehrssetzungsJahr.val();
			}
			that.carWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang+params;
			that.carWidget.personalizedActionUrl = that.carWidget.actionUrl;
			if (widgetSettings.templateCode){
				that.carWidget.personalizedActionUrl =  that.carWidget.personalizedActionUrl+'&templateCode='+widgetSettings.templateCode;
			} 
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.carWidget.actionUrl,that.carWidget.personalizedActionUrl);
			}
			break;
		case 'mra':
			if (widgetSettings.versicherungsBeginn && widgetSettings.versicherungsBeginn.val()){
				params = params + '&vbeginn=';
				params = params + widgetSettings.versicherungsBeginn.val().replace(/' '/g,'').replace(/\./g,'');
			}
			if (widgetSettings.fahrzeugArtSelect && widgetSettings.fahrzeugArtSelect.val()){
				params = params+'&fahrzeugart=';
				params = params + widgetSettings.fahrzeugArtSelect.val();
			}
			
			that.mraWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang+params;
			that.mraWidget.personalizedActionUrl = that.mraWidget.actionUrl;
			if (widgetSettings.templateCode){
				that.mraWidget.personalizedActionUrl =  that.mraWidget.personalizedActionUrl+'&templateCode='+widgetSettings.templateCode;
			} 
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.mraWidget.actionUrl,that.mraWidget.personalizedActionUrl);
			}
			break;
		case 'home':
			if (widgetSettings.versicherungsBeginn && widgetSettings.versicherungsBeginn.val()){
				params = params + '&vbeginn=';
				params = params + widgetSettings.versicherungsBeginn.val().replace(/' '/g,'').replace(/\./g,'');
			}
			
			if (widgetSettings.produktSelect){
				// use selectbox
				params = params+'&hau=';
				params = params + (widgetSettings.produktSelect.val() == "1" || widgetSettings.produktSelect.val() == "3");
				params = params+'&php=';
				params = params + (widgetSettings.produktSelect.val() == "2" || widgetSettings.produktSelect.val() == "3");
			} else {
				// use checkboxes
				if (widgetSettings.hausratCheckbox){
					params = params+'&hau=';
					params = params + widgetSettings.hausratCheckbox.is(':checked');
				} 
				
				if (widgetSettings.privathaftpflichtCheckbox){
					params = params+'&php=';
					params = params + widgetSettings.privathaftpflichtCheckbox.is(':checked');
				}
			}
			
			that.homeWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang+params;
			that.homeWidget.personalizedActionUrl = that.homeWidget.actionUrl;
			if (widgetSettings.templateCode){
				that.homeWidget.personalizedActionUrl =  that.homeWidget.personalizedActionUrl+'&templateCode='+widgetSettings.templateCode;
			} 
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.homeWidget.actionUrl,that.homeWidget.personalizedActionUrl);
			}
			break;
		case 'travel':
			if (widgetSettings.versicherungsBeginn && widgetSettings.versicherungsBeginn.val()){
				params = params + '&vbeginn=';
				params = params + widgetSettings.versicherungsBeginn.val().replace(/' '/g,'').replace(/\./g,'');
			}
			if (widgetSettings.personenkreisSelect && widgetSettings.personenkreisSelect.val()){
				params = params+'&personenkreis=';
				params = params + widgetSettings.personenkreisSelect.val();
			}
			if (widgetSettings.produktSelect && widgetSettings.produktSelect.val()){
				params = params+'&produkt=';
				params = params + widgetSettings.produktSelect.val();
			}
			that.travelWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang+params;
			that.travelWidget.personalizedActionUrl = that.travelWidget.actionUrl;
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.travelWidget.actionUrl,that.travelWidget.personalizedActionUrl);
			}
			break;
		case 'legal':
			if (widgetSettings.versicherungsBeginn && widgetSettings.versicherungsBeginn.val()){
				params = params + '&vbeginn=';
				params = params + widgetSettings.versicherungsBeginn.val().replace(/' '/g,'').replace(/\./g,'');
			}
			if (widgetSettings.personenkreisSelect && widgetSettings.personenkreisSelect.val()){
				params = params+'&personenkreis=';
				params = params + widgetSettings.personenkreisSelect.val();
			}
			if (widgetSettings.produktSelect){
				// use selectbox
				params = params+'&pr=';
				params = params + (widgetSettings.produktSelect.val() == "2");
			} else {
				// use checkboxes
				if (widgetSettings.privatrechtsschutzCheckbox){
					params = params+'&pr=';
					params = params + widgetSettings.privatrechtsschutzCheckbox.is(':checked');
				} 
			}
			that.legalWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang+params;
			that.legalWidget.personalizedActionUrl = that.legalWidget.actionUrl;
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.legalWidget.actionUrl,that.legalWidget.personalizedActionUrl);
			}
			break;
		case 'vermittler':
			that.vermittlerWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang;
			that.vermittlerWidget.personalizedActionUrl = that.vermittlerWidget.actionUrl;
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.vermittlerWidget.actionUrl,that.vermittlerWidget.personalizedActionUrl);
			}
			break;
		case 'carConfirmation':
			that.carConfirmationWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang;
			that.carConfirmationWidget.personalizedActionUrl = that.carConfirmationWidget.actionUrl;
			if (widgetSettings.templateCode){
				that.carConfirmationWidget.personalizedActionUrl =  that.carConfirmationWidget.personalizedActionUrl+'&code='+widgetSettings.templateCode;
			} 
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.carConfirmationWidget.actionUrl,that.carConfirmationWidget.personalizedActionUrl);
			}
			break;
		case 'homeConfirmation':
			that.homeConfirmationWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang;
			that.homeConfirmationWidget.personalizedActionUrl = that.homeConfirmationWidget.actionUrl;
			if (widgetSettings.templateCode){
				that.homeConfirmationWidget.personalizedActionUrl =  that.homeConfirmationWidget.personalizedActionUrl+'&code='+widgetSettings.templateCode;
			} 
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.homeConfirmationWidget.actionUrl,that.homeConfirmationWidget.personalizedActionUrl);
			}
			break;
		case 'carSchaden':
			that.carSchadenWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang;
			that.carSchadenWidget.personalizedActionUrl = that.carSchadenWidget.actionUrl;
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.carSchadenWidget.actionUrl,that.carSchadenWidget.personalizedActionUrl);
			}
			break;
		case 'hauSchaden':
			that.hauSchadenWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang;
			that.hauSchadenWidget.personalizedActionUrl = that.hauSchadenWidget.actionUrl;
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.hauSchadenWidget.actionUrl,that.hauSchadenWidget.personalizedActionUrl);
			}
			break;
		case 'phpSchaden':
			that.phpSchadenWidget.actionUrl = settings.server+widgetSettings.actionPath+'?lang='+settings.lang;
			that.phpSchadenWidget.personalizedActionUrl = that.phpSchadenWidget.actionUrl;
			if (widgetSettings.afterActionUrlUpdated){
				widgetSettings.afterActionUrlUpdated(that.phpSchadenWidget.actionUrl,that.phpSchadenWidget.personalizedActionUrl);
			}
			break;
		default:
			alert('unsupported widget type:'+widgetSettings.type);
		}
	}
	
	function volltextChanged(widgetSettings){
		 var options = emptySelectBox(widgetSettings.inverkehrssetzungsJahr),
		 	query = widgetSettings.volltextSucheField.val();
		    updateActionUrl(widgetSettings);
		    if (!options){
				// no such field
				return;
			}
		    if (query) {
		    	$.getJSON(settings.server+'/widget/getErsteInverkehrssetzungsJahreVolltextsuche?callback=?', {volltextSuche: query, vtype: widgetSettings.vehicleType} , function(json) { 
				    $.each(json.ersteinverkehrssetzungen, function(index, year) {
				    	options[options.length] = new Option(year, year);
				    });
				    enable(widgetSettings.inverkehrssetzungsJahr);
				    settings.afterDataUpdate(widgetSettings.inverkehrssetzungsJahr);
		    	});
		    }
	}
	
	function brandChanged(widgetSettings) {
		disable(widgetSettings.typeSelect, widgetSettings.inverkehrssetzungsJahr);
		var brandId = widgetSettings.brandSelect.val(),
			typeOptions = emptySelectBox(widgetSettings.typeSelect);
		emptySelectBox(widgetSettings.inverkehrssetzungsJahr);
		updateActionUrl(widgetSettings);
		if (!typeOptions){
			// no such field
			return;
		}
		if (brandId !== -1) {
	    	$.getJSON(settings.server+'/widget/getCarTypesByBrand?callback=?', {brandId: brandId, vtype: widgetSettings.vehicleType}, function(json) { 
	    		$.each(json.types, function(index, array) {
	    			typeOptions[typeOptions.length] = new Option(array[1], array[0]);
			    });
			    enable(widgetSettings.typeSelect);
			    settings.afterDataUpdate(widgetSettings.typeSelect);
	    	});
		}
	}

	function typeChanged(widgetSettings) {
	    var options = emptySelectBox(widgetSettings.inverkehrssetzungsJahr),
	    	typeId = widgetSettings.typeSelect.val();
	    updateActionUrl(widgetSettings);
	    if (!options){
			// no such field
			return;
		}
	    if (typeId !== -1) {
	    	$.getJSON(settings.server+'/widget/getErsteInverkehrssetzungsJahre?callback=?', {typeId: typeId, vtype: widgetSettings.vehicleType} , function(json) { 
			    $.each(json.ersteinverkehrssetzungen, function(index, year) {
			    	options[options.length] = new Option(year, year);
			    });
			    enable(widgetSettings.inverkehrssetzungsJahr);
			    settings.afterDataUpdate(widgetSettings.inverkehrssetzungsJahr);
	    	});
	    }
	}
	
	function executeActionQueue(who){
		log(actionQueue.length+' queued actions executed by '+who);
		if (actionQueue.length > 0){
			var i;
			for(i = 0; i< actionQueue.length; i+= 1){
				 actionQueue[i]();
			}
			actionQueue = [];
		 } 
	}
	
	
	that.init = function (options) {
		if (settings.initialized){
			alert('smilewidget has already been initialized!');
			return;
		}
		settings.initialized = true;
		if (options){ 
			$.extend(true,settings,options);
			// re-override aktionscode from cookie
			if (loadAktionsCodeFromCookie()){
				if (options.aktionscode_code+options.aktionscode_version !== settings.aktionscode_code+settings.aktionscode_version){
					log('aktionscode from options '+options.aktionscode_code+options.aktionscode_version+' overridden by values from cookie: '+settings.aktionscode_code+settings.aktionscode_version);
				}
			} else {
				// store cookie
				storeAktionsCodeInCookie();
			}
		}
		
		if (settings.carWidget.enabled){
			that.carWidget = {};
			if (settings.carWidget.volltextSucheField){
				that.carWidget.volltextSucheFieldDefaultText = settings.carWidget.volltextSucheField.val();
				settings.carWidget.volltextSucheField.keyup(function() {
					updateActionUrl(settings.carWidget);
				});
				settings.carWidget.volltextSucheField.autocomplete({
					delay: 500,
					minLength: 1,
					source: function(request, response) {
						var term = request.term;
						$.getJSON(settings.server+"/widget/getCarTypes?lang="+settings.lang+"&callback=?",
								  {
								    vtype: settings.carWidget.vehicleType,
								    caller: 'widget',
								    query: term
								  },
								  function(json) {
									if(json.error){
										$("ul.ui-autocomplete").addClass("ui-autocomplete-error");
										response(json.error);
										$("ul.ui-autocomplete li").addClass("ui-autocomplete-error");
										$("ul.ui-autocomplete li a").addClass("ui-autocomplete-error");
										$("ul.ui-autocomplete li a").click(function(){return false;});
									}else{
										$("ul.ui-autocomplete").removeClass("ui-autocomplete-error");
										response(json.result);
									}
							
						});
					},
					select: function(event, ui) {
						settings.carWidget.volltextSucheField.val(ui.item.value);
						volltextChanged(settings.carWidget);
					},
					search:  function(event, ui) {
					}
				});
			}
			updateActionUrl(settings.carWidget);
			
			if (settings.carWidget.brandSelect){
				disable(settings.carWidget.brandSelect, settings.carWidget.typeSelect, settings.carWidget.inverkehrssetzungsJahr);
				
				$.getJSON(settings.server+"/widget/getAllBrands?callback=?",
					  {
					    vtype: settings.carWidget.vehicleType
					  },
					  function(json) {
						    var options = emptySelectBox(settings.carWidget.brandSelect);
							
						    $.each(json.brands, function(index, array) { 
						    	options[options.length] = new Option(array[1], array[0]);
						    });
		
						    enable(settings.carWidget.brandSelect);
						    settings.afterDataUpdate(settings.carWidget.brandSelect);
					  });
			}
	
			// event handlers:
			if (settings.carWidget.versicherungsBeginn){
				settings.carWidget.versicherungsBeginn.change(function() {
					updateActionUrl(settings.carWidget);
				});
				settings.carWidget.versicherungsBeginn.keyup(function() {
					updateActionUrl(settings.carWidget);
				});
			}
			if (settings.carWidget.brandSelect){
				settings.carWidget.brandSelect.change(function() {
					brandChanged(settings.carWidget);
				});
			}
			if (settings.carWidget.typeSelect){
				settings.carWidget.typeSelect.change(function() {
					typeChanged(settings.carWidget);
				});
			}
			if (settings.carWidget.inverkehrssetzungsJahr){
				settings.carWidget.inverkehrssetzungsJahr.change(function() {
					updateActionUrl(settings.carWidget);
				});
			}
			if (settings.carWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.carWidget.afterWidgetInitialized(that.carWidget.actionUrl,that.carWidget.personalizedActionUrl);
				});
			}
		}
		
		if (settings.mraWidget.enabled){
			that.mraWidget = {};
			updateActionUrl(settings.mraWidget);
			if (settings.mraWidget.fahrzeugArtSelect){
				settings.mraWidget.fahrzeugArtSelect.change(function() {
					updateActionUrl(settings.mraWidget);
				});
			}
			if (settings.mraWidget.versicherungsBeginn){
				settings.mraWidget.versicherungsBeginn.change(function() {
					updateActionUrl(settings.mraWidget);
				});
				settings.mraWidget.versicherungsBeginn.keyup(function() {
					updateActionUrl(settings.mraWidget);
				});
			}
			if (settings.mraWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.mraWidget.afterWidgetInitialized(that.mraWidget.actionUrl,that.mraWidget.personalizedActionUrl);
				});
			}
		}
		
		if (settings.homeWidget.enabled){
			that.homeWidget = {};
			updateActionUrl(settings.homeWidget);
			if (settings.homeWidget.privathaftpflichtCheckbox){
				settings.homeWidget.privathaftpflichtCheckbox.change(function() {
					updateActionUrl(settings.homeWidget);
				});
			}
			if (settings.homeWidget.hausratCheckbox){
				settings.homeWidget.hausratCheckbox.change(function() {
					updateActionUrl(settings.homeWidget);
				});
			}
			if (settings.homeWidget.produktSelect){
				settings.homeWidget.produktSelect.change(function() {
					updateActionUrl(settings.homeWidget);
				});
			}
			if (settings.homeWidget.versicherungsBeginn){
				settings.homeWidget.versicherungsBeginn.change(function() {
					updateActionUrl(settings.homeWidget);
				});
				settings.homeWidget.versicherungsBeginn.keyup(function() {
					updateActionUrl(settings.homeWidget);
				});
			}
			if (settings.homeWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.homeWidget.afterWidgetInitialized(that.homeWidget.actionUrl,that.homeWidget.personalizedActionUrl);
				});
			}
		}
		
		if (settings.travelWidget.enabled){
			that.travelWidget = {};
			updateActionUrl(settings.travelWidget);
			if (settings.travelWidget.personenkreisSelect){
				settings.travelWidget.personenkreisSelect.change(function() {
					updateActionUrl(settings.travelWidget);
				});
			}
			if (settings.travelWidget.produktSelect){
				settings.travelWidget.produktSelect.change(function() {
					updateActionUrl(settings.travelWidget);
				});
			}
			if (settings.travelWidget.versicherungsBeginn){
				settings.travelWidget.versicherungsBeginn.change(function() {
					updateActionUrl(settings.travelWidget);
				});
				settings.travelWidget.versicherungsBeginn.keyup(function() {
					updateActionUrl(settings.travelWidget);
				});
			}
			if (settings.travelWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.travelWidget.afterWidgetInitialized(that.travelWidget.actionUrl,that.travelWidget.personalizedActionUrl);
				});
			}
		}
		
		if (settings.legalWidget.enabled){
			that.legalWidget = {};
			updateActionUrl(settings.legalWidget);
			if (settings.legalWidget.privathaftpflichtCheckbox){
				settings.legalWidget.privathaftpflichtCheckbox.change(function() {
					updateActionUrl(settings.legalWidget);
				});
			}
			if (settings.legalWidget.personenkreisSelect){
				settings.legalWidget.personenkreisSelect.change(function() {
					updateActionUrl(settings.legalWidget);
				});
			}
			if (settings.legalWidget.produktSelect){
				settings.legalWidget.produktSelect.change(function() {
					updateActionUrl(settings.legalWidget);
				});
			}
			if (settings.legalWidget.versicherungsBeginn){
				settings.legalWidget.versicherungsBeginn.change(function() {
					updateActionUrl(settings.legalWidget);
				});
				settings.legalWidget.versicherungsBeginn.keyup(function() {
					updateActionUrl(settings.legalWidget);
				});
			}
			if (settings.legalWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.legalWidget.afterWidgetInitialized(that.legalWidget.actionUrl,that.legalWidget.personalizedActionUrl);
				});
			}
		}
		
		if (settings.vermittlerWidget.enabled){
			that.vermittlerWidget = {};
			updateActionUrl(settings.vermittlerWidget);
			if (settings.vermittlerWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.vermittlerWidget.afterWidgetInitialized(that.vermittlerWidget.actionUrl,that.vermittlerWidget.personalizedActionUrl);
				});
			}
		}
		
		if (settings.carConfirmationWidget.enabled){
			that.carConfirmationWidget = {};
			updateActionUrl(settings.carConfirmationWidget);
			if (settings.carConfirmationWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.carConfirmationWidget.afterWidgetInitialized(that.carConfirmationWidget.actionUrl,that.carConfirmationWidget.personalizedActionUrl);
				});
			}
		}
		
		if (settings.homeConfirmationWidget.enabled){
			that.homeConfirmationWidget = {};
			updateActionUrl(settings.homeConfirmationWidget);
			if (settings.homeConfirmationWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.homeConfirmationWidget.afterWidgetInitialized(that.homeConfirmationWidget.actionUrl,that.homeConfirmationWidget.personalizedActionUrl);
				});
			}
		}
		
		if (settings.carSchadenWidget.enabled){
			that.carSchadenWidget = {};
			updateActionUrl(settings.carSchadenWidget);
			if (settings.carSchadenWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.carSchadenWidget.afterWidgetInitialized(that.carSchadenWidget.actionUrl,that.carSchadenWidget.personalizedActionUrl);
				});
			}
		}

		if (settings.hauSchadenWidget.enabled){
			that.hauSchadenWidget = {};
			updateActionUrl(settings.hauSchadenWidget);
			if (settings.hauSchadenWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.hauSchadenWidget.afterWidgetInitialized(that.hauSchadenWidget.actionUrl,that.hauSchadenWidget.personalizedActionUrl);
				});
			}
		}
		
		if (settings.phpSchadenWidget.enabled){
			that.phpSchadenWidget = {};
			updateActionUrl(settings.phpSchadenWidget);
			if (settings.phpSchadenWidget.afterWidgetInitialized){
				actionQueue.push(function(){
					settings.phpSchadenWidget.afterWidgetInitialized(that.phpSchadenWidget.actionUrl,that.phpSchadenWidget.personalizedActionUrl);
				});
			}
		}
		if (actionQueue.length > 0){
			if(settings.pageTrackingEnabled){
				// schedule
				setTimeout(function(){executeActionQueue('fallback timer');}, 3500);
				// init completed, ready to track
				that.trackPageview();
			} else {
				// execute immediately
				executeActionQueue('immediately');
			}
		}
	};
	
	
	that.trackPageview = function (){
		if (!settings.pageTrackingEnabled){
			log("pageTracking is disabled");
			return;
		}
		if (!that.tracked){
			that.tracked = true;
			if (!settings.initialized){
				log('trackPageview with uninitialized widget');
				if (!loadAktionsCodeFromCookie()){
					// store default aktionscode in cookie
					storeAktionsCodeInCookie();
				}
			}
			window._gaq = window._gaq || [];
			_gaq.push(function() {log('start GA with '+ settings.googleAnalyticsAccount);});
			_gaq.push(['_setAccount', settings.googleAnalyticsAccount]);
			_gaq.push(['_setDomainName', settings.cookieDomain]);
			_gaq.push(['_setCustomVar',1,'aktionsCode',settings.aktionscode_code+settings.aktionscode_version,3]);
			_gaq.push(['_trackPageview']);
			_gaq.push(function(){executeActionQueue('GA');});
			_gaq.push(function() {log('done GA');});
			var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
		    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
		    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
		} else {
			log("trackPageview has already been executed");
		}
	};
	
	return that;
}(jQuery);
