
var fave={};     // hash id => true
var fave_len=0;  // needed because length of maps is not managed in js
var link={};     // hash id => url
var expanded={}; // hash id => true

$(document).ready 
  ( function() { fave=load_from_cookie( 'faves');
                 //link=load_from_cookie( 'links');
                 expanded=load_from_cookie( 'expanded');
                 $("img.be").click( function() { expand_collapse( this) }); 
                 init_expanded($("ul.main"));
                 add_stars( $("ul.main"));
                 init_faves();
                 //init_links( $("ul.main"));
                 //add_suggest_links( $("ul.main"));
               } 
  );


function add_suggest_links( root)
  { root.find( "li.co").each( function(i) { add_suggest_link( this); });  }

function add_suggest_link( li)
  { li= $(li);
    var id= li.attr( 'id');
    li.find( 'div').append( '<span class="sl"><a><img class="add_link" src="/i/add_link.png" height="12" width="12" title="suggest link" /></a></span>');
    var a=  li.find( 'div > span:last > a');
    a.attr( 'href', '#add_link');
    a.click( function() 
               { var li   = $(this).closest( 'li');
                 var id   = li.attr( 'id');
                 var text = li.find( '.na').text();
                 $( '#link_id').attr( 'value', id);
                 $( '#url_title').text( 'Link "' + text + '" To');
                 return false;
               }
           );
    $(a).boxy( { title: 'Suggest a Link',   } );
  }

function get_link()
  { 
    var link_id = $('#link_id').attr( 'value');
    var url     = $('.alink'   ).val();
    var li      = $( '#' + link_id);
    add_link( li, url);
    Boxy.get( $('#add_link')).hide();
    return false;
  }

function add_link( li, url)
  { var id = base_id( li.attr('id'));
    var symbol = li.find( 'span.sy:first').text();

    // remove old link
    if( li.hasClass( 'linked'))
      { remove_existing_link( li, td);
        remove_existing_link( faved_li( li));
      }
    // add new one
    if( url)
      { 
        add_link_to_li( li, url);
        add_link_to_li( faved_li( li), url);
        link[id]=url;
        save_to_cookie( 'links', link);
        //post_to_server( id, symbol, url);
      }
    else
      { post_to_server( id, symbol, url); }

  }

function add_link_to_li( li, url)
  { if( li)
      { var a=  document.createElement('a');
        $(a).attr( 'href', url);
        var span = li.find( '.na');
        span.wrapInner( a);
	li.addClass( 'linked');
      }
  }

function faved_li( li)
  { var id= li.attr( 'id');
    var fave_li= $( '#' + fave_id( id));
    return fave_li;
  }


function remove_existing_link( li)
  { if( li)
      { var span= li.find( '.na'); 
        var a= span.find( 'a');
        span.text( a.text());
	li.removeClass( 'linked');
      }
  }

function post_to_server( id, url)
  { $.post( '/cgi-bin/add_link', { url: url, id: id }, function() { return false; }); }

function init_expanded( root)
  {  
    for( var id in expanded)
      { var li= root.children( '#' + id);
        if( li.length) 
          { var button= li.find( 'img.ex'); 
            expand_collapse( button);
          }
      }
  }

function expand_collapse (button)
  {  button=$(button);
     var this_li = button.closest( 'li');
     var ul      = this_li.children( 'ul:first');
     var id      = this_li.attr( 'id');
    
   
    if( ul.size() ) 
      { button.parent().children( "img.be").toggle(); // toggles the 2 buttons
        ul.toggle();
        if( expanded[id]) { delete expanded[id]; } else { expanded[id]=true; }
        save_to_cookie( 'expanded', expanded)
      }
    else
      {  var id  = button.attr( 'id').substr( 1);
         var fragment = 'c_' + id;
         var url = '/groups/index/' + fragment + '.html';
         $.ajax( { url     : url,
                   type    : 'GET',
                   dataType: 'html',
                   timeout : 3000,
                   // error   : function()    { alert('Error loading HTML fragment'); },
                   success : function( html, textStatus) { add_ul_from_server( this_li, id, html); },
                 }
               );
      }
  }

function add_ul_from_server( this_li, id, html)
  { this_li.append( html);
    var ul= this_li.children( 'ul:first');
    ul.find("img.be").click( function() { expand_collapse( this) } );
    add_stars( ul);
    //add_suggest_links( ul);
    //init_links( ul);
    this_li.children( 'div').find( 'img.be').toggle();
    var lid= this_li.attr( 'id');
    expanded[lid]= true;
    save_to_cookie( 'expanded', expanded)
    init_expanded( ul)  
}
   
// goes and gets the WG list fragment from the server, from the button id

function html_from_server(fragment)
  { var url = '/groups/index/' + fragment + '.html';
    //var url = 'http://grouper.mirod-eee.xmltwig.com/index/' + fragment + '.html';
    var html;
    $.ajax( { url     : url,
             type    : 'GET',
             dataType: 'html',
             timeout : 3000,
             //error   : function()    { alert('Error loading HTML fragment'); },
             success : function(loaded, textStatus) { html= loaded; },
             async   : false // ie, synchronously
           }
         );
    return $(html);
  }


function add_stars (root)
  { root.find( 'li.co').each( function(i) { add_star( $(this)); });  }

function add_star (li)
  { var id= base_id( li.attr( 'id'));
    li.children( 'div').append( '<span class="fa"><img class="fave" height="12" width="12" /></span>');

    if(  fave[id] ) { set_img_for_fave( li); }
    else            { set_img_for_non_fave( li); }
  }

function base_id( id)
  { return id.replace( /^f_/, ''); }

function fave_id( id)
  { return 'f_' + id ; }

function add_fave (id)
  {  
    var li= $( '#'+id); 

    fave[li.attr('id')]= true;
    fave_len++;

    set_img_for_fave( li);
    add_li_to_faves( li);
    save_to_cookie( 'faves', fave)
  }



function sort_list( elt)
  { elt.children( 'li').tsort({attr:'id'}); 
  }
     

function add_li_to_faves (li)
  {
    var fave_div= $( '#fave_div');
    fave_div.show();

    var fave_list= $( '#fave_list');
    var fave_li= li.clone( true);
    fave_li.children( 'ul').remove(); 
    set_fave_id( fave_li);
    
    fave_li.find( 'span:first').empty();      // remove the expand button 

    fave_list.append( fave_li);
    set_img_for_fave( fave_li);
    sort_list( fave_list);

    var id= li.attr( 'id');
    if( link[id]) { add_link( fave_li, link[id]); }

  }

function set_fave_id (elt)
  { elt.attr( 'id', fave_id( elt.attr('id'))); }

function remove_fave(id)
  { id= base_id( id);

    //alert( 'removing ' + fave_id( id));
    $( '#' + fave_id( id)).remove(); // remove the fave line 

    var li= $( '#'+id);
    set_img_for_non_fave( li);

    delete fave[id];
    fave_len--;
    if( fave_len == 0) { $( '#fave_div').hide(); }

    save_to_cookie( 'faves', fave)

  }

function init_faves()
  { var fave_list= $('#fave_list');
    for( var id in fave)
      { 
        var html= html_from_server( 'tr_' + id);
        fave_list.append( html);
        fave_li= fave_list.find( 'li:last');
        fave_li.attr( 'id', fave_id( fave_li.attr( 'id')));
        add_star( fave_li);
        fave_li.find( 'span.ecb').empty();
        if( link[id]) { add_link( li, link[id]); }

        var li= $( '#' + id);
        //if( li) { set_img_for_fave( li, id); }

        fave_len++;
      }
    //add_suggest_links(fave_list);
    if( fave_len > 0) { $('#fave_div').show(); }
  }

function set_img_for_fave( li)
  { var id= base_id( li.attr( 'id'));
    var img= li.find( 'img.fave:first');
    img.attr( 'src', '/i/favorited.gif');
    img.attr( 'title', 'remove from favorites');
    img.unbind('click').click( function() { remove_fave( base_id( id)) } );
    img.attr( 'data-do', 'remove');
    img.attr( 'data-id', id);
  }

function set_img_for_non_fave( li)
  { var id= base_id( li.attr( 'id'));
    var img= li.find( 'img.fave:first');
    img.attr( 'src', '/i/not_favorited.gif');
    img.attr( 'title', 'add to favorites at the top of the page');
    img.unbind('click').click( function() { add_fave( base_id( id)) } );
    img.attr( 'data-do', 'add');
    img.attr( 'data-id', id);
  }



function load_from_cookie( name)
  { var cookie=  $.cookie( name);
    //alert( 'loaded ' + name + ': ' + cookie);
    return cookie ? JSON.parse( cookie) : { };
  }

function save_to_cookie( name, data)
  { delete data.ok;
    $.cookie( name, JSON.stringify( data), { expires: 365 }); 
  }



function init_links(root)
  { var lis= $(root).find( 'li');
    for( var i=0; i<lis.length; i++)
      { var li= $(lis[i]);
        var url= link[li.attr( 'id')];
        if( url && ! li.hasClass( 'linked'))
          { add_link( li, url); }
      }
  }



