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ö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ö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