// namegen.js - support functions for NameThingy.com
// Mike Macgirvin 2008
// Contact: firstname at lastname dot com

var r = 0;
var g = 0;
var b = 0;

var speed = 2;
var delay = 1000;

var timer = null;
var holdid = 0;
var element = null;
var custom = '';
var seq = 0;
var nindex = 0;

var name1 = null;
var name2 = null;
var curr1 = null;
var curr2 = null;

var adult = false;
var munge = false;
var hfree = false;
var pause = false;
var maxlength = 0;
var style1 = 1;
var style2 = 2;

function makeRequestObject() {
  var http_request = false;

  if(window.XMLHttpRequest) {
    http_request = new XMLHttpRequest();
  } 
  else { 
    if(window.ActiveXObject) {
      try {
        http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } 
      catch(e) {
        try {
          http_request = new ActiveXObject("Microsoft.XMLHTTP");
        } 
        catch (e) {}
      }
    }
  }
  return http_request;
}


var xmldoc = null;
var currentdomain = null;

function getElementText(xmlobj,element) {
  if(xmlobj.getElementsByTagName(element)[0].text)
    result = xmlobj.getElementsByTagName(element)[0].text;
  else
    result = xmlobj.getElementsByTagName(element)[0].textContent;
  return result;
}

function whois_start(spanid,word1,word2,domain) {
  var whoisreq = makeRequestObject();
  if(whoisreq) {
     whoisreq.onreadystatechange = function() {
       do_whois(whoisreq,spanid,word1,word2,domain);
     }
     whoisreq.open("GET","whois.php?word1=" + word1 + "&word2=" + word2, true);
     whoisreq.send(null);
  }
}

function do_whois(whoisreq,spanid,word1,word2,domain) {

  if(whoisreq.readyState == 4) {
    var whoxml = whoisreq.responseXML;
    if(whoxml)
      var result = getElementText(whoxml,'value');
    else
      result = 255;

    // highlight hyphens

    domain = domain.replace('-','<span class="red"><strong>-</strong></span>');

    holddiv = document.getElementById(spanid);
    if(holddiv) {
      if(result == '1') {
        holddiv.innerHTML = '<span class="green" >&nbsp;- ' + domain + ' available</span>';
      }
      else {
        if(result == '255') {
          holddiv.innerHTML = '<span class="red" >&nbsp;(domain check timed out)</span>';
        }
        else {
          holddiv.innerHTML = '<span class="red" >&nbsp;(domain not available)</span>';

          // Domain wasn't available, but let's try a hyphen before giving up.
          // This is only for joined words which aren't already hyphenated or 
          // the result of dropped double letter merging, which we can easily
          // identify as the first letter of word2 won't be capitalized.

          if(word2.length) {
            var startch = word2.substr(0,1);
            if((startch != '-') && (startch.toLowerCase() != startch))
              whois_start(spanid,word1,'-' + word2,
                word1 + '-' + word2 + ".com");
          }
        }
      }
    }
  }
}

function pop_start(spanid,word1,word2) {
  var req = makeRequestObject();
  if(req) {
     req.onreadystatechange = function() {
       do_pop(this,spanid);
     }
     req.open("GET","pop.php?word1=" + word1 + "&word2=" + word2 ,true);
     req.send(null);
  }
}

function do_pop(req,spanid) {

  var result = 0;
  var popxml = null;

  if(req.readyState == 4) {
    popxml = req.responseXML;
    if(popxml)
      result = Number(getElementText(popxml,'value'));

    if(result) {
      var holddiv = document.getElementById(spanid);
      var popstr = '<span class="yellow">';
      for(var c = 0; c < result; c ++) {
        popstr += '*';
      }
      popstr += '</span>';
      if(holddiv) {
        holddiv.innerHTML = popstr;
      }
    }
  }
}

// We have either run out of names or the options have been changed.
// Grab some more. The seq and rand parameters help to prevent caching by
// an unnamed sucky browser.

function get_more() {
  xmldoc = makeRequestObject();
  var params = "?style1=" + style1 + "&style2=" + style2;
  if(maxlength)
    params = params + "&length=" + maxlength;
  if(adult)
    params = params + "&adult=1";
  if(munge)
    params = params + "&munge=1";
  if(custom.length)
    params = params + "&custom=" + custom;
  seq ++;
  params = params + "&seq=" + seq + '&rand=' + Math.random();
  if(xmldoc) {
    xmldoc.onreadystatechange = load_names;
    xmldoc.open("GET", "getnames.php" + params, true);
    xmldoc.send(null);
  }
}

function load_names() {
  if(xmldoc.readyState == 4) {
    contents = xmldoc.responseXML;
    name1 = getElementText(contents,'name1').split(',');
    name2 = getElementText(contents,'name2').split(',');
    nindex = 0;
  }
}

function register_element(elem) {
  formreset();
  element = elem;
  var id = document.getElementById(element);
  id.style.color = "rgb(" + r +"," + g + "," + b + ")";
  get_more();
  update_element();
}

function update_element() {

  // if necessary, wait for names to load.
  if(name1 == null) {
    setTimeout('update_element();',100);
    return;
  }

  curr1 = name1[nindex];
  curr2 = name2[nindex];

  if((curr1 == null) || (curr1 == '') || (curr2 == null) || (curr2 == '')) {
    setTimeout('update_element();',100);
    return;
  }

  if(style2 == 99)
    curr2 = '';

  var id = document.getElementById(element);
  id.innerHTML = curr1 + ' ' + curr2;
  nindex ++;
  if ((nindex > 49)
    || (name1[nindex] == null) || (name1[nindex] == '') 
    || (name2[nindex] == null) || (name2[nindex] == '')) {
    nindex = 0;
    get_more();
  }
  timer = setTimeout('fadein();',5);
}

function fadeout() {
  if(pause)
    return;
  var id = document.getElementById(element);
  r = (((r + speed) < 255) ? r + speed : 255);
  g = (((g + speed) < 255) ? g + speed : 255);
  b = (((b + speed) < 255) ? b + speed : 255);

  if((r != 255) && (g != 255) && (b != 255)) {
    timer = setTimeout('fadeout();',10);
  }
  else
    update_element();
  id.style.color = "rgb(" + r + "," + g + "," + b + ")";
}

function fadein() {
  var id = document.getElementById(element);
  r = (((r - speed) > 0) ? r - speed : 0);
  g = (((g - speed) > 0) ? g - speed : 0);
  b = (((b - speed) > 0) ? b - speed : 0);

  if(r && g && b) {
    timer = setTimeout('fadein();',10);
  }
  else {
    timer = setTimeout('fadeout();',delay);
    if(hfree)
      hold_name();
  }

  id.style.color = "rgb(" + r + "," + g + "," + b + ")";
}


function hold_name() {

  // Pause everything momentarily whilst we do our stuff.

  if(timer)
    clearTimeout(timer);

  if((curr1 && curr2) || (curr1 && (style2 == 99))) {
    var word1 = curr1;
    var word2 = curr2;
    var newdomain = word1 + word2 + ".com";

    // avoid repeated requests for the same name

    if(newdomain != currentdomain) {
      holdelem = document.getElementById('hold');
      if(holdelem) {
        holdelem.innerHTML = holdelem.innerHTML 
          + "<span class=\"rate\" id=\"a" + holdid + "\">&nbsp;</span>"
          + "<span class=\"held\">" + word1 + ' ' + word2 + "</span>"
          + " <span class=\"whois\" id=\"b" + holdid + "\"></span>"
          + "<span class=\"clear\"></span><br />\r\n";
        holdelem.scrollTop = holdelem.scrollHeight;
        currentdomain = newdomain;
        whois_start("b" + holdid,word1,word2,newdomain);
        pop_start("a" + holdid,word1,word2);
        holdid ++;
      }
    }
  }

  // If duplicated letters are caused when combining
  // words - e.g. 'CrazyYvette', strip the duplicate - e.g. 'Crazyvette' 
  // and recurse so as to check both names.

  if((curr1.length && curr2.length) 
    && (curr1.toUpperCase().substr((curr1.length - 1),1) == curr2.substr(0,1))) {
    curr2 = curr2.substr(1);
    hold_name(); 
  }
  else
    // This name has been selected. We may have been fading in, or we may 
    // have been delaying, or we may have been fading out. Whatever is the case,
    // we need a bit of time to process our XML requests or everything gets
    // real crazy real fast. Hold momentarily and then fade away, starting from 
    // wherever we happened to be when we got here. 
 
    timer = setTimeout('fadeout();',delay);
}

// You like nasty? OK. Not every word type supports this incidentally.
// It's just a guideline or preference when available. 

function toggle_adult() {
  adult = ((adult) ? false : true );
  get_more();
}

// randomly introduce spelling mitskaes and faty finghers

function toggle_munge() {
  munge = ((munge) ? false : true );
  get_more();
}

// Avoid the need to click every entry if that's what you're trying to do.

function toggle_hfree() {
  hfree = ((hfree) ? false : true );
}

function toggle_play() {
  pause = ((pause) ? false : true);
  id = document.getElementById('control');
  if(pause)
    id.src="play.gif";
  else {
    id.src="pause.gif";
    fadeout();
  }
}

function get_val(elem) {
  var idx = elem.selectedIndex;
  return elem.options[idx].value;
}

function use_first(f) {
  style1 = get_val(f);
  get_more();
}

function use_second(f) {
  style2 = get_val(f);
  get_more();
}

function set_length(f) {
  maxlength = get_val(f);
  get_more();
}

function set_speed(f) {
  speed = Number(get_val(f));
  if(speed < 1)
    speed = 1;
  delay = ( 1 / speed ) * 2000;
}

// Here lie dragons...
// An unnamed sucky browser insists on remembering form changes
// across page reloads, even though the javascript values have
// been reset. This leads to confusion, so we reset everything
// to default values manually to make sure a page reload starts 
// fresh and with our forms in a known state.

function formreset() {
  id = document.getElementsByName('style1');
  id[0].options[0].selected=true;
  id = document.getElementsByName('style2');
  id[0].options[1].selected=true;
  id = document.getElementsByName('length');
  id[0].options[5].selected=true;
  id = document.getElementsByName('speed');
  id[0].options[1].selected=true;
  id = document.getElementById('custom');
  id.value = '';
  id = document.getElementsByName('adult');
  id[0].checked = false;
  id = document.getElementsByName('munge');
  id[0].checked = false;
  id = document.getElementsByName('hfree');
  id[0].checked = false;
  pause = false;
  id = document.getElementById('control');
  id.src="pause.gif";

}



function get_custom() {
  var txtobj = document.getElementById('custom');
  custom = txtobj.value.replace(/\W/g,'');
  if(custom.length)
    custom = custom.substr(0,1).toUpperCase() 
      + custom.substr(1,64).toLowerCase();
  get_more();
}

function openClose(theID) {
  if(document.getElementById(theID).style.display == "block") { 
    document.getElementById(theID).style.display = "none" 
  }
  else { 
    document.getElementById(theID).style.display = "block" 
  } 
}

function select_all(elem) {
  if(window.getSelection) {
    var sel = window.getSelection();
    var range = document.createRange();
    range.selectNodeContents(elem);
    sel.removeAllRanges();
    sel.addRange(range);
  } 
  else { 
    if (document.selection) {
      document.selection.empty();
      var range = document.body.createTextRange();
      range.moveToElementText(elem);
      range.select();
    }
  }
}