/* Copyright (C) 1998-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* html form simplification routines */
#include "wims.h"
#define MAX_MENU_ITEMS 256
enum {
FORM_SELECT, FORM_RADIO, FORM_BAR, FORM_CHECKBOX
};
/* Produces <select> and <option>s.
* Parameter string: name from n1 to n2 [prompt plist]
* or name, list slist [prompt plist]
* Using script to do this is too slow.
*/
void _form_menus(char *p,int kind)
{
char *n, *li, *pp, *val, *p0, *p1, *p2, *pc, *s, *hmode, *name;
char *vlist[MAX_MENU_ITEMS], *plist[MAX_MENU_ITEMS];
char nbuf[MAX_LINELEN+1],vbuf[MAX_LINELEN+1],pbuf[MAX_LINELEN+1];
char buf[256], pfrb[256], pfre[256], input_id[128];
int i,i1=0,i2,itemcnt,type;
if(!outputing) return;
n=find_word_start(p); if(*n==0) return;
pp=find_word_end(n);
if(*pp!=0) *(pp++)=0;
else {
syntax: module_error("syntax_error"); return;
}
li=find_word_start(pp); pp=find_word_end(li);
if(*pp!=0) *(pp++)=0; else goto syntax;
itemcnt=0;
p1=find_word_start(pp);
p2=wordchr(p1,"to"); if(p2==NULL || p2<=p1) goto syntax;
*(p2
-1)=0; p2
=find_word_start
(p2
+strlen("to"));
pp=wordchr(p2,"prompt"); if(pp!=NULL) *(pp-1)=0;
i1=evalue(p1); i2=evalue(p2);
if(i1<-100000000 || i1>100000000 || i2<-100000000 || i2>100000000)
goto syntax;
if(i2<i1) return;
if(i2>i1+MAX_MENU_ITEMS-1) i2=i1+MAX_MENU_ITEMS-1;
itemcnt=i2-i1+1;
type=0;
}
else {
p1=find_word_start(pp);
pp=wordchr(p1,"prompt"); if(pp!=NULL && pp>p1) *(pp-1)=0;
ovlstrcpy(vbuf,p1);substit(vbuf);
itemcnt=cutitems(vbuf,vlist,MAX_MENU_ITEMS);
type=1;
}
else goto syntax;
}
for(i=0;i<itemcnt;i++) plist[i]=NULL;
if(pp!=NULL) {
p1
=find_word_start
(pp
+strlen("prompt"));
ovlstrcpy(pbuf,p1);substit(pbuf);
cutitems(pbuf,plist,MAX_MENU_ITEMS);
}
ovlstrcpy(nbuf,n);substit(nbuf);
if(kind==FORM_SELECT) {
char *pp;
pp=getvar("wims_formselect_switch"); if(pp==NULL) pp="";
output("<select %s name=\"%s\" id=\"%s\">\n",pp,nbuf,nbuf);
}
if(kind==FORM_BAR) {
s=getvar("wims_ref_class");
if(s
!=NULL
&& *s
!=0 && !isspace(*s
)) {
snprintf(pfrb
,sizeof(pfrb
)," <span class=\"%s\">",s
); strcpy(pfre
,"</span>");
} else { pfrb[0]=0; pfre[0]=0; }
output("%s<span style=\"font-weight:bold;\">-</span> ",pfrb);
}
val=getvar(nbuf);if(val==NULL) val="";
s = getvar("wims_ref_id");
else { strcpy(input_id
,nbuf
);}
for(i=0;i<itemcnt;i++) {
if(type==0) {
p0=buf;
}
else p0=vlist[i];
if(*find_word_start(p0)==0) continue;
if(plist[i]==NULL) plist[i]=p0;
if(*val!=0 &&
( (kind==FORM_SELECT || kind==FORM_CHECKBOX)
&& itemchr(val,p0)!=NULL))) {
if(kind==FORM_SELECT) pc=" selected=\"selected\"";
else pc=" checked=\"checked\"";
}
else pc="";
s = getvar("wims_ref_class");
hmode=getvar("wims_html_mode");
pfrb[0]=0; pfre[0]=0;
if(s
!=NULL
&& *s
!=0 && !isspace(*s
)) {
if(hmode
==NULL
|| *hmode
==0 || isspace(*hmode
)) {
hmode="span";
}
snprintf(pfrb
, sizeof(pfrb
), "<%s class=\"%s\">", hmode
, s
);
snprintf(pfre
, sizeof(pfre
), "</%s>", hmode
);
} else {
if(hmode!=NULL && *hmode!=0) {
snprintf(pfrb
, sizeof(pfrb
), "<%s>", hmode
);
snprintf(pfre
, sizeof(pfre
), "</%s>", hmode
);
}
}
switch(kind) {
case FORM_RADIO: name="radio"; break;
case FORM_CHECKBOX: name="checkbox"; break;
case FORM_BAR: name="radio"; break;
default: name="";
}
switch(kind) {
case FORM_SELECT:
output("<option value=\"%s\"%s>%s</option>\n", p0, pc, plist[i]);
break;
case FORM_RADIO:
case FORM_CHECKBOX:
if (itemcnt > 1) {
output("%s<input type=\"%s\" name=\"%s\" id=\"%s_%d\" value=\"%s\"%s><label for=\"%s_%d\">%s</label>%s",
pfrb,name,nbuf,input_id,i+1,p0,pc,input_id,i+1,plist[i],pfre);
} else {
output("%s<input type=\"%s\" name=\"%s\" id=\"%s\" value=\"%s\"%s><label for=\"%s\">%s</label>%s",
pfrb,name,nbuf,input_id,p0,pc,input_id,plist[i],pfre);
}
if(i<itemcnt-1 && itemcnt>2 && (hmode==NULL || *hmode==0)) _output_(",");
_output_("\n");
break;
case FORM_BAR:
output("<input type=\"%s\" name=\"%s\" id=\"%s_%d\" title=\"%s\" value=\"%s\"%s><label style=\"display:none\" for=\"%s_%d\">%s</label>",
name,nbuf,input_id,i+1,p0,p0,pc,input_id,i+1,p0);
break;
}
}
setvar("wims_ref_class","");
setvar("wims_ref_id","");
setvar("wims_html_mode","");
if(kind==FORM_SELECT) _output_("</select>");
if(kind==FORM_BAR) output(" <span style=\"font-weight:bold;\">+</span>");
}
void exec_formselect(char *p)
{
_form_menus(p,FORM_SELECT);
}
void exec_formradio(char *p)
{
_form_menus(p,FORM_RADIO);
}
void exec_formcheckbox(char *p)
{
_form_menus(p,FORM_CHECKBOX);
}
void exec_formbar(char *p)
{
_form_menus(p,FORM_BAR);
}