/*
 * Searchbox functionality
 */

 
var OPTION = createDOMFunc('option'),
    SEARCHBOX = null;


function SearchBox() {
    this.fields  = ['speciality', 'country'];
    this.current = { speciality: 'All', country: 'All' };
	this.originalData = [];
	this.resultsURL = './search_results';
	this.sets = null;
}


SearchBox.prototype = {

   'initialize' : function () {
      bindMethods(this);
           
      var self=this,
          func = bind(function(target) { setEvent(target, 'change', self.onchange); }, this);
			
      map(func, this.fields);
        
      var d = this.populate();
      d.addCallback(bind(this.saveOriginal, this));
      d.addCallback(bind(this.buildSets, this));
      d.addCallback(bind(this.renderOptions, this));
      d.addErrback(log);
    },    


   'saveOriginal' : function(res) {
      this.originalData = res;
      return res;
   },


   'makeOptionRenderer' : function (field) {
      return bind(function(v) {

		     if(v == 'null' || v == null) return;
		     if(this.current[field] == v) {
			//alert('this.current['+field+']: ' + this.current[field] + ' | v: ' + v);
			return OPTION({selected:'selected', value:v}, v);
		     }
		     return OPTION({value:v}, v);
		  }, this);
   },

   // Renderers
   'renderOptions' : function (sets) {
      for(var i=0; i<this.fields.length; i++) {
	 var field = this.fields[i],
	     current = this.current[field],			
	     values = filter(function(e) { if(e == 'null' || e == '') return false; return true; },
			     keys(sets[field]).sort()),
	     len = values.length;
			
			
	 if(len) {
	    var func = bind(this.makeOptionRenderer(field), this),
  	        newopts = map(func, values);

	    
	    if(len > 1) {
	       newopts = concat([OPTION(null, 'All')], newopts);
	    }
	    replaceChildNodes($(field), newopts);

	    var cur = this.current[field];
	    forEach($(field).options, function(o) { if(o.value == cur) o.selected = true; });
	 }

	 	
      }
      this.lastSets = sets;
      return sets;
   },



    // Functionality

    'populate' : function() {
        this.loading = loadJSONDoc(this.resultsURL);
        return this.loading;
    },


	'buildSets' : function(res) {
	    this.sets = {'country':{}, 'speciality':{}};
		
		// iterate over result set
		for(var i=0; i<res.length; i++) {
		    var e = res[i];
		    // country 
			if(isUndefinedOrNull(this.sets.country[e.country])) 
				this.sets.country[e.country] = [];
			this.sets.country[e.country].push(e);

		    // speciality
			if(isUndefinedOrNull(this.sets.speciality[e.speciality])) 
				this.sets.speciality[e.speciality] = [];
			this.sets.speciality[e.speciality].push(e);
		}
		return this.sets;
	},
		
		
		    
	    
	


    // Handlers
    
    'onchange' : function () {
        var field = getTarget().id,
		    value = getSelected(getTarget()).innerHTML,
		    otherField = null;
		
		if(field == 'speciality') otherField = 'country';
		else otherField = 'speciality';

		if(value == 'All') value = null;

		this.current[field] = value;
		

		var sets = clone(this.lastSets);
		sets[otherField] = {};
		
		for(var i=0; i<this.originalData.length; i++) {
		    var e = this.originalData[i];

			if(!this.current[field] || e[field] == this.current[field]) {
			    if(isUndefinedOrNull(sets[otherField][e[otherField]])) 
				    sets[otherField][e[otherField]] = [];				
			    
			    sets[otherField][e[otherField]].push(e);
			}
		}
		
        this.renderOptions(sets);		
       return true;
    }

}

function hookSearchBox() {
    if(isUndefinedOrNull($('searchbox'))) return;
    SEARCHBOX = new SearchBox;
    SEARCHBOX.initialize();
	log('searchbox initialized');
    return true;    
}

addLoadEvent(hookSearchBox);
