--- a/busui/about.php +++ b/busui/about.php @@ -1,23 +1,24 @@ <?php include('common.inc.php'); +include_header("About","about") ?> <p> - Busness Time - An ACT bus timetable webapp -Based on the maxious-canberra-transit-feed -Uses jQuery Mobile, PHP, Ruby, Python, Google Transit Feed Specification tools, OpenTripPlanner, OpenLayers, OpenStreetMap, Cloudmade Geocoder and Tile Service - -Feedback encouraged; contact maxious@lambdacomplex.org - -Some icons by Joseph Wain / glyphish.com - - -Disclaimer: The content of this website is of a general and informative nature. Please check with printed timetables or those available on http://action.act.gov.au before your trip. +Busness Time - An ACT bus timetable webapp<br /> +Based on the maxious-canberra-transit-feed (<a href="cbrfeed.zip">download</a>, last updated <?php echo date("F d Y.", @filemtime('cbrfeed.zip')); ?>)<br /> +Source code for the transit feed and this site @ <a href="http://maxious.lambdacomplex.org/git">http://maxious.lambdacomplex.org/git</a><br /> +Uses jQuery Mobile, PHP, Ruby, Python, Google Transit Feed Specification tools, OpenTripPlanner, OpenLayers, OpenStreetMap, Cloudmade Geocoder and Tile Service<br /> +<br /> +Feedback encouraged; contact maxious@lambdacomplex.org<br /> + <br /> +Some icons by Joseph Wain / glyphish.com<br /> +<br /> +<small>Disclaimer: The content of this website is of a general and informative nature. Please check with printed timetables or those available on http://action.act.gov.au before your trip. Whilst every effort has been made to ensure the high quality and accuracy of the Site, the Author makes no warranty, express or implied concerning the topicality, correctness, completeness or quality of the information, which is provided "as is". The Author expressly disclaims all warranties, including but not limited to warranties of fitness for a particular purpose and warranties of merchantability. All offers are not binding and without obligation. The Author expressly reserves the right, in his discretion, to suspend, change, modify, add or remove portions of the Site and to restrict or terminate the use and accessibility of the Site -without prior notice. +without prior notice. </small> <? include_footer(); ?>
--- a/busui/common.inc.php +++ b/busui/common.inc.php @@ -30,20 +30,26 @@ return $_SERVER['SERVER_NAME'] == "10.0.1.154" || $_SERVER['SERVER_NAME'] == "localhost" || $_SERVER['SERVER_NAME'] == "127.0.0.1" || !$_SERVER['SERVER_NAME']; } +function isMetricsOn() +{ + return true; +} + function debug($msg) { if (isDebug()) echo "<!-- $msg -->"; } function isFastDevice() { + $fastDevices = Array("Mozilla/5.0 (X11;", "Mozilla/5.0 (Windows;", "Mozilla/5.0 (iP", "Mozilla/5.0 (Linux; U; Android", "Mozilla/4.0 (compatible; MSIE"); + $slowDevices = Array("J2ME","MIDP","Opera/","Mozilla/2.0 (compatible;","Mozilla/3.0 (compatible;"); return true; } -function include_header($pageTitle, $opendiv = true, $geolocate = false) { +function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false) { echo ' <!DOCTYPE html> <html> <head> - <title>busness time - '.$pageTitle.'</title> - '; + <title>'.$pageTitle.'</title>'; if (isDebug()) echo '<link rel="stylesheet" href="css/jquery-mobile-1.0a3.css" /> <script type="text/javascript" src="js/jquery-1.5.js"></script> <script type="text/javascript" src="js/jquery-mobile-1.0a3.js"></script>'; @@ -73,6 +79,13 @@ .ui-listview-filter { margin: 0 !important; } + #footer { + text-size: 0.75em; + text-align: center; + } + body { + background-color: #F0F0F0; + } </style> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> @@ -97,19 +110,34 @@ </script> "; } -echo '</head> -<body> +echo '</head> +<body> '; + if (isMetricsOn()) { + require_once('owa/owa_env.php'); + require_once(OWA_DIR.'owa_php.php'); + $owa = new owa_php(); + $owa->setSiteId('bus.lambdacomplex.org'); + $owa->setPageTitle($pageTitle); + $owa->setPageType($pageType); + $owa->trackPageView(); + $owa->placeHelperPageTags(); + } + if ($opendiv) { echo '<div data-role="page"> - + <script> +$(document).ready(function () +{ + document.title = "'.$pageTitle.'"; +}); +</script> <div data-role="header"> <h1>'.$pageTitle.'</h1> </div><!-- /header --> <div data-role="content"> '; } } - function include_footer() { if ($geolocate && isset($_SESSION['lat'])) { @@ -118,7 +146,8 @@ $('#here').show(); </script>"; } - echo '</div>'; + echo '<div id="footer"><a href="about.php">About/Contact Us</a> <a href="feedback.php">Feedback/Bug Report</a></a>'; + echo '</div>'; } $service_periods = Array ('sunday','saturday','weekday');
Binary files /dev/null and b/busui/css/images/ajax-loader.png differ
Binary files /dev/null and b/busui/css/images/form-check-off.png differ
Binary files /dev/null and b/busui/css/images/form-check-on.png differ
Binary files /dev/null and b/busui/css/images/form-radio-off.png differ
Binary files /dev/null and b/busui/css/images/form-radio-on.png differ
Binary files /dev/null and b/busui/css/images/icon-search-black.png differ
Binary files /dev/null and b/busui/css/images/icons-18-black.png differ
Binary files /dev/null and b/busui/css/images/icons-18-white.png differ
Binary files /dev/null and b/busui/css/images/icons-36-black.png differ
Binary files /dev/null and b/busui/css/images/icons-36-white.png differ
--- /dev/null +++ b/busui/feedback.php @@ -1,1 +1,18 @@ +<?php +include('common.inc.php'); +include_header("Feedback","feedback") +?> +<h3>Add/Move/Delete a Bus Stop Location</h3> +StopID: +or StopCode: +Suggested Stop Location (lat/long or words): + +<h3>Bug Report/Feedback</h3> +<textarea id="extrainfo"> + Referrer URL + User Agent + User host/IP + Current date/time + Dump of $_SESSION +</textarea>
--- a/busui/index.php +++ b/busui/index.php @@ -1,6 +1,6 @@ <?php include('common.inc.php'); -include_header("bus.lambdacomplex.org",false, true) +include_header("bus.lambdacomplex.org","index",false, true) ?> <div data-role="page"> <div data-role="content"> @@ -21,9 +21,8 @@ <li><a href="routeList.php?bynumber=yes">Routes By Number</a></li> <li><a class="nearby" href="routeList.php?nearby=yes">Nearby Routes</a></li> </ul> -<?php echo timePlaceSettings();?> +<?php +echo timePlaceSettings(); +include_footer(true) +?> - </div> - </body> -</html> -
--- /dev/null +++ b/busui/layar_api.php @@ -1,1 +1,58 @@ +<?php +include('common.inc.php'); +$output = Array(); +$output['hotspots'] = Array(); +$output['layer'] = "canberrabusstops"; +$max_page = 10; +$max_results = 50; +$page_start = 0+$_REQUEST['pageKey']; +$page_end = $max_page+$_REQUEST['pageKey']; + +$url = $APIurl."/json/neareststops?lat={$_REQUEST['lat']}&lon={$_REQUEST['lon']}&limit=50"; +$contents = json_decode(getPage($url)); +debug(print_r($contents,true)); +$stopNum = 0; +foreach ($contents as $row) +{ + $stopNum++; + if ($stopNum > $page_start && $stopNum <= $page_end) { + $hotspot = Array(); + $hotspot['id'] = $row[0]; + $hotspot['title'] = $row[1]; + $hotspot['type'] = 0; + $hotspot['lat'] = floor($row[2]*1000000); + $hotspot['lon'] = floor($row[3]*1000000); + $hotspot['distance'] = distance($row[2], $row[3], $_REQUEST['lat'], $_REQUEST['lon']); + if (!isset($_REQUEST['radius']) || $hotspot['distance'] < $_REQUEST['radius']) { + $hotspot['actions'] = Array(Array("label" => 'View more trips/information', 'uri' => 'http://bus.lambdacomplex.org/'.'stop.php?stopid='.$row[0])); + $url = $APIurl."/json/stoptrips?stop=".$row[0]."&time=".midnight_seconds()."&service_period=".service_period(); + $trips = json_decode(getPage($url)); + debug(print_r($trips,true)); + foreach ($trips as $key => $row) + { + if ($key < 3) { + $hotspot['line'.strval($key+2)]= $row[1][1] .' @ ' .midnight_seconds_to_time($row[0]); + } + } + if (sizeof($trips) == 0) $hotspot['line2'] = 'No trips in the near future.'; + $output['hotspots'][] = $hotspot; + } + } +} +if (sizeof($hotspot) > 0) { + $output['errorString'] = 'ok'; + $output['errorCode'] = 0; + } else { + $output['errorString'] = 'no results, try increasing range'; + $output['errorCode'] = 21; +} +if ($page_end >= $max_results || sizeof($hotspot) < $max_page) { + $output["morePages"] = false; + $output["nextPageKey"] = null; +} else { + $output["morePages"] = true; + $output["nextPageKey"] = $page_end; +} +echo json_encode($output); +?>
--- /dev/null +++ b/busui/owa/Callbacks.inc @@ -1,1 +1,10 @@ +<?php + +/** + * Gallery Template Callbacks class placeholder + * Needed for fake out the require_once() in Gallery's template class callback method + * See OWA Gallery module for the actual callback class + */ + +?>
--- /dev/null +++ b/busui/owa/action.php @@ -1,1 +1,48 @@ +<?php +// +// Open Web Analytics - An Open Source Web Analytics Framework +// +// Copyright 2006 Peter Adams. All rights reserved. +// +// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// $Id$ +// + +include_once('owa_env.php'); +require_once(OWA_BASE_DIR.'/owa_php.php'); + +/** + * Special HTTP Requests Controler + * + * @author Peter Adams <peter@openwebanalytics.com> + * @copyright Copyright © 2006 Peter Adams <peter@openwebanalytics.com> + * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0 + * @category owa + * @package owa + * @version $Revision$ + * @since owa 1.0.0 + * @depricated + */ + +$owa = new owa_php; + +$owa->e->debug('Special action request received by action.php...'); + +if ( $owa->isEndpointEnabled( basename( __FILE__ ) ) ) { + + // run controller or view and echo page content + echo $owa->handleRequestFromURL(); +} else { + // unload owa + $owa->restInPeace(); +} + +?>
--- /dev/null +++ b/busui/owa/api.php @@ -1,1 +1,49 @@ +<?php +// +// Open Web Analytics - An Open Source Web Analytics Framework +// +// Copyright 2006 Peter Adams. All rights reserved. +// +// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// $Id$ +// + +include_once('owa_env.php'); +require_once(OWA_BASE_DIR.'/owa_php.php'); + +/** + * REST API + * + * @author Peter Adams <peter@openwebanalytics.com> + * @copyright Copyright © 2010 Peter Adams <peter@openwebanalytics.com> + * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0 + * @category owa + * @package owa + * @version $Revision$ + * @since owa 1.3.0 + * @link http://wiki.openwebanalytics.com/index.php?title=REST_API + */ + +// define entry point cnstant +define('OWA_API', true); +// invoke OWA +$owa = new owa_php; + +if ( $owa->isEndpointEnabled( basename( __FILE__ ) ) ) { + + // run api command and echo page content + echo $owa->handleRequest('', 'base.apiRequest'); +} else { + // unload owa + $owa->restInPeace(); +} + +?>
--- /dev/null +++ b/busui/owa/cli.php @@ -1,1 +1,92 @@ +<?php +// +// Open Web Analytics - An Open Source Web Analytics Framework +// +// Copyright 2006 Peter Adams. All rights reserved. +// +// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// $Id$ +// + +require_once('owa_env.php'); +require_once(OWA_DIR.'owa_php.php'); +require_once(OWA_BASE_CLASS_DIR.'cliController.php'); + +/** + * OWA Comand Line Interface (CLI) + * + * @author Peter Adams <peter@openwebanalytics.com> + * @copyright Copyright © 2010 Peter Adams <peter@openwebanalytics.com> + * @license http://www.gnu.org/copyleft/gpl.html GPL v2.0 + * @category owa + * @package owa + * @version $Revision$ + * @since owa 1.2.1 + */ + +define('OWA_CLI', true); + +if (!empty($_POST)) { + exit(); +} elseif (!empty($_GET)) { + exit(); +} elseif (!empty($argv)) { + $params = array(); + // get params from the command line args + // $argv is a php super global variable + + for ($i=1; $i<count($argv);$i++) + { + $it = split("=",$argv[$i]); + $params[$it[0]] = $it[1]; + } + unset($params['action']); + unset($params['do']); + +} else { + // No params found + exit(); +} + +// Initialize owa +$owa = &new owa_php; + +if ( $owa->isEndpointEnabled( basename( __FILE__ ) ) ) { + + // setting CLI mode to true + $owa->setSetting('base', 'cli_mode', true); + // setting user auth + $owa->setCurrentUser('admin', 'cli-user'); + // run controller or view and echo page content + $s = owa_coreAPI::serviceSingleton(); + $s->loadCliCommands(); + + if (array_key_exists('cmd', $params)) { + + $cmd = $s->getCliCommandClass($params['cmd']); + + if ($cmd) { + $params['do'] = $cmd; + echo $owa->handleRequest($params); + } else { + echo "Invalid command name."; + } + + } else { + echo "Missing a command argument."; + } + +} else { + // unload owa + $owa->restInPeace(); +} + +?>
--- /dev/null +++ b/busui/owa/conf/countryCodes2Names.php @@ -1,1 +1,253 @@ - +<?php +/** + * ISO-3166-1 http://en.wikipedia.org/wiki/ISO_3166-1 + */ +$countryCode2Name = array ( + 'AF' => 'Afghanistan', + 'AX' => 'Åland Islands', + 'AL' => 'Albania', + 'DZ' => 'Algeria', + 'AS' => 'American Samoa', + 'AD' => 'Andorra', + 'AO' => 'Angola', + 'AI' => 'Anguilla', + 'AQ' => 'Antarctica', + 'AG' => 'Antigua and Barbuda', + 'AR' => 'Argentina', + 'AM' => 'Armenia', + 'AW' => 'Aruba', + 'AU' => 'Australia', + 'AT' => 'Austria', + 'AZ' => 'Azerbaijan', + 'BS' => 'Bahamas', + 'BH' => 'Bahrain', + 'BD' => 'Bangladesh', + 'BB' => 'Barbados', + 'BY' => 'Belarus', + 'BE' => 'Belgium', + 'BZ' => 'Belize', + 'BJ' => 'Benin', + 'BM' => 'Bermuda', + 'BT' => 'Bhutan', + 'BO' => 'Bolivia, Plurinational State of', + 'BA' => 'Bosnia and Herzegovina', + 'BW' => 'Botswana', + 'BV' => 'Bouvet Island', + 'BR' => 'Brazil', + 'IO' => 'British Indian Ocean Territory', + 'BN' => 'Brunei Darussalam', + 'BG' => 'Bulgaria', + 'BF' => 'Burkina Faso', + 'BI' => 'Burundi', + 'KH' => 'Cambodia', + 'CM' => 'Cameroon', + 'CA' => 'Canada', + 'CV' => 'Cape Verde', + 'KY' => 'Cayman Islands', + 'CF' => 'Central African Republic', + 'TD' => 'Chad', + 'CL' => 'Chile', + 'CN' => 'China', + 'CX' => 'Christmas Island', + 'CC' => 'Cocos (Keeling) Islands', + 'CO' => 'Colombia', + 'KM' => 'Comoros', + 'CG' => 'Congo', + 'CD' => 'Congo, the Democratic Republic of the', + 'CK' => 'Cook Islands', + 'CR' => 'Costa Rica', + 'CI' => "Côte d'Ivoire", + 'HR' => 'Croatia', + 'CU' => 'Cuba', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'DK' => 'Denmark', + 'DJ' => 'Djibouti', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'EC' => 'Ecuador', + 'EG' => 'Egypt', + 'SV' => 'El Salvador', + 'GQ' => 'Equatorial Guinea', + 'ER' => 'Eritrea', + 'EE' => 'Estonia', + 'ET' => 'Ethiopia', + 'FK' => 'Falkland Islands (Malvinas)', + 'FO' => 'Faroe Islands', + 'FJ' => 'Fiji', + 'FI' => 'Finland', + 'FR' => 'France', + 'GF' => 'French Guiana', + 'PF' => 'French Polynesia', + 'TF' => 'French Southern Territories', + 'GA' => 'Gabon', + 'GM' => 'Gambia', + 'GE' => 'Georgia', + 'DE' => 'Germany', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GR' => 'Greece', + 'GL' => 'Greenland', + 'GD' => 'Grenada', + 'GP' => 'Guadeloupe', + 'GU' => 'Guam', + 'GT' => 'Guatemala', + 'GG' => 'Guernsey', + 'GN' => 'Guinea', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HT' => 'Haiti', + 'HM' => 'Heard Island and McDonald Islands', + 'VA' => 'Holy See (Vatican City State)', + 'HN' => 'Honduras', + 'HK' => 'Hong Kong', + 'HU' => 'Hungary', + 'IS' => 'Iceland', + 'IN' => 'India', + 'ID' => 'Indonesia', + 'IR' => 'Iran, Islamic Republic of', + 'IQ' => 'Iraq', + 'IE' => 'Ireland', + 'IM' => 'Isle of Man', + 'IL' => 'Israel', + 'IT' => 'Italy', + 'JM' => 'Jamaica', + 'JP' => 'Japan', + 'JE' => 'Jersey', + 'JO' => 'Jordan', + 'KZ' => 'Kazakhstan', + 'KE' => 'Kenya', + 'KI' => 'Kiribati', + 'KP' => "Korea, Democratic People's Republic of", + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KG' => 'Kyrgyzstan', + 'LA' => "Lao People's Democratic Republic", + 'LV' => 'Latvia', + 'LB' => 'Lebanon', + 'LS' => 'Lesotho', + 'LR' => 'Liberia', + 'LY' => 'Libyan Arab Jamahiriya', + 'LI' => 'Liechtenstein', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'MO' => 'Macao', + 'MK' => 'Macedonia, the former Yugoslav Republic of', + 'MG' => 'Madagascar', + 'MW' => 'Malawi', + 'MY' => 'Malaysia', + 'MV' => 'Maldives', + 'ML' => 'Mali', + 'MT' => 'Malta', + 'MH' => 'Marshall Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MU' => 'Mauritius', + 'YT' => 'Mayotte', + 'MX' => 'Mexico', + 'FM' => 'Micronesia, Federated States of', + 'MD' => 'Moldova, Republic of', + 'MC' => 'Monaco', + 'MN' => 'Mongolia', + 'ME' => 'Montenegro', + 'MS' => 'Montserrat', + 'MA' => 'Morocco', + 'MZ' => 'Mozambique', + 'MM' => 'Myanmar', + 'NA' => 'Namibia', + 'NR' => 'Nauru', + 'NP' => 'Nepal', + 'NL' => 'Netherlands', + 'AN' => 'Netherlands Antilles', + 'NC' => 'New Caledonia', + 'NZ' => 'New Zealand', + 'NI' => 'Nicaragua', + 'NE' => 'Niger', + 'NG' => 'Nigeria', + 'NU' => 'Niue', + 'NF' => 'Norfolk Island', + 'MP' => 'Northern Mariana Islands', + 'NO' => 'Norway', + 'OM' => 'Oman', + 'PK' => 'Pakistan', + 'PW' => 'Palau', + 'PS' => 'Palestinian Territory, Occupied', + 'PA' => 'Panama', + 'PG' => 'Papua New Guinea', + 'PY' => 'Paraguay', + 'PE' => 'Peru', + 'PH' => 'Philippines', + 'PN' => 'Pitcairn', + 'PL' => 'Poland', + 'PT' => 'Portugal', + 'PR' => 'Puerto Rico', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'BL' => 'Saint Barthélemy', + 'SH' => 'Saint Helena', + 'KN' => 'Saint Kitts and Nevis', + 'LC' => 'Saint Lucia', + 'MF' => 'Saint Martin (French part)', + 'PM' => 'Saint Pierre and Miquelon', + 'VC' => 'Saint Vincent and the Grenadines', + 'WS' => 'Samoa', + 'SM' => 'San Marino', + 'ST' => 'Sao Tome and Principe', + 'SA' => 'Saudi Arabia', + 'SN' => 'Senegal', + 'RS' => 'Serbia', + 'SC' => 'Seychelles', + 'SL' => 'Sierra Leone', + 'SG' => 'Singapore', + 'SK' => 'Slovakia', + 'SI' => 'Slovenia', + 'SB' => 'Solomon Islands', + 'SO' => 'Somalia', + 'ZA' => 'South Africa', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'ES' => 'Spain', + 'LK' => 'Sri Lanka', + 'SD' => 'Sudan', + 'SR' => 'Suriname', + 'SJ' => 'Svalbard and Jan Mayen', + 'SZ' => 'Swaziland', + 'SE' => 'Sweden', + 'CH' => 'Switzerland', + 'SY' => 'Syrian Arab Republic', + 'TW' => 'Taiwan, Province of China', + 'TJ' => 'Tajikistan', + 'TZ' => 'Tanzania, United Republic of', + 'TH' => 'Thailand', + 'TL' => 'Timor-Leste', + 'TG' => 'Togo', + 'TK' => 'Tokelau', + 'TO' => 'Tonga', + 'TT' => 'Trinidad and Tobago', + 'TN' => 'Tunisia', + 'TR' => 'Turkey', + 'TM' => 'Turkmenistan', + 'TC' => 'Turks and Caicos Islands', + 'TV' => 'Tuvalu', + 'UG' => 'Uganda', + 'UA' => 'Ukraine', + 'AE' => 'United Arab Emirates', + 'GB' => 'United Kingdom', + 'US' => 'United States', + 'UM' => 'United States Minor Outlying Islands', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VU' => 'Vanuatu', + 'VE' => 'Venezuela, Bolivarian Republic of', + 'VN' => 'Viet Nam', + 'VG' => 'Virgin Islands, British', + 'VI' => 'Virgin Islands, U.S.', + 'WF' => 'Wallis and Futuna', + 'EH' => 'Western Sahara', + 'YE' => 'Yemen', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe' +); +?>
--- /dev/null +++ b/busui/owa/conf/countryNames2Codes.php @@ -1,1 +1,250 @@ - +<?php +$countryName2Code = array( + "afghanistan" => 'AF', + "Ålan