1 2 3 4 5<!DOCTYPE html> 6<html lang="en"> 7<head> 8<title>Gylphi </title> 9<base href="/"> 10<!-- Google Fonts --> 11<link href="https://fonts.googleapis.com/css?family=Permanent+Marker|Lato&display=swap" rel="stylesheet"> 12<!-- https://css-tricks.com/snippets/html/responsive-meta-tag/--> 13<meta name="viewport" content="width=device-width"> 14<meta name="format-detection" content="telephone=no"> 15 16<!-- build book object(s) --> 17
18<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
18 19<!-- Icons --> 20<link rel="preload" href="images/gylphi_logo.png" as="image"> 21 22 <!-- Favicons --> 23<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> 24<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> 25<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> 26<link rel="manifest" href="/site.webmanifest"> 27<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> 28<meta name="msapplication-TileColor" content="#1994cd"> 29<meta name="theme-color" content="#ffffff"> 30<!-- Favicons --> 31<!--JQuery + Facebook--> 32
32<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
32 33 <link rel="stylesheet" href="style.css" /> 34
34<script> 35 $(document).ready(function() { 36 $.ajaxSetup({ cache: true }); 37 $.getScript('https://connect.facebook.net/en_US/sdk.js', function(){ 38 FB.init({ 39 appId: '156436093289', 40 version: 'v2.7' // or v2.1, v2.2, v2.3, ... 41 }); 42 $('#loginbutton,#feedbutton').removeAttr('disabled'); 43 FB.getLoginStatus(updateStatusCallback); 44 }); 45}); 46 </script>
46 47<!--JQuery + Facebook End --> 48<!-- Link CSS Stylesheets --> 49 50<link href="styles/header2.css" rel="stylesheet"><link href="styles/sitemap.css" rel="stylesheet"><link href="styles/address.css" rel="stylesheet"><link href="styles/form.css" rel="stylesheet"> 51 52<!-- Favicon Links Generated at https://realfavicongenerator.net --> 53<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> 54<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> 55<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> 56<link rel="manifest" href="/site.webmanifest"> 57<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"> 58<meta name="msapplication-TileColor" content="#2bbd90"> 59<meta name="theme-color" content="#ffffff"> 60<!-- Add twitter cards, see: https://stackoverflow.com/a/49460333, and validate here: https://cards-dev.twitter.com/validator --> 61<style> 62/* min-width: 700 on desktop; min-width:0 on mobile */ 63 64a img { 65border:0; 66} 67body { 68margin:0; 69width:100%; 70min-width:900px; 71-webkit-text-size-adjust: 100%; 72background-color: #F7F9F8; 73 74} 75 76/* Image Preloading https://stackoverflow.com/a/14390213/1694526 */ 77 78/* Alternative preloading approach using HTML - https://stackoverflow.com/a/41788523/1694526 */ 79 80.clearfloats { 81clear:both; 82} 83 84@media (max-device-width: 600px) { 85 body { 86 min-width: 300px ! important; 87 width:100%; 88 89} 90 91} 92 93@media (max-width: 600px) { 94 body { 95 min-width: 300px ! important; 96 width:100%; 97} 98 99} 100 101 102p.captionwhite { 103font-size:0.6em; 104color:white; 105text-align:center; 106} 107 108 109 110</style>
111<script src="scripts/localstorage.js"></script>
vendor: 1 bytes, line 111
111
112<script> 113 114function hideCookieBar() { 115var cookieper = store('gylphi_cookiepermission'); 116$.ajax({ 117 method: "POST", 118 url: "cookiecheck", 119 data: { cookiesallowed: cookieper} 120}) 121 .done(function( msg ) { 122 if (msg == 'reload') { 123 location.reload(); 124 } 125 // else {alert( "Data Saved: ");} 126 }); 127 128} 129 130// https://stackoverflow.com/a/901144/1694526 131function getParameterByName(name, url) { 132 if (!url) url = window.location.href; 133 name = name.replace(/[\[\]]/g, '\\$&'); 134 var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'), 135 results = regex.exec(url); 136 if (!results) return null; 137 if (!results[2]) return ''; 138 139 return decodeURIComponent(results[2].replace(/\+/g, ' ')); 140 141} 142 143 144 /* 145 146 function statusChangeCallback(response) { // Called with the results from FB.getLoginStatus(). 147 // The current login status of the person. 148 if (getParameterByName(logout)) { 149 FB.logout(function(response) { 150 // user is now logged out 151}); 152 } 153 if (response.status === 'connected') { // Logged into your webpage and Facebook. 154 testAPI(); 155 } else { // Not logged into your webpage or we are unable to tell. 156 // Logout 157 location.href = 'logout'; 158 } 159 } 160 161 162 function checkLoginState() { // Called when a person is finished with the Login Button. 163 FB.getLoginStatus(function(response) { // See the onlogin handler 164 statusChangeCallback(response); 165 }); 166 } 167 168 169 window.fbAsyncInit = function() { 170 FB.init({ 171 appId : , 172 cookie : true, // Enable cookies to allow the server to access the session. 173 xfbml : true, // Parse social plugins on this webpage. 174 version : 'v4.0' // Use this Graph API version for this call. 175 }); 176 177 178 FB.getLoginStatus(function(response) { // Called after the JS SDK has been initialized. 179 statusChangeCallback(response); // Returns the login status. 180 }); 181 }; 182 183 184 (function(d, s, id) { // Load the SDK asynchronously 185 var js, fjs = d.getElementsByTagName(s)[0]; 186 if (d.getElementById(id)) return; 187 js = d.createElement(s); js.id = id; 188 js.src = "https://connect.facebook.net/en_US/sdk.js"; 189 fjs.parentNode.insertBefore(js, fjs); 190 }(document, 'script', 'facebook-jssdk')); 191 192 193 function testAPI() { // Testing Graph API after login. See statusChangeCallback() for when this call is made. 194 FB.api('/me', function(response) { 195 196$.ajax({ 197 type: "POST", 198 url: 'facebooklogin', 199 data: 'ajax=true' + '&id=' + response.id + '&name=' + response.name + '&useremail=' response.email + '&facebook=true', // serializes the form's elements. 200 success: function(data) 201 { 202 var arrayData = JSON.parse(data); 203 location.href = arrayData['url']; 204 } 205}); 206} 207*/ 208 209</script>
209 210 211</head> 212<body onload="checkLoginState()"> 213<div id="fb-root"></div>
214<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v4.0"></script>
vendor: 1 bytes, line 214
214
215<script> 216 217 function statusChangeCallback(response) { // Called with the results from FB.getLoginStatus(). 218 // The current login status of the person. 219 /*if (getParameterByName(logout)) { 220 FB.logout(function(response) { 221 // user is now logged out 222 }); 223 }*/ 224 if (response.status === 'connected') { // Logged into your webpage and Facebook. 225 testAPI(); 226 } else { // Not logged into your webpage or we are unable to tell. 227 // Logout 228 // location.href = 'logout'; 229 } 230 } 231 232 233 function checkLoginState() { // Called when a person is finished with the Login Button. 234 FB.getLoginStatus(function(response) { // See the onlogin handler 235 statusChangeCallback(response); 236 }); 237 } 238 239 240 window.fbAsyncInit = function() { 241 FB.init({ 242 appId : 156436093289, 243 cookie : true, // Enable cookies to allow the server to access the session. 244 xfbml : true, // Parse social plugins on this webpage. 245 version : 'v4.0' // Use this Graph API version for this call. 246 }); 247 248 249 FB.getLoginStatus(function(response) { // Called after the JS SDK has been initialized. 250 statusChangeCallback(response); // Returns the login status. 251 }); 252 }; 253 254 255 (function(d, s, id) { // Load the SDK asynchronously 256 var js, fjs = d.getElementsByTagName(s)[0]; 257 if (d.getElementById(id)) return; 258 js = d.createElement(s); js.id = id; 259 js.src = "https://connect.facebook.net/en_US/sdk.js"; 260 fjs.parentNode.insertBefore(js, fjs); 261 }(document, 'script', 'facebook-jssdk')); 262 263 264 function testAPI() { // Testing Graph API after login. See statusChangeCallback() for when this call is made. 265 FB.api('/me?fields=name,email,id', function(response) { 266 $.ajax({ 267 type: "POST", 268 url: 'facebooklogin', 269 data: {'ajax':true, 'id': response.id, 'name': response.name, 'useremail': response.email, 'facebook':true}, // serializes the form's elements. 270 success: function(data) 271 { 272 var arrayData = JSON.parse(data); 273 location.href = arrayData['url']; 274 } 275 }); 276 }); 277 278 } 279 280 function logout() { 281 FB.logout(function(response) { 282 // user is now logged out 283 location.href = 'logout'; 284 }); 285 }</script>
285 286
286<script async defer src="https://connect.facebook.net/en_US/sdk.js"></script>
286<script src="scripts/localstorage.js"></script>
286 287<div class="gylphi-header"> 288<div id="cookiebar">This website makes use of cookies<span class="extra"> to enhance your experience and for additional functionality</span>. <span id="cookies" class="nowrapping"><a href="privacy">Allow Cookies</a></span> <a href="privacy#privacypolicy"><span id="privacy" class="nowrapping">Privacy Policy</span></a></div><h1 class="header-title nowrapping"><a class="header-link" href=""><img width="50" alt="Gylphi Logo" src="images/gylphi_logo.svg" /><span class="white-text">Gylphi</span></a></h1><p class="accountchoices"> 289<br /><a class="loz red" href="form/login">Login</a> <a class="loz red" href="form/register">Register</a> 290</p> 291</div> 292<div class="arrow"><input type=checkbox id="show"> 293<label class="cent" for="show">=</label> 294<div id="navbar"> 295<ul id="navbar-options"><li><a class="bluehover" href="books"><img class="image-middle" alt="Books Icon" src="images/icons/icon1.svg" />Books</a></li><li><a class="bluehover" href="series"><img class="image-middle" alt="Series Icon" src="images/icons/icon2.svg" />Series</a></li> 296<li><a class="bluehover" href="events"><img class="image-middle" alt="Events Icon" src="images/icons/events_icon.svg" />Events</a></li><li><a class="greenhover" href="order"><img class="image-middle" alt="Checkout Icon" src="images/icons/shopping_icon.svg" />Checkout <span class="checkout-total">0</span></a></li> 297 298 299</ul> 300 301</div> 302 303 304</div> 305 306<!--<div id="lowerbar"><p><a href="research">Researchers</a> | <a href="libraries">Libraries</a> | <a href="distributor">Distributors</a> | <a href="resellers">Resellers</a> | <a href="openaccess">Open Access</a></p></div>--> 307 308 309 310<!-- Main Page Content --> 311<div style="margin: 0 auto; text-align: center; padding-top: 20px;"><div scope="public_profile,email" class="fb-login-button" onlogin="checkLoginState();" data-width="" data-size="large" data-button-type="continue_with" data-auto-logout-link="false" data-use-continue-as="false"></div> 312<p style="font-size:2em; color:blue;"><hr width=70%; /></p></div> 313<form id="loginForm" class="form-style-9" onsubmit="return validateForm();" action="login" method="post"> 314<ul> 315<li> <input type="email" id="emailfield" name="useremail" class="field-style field-full align-center" placeholder="Email" /></li> 316<li> <input type="password" id="passwordfield" name="userpassword" class="field-style field-full align-center" placeholder="Password" /> 317</li> 318 319 320<li>Forgotten <a href="form/reset">password</a>? | Register for <a href="form/register">an account</a> | Resend <a href="form/pinresend">confirmation PIN</a> 321<input type="submit" value="Log in" /> 322</li> 323</ul> 324</form> 325 326
327<script> 328 329 330function validateEmail(email) { 331 var re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; 332 return re.test(String(email).toLowerCase()); 333} 334 335// https://stackoverflow.com/a/21017888/1694526 336 function validateForm() 337 { 338 339 340 var emailaddress = document.getElementById("emailfield").value; 341 var passwordfield = document.getElementById("passwordfield").value; 342 343 344 if (validateEmail(emailaddress) == false) { 345 alert("Your email address looks invalid, please check and try again."); 346 return false; 347 } 348 else if (passwordfield == "" || passwordfield == null || passwordfield.length < 8 ) { 349 alert("Password incorrect."); 350 return false; 351 } 352 else { 353 var url = "login"; // the script where you handle the form input. 354 355 $.ajax({ 356 type: "POST", 357 url: url, 358 data: $("#loginForm").serialize() + '&ajax=true', // serializes the form's elements. 359 success: function(data) 360 { 361 var arrayData = JSON.parse(data); 362 var registered = arrayData['registered']; 363 var confirmed = arrayData['confirmed']; 364 var loginstatus = arrayData['login']; 365 var returnurl = arrayData['url']; 366 367 if (loginstatus === true) { 368 window.location.href = returnurl; 369 } 370 else { 371 if (registered === false) { 372 alert('Login failed. Email not registered.'); 373 return false; 374 } 375 else if (confirmed === false) { 376 alert('Login failed. Email registered but not confirmed. Request new PIN from link below.'); 377 return false; 378 } 379 else { 380 alert('Login failed. Password incorrect.'); 381 return false; 382 } 383 } 384 // report error to user if not successful. 385 386 // $("#contactForm").hide(); 387 return false; 388 } 389 }); 390 391 return false; // avoid to execute the actual submit of the form. 392 } 393 } 394 395 // this is the id of the submit button 396 397 /* JQuery and AJAX */ 398 /* https://stackoverflow.com/a/18170009/1694526 */ 399 400</script>
400 401 402 403<div id="sitemap"> 404<form id="mailinglist" onsubmit="return isValidEmailAddress();" action="mailinglist" method="post"> 405<p>Forthcoming Books and Special Offers. <span class="grey">Read our privacy policy.</span></p><input class="box" id="emailAdd" type="email" name="email" placeholder="Mailing List" /><input class="butblue" type="submit" value="Sign Up" /></form> 406<h3 class="site">Sitemap</h3> 407<p class="site"><a class="siteMapList" href="books" target="_top">Books</a> | <a class="siteMapList" href="series" target="_top">Series</a> | <a class="siteMapList" href="order" target="_top">Checkout</a> | <a class="siteMapList" href="privacy">Privacy Policy</a></p> 408 409<p class="site"> <a class="siteMapList" href="about">Gylphi Limited © 2007â2026</a> <a class="siteMapList" href="https://twitter.com/sketchytech">| Web design and programming by Anthony Levings (@sketchyTech) © 2026</a></p> 410</div>
411<script> 412 413 414function isValidEmailAddress() { 415var emailAddress = document.getElementById('emailAdd').value; 416 var pattern = /^([a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+(\.[a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)*|"((([ \t]*\r\n)?[ \t]+)?([\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*(([ \t]*\r\n)?[ \t]+)?")@(([a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.)+([a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.?$/i; 417 if (pattern.test(emailAddress)) { 418 419 return true; 420 421 } 422 else { 423 alert("invalid" + emailAddress); 424 return false; 425 } 426} 427/* 428function validateEmail() { 429 430var email = document.getElementById('email'); 431 var re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i; 432 433 var result = re.test(String(email).toLowerCase()); 434 if (result) { 435 return true; 436 } 437 else { 438 return false; 439 } 440} 441*/ 442 443</script>
443 444<!--
444<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/cookie-bar/cookiebar-latest.min.js?"></script>
444 -->
445<script> 446//https://stackoverflow.com/a/4656873/1694526 447function getUrlVars() 448{ 449 var vars = [], hash; 450 var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); 451 for(var i = 0; i < hashes.length; i++) 452 { 453 hash = hashes[i].split('='); 454 vars.push(hash[0]); 455 vars[hash[0]] = hash[1]; 456 } 457 return vars; 458} 459function missing() { 460if (getUrlVars()["missing"]) { 461alert(getUrlVars()["missing"]); 462} 463} 464 465</script>
465 466
467<script src="scripts/localstorage.js"></script>
467 468</body> 469 470</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.