var timeouts = new Array();

var craigslist_subdomains_by_country = {
  "cn":[
    {"url":"http://beijing.craigslist.com.cn","name":"beijing"},
    {"url":"http://guangzhou.craigslist.com.cn","name":"guangzhou"},
    {"url":"http://hongkong.craigslist.org","name":"hong kong"},
    {"url":"http://shanghai.craigslist.com.cn","name":"shanghai"}
  ],
  "ph":[
    {"url":"http://manila.craigslist.com.ph","name":"manila"}
  ],
  "es":[
    {"url":"http://barcelona.craigslist.es","name":"barcelona"},
    {"url":"http://madrid.craigslist.es","name":"madrid"},
    {"url":"http://sevilla.craigslist.es","name":"sevilla"},
    {"url":"http://valencia.craigslist.es","name":"valencia"}
  ],
  "tw":[
    {"url":"http://taipei.craigslist.com.tw","name":"taipei"}
  ],
  "kr":[
    {"url":"http://seoul.craigslist.co.kr","name":"seoul"}
  ],
  "my":[
    {"url":"http://malaysia.craigslist.org","name":"malaysia"}
  ],
  "fr":[
    {"url":"http://bordeaux.craigslist.org","name":"bordeaux"},
    {"url":"http://lille.craigslist.org","name":"lille"},
    {"url":"http://loire.craigslist.org","name":"loire valley"},
    {"url":"http://lyon.craigslist.org","name":"lyon"},
    {"url":"http://marseilles.craigslist.org","name":"marseille"},
    {"url":"http://cotedazur.craigslist.org","name":"nice / cote d'azur"},
    {"url":"http://paris.craigslist.org","name":"paris"},
    {"url":"http://strasbourg.craigslist.org","name":"strasbourg"},
    {"url":"http://toulouse.craigslist.org","name":"toulouse"}
  ],
  "au":[
    {"url":"http://adelaide.craigslist.com.au","name":"adelaide"},
    {"url":"http://brisbane.craigslist.com.au","name":"brisbane"},
    {"url":"http://melbourne.craigslist.com.au","name":"melbourne"},
    {"url":"http://perth.craigslist.com.au","name":"perth"},
    {"url":"http://sydney.craigslist.com.au","name":"sydney"}
  ],
  "ch":[
    {"url":"http://geneva.craigslist.ch","name":"geneva"},
    {"url":"http://zurich.craigslist.ch","name":"zurich"}
  ],
  "gb":[
    {"url":"http://aberdeen.craigslist.co.uk","name":"aberdeen"},
    {"url":"http://belfast.craigslist.co.uk","name":"belfast"},
    {"url":"http://birmingham.craigslist.co.uk","name":"birmingham"},
    {"url":"http://brighton.craigslist.co.uk","name":"brighton"},
    {"url":"http://bristol.craigslist.co.uk","name":"bristol"},
    {"url":"http://cambridge.craigslist.co.uk","name":"cambridge, UK"},
    {"url":"http://cardiff.craigslist.co.uk","name":"cardiff / wales"},
    {"url":"http://devon.craigslist.co.uk","name":"devon & cornwall"},
    {"url":"http://norwich.craigslist.co.uk","name":"east anglia"},
    {"url":"http://eastmids.craigslist.co.uk","name":"east midlands"},
    {"url":"http://edinburgh.craigslist.co.uk","name":"edinburgh"},
    {"url":"http://glasgow.craigslist.co.uk","name":"glasgow"},
    {"url":"http://hampshire.craigslist.co.uk","name":"hampshire"},
    {"url":"http://leeds.craigslist.co.uk","name":"leeds"},
    {"url":"http://liverpool.craigslist.co.uk","name":"liverpool"},
    {"url":"http://london.craigslist.co.uk","name":"london"},
    {"url":"http://manchester.craigslist.co.uk","name":"manchester"},
    {"url":"http://newcastle.craigslist.co.uk","name":"newcastle"},
    {"url":"http://oxford.craigslist.co.uk","name":"oxford"},
    {"url":"http://sheffield.craigslist.co.uk","name":"sheffield"}
  ],
  "in":[
    {"url":"http://ahmedabad.craigslist.co.in","name":"ahmedabad"},
    {"url":"http://bangalore.craigslist.co.in","name":"bangalore"},
    {"url":"http://chennai.craigslist.co.in","name":"chennai (madras)"},
    {"url":"http://delhi.craigslist.co.in","name":"delhi"},
    {"url":"http://goa.craigslist.co.in","name":"goa"},
    {"url":"http://hyderabad.craigslist.co.in","name":"hyderabad"},
    {"url":"http://kerala.craigslist.co.in","name":"kerala"},
    {"url":"http://kolkata.craigslist.co.in","name":"kolkata (calcutta)"},
    {"url":"http://mumbai.craigslist.co.in","name":"mumbai"},
    {"url":"http://pune.craigslist.co.in","name":"pune"}
  ],
  "at":[
    {"url":"http://vienna.craigslist.at","name":"vienna"}
  ],
  "sg":[
    {"url":"http://singapore.craigslist.com.sg","name":"singapore"}
  ],
  "us":[
    {"url":"http://atlanta.craigslist.org","name":"atlanta"},
    {"url":"http://austin.craigslist.org","name":"austin"},
    {"url":"http://boston.craigslist.org","name":"boston"},
    {"url":"http://chicago.craigslist.org","name":"chicago"},
    {"url":"http://dallas.craigslist.org","name":"dallas / fort worth"},
    {"url":"http://denver.craigslist.org","name":"denver"},
    {"url":"http://detroit.craigslist.org","name":"detroit metro"},
    {"url":"http://honolulu.craigslist.org","name":"hawaii"},
    {"url":"http://houston.craigslist.org","name":"houston"},
    {"url":"http://lasvegas.craigslist.org","name":"las vegas"},
    {"url":"http://losangeles.craigslist.org","name":"los angeles"},
    {"url":"http://miami.craigslist.org","name":"miami"},
    {"url":"http://minneapolis.craigslist.org","name":"minneapolis / st paul"},
    {"url":"http://newyork.craigslist.org","name":"new york city"},
    {"url":"http://orangecounty.craigslist.org","name":"orange county"},
    {"url":"http://philadelphia.craigslist.org","name":"philadelphia"},
    {"url":"http://phoenix.craigslist.org","name":"phoenix"},
    {"url":"http://portland.craigslist.org","name":"portland, OR"},
    {"url":"http://raleigh.craigslist.org","name":"raleigh / durham / CH"},
    {"url":"http://sacramento.craigslist.org","name":"sacramento"},
    {"url":"http://sandiego.craigslist.org","name":"san diego"},
    {"url":"http://sfbay.craigslist.org","name":"san francisco bay area","selected":"selected"},
    {"url":"http://seattle.craigslist.org","name":"seattle-tacoma"},
    {"url":"http://stlouis.craigslist.org","name":"st louis, MO"},
    {"url":"http://washingtondc.craigslist.org","name":"washington, DC"},
    {"url":"","name":""},
    {"url":"http://abilene.craigslist.org","name":"abilene"},
    {"url":"http://akroncanton.craigslist.org","name":"akron / canton"},
    {"url":"http://anchorage.craigslist.org","name":"alaska"},
    {"url":"http://albany.craigslist.org","name":"albany"},
    {"url":"http://albuquerque.craigslist.org","name":"albuquerque"},
    {"url":"http://altoona.craigslist.org","name":"altoona-johnstown"},
    {"url":"http://amarillo.craigslist.org","name":"amarillo"},
    {"url":"http://ames.craigslist.org","name":"ames, IA"},
    {"url":"http://annarbor.craigslist.org","name":"ann arbor"},
    {"url":"http://appleton.craigslist.org","name":"appleton-oshkosh-FDL"},
    {"url":"http://asheville.craigslist.org","name":"asheville"},
    {"url":"http://athensga.craigslist.org","name":"athens, GA"},
    {"url":"http://athensohio.craigslist.org","name":"athens, OH"},
    {"url":"http://auburn.craigslist.org","name":"auburn"},
    {"url":"http://augusta.craigslist.org","name":"augusta"},
    {"url":"http://bakersfield.craigslist.org","name":"bakersfield"},
    {"url":"http://baltimore.craigslist.org","name":"baltimore"},
    {"url":"http://batonrouge.craigslist.org","name":"baton rouge"},
    {"url":"http://beaumont.craigslist.org","name":"beaumont / port arthur"},
    {"url":"http://bellingham.craigslist.org","name":"bellingham"},
    {"url":"http://bend.craigslist.org","name":"bend"},
    {"url":"http://binghamton.craigslist.org","name":"binghamton"},
    {"url":"http://bham.craigslist.org","name":"birmingham, AL"},
    {"url":"http://blacksburg.craigslist.org","name":"blacksburg"},
    {"url":"http://bloomington.craigslist.org","name":"bloomington"},
    {"url":"http://bn.craigslist.org","name":"bloomington-normal"},
    {"url":"http://boise.craigslist.org","name":"boise"},
    {"url":"http://boone.craigslist.org","name":"boone"},
    {"url":"http://boulder.craigslist.org","name":"boulder"},
    {"url":"http://bgky.craigslist.org","name":"bowling green"},
    {"url":"http://brownsville.craigslist.org","name":"brownsville"},
    {"url":"http://buffalo.craigslist.org","name":"buffalo"},
    {"url":"http://capecod.craigslist.org","name":"cape cod / islands"},
    {"url":"http://carbondale.craigslist.org","name":"carbondale"},
    {"url":"http://catskills.craigslist.org","name":"catskills"},
    {"url":"http://cedarrapids.craigslist.org","name":"cedar rapids"},
    {"url":"http://cnj.craigslist.org","name":"central NJ"},
    {"url":"http://centralmich.craigslist.org","name":"central michigan"},
    {"url":"http://chambana.craigslist.org","name":"champaign urbana"},
    {"url":"http://charleston.craigslist.org","name":"charleston, SC"},
    {"url":"http://charlestonwv.craigslist.org","name":"charleston, WV"},
    {"url":"http://charlotte.craigslist.org","name":"charlotte"},
    {"url":"http://charlottesville.craigslist.org","name":"charlottesville"},
    {"url":"http://chattanooga.craigslist.org","name":"chattanooga"},
    {"url":"http://chautauqua.craigslist.org","name":"chautauqua"},
    {"url":"http://chico.craigslist.org","name":"chico"},
    {"url":"http://cincinnati.craigslist.org","name":"cincinnati, OH"},
    {"url":"http://cleveland.craigslist.org","name":"cleveland"},
    {"url":"http://collegestation.craigslist.org","name":"college station"},
    {"url":"http://cosprings.craigslist.org","name":"colorado springs"},
    {"url":"http://columbiamo.craigslist.org","name":"columbia / jeff city"},
    {"url":"http://columbia.craigslist.org","name":"columbia, SC"},
    {"url":"http://columbus.craigslist.org","name":"columbus"},
    {"url":"http://columbusga.craigslist.org","name":"columbus, GA"},
    {"url":"http://corpuschristi.craigslist.org","name":"corpus christi"},
    {"url":"http://corvallis.craigslist.org","name":"corvallis/albany"},
    {"url":"http://danville.craigslist.org","name":"danville"},
    {"url":"http://dayton.craigslist.org","name":"dayton"},
    {"url":"http://daytona.craigslist.org","name":"daytona beach"},
    {"url":"http://delaware.craigslist.org","name":"delaware"},
    {"url":"http://desmoines.craigslist.org","name":"des moines"},
    {"url":"http://dubuque.craigslist.org","name":"dubuque"},
    {"url":"http://duluth.craigslist.org","name":"duluth / superior"},
    {"url":"http://eastidaho.craigslist.org","name":"east idaho"},
    {"url":"http://eastoregon.craigslist.org","name":"east oregon"},
    {"url":"http://newlondon.craigslist.org","name":"eastern CT"},
    {"url":"http://eastnc.craigslist.org","name":"eastern NC"},
    {"url":"http://easternshore.craigslist.org","name":"eastern shore"},
    {"url":"http://eauclaire.craigslist.org","name":"eau claire"},
    {"url":"http://elpaso.craigslist.org","name":"el paso"},
    {"url":"http://elmira.craigslist.org","name":"elmira-corning"},
    {"url":"http://erie.craigslist.org","name":"erie, PA"},
    {"url":"http://eugene.craigslist.org","name":"eugene"},
    {"url":"http://evansville.craigslist.org","name":"evansville"},
    {"url":"http://fargo.craigslist.org","name":"fargo / moorhead"},
    {"url":"http://fayetteville.craigslist.org","name":"fayetteville"},
    {"url":"http://fayar.craigslist.org","name":"fayetteville, AR"},
    {"url":"http://flagstaff.craigslist.org","name":"flagstaff / sedona"},
    {"url":"http://flint.craigslist.org","name":"flint"},
    {"url":"http://keys.craigslist.org","name":"florida keys"},
    {"url":"http://fortcollins.craigslist.org","name":"fort collins / north CO"},
    {"url":"http://fortlauderdale.craigslist.org","name":"fort lauderdale"},
    {"url":"http://fortsmith.craigslist.org","name":"fort smith, AR"},
    {"url":"http://fortwayne.craigslist.org","name":"fort wayne"},
    {"url":"http://fresno.craigslist.org","name":"fresno"},
    {"url":"http://fortmyers.craigslist.org","name":"ft myers / SW florida"},
    {"url":"http://gainesville.craigslist.org","name":"gainesville"},
    {"url":"http://goldcountry.craigslist.org","name":"gold country"},
    {"url":"http://grandisland.craigslist.org","name":"grand island"},
    {"url":"http://grandrapids.craigslist.org","name":"grand rapids"},
    {"url":"http://greenbay.craigslist.org","name":"green bay"},
    {"url":"http://greensboro.craigslist.org","name":"greensboro"},
    {"url":"http://greenville.craigslist.org","name":"greenville / upstate"},
    {"url":"http://gulfport.craigslist.org","name":"gulfport / biloxi"},
    {"url":"http://norfolk.craigslist.org","name":"hampton roads"},
    {"url":"http://harrisburg.craigslist.org","name":"harrisburg"},
    {"url":"http://harrisonburg.craigslist.org","name":"harrisonburg"},
    {"url":"http://hartford.craigslist.org","name":"hartford"},
    {"url":"http://hattiesburg.craigslist.org","name":"hattiesburg"},
    {"url":"http://hiltonhead.craigslist.org","name":"hilton head"},
    {"url":"http://hudsonvalley.craigslist.org","name":"hudson valley"},
    {"url":"http://humboldt.craigslist.org","name":"humboldt county"},
    {"url":"http://huntington.craigslist.org","name":"huntington-ashland"},
    {"url":"http://huntsville.craigslist.org","name":"huntsville"},
    {"url":"http://indianapolis.craigslist.org","name":"indianapolis"},
    {"url":"http://inlandempire.craigslist.org","name":"inland empire"},
    {"url":"http://iowacity.craigslist.org","name":"iowa city"},
    {"url":"http://ithaca.craigslist.org","name":"ithaca"},
    {"url":"http://jxn.craigslist.org","name":"jackson, MI"},
    {"url":"http://jackson.craigslist.org","name":"jackson, MS"},
    {"url":"http://jacksonville.craigslist.org","name":"jacksonville"},
    {"url":"http://jonesboro.craigslist.org","name":"jonesboro"},
    {"url":"http://joplin.craigslist.org","name":"joplin"},
    {"url":"http://kalamazoo.craigslist.org","name":"kalamazoo"},
    {"url":"http://kansascity.craigslist.org","name":"kansas city, MO"},
    {"url":"http://kpr.craigslist.org","name":"kennewick-pasco-richland"},
    {"url":"http://killeen.craigslist.org","name":"killeen / temple / ft hood"},
    {"url":"http://knoxville.craigslist.org","name":"knoxville"},
    {"url":"http://lacrosse.craigslist.org","name":"la crosse"},
    {"url":"http://lafayette.craigslist.org","name":"lafayette"},
    {"url":"http://tippecanoe.craigslist.org","name":"lafayette / west lafayette"},
    {"url":"http://lakecharles.craigslist.org","name":"lake charles"},
    {"url":"http://lakeland.craigslist.org","name":"lakeland"},
    {"url":"http://lancaster.craigslist.org","name":"lancaster, PA"},
    {"url":"http://lansing.craigslist.org","name":"lansing"},
    {"url":"http://laredo.craigslist.org","name":"laredo"},
    {"url":"http://lascruces.craigslist.org","name":"las cruces"},
    {"url":"http://lawrence.craigslist.org","name":"lawrence"},
    {"url":"http://lawton.craigslist.org","name":"lawton"},
    {"url":"http://allentown.craigslist.org","name":"lehigh valley"},
    {"url":"http://lexington.craigslist.org","name":"lexington, KY"},
    {"url":"http://limaohio.craigslist.org","name":"lima / findlay"},
    {"url":"http://lincoln.craigslist.org","name":"lincoln"},
    {"url":"http://littlerock.craigslist.org","name":"little rock"},
    {"url":"http://logan.craigslist.org","name":"logan"},
    {"url":"http://longisland.craigslist.org","name":"long island"},
    {"url":"http://louisville.craigslist.org","name":"louisville"},
    {"url":"http://lubbock.craigslist.org","name":"lubbock"},
    {"url":"http://lynchburg.craigslist.org","name":"lynchburg"},
    {"url":"http://macon.craigslist.org","name":"macon"},
    {"url":"http://madison.craigslist.org","name":"madison"},
    {"url":"http://maine.craigslist.org","name":"maine"},
    {"url":"http://ksu.craigslist.org","name":"manhattan, KS"},
    {"url":"http://mankato.craigslist.org","name":"mankato"},
    {"url":"http://mansfield.craigslist.org","name":"mansfield"},
    {"url":"http://martinsburg.craigslist.org","name":"martinsburg"},
    {"url":"http://mcallen.craigslist.org","name":"mcallen / edinburg"},
    {"url":"http://medford.craigslist.org","name":"medford-ashland-klamath"},
    {"url":"http://memphis.craigslist.org","name":"memphis, TN"},
    {"url":"http://merced.craigslist.org","name":"merced"},
    {"url":"http://milwaukee.craigslist.org","name":"milwaukee"},
    {"url":"http://mobile.craigslist.org","name":"mobile"},
    {"url":"http://modesto.craigslist.org","name":"modesto"},
    {"url":"http://montana.craigslist.org","name":"montana"},
    {"url":"http://monterey.craigslist.org","name":"monterey bay"},
    {"url":"http://montgomery.craigslist.org","name":"montgomery"},
    {"url":"http://morgantown.craigslist.org","name":"morgantown"},
    {"url":"http://muncie.craigslist.org","name":"muncie / anderson"},
    {"url":"http://myrtlebeach.craigslist.org","name":"myrtle beach"},
    {"url":"http://nashville.craigslist.org","name":"nashville"},
    {"url":"http://nh.craigslist.org","name":"new hampshire"},
    {"url":"http://newhaven.craigslist.org","name":"new haven"},
    {"url":"http://neworleans.craigslist.org","name":"new orleans"},
    {"url":"http://nd.craigslist.org","name":"north dakota"},
    {"url":"http://newjersey.craigslist.org","name":"north jersey"},
    {"url":"http://northmiss.craigslist.org","name":"north mississippi"},
    {"url":"http://nmi.craigslist.org","name":"northern michigan"},
    {"url":"http://nwct.craigslist.org","name":"northwest CT"},
    {"url":"http://ocala.craigslist.org","name":"ocala"},
    {"url":"http://odessa.craigslist.org","name":"odessa / midland"},
    {"url":"http://ogden.craigslist.org","name":"ogden-clearfield"},
    {"url":"http://oklahomacity.craigslist.org","name":"oklahoma city"},
    {"url":"http://omaha.craigslist.org","name":"omaha / council bluffs"},
    {"url":"http://oregoncoast.craigslist.org","name":"oregon coast"},
    {"url":"http://orlando.craigslist.org","name":"orlando"},
    {"url":"http://outerbanks.craigslist.org","name":"outer banks"},
    {"url":"http://palmsprings.craigslist.org","name":"palm springs, CA"},
    {"url":"http://parkersburg.craigslist.org","name":"parkersburg-marietta"},
    {"url":"http://pensacola.craigslist.org","name":"pensacola / panhandle"},
    {"url":"http://peoria.craigslist.org","name":"peoria"},
    {"url":"http://pittsburgh.craigslist.org","name":"pittsburgh"},
    {"url":"http://plattsburgh.craigslist.org","name":"plattsburgh-adirondacks"},
    {"url":"http://poconos.craigslist.org","name":"poconos"},
    {"url":"http://prescott.craigslist.org","name":"prescott"},
    {"url":"http://provo.craigslist.org","name":"provo / orem"},
    {"url":"http://pueblo.craigslist.org","name":"pueblo"},
    {"url":"http://pullman.craigslist.org","name":"pullman / moscow"},
    {"url":"http://quadcities.craigslist.org","name":"quad cities, IA/IL"},
    {"url":"http://reading.craigslist.org","name":"reading"},
    {"url":"http://redding.craigslist.org","name":"redding"},
    {"url":"http://reno.craigslist.org","name":"reno / tahoe"},
    {"url":"http://providence.craigslist.org","name":"rhode island"},
    {"url":"http://richmond.craigslist.org","name":"richmond"},
    {"url":"http://roanoke.craigslist.org","name":"roanoke"},
    {"url":"http://rmn.craigslist.org","name":"rochester, MN"},
    {"url":"http://rochester.craigslist.org","name":"rochester, NY"},
    {"url":"http://rockford.craigslist.org","name":"rockford"},
    {"url":"http://rockies.craigslist.org","name":"rocky mountains"},
    {"url":"http://roswell.craigslist.org","name":"roswell / carlsbad"},
    {"url":"http://saginaw.craigslist.org","name":"saginaw-midland-baycity"},
    {"url":"http://salem.craigslist.org","name":"salem, OR"},
    {"url":"http://saltlakecity.craigslist.org","name":"salt lake city"},
    {"url":"http://sanantonio.craigslist.org","name":"san antonio"},
    {"url":"http://slo.craigslist.org","name":"san luis obispo"},
    {"url":"http://sanmarcos.craigslist.org","name":"san marcos"},
    {"url":"http://santabarbara.craigslist.org","name":"santa barbara"},
    {"url":"http://santafe.craigslist.org","name":"santa fe / taos"},
    {"url":"http://sarasota.craigslist.org","name":"sarasota-bradenton"},
    {"url":"http://savannah.craigslist.org","name":"savannah"},
    {"url":"http://scranton.craigslist.org","name":"scranton / wilkes-barre"},
    {"url":"http://shreveport.craigslist.org","name":"shreveport"},
    {"url":"http://siouxcity.craigslist.org","name":"sioux city, IA"},
    {"url":"http://southbend.craigslist.org","name":"south bend / michiana"},
    {"url":"http://southcoast.craigslist.org","name":"south coast"},
    {"url":"http://sd.craigslist.org","name":"south dakota"},
    {"url":"http://southjersey.craigslist.org","name":"south jersey"},
    {"url":"http://spacecoast.craigslist.org","name":"space coast"},
    {"url":"http://spokane.craigslist.org","name":"spokane / coeur d'alene"},
    {"url":"http://springfieldil.craigslist.org","name":"springfield, IL"},
    {"url":"http://springfield.craigslist.org","name":"springfield, MO"},
    {"url":"http://stcloud.craigslist.org","name":"st cloud"},
    {"url":"http://stgeorge.craigslist.org","name":"st george"},
    {"url":"http://pennstate.craigslist.org","name":"state college"},
    {"url":"http://stillwater.craigslist.org","name":"stillwater"},
    {"url":"http://stockton.craigslist.org","name":"stockton"},
    {"url":"http://syracuse.craigslist.org","name":"syracuse"},
    {"url":"http://tallahassee.craigslist.org","name":"tallahassee"},
    {"url":"http://tampa.craigslist.org","name":"tampa bay area"},
    {"url":"http://terrahaute.craigslist.org","name":"terre haute"},
    {"url":"http://texarkana.craigslist.org","name":"texarkana"},
    {"url":"http://toledo.craigslist.org","name":"toledo"},
    {"url":"http://topeka.craigslist.org","name":"topeka"},
    {"url":"http://treasure.craigslist.org","name":"treasure coast"},
    {"url":"http://tricities.craigslist.org","name":"tri-cities, TN"},
    {"url":"http://tucson.craigslist.org","name":"tucson"},
    {"url":"http://tulsa.craigslist.org","name":"tulsa"},
    {"url":"http://tuscaloosa.craigslist.org","name":"tuscaloosa"},
    {"url":"http://easttexas.craigslist.org","name":"tyler / east TX"},
    {"url":"http://up.craigslist.org","name":"upper peninsula"},
    {"url":"http://utica.craigslist.org","name":"utica"},
    {"url":"http://valdosta.craigslist.org","name":"valdosta"},
    {"url":"http://ventura.craigslist.org","name":"ventura county"},
    {"url":"http://burlington.craigslist.org","name":"vermont"},
    {"url":"http://visalia.craigslist.org","name":"visalia-tulare"},
    {"url":"http://waco.craigslist.org","name":"waco"},
    {"url":"http://watertown.craigslist.org","name":"watertown"},
    {"url":"http://wenatchee.craigslist.org","name":"wenatchee"},
    {"url":"http://westpalmbeach.craigslist.org","name":"west palm beach"},
    {"url":"http://wv.craigslist.org","name":"west virginia (old)"},
    {"url":"http://westky.craigslist.org","name":"western KY"},
    {"url":"http://westmd.craigslist.org","name":"western maryland"},
    {"url":"http://westernmass.craigslist.org","name":"western massachusetts"},
    {"url":"http://westslope.craigslist.org","name":"western slope"},
    {"url":"http://wheeling.craigslist.org","name":"wheeling, WV"},
    {"url":"http://wichita.craigslist.org","name":"wichita"},
    {"url":"http://wichitafalls.craigslist.org","name":"wichita falls"},
    {"url":"http://wilmington.craigslist.org","name":"wilmington, NC"},
    {"url":"http://winstonsalem.craigslist.org","name":"winston-salem"},
    {"url":"http://worcester.craigslist.org","name":"worcester / central MA"},
    {"url":"http://wyoming.craigslist.org","name":"wyoming"},
    {"url":"http://yakima.craigslist.org","name":"yakima"},
    {"url":"http://york.craigslist.org","name":"york, PA"},
    {"url":"http://youngstown.craigslist.org","name":"youngstown"},
    {"url":"http://yuma.craigslist.org","name":"yuma"}
  ],
  "vn":[
    {"url":"http://vietnam.craigslist.org","name":"vietnam"}
  ],
  "hk":[
    {"url":"http://hongkong.craigslist.org","name":"hong kong"}
  ],
  "ie":[
    {"url":"http://dublin.craigslist.org","name":"dublin"}
  ],
  "it":[
    {"url":"http://bologna.craigslist.it","name":"bologna"},
    {"url":"http://florence.craigslist.it","name":"florence / tuscany"},
    {"url":"http://milan.craigslist.it","name":"milan"},
    {"url":"http://naples.craigslist.it","name":"napoli / campania"},
    {"url":"http://rome.craigslist.it","name":"rome"},
    {"url":"http://sicily.craigslist.it","name":"sicilia"},
    {"url":"http://torino.craigslist.it","name":"torino"},
    {"url":"http://venice.craigslist.it","name":"venice / veneto"}
  ],
  "ca":[
    {"url":"http://barrie.craigslist.ca","name":"barrie"},
    {"url":"http://calgary.craigslist.ca","name":"calgary"},
    {"url":"http://edmonton.craigslist.ca","name":"edmonton"},
    {"url":"http://halifax.craigslist.ca","name":"halifax"},
    {"url":"http://hamilton.craigslist.ca","name":"hamilton-burlington"},
    {"url":"http://kamloops.craigslist.ca","name":"kamloops"},
    {"url":"http://kelowna.craigslist.ca","name":"kelowna"},
    {"url":"http://kingston.craigslist.ca","name":"kingston, ON"},
    {"url":"http://kitchener.craigslist.ca","name":"kitchener-waterloo-cambridge"},
    {"url":"http://londonon.craigslist.ca","name":"london, ON"},{"url":"http://montreal.craigslist.ca","name":"montreal"},
    {"url":"http://nanaimo.craigslist.ca","name":"nanaimo"},
    {"url":"http://newbrunswick.craigslist.ca","name":"new brunswick"},
    {"url":"http://newfoundland.craigslist.ca","name":"newfoundland / labrador"},
    {"url":"http://niagara.craigslist.ca","name":"niagara region"},
    {"url":"http://ottawa.craigslist.ca","name":"ottawa-hull-gatineau"},
    {"url":"http://peterborough.craigslist.ca","name":"peterborough"},
    {"url":"http://pei.craigslist.ca","name":"prince edward island"},
    {"url":"http://princegeorge.craigslist.ca","name":"prince george"},
    {"url":"http://quebec.craigslist.ca","name":"quebec city"},
    {"url":"http://saskatoon.craigslist.ca","name":"saskatchewan"},
    {"url":"http://sherbrooke.craigslist.ca","name":"sherbrooke"},
    {"url":"http://sudbury.craigslist.ca","name":"sudbury"},
    {"url":"http://thunderbay.craigslist.ca","name":"thunder bay"},
    {"url":"http://toronto.craigslist.ca","name":"toronto"},
    {"url":"http://vancouver.craigslist.ca","name":"vancouver, BC"},
    {"url":"http://victoria.craigslist.ca","name":"victoria"},
    {"url":"http://windsor.craigslist.ca","name":"windsor"},
    {"url":"http://winnipeg.craigslist.ca","name":"winnipeg"}
  ],
  "pl":[
    {"url":"http://warsaw.craigslist.pl","name":"warsaw"}
  ],
  "nl":[
    {"url":"http://amsterdam.craigslist.org","name":"amsterdam"}
  ],
  "de":[
    {"url":"http://berlin.craigslist.org","name":"berlin"},
    {"url":"http://cologne.craigslist.org","name":"cologne"},
    {"url":"http://dusseldorf.craigslist.org","name":"dusseldorf"},
    {"url":"http://frankfurt.craigslist.org","name":"frankfurt"},
    {"url":"http://hamburg.craigslist.org","name":"hamburg"},
    {"url":"http://hannover.craigslist.org","name":"hannover"},
    {"url":"http://munich.craigslist.org","name":"munich"},
    {"url":"http://stuttgart.craigslist.org","name":"stuttgart"}
  ],
  "nz":[
    {"url":"http://auckland.craigslist.org","name":"auckland"},
    {"url":"http://christchurch.craigslist.org","name":"christchurch"},
    {"url":"http://wellington.craigslist.org","name":"wellington"}
  ],
  "be":[
    {"url":"http://brussels.craigslist.org","name":"brussels"}
  ]
};

var default_text = {
  'w': 'Find a deal on...',
  'minimum_price': 'min',
  'maximum_price': 'max',
  'exclude_terms': 'comma separated list'
};

/* A library of cookie functions */
var Cookie = {
  set: function(name, value, daysToExpire) {
    var expires = '';
    if (daysToExpire == undefined) {
      daysToExpire = '365';
    }

    var d = new Date();
    d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
    expires = d;

    var path;
    var domain;
    var secure;
    var curCookie = name + "=" + escape(value) + 
      ((expires) ? "; expires=" + expires.toGMTString() : "") + 
      ((path) ? "; path=" + path : "") + 
      ((domain) ? "; domain=" + domain : "") + 
      ((secure) ? "; secure" : ""); 
    return (document.cookie = curCookie);
  },

  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*'
                + escape(name)
                + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : undefined);
  },

  erase: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },

  accept: function() {
    if (typeof navigator.cookieEnabled == 'boolean') {
      return navigator.cookieEnabled;
    }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === '1');
  },

  available: function() {
    var whole_cookie = unescape(document.cookie);
    var cookie_names = new Array;
    var each_cookie = whole_cookie.split(";");
    for(i=0; i<each_cookie.length;i++) {
      var cookie_parts = each_cookie[i].split("=");
      cookie_names.push(cookie_parts[0]);
    }
    return(cookie_names);
  }
};

var searches = {

  data: {},

  saved_searches: {},

  /* Retrieves the information from the cookie in the form of an object/array */
  load_from_cookie: function (cookie_name) {
  
    var value = Cookie.get(cookie_name);
    var data;
    if (value && value != undefined) {
      data = JSON.parse(unescape(value));
    }
    return data;
  
  },

  /* Saves the information currently in searches.data to the current cookie */
  save_current: function () {

    var dataString = escape(JSON.stringify(this.data));
    Cookie.set('current', dataString);

  },
  
  /* Saves the information currently in searches.saved_searches to the
     saved cookie */
  save_saved_to_cookie: function () {
    if(searches.saved_searches) {
      var dataString = escape(JSON.stringify(searches.saved_searches));
      Cookie.set("saved", dataString);
    }
  },

  /* Creates a data object from the current form settings */
  create_data_object: function () {
    var data = new Object;
    var sites = new Array;

    $("input[name='sites']:checked").each(function() {
     sites.push(this.value);
    });
  
    data['country'] = $("#country option:selected")[0].value;
    data['craigslist_url'] = $("#craigslist_url option:selected")[0].value;
  
    data['sites'] = sites;
    data['w']  = $("input[name='w']").val();
    data['search_type'] = $("input[name='search_type']:checked").val();
  
    data['include_typos_misspellings'] = $("input[name='include_typos_misspellings']:checked").val() == 1 ? 1 : 0;
    data['exclude_word'] = $("input[name='exclude_word']:checked").val() == 1 ? 1 : 0;
    data['include_numbers'] = $("input[name='include_numbers']:checked").val() == 1 ? 1 : 0;
    data['search_description'] = $("input[name='search_description']:checked").val() == 1 ? 1 : 0;
    data['include_real_words'] = $("input[name='include_real_words']:checked").val() == 1 ? 1 : 0;
    data['exclude_terms'] = $("input[name='exclude_terms']").val();
    data['minimum_price'] = $("input[name='minimum_price']").val();
    data['maximum_price'] = $("input[name='maximum_price']").val();
  
    data['paypal_only'] = $("input[name='paypal_only']:checked").val() == 1 ? 1 : 0;
    data['buy_now_only'] = $("input[name='buy_now_only']:checked").val() == 1 ? 1 : 0;
  
    data['has_picture'] = $("input[name='has_picture']:checked").val() == 1 ? 1 : 0;
  
    if(data['minimum_price'] == default_text['minimum_price']) {
      data['minimum_price'] = '';
    }
    if(data['maximum_price'] == default_text['maximum_price']) {
      data['maximum_price'] = '';
    }
    if(data['exclude_terms'] == default_text['exclude_terms']) {
      data['exclude_terms'] = '';
    }
  
    return data;
  },

  /* Saves the current form settings as a saved search of the given name */
  save_search: function () {
    /* Do some data checking */
    var name = $("input[name='name_search']").val();
    if (name == '') {
      alert('You must enter a name.');
      return false;
    }

    /* Set this up for when a cookie doesn't exist. */
    if (searches.saved_searches == undefined) {
      searches.saved_searches = new Object();
    }

    /* Create the data structure, save it to the cookie, and reload the list */
    searches.saved_searches[name] = searches.create_data_object();
    searches.save_saved_to_cookie();
    searches.load_saved_from_cookie();

    /* Reset the UI */
    $("input[name='name_search']").val('');
    $("#save-search-link").show();
    $("#add_saved_search").hide();

    return false;
  },

  /*
  Usage     : searches.load_saved_from_cookie()
  Purpose   : Retrieves the data structure stored in the saved cookie and saves
            : it in searches.saved_searches
  Returns   : nothing
  Parameters: none
  Comments  : Since it recreates the saved searches list, we must reattach the
            : jquery events to the list elements.
  See Also  : searches.load_from_cookie
  */
  load_saved_from_cookie: function () {
    searches.saved_searches = searches.load_from_cookie('saved');
    if(searches.saved_searches == undefined) {
      return;
    }
  
    $("#saved-searches-list").empty();
    for(var saved_name in searches.saved_searches) {
      $("#saved-searches-list").append(
        '<li style="clear: both;"><a class="delete" href="/" title="Delete saved search: '
        + saved_name +'">X</a> <a class="saved" href="/"'
        + 'onClick="javascript:pageTracker._trackPageview(\'/saved/'
        + saved_name + '\');">'
        + saved_name
        + '</a></li>'
      );
    }
    $(".delete").click(searches.delete_saved_search);
    $(".saved").click(function() {
      searches.load_saved_search($(this).text());
      return false;
    });
  },
  

  delete_saved_search: function () {
    var name = $(this).siblings('a').text();

    if(name == '') {
      return false;
    }
    if(searches.saved_searches == undefined) {
      return false;
    }
    if(searches.saved_searches[name] == undefined) {
      return false;
    }

    delete searches.saved_searches[name];
    searches.save_saved_to_cookie();
    searches.load_saved_from_cookie();

    return false;
  },

  save_params_to_searches: function () {
    var params = searches.create_data_object();
    params['rm'] = 'ajax_links';
    params['display'] = 'html';
  
    searches.data = params;
    searches.save_current();
  },
  
  /* Fetches results from the server */
  fetch_results: function () {
    if($("input[name='w']").val() == default_text['w']) {
      $("#results_area").hide();
      return false;
    }

    /* Clear any current results related timeouts */
    if(timeouts['results']) {
      clearTimeout(timeouts['text1']);
      clearTimeout(timeouts['text2']);
      clearTimeout(timeouts['text3']);
      clearTimeout(timeouts['results']);
    }

    /* Tell the user we are loading their results */
    $("#results").html('<div style="margin: 50px;">'
      + '<img style="float: left; margin-right: 20px;"'
      + 'src="' + base_url
      + '/img/loading.gif"> <br />Please wait while we fetch your results.<br/>'
      + '<div id="results-update"></div></div>');
    $("#results_area").fadeIn();
    /* Set up the updates */
    timeouts['text1'] = setTimeout(function(){
      $("#results-update").append('Finding typos.<br />');
    }, 300);
    timeouts['text2'] = setTimeout(function(){
      $("#results-update").append('Finding misspellings.<br />');
    }, 600);
    timeouts['text3'] = setTimeout(function(){
      $("#results-update").append('Preparing links.<br />');
    }, 900);
  
    /* Request the results */
    searches.save_params_to_searches();
    timeouts['results'] = setTimeout(function(){
      $.get(base_url + "/typo_generator_tool.cgi", searches.data,
        function (data) {
        $("#results").html(data);
        });
    }, 1000);
  
    return false;
  },
  
  load_saved_search: function (search_name) {
    var saved_search = search_name;
    var data = searches.saved_searches[saved_search];
    searches.load_form_from_data(data);
    searches.fetch_results();
    return false;
  },

  load_cookie: function (name) {
    var params = searches.load_from_cookie(name);
    if(params != undefined) {
      searches.load_form_from_data(params);
    } else if (name == 'current') {
      fetch_location();
    }
  },
  
  load_form_from_data: function (data) {
    if(data == undefined) {
      return;
    }

    /* Simple General Options */
    if ('country' in data) {
      $("select[name='country']").val(data['country']);
      update_craigslist_url_list(data['craigslist_url']);
    }
  
    if (!$("#craigslist_url option:selected")[0].value) {
      fetch_location();
    }
  
    if ('sites' in data) {
      $("input[name='sites']").val(data['sites']);
      for(var site in data['sites']) {
        toggle_site_display(data['sites'][site]);
      }
    }
  
    if ('w' in data) {
      $("input[name='w']").val(data['w']).each(blur_default_text_display);
    }
  
    if ('search_type' in data) {
      if (data['search_type'] == 'simple') {
        $("input[value='simple']").attr('checked','checked');
      } else if (data['search_type'] == 'advanced') {
        $("input[value='advanced']").attr('checked','checked');
      } else {
        $("input[value='simple']").attr('checked','checked');
      }
    }
    toggle_advanced();

    /* Advanced General Options */
    if('include_typos_misspellings' in data) {
      $("input[name='include_typos_misspellings']").attr('checked', data['include_typos_misspellings']);
    }
    
    if('exclude_word' in data) {
      $("input[name='exclude_word']").attr('checked', data['exclude_word']);
    }
  
    if('include_numbers' in data) {
      $("input[name='include_numbers']").attr('checked', data['include_numbers']);
    }
  
    if('search_description' in data) {
      $("input[name='search_description']").attr('checked', data['search_description']);
    }
  
    if('include_real_words' in data) {
      $("input[name='include_real_words']").attr('checked', data['include_real_words']);
    }
  
    if ('exclude_terms' in data) {
      $("input[name='exclude_terms']").val(data['exclude_terms']).each(blur_default_text_display);
    } else {
      $("input[name='exclude_terms']").each(blur_default_text_display);
    }
  
    if ('minimum_price' in data) {
      $("input[name='minimum_price']").val(data['minimum_price']).each(blur_default_text_display);
    } else {
      $("input[name='minimum_price']").each(blur_default_text_display);
    }
  
    if ('maximum_price' in data) {
      $("input[name='maximum_price']").val(data['maximum_price']).each(blur_default_text_display);
    } else {
      $("input[name='maximum_price']").each(blur_default_text_display);
    }
    /* Advanced eBay Options */
    if('buy_now_only' in data) {
      $("input[name='buy_now_only']").attr('checked', data['buy_now_only']);
    }
  
    if('paypal_only' in data) {
      $("input[name='paypal_only']").attr('checked', data['paypal_only']);
    }
    /* Advanced Craigslist Options */
    if('has_picture' in data) {
      $("input[name='has_picture']").attr('checked', data['has_picture']);
    }
  }
}

function toggle_advanced () {
 $("input[name='search_type']:checked").val() == 'advanced'
  ? $(".advanced").show() : $(".advanced").hide();
}

function focus_default_text_display() {
  var name = $(this).attr('name');

  if ($(this).val() == default_text[name]) {
    $(this).val('');
    $(this).removeClass('default-text');
  } else {
    $(this).removeClass('default-text');
  }
}

function blur_default_text_display() {
  var name = $(this).attr('name');

  if ($(this).val() == '') {
    $(this).addClass('default-text');
    $(this).val(default_text[name]);
  } else if ($(this).val() == default_text[name]) {
    $(this).addClass('default-text');
  } else {
    $(this).removeClass('default-text');
  }
}

function toggle_site (site) {
  var site_id = "#" + site + ":checked";
  var options_id = "#" + site + "_options";
  $(site_id).val() == site ? $(options_id).css({display:""}) : $(options_id).css({display:"none"});
  var class_id = "." + site;
  $(class_id).toggle();
}

function toggle_advanced () {
 $("input[name='search_type']:checked").val() == 'advanced' ? $(".advanced").show() : $(".advanced").hide();
}

/* Requests the location data structure from the server */
function fetch_location() {
  searches.data['rm'] = 'get_default_locations';
  var results = new Object;
  $.get(base_url + "/typo_generator_tool.cgi", searches.data,
    function (data) {
      results = JSON.parse(data);
      $("select[name='country']").val(results['country']);
      update_craigslist_url_list(results['craigslist_url']);
    });
}

function update_craigslist_url_list(region) {
  var country = $("#country option:selected")[0].value;
  var craigslist_subdomains = craigslist_subdomains_by_country[country];
  if (craigslist_subdomains) {
    $("#craigslist_url").empty();
    for( var x in craigslist_subdomains) {
      var newOption = new Option(craigslist_subdomains[x].name, craigslist_subdomains[x].url);
      newOption.innerText = craigslist_subdomains[x].name;
      if(region && craigslist_subdomains[x].url == region) {
        newOption.selected = 'selected';
      }
      $("#craigslist_url").append(newOption);
    }
  } else {
    $("#craigslist_url").empty();
    $("#craigslist_url").append(new Option('Please select a country', ''));
  }
}

function toggle_site_display (site) {
  var id = "#" + site + ":checked";
  var class_name = "." + site;
  $(id).val() == site ? $(class_name).show() : $(class_name).hide();
}
