var FG = FCG.field.good;
var FL = FCG.field.loading;
var FB = FCG.field.bad;
var FR = FCG.field.reset;
var loader = new YAHOO.util.YUILoader({
  require: ["tabview", "calendar", "datasource", "autocomplete"],
  
  onSuccess: function(){
    FCG.page = function () {
      var cal;

      var resetValidate = function(el){
        var spanVal = $$("#" + el.id + " span[rel=validate]");
        spanVal.each(function(el){
          $(el).removeClassName("fieldGood");
        });
      };

      var instantiateTellAFriend = function(){
        var tellAFriendFields = ["promote_your_email", "promote_recipient_email", "promote_message"];
  
        var handleBlur = function(e){
          var el = $E.getTarget(e);
          var statusEl = el.id + '_status';
          if (el.value == ""){
            el.value = el.defaultValue;
            if ((/_email/).test(el.id)){ FR(statusEl); }
          } else {
            if ((/_email/).test(el.id)){
              var emailArray = el.value.split(',');
              for (var i = emailArray.length - 1; i >= 0; i--){
                if (FCG.validate.email(emailArray[i].strip())){
                  FG(statusEl);
                } else {
                  FB(statusEl, emailArray[i] + " is not valid.");
                  return false;
                }
              };
            }
          }
        };
  
        var handleFocus = function(e){
          var el = $E.getTarget(e);
          if (el.value == el.defaultValue){
            el.value = '';
          }
        };
  
        $E.on(tellAFriendFields, 'focus', handleFocus);
        $E.on(tellAFriendFields, 'blur', handleBlur);
        $E.on("promotion_form", 'submit', sendTellAFriend);
      };

      var sendTellAFriend = function(e){
        var el = $E.getTarget(e);
        var statusEl = el.id + '_status';
  
        var validate = function(){
          var spanVal = $$("#" + el.id + " span[rel=validate]");
          var spans = $$("#" + el.id + " span.fieldGood[rel=validate]");
          if (spans.length == spanVal.length){
            return true;
          } else {
            return false;
          }
        };
  
        if (!validate()){
          FB(statusEl, "The form is incomplete.");
          $E.preventDefault(e);
          return;
        }
  
        FL(statusEl, "Sending");
        var callback = {
          success: function(r){
            FG(statusEl, 'Sent.');
            el.reset();
            resetValidate(el);
          },
          failure: function(r){
            FB(statusEl, r.responseText);
          }
        };
        $C.setForm(el.id);
        var cObj = $C.asyncRequest('POST', el.action , callback, "format=js");
        $E.preventDefault(e);
      };

      var handleCalSelect = function(type,args,obj) {
        var el = $('booking_party_date');
        var statusEl = el.id + '_status';
        if (el.getValue() != "") {
        	var dates = args[0]; 
        	var date = dates[0];
        	var year = date[0], month = date[1], day = date[2];
        	el.value = month + "/" + day + "/" + year;
        	FG(statusEl);
        	cal.hide();
      	}
      };

      var handleCalClick = function(e){
        cal.show();
        $E.preventDefault(e);
      };

      var instantiateCal = function(){
        cal = new YAHOO.widget.Calendar("cal1","cal1Container");
        cal.cfg.setProperty("mindate", cal.today);
        cal.cfg.setProperty("close", true);
      	cal.selectEvent.subscribe(handleCalSelect, cal, true);
      	cal.hide();
      	cal.render();
      	$E.on("booking_party_date", "click", handleCalClick, cal, true);
      	$E.on($$F('a.calendar'), "click", handleCalClick, cal, true);
      };

      var instantiateBookingEvents = function(){
        var isBlank = function(e){
          var el = $E.getTarget(e);
          var statusEl = el.id + '_status';
          var value = el.value.strip();
          if(value.length > 0){
            FG(statusEl);
          } else {
            FB(statusEl, "Missing");
          }
          $E.preventDefault(e);
        };
  
        $E.on(['booking_party_type', 'booking_size', 'booking_good_time_to_talk', 'booking_contact_name'], 'blur', isBlank);
  
        $E.on('booking_party_date', 'blur', function(e){
          var el = $E.getTarget(e);
          var statusEl = el.id + '_status';
    
          if(cal.validate() && el.value != 'mm/dd/yy'){
            FG(statusEl);
          } else {
            FB(statusEl, "not valid");
          }
          $E.preventDefault(e);
        });
  
        $E.on('booking_contact_email', 'blur', function(e){
          var el = $E.getTarget(e);
          var statusEl = el.id + '_status';
          if(FCG.validate.email(el.value)){
            FG(statusEl);
          } else {
            FB(statusEl, FCG.validate.emailText);
          }
          $E.preventDefault(e);
        });
  
        $E.on("booking_form", 'submit', sendBooking);
      };

      var sendBooking = function(e){
        var el = $E.getTarget(e);
        var statusEl = el.id + '_status';
  
        var validate = function(){
          var spanVal = $$("#" + el.id + " span[rel=validate]");
          var spans = $$("#" + el.id + " span.fieldGood[rel=validate]");
          if (spans.length == spanVal.length){
            return true;
          } else {
            return false;
          }
        };
  
        if (!validate()){
          FB(statusEl, "The form is incomplete.");
          $E.preventDefault(e);
          return;
        }
  
        FL(statusEl, "Sending");
        var callback = {
          success: function(r){
            FG(statusEl, 'Done.');
            resetValidate(el);
            el.reset();
          },
          failure: function(r){
            if (parseInt(r.status) == 400){
              FB(statusEl, r.responseText);
            } else {
              FCG.message.set('The site is busy.', 'bad');
            }
      
          }
        };
        $C.setForm(el.id);
        var cObj = $C.asyncRequest('POST', el.action , callback, "format=js");
        $E.preventDefault(e);
      };

      var sendRsvp = function(e){
        var el = $E.getTarget(e);
        var statusEl = el.id + '_status';

        var validate = function(){
          if ($F("rsvp_name") == "Name" ){
            return("Name is missing.");
          } else if ($F("rsvp_name").length < 3){
            return("Name must be 3 or more letters.");
          }
          return true;
        };

        var validateResponse = validate();
        if (validateResponse === true){
          FCG.field.loading(statusEl, "Sending");
          var callback = {
            success: function(r){
              resetRsvp();
              FG(statusEl, 'Done.');
            },
            failure: function(r){
              if (parseInt(r.status) == 400){
                FB(statusEl, r.responseText);
              } else {
                FB(statusEl, 'The site is busy.');
              }
            }
          };
          $C.setForm(el.id);
          var cObj = $C.asyncRequest('POST', el.action , callback, "format=js");
        } else {
          FB(statusEl, validateResponse );
        }
        $E.preventDefault(e);
      };

      var resetRsvp = function(){
        var el = $('rsvp_name');
        el.addClassName("grey");
        el.value = "Name";
        el = $('rsvp_email');
        el.addClassName("grey");
        el.value = "Email (optional)";
        $('rsvp_people').value = 1;
      };

      var handleRsvpName = function(e){
        var el = $E.getTarget(e);
        if ($F(el) == 'Name'){
          el.value = '';
        }
        $(el).removeClassName("grey");
      };

      var handleRsvpEmail = function(e){
        var el = $E.getTarget(e);
        if ($F(el) == 'Email (optional)'){
          el.value = '';
        }
        $(el).removeClassName("grey");
      };

      var handlePromoteRecipientEmail = function(e){
        var el = $E.getTarget(e);
        if ($F(el) == 'Recipient\'s E-mail Address'){
          el.value = '';
        }
        $(el).removeClassName("grey");
      };

      var handlePromoteYourEmail = function(e){
        var el = $E.getTarget(e);
        if ($F(el) == 'Email (optional)'){
          el.value = '';
        }
        $(el).removeClassName("grey");
      };
      
      var start = function(){
        var tabView = new YAHOO.widget.TabView('party_info_stack');
        $E.on("rsvp_form", 'submit', sendRsvp);
        $E.on("rsvp_name", 'focus', handleRsvpName);
        $E.on("rsvp_email", 'focus', handleRsvpEmail);
  
        $E.on("promote_recipient_email", 'focus', handlePromoteRecipientEmail);
        $E.on("promote_your_email", 'focus', handlePromoteYourEmail);
  
        instantiateTellAFriend();
        if($("bookingTab")){ 
          instantiateCal();
          instantiateBookingEvents();
        }
      };

      return{
        init:function(){
          $E.onDOMReady(start);
        }
      };
    }();
    FCG.page.init();
  }
});
loader.insert();