/*------------------THE NEW HOTNESS-----------------------------------*/
var Geocode = function(search_form, href, extra){
	var address_el = search_form.address;
	var search_notice = search_form.nextSibling;
	var availability = search_form.parentNode.parentNode.parentNode;
	var check_availability = search_form.parentNode;
	var form = check_availability.nextSibling;
	var save_form = (extra && extra != "region_check") ? extra : false;
	search_form.address.onkeydown = function(){ tweenToggleDisplay(search_notice, 'hide');}
	
	// METHODS
	this.loadServicePoint = function(service_point_id, subunit){
		check_availability.className = 'searching';
		ajax.get('/inc/php/geocode.php?service_point_id='+service_point_id+'&subunit='+subunit, function(response){
			response = response.split('%%');
			eval(response[1]);
		});
	
	}
	var searchAddress = this.searchAddress = function(region_id){
		if(extra == "region_check") region_id = "region_check";
		check_availability.className = 'searching';
		availability.className = '';
		var url = '/inc/php/geocode.php?address='+search_form.address.value+'&region_id='+region_id+'&force_geocode='+(search_form.recheck?search_form.recheck.value:0);
		ajax.get(url, function(response){
			response = response.split('%%');
			eval(response[1]);
		});
		if(search_form.recheck) search_form.recheck.value = 0;
	}
	var showBuilding = function(building){
		if(href){
			window.location.href = href+building.id;
		} else{
			availability.className = building.service_type;
			check_availability.className = 'found';
			search_form.address.value = building.address;
			search_form.address.blur();
			tweenToggleDisplay(search_notice, 'hide');
			form.building_id.value = building.id;
			form.service_type_id.value = building.service_type_id;
			form.unit_number.value = building.unit_number ? building.unit_number : '';
			
			
			if(save_form){
				var option = newEl('OPTION', {'value':building.service_point_id, 'text':building.address});
				$(save_form).billing_address.appendChild(option);
			}
			
			
			if(building.service_type == "house"){
				var last_st;
				if(building.attended) addClassName(availability, 'attended');
				if(building.accessable) addClassName(availability, 'accessable');
				else addClassName(availability, 'inaccessable');
				var service_types = getElementsByClassName('service_types', 'ul', availability);
				var unattended_st = service_types[0];
				removeChildren(unattended_st);
				for(var i=0, st; st=building.service_types[i]; i++){
					new function(st){
						var li = newEl('LI');
						if(st.id == building.service_type_id){ li.className = 'active'; last_st = li; }
						var a = newEl('A', {'innerHTML':st.name});
						li.onclick = function(){ 
							form.service_type_id.value = st.id;
							if(last_st) last_st.className = ''; 
							this.className = 'active'; last_st = this;
							// ASK FOR UNIT NUMBER IF LOCATION TYPE 'UNIT'
							if(st.location == "unit"){
								var unit_number_form = $('unit_number_form');
								if(st.name == 'Other') addClassName(unit_number_form, 'other');
								else removeClassName(unit_number_form, 'other');
								removeClassName(unit_number_form, 'key_needed');
								helpBubble.show(unit_number_form, {'target':this, 'anchor':'S'});
								unit_number_form.unit_number.value = building.unit_number ? building.unit_number : '';
								unit_number_form.other.value = building.other ? building.other : '';
								unit_number_form.onsubmit = function(){
									form.unit_number.value = this.unit_number.value;
									building.unit_number = this.unit_number.value;
									form.other.value = this.other.value;
									if(st.check_entry_methods == 0 || building.accessable_units.inArray(this.unit_number.value) != -1){
										form.submit(); helpBubble.hide(unit_number_form);
									} else{
										$('key_needed').innerHTML = "We don't have access to unit "+this.unit_number.value+". Will you provide a key?<br/>";
										var no = newEl('INPUT', {'type':'button', 'value':'No'});
										no.onclick = function(){ helpBubble.hide(unit_number_form);}
										var yes = newEl('INPUT', {'type':'button', 'value':'Yes'});
										yes.onclick = function(){ form.submit(); helpBubble.hide(unit_number_form);}
										appendChildren($('key_needed'), [no, yes]);
										addClassName(unit_number_form, 'key_needed');
									}
									return false;
								}
								
								return false;
							} else{
								form.submit();
							}
						}
						li.appendChild(a);
						unattended_st.appendChild(li);
					}(st);
				} 
				if(building.unit_number && last_st) last_st.onclick();
				var attended_st = service_types[1].getElementsByTagName('LI')[0];
				if(building.service_type_id == 45){ attended_st.className = 'active'; last_st = attended_st; }
				attended_st.onclick = function(){
					if(last_st) last_st.className = ''; this.className = 'active';
					form.service_type_id.value = 'attended';
					form.submit();
				}
			} else{
				var extra_service_types = $(building.service_type+'_extra_service_types');
				var last_st;
				
				removeChildren(extra_service_types);
				if(building.service_types){
					for(var i=0, st; st=building.service_types[i]; i++){
						if(!(building.service_type == "concierge" && st.id == CONCIERGE_TYPE_ID) && !(building.service_type == "locker" && st.id == LOCKER_TYPE_ID) ){
							new function(st){
								var li = newEl('LI');
								if(st.id == building.service_type_id){ li.className = 'active'; last_st = li; }
								var a = newEl('A', {'innerHTML':st.name});
								li.onclick = function(){ 
									form.service_type_id.value = st.id;
									if(last_st) last_st.className = ''; 
									this.className = 'active'; last_st = this;
									form.submit();
								}
								li.appendChild(a);
								extra_service_types.appendChild(li);
							}(st);
						}
					}
				}
			}
		}
	}
	var multipleBuildings = function(buildings){
		check_availability.className = 'found';
		search_notice.innerHTML = "<div><em>Did you mean:</em><div>";
		var addresses = newEl('UL');
		for(var i=0,building;building=buildings[i];i++){	
			new function(building){
				var li = newEl('LI');
				var a = newEl('A',{'innerHTML':building.address,'href':'javascript:void(0)'});
				a.onclick = function(){
					if(extra == "region_check"){
						ajax.get('/inc/php/geocode.php?building_id='+building.id+'&force_geocode='+(search_form.recheck?search_form.recheck.value:0), function(response){});	
						window.location.href = window.location.href;
					} else showBuilding(building);
				}
				li.appendChild(a);
				addresses.appendChild(li);
			}(building);
		}
		search_notice.appendChild(addresses);
		tweenToggleDisplay(search_notice, 'show');
	}
	var unknownAddress = function(){
		check_availability.className = 'error';
		search_notice.innerHTML = "<div>We're sorry, but we could not identify your address. Please check your spelling and try again.</div>";
		tweenToggleDisplay(search_notice, 'show');
	}
	var outsideDeliveryZone = function(address){
		check_availability.className = 'error';
		search_notice.innerHTML = "<div>We're sorry, but the address you entered is outside our delivery zone. Enter your email address below to be notified when we service your area.<p><form action='/signup/index.php' method='POST' onsubmit=\"if(this.email.value==''){alert('Please enter an email address.');return false;}\"><span>Email: </span> <input type='hidden' name='outside_delivery_zone' value='1'><input type='text' name='email'> Phone:<input type='text' size='8' name='phone'> <input type='hidden' name='address' value='"+address+"'><input type='submit' value='Submit'></form></div>";
		tweenToggleDisplay(search_notice, 'show');
	}
	var outsideDeliveryZoneOverride = function(address, regions){
		check_availability.className = 'error';
		search_notice.innerHTML = "<div>The address entered is outside our delivery zone. Do you want to add it anyway? <input type='submit' value='Yes'></div>";
		var select = newEl('SELECT');
		for(var i=0,r; r=regions[i]; i++){
			select.innerHTML += "<option value='"+r.id+"'>"+r.name+"</option>";
		}
		var button = search_notice.lastChild.lastChild;
		search_notice.lastChild.insertBefore(select, button);
		button.onclick = function(){searchAddress(select.options[select.selectedIndex].value);}
		tweenToggleDisplay(search_notice, 'show');
	}
	var noServiceToAddress = function(address){
		check_availability.className = 'error';
		search_notice.innerHTML = "<div>We're sorry, but we do not service this address.</div>";
		tweenToggleDisplay(search_notice, 'show');
	}
	
	
	
}







/*---------------------OLD & BUSTED-----------------------------------*/

function html_entity_decode(str) {
  var ta=document.createElement("textarea");
  ta.innerHTML=str.replace(/</g,"&lt;").replace(/>/g,"&gt;");
  return ta.value;
}

var validateServicePointForm = function(form){
	form = typeof(form) == "string" ? $(form) : form;
	if(form.service_type && radioValue(form.service_type) == 8){
		if(!/^[0-9]{4}$/.test(form.locker_pin.value)){
			alert('Please supply a valid locker pin number (4 digits).');
			return false;
		}
	}
	return true;
}

var checkServicePoint = function(form){
	var button = form.check_address;
	var address_el = form.address;
	var unit_number_el = form.unit_number;
	var address = address_el.value;
	var unit_number = unit_number_el.value;
	if(form.building_id.previousSibling.id == "service_points") form.building_id.parentNode.removeChild(form.building_id.previousSibling);
	form.building_id.value = '';
	button.disabled= true;
	var onclick = button.onclick;
	button.onclick = null;
	
	if(!button.nextSibling || button.nextSibling.nodeName != "BUTTON") insertAfter(newEl('BUTTON',{'class':'hidden'}),button);
	
	if(!address_el.nextSibling || address_el.nextSibling.nodeName != "BUTTON") insertAfter(newEl('BUTTON',{'class':'hidden'}),address_el);
	
	var image = address_el.nextSibling;
	var loading = button.nextSibling;
	loading.className = 'loading_medium';
	image.className = 'hidden';
	
	var unconfirmedAddress = function(){
		var message_el = newEl('DIV',{'class':'sp_message'});
		var inner_el = newEl('DIV');
		inner_el.innerHTML = "Your exact address could not be confirmed. Please ensure that you entered the correct street number. Proceed if address looks correct or edit accordingly. Thank you.";
		message_el.appendChild(inner_el);
		address_el.parentNode.appendChild(message_el);
		tweenToggleDisplay(message_el);
	}
	var unknownAddress = function(){
		var message_el = newEl('DIV',{'class':'sp_message'});
		var inner_el = newEl('DIV');
		inner_el.innerHTML = "We're sorry, but we could not identify your address. Please check your spelling and try again.";
		message_el.appendChild(inner_el);
		address_el.parentNode.appendChild(message_el);
		image.className = 'error';
		form.check_address.disabled = true;
		tweenToggleDisplay(message_el);
	}
	var outsideDeliveryZone = function(address){
		form.address.value = html_entity_decode(address);
		var message_el = newEl('DIV',{'class':'sp_message'});
		var inner_el = newEl('DIV');
		inner_el.innerHTML = "We're sorry, but the address you entered is outside our delivery zone. Enter your email address below to be notified when we service your area.<p><span>Email: </span> <input type='hidden' name='outside_delivery_zone' value='1'><input type='text' name='email'><input type='submit' value='Submit' onclick=\"if(this.previousSibling.value==''){alert('Please enter an email address.');return false;}\">";
		message_el.appendChild(inner_el);
		address_el.parentNode.appendChild(message_el);
		image.className = 'error';
		form.check_address.disabled = true;
		tweenToggleDisplay(message_el);
	}
	var noServiceToAddress = function(address){
		form.address.value = html_entity_decode(address);
		var message_el = newEl('DIV',{'class':'sp_message'});
		var inner_el = newEl('DIV');
		inner_el.innerHTML = "We're sorry, but we do not service this address.";
		message_el.appendChild(inner_el);
		address_el.parentNode.appendChild(message_el);
		image.className = 'error';
		form.check_address.disabled = true;
		tweenToggleDisplay(message_el);
	}
	var multipleBuildings = function(alternatives){
		var message_el = newEl('DIV',{'class':'sp_message'});
		message_el.appendChild(newEl('DIV',{'class':'title','innerHTML':'Did you mean'}));
		var addresses = newEl('UL');
		for(var i=0,a,alt;alt=alternatives[i];i++){
			a = newEl('A',{'innerHTML':alt.address,'href':'javascript:void(0)'});
			new function(alt){
				
				a.onclick = function(){
					address_el.value = alt.address;
					changedAddress(form,address_el);
					ajax.get('/inc/php/requests.php?action=show_address&id='+alt.id+'&unit_number='+form.unit_number.value,function(response){
						eval(response);
					});
				}
			}(alt);
			var li = newEl('LI');
			li.appendChild(a);
			addresses.appendChild(li);
		}
		
		message_el.appendChild(addresses);
		address_el.parentNode.appendChild(message_el);
		tweenToggleDisplay(message_el);
	}
	if(address != ''){
		var string = '/inc/php/requests.php?action=check_address&address='+escape(address)+'&unit_number='+escape(unit_number);
		ajax.get(string,function(response){
			button.onclick = onclick;
			loading.className = 'hidden';
			eval(response);
		});
	} else{
		button.onclick = onclick;
		loading.className = 'hidden';
		unknownAddress();
	}
}
var showEntryMethods = function(div,location,service_point){
	if(!location.pending_building_entry_methods) location.pending_building_entry_methods = 0;
	if(!location.pending_unit_entry_methods) location.pending_unit_entry_methods = 0;
	
	removeChildren(div);
	var title = newEl('H3',{'innerHTML':'Entry Methods'});
	//var help_button = newEl('BUTTON',{'class':'help_button','type':'button','innerHTML':'&nbsp;'});
	var help_button = newEl('BUTTON',{'type':'button','class':'help_button','innerHTML':'&nbsp;'});
	help_button.onclick=function(){ helpBubble.show('help_entry_methods',{'target':this,'pvert':'bottom'})}
	title.appendChild(help_button);
	
	var ul = newEl('ul');
	
	var building_div;
	var service_point_div;
	var building_li;
	var service_point_li;
	
	if(location.entry_methods == "true"){
		building_li = newEl('LI',{'innerHTML':'<div class="note">We already have access to your building.</div>'});
	} else{
		var html = '<div class="note" style="color:red">We do not already have access to your building. Please specify how many keys, if any,  are needed and/or a buzzer code:</div>Building Keys: <select name="building_entry_methods">';
		for(var i=0;i<=Math.max(5,location.pending_building_entry_methods);i++) html += '<option '+(i==location.pending_building_entry_methods ? 'selected' : '')+'>'+i+'</option>';
		html += '</select> Buzzer Code: <input type="text" class="zip" name="building_buzzer_code" value="'+(location.building_buzzer_code ? location.building_buzzer_code : '')+'">';
		building_li = newEl('LI',{'innerHTML':html});	
	}
	ul.appendChild(building_li);
	// CHECK FOR SERVICE POINT ENTRY METHODS
	if(service_point.check_entry_methods == 1){ 
		if(service_point.entry_methods > 0){
			//service_point_li = newEl('LI',{'innerHTML':'<div class="note">We already have access to this service point.</div>'});
		} else{
			var html = '<div class="note" style="color:red">We do not already have access to \''+service_point.type+'\'. Please specify how many keys, if any, are needed and/or a buzzer code:</div>Apartment Keys: <select name="unit_entry_methods">';
			for(var i=0;i<=Math.max(5,location.pending_unit_entry_methods);i++) html += '<option '+(i==location.pending_unit_entry_methods ? 'selected' : '')+'>'+i+'</option>';
			html += '</select> Buzzer Code: <input type="text" class="zip" name="unit_buzzer_code" value="'+(location.unit_buzzer_code ? location.unit_buzzer_code : '')+'">';
			service_point_li = newEl('LI',{'innerHTML':html});	
		}
		if(service_point_li) ul.appendChild(service_point_li);
	}
	appendChildren(div,[title,ul]);
}
var showRules = function(delivery_rules,location,type_id,default_rules){
	removeChildren(delivery_rules);
	if(location.type_rules[type_id]){
		var title = newEl('H3',{'innerHTML':'Delivery Preferences'});
		var list = newEl('ul');
		for(var i=0,rule_id;rule_id=location.type_rules[type_id][i];i++){
			if(location.rules[rule_id]){
				var li = newEl('LI');
				li.onclick=function(event){selectPref(event,this);}
				li.innerHTML = "<input type='checkbox' name='rules[]' value='"+rule_id+"'>";
				// IE NEEDS IT THE ABOVE WAY
				//li.appendChild(newEl('INPUT',{'type':'checkbox','name':'rules[]','value':rule_id}));
				if(default_rules && default_rules.inArray(rule_id) != -1)	li.firstChild.checked = true;
				li.appendChild(newEl('TEXT',' '+location.rules[rule_id]));
				list.appendChild(li);
			}
		}
		delivery_rules.appendChild(title);
		delivery_rules.appendChild(list);
	}
}
var showManagedOptions = function(div,service_point){
	removeChildren(div);
	if(service_point.managed > 0){
		var title = newEl('H3',{'innerHTML':'Managed Account'});
		var details = newEl('P',{'innerHTML':'This is a managed service point. Do you want to allow the manager to have limited control of your account, such as scheduling pickups?'});
		var list = newEl('UL');
		var yes = newEl('LI',{'innerHTML':'<input type="radio" name="managed" value="1" checked> Yes'}); 
		var no = newEl('LI',{'innerHTML':'<input type="radio" name="managed" value="0"> No'}); 
		appendChildren(list,[yes,no]);
		appendChildren(div,[title,details,list]);
	}
}
var hideServicePoints = function(form){
	var service_points = form.building_id.previousSibling;
	if(service_points.id == "service_points"){
		var h = service_points.clientHeight;
		var tween = Animate.Tween(service_points.style,'height','regularEaseOut',h,0,0.4,'px');
		tween.onMotionFinished = function(){
			service_points.style.display = 'none';
		}
		form['add_service_point'].style.display = 'none';
	}
}
var showBuilding = function(form,location,default_type,default_rules,no_tween){
	form.building_id.value = location.building_id;
	var address_el = form.address;
	var image = address_el.nextSibling;
	if(form.building_id.previousSibling.id == 'service_points'){
		var service_points 	= form.building_id.previousSibling;
		removeChildren(service_points);
	} else{
		var service_points = newEl('DIV',{'id':'service_points'});
		form.building_id.parentNode.insertBefore(service_points,form.building_id);
	}
	form.building_id.value = location.building_id;
	service_points.appendChild(newEl('HR'));
	var deselectRadios = function(){
		for(var i=0,el;el=form.elements[i];i++) if(el.name == "service_type"){ el.checked=false; removeClassName(el.parentNode,'selected');	}
	}
	var default_radio;
	var default_service_point = false;
	image.className = 'success';
	address_el.value = location.address;
	var prepareServicePointLi = function(li,sp){
		li.onclick = function(){
			deselectRadios(form.service_type);
			addClassName(li,'selected');
			this.firstChild.checked=true;
			if(add_service_point){add_service_point.disabled=false;}
			showRules(rules,location,sp.id);
			showEntryMethods(entry_methods,location,sp);
			showManagedOptions(managed,sp);
			if(sp.unit_number_needed && form.unit_number.value  == '') helpBubble.show('help_no_unit_number',{'target':li.lastChild,'anchor':'E','x':5,'y':0});
		}
	}
	// SHOW BUILDING NOTES
	if(location.building_notes){
		var building_notes = newEl('DIV', {'class':'info_message', 'innerHTML':location.building_notes});
		service_points.appendChild(building_notes);
	}
	
	// SHOW EXISTING SERVICE POINTS
	if(location.service_points.existing.length){
		var title = newEl('H3',{'innerHTML':'Please choose an existing service point at this address:'});
		var existing_ul = newEl('ul');
		for(var i=0,sp,li;sp=location.service_points.existing[i];i++){
			li = newEl('LI');
			var checked = ((default_type&&default_type==sp.id) ? true :false);
			var radio = newEl('INPUT',{'type':'radio','name':'service_type','value':sp.id,'checked':checked});
			radio.checked = checked;
			if(sp.id == default_type){
				addClassName(li,'selected');
				default_service_point = sp;
				default_radio = radio;
			}
			appendChildren(li,[radio,newEl('SPAN',{'innerHTML':' '+sp.type})]);
			prepareServicePointLi(li,sp);
			existing_ul.appendChild(li);
			
		}
		appendChildren(service_points,[title,existing_ul]);
	}
	// SHOW AVAILABLE SERVICE POINTS
	if(location.service_points.available.length){
		var inner_html = location.service_points.existing.length ? 'OR choose a new service point:' : 'Please choose an available service point:';
		var title = newEl('H3',{'innerHTML':inner_html});
		var available_ul = newEl('ul');
		for(var i=0,sp, radio, checked;sp=location.service_points.available[i];i++){
			li = newEl('LI');
			checked = (default_type&&default_type==sp.id) ? true :false;
			radio = newEl('INPUT',{'type':'radio','name':'service_type','value':sp.id,'checked':checked});
			radio.checked = checked;
			appendChildren(li,[radio,newEl('SPAN',{'innerHTML':' '+sp.type})]);
			prepareServicePointLi(li,sp);
			available_ul.appendChild(li);
		}
		appendChildren(service_points,[title,available_ul]);
	}
	if(!location.service_points.available.length && !location.service_points.existing.length){
		service_points.appendChild(newEl('div',{'class':'error_message','innerHTML':'This service point is unavailable. Please contact Husky Express for assistance.'})); 
	}
	var rules = newEl('DIV',{'id':'delivery_rules'});
	var entry_methods = newEl('DIV',{'id':'entry_methods'});
	var managed = newEl('DIV');
	service_points.appendChild(rules);
	service_points.appendChild(entry_methods);
	service_points.appendChild(managed);

	if(default_service_point){ // THE SERVICE TYPE HAS BEEN PRE-SPECIFIED
		default_radio.checked=true;
		showEntryMethods(entry_methods,location,default_service_point);
		showManagedOptions(managed,default_service_point)
	}
	if(!no_tween){
		service_points.style.display = 'block';
		var h = service_points.clientHeight;
		service_points.style.height = '0px';
		var tween = Animate.Tween(service_points.style,'height','regularEaseIn',0,h,0.4,'px');
		tween.onMotionFinished = function(){
			service_points.style.height = 'auto';
		}
	} else{
		service_points.style.display = 'block';
		service_points.style.height = 'auto';
	}
	// PICKUP NOTES
	var pickup_notes_title = newEl('H3',{'innerHTML':'Pickup Notes'});
	//var pu_notes_help_button = newEl('BUTTON',{'class':'help_button','type':'button','innerHTML':'&nbsp;'});
	var pu_notes_help_button = newEl('BUTTON',{'type':'button','class':'help_button','innerHTML':'&nbsp;'});
	
	pu_notes_help_button.onclick=function(){ helpBubble.show('help_sp_notes',{'target':this})}
	pickup_notes_title.appendChild(pu_notes_help_button);
	
	var public_notes = ''
	if(location.notes && location.notes.pickup && location.notes.pickup.public) public_notes = '<li class="note">'+location.notes.pickup.public+'</li>';
	var pickup_notes_input = newEl('UL',{'innerHTML':public_notes+'<li><textarea style="width:400px" name="pickup_notes">'+(location.notes && location.notes.pickup && location.notes.pickup.private?location.notes.pickup.private:'')+'</textarea></li>'});
	appendChildren(service_points,[pickup_notes_title,pickup_notes_input]);

	
	// DELIVERY NOTES
	var delivery_notes_title = newEl('H3',{'innerHTML':'Delivery Notes'});
	//var db_notes_help_button = newEl('BUTTON',{'class':'help_button','type':'button','innerHTML':'&nbsp;'});
	var db_notes_help_button = newEl('BUTTON',{'type':'button','class':'help_button','innerHTML':'&nbsp;'});
	db_notes_help_button.onclick=function(){ helpBubble.show('help_sp_notes',{'target':this})}
	delivery_notes_title.appendChild(db_notes_help_button);
	
	var public_notes = ''
	if(location.notes && location.notes.delivery && location.notes.delivery.public) public_notes = '<li class="note">'+location.notes.delivery.public+'</li>';
	var delivery_notes_input = newEl('UL',{'innerHTML':public_notes+'<li><textarea style="width:400px" name="delivery_notes">'+(location.notes && location.notes.delivery && location.notes.delivery.private?location.notes.delivery.private:'')+'</textarea></li>'});
	appendChildren(service_points,[delivery_notes_title,delivery_notes_input]);
	
	// NEXT STEP
	var add_service_point = form['add_service_point'];
	if(add_service_point){
		add_service_point.style.display = 'block';
		if(!default_type)	add_service_point.disabled = true;
	}
	if(default_type) showRules(rules,location,default_type,default_rules);
}

var changedAddress = function(form){
	hideServicePoints(form);
	form.check_address.disabled = form.address.value.length ? false : true;
	form.address.nextSibling.className = 'hidden';
	if(form.address.parentNode.lastChild.className == "sp_message")form.address.parentNode.removeChild(form.address.parentNode.lastChild);
}
