function getHelpLinks(){
  var help_links = YAHOO.util.Dom.getElementsByClassName('whats_this', 'a', document);
  return help_links;
}

function setPosition(box,link){
  var y = getPixFromTop(link) + link.offsetHeight + 3;
  var x = (getPixFromLeft(link) - 400);

  while(y > window.screen.availHeight - 300){
    y -= 10;
  }

  while(x < 10){
    x += 10;
  }

  box.style.top = y + 'px';
  box.style.left = x + 'px';
}

function hideSelects(box){
  //ie code for initial intersection with slects will go here
  if(window.navigator.userAgent.indexOf('MSIE 6') != -1){
      var cur_target = null;
      var select_elements = document.getElementsByTagName('select');

      var box_coords = new Array();
      box_coords['top'] = getPixFromTop(box);
      box_coords['left'] = getPixFromLeft(box);
      box_coords['right'] = box_coords['left'] + box.offsetWidth;
      box_coords['bottom'] = box_coords['top'] + box.offsetHeight;

      var target_coords = new Array();

      for(var i = 0; i < select_elements.length; i++){
	cur_target = select_elements[i];

	target_coords['top'] = getPixFromTop(cur_target);
	target_coords['left'] = getPixFromLeft(cur_target);
	target_coords['right'] = target_coords['left'] + cur_target.offsetWidth;
	target_coords['bottom'] = target_coords['top'] + cur_target.offsetHeight;

	if(
	  ((box_coords['top'] <= target_coords['bottom']) && 
	    (box_coords['bottom'] >= target_coords['top'])) 
	  &&
	  ((box_coords['left'] <= target_coords['right']) &&
	    (box_coords['right'] >= target_coords['left']))
	  ){
	    cur_target.style.display='none';
	  }

      }
  }

}

function showWhatsThis(e){
  try{
    var target_id = this.className.match(/whats_this_\d+/);
    var target = document.getElementById(target_id);
    
    if(!target){
      return true; //just fire link
    }

    target.style.display="block";

    setPosition(target,this);
    
    //if IE6, need to initially hide select elements on the page if intersecting
    hideSelects(target);

    //don't follow link
    YAHOO.util.Event.preventDefault(e);
    return false;
  }
  catch(e){
//    alert(e);
  }
}

function getText(element){
  if(element.textContent){
    return element.textContent;
  }
  else if(element.text){
    return element.text;
  }
  else if(element.innerText){
    return element.innerText;
  }
  else{
    if(typeof(element.firstChild.nodeValue) == 'string'){
      return element.firstChild.nodeValue;
    }
    else{
      throw('couldn\'t find text node');
    }
  }
}

function writeBoxContent(rx){
  try{
    if(!rx.responseXML){
      throw('no response xml found');
    }
    if(!rx.responseXML.documentElement){
      throw('document node not found');
    }    
    var faq = rx.responseXML.documentElement;
    if(faq.nodeName == 'parsererror'){
      throw(getText(faq));
    }
    var element_id = faq.getAttribute('rx_element');
    var curelement = null;
    var q_header = document.createElement('h1');
    var a_div = document.createElement('div');

    for(var i = 0; i < faq.childNodes.length; i++){
      curelement = faq.childNodes[i];
      switch(curelement.tagName){
	case 'question':
	  q_header.innerHTML = unescape(getText(curelement));
	  break;
	case 'answer':
	  a_div.innerHTML = unescape(getText(curelement));
	  break;
	}
    }

    var whats_this = document.getElementById(element_id);

    //remove "loading" text
    var loading = whats_this.getElementsByTagName('h1')[0];
    whats_this.removeChild(loading);

    whats_this.appendChild(q_header);
    whats_this.appendChild(a_div);

  }
  catch(e){
    handleBadContent(rx);
  }
}

function handleBadContent(rx){
  //in the event of failure, just undo all the what's this links so they revert to normal links
  var help_links = getHelpLinks();
    for(var i = 0; i < help_links.length; i++){
      YAHOO.util.Event.removeListener(help_links[i],"click",whatsThis);
    }
}

function getFAQContent(href, id){
  // the id of the what's this box is passed through to the server side so that it comes back in the xml
  // this is so the callback function can easily find that id to write the content

  var faq_id = href.match(/support\/faq\/(\d+)\/$/);
  if(!faq_id || !faq_id[1]){
    throw('couldn\'t parse faq id from href');
    return false;
  }
  else{
    faq_id = faq_id[1];
  }

  //asynch call for content
  var url = '/api/faq/';
  var q_string = encodeURI('fid='+faq_id+'&eid='+id);
  var boxCallBack = {
    success: writeBoxContent,
    failure: handleBadContent
  }
  var rx = YAHOO.util.Connect.asyncRequest('POST', url, boxCallBack, q_string);
}

function buildWhatsThis(element,i){
  var id = 'whats_this_' + i;

  //if the element currently exists in the DOM,
  //(could happen with other ajax calls)
  //we don't need to create it
  var whats_this = document.getElementById(id);
  if(!whats_this){
    var whats_this = document.createElement('div');
    whats_this.id = id;
    document.body.appendChild(whats_this);
  }

  whats_this.className = 'whats_this';
  YAHOO.util.Dom.addClass(whats_this, 'overlay');
  
  getFAQContent(element.href, whats_this.id);

  whats_this.innerHTML = '<p class="close_box"><a class="close" href="">[close]</a><h1>Loading...<br /><img src="/images/icons/loader.gif" alt="Loading"/></h1></p>';


  //power close link
  var links = whats_this.getElementsByTagName('a');
  var curlink = null;
  for(var j = 0; j < links.length; j++){
    curlink = links[j];
    if(curlink.className == 'close'){
      curlink.onclick = function(){
	var whats_this_div = null;
	var parent_node = this.parentNode;
	while(!whats_this_div){
	  whats_this_div = parent_node;
	  if(whats_this_div.id.indexOf('whats_this_') == -1){
	    whats_this_div = null;
	  }
	  parent_node = parent_node.parentNode;
	}
	whats_this_div.style.display = 'none';
	showAllSelectLinks();
	return false;
      }
    }
  }

  //make dragable
  YAHOO.util.DDM.mode = YAHOO.util.DDM.INTERSECT;
  var movable_box = new YAHOO.util.DD(whats_this.id);
  movable_box.addInvalidHandleType('p');
  movable_box.addInvalidHandleType('a');
  movable_box.addInvalidHandleType('form');

  //last piece of the puzzle - hide option elements when draged over
  //this is for IE6 only
  setHideSelectElements(movable_box);
}

function showAllSelectLinks(){
    if(window.navigator.userAgent.indexOf('MSIE 6') != -1){
      var select_elements = document.getElementsByTagName('select');
      for(var i = 0; i < select_elements.length; i++){
	select_elements[i].style.display = 'inline';
      }
  }
}

function setHideSelectElements(movable_box){
    if(window.navigator.userAgent.indexOf('MSIE 6') != -1){
      var select_elements = document.getElementsByTagName('select');
      var curelement = null;
      var dd_target = null;
      for(var i = 0; i < select_elements.length; i++){
	curelement = select_elements[i];
	if(!curelement.id){
	  curelement.id = 'select_element_'+i;
	}
	dd_target = new YAHOO.util.DDTarget(curelement.id);
	//for the following event handlers, id is a yahoo object that refers to the
	//target of the DD event, and contains an array of objects; the id property of the 0th object is the element id
	movable_box.onDragEnter = function(e, id){
	  document.getElementById(id[0].id).style.display = 'none';
	}
	movable_box.onDragOut = function(e, id){
	  document.getElementById(id[0].id).style.display = 'inline';
	}
      }
    }

}

function initWhatsThis(){
  try{
    var help_links = getHelpLinks();
    if(help_links.length < 1){
      throw('no help links found on page');
      return false;
    }

    for(var i = 0; i < help_links.length; i++){
      YAHOO.util.Event.addListener(help_links[i],"click",showWhatsThis);
      buildWhatsThis(help_links[i],i);
      help_links[i].className += ' whats_this_'+i;
    }

  }

  catch(e){
    //alert(e);
  }
}

try{
  YAHOO.util.Event.addListener(window, "load", initWhatsThis);
}
catch(e){
//  alert(e);
}

