Go live.
[readifood.git] / lib / area.php
1 <?php
2
3   if ($_POST['area_name']) {
4     $id = add_area($_POST['area_name'], $_POST['city_id']);
5     if ($id !== false) {
6       echo "<p>Added area.</p>\n";
7       $parameters = array($_POST['area_name'], $id);
8     }
9   }
10   else if ($_POST['city_id']) {
11     /* XXX: city_id is actually a string $city_name/$city_id */
12     header(sprintf("Location: http%s://%s/%s/in/%s", ($_SERVER['HTTPS']) ? "s" : "", $_SERVER['HTTP_HOST'], $module, $_POST['city_id']));
13     exit;
14   }
15   else if ($_POST['update_area']) {
16     update_area_delivery_days($parameters[0]);
17   }
18
19   function show_areas($offset, $per_page, $city_name = null, $city_id = null) {
20     if (isset($city_name) || isset($city_id)) {
21       if (isset($city_id)) $city = get_city_by_id($city_id);
22       else if ($city_name) $city = get_city_by_name($city_name);
23       if ($city) {
24         echo "<p>Areas in " . $city->getLink(get_city_displayname($city)) . ":";
25         $q = new AreaQuery;
26         $areas = $q->filterByCityId($city_id)->find();
27
28         if (count($areas)) {
29           foreach ($areas as $area) {
30             echo "<br>\nArea: " . $area->getStrongLink();
31             printf(" <a class=\"small\" href=\"/contact/in/area/%s/%d\">Contacts</a>", urlencode($area->getName()), $area->getId());
32             printf(" <a class=\"small\" href=\"/donation/in/area/%s/%d\">Donations</a>", urlencode($area->getName()), $area->getId());
33             printf(" <a class=\"small\" href=\"/order/in/area/%s/%d\">Orders</a>", urlencode($area->getName()), $area->getId());
34             if (check_admin(1)) {
35               echo " " . $area->getDeleteLink();
36             }
37           }
38         }
39         else echo " none";
40         echo "</p>\n";
41       }
42       else echo "<p>No such city!</p>\n";
43     }
44   }
45
46   function show_area_cities_form($city_id = null) {
47     $q = new CityQuery;
48     $cities = $q->find();
49     if (! count($cities)) {
50       echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
51       return;
52     }
53
54     echo "<form method=\"POST\" action=\"" . $_SCRIPT['REQUEST_URI'] . "\">\n";
55     echo "<p>Show areas in\n";
56     echo "<select name=\"city_id\">\n";
57     foreach ($cities as $city) {
58       option("city_id", sprintf("%s/%s", $city->getName(), $city->getId()), get_city_displayname($city));
59     }
60     echo "</select>\n";
61     echo "<input type=\"submit\" value=\"Show\">\n";
62     echo "</form>\n";
63   }
64
65   function show_new_area_form($city_id = null) {
66     if (! check_admin(1)) return;
67
68     $q = new CityQuery;
69     $cities = $q->find();
70     if (! count($cities)) {
71       echo "<p>No <a href=\"/city\">cities</a>!</p>\n";
72       return;
73     }
74
75     echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
76     echo "<p>Add a new area <input name=\"area_name\">\n";
77     echo "in <select name=\"city_id\">\n";
78
79     foreach ($cities as $city) {
80       option("city_id", $city->getId(), get_city_displayname($city));
81     }
82     echo "</select>\n";
83     echo "<input type=\"submit\" value=\"Add\">\n";
84     echo "</form>\n";
85   }
86
87   function add_area($name, $city_id) {
88     if (! check_admin(1, "add an area")) return;
89
90     $name = urldecode($name);
91     $area = get_area_by_name($name, false);
92     if ($area) {
93       echo "<p>$name already exists!</p>\n";
94       show_area($name);
95       return false;
96     }
97
98     $city = get_city_by_id($city_id);
99     if (! $city) {
100       echo "<p>Not a valid city!</p>\n";
101       return false;
102     }
103
104     $area = new Area;
105     $area->setName($name);
106     $area->setCityId($city_id);
107
108     try {
109       $area->save();
110     }
111     catch (Exception $e) {
112       echo "<p>Error adding $name!</p>\n";
113       /* XXX: Why? */
114       return false;
115     }
116
117     return $area->getId();
118   }
119
120   function delete_city($name) {
121     if (! check_admin(1, "delete a city")) return;
122
123     $city = get_city_by_name($name);
124     if (! $city) return false;
125
126     try {
127       $city->delete();
128     }
129     catch (Exception $e) {
130       echo "<p>Error deleting $name!</p>\n";
131       /* XXX: Why? Check for addresses in use... */
132       return false;
133     }
134
135     return true;
136   }
137
138   function show_area_delivery_days_form($days) {
139     global $week;
140     echo "Delivery days:";
141     if (check_admin(1)) {
142       for ($i = 0; $i < count($week); $i++) {
143         echo " <input type=\"checkbox\" name=\"day_$i\"";
144         if ($days & (1 << $i)) echo " checked";
145         echo ">$week[$i]\n";
146       }
147     }
148     else {
149       if (! $days) echo " none";
150       else {
151         for ($i = 0; $i < count($week); $i++) {
152           if ($days & (1 << $i)) echo " $week[$i]";
153         }
154       }
155     }
156   }
157
158   function update_area_delivery_days($name) {
159     global $week;
160
161     if (! check_admin(1, "edit an area")) return false;
162
163     $days = 0;
164     for ($i = 0; $i < count($week); $i++) {
165       if ($_POST['day_' . $i] == "on") $days |= (1 << $i);
166     }
167
168     $area = get_area_by_name($name);
169     if (! $area) return false;
170
171     $area->setDays($days);
172
173     try {
174       $area->save();
175     }
176     catch (Exception $e) {
177       echo "<p>Error updating area!</p>\n";
178       return false;
179     }
180
181     echo "<p>Updated area.</p>\n";
182     return true;
183   }
184
185   function delete_area($name, $id = null, &$city_id = null) {
186     if (! check_admin(1, "delete a area")) return;
187
188     if (isset($id)) $area = get_area_by_id($id);
189     else $area = get_area_by_name($name);
190     if (! $area) return false;
191
192     /* Remember city ID for dropdown. */
193     $city_id = $area->getCityId();
194
195     try {
196       $area->delete();
197       echo "<p>Deleted area.</p>\n";
198     }
199     catch (Exception $e) {
200       echo "<p>Error deleting $name!</p>\n";
201       /* XXX: Why? Check for addresses in use... */
202       return false;
203     }
204
205     return true;
206   }
207
208   function show_area($name, &$city_id = null) {
209     $area = get_area_by_name($name);
210     if (! $area) return;
211
212     echo "<form method=\"POST\" action=\"" . $_SERVER['REQUEST_URI'] . "\">\n";
213     echo "<p>Area: <span class=\"strong\">" . $area->getName() . "</span>";
214     printf(" <a class=\"small\" href=\"/contact/in/area/%s/%d\">Contacts</a>", urlencode($area->getName()), $area->getId());
215     printf(" <a class=\"small\" href=\"/donation/in/area/%s/%d\">Donations</a>", urlencode($area->getName()), $area->getId());
216     printf(" <a class=\"small\" href=\"/order/in/area/%s/%d\">Orders</a>", urlencode($area->getName()), $area->getId());
217     if (check_admin(1)) {
218       echo " " . $area->getDeleteLink();
219     }
220     $city = get_city_by_id($area->getCityId());
221     if ($city) {
222       /* Remember city ID for dropdown. */
223       $city_id = $city->getId();
224       echo " in " . $city->getLink(get_city_displayname($city));
225     }
226     echo ": ";
227     echo "\n<br>";
228     show_area_delivery_days_form($area->getDays());
229     if (check_admin(1)) {
230       echo "<input type=\"submit\" name=\"update_area\" value=\"Update\">\n";
231     }
232     echo "</p>\n";
233     echo "</form>\n";
234   }
235
236   /* /area/in/Cambridge/1 */
237   if (count($parameters)) {
238     if ($parameters[0] == "in") {
239       $city_id = $parameters[2];
240       show_areas(0, 10, $parameters[1], $city_id);
241       show_new_area_form($city_id);
242     }
243   }
244   list($name, $id, $args) = parse_parameters($parameters);
245   //echo "<p>$name($id) " . print_r($args, true) . "</p>\n";
246   if (count($args)) {
247     switch ($args[0]) {
248       case "delete":
249         delete_area($name, $id, $city_id);
250       break;
251     }
252   }
253   else if (isset($name)) show_area($name, $city_id);
254   else {
255     show_area_cities_form($city_id);
256     show_new_area_form($city_id);
257   }
258
259   if (count($parameters))
260     show_area_cities_form($city_id);
261 ?>