$(function(){
  var isiOS = false;
  if(navigator.userAgent.match(/iPhone/) || navigator.userAgent.match(/iPad/) || navigator.userAgent.match(/iPod/)){
    isiOS = true;
  }

  var lastPrecheck = undefined;
  var precheck = function(domain, callback){
    $.post('/precheck', {domain:domain}, function(result){
      lastPrecheck = result;
      console.log(result);
      callback(result);
    });
  }
  
  var domainSearch = function(){
    // Setup the spinner for the Choose Domain fields
    var chooseDomain = $("#choose-domain");
    var chooseDomainInput = $("#domain");
    var statusTag1 = $("<span />");
    var dropdownTag1 = $("<div />");
    statusTag1.addClass("status hidden");
    dropdownTag1.addClass("dropdown hidden").append("<ul />");
    $("#domain-search").append(statusTag1).append(dropdownTag1);
    
    var status = $(".status");
    var dropdown = $(".dropdown");
    
    var hideStatus = function(){status.fadeOut("fast").delay(300).removeClass().addClass("status hidden");};
    var showLoader = function(){status.removeClass().addClass("status loading").show();};
    var showCheck = function(){status.removeClass().addClass("status d_check").show();};
    var showError = function(){status.removeClass().addClass("status d_error").show();};
    var showSearch = function(){status.removeClass().addClass("status d_search").show();};
    var showDropdown = function(){dropdown.removeClass("hidden").show();};
    var hideDropdown = function(){dropdown.fadeOut("fast").delay(300).addClass("hidden");};
    var hideTransferInfo = function(){$("#domain-info").hide().find("div").hide();};
    var showTransferInfo = function(key){hideTransferInfo(); $("#domain-info").show().find("#"+key).fadeIn('fast');};
    
    var runPreCheck = !$('body').hasClass('home'); // false; 
    
    var recapDomain = null;
    var useExistingDomain = function(){
      $("body").removeClass("new-domain").addClass('existing-domain');
      $("#recap-domain").fadeOut('slow', function(){
        recapDomain = $(this).detach();
      });
    };
    
    var registerNewDomain = function(){
      $("body").removeClass("existing-domain").addClass("new-domain");
      if(recapDomain){
        recapDomain.prependTo($("#recap")).fadeIn('fast');
      }
    };
    
    
    showSearch();
    $(".d_search").bind("click",function(){
      chooseDomainInput.focus();
    });

    var domainName = chooseDomainInput;

    if(!isiOS){
      domainName.alphanumeric({allow:"-,_,.",nocaps:true});
    }
    var searching = false;
    var timeout = undefined;
    var cache = {};
    var domain = domainName.val();
    
    function sanitizeDomain(value){
      value = value.toLowerCase();
      value = value.replace('http://','');
      value = value.replace('www.','');
      value = value.replace(' ', '');
      return value;
    }

    chooseDomain.bind('result', function(e, result){

      var current = sanitizeDomain(chooseDomainInput.val());
      if(current && current != result['domain']){
        return;
      }
      
      if(result['registered']){
        // $('#use_existing_domain a').click();
        
        hideDropdown();
        
        useExistingDomain();
        // chooseDomainInput.val(result['domain']);
        // chooseDomainInput.val('');
        window.setTimeout(function(){
          if(result['google_apps']==false){
            showTransferInfo('google_apps');
            showError();
          } else if(result['dns']==false){
            showTransferInfo('dns_switch');
            showError();
          } else {
            // showTransferInfo('dns_ok');
            showCheck();
          }
        }, 200);
        
      } else {
        registerNewDomain();
        // 
        // existingDomainInput.val('');
        window.setTimeout(function(){
          showCheck();
        }, 200);
      }
      chooseDomainInput.val(result['domain']);
    });

    chooseDomain.bind('search', function(e, domain){
      // registerNewDomain();
      chooseDomainInput.val(domain);
      check(domain);
    });
    
    function check(domain){
      if(!runPreCheck) {
        return;
      }
      domain = sanitizeDomain(domain);
      
      if(domain.indexOf('.') == -1){ return; }
      var parts = domain.split('.');
      if(parts[parts.length-1].length < 2){ return; }
      
      showLoader();
      precheck(domain, function(result){
        chooseDomain.trigger('result', result);
      });
    }
    
    function pick(_domain){
      // alert(_domain);
      domain = _domain;
      hideDropdown();
      showLoader();
      chooseDomainInput.val(domain);
      showCheck();
    }
  
    var domainList = $(".dropdown ul");
  
    function show(list, autoPick){

      list = list.slice(0, 10);
      if(list[0][1] && list[1][1]){
        list = list.slice(0, 6);
      }
      if(autoPick==undefined){
        autoPick = false;
      }
      console.log("auto pick?", autoPick);
      if(domainName.val().indexOf('.')!=-1){
        _.each(list, function(x){
          if(x[1]===true && x[0]==domainName.val()){
            autoPick = true;
          };
        });
      }
      
      // context['step_state']['search_list'] = list;
      domainList.html("");
      domainList.hide();
      console.log("list", list);
      for(var i=0; i<list.length; i++){
        console.debug("show list",list[i]);
        domainList.append($('<li class="'+(list[i][1] ? '' : 'not-')+'available"><span class="availability"></span><a href="#">'+list[i][0]+'</a></li>'));
      }
      
      domainList.find("li.available a").bind('click',function(){
          domain = $(this).text();
          registerNewDomain();
          pick(domain);
          chooseDomain.addClass('domain-selected');
          return false;
        });
        
      domainList.find("li.not-available a").bind('click',function(){
          domain = $(this).text();
          hideDropdown();
          useExistingDomain();
          chooseDomainInput.val(domain);
          chooseDomain.addClass('domain-selected');
          check(domain);
          return false;
        });
        
      if(!autoPick){
        showDropdown();
        hideStatus();
        domainList.fadeIn('fast');
        return;
      }
      
      var found = false;
      domainList.find("li.available a").each(function(){
        if($(this).text()==domainName.val()){
          found = true;
          $(this).click();
        }
      });
      if(found){
        return;
      }
      
      if(domain===undefined){
        var firstAvailable = domainList.find("li.available a:first");
        if(firstAvailable.length>0){
          firstAvailable.click();
          return;
        }
      }
      
      showDropdown();
      
      if(!_.detect(list, function(x){return x[1]==true})){
        showError();
      } else {
        hideStatus();
      }
      
      domainList.fadeIn('fast');
    }
  
    function search(){
      var original_val = sanitizeDomain(domainName.val());
      var val = original_val;
      if(!val || val.length <= 2) {
        domainList.html("");
        domainList.hide();
        hideDropdown();
        return;
      }
      
      if($('#use_existing_domain').hasClass('active')){
        check(val);
        return; 
      }
      
      hideTransferInfo();
      
      if(cache[val] === true){
        return; // search in progress.
      }
      if(cache[val] != undefined){
        
        show(cache[val]); // cache hit
        return;
      }
      
      cache[val] = true; // we are searching.
      searching = true; 

      hideDropdown();
      showLoader();

      $.post("http://api.getdash.com/check/fast/domain_using_thread", {'search':val}, function(resp){
        
        var list = resp; // $.parseJSON(resp);
        cache[val] = list;
        // loading.fadeOut('fast');
        
        // little hack so list doesnt show if changed to existing domain
        if($('#use_existing_domain').hasClass('active')){
          return; 
        }
        
        searching = false;
        if(domainName.val() == original_val) {
          // alert("boom!");
          
          show(list, true);
        } else {
          // whoops.. search again..
          search();
        }
      });
    }


    domainName.bind("keydown",function(event){
      clearTimeout(timeout);
      timeout = setTimeout(search, 200);
    });
  
  }
  domainSearch();
  
});
