473,385 Members | 1,732 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

'number expected' error in IE

The html file below gets intermittent errors 'error on page' ('number
expected')
when clicking on column-headings to sort. Yet, this same file works
flawlessly
in other browsers (i.e. Opera, Mozilla, Netscape, etc.).

Can anyone suggest a fix/workaround?

Cheers...

Dave


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/tr/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Whitewater Runs</title>
<style type="text/css">
table {table-collapse:collapse; border-spacing:0;}
td {border:2px groove black; padding:7px;
background-color:lightgrey;}
th {border:2px groove black; padding:7px;
background-color:lightblue;}
.ctr {text-align:center;}
</style>
<script type="text/javascript">
// Table data -- an array of objects
var jsData = new Array();
// jsData[0] = {elem1:"elem1Value", elem2:"elem2Value",
elem3:"elem3Value"};
// (etc)
jsData[0] =
{
RiverName : "Androscoggin",
Location : "Errol Bridge to Pontook Rapid",
FlowType : "Dam",
RunMiles : 20.0,
State : "NH",
Latitude : "N44/46.8'",
Longitude : "W71/07.8'"
};
jsData[1] =
{
RiverName : "Blue Hill Falls",
Location : "Blue Hill Falls",
FlowType : "Tide",
RunMiles : 0.0,
State : "ME",
Latitude : "N44/23.6'",
Longitude : "W68/59.3'"
};
jsData[2] =
{
RiverName : "Cohasset",
Location : "Cohasset",
FlowType : "Tide",
RunMiles : 0.0,
State : "MA",
Latitude : "N42/14.5'",
Longitude : "W70/48.7'"
};
jsData[3] =
{
RiverName : "Contoocook",
Location : "Hillsborough to Henniker",
FlowType : "Rain",
RunMiles : 2.2,
State : "NH",
Latitude : "N43/08.6'",
Longitude : "W71/52.2'"
};
jsData[4] =
{
RiverName : "Dead(at low water levels)",
Location : "Spencer Stream to the Forks",
FlowType : "Dam",
RunMiles : 20,
State : "ME",
Latitude : "N45/18.0'",
Longitude : "W70/13.0'"
};
jsData[5] =
{
RiverName : "Dead(at high water levels)",
Location : "Spencer Stream to the Forks",
FlowType : "Dam",
RunMiles : 20,
State : "ME",
Latitude : "N45/18.0'",
Longitude : "W70/13.0'"
};
jsData[6] =
{
RiverName : "Deerfield (FifeBrook)",
Location : "Fife Brook Dam to Zoar Gap",
FlowType : "Dam",
RunMiles : 4.8,
State : "MA",
Latitude : "N42/41.2'",
Longitude : "W73/06.8'"
};
jsData[7] =
{
RiverName : "Deerfield (MonroeBrDryway)",
Location : "Monroe Bridge to Dunbar Brook",
FlowType : "Dam",
RunMiles : 3.0,
State : "MA",
Latitude : "N42/42.0'",
Longitude : "W73/07.0'"
};
jsData[8] =
{
RiverName : "Jenness Beach",
Location : "Jenness Beach (Rye)",
FlowType : "Surf",
RunMiles : 0.0,
State : "NH",
Latitude : "N42/59.0'",
Longitude : "W70/45.8'"
};
jsData[9] =
{
RiverName : "Kennebec",
Location : "Harris Station Dam to the Forks",
FlowType : "Dam",
RunMiles : 11.0,
State : "ME",
Latitude : "N45/27.5'",
Longitude : "W69/51.7'"
};
jsData[10] =
{
RiverName : "Magalloway",
Location : "Aziscohos Hydro to Wilson Mills",
FlowType : "Dam",
RunMiles : 1.75,
State : "ME",
Latitude : "N44/55.8'",
Longitude : "W70/59.0'"
};
jsData[11] =
{
RiverName : "Merrimack",
Location : "Arms Park (Manchester)",
FlowType : "Dam",
RunMiles : 0.5,
State : "NH",
Latitude : "N43/00.0'",
Longitude : "W71/26.7'"
};
jsData[12] =
{
RiverName : "Merrimack",
Location : "Heritage Trail(Bedford)",
FlowType : "Dam",
RunMiles : 0.6,
State : "NH",
Latitude : "N42/59.9'",
Longitude : "W71/26.7'"
};
jsData[13] =
{
RiverName : "Ogunquit Beach",
Location : "Ogunquit Beach",
FlowType : "Surf",
RunMiles : 0.0,
State : "ME",
Latitude : "N43/16.0'",
Longitude : "W70/35.3'"
};
jsData[14] =
{
RiverName : "Pemigewasset(Bristol Gorge)",
Location : "Ayers Island Dam to Coolidge Woods Rd",
FlowType : "Dam",
RunMiles : 1.0,
State : "NH",
Latitude : "N43/35.8'",
Longitude : "W71/43.1'"
};
jsData[15] =
{
RiverName : "Piscataquog",
Location : "Goffstown to Pinardville",
FlowType : "Dam",
RunMiles : 2.0,
State : "NH",
Latitude : "N43/01.0'",
Longitude : "W71/34.1'"
};
jsData[16] =
{
RiverName : "Quaboag",
Location : "Warren to Route 67",
FlowType : "Rain",
RunMiles : 5.5,
State : "MA",
Latitude : "N42/12.7'",
Longitude : "W72/14.0'"
};
jsData[17] =
{
RiverName : "Rapid",
Location : "Middle Dam to Cedar Stump",
FlowType : "Dam",
RunMiles : 4.5,
State : "ME",
Latitude : "N44/46.0'",
Longitude : "W70/57.0'"
};
jsData[18] =
{
RiverName : "Sheepscot Reversing Falls",
Location : "5 miles northeast of Wiscasset",
FlowType : "Tide",
RunMiles : 0.0,
State : "ME",
Latitude : "N44/03.0'",
Longitude : "W69/37.0'"
};
jsData[19] =
{
RiverName : "Souhegan",
Location : "Greenville to Wilton",
FlowType : "Rain",
RunMiles : 3.5,
State : "NH",
Latitude : "N42/47.2'",
Longitude : "W71/48.2'"
};
jsData[20] =
{
RiverName : "Millers (Upper)",
Location : "South Royalston to Athol",
FlowType : "Rain",
RunMiles : 7.0,
State : "MA",
Latitude : "N42/37.8'",
Longitude : "W72/08.9'"
};
jsData[21] =
{
RiverName : "West (upper)",
Location : "Ball Mtn Dam to Jamaica St Park",
FlowType : "Dam",
RunMiles : 2.5,
State : "VT",
Latitude : "N43/07.6'",
Longitude : "W72/46.3'"
};
jsData[22] =
{
RiverName : "West (lower)",
Location : "Jamaica St Park to Townshend Res",
FlowType : "Dam",
RunMiles : 5.5,
State : "VT",
Latitude : "N43/06.3'",
Longitude : "W72/46.4'"
};
jsData[23] =
{
RiverName : "White",
Location : "N.Royalton to S.Royalton",
FlowType : "Rain",
RunMiles : 7.5,
State : "VT",
Latitude : "N43/49.3'",
Longitude : "W72/32.6'"
};
jsData[24] =
{
RiverName : "Winnipesaukee",
Location : "Franklin",
FlowType : "Dam",
RunMiles : 1.0,
State : "NH",
Latitude : "N43/26.6'",
Longitude : "W71/37.3'"
};

// Draw table from 'jsData' array of objects
function drawTable(tbody) {
var tr, td;
tbody = document.getElementById(tbody);
// remove existing rows, if any
clearTable(tbody);
// loop through data source
for (var i = 0; i < jsData.length; i++) {
tr = tbody.insertRow(tbody.rows.length);

td = tr.insertCell(tr.cells.length);
td.innerHTML = jsData[i].RiverName;

td = tr.insertCell(tr.cells.length);
td.setAttribute("align", "center");
td.innerHTML = jsData[i].Location;

td = tr.insertCell(tr.cells.length);
td.setAttribute("align", "center");
td.innerHTML = jsData[i].FlowType;

td = tr.insertCell(tr.cells.length);
td.setAttribute("align", "center");
td.innerHTML = jsData[i].RunMiles;

td = tr.insertCell(tr.cells.length);
td.setAttribute("align", "center");
td.innerHTML = jsData[i].State;

td = tr.insertCell(tr.cells.length);
td.setAttribute("align", "center");
td.innerHTML = jsData[i].Latitude;

td = tr.insertCell(tr.cells.length);
td.setAttribute("align", "center");
td.innerHTML = jsData[i].Longitude;
}
}

// Remove existing table rows
function clearTable(tbody) {
while (tbody.rows.length > 0) {
tbody.deleteRow(0);
}
}

// Sorting function dispatcher (invoked by table column links)
function sortTable(link) {
switch (link.firstChild.nodeValue) {
case "RiverName" :
jsData.sort(sortByRiverName);
break;
case "Location" :
jsData.sort(sortByLocation);
break;
case "FlowType" :
jsData.sort(sortByFlowType);
break;
case "RunMiles" :
jsData.sort(sortByRunMiles);
break;
case "State" :
jsData.sort(sortByState);
break;
case "Latitude" :
jsData.sort(sortByLatitude);
break;
case "Longitude" :
jsData.sort(sortByLongitude);
break;
}
drawTable("wwData")
return false
}

// Sorting functions (invoked by sortTable())
function sortByRiverName(a, b) {
a = a.RiverName.toLowerCase();
b = b.RiverName.toLowerCase();
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
}
function sortByLocation(a, b) {
a = a.Location.toLowerCase();
b = b.Location.toLowerCase();
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
}
function sortByFlowType(a, b) {
a = a.FlowType.toLowerCase();
b = b.FlowType.toLowerCase();
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
}
function sortByRunMiles(a, b) {
return a.RunMiles - b.RunMiles;
}
function sortByState(a, b) {
a = a.State.toLowerCase();
b = b.State.toLowerCase();
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
}
function sortByLatitude(a, b) {
a = a.Latitude.toLowerCase();
b = b.Latitude.toLowerCase();
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
}
function sortByLongitude(a, b) {
a = a.Longitude.toLowerCase();
b = b.Longitude.toLowerCase();
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
}

</script>
</head>

<body onload="drawTable('wwData')" bgcolor="white">

<h2>Whitewater that I've run by kayak:</h2>
<h4>(Note that client can now click on each column-heading to sort
the data.)</h4>
<h4>(Re-sorting happens on the client side...no further server hits
are required!)</h4>
<hr />

<table id="myTable">
<thead>
<tr>
<th><a href="#" title="Sort by RiverName"
onclick="return sortTable(this)">RiverName</a></th>
<th><a href="#" title="Sort by Location"
onclick="return sortTable(this)">Location</a></th>
<th><a href="#" title="Sort by FlowType"
onclick="return sortTable(this)">FlowType</a></th>
<th><a href="#" title="Sort by RunMiles"
onclick="return sortTable(this)">RunMiles</a></th>
<th><a href="#" title="Sort by State"
onclick="return sortTable(this)">State</a></th>
<th><a href="#" title="Sort by Latitude"
onclick="return sortTable(this)">Latitude</a></th>
<th><a href="#" title="Sort by Longitude"
onclick="return sortTable(this)">Longitude</a></th>
</tr>
</thead>
<tbody id="wwData"></tbody>
</table>

</body>
</html>

Jul 23 '05 #1
6 6769
Hi David,

Somehow it parse the return results for the sorting function wrongly
and thinks its not a number, but a string. You could either take out
all white spaces from the return values like this:

return ((a < b) ?-1: ((a > b) ?1:0)); )

But that wouldn't improve readability, so, you can also say it
explicitly and simply changing

return ((a < b) ? -1 : ((a > b) ? 1 : 0));

into

return parseInt((a < b) ? -1 : ((a > b) ? 1 : 0));

should make things work.

Good luck,
Vincent
The html file below gets intermittent errors 'error on page' ('number
expected')
when clicking on column-headings to sort. Yet, this same file works
flawlessly
in other browsers (i.e. Opera, Mozilla, Netscape, etc.).

Can anyone suggest a fix/workaround?

Cheers...

Dave


Jul 23 '05 #2
"David Cook" <(who wants to know?)> writes:
The html file below gets intermittent errors 'error on page' ('number
expected')


Highly curious. This reduced example gives the same effect:
---
var l = ["a","b"];
var pa,pb;
var sa,sb;
function cmpx(a,b) {
pa = a; pb = b;
a = a.toLowerCase();
b = b.toLowerCase();
sa = a; sb = b;
return ((a<b)? -1 : ((a>b)? 1 : 0));
}
try {
for (var i=0; i<1000;i++) {
l.sort(cmpx);
}
} catch (e) {
alert(
"after "+i+" rounds: "+ e.message + "\n" +
"a = " + sa + "(" + typeof sa +"), was: " +
pa + "(" + typeof pa + ")\n" +
"b = " + sb + "(" + typeof sb +"), was: " +
pb + "(" + typeof pb + ")\n");
}
---

It's definitly a bug.

It seems toLowerCase fails, returning a value of unknown
type. However, it only happens while being called from sort. Calling
cmpx manually a million times doesn't fail.

The problem also goes away if you rename the result, i.e., instead of
a = a.toLowerCase();
you write
var ta = a.toLowerCase();
Then "ta" is never foobar'ed like "a" is. (That's a workaround, by the way).
I can see that you have a lot of repetetive code. There are ways to make
that smaller.

For the data, you can make a constructor function:
---
function Run(riverName, location, flowType, runMiles,
state, latitutde, longtitude) {
this.RiverName = riverName;
this.Location = location;
this.FlowType = flowType;
this.RunMiles = runMiles;
this.State = state;
this.Latitude = latitude;
this.Longtitude = longtitude;
}
---
Then you can create the array in one go;
---
var jsData = [
new Run("Androscoggin",
"Errol Bridge to Pontook Rapid",
"Dam",
20.0,
"NH",
"N44/46.8'",
"W71/07.8'"),
new Run("Blue Hill Falls",
"Blue Hill Falls",
"Tide",
0.0,
"ME",
"N44/23.6'",
"W68/59.3'"),
...
];
---
This avoids the repetitions of "RiverName" etc.
While it might not be as instantly readable, there are less risk of
typos and less bytes to transfer.

Also, the comparison functions are all very similar. You could
use one function to generate all the comparison functions, avoiding
duplicate code:
---
function makePropertyComparator(property) {
return function(a,b) {
var ta = a[property].toLowerCase();
var tb = b[property].toLowerCase();
return (tb<ta)-(ta<tb); // shorter
}
}
var sortByRiverName = makePropertyComparator("RiverName");
var sortByLocation = makePropertyComparator("Location");
var sortByFlowType = makePropertyComparator("FlowType");
....
---
Good luck
/L
--
Lasse Reichstein Nielsen - lr*@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'
Jul 23 '05 #3
JRS: In article <7j**********@hotpop.com>, seen in
news:comp.lang.javascript, Lasse Reichstein Nielsen <lr*@hotpop.com>
posted at Wed, 9 Jun 2004 22:07:40 :

It seems toLowerCase fails, returning a value of unknown
type. However, it only happens while being called from sort. Calling
cmpx manually a million times doesn't fail.


How about toUpperCase?

Where the data being sorted is of significant size N, using toLowerCase
in a comparison function is a program design error.

The comparison function will be called, typically, more than o(N) times,
such as o(N*ln(N)). Case conversion must involve iterating through the
string and creating an object; it is not a negligible task.

For N sufficiently (maybe not very) large, it will be better to use time
o(N) to create the keys, and to use those keys in the comparison.

Something like, starting with array A,
var T = []
for (J=0; J<N; J++) T[J] = {Data:(t=A[J]) ; Key:KeyFn(t)}
then sort T with the comparison function comparing T[J].Key .

Or just compare a simple key array but swap both Key & Data.

--
© John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 MIME. ©
Web <URL:http://www.merlyn.demon.co.uk/> - FAQish topics, acronyms, & links.
Proper <= 4-line sig. separator as above, a line exactly "-- " (SonOfRFC1036)
Do not Mail News to me. Before a reply, quote with ">" or "> " (SonOfRFC1036)
Jul 23 '05 #4

The 'theory' sounds good. But, I changed all the lines to read:
return parseInt((a < b) ? -1 : ((a > b) ? 1 : 0));
but I still get the 'number expected' error intermittently.

This has got to be a known (but unfixed) bug in IE's javascript support.
(I've seen other reports of getting this error but no one has found a
solution.)

If anyone knows a formal way of actually reporting this bug to Microsoft,
I'd like to know how/where to send such a report.

Cheers...

Dave


"Vincent van Beveren" <vi*****@provident.remove.this.nl> wrote in message
news:40**********************@news.xs4all.nl...
Hi David,

Somehow it parse the return results for the sorting function wrongly
and thinks its not a number, but a string. You could either take out
all white spaces from the return values like this:

return ((a < b) ?-1: ((a > b) ?1:0)); )

But that wouldn't improve readability, so, you can also say it
explicitly and simply changing

return ((a < b) ? -1 : ((a > b) ? 1 : 0));

into

return parseInt((a < b) ? -1 : ((a > b) ? 1 : 0));

should make things work.

Good luck,
Vincent
The html file below gets intermittent errors 'error on page' ('number
expected')
when clicking on column-headings to sort. Yet, this same file works
flawlessly
in other browsers (i.e. Opera, Mozilla, Netscape, etc.).

Can anyone suggest a fix/workaround?

Cheers...

Dave

Jul 23 '05 #5
<url:
http://register.microsoft.com/contac...osoft%2Ecom%2F
/>

Under:

"Product Support"

Click on:

"Contact technical support, ask a product question, report a product bug or
send comments about technical support. "

When I sent a bug report on Internet Explorer I actually received a response
from a human indicating it had been forwarded to the appropriate development
team for review.

They'll take you more seriously if you include as many details as you can and
maybe provide a stripped-down sample page that demonstrates the behavior.

David Cook wrote:
The 'theory' sounds good. But, I changed all the lines to read:
return parseInt((a < b) ? -1 : ((a > b) ? 1 : 0));
but I still get the 'number expected' error intermittently.

This has got to be a known (but unfixed) bug in IE's javascript support.
(I've seen other reports of getting this error but no one has found a
solution.)

If anyone knows a formal way of actually reporting this bug to Microsoft,
I'd like to know how/where to send such a report.

Cheers...

Dave

"Vincent van Beveren" <vi*****@provident.remove.this.nl> wrote in message
news:40**********************@news.xs4all.nl...
Hi David,

Somehow it parse the return results for the sorting function wrongly
and thinks its not a number, but a string. You could either take out
all white spaces from the return values like this:

return ((a < b) ?-1: ((a > b) ?1:0)); )

But that wouldn't improve readability, so, you can also say it
explicitly and simply changing

return ((a < b) ? -1 : ((a > b) ? 1 : 0));

into

return parseInt((a < b) ? -1 : ((a > b) ? 1 : 0));

should make things work.

Good luck,
Vincent
The html file below gets intermittent errors 'error on page' ('number
expected')
when clicking on column-headings to sort. Yet, this same file works
flawlessly
in other browsers (i.e. Opera, Mozilla, Netscape, etc.).

Can anyone suggest a fix/workaround?

Cheers...

Dave


--
| Grant Wagner <gw*****@agricoreunited.com>

* Client-side Javascript and Netscape 4 DOM Reference available at:
*
http://devedge.netscape.com/library/...ce/frames.html

* Internet Explorer DOM Reference available at:
*
http://msdn.microsoft.com/workshop/a...ence_entry.asp

* Netscape 6/7 DOM Reference available at:
* http://www.mozilla.org/docs/dom/domref/
* Tips for upgrading JavaScript for Netscape 7 / Mozilla
* http://www.mozilla.org/docs/web-deve...upgrade_2.html
Jul 23 '05 #6
David Cook wrote:
The 'theory' sounds good. But, I changed all the lines to read:
return parseInt((a < b) ? -1 : ((a > b) ? 1 : 0));
This can be simplified to

return (a < b ? -1 : (a > b ? 1 : 0));

Boolean expressions seldom need to be in parantheses and as the result
of the evaluation of the two nested ternary operations is always an
integer value (i.e. the fractional part of the floating-point number
is 0), it really does not make sense to apply parseInt() to it.
This has got to be a known (but unfixed) bug in IE's javascript
support.


IE does not support JavaScript, it supports JScript, Microsoft's
ECMAScript implementation. But even if you used the above it
is highly unlikely that it is this line which triggers the error.
PointedEars
Jul 23 '05 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Steven D'Aprano | last post by:
I'm trying to keep an open mind, but I am perplexed about something in Python that strikes me as a poor design. py> def func(a,b): py> print a,b py> func(1) Traceback (most recent call...
9
by: Mark Twombley | last post by:
Hi, I'm just getting back into C++ and had a question about the best practice for assigning error numbers. I have been working in VB for sometime now and there you would start assigning error...
16
by: Jason | last post by:
Hi, I need a way to use random numbers in c++. In my c++ project, when using the mingw compiler I used a mersenne twister that is publicly available and this did its job well. Now I have...
3
by: Eric Anderson Vianet SAO | last post by:
hello all When i tried ´pg_dump -v -f dump.dmp dtbtransporte´ I got the error: pg_dump: restoring data for table tbdmovimento pg_dump: dumping out the contents of table tbdmovimento ...
7
by: Shuffs | last post by:
Could someone, anyone please tell me what I need to amend, to get this function to take Sunday as the first day of the week? I amended the Weekday parts to vbSunday (in my code, not the code...
43
by: Xancatal | last post by:
Hey everybody. I need help on this one. I need to verify that a number entered by a user is not either a negative number (-100.00), or an alphabet (a, b, c, X, Y) as well as other number other than...
7
by: James Brown | last post by:
All, this is a bit of an odd question but please bear with me: Suppose I have the following (bad) C expression: unsigned int x = 0xABCDEFg; Note the illegal 'g' at the end of the...
9
by: WELCOME ### | last post by:
Hello every one. The following is code built by C++ \ CLI . It's built well : -------------------------------------------------- #include "stdafx.h" #include <cstdlib> using namespace...
1
by: yacare | last post by:
I am using hash_map from sgi. But I have a problem about the nitial number of buckets in hash_map. sgi provides hash_map(size_t n) to set up an empty hash table with at least n buckets. However, the...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.