Rev 9132 | Rev 12241 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
10 | reyssat | 1 | /* Copyright (C) 1998-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis |
2 | * |
||
3 | * This program is free software; you can redistribute it and/or modify |
||
4 | * it under the terms of the GNU General Public License as published by |
||
5 | * the Free Software Foundation; either version 2 of the License, or |
||
6 | * (at your option) any later version. |
||
7 | * |
||
8 | * This program is distributed in the hope that it will be useful, |
||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
11 | * GNU General Public License for more details. |
||
12 | * |
||
13 | * You should have received a copy of the GNU General Public License |
||
14 | * along with this program; if not, write to the Free Software |
||
15 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
||
16 | */ |
||
17 | |||
7673 | bpr | 18 | /* html form simplification routines */ |
8185 | bpr | 19 | #include "wims.h" |
10 | reyssat | 20 | |
21 | #define MAX_MENU_ITEMS 256 |
||
22 | |||
23 | enum { |
||
24 | FORM_SELECT, FORM_RADIO, FORM_BAR, FORM_CHECKBOX |
||
25 | }; |
||
26 | |||
7673 | bpr | 27 | /* Produces <select> and <option>s. |
28 | * Parameter string: name from n1 to n2 [prompt plist] |
||
29 | * or name, list slist [prompt plist] |
||
8155 | bpr | 30 | * Using script to do this is too slow. |
31 | */ |
||
10 | reyssat | 32 | void _form_menus(char *p,int kind) |
33 | { |
||
9044 | bpr | 34 | char *n, *li, *pp, *val, *p0, *p1, *p2, *pc, *s, *hmode, *name; |
10 | reyssat | 35 | char *vlist[MAX_MENU_ITEMS], *plist[MAX_MENU_ITEMS]; |
36 | char nbuf[MAX_LINELEN+1],vbuf[MAX_LINELEN+1],pbuf[MAX_LINELEN+1]; |
||
9044 | bpr | 37 | char buf[256], pfrb[256], pfre[256], input_id[128]; |
10 | reyssat | 38 | int i,i1=0,i2,itemcnt,type; |
39 | if(!outputing) return; |
||
40 | n=find_word_start(p); if(*n==0) return; |
||
41 | pp=find_word_end(n); |
||
42 | if(*pp!=0) *(pp++)=0; |
||
43 | else { |
||
7673 | bpr | 44 | syntax: module_error("syntax_error"); return; |
10 | reyssat | 45 | } |
46 | li=find_word_start(pp); pp=find_word_end(li); |
||
47 | if(*pp!=0) *(pp++)=0; else goto syntax; |
||
48 | itemcnt=0; |
||
49 | if(strcmp(li,"from")==0) { |
||
7673 | bpr | 50 | p1=find_word_start(pp); |
51 | p2=wordchr(p1,"to"); if(p2==NULL || p2<=p1) goto syntax; |
||
52 | *(p2-1)=0; p2=find_word_start(p2+strlen("to")); |
||
53 | pp=wordchr(p2,"prompt"); if(pp!=NULL) *(pp-1)=0; |
||
54 | i1=evalue(p1); i2=evalue(p2); |
||
55 | if(i1<-100000000 || i1>100000000 || i2<-100000000 || i2>100000000) |
||
56 | goto syntax; |
||
57 | if(i2<i1) return; |
||
58 | if(i2>i1+MAX_MENU_ITEMS-1) i2=i1+MAX_MENU_ITEMS-1; |
||
59 | itemcnt=i2-i1+1; |
||
60 | type=0; |
||
10 | reyssat | 61 | } |
62 | else { |
||
7673 | bpr | 63 | if(strcmp(li,"list")==0) { |
9007 | obado | 64 | p1=find_word_start(pp); |
65 | pp=wordchr(p1,"prompt"); if(pp!=NULL && pp>p1) *(pp-1)=0; |
||
66 | ovlstrcpy(vbuf,p1);substit(vbuf); |
||
67 | itemcnt=cutitems(vbuf,vlist,MAX_MENU_ITEMS); |
||
68 | type=1; |
||
7673 | bpr | 69 | } |
70 | else goto syntax; |
||
10 | reyssat | 71 | } |
72 | for(i=0;i<itemcnt;i++) plist[i]=NULL; |
||
73 | if(pp!=NULL) { |
||
7673 | bpr | 74 | p1=find_word_start(pp+strlen("prompt")); |
75 | ovlstrcpy(pbuf,p1);substit(pbuf); |
||
76 | cutitems(pbuf,plist,MAX_MENU_ITEMS); |
||
10 | reyssat | 77 | } |
3718 | reyssat | 78 | ovlstrcpy(nbuf,n);substit(nbuf); |
10 | reyssat | 79 | if(kind==FORM_SELECT) { |
7673 | bpr | 80 | char *pp; |
81 | pp=getvar("wims_formselect_switch"); if(pp==NULL) pp=""; |
||
82 | output("<select %s name=\"%s\" id=\"%s\">\n",pp,nbuf,nbuf); |
||
10 | reyssat | 83 | } |
7515 | bpr | 84 | if(kind==FORM_BAR) { |
85 | s=getvar("wims_ref_class"); |
||
86 | if(s!=NULL && *s!=0 && !isspace(*s)) { |
||
9042 | bpr | 87 | snprintf(pfrb,sizeof(pfrb)," <span class=\"%s\">",s); strcpy(pfre,"</span>"); |
88 | } else { pfrb[0]=0; pfre[0]=0; } |
||
7515 | bpr | 89 | output("%s<span style=\"font-weight:bold;\">-</span>",pfrb); |
90 | } |
||
10 | reyssat | 91 | val=getvar(nbuf);if(val==NULL) val=""; |
9007 | obado | 92 | |
93 | s = getvar("wims_ref_id"); |
||
9042 | bpr | 94 | if(s!=NULL && *s!=0 && !isspace(*s)) { strcpy(input_id,s); } |
95 | else { strcpy(input_id,nbuf);} |
||
9007 | obado | 96 | |
10 | reyssat | 97 | for(i=0;i<itemcnt;i++) { |
7673 | bpr | 98 | if(type==0) { |
9007 | obado | 99 | snprintf(buf,sizeof(buf),"%d",i+i1); |
100 | p0=buf; |
||
7673 | bpr | 101 | } |
102 | else p0=vlist[i]; |
||
103 | if(*find_word_start(p0)==0) continue; |
||
104 | if(plist[i]==NULL) plist[i]=p0; |
||
105 | if(*val!=0 && |
||
106 | (strcmp(p0,val)==0 || |
||
107 | ( (kind==FORM_SELECT || kind==FORM_CHECKBOX) |
||
108 | && itemchr(val,p0)!=NULL))) { |
||
109 | if(kind==FORM_SELECT) pc=" selected=\"selected\""; |
||
110 | else pc=" checked=\"checked\""; |
||
111 | } |
||
112 | else pc=""; |
||
9007 | obado | 113 | |
114 | s = getvar("wims_ref_class"); |
||
9042 | bpr | 115 | hmode=getvar("wims_html_mode"); |
116 | pfrb[0]=0; pfre[0]=0; |
||
9007 | obado | 117 | if(s!=NULL && *s!=0 && !isspace(*s)) { |
9042 | bpr | 118 | if(hmode==NULL || *hmode==0 || isspace(*hmode)) { |
119 | hmode="span"; |
||
9007 | obado | 120 | } |
9042 | bpr | 121 | snprintf(pfrb, sizeof(pfrb), "<%s class=\"%s\">", hmode, s); |
122 | snprintf(pfre, sizeof(pfre), "</%s>", hmode); |
||
123 | } else { |
||
124 | if(hmode!=NULL && *hmode!=0) { |
||
125 | snprintf(pfrb, sizeof(pfrb), "<%s>", hmode); |
||
126 | snprintf(pfre, sizeof(pfre), "</%s>", hmode); |
||
127 | } |
||
9007 | obado | 128 | } |
7673 | bpr | 129 | switch(kind) { |
9044 | bpr | 130 | case FORM_RADIO: name="radio"; break; |
131 | case FORM_CHECKBOX: name="checkbox"; break; |
||
9048 | bpr | 132 | default: name=""; |
9044 | bpr | 133 | } |
134 | switch(kind) { |
||
9007 | obado | 135 | case FORM_SELECT: |
136 | output("<option value=\"%s\"%s>%s</option>\n", p0, pc, plist[i]); |
||
7673 | bpr | 137 | break; |
7515 | bpr | 138 | |
9007 | obado | 139 | case FORM_RADIO: |
140 | case FORM_CHECKBOX: |
||
9132 | obado | 141 | if (itemcnt > 1) { |
9930 | obado | 142 | output("%s<input type=\"%s\" name=\"%s\" id=\"%s_%d\" value=\"%s\"%s/><label for=\"%s_%d\">%s</label>%s", |
9044 | bpr | 143 | pfrb,name,nbuf,input_id,i+1,p0,pc,input_id,i+1,plist[i],pfre); |
144 | } else { |
||
145 | output("%s<input type=\"%s\" name=\"%s\" id=\"%s\" value=\"%s\"%s/><label for=\"%s\">%s</label>%s", |
||
146 | pfrb,name,nbuf,input_id,p0,pc,input_id,plist[i],pfre); |
||
147 | } |
||
9042 | bpr | 148 | if(i<itemcnt-1 && itemcnt>2 && (hmode==NULL || *hmode==0)) _output_(","); |
7673 | bpr | 149 | _output_("\n"); |
150 | break; |
||
9007 | obado | 151 | case FORM_BAR: |
9930 | obado | 152 | output("<input type=\"radio\" name=\"%s\" id=\"%s_%d\" value=\"%s\"%s/>", |
9044 | bpr | 153 | nbuf,input_id,i+1,p0,pc); |
7673 | bpr | 154 | break; |
155 | } |
||
10 | reyssat | 156 | } |
9042 | bpr | 157 | setvar("wims_ref_class",""); |
9132 | obado | 158 | setvar("wims_ref_id",""); |
9042 | bpr | 159 | setvar("wims_html_mode",""); |
10 | reyssat | 160 | if(kind==FORM_SELECT) _output_("</select>"); |
7515 | bpr | 161 | if(kind==FORM_BAR) output("<span style=\"font-weight:bold;\">+</span>%s",pfre); |
10 | reyssat | 162 | } |
163 | |||
164 | void exec_formselect(char *p) |
||
165 | { |
||
166 | _form_menus(p,FORM_SELECT); |
||
167 | } |
||
168 | |||
169 | void exec_formradio(char *p) |
||
170 | { |
||
171 | _form_menus(p,FORM_RADIO); |
||
172 | } |
||
173 | |||
174 | void exec_formcheckbox(char *p) |
||
175 | { |
||
176 | _form_menus(p,FORM_CHECKBOX); |
||
177 | } |
||
178 | |||
179 | void exec_formbar(char *p) |
||
180 | { |
||
181 | _form_menus(p,FORM_BAR); |
||
182 | } |
||
183 |