var chacha = {
  
  vars: {
    root: "http://chachalookup.appspot.com/",
    results: [],
    current_result: false,
    selected_text: false,
    mouse_position: false,
    is_searching: false,
    select_range: false
  },
  
  timers: {
    question_mark: false
  },
  
  init: function(css_to_load){
    chacha.load_stylesheet(css_to_load);
    chacha.load_plugins();
  },
  
  finalize_init: function(){
    chacha.create_divs();
    document.body.addEventListener("mouseup", chacha.check_for_selection, false);
    chacha.create_existing_questions();
  },
  
  create_existing_questions: function(){
    $(".chacha_help").each(function(index){
      var help_elm = $(this);
      help_elm.click(function(e){
        help_elm.addClass("chacha_help_loading")
        var mouseX = (e.pageX || e.pageY) ? e.pageX : e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft
        var mouseY = (e.pageX || e.pageY) ? e.pageY : e.clientY + document.body.scrollTop + document.documentElement.scrollTop
        $("#chacha_questionmark").css({"left": mouseX, "top": mouseY - 23});
        var question = help_elm.attr("data-question").replace("?", "")
        chacha.look_up_question(question)
      })
    })
  },
  
  load_plugins: function(){
    var s = document.createElement("script");
        s.src = chacha.vars.root + "scripts/jquery.ppdrag.js";
        s.type = "text/javascript";
        s.id = "chacha_plugin"
    document.getElementsByTagName("head")[0].appendChild(s);
    $('#chacha_plugin').load(function() {
      chacha.finalize_init()
    });
  },
  
  load_stylesheet: function(css_to_load){
    css_file = (css_to_load.indexOf("http://") != 0) ? chacha.vars.root + "styles/layout_"+css_to_load+".css" : css_to_load
    $("head").append("<link>");
    css = $("head").children(":last");
    css.attr({
      rel:  "stylesheet",
      type: "text/css",
      href: css_file
    });
  },
  
  create_divs: function(){
    // Question mark
    $(document.body).append("<div id=\"chacha_questionmark\"></div>");
    $("#chacha_questionmark").click(function(){
      clearTimeout(chacha.timers.question_mark);
      $("#chacha_questionmark").addClass('chacha_question_loading');
      chacha.look_up_question(chacha.vars.selected_text);
    }).mouseover(function() {
      clearTimeout(chacha.timers.question_mark);
    }).mouseout(function() {
      if(!chacha.vars.is_searching){
        chacha.timers.question_mark = setTimeout("chacha.fade_question_mark()", 4000);
      }
    });
    // Container
    $(document.body).append("<div id=\"chacha_container\"></div>");
    $("#chacha_container").ppdrag();
    $("#chacha_container").append("<div id=\"chacha_result_title\"></div>");
    $("#chacha_container").append("<div id=\"chacha_result_content\"></div>");
    $("#chacha_container").append("<div id=\"chacha_suggestion\"></div>");
    $("#chacha_results_close_btn").live("click", function(){
      chacha.hide_results();
    });
    $("#chacha_next_result_btn").live("click", function(){
      chacha.next_results();
    });
    $("#chacha_prev_result_btn").live("click", function(){
      chacha.prev_results();
    });
  },
  
  mouseup_target: function(evt){
    var targ;
    if (!evt) var evt = window.event;
    if (evt.target) targ = evt.target;
    else if (evt.srcElement) targ = evt.srcElement;
    if (targ.nodeType == 3) targ = targ.parentNode;
    return targ;
  },
  
  check_for_selection: function(e){
    var targ = $(chacha.mouseup_target(e));
    if(targ.attr("id") == "chacha_questionmark"){
      return false;
    }else{
      //chacha.remove_highlight();
      var selection = window.getSelection().toString();
      if(selection != ""){
        chacha.vars.selected_text = selection;
        //chacha.highlight_suggestion(targ);
        var mouseX = (e.pageX || e.pageY) ? e.pageX : e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft
        var mouseY = (e.pageX || e.pageY) ? e.pageY : e.clientY + document.body.scrollTop + document.documentElement.scrollTop
        chacha.vars.mouse_position = [mouseX, mouseY - 23];
        chacha.show_question_mark();
      }else{
        chacha.vars.selected_text = false;
        chacha.hide_question_mark();
      }
    }
  },
  
  highlight_suggestion: function(targ){
    var html = targ.html();
        html = html.split(chacha.vars.selected_text);
        html = html[0] + "<span class='chacha_selection'>" + chacha.vars.selected_text + "</span>" + html[1];
    targ.html(html);
  },
  
  remove_highlight: function(){
    if(chacha.vars.selected_text){
      $('.chacha_selection').replaceWith(document.createTextNode(chacha.vars.selected_text));
    }
  },
  
  show_question_mark: function(){
    $("#chacha_questionmark").removeClass('chacha_question_loading');
    $("#chacha_questionmark").css({"left": chacha.vars.mouse_position[0], "top": chacha.vars.mouse_position[1]}).fadeIn();
    chacha.timers.question_mark = setTimeout("chacha.fade_question_mark()", 4000);
  },
  
  fade_question_mark: function(){
    $("#chacha_questionmark").fadeOut(200);
  },
  
  hide_question_mark: function(){
    $("#chacha_questionmark").hide();
  },
  
  look_up_question: function(question){
    chacha.vars.is_searching = true;
    var url = chacha.vars.root + "search?query=" + escape(question) + "&callback=?";
    $.getJSON(url, function(data){
      chacha.vars.results = data.qvpResults;
      chacha.vars.current_result = 0;
      chacha.display_navigation();
      chacha.position_container();
      chacha.display_results();
      chacha.vars.is_searching = false;
      
      $(".chacha_help").removeClass("chacha_help_loading")
    });
  },
  
  position_container: function(){
    var qm = $("#chacha_questionmark")
    var top = parseInt(qm.css("top"));
    var left = parseInt(qm.css("left"));
    var width = parseInt(qm.css("width"));
    var padding_horizontal = parseInt(qm.css("padding-left")) + parseInt(qm.css("padding-right"));
    var container_left = (width + left + padding_horizontal) - parseInt($("#chacha_container").css("width"));
    $("#chacha_container").css({"left": container_left, "top": top});
  },
  
  hide_results: function(){
    $("#chacha_container").fadeOut();
  },
  
  display_navigation: function(){
    
    var html = ""
        html += "<div class='chacha_btn' id='chacha_prev_result_btn'></div>"
        html += "<div id='chacha_result_navigation'>"
        html += "  <span id=\"chacha_current_result\">1</span>&nbsp;of&nbsp;" + chacha.vars.results.length;
        html += "</div>"
        html += "<div class='chacha_btn' id='chacha_next_result_btn'></div>"
        html += "<div class='chacha_btn' id='chacha_results_expander'></div>"
        html += "<div class='chacha_btn' id='chacha_results_close_btn'></div>"
        html += "<br style='clear:both;'/>"
    $("#chacha_result_title").html(html);
  },
  
  display_results: function(){
    chacha.fade_question_mark();
    var a = chacha.vars.results[chacha.vars.current_result].answer,
        q = chacha.vars.results[chacha.vars.current_result].question;
    $("#chacha_result_content").html("<p id='chacha_answer'>" + a.answer + chacha.display_guide_content(a) + "</p>")
    $("#chacha_suggestion").html("<span class=\"chacha_question_start\">Q:</span> " + q.suggestion)
    $("#chacha_container").fadeIn();
  },
  
  display_guide_content: function(a){
    if(a.guideHandle != "notforuse"){
      return " (via <a href='http://www.chacha.com/guide/" + a.guideHandle + "' target='blank'>" + a.guideHandle + "</a>, " + a.guideRating + ")";
    }else{
      return "";
    }
  },
  
  next_results: function(){
    chacha.vars.current_result++;
    if(chacha.vars.current_result >= chacha.vars.results.length){
      chacha.vars.current_result = 0;
    }
    $("#chacha_current_result").html(chacha.vars.current_result + 1);
    chacha.display_results();
  },
  
  prev_results: function(){
    chacha.vars.current_result = chacha.vars.current_result - 1;
    if(chacha.vars.current_result == -1){
      chacha.vars.current_result = chacha.vars.results.length - 1;
    }
    $("#chacha_current_result").html(chacha.vars.current_result + 1);
    chacha.display_results();
  }
}
