

// VERSION 3.031015 // 

/*
  
  developed by Arthur Naylor, for CondeNet, October 2003 
  
*/ 


  function magnetFormsClass() { 
    
    // verify variables 
    this.prefix=""; // prefix to error message 
    this.suffix=""; // suffix to error message 
    this.names=new Array(); 
    this.messages=new Array(); 
    this.emailNames=new Array(); 
    this.emailMessages=new Array(); 
    
    // screen ages 
    this.duration=30; // minutes 
    this.current=2003; // current year 
    this.path=""; // optional path to prepend to query 
    this.dummy=null; // dummy parameter prefixed to actual value in query
    this.screen=false; // switch true/false 
    this.cookie=true; // switch true/false 
    this.identifier="AgeScreen"; // cookie name 
    this.ageNames=new Array("year","month","day"); // MUST BE THESE NAMES !!!
    this.minimum=18; // minimum age 
    this.ageMessage=""; // message if less than minimum 
    this.redirect=null; // redirect path 
    this.screening=null; // gateway age screen path 
    this.webdate=00000000; // yyyymmdd -- defaults to date on viewers' computers 
    this.months=new Array("January","February","March","April","May","June","July","August","September","October","November","December"); 
    this.dayTitlePostion=0; // position of title in option menu 
    this.monthTitlePostion=0; // position of title in option menu 
    this.yearTitlePostion=0; // position of title in option menu 
    
    // mnemonic variables 
    this.mnemonicsIdentifier="mnemonics"; // cookie name for mnemonics 
    this.permission=true; // off or on switch  
    this.recalls=new Object(); // name value pairs 
    this.forgets=new Array(); // forgettables 
    this.synonyms=new Array(); // synonyms 
    this.focus=true; // focus initial element  
    
  } // end 
  
  var verify=new magnetFormsClass(); 
  var mnemonics=new magnetFormsClass(); 




  // check for empty inputs ... 
  function emptyField(item) { 
    var text=/\w+/; 
    if(typeof item=="undefined") { return true; } 
    if(item==null) { return true; } 
    if(item=="") { return true; } 
    if(item.match(text)) { return false; } 
    return true; 
  } // end 
  magnetFormsClass.prototype.empty=emptyField; 

  
  
  // check for invalid email format ... 

  function invalidEmailFormat(item) { 
    var text=/\w+\@\w+[.]\w+/; 
    if(item.match(text)) { return false; } 
    return true; 
  } // end

  magnetFormsClass.prototype.invalid=invalidEmailFormat; 




  // check all reuired fields ... 
  function checkRequiredFields(formname) { 
    var message="", header="", footer=""; 
    var i=0, j=0, k=0; 
    var year="", month="", day="", birthdate=""; 
    var incomplete=false; 
    
    //alert(this.getAgeScreenCookie()); 
    
    // loop through inputs ... 
    allCheck: for(i=0; i < formname.length; i++) { 
      var current=formname.elements[i]; 
        
      // check through ages and values ...
      if(this.screen) { 
        ageCheck: for(l=0; l<3; l++) { 
          if(this.ageNames.length!=3) { break ageCheck; } 
          if(this.empty(this.ageNames[l])) { break ageCheck; } 
          if(this.ageNames[l]==current.name) { 
            if(this.empty(current.value)) { incomplete=true; } 
            else { 
	          if(current.name=="year") { year=current.value; } 
	          else if(current.name=="month") { month=current.value; } 
	          else if(current.name=="day") { day=current.value; } 
            } 
            continue allCheck; 
	      } 
        } 
      } 
        
      // check through emails and values ...
      emailCheck: for(l=0; l < this.emailNames.length; l++) { 
        if(this.emailNames[l]!=null && this.emailNames[l]!="") { 
          if(this.emailNames[l]==current.name) { 
            if(this.empty(current.value)  || this.invalid(current.value)) { 
              message=message+this.emailMessages[l]+"  \n"; 
            } 
            continue allCheck; 
	      } 
	    } 
      }  
	
      // check through names and values ...
      inputCheck: for(j=0; j < this.names.length; j++) { 
        if(this.names[j]==null || this.names[j]=="") { continue inputCheck; } 
        if(this.names[j]==current.name) { 
        
        
	    // text fields ...
	      if(current.type=="text" || current.type=="textarea") { 
	        if(this.empty(current.value)) { 
              message=message+this.messages[j]+"  \n"; 
            } 
            continue allCheck; 
          } 
          
	      // radio buttons ... 
	      else if(current.type=="radio") { 
            var one=true; 
            if(current.value==formname[current.name][0].value) { 
              radioCheck: for(k=0; k < formname[current.name].length; k++) { 
                if(formname[current.name][k].checked) { 
                  one=false; 
                  break radioCheck; 
                } 
              }  
              if(one) { message=message+this.messages[j]+"  \n"; } 
            } 
            continue allCheck; 
          }  
	    
          // select option menus ... 
          else if(current.type=="select-one" || current.type=="select-multiple") { 
            var one=true; 
            if(formname[current.name].selectedIndex!=-1 && formname[current.name].options[formname[current.name].selectedIndex].value!="") { 
              one=false; 
            } 
            if(one) { message=message+this.messages[j]+"  \n"; }  
            continue allCheck; 
          }  
          
        }  
      }  
    } 
	
    if(incomplete) { message=message+this.ageMessage+"  \n"; } 
    if(message!="") { 
	  if(this.prefix!=null) { header=this.prefix+"  \n"; } 
      if(this.suffix!=null) { footer="\n"+this.suffix; } 
      alert("\n"+header+message+footer+"  \n"); 
      return false; 
    } 
    else if(this.screen) { 
      birthdate=birthdate.concat(year,month,day); 
      if(this.checkAge(birthdate)) { return true; } 
      return false; 
    } 
    return true;  
  
  } // end function 
  magnetFormsClass.prototype.check=checkRequiredFields; 




  
  
  // check for minimum age ... 
  function checkAge(item) { 
    var webdate=""; 
    var year=0000, month=00, day=00; 
    if(this.webdate>0) { webdate=this.webdate; } 
    else { 
      var date=new Date(); 
      year=date.getUTCFullYear(); 
      month=date.getUTCMonth()+1; 
      if(month<10) { month="0"+month; } 
      var day=date.getUTCDate(); 
      if(day<10) { day="0"+day; } 
      webdate=webdate.concat(year,month,day); 
    } 
    var cookie=this.getAgeScreenCookie(); 
    if(cookie=="ineligible"&&this.redirect!=null) { location=this.redirect; } 
    else { 
      var differential=webdate-item;  
      if(this.minimum*10000>differential+1) { return(this.sorryRedirect()); } 
      else { return(this.successRedirect()); } 
    } 
  } // end 
  magnetFormsClass.prototype.checkAge=checkAge; 

  
  function sorryRedirect() { 
    this.setAgeScreenCookie("ineligible"); 
    if(this.redirect!=null) { 
      location=this.redirect; 
    } 
  } // end 
  magnetFormsClass.prototype.sorryRedirect=sorryRedirect; 

  
  function successRedirect() { 
    this.setAgeScreenCookie("eligible"); 
    var query=location.search; 
    if(query!="") { 
      if(this.dummy) { 
        var dummy=this.dummy; 
        query=query.substring( query.indexOf(this.dummy) + dummy.length - 1 ); 
      } 
      location=this.path+query.substring(1); 
      return false; 
    } 
    return true; 
  } // end 
  magnetFormsClass.prototype.successRedirect=successRedirect; 
  
  
  
  
  
  
  
  // check for previous cookie ... 
  function checkForAgeScreenCookie() { 
    var query=location.search; 
    if(this.screen&&query!="") { 
      var cookie=this.getAgeScreenCookie(); 
      if(cookie=="eligible") { 
        if(this.dummy) { 
          var dummy=this.dummy; 
          query=query.substring( query.indexOf(this.dummy) + dummy.length - 1 ); 
        } 
        location=this.path+query.substring(1); 
      } 
      else if(cookie=="ineligible"&&this.redirect!=null) { location=this.redirect; } 
      else if(this.screening!=null) { location=this.screening+query; } 
    } 
  } // end 
  magnetFormsClass.prototype.eligiblity=checkForAgeScreenCookie; 
  
  
  
  
  
  
  
  // generate age screen option menus ... 
  function assembleMonths() { 
    var months="";
    months=months+"<select class=\"birthdate\" name=\"month\">"; 
    for(i=0; i<12; i++) { 
      var value=i+1; 
      if(i<10) { value="0"+value; } 
      if(i==this.monthTitlePostion) { months=months+"<option class=\"birthdate\" selected=\"selected\">Month</option>"; } 
      months=months+"<option value=\""+value+"\">"+this.months[i]+"</option>"; 
    } 
    months=months+"</select>"; 
    document.write(months); 
  } // end 
  magnetFormsClass.prototype.assembleMonths=assembleMonths; 
  
  
  function assembleDays() { 
    var days="";
    days=days+"<select class=\"birthdate\" name=\"day\">"; 
    for(i=0; i<31; i++) { 
      var value=i+1; 
      if(i<9) { value="0"+value; } 
      if(i==this.dayTitlePostion) { days=days+"<option class=\"birthdate\" selected=\"selected\">Day</option>"; } 
      days=days+"<option value=\""+value+"\">"+value+"</option>"; 
    } 
    days=days+"</select>"; 
    document.write(days); 
  } // end 
  magnetFormsClass.prototype.assembleDays=assembleDays; 
  
  
  function assembleYears() { 
    var years="";
    years=years+"<select class=\"birthdate\" name=\"year\">"; 
    for(i=0; i<100; i++) { 
      if(i==this.yearTitlePostion) { years=years+"<option class=\"birthdate\" selected=\"selected\">Year</option>"; } 
      years=years+"<option value=\""+(this.current-i)+"\">"+(this.current-i)+"</option>"; 
    } 
    years=years+"</select>"; 
    document.write(years); 
  } // end 
  magnetFormsClass.prototype.assembleYears=assembleYears; 
  
  
  function assembleBirthdate() { 
    var birthdate=""; 
    document.write("<table cellpadding=\'0\' cellspacing=\"0\" class=\"birthdate\"><tr>"); 
    document.write("<td><div class=\"birthdate\">"); 
    this.assembleMonths(); 
    document.write("</div></td>"); 
    document.write("<td><div class=\"birthdate\">"); 
    this.assembleDays(); 
    document.write("</div></td>"); 
    document.write("<td><div class=\"birthdate\">"); 
    this.assembleYears(); 
    document.write("</div></td>"); 
    document.write("</tr></table>");
  } // end 
  magnetFormsClass.prototype.assembleBirthdate=assembleBirthdate; 







  // set cookie for variable duration ...
  function setAgeScreenCookie(vl) { 
    var date=new Date( (new Date()).getTime() + this.duration*3600000/60 ); 
    document.cookie=this.identifier+"="+escape(vl)+"; expires="+date.toGMTString()+"; path=/; "; 
  } // end 
  magnetFormsClass.prototype.setAgeScreenCookie=setAgeScreenCookie; 


  // returns cookie for this slideshow ... 
  function getAgeScreenCookie() { 
    var offset=0, point=0, finish=0; 
    var cookie=document.cookie; 
    var name=this.identifier+"="; 
    var value=null; 
    while(offset < cookie.length) { 
      point=offset+name.length; 
      if(cookie.substring(offset,point)==name) { 
        finish=cookie.indexOf(";",point); 
        if(finish < 0) { finish=cookie.length; } 
        value=unescape(cookie.substring(point,finish)); 
      } 
      offset=cookie.indexOf(" ",offset)+1; 
      if(offset==0) { break; } 
    } 
    return value; 
  } // end 
  magnetFormsClass.prototype.getAgeScreenCookie=getAgeScreenCookie; 


  // delete cookie for this slideshow ... 
  function deleteAgeScreenCookie() { 
    document.cookie=this.identifier+"=; expires=Fri, 02-Jan-1970 00:00:00 GMT; path=/;"; 
  } // end 
  magnetFormsClass.prototype.deleteAgeScreenCookie=deleteAgeScreenCookie; 










  /*
  
	sets cookies from form text name and value inputs ... 
    returns an object of each name and its value ... 
	allows synonyms for any name ... 
  
  */ 
   
  
  // sets cookies from form for one year ... 
  function setMnemonicsCookies(formname) { 
    if(!this.permission) { return; } // switched off or on 
    this.getMnemonicsCookies(); 
	
	// generate forgets hash 
	var forgets=new Object(); 
    for(i=0; i<this.forgets.length; i++) { forgets[this.forgets[i]]="forget"; } 
	
	// generate synonyms hash 
	var synonyms=new Object(); 
    for(i=0; i<this.synonyms.length; i++) { 
      if(this.synonyms[i]==null) { continue; } 
      var synonym=this.synonyms[i]; 
      var offset=synonym.indexOf(','); 
      var name=this.trim(synonym.substring(0,offset)); 
      var value=this.trim(synonym.substring(offset+1)); 
      synonyms[name]=value; 
    } 
	
	// insert name-value pairs from form 
	var elements=document[formname].elements; 
    for(i=0; i<elements.length; i++) { 
	  if(elements[i].name) { 
	    if(elements[i].type=="hidden") { continue; } 
	    if(elements[i].type=="radio" && !elements[i].checked) { continue; } 
	    var name=elements[i].name; 
        var value=this.trim(elements[i].value); 
	    if(elements[i].type=="checkbox") { 
	      name=name+""+value;
	      if(elements[i].checked) { value="checkbox"; } 
	      else { value=null; } 
	      if(forgets[name]) { value=null; } 
	     } 
	    if(forgets[name]) { value=null; } 
        this.recalls[name]=value; 
	    if(synonyms[name]) { this.recalls[synonyms[name]]=value; } 
	  } 
	} 
	
	// generate values for cookie 
	var values=""; 
	for(name in this.recalls) { 
	  if(this.recalls[name]) { values+=name+"|"+this.recalls[name]+"|"; } 
	} //alert(values); 
	
	// set cookie for one year 
    var date=new Date(); 
    date.setFullYear(date.getFullYear()+1); 
    document.cookie=this.mnemonicsIdentifier+"="+escape(values)+"; expires="+date.toGMTString()+"; path=/; "; 
        
  } // end 
  magnetFormsClass.prototype.recall=setMnemonicsCookies; 
  
  
  
  
  // returns hash of cookies ... 
  function getMnemonicsCookies() { 
    this.recalls=new Object(); 
    var offset=0, point=0, finish=0, cookie=document.cookie; 
	var name=this.mnemonicsIdentifier+"="; 
    var value=null; 
    while(offset < cookie.length) { 
      point=offset+name.length; 
      if(cookie.substring(offset,point)==name) { 
        finish=cookie.indexOf(";",point); 
        if(finish < 0) { finish=cookie.length; } 
        value=unescape(cookie.substring(point,finish)); 
      } 
      offset=cookie.indexOf(" ",offset)+1; 
      if(offset==0) { break; } 
    } 
    if(value && value.indexOf('|')>0) { 
      var hash=value.split('|'); // splits on pipes 
	  var i=0; 
	  while(i<hash.length) { 
	    if(hash[i] && hash[i+1]) { 
	      this.recalls[hash[i]]=hash[i+1]; 
		} 
		i=i+2; 
	  } 
    } 
  } // end 
  magnetFormsClass.prototype.getMnemonicsCookies=getMnemonicsCookies; 
  
  
  
  
  // assign cookies to text inputs ... 
  function assignMnemonics(formname) { 
    if(!this.permission) { return; } // switched off or on 
    this.getMnemonicsCookies(); 
    if(document[formname]) { 
      var elements=document[formname].elements; 
      for(i=elements.length-1; i>-1; i--) { 
	    if(elements[i].type=="hidden") { continue; } 
	    elements[i].focus(); // focus each in ascending order 
	    if(elements[i].type=="radio") { 
	      var code=(elements[i].value==this.recalls[elements[i].name]); 
	      if(code) { elements[i].checked=true; } 
	      continue; 
	    } 
	    if(elements[i].type=="checkbox") { 
	      var code=this.recalls[elements[i].name+""+elements[i].value]; 
	      if(code) { elements[i].checked=true; } 
	      continue; 
	    } 
	    if(this.recalls[elements[i].name]) { 
	      elements[i].value=this.recalls[elements[i].name]; 
	    } 
	    if(!this.focus) { elements[i].blur(); } 
	  } 
	} 
  } // end 
  magnetFormsClass.prototype.assign=assignMnemonics; 
  
   
  
  
  // reset form and clear cookies ... 
  function clearMnemonics(formname) { 
    document[formname].reset(); 
	this.expunge(); 
  } // end 
  magnetFormsClass.prototype.reset=clearMnemonics; 

 


  // erase mnemonics cookie ... 
  function deleteMnemonicsCookies() { 
    document.cookie=this.mnemonicsIdentifier+"=expunged; expires=Fri, 02-Jan-1970 00:00:00 GMT; path=/; "; 
  } // end 
  magnetFormsClass.prototype.expunge=deleteMnemonicsCookies; 
  
  
  
  
  // trim strings ... 
  function trim() { 
    var trim=arguments[0]; 
    trim=trim.replace(/(\w+)\s*$/,"$1"); 
    trim=trim.replace(/^\s*(\w+)/,"$1"); 
	return trim; 
  } // end 
  magnetFormsClass.prototype.trim=trim; 
  
  
  


  