$(function(){
  
  // Setup all the AJAX requests
  $.ajaxSetup({
    type: "POST",
    url: "/check_us_domain",
    dataType: "json"
  });
  
  // =================
  // = Domain object =
  // =================
    
  var Domain = {
    popularTlds : [
      "com",
      "net",
      "org",
      "co.uk",
      "uk.com",
      "info",
      "us",
      "us.com",
      "eu.com",
      "eu"
    ],
    supportedTlds : [
      "ac",
      "ae.org",
      "ar.com",
      "asia",
      "at",
      "be",
      "biz",
      "br.com",
      "bz",
      "ca",
      "cc",
      "ch",
      "cn",
      "cn.com",
      "co",
      "co.in",
      "co.uk",
      "com",
      "com.cn",
      "com.mx",
      "de",
      "de.com",
      "dk",
      "es",
      "eu",
      "eu.com",
      "firm.in",
      "fr",
      "gb.com",
      "gb.net",
      "gen.in",
      "hu.com",
      "in",
      "ind.in",
      "info",
      "io",
      "it",
      "jpn.com",
      "kr.com",
      "li",
      "ltd.uk",
      "me",
      "me.uk",
      "mobi",
      "mx",
      "name",
      "net",
      "net.in",
      "nl",
      "no.com",
      "nu",
      "org",
      "org.in",
      "org.uk",
      "plc.uk",
      "qc.com",
      "ru.com",
      "sa.com",
      "se.com",
      "se.net",
      "sh",
      "tel",
      "tv",
      "uk.com",
      "uk.net",
      "us",
      "us.com",
      "uy.com",
      "ws",
      "za.com",
    ],
    populateTldDropDown : function(){
      var options = $("select#tld")[0].options;
      var tlds = Domain.supportedTlds;
      
      options.length = 0;
      
      $.each(tlds, function(i, val){
        if(val == "co.uk"){
          options[options.length] = new Option("." + val, val, true);
        } else {
          options[options.length] = new Option("." + val, val);
        }
      });
    },
    multipleCheck: function(tlds_to_check, i, domain, tld, response){
      response = (typeof(response) !== "undefined") ? response : false;
      
      Domain.checkSuccess(domain, tld, response);
      Domain.updateProgressBar(tlds_to_check.length);
      
      if(tlds_to_check.length == $("#results tbody tr").length){
        // Once a search has been completed, hide the
        // "Search Other Popular TLDs" button, and show
        // the "Clear Search" button
        $("#search_popular_tlds").hide();
        $("#clear_search").show();
        
        $("#results tfoot").show();
        
        setTimeout("$(\"#progress_indicator\").fadeOut()", 1000);
        setTimeout("$(\"#progressbar\").fadeOut()", 1000);
        setTimeout("$(\"#progressbar\").progressbar(\"destroy\")", 1000);
      }
    },
    checkSuccess : function(domain, tld, response){
      var row = "";

      if(response){
        if(response.success){
          if(response.response.available){
            row += "<tr class=\"available\">";
            row += "<td>" + response.response.query + "</td>";
            row += "<td>" + response.price + "</td>";
            row += "<td>" + response.minimum_years + "</td>";
            row += "<td class=\"availability\">Available! <a href=\"https://core.hostroute.com/signup?return_to=/client/domains/new\" class=\"signup-link\">Buy Now</a></td>"
            row += "</tr>";
          } else {
            row += "<tr class=\"taken\">";
            row += "<td>" + response.response.query + "</td>";
            row += "<td>" + response.price + "</td>";
            row += "<td>" + response.minimum_years + "</td>";
					  row += "<td class=\"availability\">Unavailable</td>";
            row += "</tr>";
          }
        } else {
          row += "<tr class=\"error\">";
          row += "<td colspan=\"4\">Error checking <strong>" + domain + "." + tld + "</strong>. Try again later!</td>";
          row += "</tr>";
        }
      } else {
        row += "<tr class=\"error\">";
        row += "<td colspan=\"4\">Error checking <strong>" + domain + "." + tld + "</strong>. Try again later!</td>";
        row += "</tr>";
      }
      
      $("#results tbody").append(row);
    },
    disableForm : function(){
      $("#results tfoot").hide();
      $("button, input[type='submit']").attr("disabled", "disabled");
    },
    enableForm : function(){
      $("#results tfoot").show();
      $("button, input[type='submit']").attr("disabled", "");
    },
    startProgressBar : function(){
      $("#progress_indicator").slideDown("slow");
      $("#progress_number").text(0);
      $("#progressbar").fadeIn("slow");
      $("#progressbar").progressbar({
        value: 0
      });
    },
    updateProgressBar : function(tld_length){
      var increment_level = 100 / tld_length;
      var current_value = $("#progressbar").progressbar('option', 'value');
      
      $("#progressbar").progressbar("value", current_value + increment_level);
      $("#progress_number").text(Math.round(current_value + increment_level));
    }
  }
  
  // =================
  // = Functionality =
  // =================
  
  // Populate TLDs list for search form
  Domain.populateTldDropDown();
  
  // Mark invalid input with a red background
  $("form#checker #domain").keyup(function(){
    if(!/^[a-zA-Z0-9\-]{3,63}$/i.test($("#domain").val())){
      $(this).css("background-color", "#fee");
    } else {
      $(this).css("background-color", "#efe");
    }
  });
  
  // Singleton checker
  $("form#checker").submit(function(){
    
    // Validate domain
    if($("#domain").val() == ""){
      alert("You must enter a domain to search for!");
      $("#domain").focus().css("background-color", "#fee");
      return false;
    }	else {
      $("#domain").css("background-color", "#efe");
    }
    
    Domain.disableForm();

    var domain = $("form#checker input").val();
    var tld = $("form#checker select").val();
    
    $("#loading").fadeIn();
    $("#results").hide();
    $("#results tbody").html("");
    
    $.ajax({
      data: {tld: tld, domain: domain},
      success: function(response){
				$("#results").fadeIn();        
        Domain.checkSuccess(domain, tld, (typeof(response) !== "undefined") ? response : false);
        $("#loading").fadeOut();
      },
      error: function(response){
				$("#results").fadeIn();        
        Domain.checkSuccess(domain, tld, (typeof(response) !== "undefined") ? response : false);
        $("#loading").fadeOut();
      }
    });
    
    // Ensure the "Search Other Popular TLDs" button
    // is shown, and the "Clear Search" button is hidden
    $("#search_popular_tlds").show();
    $("#clear_search").show();
    
    $("#results tfoot").show();
    Domain.enableForm();
    
    return false;
  });
  
  $("#search_popular_tlds").click(function(){	   
    // Validate domain
    if(!/^[a-zA-Z0-9\-]{3,63}$/i.test($("#domain").val())){
      alert("You must enter a domain with only alphanumeric characters and dashes, between 3 and 63 characters in length.");
      $("#domain").focus().css("background-color", "#fee");
      return false;
    } else {
      $("#domain").css("background-color", "#fff");
    }

    Domain.startProgressBar();    
    
    var domain = $("form#checker input").val();
    var tlds_to_check = Domain.popularTlds;
    
    // Clear the results table
    $("#results tbody").html("");
    $("#results tfoot").hide();
        
    $.each(tlds_to_check, function(i, tld){	
      $.ajax({
        data: {tld: tld, domain: domain},
        success: function(response){
          Domain.multipleCheck(tlds_to_check, i, domain, tld, response);
        },
        error: function(response){
          Domain.multipleCheck(tlds_to_check, i, domain, tld, response);
        }
      });
    });
    
    return false;
  });
  
  $("#clear_search").click(function(){
    $("#search_popular_tlds").show();
    $("#clear_search").hide();
    $("#results tbody").html("");
    $("#results tfoot").hide();
    $("#results").hide();
    $("#loading").hide();
    $("#domain").val("").focus();
  });
});