/**
*
*  URL encode / decode
*  http://www.webtoolkit.info/
*
**/

var Url = {

	// public method for url encoding
	encode : function (string) {
		return escape(this._utf8_encode(string));
	},

	// public method for url decoding
	decode : function (string) {
		return this._utf8_decode(unescape(string));
	},

	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	},

	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}

		}

		return string;
	}

}

/**
 *	Funklsjoner brukt i Dolly Dimple's lojalitetsprogram
 *
 **/

/* Opens new window and checks for popup-blockers */


/* Deliveryoptions */
function updateAddress(data) {
	adr = data.options[data.selectedIndex].value.split('|');

	self.document.accountinfo.adresse1.value = adr[0];
	//self.document.accountinfo.adresse2.value = adr[1];
	self.document.accountinfo.adresse3.value = adr[2];
	self.document.accountinfo.poststed.value = adr[3];

    document.getElementById(type+'adresse2').focus();
}

/* Min profil */

/**
 *
 * @access public
 * @return void
 **/
function setMyAddress(data,type) {
	adr = data.options[data.selectedIndex].value.split('|');

	document.getElementById(type+'street').value = adr[0];
	//document.getElementById(type+'street_no').value = adr[1];
	document.getElementById(type+'zip_code').value = adr[2];
	document.getElementById(type+'city').value = adr[3];

	document.getElementById(type+'street_no').focus();
}

/**
 *
 * @access public
 * @return void
 **/
function getValue(node) {
	while(node != null) {
		if(node.nodeType == 3) {
			return node.nodeValue;
		}
		node = node.firstChild;
	}
	return null;
}

var validateTimer = null;

/**
 *
 * @access public
 * @return void
 **/
function requestValidation(e,type,id) {
    var characterCode;

	if(window.event) {
		e = window.event;
		characterCode = e.keyCode;
	} else if(e && e.which){
		e = e;
		characterCode = e.which;
	} else if(KeyboardEvent && e instanceof KeyboardEvent) {
		characterCode = e.keyCode;
	} else {
		e = window.event;
		characterCode = e.keyCode;
	}

	switch(characterCode) {
		case 8:
		case 46:
			clearTimeout(window.validateTimer);
			/*window.validateTimer = setTimeout('validateAddress(\''+type+'\',\''+id+'\',true);',1200);*/
			return;
		case 40:
		case 37:
		case 39:
		case 38:
		case 9:
		case 16:
		case 20:
		case 36:
		case 35:
			return;
	}

	validateAddress(type,id);
}

/**
 *
 * @access public
 * @return void
 **/
function validateAddress(type,id,run) {
	if(run == null) {
		clearTimeout(window.validateTimer);
		window.validateTimer = setTimeout('validateAddress(\''+type+'\',\''+id+'\',true);',500);
		return;
	}

	if(document.getElementById(id).value == '') {
		document.getElementById(id).userchanged=false;
	} else {
		document.getElementById(id).userchanged=true;
	}

	var validatator = document.getElementById('validator');
	var city = document.getElementById(type+'city');

	if(true) {
		var url = validatator.value + '?type='+type+'&field='+escape(id);
		if(document.getElementById(type+'street').userchanged) {
			var street = document.getElementById(type+'street');
			url = url + '&street=' + Url.encode(street.value);
		}
		if(document.getElementById(type+'street_no').userchanged) {
			var street_no = document.getElementById(type+'street_no');
			url = url + '&street_no=' + escape(street_no.value)
		}
		if(document.getElementById(type+'zip_code').userchanged) {
			var zip_code = document.getElementById(type+'zip_code');
			url = url + '&zip_code=' + escape(zip_code.value);
		}

		http = zXmlHttp.createRequest();
		http.onreadystatechange=function() {
			var antall = 0;
			if(http.readyState==4) {
				if(http.status==200) {
					var street = '';
					var street_no = '';
					var zip_code = '';
					var city = '';

					var status = 4;
					var type = '';
					var field = '';

					var nodes = http.responseXML.firstChild;

					while(nodes != null) {

						if(nodes.nodeType == 1) {

							switch(nodes.tagName) {
								case 'validation':
									nodes = nodes.firstChild;
									break;
								case 'status':
									status = getValue(nodes);
									nodes = nodes.nextSibling;
									break;
								case 'field':
									field = getValue(nodes);
									nodes = nodes.nextSibling;
									break;
								case 'type':
									type = getValue(nodes);
									nodes = nodes.nextSibling;
									break;
								case 'addresses':
									antall++;
									select = document.getElementById(type+'select');
									select.innerHTML = '';
									nodes = nodes.firstChild;
									break;
								case 'address':
									select = document.getElementById(type+'select');
									data = nodes.firstChild;

									while(data != null) {

										if(data.nodeType == 1) {

											switch(data.tagName) {
												case 'street':
													street = getValue(data);
													break;
												case 'streetno':
													street_no = getValue(data);
													break;
												case 'zipcode':
													zip_code = getValue(data);
													break;
												case 'city':
													city = getValue(data);
													break;
											}
										}
										data = data.nextSibling;
									}
									if(nodes.firstChild != null) {
										var option = document.createElement('option');
										option.value = street+'||'+zip_code+'|'+city;
										option.appendChild( document.createTextNode(street+' nr. '+street_no+', '+zip_code+' '+city) );
										select.appendChild(option);
									}
									nodes = nodes.nextSibling;
									break;
								default:
									alert('Tag:\t' + nodes.tagName);
									nodes = nodes.nextSibling;
							}
						} else {
							nodes = nodes.nextSibling;
						}
					}
					if(select.innerHTML == '') {
						var option = document.createElement('option');
						option.value = '|||';
						option.appendChild( document.createTextNode( 'Ingen adresser matcher dine kriterier...' ) );
						select.appendChild(option);
						if(document.getElementById(type+'street').userchanged) {
							var option = document.createElement('option');
							option.value = '|||';
							option.appendChild( document.createTextNode( 'Gate: '+document.getElementById(type+'street').value ) );
							select.appendChild(option);
						}
						if(document.getElementById(type+'street_no').userchanged) {
							var option = document.createElement('option');
							option.value = '|||';
							option.appendChild( document.createTextNode( 'Husnummer: '+document.getElementById(type+'street_no').value ) );
							select.appendChild(option);
						}
						if(document.getElementById(type+'zip_code').userchanged) {
							var option = document.createElement('option');
							option.value = '|||';
							option.appendChild( document.createTextNode( 'Postnummer: '+document.getElementById(type+'zip_code').value ) );
							select.appendChild(option);
						}
					}
					if(type != '') {

						var vis = false;
						if(document.getElementById(type+'street').value != '') vis = true;
						if(document.getElementById(type+'street_no').value != '') vis = true;
						if(document.getElementById(type+'zip_code').value != '') vis = true;

						if(vis) {
							var alt = document.getElementById(type+'alt');
							alt.className = '';
						} else {
							var alt = document.getElementById(type+'alt');
							alt.className = 'hide';
						}
					}
					/*
					//var commandReturning = http.responseXML.firstChild.nextSibling.attributes[0].nodeValue;
					//actionHandlers[commandReturning](http.responseXML.firstChild.nextSibling);
					*/
				}
				else {
					alert('En feil oppstod ved tilkobling til serveren (HTTP Feilkode: ' + http.status + ')');
				}

				if(antall == 1 && (status == 2 || status == 1)) {


					if(field != '') {
						var textbox = document.getElementById(field);
						if(textbox != null) {
							if(textbox.createTextRange || textbox.setSelectionRange) {
								var text = '';
								if(field == type+'street') {
									text = street;
								} else if(field == type+'zip_code') {
									text = zip_code;
								} else if(field == type+'city') {
									text = city;
								}

								if(text != '') {
									var iLen = textbox.value.length;
									textbox.value = text;

			    					if (textbox.createTextRange) {
			        					var range = textbox.createTextRange();
			        					range.moveStart("character", iLen);
			        					range.moveEnd("character", text.length - textbox.value.length);
			        					range.select();

								    } else if (textbox.setSelectionRange) {
								        textbox.setSelectionRange(iLen, text.length);
								    }

			    					textbox.focus();
								}
							}
						}
					}

					if(field != type+'street') {
						document.getElementById(type+'street').value = street;
					}
					if(field != type+'zip_code') {
						document.getElementById(type+'zip_code').value = zip_code;
					}
					if(field != type+'city') {
						document.getElementById(type+'city').value = city;
					}
					var alt = document.getElementById(type+'alt');
					alt.className = 'hide';
				}
			}
		}
		http.open("get",url,true);
		http.send(null);

	} else {
		var alt = document.getElementById(type+'alt');
		alt.className = 'hide';
	}
}

/**
 *
 * @access public
 * @return void
 **/
function setRequired(type){
	var street = document.getElementById(type+'street');
	var street_no = document.getElementById(type+'street_no');
	var zip_code = document.getElementById(type+'zip_code');
	var city = document.getElementById(type+'city');

	if(street.value != '' || street_no.value != '' || zip_code.value != '' || city.value != '') {
		document.getElementById(type+'table').className = 'req';
	} else {
		document.getElementById(type+'table').className = '';
	}
}


// Funksjonen benyttes for å sette feltene for annen adresse lik valgt foreslått adresse.
function setAddress(street,no,zip,city,desc) {
	document.getElementById('home_street').value = street;
	document.getElementById('home_street_no').value = no;
	document.getElementById('home_zip_code').value = zip;
	document.getElementById('home_city').value = city;
	document.getElementById('home_directions').value = desc;
}

// Funksjonen vis eller skjuler felt avhengig av om adressen som skal endres/legges til er av typen Hente avdeling
function hsRestaurantVelger(type) {
	if(type==4) {
		document.getElementById('restaurantVelger').className = '';
		document.getElementById('gateVelger').className = 'hide';
		document.getElementById('postnrVelger').className = 'hide';
		document.getElementById('tbl-rutebeskrivelse').className = 'hide';
	} else {
		document.getElementById('restaurantVelger').className = 'hide';
		document.getElementById('gateVelger').className = '';
		document.getElementById('postnrVelger').className = '';
		document.getElementById('tbl-rutebeskrivelse').className = '';
	}
}

function velgRegion(region) {
	var e = document.getElementById(region);

	if(e.style.display == 'none') {
		e.style.display = '';
	}
	else {
		e.style.display = 'none';
	}
}

function velgRestaurant(storeCode,element) {
	var valgtRestaurant = document.getElementById('valgtRestaurant');
	valgtRestaurant.innerHTML = element.innerHTML + '<br/><br/>';
	var takeawayRestaurant = document.getElementById('takeawayRestaurant');
	takeawayRestaurant.value = storeCode;

	/* Lukker alle menyvalgene */
	var regioner = document.getElementById('regioner');
	hideDivTree(regioner,false);
}

function hideDivTree(node,hideFirst) {

	if(node.nodeType == 1) {

		if(node.tagName == 'DIV' && hideFirst) {
			node.style.display = 'none';
		}
		var node = node.firstChild;

		while(node != null) {

			if(node.nodeType == 1) {
				hideDivTree(node,true);
			}
			node = node.nextSibling;

		}
	}

}

/**
 *
 * @access public
 * @return void
 **/
function setMyAddressOnKeyPress(elm,e,type) {
	var characterCode = 0;

	if(window.event) {
		e = window.event;
		characterCode = e.keyCode;
	} else if(e && e.which){
		e = e;
		characterCode = e.which;
	} else if(e instanceof KeyboardEvent) {
		characterCode = e.keyCode;
	}

	if((characterCode == 13 || characterCode == 32) && elm.options.length > 0) {
		setMyAddress(elm,type);
	}
}

function isSpaceOrEnter(e) {
	var characterCode = 0;
	if(window.event) {
		e = window.event;
		characterCode = e.keyCode;
	} else if(e && e.which){
		e = e;
		characterCode = e.which;
	} else if(e instanceof KeyboardEvent) {
		characterCode = e.keyCode;
	}

	if(characterCode == 13 || characterCode == 32) {
		return true;
	} else {
		return false;
	}
}

/* Paymentoptions */

/**
 *
 * @access public
 * @return void
 **/
function setCreditCard(name,nums,id){
	var ccno=document.getElementById(id+'creditcard_no');
	ccno.value=(ccno.value).substr(0,nums);ccno.maxLength=nums;
	var ccname=document.getElementById(id+'ccname');
	ccname.innerHTML=name+' kortnummer: ';
	var divel=document.getElementById(id+'CreditCardNumber');
	divel.className='visible';
	return false;
}

/**
 * Converts the form elemenets and their value to a string.
 **/
function serializeFormVariables(form) {
	var data = Array();
	var teller = 0;
	var navn = '';
	for(var i=0;i<form.elements.length;i++) {
		if(form.elements[i].tagName == 'INPUT') {
			if(form.elements[i].type == 'text' || form.elements[i].type == 'hidden') {
				data[teller] = escape(form.elements[i].name)+'='+escape(form.elements[i].value);
				teller = teller + 1;
			} else if((form.elements[i].type == 'radio' || form.elements[i].type == 'checkbox') && form.elements[i].checked) {
				data[teller] = escape(form.elements[i].name)+'='+escape(form.elements[i].value);
				teller = teller + 1;
			}
		} else if(form.elements[i].tagName == 'SELECT') {
			var options = form.elements[i].options;
			for(var j=0;j<options.length;j++) {
				if(options[j].selected) {
					navn = form.elements[i].name;
					if(form.elements[i].multiple) {
						if(navn.substring(-1) == ']') {
							data[teller] = escape(navn)+'='+escape(form.elements[i].value);
						} else {
							data[teller] = escape(navn)+'[]='+escape(form.elements[i].value);
						}
						teller = teller + 1;
					} else {
						data[teller] = escape(navn)+'='+escape(form.elements[i].value);
						teller = teller + 1;
						break;
					}
				}
			}
		}
	}

	return data.join('&');
}
