8fd7efa0e399efdf87c46c36272b8c70d952bd31
angie
  Tue May 20 11:01:46 2014 -0700
When validating HTML, don't complain about HIDDEN inputs mixed withother input types e.g. CHECKBOX.
fixes #13212

diff --git src/lib/htmlPage.c src/lib/htmlPage.c
index 7f7be68..84e3bde 100644
--- src/lib/htmlPage.c
+++ src/lib/htmlPage.c
@@ -666,30 +666,39 @@
 	var->tagName = tag->name;
 	}
     }
 refAdd(&var->tags, tag);
 return var;
 }
 
 static boolean isMixableInputType(char *type)
 /* Return TRUE if it's a type you can mix with others ok, like
  * button, submit, and image. */
 {
 return sameWord(type, "BUTTON") || sameWord(type, "SUBMIT") 
 	|| sameWord(type, "IMAGE");
 }
 
+static boolean areMixableInputTypes(char *type1, char *type2)
+/* Return TRUE if type1 and type 2 can be safely mixed, i.e.
+ * if type1 and type2 both pass isMixableInputType, OR
+ * if type1 or type2 is HIDDEN. */
+{
+return sameWord(type1, "HIDDEN") || sameWord(type2, "HIDDEN")
+    || (isMixableInputType(type1) && isMixableInputType(type2));
+}
+
 static void htmlFormVarAddValue(struct htmlFormVar *var, char *value)
 /* Add value to list of predefined values for var. */
 {
 struct slName *name = slNameNew(value);
 slAddTail(&var->values, name);
 }
 
 
 static struct htmlFormVar *formParseVars(struct htmlPage *page, struct htmlForm *form)
 /* Return a list of variables parsed out of form.  
  * A form variable is something that may appear in the name
  * side of the name=value pairs that serves as input to a CGI
  * script.  The variables may be constructed from buttons, 
  * INPUT tags, OPTION lists, or TEXTAREAs. */
 {
@@ -706,31 +715,31 @@
 
 	if (type == NULL)
 	    type = "TEXT";
 	if (varName == NULL)
 	    {
 	    if (!htmlTagAttributeVal(page, tag, "ONCHANGE", NULL)
 	        && !sameWord(type, "SUBMIT") && !sameWord(type, "CLEAR")
 	    	&& !sameWord(type, "BUTTON") && !sameWord(type, "RESET")
 		&& !sameWord(type, "IMAGE"))
 		tagWarn(page, tag, "Missing NAME attribute");
 	    varName = "n/a";
 	    }
 	var = findOrMakeVar(page, varName, hash, tag, &varList); 
 	if (var->type != NULL && !sameWord(var->type, type))
 	    {
-	    if (!isMixableInputType(var->type) || !isMixableInputType(type))
+	    if (!areMixableInputTypes(var->type, type))
 		tagWarn(page, tag, "Mixing input types %s and %s", var->type, type);
 	    }
 	var->type = type;
 	if (sameWord(type, "TEXT") || sameWord(type, "PASSWORD") 
 		|| sameWord(type, "FILE") || sameWord(type, "HIDDEN")
 		|| sameWord(type, "IMAGE"))
 	    {
 	    var->curVal = cloneString(value);
 	    }
 	else if (sameWord(type, "CHECKBOX"))
 	    {
 	    if (htmlTagAttributeVal(page, tag, "CHECKED", NULL) != NULL)
 	        var->curVal = cloneString("on");
 	    }
 	else if (sameWord(type, "RADIO"))