/* new validation code */


function removeElement(id) {
  while(element = document.getElementById(id)){
   if(element){
    element.parentNode.removeChild(element);
   }else{
    continue;
   }
  }
}

     function Validate(form){
      
      var obj;
      
      var errors = Array();
      var eCount = 0;
      
      var showAlert = false;
      var showList = false;
      
      if(form.attributes["showErrors"]){
       show = form.attributes["showErrors"].value.toLowerCase();

       if(show == "both"){
        showAlert = true;
        showList = true;
       }else if(show == "alert"){
        showAlert = true;
       }else if(show == "list"){
        showList = true;
       }
       
      }
      
      
      var IsOkay = true;
      
      var curOkay = true;
      
      var doneRemove = false;
      
      var useObj = true;
      
      for(i = 0; i < form.elements.length; i++){
        obj = form.elements[i];

        useObj = true;
        doneRemove = false;
        
        removeElement("jsValidation");
        
        curOkay = true;
        
        objType = "";
        
        if(obj.nodeName){
         objType = obj.nodeName.toLowerCase();
        }
        
        if(objType != "input" && objType != "textarea"){
         useObj = false;
        }
        
        if(obj == undefined){
         useObj = false;
        }
        
        if(obj.attributes["required"] == null){
         useObj = false;
        }

        if(useObj){

         required = obj.attributes["required"].value;

         if(obj.attributes["formalName"]){
          formalName = obj.attributes["formalName"].value;
         }else{
          if(obj.attributes["name"]){
           formalName = obj.attributes["name"].value;
          }else{
           formalName = "";
          }
         }
         
         switch (required){
          case "number":
           if(!ValidateNumber()){
            IsOkay = false;
            curOkay = false;
            AddError("number",obj,formalName);
           }
          break;
          case "email":
           if(!ValidateEmail()){
            IsOkay = false;
            curOkay = false;
            AddError("email",obj,formalName);
           }
          break;
          case "phone":
           if(!ValidatePhone()){
            IsOkay = false;
            curOkay = false;
            AddError("phone",obj,formalName);
           }
          break;
          
          case "creditcard":
           if(!ValidateCreditCard()){
            IsOkay = false;
            curOkay = false;
            AddError("creditcard",obj,formalName);
           }
          break;
          
          case "nonblank":
           if(!ValidateNonBlank()){
            IsOkay = false;
            curOkay = false;

            AddError("nonblank",obj,formalName);
           }
          break;

          default:

          break;
         }


         if(obj.attributes["maxLength"]){
          requiredLength = parseInt(obj.attributes["maxLength"].value);
          
          if(obj.value.length > requiredLength){
           AddError("maxLength",obj,formalName,requiredLength);
           curOkay = false;
           IsOkay = false;
          }
          
         }
         
         
         if(obj.attributes["minLength"]){
          requiredLength = parseInt(obj.attributes["minLength"].value);
          
          if(obj.value.length < requiredLength){
           AddError("minLength",obj,formalName,requiredLength);
           curOkay = false;
           IsOkay = false;
          }
          
         }
         
         if(obj.attributes["exactLength"]){
          requiredLength = parseInt(obj.attributes["exactLength"].value);
          
          if(obj.value.length != requiredLength){
           AddError("exactLength",obj,formalName,requiredLength);
           curOkay = false;
           IsOkay = false;
          }
          
         }
         
         

           if(obj.attributes["requiredParent"] != null){
           
           dparent = obj.attributes["requiredParent"].value;
           dparent = dparent.toLowerCase();

            for(a = 0; a < form.elements.length; a++){
            
             if(form.elements[a].name.toLowerCase() == dparent){
              
              if(form.elements[a].value != obj.value && ValidateNonBlank()){
               IsOkay = false;
               if(curOkay){
                AddError("multiple",obj,formalName,dparent);
                curOkay = false;
               }
              }
              
             }
            
            }
            
           } //has required parent
           
         
           
         


        }
        
        
      }  
       
     indexC = 0;
     
     errorList = "";
     alertList = "";
     
     
     if(IsOkay == false){
      for(i = 0; i < errors.length; i++){
      
       data = errors[i];

       errorList += "<li>" + data[2] + "</li><br />\n";
       alertList += data[2] + "\n";

       el = document.createElement("span");
       el.innerHTML = "*";
       el.setAttribute("id","jsValidation");
       indexC++;
       
       if(data[0].parentNode.nodeName == "FORM"){
        // not in a table
        
        if(data[0].nextSibling){
         data[0].parentNode.insertBefore(el,data[0].nextSibling);
        }else{
         data[0].parentNode.appendChild(el);
        }
       }else{
        data[0].parentNode.appendChild(el);
       }
       

      }
      
      
      if(showAlert){
       alert(alertList);
      }
      
      
      if(showList){
      
       if(form.parentNode.nodeName == "TABLE"){
      
        tbody = form.parentNode.getElementsByTagName('tbody')[0];
      
        el = document.createElement("TR");
        
        el.setAttribute('id','jsValidation');
        
        elCell = document.createElement("TD");
        elCell.innerHTML = "<span class='errMsg'>The Following Errors Occured: <ul>" + errorList + "</ul></span>\n"
       
        el.appendChild(elCell);
       
        if(tbody.firstChild){
         tbody.insertBefore(el,tbody.firstChild);
        }else{
         tbody.appendChild(el);
        }
       
       }else{
        el = document.createElement("span");
        el.innerHTML = "The Following Errors Occured: <ul>" + errorList + "</ul>\n";
        el.setAttribute("id","jsValidation");
       
        form.parentNode.insertBefore(el,form);
       
       } // end table check
      
      } //end show list

      
      
      
      return false;
     
     }else{
      return true;
     }
      
      
      
     function AddError(type,object,formalName,info){
     
      if(!info){
       info = "";
      }
     
      var data = Array();
      var output;

       switch ( type.toLowerCase() ){
       
        case "multiple":
         output = formalName + " must be the same as " + info;
        break;
       
        case "creditcard":
         output = "Please enter a valid credit card.  Incorrect identifier for " + formalName;
        break;
       
        case "number":
         output = "Please enter a valid number for " + formalName;
        break;
        
        case "nonblank":
         output = formalName + " must not be blank";
        break;
        
        case "email":
         output = "Please enter a valid E-Mail Address";
        break;
        
        case "phone":
         output = "Please enter a valid Phone number (XXX-XXX-XXXX) for " + formalName;
        break;
        
        case "minlength":
         output = formalName + " must be at least " + info + " characters long";
        break;
        
        case "maxlength":
         output = formalName + " must be less than " + info + " characters long";
        break;
        
        case "exactlength":
         output = formalName + " must be exactly " + info + " characters long";
        break;
        
        default:
         alert("error in error switch");
        break;
        
       }

        data[0] = object;
        data[1] = type;
        data[2] = output;
        data[3] = formalName;

        errors[eCount] = data;
        eCount++;
       
     } 
     
     function ValidateNumber(){
     
      if (obj.value == null || !ValidateNonBlank()){
       return false;
      }

      return !isNaN(obj.value);
      
     }
     
     
//Luhn algorithm identifier verification
//MIT Licensed
    function ValidateCreditCard() {

    if(obj.value == null){
     return false;
    }

    identifier = obj.value;

    var sum     = 0,
        alt     = false,
        i       = identifier.length-1,
        num;

    if (identifier.length < 13 || identifier.length > 19){
        return false;
    }

    while (i >= 0){

        //get the next digit
        num = parseInt(identifier.charAt(i), 10);

        //if it's not a valid number, abort
        if (isNaN(num)){
            return false;
        }

        //if it's an alternate number...
        if (alt) {
            num *= 2;
            if (num > 9){
                num = (num % 10) + 1;
            }
        } 

        //flip the alternate bit
        alt = !alt;

        //add to the rest of the sum
        sum += num;

        //go to next digit
        i--;
    }

    //determine if it's valid
    return (sum % 10 == 0);
}
     
     
     function ValidateEmail(){
     
      if (obj.value == null){
       return false;
      }
     
      var filter = /^([\w]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,3}(?:\.[a-z]{2})?)$/i
      return filter.test(obj.value)

     }
     
     function ValidateNonBlank(){
     
      if (obj.value == null || obj.value.length == 0){
       return false;
      }else{
      
       var trimmed = obj.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '')
      
       if(trimmed == "" || trimmed.length == 0){
        return false;
       }else{
        return true;
       }
      }
     }
     
     function ValidateZip(){
      var filter = /^[0-9]{5}(-[0-9]{4})?$/;
      return filter.test(obj.value);
     }

     function ValidatePhone(){
      if (obj.value == null){
       return false;
      }
     
       var filter = /^(\d\d\d)-\d\d\d-\d\d\d\d$/;
       var filter2 = /^\d\d\d\d\d\d\d\d\d\d$/;
       var filter3 = /^\d\d\d-\d\d\d-\d\d\d\d$/;
       var filter4 = /^\d\d\d-\d\d\d\d\d\d\d$/;
       
       return (filter.test(obj.value) || filter2.test(obj.value) || filter3.test(obj.value) || filter4.test(obj.value));  
     
       
     }

     
     
     
    }    
    

/* end new validation code */


function ObjectPosition(obj) {
    var curleft = 0;
      var curtop = 0;
      if (obj.offsetParent) {
            do {
                  curleft += obj.offsetLeft;
                  curtop += obj.offsetTop;
            } while (obj = obj.offsetParent);
      }
      return [curleft,curtop];
}



/* myLocation and headerImageSrc are used to set the current location in the header file
   and the source file for the header image photography
*/

var myLocation;
var headerImageSrc;

function doTranslate(){
 var myForm = document.langdrop;
 myLang = "";
 myLang = myForm.elements[0].value;
  if(myLang == ""){
   alert('Please select a language from the drop down.');
   return false;
  }
  
  gotoTranslate(myLang);
  return true;
}

function gotoTranslate(lang){
  
  if(lang != ""){
   myLang = lang;
  }else{
   if(lang.value == ""){
    myLang = "";
   }else{
    myLang = lang.value;
   }
  }
  
  if(myLang == ""){
   return false;
  }

  page = 'http://translate.google.com/translate?prev=hp&hl=en&js=y&u=http%3A%2F%2Fcityofboston.gov&sl=en'+myLang;
  location.href=page;
  window.href=page;
  return true;
 }	

/*  setWidth and setMinMaxWidth are used to set the Minimum and Maximum widths in IE
	to change the minimum or maximum widths for the page, just change the two global
	variables below.  This is the width inside the margins and the page shadow
*/

var minWidth=754;
var maxWidth=976;
	
function setWidth(){
	 if(document.getElementById&&navigator.appVersion.indexOf("MSIE")>-1&&!window.opera)
	 {
	 	if(window.attachEvent)
		{
			window.attachEvent("onresize",setMinMaxWidth);
			window.attachEvent("onload",setMinMaxWidth);
		}
	}
}

function setMinMaxWidth(){
	var clientWidth = parseInt(document.body.clientWidth);
	var bodyDiv = document.getElementById("bodyDiv02"); 
	
 	if(clientWidth<=minWidth)
 	{
		bodyDiv.style.width=minWidth+"px";
		//	alert("a");
	
	}
	else if(clientWidth>=maxWidth)
	{
		bodyDiv.style.width=maxWidth+"px";
		//	alert("b");
	}
	else
	{
		bodyDiv.style.width=minWidth+"px";
		//bodyDiv.style.width=(minWidth+maxWidth)/2+"px";	
		//alert("c");
	}
		
}

/*  getTodaysDate, monthText, and dayText are used to render the current date on the
	cityofboston.gov home page
*/

function getTodaysDate()
{
	var myDate = new Date();
	var date = myDate.getDate();
	var day = myDate.getDay();
	var month = myDate.getMonth();
	var year = myDate.getFullYear();
	
	document.write(dayText(day) + ", " + monthText(month) + " " + date + ", " + year);
}

/*  variable month is the current month stored as in int from 0-11,
	monthText returns the Text for the current month
*/
function monthText(month)
{
	if(month==0) return "January";
	else if(month == 1)  return "February";
	else if(month == 2)  return "March";
	else if(month == 3)  return "April";
	else if(month == 4)  return "May";
	else if(month == 5)  return "June";
	else if(month == 6)  return "July";
	else if(month == 7)  return "August";
	else if(month == 8)  return "September";
	else if(month == 9)  return "October";
	else if(month == 10)  return "November";
	else if(month == 11)  return "December";
}

/*  variable day is the current day stored as in int from 0-6,
	dayText returns the Text for the current day
*/
function dayText(day)
{
	if(day == 0)  return "Sunday";
	else if(day == 1) return "Monday";
	else if(day == 2) return "Tuesday";
	else if(day == 3) return "Wednesday";
	else if(day == 4) return "Thursday";
	else if(day == 5) return "Friday";
	else if(day == 6) return "Saturday";
}

/* openCalWindow is used to open all of the calendar event detail popups, the window attributes are maintained here so that if the dimensions or properties need to change, only one file update is necessary.
*/

function openCalWindow(file){
	openWindow(file,'','status=no,menubar=no,resizable=no,width=490,height=570');
}
//function to open popup windows
function openWindow(theURL,winName,features) { 
  window.open(theURL,winName,features);
}

/* setActiveStyleSheet() disables all 3 of the font size stylesheets, then enables the one that the user selected.
   the parameter title is passed from the link and matches the title attribute of the css reference.	
   setActiveStyleSheet() also turns off all of the text size icons, and then turns on the current selection
*/
function setActiveStyleSheet(title) {
  var linkTags = document.getElementsByTagName("link");
  var imageTest = false;
  
  for(var i=0;i<linkTags.length;i++)
  {
  	if(linkTags[i].getAttribute("rel").indexOf("stylesheet") && linkTags[i].getAttribute("title"))
	{

	
		linkTags[i].disabled = true;
		var myTitle = linkTags[i].getAttribute('title');
				
		if (document.getElementById(myTitle)) {
			document.getElementById(myTitle).src = "//www.cityofboston.gov/images/iconTextSize" + myTitle + "Off.gif";

			document.getElementById(myTitle).className = myTitle;

			if(linkTags[i].getAttribute("title") == title)
			{
				document.getElementById(myTitle).className = myTitle + " curFont";
				linkTags[i].disabled = false;
				document.getElementById(title).src = "//www.cityofboston.gov/images/iconTextSize" + title + "On.gif";
				imageTest = true;
			}
		}
	}
  }
  if(!imageTest)
  {
	//document.getElementById("xsmallFont").src = "//www.cityofboston.gov/images/iconTextSizexsmallFontOn.gif";
  }	
}

/* getActiveStyleSheet() is used to find the currently enabled stylesheet, the name of that stylesheet is stored using a cookie
   and retrieved the next time a page is loaded to maintain the correct font-size.
*/
function getActiveStyleSheet() {
  var linkTags = document.getElementsByTagName("link");
  
  for(var i=0; i<linkTags.length; i++) {
  	if(linkTags[i].getAttribute("rel").indexOf("stylesheet") != -1
		&& linkTags[i].getAttribute("title") && !linkTags[i].disabled)
		return linkTags[i].getAttribute("title");
  }
  return null;
}

/* increaseFontSizeStyleSheet() switches to the next-large stylesheet.
*/
function increaseFontSizeStyleSheet() {
  switch( getActiveStyleSheet() ) {
    case 'xxsmallFont':
      setActiveStyleSheet('xsmallFont');
      break;
    case 'xsmallFont':
      setActiveStyleSheet('smallFont');
      break;
    case 'smallFont':
      break;
  }
  return null;
}

/* decreaseFontSizeStyleSheet() switches to the next-smaller stylesheet.
   added for the text-size buttons in the topnav bar June 2, 2009
*/
function decreaseFontSizeStyleSheet() {
  switch( getActiveStyleSheet() ) {
    case 'smallFont':
      setActiveStyleSheet('xsmallFont');
      break;
    case 'xsmallFont':
      setActiveStyleSheet('xxsmallFont');
      break;
    case 'xxsmallFont':
      break;
  }
  return null;
}

/* getPreferredStyleSheet() is used when no cookie is found to load the default/standard stylesheet
*/
function getPreferredStyleSheet() {
  var linkTags = document.getElementsByTagName("link");
  
  for(var i=0; i<linkTags.length; i++) {
    if(linkTags[i].getAttribute("rel").indexOf("style") != -1
       && linkTags[i].getAttribute("rel").indexOf("alt") == -1
       && linkTags[i].getAttribute("title"))
	   return linkTags[i].getAttribute("title");
  }
  return null;
}

/* setCookie() creates a cookie of name "style" with the value matching the user's current stylesheet selection
*/
function setCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}

/* getCookie() retrieves a cookie of name "style", parses the value and returns xsmall, small or medium based on the user's previous stylesheet selection
*/
function getCookie(name) {
  var cookieName = name + "=";
  var cookieSplit = document.cookie.split(';');
  for(var i=0;i < cookieSplit.length;i++) {
    var c = cookieSplit[i];
    while(c.charAt(0)==' ')
	{
		c = c.substring(1,c.length);
	}
    if(c.indexOf(cookieName) == 0)
	{
		return c.substring(cookieName.length,c.length);
	}
  }
  return null;
}


/* This onload event retrieves the style cookie when a page loads 
*/
window.onload = function(e) {
  var cookie = getCookie("style");
  var title = cookie ? cookie : getPreferredStyleSheet();
  setActiveStyleSheet(title);
}

/* This unonload event sets the style cookie when a page unloads 
*/
window.onunload = function(e) {
  var title = getActiveStyleSheet();
  setCookie("style", title, 365);
}

/* All drop-down values should be set in dropDowns.js */

/***********************************************
* AnyLink Drop Down Menu- © Dynamic Drive (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit http://www.dynamicdrive.com/ for full source code
***********************************************/

var menuwidth='165px'; //default menu width
var menubgcolor='#FFFFFF';  //menu bgcolor
var disappeardelay=250 ; //menu disappear speed onMouseout (in miliseconds)
var hidemenu_onclick="yes"; //hide menu when user clicks within menu?

//No further editing needed

var ie4=document.all;
var ns6=document.getElementById&&!document.all;

if (ie4||ns6)
	document.write('<div id="dropmenudiv" style="visibility:hidden;width:'+menuwidth+';background-color:'+menubgcolor+'" onMouseover="clearhidemenu()" onMouseout="dynamichide(event)"></div>')

function getposOffset(what, offsettype)
{
	var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
	var parentEl=what.offsetParent;
	while (parentEl!=null){
		totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
		parentEl=parentEl.offsetParent;
	}
	return totaloffset;
}


function showhide(obj, e, visible, hidden, menuwidth)
{
	if (ie4||ns6)
		dropmenuobj.style.left=dropmenuobj.style.top="-500px"
	if (menuwidth!="")
	{
		dropmenuobj.widthobj=dropmenuobj.style
		dropmenuobj.widthobj.width=menuwidth
	}
	if (e.type=="click" && obj.visibility==hidden || e.type=="mouseover")
		obj.visibility=visible
	else if (e.type=="click")
		obj.visibility=hidden
}

function iecompattest()
{
	return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}

function clearbrowseredge(obj, whichedge)
{
	var edgeoffset=0
	if (whichedge=="rightedge")
	{
		var windowedge=ie4 && !window.opera? iecompattest().scrollLeft+iecompattest().clientWidth-15 : 				window.pageXOffset+window.innerWidth-15;
		dropmenuobj.contentmeasure=dropmenuobj.offsetWidth;
		if (windowedge-dropmenuobj.x < dropmenuobj.contentmeasure)
			edgeoffset=dropmenuobj.contentmeasure-obj.offsetWidth;
	}
	else
	{
		var topedge=ie4 && !window.opera? iecompattest().scrollTop : window.pageYOffset;
		var windowedge=ie4 && !window.opera? iecompattest().scrollTop+iecompattest().clientHeight-15 : 		window.pageYOffset+window.innerHeight-18;
		dropmenuobj.contentmeasure=dropmenuobj.offsetHeight;
		if (windowedge-dropmenuobj.y < dropmenuobj.contentmeasure) //move up?
		{
			edgeoffset=dropmenuobj.contentmeasure+obj.offsetHeight;
			if ((dropmenuobj.y-topedge)<dropmenuobj.contentmeasure) //up no good either?
				edgeoffset=dropmenuobj.y+obj.offsetHeight-topedge;
		}
	}
	return edgeoffset;
}

function populatemenu(what)
{
	if (ie4||ns6)
	dropmenuobj.innerHTML=what.join("");
}


function dropdownmenu(obj, e, menucontents, menuwidth)
{
	if (window.event) event.cancelBubble=true;
	else if (e.stopPropagation) e.stopPropagation();
	clearhidemenu();
	dropmenuobj=document.getElementById? document.getElementById("dropmenudiv") : dropmenudiv;
	populatemenu(menucontents);

	if (ie4||ns6)
	{
		showhide(dropmenuobj.style, e, "visible", "hidden", menuwidth);
		dropmenuobj.x=getposOffset(obj, "left");
		dropmenuobj.y=getposOffset(obj, "top");
		dropmenuobj.style.left=dropmenuobj.x-clearbrowseredge(obj, "rightedge")+"px";
		dropmenuobj.style.top=dropmenuobj.y-clearbrowseredge(obj, "bottomedge")+obj.offsetHeight+"px";
	}

	return clickreturnvalue()
}

function clickreturnvalue()
{
	if (ie4||ns6) return false;
	else return true;
}

function contains_ns6(a, b)
{
	while (b.parentNode)
		if ((b = b.parentNode) == a)
			return true;
	return false;
}

function dynamichide(e)
{
	if (ie4&&!dropmenuobj.contains(e.toElement))
		delayhidemenu();
	else if (ns6&&e.currentTarget!= e.relatedTarget&& !contains_ns6(e.currentTarget, e.relatedTarget))
		delayhidemenu();
}

function hidemenu(e)
{
	if (typeof dropmenuobj!="undefined")
	{
		if (ie4||ns6)
			dropmenuobj.style.visibility="hidden";
	}
}

function delayhidemenu()
{
	if (ie4||ns6)
		delayhide=setTimeout("hidemenu()",disappeardelay);
}

function clearhidemenu()
{
	if (typeof delayhide!="undefined")
		clearTimeout(delayhide);
}

if (hidemenu_onclick=="yes")
	document.onclick=hidemenu;
	
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}