  /**
                  ITI Internetworking Technologies Inc. 
                  http://www.CanadianDomainRegistry.ca
                  Author: Glen M. Arason
                  ELinks --at-- ITIStudios --dot-- ca
   
                            ELinks.js
                    < ELinksJSVersion = "1.0" >
                    
                  Instructions/Usage 
                  http://www.CanadianDomainRegistry.ca/contrib/elinks/elinks.htm
    
                  Free to use and distribute but please leave this header in tact.
  */
  var eLinkTag = "span"; // The HTML tag you choose must include a closing tag. (do not use a wild card such as "*")
  var eLinkClassName = "elink"; // This the class name to search for.
  var eLinkHostNames = new Array("www"); // an array of your hostnames. eg. eLinkHostNames = ["www","webmail","otherhostname"];
  var eLinkDisplayClass = "";
  var eLinkToolTip = false;  
  var eLinkDefaultDomain = document.domain;
  var eLinkAlerts       = false;
  var eLinkProcessTime  = false; 
  var eLinkAliasDomains = new Array();
  function ELinks(){
    if(eLinkProcessTime===true){var iniTime=new Date();}
    var eLinkElements=document.getElementsByTagName(eLinkTag);
    var ml="mail"; var to="to"; var cn=":"; var eq = "=";
    for(i in eLinkElements){
      var thisObj=eLinkElements[i];
      if(thisObj.className == eLinkClassName && ELinkTrim(thisObj.title) != "") {
        var eHREF=linkText=subject=cc=bcc=body=eclass=""; 
        var attribs=thisObj.title.split(";");
        var ELinkErr=false;
        for(j in attribs){ 
          if(ELinkTrim(attribs[j]) != ""){
            var vp = attribs[j].split("=");
            var hrefData = ELinkTrim(vp[0]);
            if(vp.length == 1){
              vp[1] = hrefData;
              if(eHREF == "") { hrefData = "to";}
              else if(cc == "") { hrefData = "cc";}
              else if(bcc == "") { hrefData = "bcc";}
              else ELinkErr = true;
            }
            var linkData = ELinkTrim(vp[1]);
            if(linkData != ""){
              switch(hrefData.toLowerCase()) {
                case "to":   if(eHREF == "") eHREF = ELinkAddress(linkData);else ELinkErr = true; break;
                case "cc":   if(cc == "") cc = "cc"+eq+ELinkAddress(linkData)+"&amp;";else ELinkErr = true; break;
                case "bcc":  if(bcc == "") bcc = "bcc"+eq+ELinkAddress(linkData)+"&amp;";else ELinkErr = true; break;
                case "linktext":
                case "text": if(linkText == "") linkText = linkData;else ELinkErr = true; break;
                case "subject": if(subject == "") subject = "subject"+eq+linkData+"&amp;";else ELinkErr = true; break;
                case "body":  if(body == "") body = "body"+eq+linkData;else ELinkErr = true; break;
                case "class": if(eclass == "") eclass = ELinkTrim(vp[1]);else ELinkErr = true; break;
                default: if(eLinkAlerts) alert("An unrecognized paramater ("+hrefData+") was found in link #"+(i*1+1)+".\n\nCheck the spelling.");
              }
            }
          }
        }
        if(eHREF != "" && ELinkErr == false){
          if(eclass == "") eclass = eLinkDisplayClass;
          else if(eclass.toLowerCase() == "none") eclass = "";
          eHREFplus = ml+to+cn+eHREF;
          if(subject!="" || cc!="" || bcc!="" || body!=""){
            eHREFplus += "?"+cc+bcc+subject+body;
            if(eHREFplus.substr(eHREFplus.length-5) == "&amp;") eHREFplus = eHREFplus.substring(0,eHREFplus.length-5);
          }
          if(linkText == "") linkText = eHREF;
          thisObj.title = '';
          if(thisObj.nodeName == "A") { 
            thisObj.innerHTML = linkText;
            thisObj.href = eHREFplus;
          }else {
            thisObj.innerHTML = linkText.link(eHREFplus);
            thisObj=thisObj.childNodes[0];
          }
          thisObj.className = eclass;
          if(eLinkToolTip == true) thisObj.title = eHREF;
        }else if(eLinkAlerts) {
            if(eHREF == "" && eHREF !== false){ alert("ELink class found with paramaters but no email recipient.\n\n\Check your link #"+(i*1+1)+" for a missing recipient paramater.");}
            else if(eHREF != false) alert("Multiple values or incorrect Value/Pair assignment found in link #"+(i*1+1)+".");
        }
      }
    }
    if(eLinkProcessTime===true) {
      var finishedTime=new Date();
      var diff=finishedTime-iniTime; //units is milliseconds
      alert("It took "+(diff/1000)+" seconds to convert all your ELinks."); // see how long it took to update all the links
    }
    return;
  }
  function ELinkAddress(name){
    var enameParts; var ename=false; var err=""; var virtual_domain;
    if(name.match(/@/)){
      if(eLinkAlerts) { alert("Incorrect email address formating.\n\n\An \"@\" sign was found in a parameter value.\n\nCheck  \"" +name + "\"  and replace the \"@\" symbol with a space.");}
    }else if(enameParts = name.split(" ")) {
      if(enameParts.length == 1){
        if(eLinkDefaultDomain == document.domain){
          virtual_domain = eLinkDefaultDomain.toLowerCase();  
          var vd = false;
          if(eLinkAliasDomains.length > 0){
            for(j in eLinkAliasDomains){ //alert(eLinkAliasDomains[j])
              if(eLinkAlerts){if(eLinkAliasDomains[j].search(/\./) !=  -1){ alert("A Domain name listed in the 'eLinkAliasDomains' array ("+eLinkAliasDomains[j]+") contains a dot.\n\nReplace all dots with spaces.");break;};}
              eLinkAD = ELinkTrim(eLinkAliasDomains[j].toLowerCase()).replace(/\s+/ , ".");
              if(virtual_domain.search(eLinkAD) != -1){
                virtual_domain = ELinkTrim(eLinkAliasDomains[j]).replace(/\s+/ , "."); // retain the format entered in the array
                vd = true;
                if(!eLinkAlerts) break; // if Alerts is on loop through all domains to make sure they are all formated correctly
              }
            }
          }
          if(vd !== true){
            for(j in eLinkHostNames){
              virtual_domain = virtual_domain.replace(eLinkHostNames[j].toLowerCase()+"." , "")
            }
          }
        }else{
          virtual_domain = ELinkTrim(eLinkDefaultDomain).replace(/\s+/ , ".");
        }
        ename = enameParts[0] + "@" + virtual_domain;
      }else if(enameParts.length == 2){
        if(eLinkAlerts) { alert("\t\tIncorrect number of Parmaters.\n\n\The variables \"to, cc and bcc\" accept either 1 or more than 2 parameters.\n\nCheck  \"" +name + "\"  and either add or remove one paramater.");}
      }else{
        if(eLinkAlerts){ // don't bother checking when alerts are off
          for(i in enameParts){
            if( i == 0){
              if(enameParts[i].match(/(^\.|\.$)/)) err = "The username in '"+name+"' contains either \na leading or trailing dot.\n\nCheck your ELink() and remove the dot."; 
              else if(enameParts[i].match(/\.{2,}/ )) err = "The username in '"+name+"' contains consecutive (repeating) dots.\n\nCheck your ELink() and remove the multiple dots."; 
            }else if(enameParts[i].indexOf(".") != -1 ) { 
              err = "The extention ("+enameParts[i]+") in \""+name+"\" contains a dot.\n\nCheck your ELink() and replace the dot with a space."; 
            }
          }
        }
        if(err == ""){
          ename = name.replace(/\s+/ , "@");
          ename = ename.replace(/\s+/g , ".");
        }else if(eLinkAlerts) alert(err);
      }
    }
    return ename;
  }
  function ELinkTrim(va){ return va.replace(/(^\s*|\s*$)/g ,""); }

