YAHOO.namespace("com.lgan");
YAHOO.namespace("com.askhys");
(function(){
    YAHOO.com.askhys.GeogSet = function(){
        this.init();
    };
    
    var
      Event = YAHOO.util.Event,
      Dom = YAHOO.util.Dom,
      DataSource = YAHOO.util.DataSource,
      GeogSet = YAHOO.com.askhys.GeogSet,
      Logger = YAHOO.com.lgan.Logger || YAHOO
    ;
    
    GeogSet.prototype = {
      constructor: GeogSet,
      
      /**
        YUI Data Source to load geographies.
        @property ydsManyGeogSupport
      */
      ydsManyGeogSupport: null,
      
      initManyGeogSelection: function(){
          this.ydsManyGeogSupport = new DataSource(
            "/var/fetchmd.asp?",
            {
              maxCacheEntries:8,  //We won't need this many
              responseType: DataSource.TYPE_JSON,
              responseSchema: {
                resultsList: "data",
                metaFields: {
                  replyCode: "replyCode",
                  replyText: "replyText"
                },
                fields: ["id", "label"]  //Recall that these are the only fields passed forward from the raw response.
              }
            }
          );
          
          /**
            Populates all of the select boxes that need geographic identifiers.
            @private
          */
          var _fSuccessGenerator = function(p_chrKey, p_strVarname){
              return function(p_sRequest, p_oResponse){
                  var blnContinue = false;
                  switch(p_oResponse.meta.replyCode){
                      case 300:  //fallthrough
                          YAHOO.log(p_oResponse.meta.replyText, "warning", "GeogSet.initManyGeogSelection.__fSuccessGenerator");
                      case 200:
                          blnContinue = true;
                      break;
                      case 500:  //fallthrough
                      default:
                          YAHOO.log("Application error loading data for '" + p_sRequest + "'.", "error", "GeogSet.initManyGeogSelection.__fSuccessGenerator");
                      break;
                  }
                  if(blnContinue){
                      var aryElIds = [
                        "upGeog_" + p_chrKey
                      ];
                      
                      var aryEls = Dom.get(aryElIds);
                      
                      for(var i=0; i<aryEls.length; i++){
                          var elSel = aryEls[i];
                          
                          if(!(elSel && elSel.options)){
                              YAHOO.log("Unable to find Select element '" + aryElIds[i] + "'.", "Error", "_fSuccessGenerator");
                          } else {
                              elSel.options.length = 0;
                              
                              //YAHOO.log(YAHOO.lang.dump(p_oResponse), "debug", "_fSuccessGenerator");
                              
                              for(var j=0; j<p_oResponse.results.length; j++){
                                  elSel.options[elSel.options.length] = new Option(p_oResponse.results[j].label, p_oResponse.results[j].id, false, false);
                              }
                          }
                      }
                  }
              }
          };
          
          //YAHOO.log("About to fire requests.", "trace", "GeogSet.initManyGeogSelection");
          var geogmeta = YAHOO.com.askhys.GeographyMeta;
          for(var chrKey in geogmeta){
              if(YAHOO.lang.hasOwnProperty(geogmeta, chrKey)){
                  //YAHOO.log("Firing:  " + geogmeta[chrKey] + ".", "trace", "GeogSet.initManyGeogSelection");
                  this.ydsManyGeogSupport.sendRequest(
                    "var=" + geogmeta[chrKey],
                    {
                      scope: this,
                      success: _fSuccessGenerator(chrKey, geogmeta[chrKey])
                    }
                  )
              }
          }
      },
        
      /**
        Enables and disables the geographic inputs paired with radio buttons.
      */
      ToggleGeographies: function(p_elTarget){
          var aryGeogInputs = document.getElementsByName("upGeog");
          for(var j=0; j<aryGeogInputs.length; j++){
              aryGeogInputs[j].disabled = !(aryGeogInputs[j].id.split("_")[1] == p_elTarget.value);
          }
      },
        
      init: function(){
          YAHOO.log("Called.", "trace", "GeogSet.init");
          
          this.initManyGeogSelection();
          
          //Logic to pair geography dropdowns with radio buttons
          var aryGeogLevelInputs = document.getElementsByName("upGeogLevel");
          for(var i=0; i<aryGeogLevelInputs.length; i++){
              YAHOO.log(aryGeogLevelInputs[i]);
              //Add listeners
              Event.addListener(aryGeogLevelInputs[i], "click", function(p_e){
                  var elTarget = Event.getTarget(p_e);
                  this.ToggleGeographies(elTarget);
              }, this, true);
              
              //Initialize selected geography
              if(aryGeogLevelInputs[i].checked) this.ToggleGeographies(aryGeogLevelInputs[i]);
          }
          YAHOO.log("Finished.", "trace", "GeogSet.init");
      }
    };
})();

