function getProvinceList(country) {

  provinceList = ['Any'];

  switch (country) {

    case 'Namibia':
      provinceList = [
          'Any','Academia / Pioneers Park / Hochland','Auasblick / Olympia','Bethanie','Caprivi Region','Gobabis','Henties Bay',
          'Karibib','Keetmanshoop','lein Windhoek / Eros / Avis / Ludwigsdorf','Kleine Kuppe / Cimbabasia / Prosperitas / Rocky Crest',
          'Langstrand / Dolfynstrand','Luderitz','Luxury hill / Suiderhof / Windhoek West','Maltahohe','Hardap Region','Monte Christo',
          'Okahandja / Okahandja District','Omaruru','Ondangwa','Oshakati','Otjiwarongo','Otjiwarongo District','Rundu','Swakopmund',
          'Tsumeb','Walvis Bay','Windhoek Central','Windhoek District'];
      break;

    case 'South Africa':
      provinceList = ['Any','Northern Cape','Western Cape','Eastern Cape','Free State','North West','Gauteng','KZN','Mpumalanga','Limpopo'];
      break;
  }

  return provinceList;
}

function getCityList(country, province) {

  cityList = ['Any'];

  switch (country) {

    case 'South Africa':
      switch (province) {

        case 'Northern Cape':
          cityList = [
              'Any','Tswala','Kuruman','Augrabies Falls','Upington','Kakamas','Pofadder','Kimberly','Alexander Bay',
              'Okiep','Springbok','Niewoudtville','Garies','Calvinia','Hopetown','De Aar','Colesburg','Hanover'];          
          break;
        case 'Western Cape':
          cityList = [
              'Any','Cape Flats','Cape Town City Bowl and Atlantic Seaboard','Cape Town Northern Suburbs','Garden Route',
              'Great Karoo','Milnerton','Tableview and Blaauwberg','Overberg','Peninsula (Simons Town to Hout Bay)',
              'Somerset West and Boland','Southern Suburbs (Tokai to Pinelands)','West Coast'];
          break;
        case 'Eastern Cape':
          cityList = [
              'Any','East Cape Interior','East London, Eastern Karoo','EC Jeffreys Bay to Tsitsikamma','EC Wild Coast',
              'Grahamstown and Surrounds','Port Alfred and Coastal Towns','Port Elizabeth'];
          break;
        case 'Free State':
          cityList = [
              'Any','Bethlehem / Harrismith / Clarence & Region','Bloemfontein & Central Freestate',
              'Ficksburg / Clocolan / Rosendal & Region','Vaalriver / Parys & Region',
              'Vaaltriangle / Vaalpark / Sasolburg','Welkom / Goudveld & Region'];
          break;
        case 'North West':
          cityList = [
              'Any','Carltonville','Derby','Fochville','Groot Marico','Hartbeesfontein','Klerksdorp','Koster','Lichtenburg',
              'Mafikeng','Makwassie','Northam','Orkney','Potchefstroom','Rustenburg','Sannieshof','Schweizer Reyneke',
              'Stilfontein','Swartruggens','Ventersdorp','Vredefort','Vryburg','Wolmaranstad','Zeerust'];
          break;
        case 'Gauteng':
          cityList = [
              'Any','Alberton Southern suburbs','Benoni','Boksburg','Brakpan','Centurion','Edenvale','Germiston',
              'Johannesburg CBD and Bruma','Kempton Park','Midrand','Nigel & Heidelberg','Northcliff and Melville (West)',
              'Northern Pretoria','Pretoria Central and Old East','Pretoria East','Randburg and Ferndale (North West)',
              'Roodepoort (Far West) and Krugersdorp','Rosebank and Parktown (Central)','Sandton and Bryanston (North)',
              'Soweto','Springs','Sunninghill','Lonehill and Fourways','Vereeniging','Vanderbijlpark and Vaal Dam','Wynburg (East)'];
          break;
        case 'KZN':
          cityList = [
              'Any','Dolphin Coast','Durban Central North and CBD','Durban Central South','Durban North','Durban South',
              'Durban Upper Highway','Durban West / Highway','KZN Midlands','KZN North Coast','KZN South Coast','Richards Bay'];
          break;
        case 'Mpumalanga':
          cityList = [
              'Any','Barberton', 'Belfast', 'Bethal', 'Burgersfort', 'Carolina / Badplaas', 'Delmas', 'Dullstroom',
              'Ermelo / Chrissiesmeer', 'Graskop', 'Groblersdal', 'Hazyview', 'Hendrina', 'Kinross', 'Komatipoort',
              'Lydenburg', 'Machadodorp', 'Malelane / Hectorspruit', 'Marloth Park', 'Middelburg', 'Nelspruit', 'Ohrigstad',
              'PietRetief / Volksrust / Wakkerstroom', 'Rietkruil', 'Sabie', 'Secunda', 'Standerton', 'Sundra', 'Trichardt',
              'Waterval Boven / Onder', 'White River', 'Witbank'];
          break;
        case 'Limpopo':
          cityList = [
              'Any','Bela-Bela (Warmbaths) / Rooiberg, Hoedspruit','Makhado (Louis Trichardt) / Musina, Modimole (Nylstroom)',
              'Mokopane (Potgietersrus), Mookgophong (Naboomspruit)','Phalaborwa','Polokwane (Pietersburg)',
              'Thabazimbi / Lephalale (Ellisras)','Tzaneen / Duiwelskloof / Gravelotte','Vaalwater','Welgelegen'];
          break;
      }
      break;
  }

  return cityList;
}


function getTownList(country, province, city) {

  townList = ['Any'];

  switch (country) {

    case 'South Africa':
      switch (province) {

        case 'KZN':
          switch (city) {
		  
		    case 'Dolphin Coast':
              townList = ['Any','Ballito','Blythedale / Princes Grant','Chakas Rock / Salt Rock','La Mercy','Sheffield Beach','Stanger','Tongaat / Verulam','Umdloti','Westbrook','Zinkwazi Beach'];    
              break;
			  
            case 'Durban Central North and CBD':
              townList = ['Any','Beachfront','Berea','CBD','Morningside','Overport / Puntans Hill','Point Waterfront','Sherwood / Sydenham / West Riding / Asherville'];              
              break;
			  
            case 'Durban Central South':
              townList = ['Any','Glenmore / Carrington Heights','Glenwood','Manor Gardens','Mayville / Westridge','Umbilo / Congella'];
              break;
			  
            case 'Durban North':
              townList = ['Any','Durban North, Glenhills / Glenanil','La Lucia / Glenashley','Mt Edgecombe','Phoenix / Newlands West','Redhill / Greenwood Park','Rosehill / Effingham','Sunningdale / Somerset Park','Umgeni Park / Umgeni Heights','Umhlanga' ];
              break;
			  
            case 'Durban South':
              townList = ['Any','Amanzimtoti / Athlone Park','Bellair / Seaview','Bluff / Brighton Beach','Illovo Beach','Isipingo','Montclair / Merebank / Mobeni Heights','Warner Beach / Kingsburgh','Wentworth / Jacobs','Woodlands / Yellowwood Park'];              
              break;
			  
            case 'Durban Upper Highway':
              townList = ['Any','Crestview / Drummond','Forest Hills \ Waterfall','Gillitts / Winston Park','Kloof / Hillcrest / Everton / Assagay' ];              
              break;
			  
            case 'Durban West / Highway':
              townList = ['Any','Ashley / Caversham Glen','Chatsworth','Hillary','Malvern / Queensburgh / Escombe / Northdene','Marianhill Park','Pinetown / New Germany / Padfield Park / Manors','Reservoir Hills / Silverglen / Circle Park / Wyebank','Westville / Cowies Hill' ];              
              break;
			  
            case 'KZN Midlands':
              townList = ['Any','Drakensberg','Dundee / Glencoe','Estcourt','Greytown / Wartburg / Albert Falls','Hayfields / Lincoln Meade / Peacehaven','Hilton','Howick / Merrivale','Ladysmith / Newcastle','Lynnfield Park / Ashburton / Cato Ridge','Mooi River / Nottingham Road','PMB Central','PMB East / Northdale / Mountain Rise / Raisethorpe','PMB North / Clarendon / Chase Valley / Wembley','PMB South / Scottsville / Pelham','PMB West / Prestbury / Boughton / Blackridge','Richmond / Ixopo','Underberg','Vryheid' ];              
              break;
            case 'KZN North Coast':
              townList = ['Any','Empangeni','Eshowe','Esikhawini','Gingindlovu','Hluhluwe','Kwambonambi','Mandini / Isithebe','Melmoth','Mtubatuba','Mtunzini','Paulpietersburg','Pongola','Sodwana','St Lucia' ];              
              break;
			  
            case 'KZN South Coast':
              townList = ['Any','Hibberdene / Woodgrange','Ifafa Beach / Elysium / Mtwalume / Turton','Kelso / Umdoni Park / Pennington / Sezela / Bazley','Kokstad / Harding','Leisure Bay / Port Edward','Port Shepstone / Oslo Beach / Shelly Beach / St. Michaels','Scottburgh / Freeland Park / Clansthal / Park Rynie','Southbroom / Marina Beach','Trafalgar / Palm Beach / Munster / Glenmore','Umkomaas / Widenham','Umtentweni / Anerley / Southport / Sea Park ','Umzinto','Umzumbe / Pumula / Melville / Sunwich Port','Uvongo / Manaba / Margate / Ramsgate' ];              
              break;
			  
            case 'Richards Bay':
              townList = ['Any','Arboretum','Birdswood','Brackenham','Meerensee','Veldenvlei','Wildenweide'];              
              break;
          }
          break;
      }
      break;
  }

  return townList;
}



function setProvince(){

  cntrySel = document.getElementById('country');
  prvncSel = document.getElementById('province');

  prvncList = getProvinceList(cntrySel.value);

  changeSelect(prvncSel, prvncList);
  setCities();

}

function setCities(){

  cntrySel = document.getElementById('country');
  prvncSel = document.getElementById('province');
  citySel  = document.getElementById('city');

  cityList = getCityList(cntrySel.value, prvncSel.value);

  changeSelect(citySel, cityList);

}

function setTowns(){

  cntrySel = document.getElementById('country');
  prvncSel = document.getElementById('province');
  citySel  = document.getElementById('city');
  townSel  = document.getElementById('town');  
  
  townList = getTownList(cntrySel.value, prvncSel.value, citySel.value);

  changeSelect(townSel, townList);

}


//**************************************************************************//
// FUNCTION changeSelect(fieldObj, valuesAry, [optTextAry], [selectedVal])
//
//**************************************************************************//
function changeSelect(fieldObj, valuesAry, optTextAry, selectedValue) {

  //Clear the select list
  fieldObj.options.length = 0;

  //Set the option text to the values if not passed
  optTextAry = (optTextAry)?optTextAry:valuesAry;

  //Itterate through the list and create the options
  for (i in valuesAry) {
    selectFlag = (selectedValue && selectedValue==valuesAry[i])?true:false;
    fieldObj.options[fieldObj.length] = new Option(optTextAry[i], valuesAry[i], false, selectFlag);
  }

}
