var program_cr = new Object(); 
var program_pl = null; 
var program_rt = null;
var program_nr;
var program_lk = false;
var program_ct;
var program_ctw;
var program_hx;
function program_loc()
{
    var h='';
    var p=new Array();
    for(var t in program_cr)
        if('string' == typeof program_cr[t])
        {
            p[p.length]=program_cr[t];
        }
    p=p.sort();
    var t=new Element('div');
    for(var i=0;i<p.length;i++)
    {
        h+=(h?',':'')+p[i];
        var a = new Element('a', { 'class': 'tag_remove tag_remove_'+p[i], href: "#", name: p[i]});
        a.observe('click', function(v) {
                var e=v.element();
                program_toggle($("tag_toggle_"+e.name),e.name);
                program_loc();
                Event.stop(v);
            }).update(p[i]);

        t.insert(' ').insert(a);
    }

    if(window.location.hash!=h)
    {
        if(!h && program_ctw.visible())
        {
            Effect.BlindUp(program_ctw, {duration:.1});
        }

        program_ct.update(t);
        
        if(h && !program_ctw.visible())
        {
            Effect.BlindDown(program_ctw, {duration:.1});
        }

        window.location.hash='#search:'+h;
        return true;
    }
    return false;
}
function program_search()
{
    if(window.location.hash.match(/^#search:(.+)$/))
    {
        var a = RegExp.$1.split(',').sort();
        for(var i=0;i<a.length;i++)
        {
            program_toggle($('tag_toggle_'+a[i]),a[i]);
        }
        return program_loc();
    }
}
function program_toggle(o,tag)
{
    if(program_lk) return;
    program_lk=true;

    var enabled = ('string' == typeof program_cr[tag]);
    var cl=program_rt.select('.program_container.tagged_'+tag);
    var tl=program_rt.select('.program_container .tagged.tagged_'+tag);
    if(enabled)
    {
        if(o)
            Element.removeClassName(o,'enabled');
        program_cr[tag]=false;
        tl.each(function(e){Element.removeClassName(e,'enabled');});
    }
    else
    {
        if(o)
        {
            Element.addClassName(o,'enabled');
            Element.show($(o.parentNode.parentNode));
            Element.addClassName($(o.parentNode.parentNode.parentNode),'enabled');
        }
        program_cr[tag]=tag;
        tl.each(function(e){Element.addClassName(e,'enabled');});
    }
    var sel='.program_container';
    for(var t in program_cr)
    {
        if('string' == typeof program_cr[t])
            sel+='.tagged_'+program_cr[t];
    }
    var vl = program_rt.select(sel);
    var nr = true; // no results!
    program_pl.each(function(e){
        if(vl.member(e))
        {
            nr=false;
            // should become visible if not
            if(!Element.visible(e)) if(program_hx) Element.show(e); else Effect.Appear(e);
        }
        else
        {
            // go invis if not invisible
            if(Element.visible(e)) if(program_hx) Element.hide(e); else Effect.Fade(e);
        }
    });

    if(nr)
        program_nr.show();
    else
        program_nr.hide();

    program_lk=false;
}

function program_load()
{
 program_hx=!Prototype.BrowserFeatures.XPath;
 program_rt=$('program_list');
 program_nr=$('program_noresults');
 program_ct=$('current_tags');
 program_ctw=$('current_tags_wrapper');
 program_pl=program_rt.select('.program_container');
 program_search();
}
