jiant.onUiBound(pm.landing, [], function($, app) {

  var geocoder = new google.maps.Geocoder(),
      _requestType, _addressStreet, _addressCity, _addressState;

  var zipForm = app.views.initialView.form.validate({
    rules: {
      'address.zip': {
        required: true,
        maxlength: 5,
        minlength: 5,
        digits: true
      }
    },
    submitHandler: function(form) {
      if (zipForm.form()) {
        if (app.views.initialView.appointmentCtl.is(':checked')) {
          _requestType = app.logic.appointmentFlag();
        } else {
          _requestType = app.logic.proposalFlag();
        }
        setWaiting();
        geocoder.geocode({'address': app.views.initialView.addressZipInput.val() + ''}, function (results, status) {
          var zipIsValid = false;
          if (status == google.maps.GeocoderStatus.OK) {
            $.each(results[0].address_components, function (id, comp) {
              if (comp.types[0] == 'administrative_area_level_1') {
                zipIsValid = true;
                _addressState = comp.short_name;
              }
              if (comp.types[0] == 'country' && comp.short_name != 'US') {
                zipIsValid = false;
                return false;
              }
            });
          }
          if (zipIsValid) {
            app.views.initialView.notValidZip.hide();
            var _lat = results[0].geometry.location.lat(),
                _lng = results[0].geometry.location.lng();
            app.ajax.getAvailableProviders(app.models.env.providerSpeciality(), _lat, _lng, {"zip": app.views.initialView.addressZipInput.val()},
                jiant.formatDateUsa(new Date()), app.logic.getNowTime(), {"page.page": 0, "page.size": 10}, false, _requestType == app.logic.proposalFlag() ? 0 : 1,
                  app.views.initialView.hccProvidersCtl.prop("checked"), app.views.initialView.realtorId.val(),
                function (providers) {
                  var _requestTypeSelected = _requestType;
                  app.views.detailedView.availableProvidersContainer && app.views.detailedView.availableProvidersContainer.empty();
                  var hccProv = app.views.initialView.hccProvidersCtl.prop("checked");
                  if (providers.totalElements == 0) {
                    _requestType = app.logic.proposalFlag();
                    hccProv = false;
                  } else {
                    app.logic.renderAvailableProviders(providers);
                  }
                  setNotWaiting();
                  app.states.detailed.go(undefined, app.views.initialView.addressZipInput.val(), app.models.env.providerSpeciality(),
                                      _requestType, _addressStreet, _lat, _lng, _addressCity, _addressState, providers.totalElements,
                                      _requestTypeSelected, hccProv, app.views.initialView.realtorId.val());
                }
            );
          } else {
            app.views.initialView.notValidZip.show();
            setNotWaiting();
          }
        });
      }
    }
  });

  $.each(app.states, function(stateName, state) {
    !(stateName in {"chooseProfession": 1, "": 1}) && state.start(function(mode) {
      var sMode;
      if (app.models.env.mode()) {
        return;
      } else if (mode) {
        sMode = mode;
      } else {
        sMode = window.location.pathname.substring(window.location.pathname.lastIndexOf("/") + 1);
      }

      app.models.env.mode(sMode);
      app.models.env.providerSpeciality(pm.ldsSpecialities.logic.findSpecialityByMode(sMode));
    })
  });

  jiant.xl.statefulApp(app, "View", app.states[app.initialState])();

  app.states.initial.start(function(mode, addressStreet, addressCity, addressState, addressZip, selectedSpec, requestType, useHccProviders) {

    app.views.initialView.textContainer1.load((app.ajaxPrefix || "") + "getModeJsp?mode=" + app.models.env.mode() + "&num=1");
    app.views.initialView.textContainer2.load((app.ajaxPrefix || "") + "getModeJsp?mode=" + app.models.env.mode() + "&num=2");

    app.views.outerContainer.attr("class", "animate page1");
    app.logic.animState();
    _requestType = requestType;
    _addressStreet = addressStreet;
    _addressCity = addressCity;
    _addressState = addressState;
    app.views.initialView.addressZipInput.val(addressZip);
    app.views.initialView.hccProvidersCtl.val(useHccProviders);
    if (_requestType == app.logic.appointmentFlag()) {
      app.views.initialView.appointmentCtl.attr('checked', true);
    } else {
      app.views.initialView.proposalCtl.attr('checked', true);
    }
  });

  usStates && $.each(usStates, function(idx, state) {
    app.views.addressView.addressStateInput.append(jiant.parseTemplate("<div><option value='!!abbreviation!!'>!!name!!</option></div>", state));
  });

  function setWaiting() {
    app.views.outerContainer.find('.form_zip').waitMe({
      bg: 'rgba(255, 255, 255, 0.7)',
      color: '#337ab7',
      text: 'Search providers...'
    });
  }

  function setNotWaiting() {
    app.views.outerContainer.find('.form_zip').waitMe("hide");
  }

  /*app.views.initialView.proposalCtl.click(function() {
    app.views.initialView.hccProvidersCtl.prop("checked", false);
    app.views.initialView.hccProvidersCtl.attr("disabled", true);
    app.views.initialView.hccBlock.addClass("disabled");
  });

  app.views.initialView.appointmentCtl.click(function() {
    app.views.initialView.hccProvidersCtl.attr("disabled", false);
    app.views.initialView.hccBlock.removeClass("disabled");
  });*/
});