var $ = jQuery.noConflict();

var bindSearchHandler = function (input) {

	var search_term = encodeURI(input);
	var my_url = "/profiles/search/"+search_term+"/index.json"
	
	$.ajax({
	  type: "GET",
	  async: true,
	  cache: false,
	  url: my_url,
	  dataType: "json",
	  beforeSend: function() {
	       $("#directory_ere_net #browse-keyword fieldset input").addClass("loading");
	  },
	  success: function(response) {
		  if (response.length > 0) {
			  var html_results = translateResultsToHTML(response);
			  displayResults(html_results, "#browse-keyword #keyword-search-results");
		  } else {
			  $("#browse-keyword #keyword-search-results").empty().hide();
		  }
	  },
	  error: function(msg){
		 var test = msg;
		 // error
	  },
	  complete: function() {
	       $("#directory_ere_net #browse-keyword fieldset input").removeClass("loading");
	  }
	});
}

function translateResultsToHTML(results) {
	if (results) {
		var result_list = $(results).map(function() {
			var lineitem = '<li><a href="/profiles/' + this.urlId + '">' + this.name + '</a></li>';
			return lineitem;
		});
		var columns = columnize(result_list, 3);
		var html_output = "";
		$.each(columns, function(index) {
			if (this.length > 0) {
				html_output += '<ul class="column-'+(index+1)+'">\n';
				html_output += $(this).get().join("\n");
				html_output += '\n</ul>\n';
			}
		});
		return html_output;
	} else {
		return "";
	}
}

function columnize(result_list, num_columns) {
	// set the ceiling because we want earlier columns to have longer result lists
	var column_length_ceiling = Math.ceil(result_list.length / num_columns);
	var column_length_floor = Math.floor(result_list.length / num_columns);
	var full_length_columns = result_list.length - (column_length_floor * num_columns);
	
	var columns = new Array(num_columns);
	
	var i = 0;
	var factor = 0;
	
	$.each(columns, function(index) {
		
		if (index < full_length_columns)
		{
			factor = column_length_ceiling;
		}
		else
		{
			factor = column_length_floor;
		}
		
		columns[index] = result_list.slice(i,i+factor);
		i = i + factor;
		
	});
	
	return columns;
}

function displayResults(results, selector) {
	if (results) {
		$(selector).empty().prepend(results).show();
	} else {
		$(selector).empty().hide();
	}
}

var matchTimeout;

var timeoutSearchHandler = function(input)
{
	clearTimeout(matchTimeout);
	matchTimeout = setTimeout("bindSearchHandler('"+ $(input).val() +"')",300);
}

$(document).ready(function() {
    
    // alphabetical browser
    // on page load, get the data
    $.ajax({
      type: "GET",
      async: true,
      cache: true,
      url: "/profiles/index.json",
      dataType: "json",
      success: attachToClickHandlers,
      error: function(msg){
          //alert("Oops! An error has occurred. Please try again.");
      }
    });
    
    
    //for live search
    //query on keypresses
    $("#browse-keyword form :submit").hide();
    $("#browse-keyword input#keyword-search-profiles").keyup(function() {
        timeoutSearchHandler(this);
    });
	
	
    
    //.blur(function() {
    //    $(this).bindSearchHandler();
    //}).focus(function() {
    //    $(this).bindSearchHandler();
    //});
    
    
    /* Functions for alphabetical list browser */
    
    function attachToClickHandlers(response) {
        if (response) {
            
            // for alphabet stuff
            $("#browse-alphabetical .slider li a").each(function () {
                $(this).click(function() {
                    var first_letter = $(this).text();
                    var results = parseResultsByFirstLetter(response, first_letter);
                    var html_results = translateResultsToHTML(results);
                    displayResults(html_results, "#browse-alphabetical .browse-results");
                    $("#browse-alphabetical .slider li").removeClass("selected");
                    $(this).parent("li").addClass("selected");
                    return false;
                });
            });
            
            // intialize 
            var first_letter = $("#browse-alphabetical .slider li.selected a").text();
            var results = parseResultsByFirstLetter(response, first_letter);
            var html_results = translateResultsToHTML(results);
            displayResults(html_results, "#browse-alphabetical .browse-results");
            
            // for tags
            $("#browse-tags .tags li a").each(function () {
                $(this).click(function() {
                    var tag = $(this).text();
                    var results = parseResultsByTag(response, tag);
                    var html_results = translateResultsToHTML(results);
                    displayResults(html_results, "#browse-tags .browse-results");
                    $("#browse-tags .tags li").removeClass("selected");
                    $(this).parent("li").addClass("selected");
                    return false;
                });
            });
        }
    }
    
    function parseResultsByFirstLetter(response, letter) {
        var results = $(response).map(function(index) {
            if (this.firstLetter == letter.toLowerCase()) {
                return this;
            } else {
                return null;
            }
        });
        if (results.length > 0) {
            return results
        } else {
            return false
        }
    }
    
    function parseResultsByTag(response, tag) {
        var results = $(response).map(function(index) {
            var found_tags = $.map(this.tagList, function(t) {
                if (t == tag) {
                    return t
                } else {
                    return null
                }
            });
            if (found_tags.length > 0) {
                return this;
            } else {
                return null;
            }
        });
        if (results.length > 0) {
            return results
        } else {
            return false
        }
    }
});

$.fn.removeExampleOnFocus = function(example) {
    var current_value = $(this).val();
    if (current_value == example) {
        $(this).val("").css("color", "#000");
    }
    return this;
}

$.fn.setExampleOnBlur = function(example) {
    var current_value = $(this).val();
    if (current_value == "") {
        $(this).val(example).css("color", "#999");
    } else if (current_value == send_to_example) {
        $(this).val(example).css("color", "#999");
    }
    return this;
}

