var QS_AddressController;

/**

QS_AddressController:
   Controls reusable address fragment behavior with regards postcode lookup etc.
   
   IMPORTANT: fragment common/fragments/ajaxAddressOverlay.jsp must be included (once) above closing body tag
   for address look up to work.

author: dedmondson
date:   22/04/2009
*/

// Object Def
function  QS_AddressController(){
	
	// Private
	var showLookupAddressResultsOverlay = function(addressFragmentId, addressSummaries){
		// clear the options list the append retrieved address
		$('#QS_lookupAddressResultsOverlay select').empty();
		var isSelected="selected='selected'";
		for (var i=0, addressSummary; addressSummary = addressSummaries[i]; i++ ){
			if(i == 1){
				isSelected=""
		    }
			$('#QS_lookupAddressResultsOverlay select').append("<option value='"+ addressSummary.id +"' "+isSelected+" >"+ addressSummary.text +"</option>")
		}
		
		// Set the fragment id the ok button so we know which address fragment to update.
		$('#QS_lookupAddressResultsOkButton').attr('name',addressFragmentId);
		
		// show the dialog
	    var api = $("#QS_lookupAddressResultsOverlay").overlay({
	      close: '#QS_lookupAddressResultsCloseButton,#QS_lookupAddressResultsOkButton',
		  closeOnClick: false
	    }); 
	    api.load(); 
	}
	
	var initCountry = function(addressFragmentId, country){
		$("#"+addressFragmentId + " option[value='"+country+"']").attr('selected','selected');
		var postcodeElements = $('#'+addressFragmentId + ' .QS_postcodeElement');
		if($.trim(country) != "GB" ){
			postcodeElements.fadeOut();
			$("#"+addressFragmentId + " input[name='zipCode']").val("");
		}
		else{
			
			postcodeElements.fadeIn();
		}
	}
  
  // Public 
  return{
  	init:function(){ 
	  // initalise the address lookup overlay. 
      $("#QS_lookupAddressResultsOverlay").overlay({
        close: '#QS_lookupAddressResultsCloseButton,#QS_lookupAddressResultsOkButton',
		closeOnClick: false
      }); 
	  
	  // initalise all address fragments on the page: country specifics
	  var addressFragments = $(".QS_addressFragment");
	  addressFragments.each(function(n){
	  	var addressFragmentId = this.id;
		var initialCountryValue = $("#"+addressFragmentId + " input[name='initialCountryValue']").val();
		if(!initialCountryValue){
		  initialCountryValue ="GB";
		}
		initCountry(addressFragmentId, initialCountryValue);
	  });
	},
  	
	findLookupAddressList:function(addressFragmentId){
	   var postcode = $("#"+addressFragmentId+" dd input[name='zipCode']").val();
	   
	   if(!postcode){
		 sessionController.showErrorOverlay("Unable to find address search results for the following reasons:<br /><br />"+
		                                    "No value for postcode. <br /><br />"+
		                                    "Please enter a UK postcode.");
         return;
	   }
	   
	   // Normalise postcode value
	   postcode = new String($.trim(postcode)).toUpperCase();
	   $('#'+addressFragmentId +' input[name=zipCode]').val(postcode);
        
	   
	   if( !(QS_Constants.postcodeRegex().test(postcode)) ){
		 sessionController.showErrorOverlay("Unable to find address search results for the following reasons:<br /><br />"+
		                                    "Invalid postcode value. <br /><br />"+
		                                    "Please enter a valid UK postcode.");
	   }
	   else{
	   
		   $.ajax({
		       url:'qs_jsonLookupAddressSummaryBean',
		       data:{
		        'storeId':storeId,
		        'catalogId':catalogId,
		        'langId':langId,
		        'postcode':postcode,
		        'errorViewName':'qs_jsonStatusError'
		       },
		       success:function(data){
			   	 
		         if(data.status == 'success'){    
	
				  if(data.addressSummaries && data.addressSummaries.length > 0){
				  	showLookupAddressResultsOverlay(addressFragmentId, data.addressSummaries);
				  }
				  else{
				  	sessionController.showErrorOverlay("<strong>No address information found for " + postcode +".</strong><br /><br />"+
														"Please check your postcode and country are correct.<br /><br />"+
														"If this error persists, please enter your address information by hand.<br /><br /><br />");
				  }
		         }
		         else{
		          sessionController.showErrorOverlay(errorMessages);
		         }
		       }
		   }); 
	   }
	},
	

	selectLookupAddress:function(addressFragmentId){
		
	   var addressId = $('#QS_lookupAddressResultsOverlay select').val();
	   $.ajax({
	       url:'qs_jsonLookupAddressBean',
	       data:{
	        'storeId':storeId,
	        'catalogId':catalogId,
	        'langId':langId,
	        'addressId':addressId,
	        'errorViewName':'qs_jsonStatusError'
	       },
	       success:function(data){
	         if(data.status == 'success'){ 
			   var fragment = $('#'+addressFragmentId);
               fragment.find('input[name=address1]').val(data.address.address1);
			   fragment.find('input[name=address2]').val(data.address.address2);
			   fragment.find('input[name=address3]').val(data.address.address3);
			   fragment.find('input[name=city]').val(data.address.city);
			   fragment.find('input[name=state]').val(data.address.state);
	         }
	         else{
	          sessionController.showErrorOverlay(errorMessages);
	         }
	       }
	   });  
	},
	
	addressCountryChanged: function(addressFragmentId, country){	
	   initCountry(addressFragmentId, country);
	}

    
 
  }//end return
}//end object def

// On page load
$(function(){
 QS_AddressController = new QS_AddressController();
 QS_AddressController.init();
});