473,785 Members | 2,391 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

design patterns in javascript?

Hi

I have a very typical problem which I believe might be more easily solvable
if it were designed better:

I have 3 dropdowns: dropdown1 (State), dropdown2 (County), dropdown3 (crop).
So the idea is that each state has different counties and different
permutations of state and counties lead to different sets of crops. I have a
total of 63 combinations of sets of crops available right now. Each of these
combinations can consist of one or more of the following: (crop1, crop2,
crop3, crop4, crop5, crop6, crop7). Right now each of these combinations is
hardcoded.

I would like to improve the design of the code if it is possible. The way I
see this problem is that each of those 63 combinations is just adding
different kinds of condiments (crops in our case!) depending on the state
and county selected by the user. This looks something like the decorator
pattern where we can decorate(add accessories) objects at runtime.
However I am not entirely sure if first this is a good example of decorator
pattern and secondly if it is possible to implement something like this in
Javascript. Any thoughts/ideas/suggestions would be welcome...

Navodit

p.s.: Some sample code to give you an idea of what I am talking about-

if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insur ance.county.sel ectedIndex == 1 ||
document.Insura nce.county.sele ctedIndex == 2 ||
document.Insura nce.county.sele ctedIndex == 100 ||
document.Insura nce.county.sele ctedIndex == 101))
{
document.Insura nce.Commodity.l ength = 5;
document.Insura nce.Commodity[1].value = "4116";
document.Insura nce.Commodity[1].text = "Corn";

document.Insura nce.Commodity[2].value = "81997";
document.Insura nce.Commodity[2].text = "Soybeans";

document.Insura nce.Commodity[3].value = "11997";
document.Insura nce.Commodity[3].text = "Wheat";

document.Insura nce.Commodity[4].value = "51997";
document.Insura nce.Commodity[4].text = "Grain sorghum";
}
else if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insur ance.county.sel ectedIndex == 4 ||
document.Insura nce.county.sele ctedIndex == 6 ||
document.Insura nce.county.sele ctedIndex == 94 ||
document.Insura nce.county.sele ctedIndex == 102))
{
document.Insura nce.Commodity.l ength = 4;
document.Insura nce.Commodity[1].value = "4116";
document.Insura nce.Commodity[1].text = "Corn";

document.Insura nce.Commodity[2].value = "81997";
document.Insura nce.Commodity[2].text = "Soybeans";

document.Insura nce.Commodity[3].value = "11997";
document.Insura nce.Commodity[3].text = "Wheat";
}
else if .....
{

}

There are in total 63 different else if combinations... .
Apr 23 '07 #1
5 1163
On Apr 23, 11:46 am, "Navodit" <kaush...@uiuc. eduwrote:
Hi

I have a very typical problem which I believe might be more easily solvable
if it were designed better:

I have 3 dropdowns: dropdown1 (State), dropdown2 (County), dropdown3 (crop).
So the idea is that each state has different counties and different
permutations of state and counties lead to different sets of crops. I have a
total of 63 combinations of sets of crops available right now. Each of these
combinations can consist of one or more of the following: (crop1, crop2,
crop3, crop4, crop5, crop6, crop7). Right now each of these combinations is
hardcoded.

I would like to improve the design of the code if it is possible. The way I
see this problem is that each of those 63 combinations is just adding
different kinds of condiments (crops in our case!) depending on the state
and county selected by the user. This looks something like the decorator
pattern where we can decorate(add accessories) objects at runtime.
However I am not entirely sure if first this is a good example of decorator
pattern and secondly if it is possible to implement something like this in
Javascript. Any thoughts/ideas/suggestions would be welcome...

Navodit

p.s.: Some sample code to give you an idea of what I am talking about-

if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insur ance.county.sel ectedIndex == 1 ||
document.Insura nce.county.sele ctedIndex == 2 ||
document.Insura nce.county.sele ctedIndex == 100 ||
document.Insura nce.county.sele ctedIndex == 101))
{
document.Insura nce.Commodity.l ength = 5;
document.Insura nce.Commodity[1].value = "4116";
document.Insura nce.Commodity[1].text = "Corn";

document.Insura nce.Commodity[2].value = "81997";
document.Insura nce.Commodity[2].text = "Soybeans";

document.Insura nce.Commodity[3].value = "11997";
document.Insura nce.Commodity[3].text = "Wheat";

document.Insura nce.Commodity[4].value = "51997";
document.Insura nce.Commodity[4].text = "Grain sorghum";}

else if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insur ance.county.sel ectedIndex == 4 ||
document.Insura nce.county.sele ctedIndex == 6 ||
document.Insura nce.county.sele ctedIndex == 94 ||
document.Insura nce.county.sele ctedIndex == 102))
{
document.Insura nce.Commodity.l ength = 4;
document.Insura nce.Commodity[1].value = "4116";
document.Insura nce.Commodity[1].text = "Corn";

document.Insura nce.Commodity[2].value = "81997";
document.Insura nce.Commodity[2].text = "Soybeans";

document.Insura nce.Commodity[3].value = "11997";
document.Insura nce.Commodity[3].text = "Wheat";}

else if .....
{

}

There are in total 63 different else if combinations... .
you might want to look into object oriented javascript. just do a
search for it and you'll find a wealth of info. you'll still need a
large block of javascript to define all your states, countries, and
crops, but setting it up in an object-oriented way will better express
what the data actually means, and it will be easier to extend later
on.

if you're familar with object oriented programming, it shouldnt be too
difficult (though in javascript it can be a little weird). if not, you
might want to read up on the concepts of OOP first, before doing it in
javascript.

Apr 23 '07 #2
Navodit wrote:
I have 3 dropdowns: dropdown1 (State), dropdown2 (County), dropdown3 (crop).
So the idea is that each state has different counties and different
permutations of state and counties lead to different sets of crops. I have a
total of 63 combinations of sets of crops available right now. Each of these
combinations can consist of one or more of the following: (crop1, crop2,
crop3, crop4, crop5, crop6, crop7). Right now each of these combinations is
hardcoded.

I would like to improve the design of the code if it is possible. The way I
see this problem is that each of those 63 combinations is just adding
different kinds of condiments (crops in our case!) depending on the state
and county selected by the user. This looks something like the decorator
pattern where we can decorate(add accessories) objects at runtime.
However I am not entirely sure if first this is a good example of decorator
pattern and secondly if it is possible to implement something like this in
Javascript. Any thoughts/ideas/suggestions would be welcome...
if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insur ance.county.sel ectedIndex == 1 ||
document.Insura nce.county.sele ctedIndex == 2 ||
document.Insura nce.county.sele ctedIndex == 100 ||
document.Insura nce.county.sele ctedIndex == 101))
{
document.Insura nce.Commodity.l ength = 5;
document.Insura nce.Commodity[1].value = "4116";
document.Insura nce.Commodity[1].text = "Corn";

document.Insura nce.Commodity[2].value = "81997";
document.Insura nce.Commodity[2].text = "Soybeans";

document.Insura nce.Commodity[3].value = "11997";
document.Insura nce.Commodity[3].text = "Wheat";

document.Insura nce.Commodity[4].value = "51997";
document.Insura nce.Commodity[4].text = "Grain sorghum";}

else if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insur ance.county.sel ectedIndex == 4 ||
document.Insura nce.county.sele ctedIndex == 6 ||
document.Insura nce.county.sele ctedIndex == 94 ||
document.Insura nce.county.sele ctedIndex == 102))
{
document.Insura nce.Commodity.l ength = 4;
document.Insura nce.Commodity[1].value = "4116";
document.Insura nce.Commodity[1].text = "Corn";

document.Insura nce.Commodity[2].value = "81997";
document.Insura nce.Commodity[2].text = "Soybeans";

document.Insura nce.Commodity[3].value = "11997";
document.Insura nce.Commodity[3].text = "Wheat";}

else if .....
Two core thoughts in this kind of complex data architectures:
- never repeat the same data twice
- separate data initialization from application

--------------------------------------------------------------

/* DATA INITIALIZATION */

// crops in form "crop[ID] = name"
var crop = new Object()
crop['10'] = 'corn'
crop['28'] = 'lettuce'
crop['29'] = 'soyabeans'
crop['33'] = 'tomatoes'
crop['35'] = 'wheat'

// counties in form "county[ID] = [countyname, [crops in it]]"
var county = new Object()
county['1'] = ['North Florida', [10,29] ]
county['2'] = ['Central Florida', [10,28,29,35] ]
county['7'] = ['South Florida', [] ]
county['8'] = ['East Texas', [29,33] ]
county['9'] = ['West Texas', [28,33,35]]

// states in form "state[stateID] = [statename, [counties in it]]"
var state = new Object()
state['24'] = ['Florida', [1,2,7]]
state['31'] = ['Texas', [8,9]]

/* DISPLAY */

document.write( '<form>')
document.write( '<select name="stateID" size="1"
onChange="f1(th is.value)">')
document.write( '<option value="">-</option>')
for (var i in state)
document.write( '<option value="'+i+'">' +state[i][0]+'</option>');
document.write( '</select>')
document.write( '<select name="countyID" size="1"
onChange="f2(th is.value)">')
document.write( '<option value="">-</option>')
document.write( '</select>')
document.write( '<select name="cropID" size="1">')
document.write( '<option value="">-</option>')
document.write( '</select>')
document.write( '<input type="submit"></form>')

/* UPDATE FUNCTIONS */

var CO = document.forms[0].elements['countyID']
var CR = document.forms[0].elements['cropID']

function f1(stateID) {
while (CO.options.len gth) CO.options[0] = null;
while (CR.options.len gth) CR.options[0] = null;
CR.options[CR.length] = new Option('-', '');
if (stateID == '' || state[stateID][1].length == 0) {
CO.options[CO.length] = new Option('-', '')
return
}
for (var i = 0; i < state[stateID][1].length; ++i)
CO.options[CO.length] =
new Option(county[state[stateID][1][i]][0], state[stateID][1][i]);
f2(state[stateID][1][0])
}

function f2(countyID) {
while (CR.options.len gth) CR.options[0] = null;
if (countyID == '' || county[countyID][1].length == 0) {
CR.options[CR.length] = new Option('-', '')
return
}
for (var i = 0; i < county[countyID][1].length; ++i)
CR.options[CR.length] =
new Option(crop[county[countyID][1][i]], county[countyID][1][i]);
}

--------------------------------------------------------------

Hope this helps,

--
Bart

Apr 24 '07 #3

"Bart Van der Donck" <ba**@nijlen.co mwrote in message
news:11******** **************@ t39g2000prd.goo glegroups.com.. .
Navodit wrote:
>I have 3 dropdowns: dropdown1 (State), dropdown2 (County), dropdown3
(crop).
So the idea is that each state has different counties and different
permutations of state and counties lead to different sets of crops. I
have a
total of 63 combinations of sets of crops available right now. Each of
these
combinations can consist of one or more of the following: (crop1, crop2,
crop3, crop4, crop5, crop6, crop7). Right now each of these combinations
is
hardcoded.

I would like to improve the design of the code if it is possible. The way
I
see this problem is that each of those 63 combinations is just adding
different kinds of condiments (crops in our case!) depending on the state
and county selected by the user. This looks something like the decorator
pattern where we can decorate(add accessories) objects at runtime.
However I am not entirely sure if first this is a good example of
decorator
pattern and secondly if it is possible to implement something like this
in
Javascript. Any thoughts/ideas/suggestions would be welcome...
>if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insu rance.county.se lectedIndex == 1 ||
document.Insur ance.county.sel ectedIndex == 2 ||
document.Insur ance.county.sel ectedIndex == 100 ||
document.Insur ance.county.sel ectedIndex == 101))
{
document.Insur ance.Commodity. length = 5;
document.Insur ance.Commodity[1].value = "4116";
document.Insur ance.Commodity[1].text = "Corn";

document.Insur ance.Commodity[2].value = "81997";
document.Insur ance.Commodity[2].text = "Soybeans";

document.Insur ance.Commodity[3].value = "11997";
document.Insur ance.Commodity[3].text = "Wheat";

document.Insur ance.Commodity[4].value = "51997";
document.Insur ance.Commodity[4].text = "Grain sorghum";}

else if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insu rance.county.se lectedIndex == 4 ||
document.Insur ance.county.sel ectedIndex == 6 ||
document.Insur ance.county.sel ectedIndex == 94 ||
document.Insur ance.county.sel ectedIndex == 102))
{
document.Insur ance.Commodity. length = 4;
document.Insur ance.Commodity[1].value = "4116";
document.Insur ance.Commodity[1].text = "Corn";

document.Insur ance.Commodity[2].value = "81997";
document.Insur ance.Commodity[2].text = "Soybeans";

document.Insur ance.Commodity[3].value = "11997";
document.Insur ance.Commodity[3].text = "Wheat";}

else if .....

Two core thoughts in this kind of complex data architectures:
- never repeat the same data twice
- separate data initialization from application

--------------------------------------------------------------

/* DATA INITIALIZATION */

// crops in form "crop[ID] = name"
var crop = new Object()
crop['10'] = 'corn'
crop['28'] = 'lettuce'
crop['29'] = 'soyabeans'
crop['33'] = 'tomatoes'
crop['35'] = 'wheat'

// counties in form "county[ID] = [countyname, [crops in it]]"
var county = new Object()
county['1'] = ['North Florida', [10,29] ]
county['2'] = ['Central Florida', [10,28,29,35] ]
county['7'] = ['South Florida', [] ]
county['8'] = ['East Texas', [29,33] ]
county['9'] = ['West Texas', [28,33,35]]

// states in form "state[stateID] = [statename, [counties in it]]"
var state = new Object()
state['24'] = ['Florida', [1,2,7]]
state['31'] = ['Texas', [8,9]]

/* DISPLAY */

document.write( '<form>')
document.write( '<select name="stateID" size="1"
onChange="f1(th is.value)">')
document.write( '<option value="">-</option>')
for (var i in state)
document.write( '<option value="'+i+'">' +state[i][0]+'</option>');
document.write( '</select>')
document.write( '<select name="countyID" size="1"
onChange="f2(th is.value)">')
document.write( '<option value="">-</option>')
document.write( '</select>')
document.write( '<select name="cropID" size="1">')
document.write( '<option value="">-</option>')
document.write( '</select>')
document.write( '<input type="submit"></form>')

/* UPDATE FUNCTIONS */

var CO = document.forms[0].elements['countyID']
var CR = document.forms[0].elements['cropID']

function f1(stateID) {
while (CO.options.len gth) CO.options[0] = null;
while (CR.options.len gth) CR.options[0] = null;
CR.options[CR.length] = new Option('-', '');
if (stateID == '' || state[stateID][1].length == 0) {
CO.options[CO.length] = new Option('-', '')
return
}
for (var i = 0; i < state[stateID][1].length; ++i)
CO.options[CO.length] =
new Option(county[state[stateID][1][i]][0], state[stateID][1][i]);
f2(state[stateID][1][0])
}

function f2(countyID) {
while (CR.options.len gth) CR.options[0] = null;
if (countyID == '' || county[countyID][1].length == 0) {
CR.options[CR.length] = new Option('-', '')
return
}
for (var i = 0; i < county[countyID][1].length; ++i)
CR.options[CR.length] =
new Option(crop[county[countyID][1][i]], county[countyID][1][i]);
}

--------------------------------------------------------------

Hope this helps,

--
Bart
I am not sure if what you have mentioned here will work for my case since
county names are not unique. So both state1 and state2 can have countyA but
the crop options would be different for the two combinations...
Apr 25 '07 #4
Navodit wrote:
>[...]
I am not sure if what you have mentioned here will work for my
case since county names are not unique. So both state1 and
state2 can have countyA but the crop options would be different
for the two combinations...
There is not a real problem if each actual county can only be part of
one state at the same time (which I would say is the most logic real-
world situation). Counties may always share a same name as long as the
ID is unique to maintain your referential integrity:

county['1'] = ['North', [10,33] ] // county "North"in Florida
county['2'] = ['Center', [29,35] ]
county['5'] = ['North', [35] ] // county "North" in Texas
state['8'] = ['Florida', [1,2]]
state['9'] = ['Texas', [5]]

The crops can be different per county of course.

Alternatively - or combined - you could also assign a same county to
more than one state:

county['1'] = ['North', [10,33] ]
county['2'] = ['Center', [29,35] ]
state['8'] = ['Florida', [1,2]]
state['9'] = ['Texas', [1]]

County['1'] is here part of Florida and of Texas. But the real-world
idea is here that a county can belong to more than one state; I'm
unsure if that would be the right logic. You can't have different
crops per unique county in this scenario.

--
Bart

Apr 26 '07 #5
On Mon, 23 Apr 2007 10:46:25 -0500, in comp.lang.javas cript ,
"Navodit" <ka******@uiuc. eduin <f0**********@n ews.ks.uiuc.edu >
wrote:
>Hi

I have a very typical problem which I believe might be more easily solvable
if it were designed better:

I have 3 dropdowns: dropdown1 (State), dropdown2 (County), dropdown3 (crop).
So the idea is that each state has different counties and different
permutations of state and counties lead to different sets of crops. I have a
total of 63 combinations of sets of crops available right now. Each of these
combinations can consist of one or more of the following: (crop1, crop2,
crop3, crop4, crop5, crop6, crop7). Right now each of these combinations is
hardcoded.

I would like to improve the design of the code if it is possible. The way I
see this problem is that each of those 63 combinations is just adding
different kinds of condiments (crops in our case!) depending on the state
and county selected by the user. This looks something like the decorator
pattern where we can decorate(add accessories) objects at runtime.
However I am not entirely sure if first this is a good example of decorator
pattern and secondly if it is possible to implement something like this in
Javascript. Any thoughts/ideas/suggestions would be welcome...

Navodit

p.s.: Some sample code to give you an idea of what I am talking about-

if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insu rance.county.se lectedIndex == 1 ||
document.Insur ance.county.sel ectedIndex == 2 ||
document.Insur ance.county.sel ectedIndex == 100 ||
document.Insur ance.county.sel ectedIndex == 101))
{
document.Insur ance.Commodity. length = 5;
document.Insur ance.Commodity[1].value = "4116";
document.Insur ance.Commodity[1].text = "Corn";

document.Insur ance.Commodity[2].value = "81997";
document.Insur ance.Commodity[2].text = "Soybeans";

document.Insur ance.Commodity[3].value = "11997";
document.Insur ance.Commodity[3].text = "Wheat";

document.Insur ance.Commodity[4].value = "51997";
document.Insur ance.Commodity[4].text = "Grain sorghum";
}
else if (document.Insur ance.State.sele ctedIndex == 1 &&
(document.Insu rance.county.se lectedIndex == 4 ||
document.Insur ance.county.sel ectedIndex == 6 ||
document.Insur ance.county.sel ectedIndex == 94 ||
document.Insur ance.county.sel ectedIndex == 102))
{
document.Insur ance.Commodity. length = 4;
document.Insur ance.Commodity[1].value = "4116";
document.Insur ance.Commodity[1].text = "Corn";

document.Insur ance.Commodity[2].value = "81997";
document.Insur ance.Commodity[2].text = "Soybeans";

document.Insur ance.Commodity[3].value = "11997";
document.Insur ance.Commodity[3].text = "Wheat";
}
else if .....
{

}

There are in total 63 different else if combinations... .
Where are you storing this data? It looks like you want each page to
do that. How about the user picks the state and you make a call to
pick up the county info for that state. When they pick a county you
make a call for crop info. That way you can keep all of the
information in a DB. And when you want more than crop info by county
you can easily add that.
--
Matt Silberstein

Do something today about the Darfur Genocide

http://www.beawitness.org
http://www.darfurgenocide.org
http://www.savedarfur.org

"Darfur: A Genocide We can Stop"
Apr 27 '07 #6

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

Similar topics

2
2566
by: Design Pattern Catalog | last post by:
Thank you for your interest in "Design Patterns: Elements of Reusable Object-Oriented Design", by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. This message answers several frequently asked questions. If you thought you were asking for the source code, you must have made a mistake. Please try again! The "pattern home page", with all this information and more, is at...
13
6562
by: John Salerno | last post by:
Here are a few I'm considering: Design Patterns Explained : A New Perspective on Object-Oriented Design (2nd Edition) (Software Patterns Series) by Alan Shalloway Design Patterns C# by Steven John Metsker Design Patterns by Erich Gamma Head First Design Patterns by Elisabeth Freeman
2
3335
by: Stan | last post by:
I want to make two pages interact through a controller. 1. Page A has a grid and Add button. 2. When Add button is clicked Page B pops up. 3. User enters information and clicks Save 4. Information is saved in database 5. User goes back to Page A which gets new data from database and displays one more row. So, the event handler for Add button on Page A might look like:
7
3105
by: =?Utf-8?B?bWF2cmlja18xMDE=?= | last post by:
Hi, I would like to know more about design patterns and specifically using C#. Can any one recommend a good book? Thanks
10
3679
by: vital | last post by:
Hi, I am designing the middle tier of a project. It has 6 classes and microsoft application data access block. The six classes are DBServices, Logger, ProjectServices ... etc. and all these classes talk to front-end directly. Do I need to use any design pattern in this? or what kind of design pattern is this?
0
9480
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 effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10325
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, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
1
10091
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
9950
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
8972
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
1
7499
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
5511
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
2
3646
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2879
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

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.