YAHOO.namespace('outreach');

var Dom         = YAHOO.util.Dom;
var Outreach    = YAHOO.outreach;
var Logger      = YAHOO.console.log;

var DISCIPLINE_AS_AUDIENCE = -1;

Outreach.renderAudienceWhat = function(aud_id, what_id) {
    var data = Outreach.DATA;
    var j;
    var results = [];
    var display = { "audiences": [], "whats": [] };
    for(var i=0; i<data.length; i++) {
        var rec = data[i];
        var ok = 0;
        var d = { "audiences": [], "whats": [] };
        for(j=0; j<rec.audiences.length; j++) {
            if (rec.audiences[j].id == aud_id) {
                ok++;
                d.audiences.push(rec.audiences[j].name);
            }
        }
        for(j=0; j<rec.public_whats.length; j++) {
            if (rec.public_whats[j].id == what_id) {
                ok++;
                d.whats.push(rec.public_whats[j].name);
            }
        }
        
        if (ok == 2) {
            results.push(rec);
            for (var k=0; k<d.audiences.length; k++) {
                if (!Outreach.arrayHasValue(display.audiences, d.audiences[k])) {
                    display.audiences.push(d.audiences[k]);
                }
            }
            for (var k=0; k<d.whats.length; k++) {
                if (!Outreach.arrayHasValue(display.whats, d.whats[k])) {
                    display.whats.push(d.whats[k]);
                }
            }
        }
    }

    Outreach.render(results, display);
    
    return false;
}

Outreach.renderDiscipline = function( id ) {
    var data = Outreach.DATA;
    var results = [];
    var display = { 'discipline_names' : [] };
    //Logger("discipline: " + id );
    
    for(var i=0; i<data.length; i++) {
        var rec = data[i];
        for(var d=0; d<rec.disciplines.length; d++) {
            if (rec.disciplines[d].id == id) {
                //Logger("match discipline " + rec.disciplines[d].name);
                if (!Outreach.arrayHasValue(display.discipline_names, rec.disciplines[d].name)) {
                    display.discipline_names.push(rec.disciplines[d].name);
                }
                results.push(rec);
            }
        }
    }
    
    //Logger(results);
    
    //return false;
    
    Outreach.render(results, display);
    
    return false;

}

Outreach.arrayHasValue = function(arr, val) {
    for(var i=0; i<arr.length; i++) {
        if (arr[i] == val) {
            return true;
        }
    }
    return false;
}

Outreach.render = function(results, display) {

    var div = Dom.get('results');
    div.innerHTML = ''; // always reset
    //Logger(results);
    
    var audiences = [];
    var whats     = [];
    
    if(!results || !results.length) {
        results = Outreach.search();
    }
    else if(results == 'all') {
        results = Outreach.DATA;
    }
    for (var i=0; i<results.length; i++) {
        div.innerHTML += Outreach.render_result(results[i]);
    
        //Logger(results[i]);
    
        var j;
        for (j=0; j<results[i].audiences.length; j++) {
            if (results[i].audiences[j].public == '0') {
                continue;
            }
            audiences.push(results[i].audiences[j].name);
        }
        for (j=0; j<results[i].public_whats.length; j++) {
            whats.push(results[i].public_whats[j].name);
        }
        
    }
        
    // update display summary
    if (!display) {
        display = { "audiences": [], "whats": [] };
        for(var i=0; i<audiences.length; i++) {
            if (!Outreach.arrayHasValue(display.audiences, audiences[i])) {
                display.audiences.push(audiences[i]);
            }
        }
        for(var i=0; i<whats.length; i++) {
            if (!Outreach.arrayHasValue(display.whats, whats[i])) {
                display.whats.push(whats[i]);
            }
        }
    }
        
    if (display.discipline_names && display.discipline_names.length) {
        Dom.get('results_display').innerHTML = display.discipline_names.join(', ');
    }
    else {
        Dom.get('results_display').innerHTML = display.audiences.join(', ') + ' : ' + display.whats.join(', ');
    }
}

Outreach.render_result = function(res) {

    //Logger(res);
    var contact_name = res.contact_name;
    var contact_mail = res.contact_email;
    var good_mail = true;
    if (contact_mail.match(' |%20') || !contact_mail.length) {
        good_mail = false;
    }
    var good_url = true;
    if (res.url.match(' ') || !res.url.match('^http') || !res.url.length) {
        good_url = false;
    }
    var buf = '<div class="dbresults">' + 
              '<h2><a href="' + res.url + '">' + res.name + '</a></h2>' + 
              '<div class="meta">Contact:';
    if (good_mail) {
        buf += '<a href="mailto:' + contact_mail + '">' + contact_name + '</a>, ';
    }
    else if (contact_name.length) {
        buf += contact_name + ', ';
    }
    
    // show public gradelevels
    var grade_levels = [];
    for (var i=0; i<res.grade_levels.length; i++) {
        var gl = res.grade_levels[i];
        if (gl.public != 1)
            continue;
        
        grade_levels.push(gl.name);
    }
    
    var levels = '';
    if (grade_levels.length) {
        levels = '<br/>Grade level(s): ' + grade_levels.join(', ');
    }
    var departments = [];
    for (var i=0; i<res.departments.length; i++) {
        departments.push(res.departments[i].name);
    }
    
    buf +=    ' <b>' + departments.join(', ') + '</b>' +
              levels + '</div>' +
              '<div class="description">' + res.description + '</div>' +
              (good_url  ? '' : '<div class="error">BAD URL</div>') + 
              '</div>';

    return buf;

}

Outreach.search = function() {
    var results = [];
    var data = Outreach.DATA;
    var j;
    
    //Logger("search() through " + data.length + " data recs");
    //Logger("discipline length = " + Outreach.DISCIPLINE.length );
    
    for(var i=0; i<data.length; i++) {
        var rec = data[i];
        // TODO filter out based on PARAMS

        //Logger(rec);
        
        var ok = 0;
        for(j=0; j<Outreach.AUDIENCE.length; j++) {
            for(var a=0; a<rec.audiences.length; a++) {
                if (rec.audiences[a].id == Outreach.AUDIENCE[j]) {
                    ok++;
                }
            }
        }
        for(j=0; j<Outreach.WHAT.length; j++) {
            for(var w=0; w<rec.public_whats.length; w++) {
                if (rec.public_whats[w].id == Outreach.WHAT[j]) {
                    ok++;
                }
            }
        }
        for(j=0; j<Outreach.DISCIPLINE.length; j++) {
        
            //Logger("discipline : " + j + ' ' + Outreach.DISCIPLINE[j]);
            //Logger(rec);
        
            for(var d=0; d<rec.disciplines.length; d++) {
                if (rec.disciplines[d].id == Outreach.DISCIPLINE[j]) {
                    //Logger("match discipline " + rec.disciplines[d].name);
                    results.push(rec);
                }
            }
        }
        
        //Logger("ok = " + ok);

        if (ok >= 2) {
            results.push(rec);
        }
    }
    
    // debug meta
    var meta = Outreach.META;
    for(i=0; i<meta.length; i++) {
        //Logger(meta[i]);
    }
    
    
    return results;
}

Outreach.makeLinks = function(e) {
    var selObj = e.target ? e.target : e.srcElement;    
    var selectedOpt = selObj.options[selObj.selectedIndex];
    var audience = selectedOpt.value;
    var Dom = YAHOO.util.Dom;
    var div = Dom.get('outreachTarget');
    //Logger(selObj);
    if (selObj.selectedIndex == 0) {
        div.innerHTML = '';
        return;
    }
    
    var url = Outreach.URL + '/search';
    
    div.innerHTML = '<ul id="outreachList"></ul>';
    
    if (audience == DISCIPLINE_AS_AUDIENCE) {
        
        var list = Dom.get('outreachList');
        
        for (j=0; j<Outreach.META.discipline.length; j++) {
            var disc = Outreach.META.discipline[j];
            //if (!dept.act_count)
            //    continue;
            
            var item = document.createElement('li');
            item.innerHTML = 
                   '<a href="' + url + '?' + 
                   'discipline=' + disc.id + '">' + disc.name + '</a>';
            list.appendChild(item);
        }
        
        div.appendChild(list);
        
        return;
    }

    for (var i=0; i<Outreach.META.what.length; i++) {
        var what = Outreach.META.what[i];
        
        // how many? skip 0
        // TODO if for whatever reason the requests respond
        // out of order, the list will not be sorted alphabetically.
        var xhr = YAHOO.util.Connect.asyncRequest(
            'GET', Outreach.URL + '/search/count/' + audience + '/' + what.id, 
            {
                success: function(res) {
                  var w = res.argument[0];
                  var count = res.responseText;
                  if (count != '0') {
                    var list = Dom.get('outreachList');
                    var item = document.createElement('li');
                    item.innerHTML = 
                        '<a href="' + url + '?count=' + count + 
                            '&what=' + w.id + 
                            '&audience=' + audience + '">' + w.name + '</a>';
                    list.appendChild(item);
                  }
                },
                failure: function(res) {
                  Logger(res);
                },
                argument: [what]
            });
    }
    
}

Outreach.makeSelectBox = function() {
  Outreach.getMetaData(
    function() {
        var Dom = YAHOO.util.Dom;
        var div = Dom.get('outreachLinks');
        var buf = '<select id="outreachSelect" name="selector">';
        buf += '<option>Select one...</option>'; 
        for(var i=0; i<Outreach.META.audience.length; i++) {
            var aud = Outreach.META.audience[i];
            buf += '<option value="' + aud.id + '">' + aud.name + '</option>';
        }
        buf += '</select><div id="outreachTarget"></div>';
        div.innerHTML = buf;
        YAHOO.util.Event.addListener(Dom.get('outreachSelect'), 'change', Outreach.makeLinks);
    }
  );
}

Outreach.getMetaData = function(func) {
    var url = Outreach.URL + '/search/metadata';
    var callback = {
        success: function(res) {
            //Logger(res);
            try {
                Outreach.META = YAHOO.lang.JSON.parse(res.responseText);
                func();
            }
            catch (e) {
                alert("bad data from " + url + ': ' + e);
            }
        },
        failure: function(res) {
            Logger(res);
        },
        timeout: 5000
    };
    Logger("GET " + url);
    var xhr = YAHOO.util.Connect.asyncRequest('GET', url, callback);
}
