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

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


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

function add_suggest_link( tr)
  { tr= $(tr);
    var id= tr.attr( 'id');
    tr.append( '<td><a><img class="add_link" src="/i/add_link.png" height="12" width="12" title="suggest link" /></a></td>');
    var a=  tr.find( 'td:last > a');
    a.attr( 'href', '#add_link');
    a.click( function() 
               { var tr   = $(this).parent().parent();
                 var id   = tr.attr( 'id');
                 var text = tr.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 tr      = $( '#' + link_id);
    add_link( tr, url);
    Boxy.get( $('#add_link')).hide();
    return false;
  }

function add_link( tr, url)
  { 
    var id = base_id( tr.attr('id'));

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

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

function fave_tr( tr)
  { var id= tr.attr( 'id');
    var fave_tr= $( '#' + fave_id( id));
    return fave_tr;
  }


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

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



function expand_collapse (button)
  { $(button).parent().children( "img.be").toggle(); // toggles the 2 buttons

    var this_tr = $(button).parent().parent();
    var next_tr = $(this_tr).next( "tr");

    if( ! next_tr || ! $(next_tr).hasClass( "sc") ) { next_tr= load_from_server( button, this_tr) }

    next_tr.toggle();
                                     
  }

// 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 load_from_server (button, this_tr)
  { var id  = $(button).attr( 'id').substr( 1);
    var html=  html_from_server('c_' + id);
    $(this_tr).after( html); 
    var next_tr= $(this_tr).next( "tr");
    next_tr.hide();
    next_tr.find("img.be").click( function() { expand_collapse( this) } );
    add_stars(next_tr);
    add_suggest_links( next_tr);
    init_links( next_tr);
    var next_tr= $(this_tr).next( "tr");
    return next_tr;
  }

function add_stars (root)
  { root.find( "tr.co").each( function(i) { add_star( this); });  }

function add_star (tr)
  { tr= $(tr);
    var id= base_id( tr.attr( 'id'));
    var src= fave[id] ? '/i/favorited.gif' : '/i/not_favorited.gif';
      
    tr.append( '<td><img class="fave" src=" ' + src + '" height="12" width="12" title="add to favorites" /></td>');
    tr.find( 'img.fave').click( function() { var id= this.parentNode.parentNode.id; toggle_fave(id); }); 
  }

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

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

function toggle_fave (id)
  { id= base_id( id);
    if( fave[id]) { remove_fave( id); }
    else          { add_fave(    id); }
    save_to_cookie( 'faves', fave)
  }

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

    fave[id]= true;
    fave_len++;

    var img= tr.find( 'img.fave');
    img.attr( 'src', '/i/favorited.gif');
    img.attr( 'title', 'remove from favorites');
    img.click( function() { "toggle_fave('" + id + "')" } );

    add_tr_to_faves( tr);
    keep_fave_table_sorted();
  }

function keep_fave_table_sorted()
  { var sorted= $("#fave_table tr").tsort({attr:"id"}); }
     

function add_tr_to_faves (tr)
  {
    var fave_div= $( '#fave_div');
    fave_div.show();
    var fave_table= fave_div.find( '#fave_table');
    var fave_tr= $(tr).clone( true);
    var id=  $(tr).attr( 'id');
    fave_tr.attr( 'id', fave_id( id));
    fave_tr.find( 'img.fave').attr( 'id', fave_id( id));
    fave_tr.find( 'td:first').empty();

    fave_table.append( fave_tr);
    if( link[id]) { add_link( fave_tr, link[id]); }

  }

function remove_fave(id)
  {  
    var fave_tr= $( '#' + fave_if( id));
    fave_tr.click( function() { });
    fave_tr.remove();

    var tr= $( '#'+id);

    var img= $(tr).find( 'img.fave');
    img.attr( 'src', '/i/not_favorited.gif');
    img.attr( 'title', 'add to favorites');

    delete fave[id];
    fave_len--;

    if( fave_len == 0) 
      { var fave_div= $( '#fave_div');
        fave_div.hide();
      }

  }

function init_faves()
  { 
    for( var id in fave)
      { var tr= html_from_server( 'tr_' + id);
        add_star( tr);
        add_tr_to_faves( tr);
        if( link[id]) { add_link( tr, link[id]); }
        fave_len++;
      }
    keep_fave_table_sorted();
  }


function load_from_cookie( name)
  { var cookie=  $.cookie( name);
    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 trs= $(root).find( 'tr');
    for( var i=0; i<trs.length; i++)
      { var tr= $(trs[i]);
        var url= link[tr.attr( 'id')];
        if( url && ! tr.hasClass( 'linked'))
          { add_link( tr, url); }
      }
  }


