    //global vars
    var java_roof_pitch=0;
    var java_roof_yaw=0;

    function ValidateResponses(){
      //loop through every element in form looking for VALIDATE attribute then checking if value is valid      
      var notvalid=false;
      type_of_install=document.getElementById("VALIDATE_install_type");
      
      for(i=0; i<document.SubmitConfig.elements.length; i++){
        element=document.SubmitConfig.elements[i];
        if(element.id.indexOf("VALIDATE")==0){
          //resetting msg          
          msg=document.getElementById(element.id.replace("VALIDATE","MSG"));
          msg.innerHTML="";
          msg.style.color="black";
          if(element.value.length==0){
          
            if (type_of_install.value=="Roof"){
              if(element.id.indexOf("VALIDATE_ground")==0||element.id.indexOf("VALIDATE_pole")==0){
                //alert("element to not include: " + element.id);
              }else{
                msg.innerHTML="(Incomplete)";
                msg.style.color="red";
                notvalid=true;
              }              
            }
            if (type_of_install.value=="Ground"){
              if(element.id.indexOf("VALIDATE_roof")==0||element.id.indexOf("VALIDATE_pole")==0){
                //alert("element to not include: " + element.id);
              }else{
                msg.innerHTML="(Incomplete)";
                msg.style.color="red";
                notvalid=true;              
              }              
            }
            if (type_of_install.value=="PoleMount"){
              if(element.id.indexOf("VALIDATE_roof")==0||element.id.indexOf("VALIDATE_ground")==0){
                //alert("element to not include: " + element.id);
              }else{
                msg.innerHTML="(Incomplete)";
                msg.style.color="red";
                notvalid=true;              
              }              
            }                    

          }else{
            //do nothing
          }
        }
      }
      if (notvalid) {
        alert("You missed a few blocks, they are indicated with red");
      }else{
        alert("Your responses are valid!");
        document.SubmitConfig.submit();
      }      
    }

    function ValidateOrientation(id){
      //displays correct section
      SelectRoofPitch(id);    
      report_element=document.getElementById("VALIDATE_roof_orientation");
      element=document.getElementById(id);
      if ((element.value).length!==0){
        report_element.value="Good";
        if (element.value=="specify"){
          ValidateRoofPitchAndYaw(id);
        }
      }else{
        report_element.value="";
      }
    }

    function ValidateRoofPitchAndYaw(id){
      element=document.getElementById(id);
      if(element.id=="roof_pitch1"){
        ValidateNumber(id,0,90);
      }
      if(element.id=="roof_yaw1"){
        ValidateNumber(id,0,359.9);        
      }
      mytimeout=window.setTimeout("DelayedCheckRoofPitchAndYaw()",250);
    }

    function DelayedCheckRoofPitchAndYaw(){
      roof_pitch1=document.getElementById("roof_pitch1");
      roof_yaw1=document.getElementById("roof_yaw1");
      report_element=document.getElementById("VALIDATE_roof_orientation");
      if(roof_pitch1.value.length>0 && roof_yaw1.value.length>0){
        report_element.value="Good";
      }else{
        report_element.value="";
      }
    
    }

    function ValidateUsage(id){
      report_element=document.getElementById("VALIDATE_usage");
      if (ValidateNumber(id,0,9999)){
        report_element.value="Good";
      }else{
        //do nothing
      }
    }

    function ValidateShade(id){
      report_element=document.getElementById("VALIDATE_shade");
      notvalid=false;
      if (ValidateNumber(id,0,100)){
        for(i=1;i<=12;i++){
          shade_month=document.getElementById("shade_m" + i);
          if ((shade_month.value).length==0){
            notvalid=true;
          }        
        }
        if(notvalid==false){
          report_element.value="Good";
        }
      }else{
        report_element.value="";
      }
    }
    
    function ValidateShadeSimple(id){
      DistributeShade(id);
      report_element=document.getElementById("VALIDATE_shade");
      simple_element=document.getElementById(id);
      if(IsNumeric(simple_element.value)){
        report_element.value="Good"
      }else{
        report_element.value="";
      }
    }

    function ValidatePoleConfig(id){
      TogglePoleCount(id);
      element=document.getElementById(id);
      report_element=document.getElementById("VALIDATE_pole_check");
      element_pole_count=document.getElementById("pole_count");
      if(element.value.length!==0){
        report_element.value="Good";
        if(element.value=="specify" && element_pole_count.value.length==0){
          report_element.value="";
        }      
      }else{
        //do nothing
      }
    }

    function ValidatePoleCount(id){
      report_element=document.getElementById("VALIDATE_pole_check");
      if(ValidateNumber(id,0,10)){
        report_element.value="Good";
      }else{
        report_element.value="";
      }
    }
  
    var java_current_element; //required for function ValidateNumber
    function ValidateNumber(id,min,max){
      //this function validates numbers and if there is a problems it will alert the user
      element=document.getElementById(id);
      java_current_element=element;
      if (!(element.value>=min && element.value<=max && IsNumeric(element.value)==true)) {
        alert("This value needs to be a number between " +min + " and " + max);
        //element.value="";
        element.style.color="red";
        mytimeout=window.setTimeout('element.focus();element.style.color="black";element.value=""',200);
        return false;
      }else{
        return true;
      }      
    }

    function IsNumeric(sText) {
      //this function is required for the function ValidateNumber
      var ValidChars = "-0123456789.";
      var Char;       
      for (i = 0; i < sText.length; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1) {
          return false;
        }else{
          return true;              
        }
      }              
    }

    function ToggleLocation(n) {
      //toggles on and off roof and ground sections
      l=document.getElementById(n);
      r=document.getElementById("roofsection");
      g=document.getElementById("groundsection");
      p=document.getElementById("polesection");
      
      if(l.value == "Roof"){
        r.style.display = "block";
        g.style.display = "none";
        p.style.display = "none";
      }
      if(l.value == "Ground"){
        g.style.display = "block";
        r.style.display = "none";
        p.style.display = "none";
      }      
      if(l.value == "PoleMount"){
        p.style.display = "block";
        r.style.display = "none";
        g.style.display = "none";
      }      
		}

    function ToggleShade(n) {
      //toggles on and off roof and ground sections
      t=document.getElementById(n);
      s=document.getElementById("shadingsimplesection");
      d=document.getElementById("shadingdetailedsection");

      d.style.display = "none";
      s.style.display = "none";       
      if(t.value == "simple"){
        s.style.display = "block";
        d.style.display = "none";
      }
      if(t.value == "detailed"){
        d.style.display = "block";
        s.style.display = "none";
      }
		}
		
    function TogglePoleCount(n) {
      //toggles on and off pole count section
      pc=document.getElementById(n);
      c=document.getElementById("polecountsection");
      if(pc.value == "specify"){
        c.style.display = "block";
      }else{
        c.style.display="none";
      }
		}

    function SelectRoofType(n){      
      selrt=document.getElementById(n);
      rtimg=document.getElementById("rtimg");      
      rtimg.src="Images/RoofType/" + selrt.value + ".png";
      rtimgsection=document.getElementById("rooftypeimagesection");
      if(selrt.value=="other"|| (selrt.value).length==0){
        rtimgsection.style.display="none";
      }else{
        rtimgsection.style.display="block";
      }
    }
    

    function SelectRoofPitch(n){
      selrp=document.getElementById(n);            
      rpimg=document.getElementById("rpimg");      
      rpimgsection=document.getElementById("roofpitchimagesection");      
      rpspecifysection=document.getElementById("roofpitchspecifysection");
      rosection=document.getElementById("rorientsection");
      roimg=document.getElementById("HOrient");
      //assigning value of image source            
      rpimg.src="Images/RoofPitch/RoofPitch-" + selrp.value + ".png";
      
      if(selrp.value=="10"||selrp.value=="20"||selrp.value=="30"||selrp.value=="40"){
        //displaying correct block
        rpimgsection.style.display="block";        
        rosection.style.display="block";
        rpspecifysection.style.display="none";
        //setting roof pitch
        java_roof_pitch=selrp.value;
        if(java_roof_yaw.length==0){
          java_roof_yaw=0;
        }
        //updating the image
        roimg.src="images/House" + java_roof_pitch + "/House" + java_roof_pitch + "-" + java_roof_yaw + ".png"        
      }
      if(selrp.value == "0"){
        //displaying correct block
        rpimgsection.style.display="block";
        rosection.style.display="none";
        rpspecifysection.style.display="none";
        //setting roof pitch
        java_roof_pitch=selrp.value;      
      }
      if(selrp.value == "specify"){
        //displaying correct block
        rpspecifysection.style.display="block";
        rpimgsection.style.display="none";
        rosection.style.display="none";
      }
      if(selrp.value.length==0){
        //displaying correct block
        rpspecifysection.style.display="none";
        rpimgsection.style.display="none";
        rosection.style.display="none";
        java_roof_pitch="";
        java_roof_yaw="";
      }      
      //saving roof pitch to document
      roof_pitch1=document.getElementById("roof_pitch1");
      roof_pitch1.value=java_roof_pitch;      
      roof_yaw1=document.getElementById("roof_yaw1");
      roof_yaw1.value=java_roof_yaw;
    }
    	
    function DistributeShade(n){
      //checks number first then makes each month of shading the same
      if (ValidateNumber(n,0,100)==true){              
        //makes each month of shading the same as the detailed
        simple=document.getElementById(n);
        distro=simple.value;
      }else{
        distro="";
      }
      for(i=1;i<=12;i++){
      shade_month=document.getElementById("shade_m" + i);
      shade_month.value=distro;
      }
    }	
    		
    function LoadSavedConfig() {
      //toggles on and off load config section
      l=document.getElementById("loadconfigsection");
      if(l.style.display == "none"){
        l.style.display = "block";
      }else{
        l.style.display="none";
      }
		}
		
		function CheckMagVar(){				
		  //reads tags to get address then loads a google map
      var lat=document.getElementById("lat");
      var lng=document.getElementById("lng");
      if(!lat.value && !lng.value){
        alert("Please enter a valid address on this page before clicking this link");
      }else{    
        var geocodeposition=document.getElementById("VALIDATE_geocode_position");
        if (geocodeposition.value.length !== 0) {
          site="MagVar.asp?lat=" + lat.value + "&lng=" + lng.value;    
          window.open(site,'','width=' + "200" + ',height=' + "150" + ',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,copyhistory=yes,resizable=yes')
        }else{
          alert("The address you entered on this page is not valid, please correct it and retry.");
        }
      }
		}
		
    function OpenPage(site,W,H) {
      //Opens a site at size (W,H) 
      jgwin=window.open(site,'','width=' + W + ',height=' + H + ',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,copyhistory=yes,resizable=yes')
		}
	
    
    function Rotate(amount) {
      java_roof_yaw=java_roof_yaw+parseInt(amount);
      if (java_roof_yaw==360) {java_roof_yaw=0;}
      if (java_roof_yaw==-30) {java_roof_yaw=330;}
      eTime = new Date();
      document.images["HOrient"].src="images/House" + java_roof_pitch + "/House" + java_roof_pitch + "-" + java_roof_yaw + ".png" + '?' + eTime.getTime();
      var h = document.getElementById("roof_yaw1");
      h.value=java_roof_yaw;
    }
    
    function ShowGoogleMap() {
      //reads tags to get address then loads a google map
      var lat=document.getElementById("lat");
      var lng=document.getElementById("lng");
      if(!lat.value && !lng.value){
        alert("Please enter a valid address on this page before clicking this link");
      }else{    
        var geocodeposition=document.getElementById("VALIDATE_geocode_position");
        if (geocodeposition.value.length !== 0) {
          site="map.htm?lat=" + lat.value + "&lng=" + lng.value + "&zoom=14&type=h";
          window.open(site,'','width=' + "475" + ',height=' + "365" + ',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,copyhistory=yes,resizable=yes')
        }else{
          alert("The address you entered on this page is not valid, please correct it and retry.");
        }
      }
		}

    var mytimeout;    
    function GeocodeAddress(){
      //building an address string to geocode it
      var street1=document.getElementById("street1");
      var street2=document.getElementById("street2");
      var city=document.getElementById("city");
      var state=document.getElementById("state");
      var zip=document.getElementById("zip");
      geocodeposition=document.getElementById("VALIDATE_geocode_position");
      validaddressblock=document.getElementById("MSG_geocode_position");      
      geocodeposition.value="";
      validaddressblock.innerHTML="";
      address=street1.value + ", " + street2.value + ", " + city.value + ", " + state.value + " " + zip.value;
      //Since the geocoding process with google is not async, we need to to avoid trying to resolve partial 
      //address info by only performing geocoding after some time. That will allow for the user to complete 
      //the address without flooding google with partial requests
      try{
        window.clearTimeout(mytimeout);
      } catch (e) {}
      mytimeout=window.setTimeout("GeocodeIt(address)",4000);      
    }

    geocoder = new GClientGeocoder();
    function GeocodeIt(lookupaddress) {
    //alert("Finally looking up address");
      geocoder.getLatLng(
        lookupaddress,
        function(point) {
          geocodeposition=document.getElementById("VALIDATE_geocode_position");
          lat=document.getElementById("lat");
          ideal=document.getElementById("ideal_roof_pitch");
          lng=document.getElementById("lng");
          validaddressblock=document.getElementById("MSG_geocode_position");          
          if (!point) {
            geocodeposition.value="";
            validaddressblock.innerHTML="<span style='color:red;'>Address Invalid</span>";
            ideal.innerHTML="Enter in a valid address above to find out the optimum pitch for your house.  It will display here.";
          } else {
            //assign values of point to hidden elements for other events in page
            geocodeposition.value=point;            
            temp=geocodeposition.value.split(", ")
            lat.value=temp[0].replace("(","");
            lng.value=temp[1].replace(")","");
            ideal.innerHTML="Based on your address you entered above, your ideal pitch for your house is " + Math.round(lat.value *10)/10 + " degrees";
            validaddressblock.innerHTML="<span style='color:green;'>Address Valid</span>";            
          }
        }
      );
    }