1# -*- perl -*-
2
3#
4# $Id: HTML.pm,v 1.7 2003/10/22 21:36:11 eserte Exp eserte $
5# Author: Slaven Rezic
6#
7# Copyright (C) 1999 Slaven Rezic. All rights reserved.
8# This package is free software; you can redistribute it and/or
9# modify it under the same terms as Perl itself.
10#
11# Mail: slaven@rezic.de
12# WWW:  http://www.rezic.de/eserte/
13#
14
15package BikePower::HTML;
16use BikePower;
17use strict;
18use vars qw($fontstr $VERSION);
19
20$fontstr = "";
21$VERSION = "0.02";
22
23# XXX englische Version
24
25sub cgi {
26    require CGI;
27    my $q = CGI->new;
28    print $q->header;
29    print code();
30}
31
32sub code {
33    head() . body();
34}
35
36sub head {
37    my $head = <<'EOF';
38<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <!-- -*-html-*- -->
39<html><head>
40<title>BikePower: pers&ouml;nliche Einstellungen</title>
41<link rev=made href="mailto:slaven@rezic.de">
42<meta name="viewport" content="width=device-width; initial-scale=1.0, max-scale=1.0, user-scalable=no">
43EOF
44    $head .= set_personal_settings_js_code();
45    $head .= get_personal_settings_js_code();
46    $head .= "</head>\n";
47    $head;
48}
49
50sub body {
51    my $body = <<'EOF';
52<body onload="get_personal_settings()" bgcolor="#ffffff">
53EOF
54    $body .= $fontstr . <<'EOF';
55<h1>BikePower: pers&ouml;nliche Einstellungen</h1>
56<form name=personalsettings  onSubmit="set_personal_settings(); window.close(); return true;">
57<table>
58EOF
59# <!--
60# Temperature: <input type=text name=temperature>�C<br>
61# Wind velocity: <input type=text name=vw>m/s<br>
62# Crosswind: <input type=checkbox name=crosswind value=1><br>
63# Grade of hill: <input type=text name=
64# -->
65    $body .= <<EOF;
66<tr><td>${fontstr}Fahrergewicht</td><td>${fontstr} <input align=right type=text name=weightcyclist value="77" size=3> kg</td></tr>
67<tr><td>${fontstr}Gewicht von Rad+Kleidung</td><td>${fontstr} <input type=text name=weightmachine
68value="12" size=3> kg</td></tr>
69<tr><td>${fontstr}Haltung des Fahrers</td><td>${fontstr}<select name=frontalarea>
70EOF
71    foreach my $res_key (@BikePower::air_resistance_order) {
72	my $res = $BikePower::air_resistance{$res_key};
73	$body .= "<option value=\"" . $res->{A_c} . "\">"
74	  . $res->{'text_de'} . "\n";
75    }
76    $body .= <<EOF;
77</select></td></tr>
78<tr><td>${fontstr}Rollwiderstand</td><td>${fontstr} <select name=rollfriction>
79EOF
80    foreach my $r (@BikePower::rolling_friction) {
81	$body .= "<option value=\"" . $r->{'R'} . "\">"
82	  . $r->{'text_de'} . "\n";
83    }
84    $body .= <<EOF;
85</select></td></tr>
86<tr><td>${fontstr}Effizienz der �bertragung</td><td>${fontstr} <input type=text name=transeff value="0.95" size=5></td></tr>
87</table>
88<input type=submit value="Werte sichern"> <a href="javascript:window.close()">Schlie�en</a>
89</form>
90</body></html>
91EOF
92    $body;
93}
94
95sub set_personal_settings_js_code {
96    <<'EOF'
97<script language=javascript><!--
98function set_personal_settings() {
99  var cookie;
100  cookie = "BikePower=" +
101           "frontalarea=" + document.personalsettings.frontalarea[document.personalsettings.frontalarea.selectedIndex].value + ":" +
102           "transeff=" + document.personalsettings.transeff.value + ":" +
103           "rollfriction=" + document.personalsettings.rollfriction[document.personalsettings.rollfriction.selectedIndex].value + ":" +
104           "weightcyclist=" + document.personalsettings.weightcyclist.value + ":" +
105           "weightmachine=" + document.personalsettings.weightmachine.value;
106  var expires = new Date;
107  expires.setTime(expires.getTime() + 1000*60*60*24*365*5);
108  document.cookie = cookie + "; expires=" + expires.toGMTString();
109}
110// --></script>
111EOF
112}
113
114sub get_personal_settings_js_code {
115    my $code = <<'EOF';
116<script language=javascript><!--
117function adjust_frontalarea(val) {
118    var f = new Array(
119EOF
120    my $need_comma;
121    foreach my $res_key (@BikePower::air_resistance_order) {
122	my $res = $BikePower::air_resistance{$res_key};
123	if ($need_comma) {
124	    $code .= ", ";
125	} else {
126	    $need_comma = 1;
127	}
128	$code .= "$res->{A_c}";
129    }
130    $code .= <<'EOF';
131    );
132    var i;
133    var inx = 0;
134    for (i in f) {
135        if (val >= f[i]) return inx;
136        inx++;
137    }
138    return inx-1;
139}
140
141function adjust_rollfriction(val) {
142    var f = new Array(
143EOF
144    $need_comma = 0;
145    foreach my $r (@BikePower::rolling_friction) {
146	if ($need_comma) {
147	    $code .= ", ";
148	} else {
149	    $need_comma = 1;
150	}
151	$code .= "$r->{R}";
152    }
153    $code .= <<'EOF';
154    );
155    var i;
156    var inx = 0;
157    for (i in f) {
158        if (val <= f[i]) return inx;
159        inx++;
160    }
161    return inx-1;
162}
163
164var token_str;
165var token_delim;
166
167function init_tokenizer(str, delim) {
168  token_str = str;
169  token_delim = delim;
170}
171
172function get_next_token() {
173  if (token_str == "") return token_str;
174  var inx = token_str.indexOf(token_delim);
175  var ret;
176  if (inx == -1) {
177    ret = token_str;
178    token_str = "";
179  } else {
180    ret = token_str.substring(0, inx);
181    token_str = token_str.substring(inx+1, token_str.length);
182  }
183  return ret;
184}
185
186var token_val;
187var token_key;
188
189function get_key_val(str) {
190  var inx = str.indexOf("=");
191  if (inx == -1) {
192    token_val = str;
193    token_key = "";
194  } else {
195    token_val = str.substring(0, inx);
196    token_key = str.substring(inx+1, str.length);
197  }
198}
199
200
201function get_personal_settings() {
202  var rest_cookie = document.cookie;
203  while (rest_cookie != "") {
204     var endofcookie = rest_cookie.indexOf(";");
205     if (endofcookie == -1) endofcookie = rest_cookie.length
206     var this_cookie = rest_cookie.substring(0, endofcookie);
207     rest_cookie = rest_cookie.substring(endofcookie+1);
208     while (rest_cookie.substring(0, 1) == " ") {
209       rest_cookie = rest_cookie.substring(1);
210     }
211     var endofcookiekey = this_cookie.indexOf("=");
212     var cookie_key = this_cookie.substring(0, endofcookiekey);
213     if (cookie_key != "BikePower") continue;
214     var cookie_val = this_cookie.substring(endofcookiekey+1);
215
216     init_tokenizer(cookie_val, ":");
217     while(1) {
218       var valkey = get_next_token();
219       if (valkey == "") break;
220       get_key_val(valkey);
221       var val = token_val;
222       var key = token_key;
223       if (val == "frontalarea") {
224         document.personalsettings.frontalarea.selectedIndex = adjust_frontalarea(key);
225       } else if (val == "transeff") {
226         document.personalsettings.transeff.value = key;
227       } else if (val == "rollfriction") {
228         document.personalsettings.rollfriction.selectedIndex = adjust_rollfriction(key);
229       } else if (val == "weightcyclist") {
230         document.personalsettings.weightcyclist.value = key;
231       } else if (val == "weightmachine") {
232	 document.personalsettings.weightmachine.value = key;
233       }
234     }
235     break;
236  }
237  return true;
238}
239// --></script>
240EOF
241    $code;
242}
243
244sub new_from_cookie {
245    my $q = shift; # CGI object
246
247    my $raw_cookie = $q->raw_cookie;
248    return if !defined $raw_cookie || $raw_cookie eq '';
249    my(@cookies) = split(/;\s*/, $raw_cookie);
250    my %bikepower_def;
251  TRY_COOKIE: {
252	foreach (@cookies) {
253	    my($name, $cookie_def) = split(/=/, $_, 2);
254	    if ($name eq 'BikePower') {
255		foreach (split(/:/, $cookie_def)) {
256		    my($key, $val) = split(/=/, $_);
257		    $bikepower_def{$key} = $val;
258		}
259		last TRY_COOKIE;
260	    }
261	}
262	return;
263    }
264
265    require BikePower;
266    my $bp_obj = new BikePower '-no-ini' => 1;
267    foreach (['frontalarea', 'A_c'],
268	     ['transeff', 'transmission_efficiency'],
269	     ['rollfriction', 'rolling_friction'],
270	     ['weightcyclist', 'weight_cyclist'],
271	     ['weightmachine', 'weight_machine'],
272	    ) {
273	my($cgidef, $method) = ($_->[0], $_->[1]);
274	if (exists $bikepower_def{$cgidef}) {
275	    my $eval = '$bp_obj->' . $method . '($bikepower_def{$cgidef})';
276	    eval $eval;
277	    warn $@ if $@; # XXX
278	}
279    }
280
281    $bp_obj;
282}
283
2841;
285
286__END__
287