/**
 * This script will handle all user interaction with the referral system, including bind the necessary 
 * actions to certain elements. It will also handle some background calls to validate the email
 * addresses prior to a form submit.
 *
 * @author dstaley
 * @version 1.0
 */

var Referrals = {
	
	emails : [],
	invalid_emails : [],
	invalid_reasons : [],
	valid_addresses : 0,
	current_value : 0,
	offer_value : 0,
	offer_limit : 0,
	current_clones : 0,
	max_clones : 0,
	selectors : {
		error_ast : '#error_hl',
		error_message : 'p.referral_notes',
		form : '#referral_form',
		box_container : '#referral_container',
		email_box : '.referral_box:eq(0)',
		text_box : '.referral_textbox',
		intro_text : '#referral_info',
		display_info : '#referral_details',
		get_more_link : '.referral_box_link',
		total_value : '#total_value',
		submit_button : '#btn_submit',
		reset_button : '#btn_reset'
	},
	/**
	 * Basic init routine, will handle binding all the necessary stuff
	 */
	Initialize : function(){
		jQuery(document).ready(function(){
			
			//bind the link to clone our stuff
			jQuery(Referrals.selectors.get_more_link).click(function(){
				if(!Referrals.IsEmpyTextboxAvailable()){
					Referrals.CloneEmailLine();
				}
				Referrals.UpdateCurrentValue();
				//prevent the default click from happening.
				return false;
			});
			
			//bind the textbox events 
			jQuery(Referrals.selectors.text_box).bind("blur",function(){
				//check on blur if the value is a valid email, if so display
				//the information showing the value
				
				var value = jQuery(this).val();
				if(value == null || value == ""){
					jQuery(this).removeClass("invalid");
					return false;
				}
				
				if(Referrals.IsValidEmail(value)){
					
					Referrals.valid_addresses++;
					Referrals.emails.push(value);
					jQuery(this).removeClass("invalid");
					
//					if(!Referrals.IsEmpyTextboxAvailable()){
//						//lets add another textbox
//						Referrals.CloneEmailLine(true);
//					}
				}else{
					jQuery(this).removeClass("invalid");
					if(value != ''){
						jQuery(this).attr('title','The value entered is not a valid email address, please verify that it\'s correct.').addClass("invalid");
					}
					jQuery(this).focus();
				}
				Referrals.UpdateCurrentValue();
			});
			
			jQuery(Referrals.selectors.text_box).bind("focus",function(){
				var val = jQuery(this).val();
				if(val == null || val == ""){
					jQuery(this).removeClass("invalid");
				}
			});
			
			//bind our submit button to handle a few things for us.
			jQuery(Referrals.selectors.submit_button).click(function(){
				//todo, handle the callback here to validate the emails
				//create a true array of emails, and pass it back to the validation script
				var emails = jQuery.map(jQuery(Referrals.selectors.text_box), function(e){ return jQuery(e).val();});
				jQuery.getJSON("referral.php?type=cb", {'emails[]' : emails}, function(request){
					if(request.status){
						if(request.has_partial_valid_address_list){
							var conf = confirm(request.error);
							if(conf){
							//	atleast one or more is valid address in the list.
								jQuery(Referrals.selectors.form).submit();
							}else{
								Referrals.invalid_emails.length = 0;
								//there is one or more that is not valid.
								//handle by highlighting the ones that cannot be sent.
								jQuery.each(request.emails, function(i,item){
									//go through each email, and highlight it's input.
									if(item.invalid && item.email != ''){
										//its invalid, highlight it.
										Referrals.invalid_emails.push(item.email);
										jQuery('input'+Referrals.selectors.text_box+':eq('+i+')').addClass("invalid").attr('title',item.error_message);
									}else{
										//its valid, lets remove the highlight class incase
										jQuery('input'+Referrals.selectors.text_box+':eq('+i+')').removeClass("invalid").attr('title','');
									}
								});
								Referrals.UpdateCurrentValue();
							}
						}else{
							jQuery(Referrals.selectors.form).submit();
						}
					}else{
						Referrals.invalid_emails.length = 0;
						//there is one or more that is not valid.
						//handle by highlighting the ones that cannot be sent.
						jQuery.each(request.emails, function(i,item){
							//go through each email, and highlight it's input.
							if(item.invalid && item.email != ''){
								//its invalid, highlight it.
								Referrals.invalid_emails.push(item.email);
								jQuery('input'+Referrals.selectors.text_box+':eq('+i+')').addClass("invalid").attr('title',item.error_message);
							}else{
								//its valid, lets remove the highlight class incase
								jQuery('input'+Referrals.selectors.text_box+':eq('+i+')').removeClass("invalid").attr('title','');
							}
						});
						Referrals.UpdateCurrentValue();
					}
				});
				return false;
			});
			
			//bind our reset button to handle resetting the actual form and various other data
			jQuery(Referrals.selectors.reset_button).click(function(){
				document.location.reload();
				return false;
			});
		});
	},
	Validation : {
		bindErrors : function(json_data){
		
			if(!json_data){
				return false;
			}
			
			jQuery.each(json_data, function(i,item){
				//go through each email, and highlight it's input.
				if(!Referrals.IsValidEmail(item.email) || (item.invalid && item.email != '')){
					//its invalid, highlight it.
					jQuery('input'+Referrals.selectors.text_box+':eq('+i+')').addClass("invalid").attr('title',item.error_message);
				}else{
					//its valid, lets remove the highlight class incase
					jQuery('input'+Referrals.selectors.text_box+':eq('+i+')').removeClass("invalid").attr('title','');
				}
			});
			Referrals.UpdateCurrentValue();
		}
	},
	Form : {
		bindFormData : function(json_data){
			
			if(!json_data){
				return false;
			}
			
			jQuery.each(json_data, function(i,item){
				//go through each email, and highlight it's input.
				if(i == 0){
					Referrals.emails.push(item.email);
					jQuery('input'+Referrals.selectors.text_box+':eq('+i+')').val(item.email);
				}else{
					if(item.email != ''){
						Referrals.emails.push(item.email);
						Referrals.CloneEmailLine(true, item.email);
					}
				}
				
				if(item.invalid && item.email != ''){
					Referrals.invalid_emails.push(item.email);
					Referrals.invalid_reasons.push(item.error_message);
				}
			});
			Referrals.UpdateCurrentValue();
		}
	},
	CloneEmailLine : function(dont_alert, set_value_to){
		if(Referrals.current_clones < Referrals.max_clones){
			//if they havent reached the threshold yet, clone it
			var val = (set_value_to == null) ? '' : set_value_to; 
			var clone = jQuery(Referrals.selectors.email_box).clone(true);
			var cinput = jQuery("input", clone).val(val);
			cinput.removeClass("invalid").attr('title','');
			clone.appendTo(Referrals.selectors.box_container);
			cinput.focus();
			Referrals.current_clones++;
		}else{
			//todo, add ui dialog alert.
			if(dont_alert == null || !dont_alert){
				alert("Sorry, but you have reached the limit of referrals you can send at one time.");
			}
		}
	},
	UpdateCurrentValue : function(){
		if(Referrals.emails.length > 0){
			Referrals.CalculateCurrentValue();
			//if there is atleast one valid email address
			jQuery(Referrals.selectors.intro_text).hide();
			jQuery(Referrals.selectors.total_value).html("$"+Referrals.current_value);
			Cufon.replace(Referrals.selectors.display_info+'> p.MorganPoster', { fontFamily: 'MorganPoster' });
			Cufon.replace(Referrals.selectors.display_info+'> p.Champion', { fontFamily: 'Champion' });
			jQuery(Referrals.selectors.display_info).show();
		}else{
			jQuery(Referrals.selectors.display_info).hide();
			jQuery(Referrals.selectors.intro_text).show();
		}
	},
	CalculateCurrentValue : function(){
		var filtered_emails = [];
		var invalid_emails = [];
		
		jQuery.each(Referrals.emails, function(i,item){
			//check if our values dont match the array item, if so update it..
			var val = jQuery(Referrals.selectors.text_box+":eq("+i+")").val();
			if(val != item){
				Referrals.emails[i] = val;
				item = val;
			}
			if(jQuery.inArray(item, filtered_emails) == -1 && jQuery.inArray(item, Referrals.invalid_emails) == -1 && Referrals.IsValidEmail(item)){
				jQuery(Referrals.selectors.text_box+":eq("+i+")").removeClass("invalid");
				filtered_emails.push(item);
			}else{
				if(item != ""){
					jQuery(Referrals.selectors.text_box+":eq("+i+")").addClass("invalid");
					invalid_emails.push(item);
				}
			}
		});
		if(invalid_emails.length > 0){
			jQuery(Referrals.selectors.error_ast).show();
			jQuery(Referrals.selectors.error_message).show();
		}else{
			jQuery(Referrals.selectors.error_ast).hide();
			jQuery(Referrals.selectors.error_message).hide();
		}
		Referrals.current_value = (Referrals.offer_value * filtered_emails.length);
	},
	IsEmpyTextboxAvailable : function(){
		var empty = jQuery(Referrals.selectors.text_box+"[value='']");
		if(empty.length == 0){
			//lets see if an error box is available.
			var error_box = jQuery(Referrals.selectors.text_box+"[class='invalid']");
			if(error_box.length == 0){
				return false;
			}
			error_box.removeClass("invalid");
			error_box.focus();
			return true;
		}else{
			empty.removeClass("invalid");
			empty.focus();
			return true;
		}
	},
	IsValidEmail : function(email){
		return /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(email);
	}
};