var flashConnection;
var areaCodesResponse = new Array();
var streetsResponse = new Array();
var houseResponse = new Array();

var lastAreaCode = "";
var lastStreetID = "";
var lastMmunicipalityID = "";
var postalIsComplete = false;
var streetIsComplete = false;
var browser = "";

var focusToPostal = false;
var focusToStreet = false;

String.prototype.startsWith = function(str)
{ return (this.match("^" + str) == str) }

function setBrowser() {
	var agent = navigator.userAgent;
	if ( agent.toLowerCase().indexOf("firefox") > 0 ) {
		return "firefox";	
	} else if ( agent.toLowerCase().indexOf("msie") > 0 ) {
		return "ie";
	} else if ( agent.toLowerCase().indexOf("safari") > 0 ) {
		return "safari";
	} else { 
		return false;
	}
}

function validateForm() {
	if ( $("#postal").val() == "" ) {
		$("#postal").css("border", "1px solid #FF0040");
		return false;
	}
	
	if ( $("#street").val() == "" ) {
		$("#street").css("border", "1px solid #FF0040");
		return false;
	}
	
	if ( $("#house").val() == "" ) {
		$("#house").css("border", "1px solid #FF0040");
		return false;
	}
	
	if ( validatePostal() && validateStreet() && validateHouse() ) {
		return true;	
	}
	
	return false;
}

function bodyLoaded() {
	flashConnection = document.getElementById('flash');
	setTimeout(function() { init(); }, 500);
}

function showError(field_name){
	var p = $("#" + field_name).offset();
	p.left += $("#" + field_name).width();
	var left = p.left;
	var top = p.top;
	
	if ( browser == "ie" ) {
		left -= 3;
		top -= 6;
	} else if ( browser == "firefox" ) {
		left += 4;
		top += 2;
	} else if ( browser == "safari" ) {
		left += 2;
		top -=5;
	}
	
	$("#formErrorContent").html(lang["da"][field_name + "_error"]);
	$("#formError").css("left",left);
	$("#formError").css("top", top);
	$("#formErrorContent").css("display", "block");
}

function removeError() {
	$("#formError").css("left","0");
	$("#formError").css("top", "0");
	$("#formErrorContent").css("display", "none");
}

function init() {
	flashConnection = document.getElementById("flash");
	
	$("#formErrorContent").css("display", "none");
	
	browser = setBrowser();
	if ( browser != false ) {
		$("input").mouseover(function(eventObject) {
			border = $(this).css("border");
			if ( border != undefined && ( border.indexOf("255, 0, 64") > 0 || border.indexOf("ff0040") > 0 ) ) {
				showError($(this).attr("id"));
			}
		});
		
		$("input").mouseout(function(eventObject) {
			removeError();					
		});
	}
	
	
	// reset all fields, used under development.
	$("#postal").val("");
	$("#street").val("");
	$("#house").val("");

	disable('postal');
	disable('street');
	disable('house');

	$('#door').hide();
	$('#door_title').hide();
	
	// init all area codes.
	callMethod('getAreaCodes');

	postal = $("#postal");
	// postal.blur(function() { 
	// 	var value = postal.val();
	// 	lastAreaCode = 0;
	// 	if ( true /*lastAreaCode != value*/ ) {
	// 		if ( value != null && value.length > 0 ) {
	// 			if ( validatePostal() && postalIsComplete) {
	// 				removeError("postal");
	// 				$("#postal").css("border", "1px solid #C2C3C7");
	// 				callMethod('getStreetsByPostalCode');
	// 			}
	// 			else if( postalIsComplete == false )
	// 			{
	// 				$("#postal").css("border", "1px solid #FF0040");
	// 			}
	// 		}
	// 	}
	// 	
	// 	postalIsComplete = false;
	// 	removeError('postal');
	// });
	
	var oldPostalVal = '';
	postal.keyup(function(event) {
		removeError("postal");
		$("#postal").css("border", "1px solid #C2C3C7");
		if( event.keyCode != 9 && event.keyCode != 16 && oldPostalVal != postal.val() )
		{
			$("#street").val("");
			disable("street");
			$("#house").val("");
			disable("house");
			$('#door').hide();
			$('#door_title').hide();
			$("#door_td").css("width", "1px");
		}
		else if( focusToPostal == false )
		{
			validatePostal();
		}
		
		focusToPostal = false;
	});
	postal.keydown(function(event) {
		oldPostalVal = postal.val();
		
		if (event.keyCode == 13) {
			$('#street').focus();
			event.preventDefault();
		};
	});
	
	street = $("#street");
	street.blur(function() {
		var value = street.val();
		
		if ( focusToPostal == true )
		{
			$("#postal").focus();
		}
		else if ( value != null && value.length > 0 )
		{
			if ( validateStreet() && streetIsComplete )
			{
				removeError("street");
				$("#street").css("border", "1px solid #C2C3C7");
				// callMethod('getHouseNumbers');
			}
			else if( streetIsComplete == false )
			{
				$("#street").css("border", "1px solid #FF0040");
			}
			
		//	streetDelay(validateStreet);
		}
		
		streetIsComplete = false;
		
		removeError('street');
		removeError('house');
	});
	
	var oldStreetValue = '';
	street.keydown( function(event) {
		if (event.keyCode == 13) {
			$('#house').focus();
			event.preventDefault();
		};
		
		oldStreetValue = street.val();
		if( event.keyCode == 9 && event.shiftKey == true)
		{
			focusToPostal = true;
			if ( streetAutoComplete != undefined ) {
				streetAutoComplete[0].autocompleter.kill(); 
			}
		}
	});

 	street.keyup(function(event)
	{
		if( event.keyCode != 9 && event.keyCode != 16 && oldStreetValue != street.val() )
		{
			$("#house").val("");
			disable("house");
			$('#door').hide();
			$('#door_title').hide();
			$("#door_td").css("width", "1px");
		}
		
		if( ( event.keyCode != 9 && event.keyCode != 16 && event.keyCode != 13 ) || focusToPostal == true )
		{
		}
		else
		{
			validateStreet();
		}
	});

	house = $("#house");
	house.blur(function() {
		if ( house.val() != null && house.val().length > 0 && focusToStreet == false && focusToPostal == false) {
			callMethod('getBBRUnits');
		}
		if( focusToStreet == true )
		{
		//	$("#street").focus();
		}
		removeError('house');
	});
	
	var oldHouseVal = '';
	house.keydown(function(event) {
		if (event.keyCode == 13) {
			$(validateDoor() ? '#door' : '#submit').focus();
			event.preventDefault();
		};
		
		oldHouseVal = house.val();
	});
	house.keyup(function(event) {
		if( (event.keyCode == 9 && event.shiftKey == true) || oldHouseVal == house.val())
		{
			focusToStreet = true;
		}
		else
		{
			validateHouse();
		}
	});
	
	door = $('#door');
	door.keydown(function(event) {
		if (event.keyCode == 13 && validateDoor()) {
			$('#submit').focus();
			event.preventDefault();
		};
	});
}

function disable(field) {
	$('#' +field).attr("disabled", true);
	$('#' +field).attr('class', 'disabled');
}

function enable(field) {
	$('#' +field).removeAttr("disabled"); 
	$('#' +field).attr('class', field);	
}

var postalDelay=delayTimer(200);
var streetDelay=delayTimer(200);
var  houseDelay=delayTimer(200);
function delayTimer(delay){
     var timer;
     return function(fn){
          timer=clearTimeout(timer);
          if(fn)
               timer=setTimeout(function(){
               fn();
               },delay);
          return timer;
     }
}

function validatePostal() {
	var value = $("#postal").val();
	if ( value != null && value.length <= 0 ) {
		$("#street").val("");
		disable("street");
		validateStreet();
		return;
	}
	
	var found = 0
	for( var i = 0; i < areaCodesResponse.length; i++ ) {
		str_one = areaCodesResponse[i].substring(0, value.length).toLowerCase();
		str_two = value.toLowerCase();
		
		if( areaCodesResponse[i].substring(0,4) == str_two.substring(0,4) )
		{
			postalIsComplete = true;
		}
		
		if ( found == 1 && str_one == str_two) {
			return false;
			break;
		}
		
		if ( found == 1 && str_one != str_two ) {
			return true;
			break;
		}
		
		if ( str_one == str_two ) {
			found++;
			removeError();
			$("#postal").css("border", "1px solid #C2C3C7");
		}
	}
	showError('postal');
	disable("street");
	$("#street").val("");
	$("#house").val("");
	disable("house");
	// $('#door').hide();
	// $('#door_title').hide();
	// $("#door_td").css("width", "1px");
	$("#postal").css("border", "1px solid #FF0040");
	return false;
}

function validateStreet() {
	var value = $("#street").val();
	if ( value != null && value.length <= 0 ) {
		$("#house").val("");
		disable("house");
		validateHouse();
		return;
	}
	
	for( var i = 0; i < streetsResponse.length; i++ ) {
		if ( streetsResponse[i]["name"].substring(0, value.length).toLowerCase() == value.toLowerCase() ) {
			removeError();
			$("#street").css("border", "1px solid #C2C3C7");
			
			if( streetsResponse[i]['name'].toLowerCase() == value.toLowerCase() )
			{
				streetIsComplete = true;
			}
			
			return true;
			break;
		}
	}
	showError('street');
	$("#house").val("");
	disable("house");
	$('#door').hide();
	$('#door_title').hide();
	$("#door_td").css("width", "1px");
	$("#street").css("border", "1px solid #FF0040");
	return false;
}

function validateHouse() {
	var value = $("#house").val();
	if ( value != null && value.length <= 0 ) {
		$('#door').hide();
		$('#door_title').hide();
		$("#door_td").css("width", "1px");
		return;
	}
	
	var noError = true;
	for (var i = 0; i < houseResponse.length; i++) {
		if ( houseResponse[i].substring(0, value.length).toLowerCase() == value.toLowerCase() ) {
			$("#house").css("border", "1px solid #C2C3C7");
			removeError();	
			noError = false;
		}
		
		if ( houseResponse[i].toLowerCase() == value.toLowerCase() ) {
			return true;
		}
	}
	
	if ( noError ) {
		showError('house');
		$("#house").css("border", "1px solid #FF0040");
	}
	
	$('#door').hide();
	$('#door_title').hide();
	$("#door_td").css("width", "1px");
	
	return false;
}

function validateDoor() {
	return $("#door").is(':visible');
}

function callMethod(command) {	
	switch(command) {
		case "getAreaCodes":
			flashConnection.execute({method:"getAreaCodes", callBack:"getAreaCodesComplete"});
		break;
		case "getStreetsByPostalCode":
			enable('street');
			$("#street").focus();
			lastAreaCode = $("#postal").val();
			var areaCode = lastAreaCode.substring(0, 4);
			if ( areaCode.length > 3 ) {
				flashConnection.execute({method:"getStreetsByPostalCode", callBack:"getStreetsByPostalCodeComplete", values:{areaCode:areaCode}});
			}
		    break;
		case "getHouseNumbers":
		    enable('house');
		    $("#house").focus();
		    var streetName = $("#street").val();
		    var streetObject = {};
		    for (var i = 0; i < streetsResponse.length; i++) {
		        if (streetsResponse[i]["name"] == streetName) {
		            streetObject = streetsResponse[i]
		            break;
		        }
		    }
		    lastStreetID = streetObject["id"];
		    lastMmunicipalityID = streetObject["municipalityID"];
		    flashConnection.execute({ method: "GetHouseNumbers", callBack: "GetHouseNumbersComplete", values: { streetID: streetObject["id"], municipalityID: streetObject["municipalityID"]} });
		    break;
        case "getBBRUnits":
            var areaCode = $("#postal").val().substring(0, 4);
            var streetUnit = $("#house").val();

            streetUnit = getCorrectedStreetUnit(streetUnit);
            flashConnection.execute({ method: "GetBBRUnits", callBack: "GetBBRUnitsComplete", values: { streetID: lastStreetID, municipalityID: lastMmunicipalityID, streetUnit: streetUnit, areaCode: areaCode} });
            break;
        default:
	        break;
	}
}

function getCorrectedStreetUnit(streetUnit) {
    
    var expr = /^\d*$/;
    var i = streetUnit.length;
    var len = 3;
    
    if(!streetUnit.match(expr)) {
        len = len + 1;
    }
    for(i; i < len; i++) {
        streetUnit = '0' + streetUnit;
    }
    return streetUnit;
}


function getAreaCodesComplete(obj) {
	var len = obj.length;
	var names = [];
	for( var i=0; i<len; i++) {
		names[i] = obj[i]["id"] + " " + obj[i]["name"];
	}
	enable('postal');
	areaCodesResponse = names;
	autoComplete('postal', names);
	$('#postal').blur(function() {
		var value = postal.val();
		lastAreaCode = 0;
		if ( true /*lastAreaCode != value*/ ) {
			if ( value != null && value.length > 0 ) {
				if ( validatePostal() && postalIsComplete) {
					removeError("postal");
					$("#postal").css("border", "1px solid #C2C3C7");
					// callMethod('getStreetsByPostalCode');
				}
				else if( postalIsComplete == false )
				{
					$("#postal").css("border", "1px solid #FF0040");
				}
			}
		}
		
		postalIsComplete = false;
		removeError('postal');
	});
}

function getStreetsByPostalCodeComplete(obj) {
	// if only one street found then write it out and move on the next field
	// $('#door').hide();
	// $('#door_title').hide();
	// $("#door_td").css("width", "1px");
	streetsResponse = obj;
	// $('#house').val("");
	
	if ( obj.length == 1 ) {
		enable('house');
		$("#house").blur();
		$("#street").val(obj[0]["name"]);
		$("#house").focus();
		callMethod('getHouseNumbers');
	// if more then one street found.
	} else {
		$("#street").focus();
		// disable('house');
	}
	
	var len = obj.length;
	var names = [];
	for( var i=0; i<len; i++) {
		names[i] = obj[i]["name"];
	}
	autoComplete('street', names);
}


function GetHouseNumbersComplete(obj) {
	// $('#house').val("");
	// $('#door').hide();
	// $('#door_title').hide();
	// $("#door_td").css("width", "1px");
	
	var len = obj.length;
	var names = [];
	var num = "";
	for (var i = 0; i < len; i++) {
		num = obj[i]["name"]
		while (num.startsWith("0")) {
		    num = num.substring(1, num.length);
		}
		names[i] = num;
	}
	
	if (obj.length > 0)
		houseResponse = names;
	
	autoComplete('house', names);
}

function GetBBRUnitsComplete(obj) {
	var len = obj.length;
	if ( len < 2 ) {
		$('#door').hide();
		$('#door_title').hide();
		$("#door_td").css("width", "1px");
	} else {
		$('#door').show();
		$('#door_title').show();
		$("#door_td").css("width", "180px");
	}
	
	var text = "";
	for( var i=0; i<len; i++) {
		num = obj[i]["floor"];
		door_id = obj[i]["id"];
		
		count = 0;
		while(num.indexOf("0")> -1 && count < 5) {
		    num = num.substring(1, num.length);
		    count++;
		}
		
		door = obj[i]["door"];
		if ( door == undefined || door == "undefined" ) {
			door = "";	
		} else {
			door = "." + door;	
		}

		text += "<option value='" + door_id + "'>" + $("#street").val() + " " + $("#house").val() + ", " + num + door + "</option>";
	}
	
	
	if ( text.length == 0 ) {
		// $('#door').hide();
		// $('#door_title').hide();
		// $("#door_td").css("width", "1px");
	} else {
		// $("#door_td").css("width", "180px");
		$("#door").html(text);
		$("#door").focus();	
	}

}
/*
	auto complete from local data.
*/


var areaCodeComplete;
var houseAutoComplete;
var streetAutoComplete;
function autoComplete(field, array) {
	// $("#" + field).blur();
	
	if ( field == "house" ) {
		
		if ( houseAutoComplete != undefined ) {
			houseAutoComplete[0].autocompleter.kill(); 
		}
		
		houseAutoComplete = $("#" + field).autocompleteArray(array, { delay:10, maxItemsToShow:15, onItemSelect:houseSelected, selectFirst: true });
	} else if ( field == "street" ) {
		if ( streetAutoComplete != undefined ) {
			streetAutoComplete[0].autocompleter.kill(); 
		}
		streetAutoComplete = $("#" + field).autocompleteArray(array, { delay:10, maxItemsToShow:15, onItemSelect:streetSelected, selectFirst: true });
			
	} else {
		areaCodeComplete = $("#" + field).autocompleteArray(array, { delay:10, maxItemsToShow:15, onItemSelect:areaCodeSelected, selectFirst: true });
	}
	
	$("#" + field).focus();
}

function areaCodeSelected() {
	callMethod('getStreetsByPostalCode');
}

function streetSelected() {
	if (validateStreet()) {
		removeError("street");
		$("#street").css("border", "1px solid #C2C3C7");
		callMethod('getHouseNumbers');
	};
}

function houseSelected() {
	callMethod('getBBRUnits');
}
/*
	getQueries to filter query out in arrayes
*/

function getQueries() {
	var url = String(document.location);
	var index = url.indexOf("?", 0);
	var queryObject = new Object();
	if ( index > 0 ) {
		var allQueryString = url.substring(index+1, url.length);
		var splitQueryString = allQueryString.split("&"); //lang=en&id=4		
		var queryArray = new Array();
		for(var i=0;i<splitQueryString.length;i++) {
			queryArray = splitQueryString[0].split("=");
			queryObject[queryArray[0]] = queryArray[1];
		}
	}
	
	return queryObject;
}

/*
	getTranslation from too many words.
*/

function getTranslation(word) {
	var translateTo = configuration["defaultLanguage"];
	document.write(lang[translateTo][word]);
}

function t(word) {
	getTranslation(word);
}
