void show_all_accounts();
void show_online_only();

/* From show_online_callback */
	/*
	  if (show_online)
		show_all_accounts();
	else
		show_online_only();
	*/
/* End from show_online_callback */


void show_all_accounts()
{
	GList * grps, * contacts, * accounts;
	
	for (grps = groups; grps; grps = grps->next) 
	{
		grouplist * grp = grps->data;
		for (contacts = grp->members; contacts; contacts = contacts->next) 
		{
			struct contact * con = contacts->data;
			add_contact_line (con);

			for (accounts = con->accounts; accounts; accounts = accounts->next) 
			{
				add_account_line(accounts->data);
				buddy_update_status(accounts->data);
			}
		}
	}
}


/* makes only online accounts visible on the contact list */
void show_online_only()
{
	GList * grps, * contacts, * accounts;
	
	for (grps = groups; grps; grps = grps->next) 
	{
		grouplist * grp = grps->data;
		for (contacts = grp->members; contacts; contacts = contacts->next) 
		{
			struct contact * con = contacts->data;
			for (accounts = con->accounts; accounts; accounts = accounts->next) 
			{
				eb_account * ea = accounts->data;
				if (!ea->online)
					remove_account_line(ea);
				else
					buddy_update_status(ea);
			}
			if (!con->online)
				remove_contact_line(con);
		}
	}
}





/* Beginning of code to create notebook page "Edit Contacts" */
  GtkWidget *vbox2;
  GtkWidget *button_box;
  GdkPixmap *pm;
  GdkBitmap *bm;
  GtkWidget *pic;





	        /* Add Status page to notebook */
		gtk_notebook_append_page( GTK_NOTEBOOK(notebook), vbox, gtk_label_new("Status"));

		/* Make notebook page */
		vbox = gtk_vbox_new(FALSE, 5);
		MakeEditContactList();
        gtk_box_pack_start(GTK_BOX(vbox),scrollwindow[LIST_EDIT],TRUE,TRUE,5);

		gtk_widget_show(scrollwindow[LIST_EDIT]);

		vbox2 = gtk_hbox_new(TRUE, 5);
		button_box = gtk_hbox_new(FALSE, 5);
		pm = gdk_pixmap_create_from_xpm_d(statuswindow->window, &bm, NULL, tb_preferences_xpm);
		pic = gtk_pixmap_new(pm, bm);

		gtk_box_pack_start(GTK_BOX(button_box), pic, FALSE, FALSE, 2 );
		gtk_widget_show(pic);

		pic = gtk_label_new("Add");
		gtk_box_pack_start(GTK_BOX(button_box), pic,FALSE, FALSE,2 );
		gtk_widget_show(pic);
		
		
		label = gtk_button_new();
		gtk_container_add(GTK_CONTAINER(label), button_box);
		gtk_widget_show(button_box);
		gtk_signal_connect(GTK_OBJECT(label), "clicked",
						   GTK_SIGNAL_FUNC(add_callback), NULL);
		gtk_widget_show(label);
		gtk_box_pack_start(GTK_BOX(vbox2), label, TRUE, TRUE, 5);
		gtk_widget_set_usize(vbox2, 200,25 );

		button_box = gtk_hbox_new(FALSE, 5);
		pm = gdk_pixmap_create_from_xpm_d(statuswindow->window, &bm, NULL, tb_trash_xpm);
		pic = gtk_pixmap_new(pm, bm);

		gtk_box_pack_start(GTK_BOX(button_box), pic, FALSE, FALSE, 2 );
		gtk_widget_show(pic);

		pic = gtk_label_new("Remove");
		gtk_box_pack_start(GTK_BOX(button_box), pic,FALSE, FALSE,2 );
		gtk_widget_show(pic);
		
		label = gtk_button_new();
		gtk_container_add(GTK_CONTAINER(label), button_box);
		gtk_widget_show(button_box);

		gtk_widget_show(label);
		gtk_signal_connect(GTK_OBJECT(label), "clicked",
						   GTK_SIGNAL_FUNC(remove_callback), NULL);
		gtk_box_pack_start(GTK_BOX(vbox2), label, TRUE, TRUE, 5);
		
		gtk_widget_show(vbox2);
		gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 5);

		gtk_widget_show(vbox);


		gtk_notebook_append_page( GTK_NOTEBOOK(notebook), vbox,
								  gtk_label_new("Edit Contacts"));

		gtk_widget_show(notebook);
        gtk_box_pack_start(GTK_BOX(statusbox), notebook,TRUE, TRUE,0);
		*/

/* End of code creating notebook page for "Edit Contacts" */

static void remove_callback(GtkWidget *widget, GtkTree *tree)
{
	GList *i;
	tree = GTK_TREE(contact_list[LIST_EDIT]);
	i = GTK_TREE_SELECTION(tree);
	if(i)
	{
		GtkTreeItem * gti = i->data;
		GtkTree * tree;
		if(!i->data)
		{
			g_warning("i->data == NULL");
			return;
		}
		tree = (GtkTree *) GTK_TREE_ITEM_SUBTREE(gti);
		if(!tree)
		{
			/* No Subtree == Account */
			g_warning("Delete Account");
			remove_account( gtk_object_get_user_data(GTK_OBJECT(i->data)));
		}
		else if( GTK_TREE(tree)->level == 2 )
		{
			g_warning("Delete Contact");
			remove_contact( gtk_object_get_user_data(GTK_OBJECT(i->data)));
		}
		else
		{
			g_warning("Delete Group");
			remove_group( gtk_object_get_user_data(GTK_OBJECT(i->data)));
		}

		MakeEditContactList();
		write_contact_list();
	}
}
	
/* Generates or regenerates the "Edit Contacts" tree.  This can be
   called to refresh the list */
GtkWidget* MakeEditContactList()
{
	GList * l1;
	GList * l2;
	GList * l3;
	gint type = LIST_EDIT;
	
	if (!contact_list[type])
		scrollwindow[type]=gtk_scrolled_window_new(NULL,NULL);
	else
		gtk_widget_destroy(contact_list[type]);

	contact_list[type] = gtk_tree_new();
	gtk_tree_set_view_lines(GTK_TREE(contact_list[type]), TRUE);
	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollwindow[type]),contact_list[type]);
	gtk_tree_set_view_lines(GTK_TREE(contact_list[type]), TRUE);
	
	/*for each group */

	for( l1 = groups; l1; l1=l1->next )
	{
		GtkWidget * gnodes;
		GtkWidget * clist2;

		gnodes = gtk_tree_item_new_with_label(((grouplist*)(l1->data))->name);
		gtk_object_set_user_data(GTK_OBJECT(gnodes), l1->data);
		clist2 = gtk_tree_new();
		gtk_tree_append(GTK_TREE(contact_list[type]), gnodes);
		gtk_tree_item_set_subtree(GTK_TREE_ITEM(gnodes), clist2);
		gtk_drag_dest_set(gnodes,
						  GTK_DEST_DEFAULT_ALL,
						  contact_list_drop_types,
						  n_contact_list_drop_types-1,
						  GDK_ACTION_MOVE|GDK_ACTION_COPY);
		gtk_signal_connect(GTK_OBJECT(gnodes), "drag_drop",
							GTK_SIGNAL_FUNC(contact_drag_drop),
							l1->data);
		
		/*for each contact within that group*/

		for( l2 = ((grouplist*)l1->data)->members; l2; l2=l2->next )
		{
			GtkWidget * cnodes;
			GtkWidget * clist3;
			struct contact * con = (struct contact*)l2->data;
			
			cnodes = gtk_tree_item_new_with_label(con->nick);
			
			gtk_object_set_user_data(GTK_OBJECT(cnodes), l2->data);
						
			clist3 = gtk_tree_new();
			gtk_tree_append(GTK_TREE(clist2), cnodes);
			/*
			gtk_drag_dest_set(cnodes,
						  GTK_DEST_DEFAULT_ALL,
						  contact_list_drop_types,
						  n_contact_list_drop_types-1,
						  GDK_ACTION_MOVE|GDK_ACTION_COPY);
			*/
			gtk_tree_item_set_subtree(GTK_TREE_ITEM(cnodes), clist3);
			
			/*for each account that the contact has*/
			
			for( l3 = con->accounts; l3; l3=l3->next )
			{
				GtkWidget * anodes;
				eb_account * account = (eb_account*)l3->data;

				anodes = gtk_tree_item_new_with_label(account->handle);
				gtk_tree_append(GTK_TREE(clist3), anodes);
				/*
				gtk_drag_dest_set(anodes,
						  GTK_DEST_DEFAULT_ALL,
						  contact_list_drop_types,
						  n_contact_list_drop_types-1,
						  GDK_ACTION_MOVE|GDK_ACTION_COPY);
				*/

				gtk_object_set_user_data(GTK_OBJECT(anodes), l3->data);

				gtk_widget_show(anodes);

			}
			gtk_drag_source_set(cnodes, 
						GDK_BUTTON1_MASK|GDK_BUTTON3_MASK,
						contact_list_drop_types,
						n_contact_list_drop_types,
						GDK_ACTION_COPY|GDK_ACTION_MOVE);
			gtk_tree_item_expand(GTK_TREE_ITEM(cnodes));
			gtk_signal_connect(GTK_OBJECT(cnodes),  "button_press_event",
						  GTK_SIGNAL_FUNC(edit_contact),
						  (struct contact*)l2->data );
			gtk_widget_show(cnodes);
								
		}
		
		gtk_tree_item_expand(GTK_TREE_ITEM(gnodes));
		if ( !( do_ignore_unknown && !strcmp( ((grouplist*)l1->data)->name, "Unknown" ) ) )
		{
			gtk_widget_show(gnodes);
			
			gtk_signal_connect(GTK_OBJECT(gnodes),  "button_press_event",
						  GTK_SIGNAL_FUNC(edit_group),
						  l1->data );
		}

	}
	
	gtk_widget_show(contact_list[type]);
	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwindow[type]),GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
	gtk_widget_set_usize(scrollwindow[type], 150,200);
	return scrollwindow[type];
}


