var selects = document.querySelector('.selects');
var weatherDiv = document.querySelector('.weather');

function get(url){
  return new Promise(function(resolve,reject){
    var xhr = new XMLHttpRequest();
    xhr.open('GET',url,true);
    xhr.onload = function(){
      if(xhr.status == 200){
        resolve(JSON.parse(xhr.responseText));
      }
      else{
        reject(xhr.statusText);
      }
    }
    xhr.onerror = function(){
      reject('not found');
    }
    xhr.send();
  });
}

function show(obj){
  var weather = obj.query.results.channel.item.description;
  var resWeather = weather.replace(/href|CDATA|[\!]|[\[]|[\]]/g,"");
  var resWeather2 = resWeather.slice(1,resWeather.length - 1);
  var resWeather3 = resWeather2.replace(/Full Forecast at Yahoo Weather/g,"");
  var resWeather4 = resWeather3.slice(0,resWeather3.length - 28);
  weatherDiv.innerHTML = resWeather4;
}

function* myGenerator(){
    try{
      var object = yield get('https://raw.githubusercontent.com/David-Haim/CountriesToCitiesJSON/master/countriesToCities.json');
      var keys = Object.keys(object);
      var select = document.createElement("select");
      for (var i = 0; i < keys.length; i++) {
          var option = document.createElement("option");
          option.innerHTML = keys[i];
          option.value = keys[i];
          select.appendChild(option);
      }
      select.onchange = function(){
        run(onchange1);
      }
      function* onchange1(){
          try{
            var mainSelect = document.getElementById("main")
            var select = document.createElement("select");
            for (var i = 0; i < object[mainSelect.value].length; i++) {
                var option = document.createElement("option")
                option.innerHTML = object[mainSelect.value][i];
                select.appendChild(option);
            }
            if(selects.children.length > 1){
                selects.replaceChild(select,mainSelect.nextElementSibling);
            }
            else
                selects.appendChild(select);
              var obj = yield get("https://query.yahooapis.com/v1/public/yql?" + 'q=' + encodeURIComponent("select * from weather.forecast where woeid in (select woeid from geo.places(1) where text=\'" + select.value + "\') and u='c'") + '&format=json');
              show(obj);
            select.onchange = function(){
              run(onchange2);
            }
            function* onchange2(){
              try{
                var obj2 = yield get("https://query.yahooapis.com/v1/public/yql?" + 'q=' + encodeURIComponent("select * from weather.forecast where woeid in (select woeid from geo.places(1) where text=\'" + select.value + "\') and u='c'") + '&format=json');
                show(obj2);
              }catch(error){
                throw error;
              }
            }
          }catch(error){
            throw error;
          }
      }
      selects.appendChild(select);
      select.id = "main";
    }catch(error){
      throw error;
    }

}

function run(g){
  var gen = g();
  function handle(result){
      if(!result.done){
        result.value.then(function(data){
          handle(gen.next(data));
        }).catch(function(error){
          throw(error);
          handle(gen.next());
        })
      }
  }
  handle(gen.next());
}
run(myGenerator);
