// JavaScript Document

var quahay = quahay || {};

quahay.Hosts = (function(){
  var host, scripts = document.getElementsByTagName("script");
  
  for (var i = 0, script; script = scripts[i]; i++) {
    host = script.src && /^(.+\.quahay.com)\/lib\/javascript\.js/.test(script.src) ? RegExp.$1 : '';
    if (host) { break };
  };

  return {
    imageHost: host,
    jsHost: host,
    cssHost: host
  }
})();


(function(){
  
  var windowLoaded = false;
  var document_scripts;
  
  if (window.addEventListener) {
    window.addEventListener ("load", function(){ windowLoaded = true }, false);
  } else if (window.attachEvent) {
    window.attachEvent ("onload", function(){ windowLoaded = true });
  }
  
  function scriptLoaded(src) {
    document_scripts = document_scripts || {};
    
    if (document_scripts[src]) { return true; }
    else {
      var script_tags= document.getElementsByTagName("script");
      for (var i = 0, script; script = script_tags[i]; i++) {
        if(script.src) { document_scripts[script.src] = 1; }
      };
      if (document_scripts[src]) { return true; }
      else { return false; }
    }
    
  }

  quahay.require = function(file, callback) {
    
    if (windowLoaded) { throw('Cannot require file, document is already loaded'); }  

    var url = file.indexOf('/') == 0 ?  quahay.Hosts.jsHost + file : file;
    var force = arguments[arguments.length - 1] === true;
    var needsCallbackScriptTag;
    
    if (force || !scriptLoaded(url)) { 
      document.write('<script src="' + url + '" type="text/javascript" charset="utf-8" onerror="throw(\'quahay.require: An error occured: \' + this.src)"><\/script>');
      document_scripts[url] = 1;
      needsCallbackScriptTag = true;
    }

    if (typeof callback == 'function') {

      if (document.addEventListener) {
        if (needsCallbackScriptTag) { 
          document.write('<script type="text/javascript" charset="utf-8">(' + callback.toString() + ')();<\/script>');
        }
        else {
          window.setTimeout(function(){
            callback()
          }, 0)
        }
      }
      else {
        quahay.require.callbacks = quahay.require.callbacks || [];
        quahay.require.callbacks.push(callback);
        quahay.require.callbacks.count = (++quahay.require.callbacks.count) || 0;
        document.write("<script id=__onAfterRequire" + quahay.require.callbacks.count + " src=//:><\/script>");
        document.getElementById("__onAfterRequire" + quahay.require.callbacks.count).onreadystatechange = function() {
          if (this.readyState == "complete") {
            this.onreadystatechange = null;
            (quahay.require.callbacks.pop())();
            this.parentNode.removeChild(this);
          }
        };
      }

    }

  };
})();


quahay.require("http://graphics8.nytimes.com/js/app/lib/prototype/1.6.0.2/prototype.js", function(){quahay.WordReference.initialize();});

quahay.WordReference = (function(){
  
  var selection, selectionText, selectionButton, newRange;   

  function wordCount(inStr) {
    var wc;
    wc = inStr && inStr.replace(/[^\s\w]+/g, "");           // get rid of punctuation
    wc = wc && wc.replace(/^\s*/, "").replace(/\s*$/, "");  // trim
    wc = wc && wc.length && wc.split(/\s+/).length;         // split & count
    return Number(wc);
  }

  function handleClick(event) {
    if (selectionButton){
      cleanUp();
    }
    
    selection = getSelection();
    selectionText = selection && selection.toString();
    if (selectionText) {
      window.setTimeout(insertButton, 0);
      event.stop();
    }
  }
  
  function getSelection() {
    return Try.these(
      function() { return window.getSelection() },
      function() { return document.getSelection() },
      function() { 
        var selection = document.selection && document.selection.createRange();
        selection.toString = function() { return this.text };
        return selection;
      }
    ) || false;
  }
  
  function insertButton() {
    
    selectionButton = new Element(
        'span', {
          'className':'quahay_selection_button',
          'id':'quahay_selection_button',
          'title':'Tìm kiếm với Google',
          'style': 'margin:-20px 0 0 -20px; position:absolute; background:url(http://graphics8.nytimes.com/images/global/word_reference/ref_bubble.png);width:25px;height:29px;cursor:pointer;_background-image: none;filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="http://graphics8.nytimes.com/images/global/word_reference/ref_bubble.png", sizingMethod="image");'
        }
    )
      
    if (Prototype.Browser.IE) {
      var tmp = new Element('div');
      tmp.appendChild(selectionButton);
      newRange = selection.duplicate();
      newRange.setEndPoint( "StartToEnd", selection);
      newRange.pasteHTML(tmp.innerHTML);
      selectionButton = $('quahay_selection_button');
    }
    else {
      var range = selection.getRangeAt(0);
      newRange = document.createRange();
      newRange.setStart(selection.focusNode, range.endOffset);
      newRange.insertNode(selectionButton);
    }
    
    Element.observe(selectionButton, 'mouseup', exportSelection, true);
    
  }
  
  function cleanUp() {
    selection = null;
    selectionButton.stopObserving('mouseup', exportSelection);
    newRange && newRange.pasteHTML && newRange.pasteHTML('');
    newRange = null;
    selectionButton.remove();
    selectionButton = null;
    selectionText = '';
  }
  
  function exportSelection(event) {
    var url = 'http://www.google.com.vn/#hl=vi&q=' + encodeURIComponent(selectionText) + '+site%3Aquahay.com';
    var newwin = window.open(url,'answersdotcom','height=450,width=820,location=false,menubar=false,toolbar=false,status=false,resizable, scrollbars');
    if (newwin) newwin.focus();
    event.stop();
  }
  
  return {
    initialize: function() {
      document.observe('mouseup', handleClick, false);
    // need to do it this way because of IE
    document.getElementsByTagName("html")[0].oncopy =  handleCopy;
    }
  };
  
})();