function loadEmailForm(formid, subject, url, itemid) {
  formid=(isUndefinedOrNull(formid)) ? getEmailThisFormID() : formid;
  logDebug(formid);
  
  var jplace=$j('#emailformwrapper');
  place='emailformwrapper';
  if (jplace.length == 0) {
    jplace=$j("<div id=\"emailformwrapper\"></div>").appendTo("body");
  }
  logDebug("place: ", place);
  subject=(isUndefinedOrNull(subject)) ? getEmailThisTitle() : subject;
  url=(isUndefinedOrNull(url)) ? getEmailThisURL() : url;
  itemid=(isUndefinedOrNull(itemid)) ? getEmailThisID() : itemid;   
  var def=doSimpleXMLHttpRequest('/inc/js/templates/emailform.tmpl');
  def.addCallback(function(req) {
    var txt=req.responseText;
    txt=txt.replace(/\$\{subject\}/g, subject);
    txt=txt.replace(/\$\{formid\}/g, formid);
    txt=txt.replace(/\$\{url\}/g, url);
    jplace.hide().html(txt).show('slow');
    $j('#emailthis_cancel' + formid).click(function() {
      jplace.hide().html('').remove();
      return false;
    });
    $j('#emailform'+formid).submit(function() {
      send_email('emailform'+formid, url, subject, itemid, jplace);
      return false;
    });
  });
  def.addErrback(function(err) {
    logError("couldn't load email form: ", err, err.number);
  });
  return false;
}


function get_error_field(formid, fieldname) {
   var t= "error_"+fieldname+formid;
   if (! getElement(t)) {
     logDebug("not found: ", t);
   }
   return t;
}

function send_email(formid, url, title, itemid, topplace) {
  logDebug("in send_email");	
  var data=formContents(formid);
  var formcode = formid.slice(9);
  var error_div = "emailthis_error"+formcode;
  var wrapper_div = "emailthis_wrapper"+formcode;
  var ind=findValue(data[0], 'addressees');
  data[1][ind] = filter(null, map(trimstring, filter(null, data[1][ind].split(/[,\s]+/))));
  if (itemid) {
     data[0].push('item_id');
     data[1].push(itemid);
  }
  logDebug("survived: ", data);
  var obj=form_to_obj(data);
  obj.url=url;
  obj.page_title=title;
  $j('#emailformwrapper .emailerror').html('');
  var df=postJSON('/api/emailthis/send', obj);
  df.addCallback(function(req) {
    topplace.html("<br /><div class='emailthis_notice'>Your email has been sent.</div>");
    callLater(5, function() {topplace.hide('slow', function() {topplace.remove();});});
    logDebug('showed message');
      if (window.urchinTracker) {
         window.urchinTracker('/api/emailthis/send');
      } else {
        logDebug("urchin not available");
      }
    });
  df.addErrback(function(err) {
    var data;
    var head_check = err.req.getResponseHeader("Content-Type");
    if (head_check && head_check.match(/json/)) {
        data = evalJSONRequest(err.req);
    } else {
        data={"top" : err.req.responseText};
    }
    switch(err.number) {
    case 400:
       var message="There was a problem submitting your email.";
       if (data.top) {
          message+="<br />"+data.top;
       }
       for (var field in data) {
        if (field != 'top') {
          var place=$(get_error_field(formcode, field));
          if (place) {
            var msg=data[field];
        
            if (isArrayLike(msg)) {
              msg=reduce(function(x,y) {return x+"<br /> "+y;}, filter(null, msg));
            }
            place.innerHTML=msg;
          }
        }
       }
       $(error_div).innerHTML=message;
       break;
    default:
      $(error_div).innerHTML="<br /><div class='emailthis_notice'>There was a problem submitting your email. Please try again.</div>";
     }
   });
  return false;
}

function getEmailThisTitle() {
  return (window.clickTitle) ? window.clickTitle : document.title;
}

function getEmailThisID() {
  return (window.clickID) ? window.clickID : null;
}

function getEmailThisURL() {
  return (window.clickURL) ? window.clickURL : document.location.href;
}


function getEmailThisFormID() {
  return getEmailThisID() || "_default";
}
