/* Copyright (C) 2000,2001,2002 Manuel Amador (Rudd-O)
   This file is part of Directory administrator.

   Directory administrator is free software; you can redistribute it
   and/or modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; either version 2.1 of
   the License, or (at your option) any later version.

   Directory administrator is distributed in the hope that it will be
   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License along
   with Directory administrator; if not, send e-mail to amador@alomega.com
*/


#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <gnome.h>
#include <libgnomeui/gnome-dialog.h>
#include <string.h>

#include <errno.h>
#include <lber.h>
#include <ldap.h>

#include "callbacks.h"
#include "interface.h"
#include "support.h"
#include "appglobals.h"
#include "users.h"
#include "groups.h"
#include "appfunctions.h"
#include "prefsdialog.h"
#include "usergrouplists.h"
#include "modifydialogs.h"
#include "newdruids.h"
#include "connect_dialog.h"
#include "prefs.h"
#include "icon_entry.h"
#include "dir_entry.h"
#include "charset.h"

void
on_exit1_activate (GtkMenuItem * menuitem, gpointer user_data)
{
  gtk_main_quit ();
}


void
on_cut1_activate (GtkMenuItem * menuitem, gpointer user_data)
{

}


void
on_copy1_activate (GtkMenuItem * menuitem, gpointer user_data)
{

}


void
on_paste1_activate (GtkMenuItem * menuitem, gpointer user_data)
{

}


void
on_clear1_activate (GtkMenuItem * menuitem, gpointer user_data)
{

}


void
on_preferences1_activate (GtkMenuItem * menuitem, gpointer user_data)
{
  gtk_widget_show (create_preferences ());

}


void
on_about1_activate (GtkMenuItem * menuitem, gpointer user_data)
{
  GnomeAbout*w;
  GtkWidget*b,*b2;
  GtkVBox*v;
  gchar *pixmap1_filename;
  GtkWidget *pixmap1;


  w = (GnomeAbout*) create_about ();
  v = GTK_VBOX(w->dialog.vbox);

  b = gnome_href_new ("http://diradmin.open-it.org/", "Go to Web site: http://diradmin.open-it.org/");
  gtk_widget_ref (b);
  gtk_object_set_data_full (GTK_OBJECT (w), "b", b,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (b);
  gtk_container_add(GTK_CONTAINER(v),b);

  pixmap1 = gtk_type_new (gnome_pixmap_get_type ());
  pixmap1_filename = gnome_pixmap_file ("directory_administrator/byruddo.png");
  if (pixmap1_filename)
    gnome_pixmap_load_file (GNOME_PIXMAP (pixmap1), pixmap1_filename);
  else
    g_warning ("Couldn't find pixmap file: %s", "byruddo.png");
  g_free (pixmap1_filename);
  gtk_widget_ref (pixmap1);
  gtk_object_set_data_full (GTK_OBJECT (w), "pixmap1", pixmap1,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (pixmap1);
  gtk_box_pack_start (GTK_BOX (v), pixmap1, TRUE, TRUE, 0);

  b2 = gnome_href_new ("http://www.usm.edu.ec/~amadorm/", "Open the Rudd-O's zone (Spanish)");
  gtk_widget_ref (b2);
  gtk_object_set_data_full (GTK_OBJECT (w), "b2", b2,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (b2);
  gtk_container_add(GTK_CONTAINER(v),b2);

  gtk_widget_show(GTK_WIDGET(w));
}


void
on_mainwindow_destroy (GtkObject * object, gpointer user_data)
{
  gtk_main_quit ();
}


void
on_button4_clicked (GtkButton * button, gpointer user_data)
{
  if (on_button4_clicked_handler (button, (GtkWidget *) user_data) == TRUE)
    gtk_widget_destroy (lookup_widget ((GtkWidget *) button, "login"));

}


void
on_login_destroy (GtkObject * object, gpointer user_data)
{
  gtk_object_destroy (object);
}






void
on_login_cancel_button_clicked (GtkButton * button, gpointer user_data)
{
  gtk_widget_destroy (lookup_widget ((GtkWidget *) button, "login"));
}


void
on_button_add_profile_clicked (GtkButton * button, gpointer user_data)
{
  GtkWidget *about = create_druid_new_profile ();

  gtk_object_set_user_data ((GtkObject *) about,
			    lookup_widget ((GtkWidget *) button,
					   "list_profiles"));

/*  gtk_signal_connect (GTK_OBJECT (lookup_widget (about, "finish")),
		      "finish", GTK_SIGNAL_FUNC (on_button4_clicked),
		      lookup_widget ((GtkWidget *) button, "list_profiles"));*/
  gtk_widget_show (about);

}


void
on_button_connect_toggled (GtkToggleButton * togglebutton, gpointer user_data)
{


  if (!app_is_connected() && GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
    app_interactive_connect();

    }
  else
    {
    app_interactive_disconnect();

    }

}



void
on_button_test_connection_clicked (GtkButton * button, gpointer user_data)
{
  GtkWidget *mesg;
  connection_profile *test;
  int ldap_errors;
  char buf[2048];

  gchar *nombrecitocojudo;

  nombrecitocojudo =
    gtk_entry_get_text ((GtkEntry *)
			lookup_widget ((GtkWidget *) button,
				       "entry_login_server"));
  if (strlen (nombrecitocojudo) == 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("You need to supply a server"));
      return;
    }

  test =
    connection_profile_new (gtk_entry_get_text
			    ((GtkEntry *)
			     lookup_widget ((GtkWidget *) button,
					    "entry_profile_name")),
			    gtk_entry_get_text ((GtkEntry *)
						lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_dn")),
			    gtk_entry_get_text ((GtkEntry *)
						lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_pw")),
			    gtk_entry_get_text ((GtkEntry *)
						lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_server")),
			    gtk_toggle_button_get_active ((GtkToggleButton *)
				    		lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_tls")),
			    gtk_entry_get_text ((GtkEntry *)
						lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_treeroot")));
  ldap_errors = connection_profile_connect (test);

  if (ldap_errors)
    {
      g_snprintf (buf, 2048, "Connection failed: %s",
		  ldap_err2string (ldap_errors));
      mesg = create_messagebox_with_message ((char *) &buf);
    }
  ////THIS IS ONLY DEBUG BEHAVIOR!! REMOVE BEFORE SHIPPING!!!!!
  else
    {
      mesg = create_messagebox_with_message ("The connection was successful");
    }

  gtk_widget_show (mesg);
  connection_profile_destroy (test);

}


void
on_list_profiles_map (GtkWidget * widget, gpointer user_data)
{

  list_profiles_fill (widget);

}


void
on_button_remove_profile_clicked (GtkButton * button, gpointer user_data)
{
  gint selected_crap = (gint) user_data;
  gchar *profilename = NULL;
  connection_profile *conprof = NULL;

  GtkWidget *profile_list =
    (GtkWidget *) lookup_widget ((GtkWidget *) button, "list_profiles");

  gtk_clist_get_text ((GtkCList *) profile_list, selected_crap, 0,
		      &profilename);

  //if profilename is null, just return, because it means nothing is selected;
  if (profilename == NULL)
    return;

  // this used to be the handler:  g_assert(profilename);

  conprof =
    connection_profile_list_getbyname (connection_profile_list, profilename);
  if (conprof == NULL)
    {
      g_print ("***ERROR! could not get data about selected profile");
      return;
    }

  connection_profile_list =
    connection_profile_list_remove (connection_profile_list, conprof);

  gtk_clist_remove ((GtkCList *)
		    lookup_widget ((GtkWidget *) button, "list_profiles"),
		    selected_crap);

}

void
on_button_modify_profile_clicked (GtkButton * button, gpointer user_data)
{

  GtkWidget *about = NULL;
  gint selected_crap = (gint) user_data;
  gchar *profilename = NULL;
  GtkWidget *profile_list =
    (GtkWidget *) lookup_widget ((GtkWidget *) button, "list_profiles");

  gtk_clist_get_text ((GtkCList *) profile_list, selected_crap, 0,
		      &profilename);

  //if profilename is null, just return, because it means nothing is selected;
  g_assert (profilename);

  about = create_login ();

  fill_login (about, profilename);
  gtk_signal_connect (GTK_OBJECT (lookup_widget (about, "button4")),
		      "clicked", GTK_SIGNAL_FUNC (on_login_modify_finish),
		      profile_list);

  gtk_widget_show (about);


}


void
on_list_profiles_select_row (GtkCList * clist,
			     gint row,
			     gint column,
			     GdkEvent * event, gpointer user_data)
{

  GtkWidget *button_remove_profile =
    lookup_widget ((GtkWidget *) clist, "button_remove_profile");
  GtkWidget *button_modify_profile =
    lookup_widget ((GtkWidget *) clist, "button_modify_profile");

  printf ("\nSelected row %d\n", row);

  gtk_signal_disconnect (GTK_OBJECT (button_remove_profile),
			 preferences_profile_list_signal_reference);
  gtk_signal_disconnect (GTK_OBJECT (button_modify_profile),
			 preferences_profile_list_signal_reference2);

  preferences_profile_list_signal_reference =
    gtk_signal_connect (GTK_OBJECT (button_remove_profile), "clicked",
			GTK_SIGNAL_FUNC (on_button_remove_profile_clicked),
			(gpointer) row);
  preferences_profile_list_signal_reference2 =
    gtk_signal_connect (GTK_OBJECT (button_modify_profile), "clicked",
			GTK_SIGNAL_FUNC (on_button_modify_profile_clicked),
			(gpointer) row);

}


void
on_client_setup1_activate (GtkMenuItem * menuitem, gpointer user_data)
{
  GtkWidget *about = create_druid_client_setup ();
  gtk_widget_show (about);

}


void
on_enableperserverlogon_toggled (GtkToggleButton * togglebutton,
				 gpointer user_data)
{
  if (GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
      gtk_widget_show (lookup_widget
		       (GTK_WIDGET (togglebutton), "label_serverid"));
      gtk_widget_show (lookup_widget (GTK_WIDGET (togglebutton), "serverid"));
      /* If control reaches here, the toggle button is down */

    }
  else
    {
      gtk_widget_hide (lookup_widget
		       (GTK_WIDGET (togglebutton), "label_serverid"));
      gtk_widget_hide (lookup_widget (GTK_WIDGET (togglebutton), "serverid"));
      /* If control reaches here, the toggle button is up */
    }

}



void
on_button_add_shell_clicked (GtkButton * button, gpointer user_data)
{

}


void
on_button_up_shell_clicked (GtkButton * button, gpointer user_data)
{

}


void
on_button_down_shell_clicked (GtkButton * button, gpointer user_data)
{

}


void
on_button_remove_shell_clicked (GtkButton * button, gpointer user_data)
{

}


void
on_loginshells_map (GtkWidget * widget, gpointer user_data)
{

  fill_loginshells_list (widget);

}


void
on_loginshells_select_row (GtkCList * clist,
			   gint row,
			   gint column, GdkEvent * event, gpointer user_data)
{

  GtkWidget *button_up_shell =
    lookup_widget ((GtkWidget *) clist, "button_up_shell");
  GtkWidget *button_down_shell =
    lookup_widget ((GtkWidget *) clist, "button_down_shell");
  GtkWidget *button_remove_shell =
    lookup_widget ((GtkWidget *) clist, "button_remove_shell");

  printf ("\nSelected row %d\n", row);

  gtk_signal_disconnect (GTK_OBJECT (button_up_shell),
			 preferences_loginshells_signal_reference);
  gtk_signal_disconnect (GTK_OBJECT (button_down_shell),
			 preferences_loginshells_signal_reference2);
  gtk_signal_disconnect (GTK_OBJECT (button_remove_shell),
			 preferences_loginshells_signal_reference3);

  preferences_loginshells_signal_reference =
    gtk_signal_connect (GTK_OBJECT (button_up_shell), "clicked",
			GTK_SIGNAL_FUNC (on_button_up_shell_clicked),
			(gpointer) row);
  preferences_loginshells_signal_reference2 =
    gtk_signal_connect (GTK_OBJECT (button_down_shell), "clicked",
			GTK_SIGNAL_FUNC (on_button_down_shell_clicked),
			(gpointer) row);
  preferences_loginshells_signal_reference3 =
    gtk_signal_connect (GTK_OBJECT (button_remove_shell), "clicked",
			GTK_SIGNAL_FUNC (on_button_remove_shell_clicked),
			(gpointer) row);


}


void
on_minuid_map (GtkWidget * widget, gpointer user_data)
{
  char buf[256];
  g_snprintf (buf, 256, "%d", preferences.logindefaults.VUID_MIN);
  gtk_entry_set_text (GTK_ENTRY (widget), buf);
}


void
on_mingid_map (GtkWidget * widget, gpointer user_data)
{
  char buf[256];
  g_snprintf (buf, 256, "%d", preferences.logindefaults.VGID_MIN);
  gtk_entry_set_text (GTK_ENTRY (widget), buf);

}


void
on_profileselected_map (GtkWidget * widget, gpointer user_data)
{
  profileselected_fill (widget);
}



void
on_selectprofile_okay_clicked (GtkButton * button, gpointer user_data)
{

  if (!profileselected_commit (GTK_WIDGET (button)))
    {
      gtk_widget_destroy (lookup_widget
			  (GTK_WIDGET (button), "connect_selectprofile"));
    }

}


void
  on_connect_selectprofile_cancel_clicked
  (GtkButton * button, gpointer user_data)
{
  gtk_toggle_button_set_active ((GtkToggleButton *)
				lookup_widget (app, "button_connect"), FALSE);
  gtk_widget_destroy (lookup_widget
		      (GTK_WIDGET (button), "connect_selectprofile"));

}


void
on_cancel_clicked (GtkButton * button, gpointer user_data)
{

}


void
on_modifygroup_cancel_clicked (GtkButton * button, gpointer user_data)
{
  gtk_widget_destroy (lookup_widget ((GtkWidget *) button, "modifygroup"));

}


void
on_modifyuser_cancel_clicked (GtkButton * button, gpointer user_data)
{
  gtk_widget_destroy (lookup_widget ((GtkWidget *) button, "modifyuser"));

}


void
on_button_modifyselection_clicked (GtkButton * button, gpointer user_data)
{

  GtkWidget *mainwindow;
  GnomeIconList *itemlist = NULL;
  gint pos;
  dir_entry *entry;
//  GList* selections;
  //GList * iter;
  itemlist =
    (GnomeIconList *) lookup_widget (GTK_WIDGET (button), "itemlist");

  if (itemlist->selection == NULL) return;

  pos = GPOINTER_TO_INT (itemlist->selection->data);
  entry = gnome_icon_list_get_icon_data (itemlist, pos);

  if (entry->type == DENTRY_USER)
    {
      mainwindow = create_modifyuser ();
      gtk_widget_show (mainwindow);
      fill_modifyuser (mainwindow, dir_entry_get_dn(entry));
    }
  if (entry->type == DENTRY_GROUP)
    {
      mainwindow = create_modifygroup ();
      gtk_widget_show (mainwindow);
      fill_modifygroup (mainwindow, dir_entry_get_dn(entry));
    }

}


void
on_logontoallservers_toggled (GtkToggleButton * togglebutton,
			      gpointer user_data)
{
  if (GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
      gtk_widget_hide (lookup_widget
		       (GTK_WIDGET (togglebutton), "frame_loginservers"));
      /* If control reaches here, the toggle button is down */

    }
  else
    {
      gtk_widget_show (lookup_widget
		       (GTK_WIDGET (togglebutton), "frame_loginservers"));
      /* If control reaches here, the toggle button is up */
      gtk_widget_grab_focus (lookup_widget
		       (GTK_WIDGET (togglebutton), "selectedserver"));
    }

}


void
on_button_new_clicked (GtkButton * button, gpointer user_data)
{

  GtkWidget *mainwindow = NULL;

  if (connection_profile_is_connected (current_connection_profile))
    {

		if (!cached_dir_entries_has_ous())
			gtk_widget_show(create_messagebox_with_message("Your directory appears empty, or it does not have organizational units.\nPlease initialize your directory with the MigrationTools from PADL.com."));
		else if (!cached_dir_entries_has_groups())
			gtk_widget_show(create_messagebox_with_message("You cannot create a user until you have created\na group. Please create a group first."));
		else {
	  		mainwindow = create_druid_new_user ();
			gtk_widget_show (mainwindow);
		}


    }

}


void
on_druid_new_user_druid_cancel (GnomeDruid * gnomedruid, gpointer user_data)
{
  gtk_widget_destroy (lookup_widget ((GtkWidget *) gnomedruid,
				     "druid_new_user"));
}


void
on_button_passwd_clicked (GtkButton * button, gpointer user_data)
{
  gtk_widget_show (lookup_widget (GTK_WIDGET (button), "tablepassword"));
  gtk_widget_destroy (GTK_WIDGET (button));

}


void
on_adduser_togroup_clicked (GtkButton * button, gpointer user_data)
{
  GtkCList *memberlist = NULL;
  GtkWidget *about = create_selectuser ();
  memberlist = (GtkCList *) lookup_widget (GTK_WIDGET (button), "members");
  gtk_object_set_user_data (GTK_OBJECT (about), memberlist);
  gtk_widget_show (about);

}


void
on_userselected_map (GtkWidget * widget, gpointer user_data)
{
  fill_users_dropdown (widget);

}


void
on_selectuser_okay_clicked (GtkButton * button, gpointer user_data)
{
	GtkCList *memberlist = NULL;
	GtkCList *parentmemberlist = NULL;
	GtkWidget *mywindow = NULL;
	char *row[3];
	char *broughtrow;
//	GList*selectedrows;
	//GList*loop;
	gint numrows;
	gint n;
	GList*loopix;
	gint confirmadd = 1;
	gchar* asciichar;
	gchar * uid;
	gchar * thisdn;
	dir_entry * dentry;
	gchar * message;
	row[0] = NULL;
	row[1] = NULL;
	row[2] = NULL;

	g_print("Adding selected members to group member C-list...\n");
	mywindow = lookup_widget (GTK_WIDGET (button), "selectuser");
	parentmemberlist = (GtkCList *) gtk_object_get_user_data (GTK_OBJECT (mywindow));
	memberlist =(GtkCList*)lookup_widget (GTK_WIDGET (button), "members");

	for(loopix=memberlist->selection;loopix!=NULL;loopix=loopix->next) {
		confirmadd = 1;
		numrows = (gint)loopix->data;
		thisdn =gtk_clist_get_row_data(memberlist,numrows);
		dentry = cached_dir_entries_getbydn(thisdn);
		uid = NULL;
		if (dentry) uid = dentry->uid;
		if (uid) {
			asciichar = convert_to_ascii(uid);
			if (g_strcasecmp(uid,asciichar) != 0) {
				message = g_strconcat("The user " , dir_entry_get_cn(dentry), " cannot be added because its user ID has non-ASCII\n",
				 "characters (e.g. accented characters).  Please change its user ID and try again.", NULL);
				gtk_widget_show(create_messagebox_with_message(message));
				g_free(message);
				confirmadd = 0;
			}
			g_free(asciichar);
		}
		if (confirmadd) {
			gtk_clist_get_text(memberlist,numrows,0,&broughtrow);
			g_print("  Text in row: %s\n",broughtrow);
			row[0] = g_strdup("Secondary");
			row[1] = broughtrow;
			n=gtk_clist_append (parentmemberlist, row);
			g_print("  DN in row: %s\n",thisdn);
			gtk_clist_set_row_data(parentmemberlist,n,thisdn);
		}
	}

	gtk_clist_columns_autosize(parentmemberlist);
	gtk_widget_destroy(mywindow);

}





void
on_selectuser_cancel_clicked (GtkButton * button, gpointer user_data)
{
  gtk_widget_destroy (lookup_widget (GTK_WIDGET (button), "selectuser"));

}


void
on_deluser_fromgroup_clicked (GtkButton * button, gpointer user_data)
{
  GtkCList *memberlist = NULL;
//  GList*loopix;
  gint mimi;
  gboolean shown = 0;
  gchar*celltext; gchar*message;
  GList*mylist=NULL;

  memberlist = (GtkCList *) lookup_widget (GTK_WIDGET (button), "members");
  if (memberlist->selection)
    {
mylist = memberlist->selection;
		while (mylist) {
			gtk_clist_get_text(memberlist,(int)mylist->data,0,&celltext);
			if (g_strcasecmp(celltext,"Primary") == 0 && shown == 0) {
				message = g_strconcat ("Primary members cannot be deleted directly from this list.\nYou need to directly change the primary member in the user property page", NULL);
				shown = 1;
				gtk_widget_show (create_messagebox_with_message (message));
				g_free(message);
				mylist = mylist->next;
			} else {
				mimi = GPOINTER_TO_INT(mylist->data);
				mylist = mylist->next;
				g_print("Removing member number %d from the list\n",mimi);
				gtk_clist_remove (memberlist,mimi);

//				mylist=g_list_append(mylist, GPOINTER_TO_INT (loopix->data));
			}
		}

		//actually REMOVE the elements from the list
		//for(mylist=g_list_last(mylist);mylist;mylist=mylist->prev) {
		///		g_print("Removing member number %d from the list\n",mylist->data);
		//		gtk_clist_remove (memberlist, GPOINTER_TO_INT (mylist->data));
		//}
		//g_list_free(mylist);
		gtk_widget_grab_focus(GTK_WIDGET(memberlist));
    }

}


void
on_addserver_clicked (GtkButton * button, gpointer user_data)
{

  GtkCList *memberlist = NULL;
  GtkWidget *mywindow = NULL;
  GtkEntry* selectedserver;
  char *row[1];
  row[0] = NULL;


  memberlist =
    (GtkCList *) lookup_widget (GTK_WIDGET (button), "allowedservers");

  selectedserver = GTK_ENTRY
			(lookup_widget
			 (GTK_WIDGET (button), "selectedserver"));

  row[0] =
    gtk_entry_get_text (selectedserver);
  if (strlen (row[0]) == 0)
    {
      mywindow =
	create_messagebox_with_message ("Please supply a server name");
      gtk_widget_show (mywindow);
    }
  else
    {
      gtk_clist_append (memberlist, row);
      gtk_entry_set_text (selectedserver, "");
      gtk_widget_grab_focus(GTK_WIDGET(selectedserver));
    }





}


void
on_delserver_clicked (GtkButton * button, gpointer user_data)
{
  GtkCList *memberlist = NULL;
  memberlist =
    (GtkCList *) lookup_widget (GTK_WIDGET (button), "allowedservers");
  if (memberlist->selection)
    {
      gtk_clist_remove (memberlist,
			GPOINTER_TO_INT (memberlist->selection->data));
    }
  gtk_widget_grab_focus(GTK_WIDGET(memberlist));

}


void
on_addserver_okay_clicked (GtkButton * button, gpointer user_data)
{
  GtkCList *memberlist = NULL;
  GtkWidget *mywindow = NULL;
  char *row[1];
  row[0] = NULL;

  mywindow = lookup_widget (GTK_WIDGET (button), "addserver");
  memberlist = (GtkCList *) gtk_object_get_user_data (GTK_OBJECT (mywindow));

  row[0] =
    gtk_entry_get_text (GTK_ENTRY
			(lookup_widget
			 (GTK_WIDGET (button), "selectedserver")));
  if (strlen (row[0]) == 0)
    {
      mywindow =
	create_messagebox_with_message ("You need to supply a server name");
      gtk_widget_show (mywindow);
    }
  else
    {
      gtk_clist_append (memberlist, row);
      gtk_widget_destroy (mywindow);
    }
}


void
on_addserver_cancel_clicked (GtkButton * button, gpointer user_data)
{
  gtk_widget_destroy (lookup_widget (GTK_WIDGET (button), "addserver"));

}


void
on_druid_new_profile_druid_cancel (GnomeDruid * gnomedruid,
				   gpointer user_data)
{
  gtk_widget_destroy (lookup_widget ((GtkWidget *) gnomedruid,
				     "druid_new_profile"));

}


void
on_druid_client_setup_druid_cancel (GnomeDruid * gnomedruid,
				    gpointer user_data)
{
  gtk_widget_destroy (lookup_widget ((GtkWidget *) gnomedruid,
				     "druid_client_setup"));

}



void
on_modifyuser_okay_clicked (GtkButton * button, gpointer user_data)
{
  GtkWidget *window = NULL;

  window = lookup_widget (GTK_WIDGET (button), "modifyuser");
  if (modifyuser_check (window) == OK)
    if (modifyuser_commit (window) == OK)
      gtk_widget_destroy (window);

}





void
on_modifygroup_okay_clicked (GtkButton * button, gpointer user_data)
{
  GtkWidget *window = NULL;

  window = lookup_widget (GTK_WIDGET (button), "modifygroup");
  if (modifygroup_check (window) == OK)
    if (modifygroup_commit (window) == OK)
      gtk_widget_destroy (window);

}



void
on_givenname_changed (GtkEditable * editable, gpointer user_data)
{
  //aqui y en la sig. funcion hay fuga de memoria en el strdelimit
  GtkEntry *cn, *sn, *givenname, *uid;
  gchar *text;
  gchar newdel = '_';

  cn = GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "cn"));
  sn = GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "sn"));
  givenname = GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "givenname"));
  uid = GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "uid"));

  gtk_editable_delete_text (GTK_EDITABLE (cn), 0, -1);
  gtk_entry_set_text (cn,
		      gtk_editable_get_chars (GTK_EDITABLE (givenname), 0,
					      -1));
  gtk_entry_append_text (cn, " ");
  gtk_entry_append_text (cn,
			 gtk_editable_get_chars (GTK_EDITABLE (sn), 0, -1));

  gtk_editable_delete_text (GTK_EDITABLE (uid), 0, -1);

  text = g_strdup (gtk_editable_get_chars (GTK_EDITABLE (givenname), 0, 1));
  g_strdown (text);
  gtk_entry_set_text (uid, text);
  g_free (text);
  text = g_strdup (gtk_editable_get_chars (GTK_EDITABLE (sn), 0, -1));
  g_strdown (text);
  text = g_strdelimit (text, G_STR_DELIMITERS, newdel);
  gtk_entry_append_text (uid, text);
  g_free (text);
}


void
on_sn_changed (GtkEditable * editable, gpointer user_data)
{
  GtkEntry *cn, *sn, *givenname, *uid;
  gchar *text;
  gchar newdel = '_';

  cn = GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "cn"));
  sn = GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "sn"));
  givenname = GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "givenname"));
  uid = GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "uid"));

  gtk_editable_delete_text (GTK_EDITABLE (cn), 0, -1);
  gtk_entry_set_text (cn,
		      gtk_editable_get_chars (GTK_EDITABLE (givenname), 0,
					      -1));
  gtk_entry_append_text (cn, " ");
  gtk_entry_append_text (cn,
			 gtk_editable_get_chars (GTK_EDITABLE (sn), 0, -1));

  gtk_editable_delete_text (GTK_EDITABLE (uid), 0, -1);

  text = g_strdup (gtk_editable_get_chars (GTK_EDITABLE (givenname), 0, 1));
  g_strdown (text);
  gtk_entry_set_text (uid, text);
  g_free (text);
  text = g_strdup (gtk_editable_get_chars (GTK_EDITABLE (sn), 0, -1));
  g_strdown (text);
  text = g_strdelimit (text, G_STR_DELIMITERS, newdel);
  gtk_entry_append_text (uid, text);
  g_free (text);
}


void
on_uid_changed (GtkEditable * editable, gpointer user_data)
{
  GtkEntry *homedirectory, *uid;

  homedirectory =
    GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "homedirectory"));
  uid = GTK_ENTRY (lookup_widget (GTK_WIDGET (editable), "uid"));

  gtk_editable_delete_text (GTK_EDITABLE (homedirectory), 0, -1);
  gtk_entry_set_text (homedirectory, "/home/");
  gtk_entry_append_text (homedirectory,
			 gtk_editable_get_chars (GTK_EDITABLE (uid), 0, -1));

}


gboolean
on_druidpageessential_next (GnomeDruidPage * gnomedruidpage,
			    gpointer arg1, gpointer user_data)
{
dir_entry*found;
  GtkWidget *window =
    lookup_widget (GTK_WIDGET (gnomedruidpage), "druid_new_user");
  if (strlen
      (gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "givenname"))))
      == 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("Please enter the first name"));
      return (TRUE);
    }
  if (strlen (gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "sn"))))
      == 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("Please enter the last name"));
      return (TRUE);
    }
  if (strlen (gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "cn"))))
      == 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("Please enter a common name for the user"));
      return (TRUE);
    }
  if (strlen (gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "uid"))))
      == 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("Please enter a user ID"));
      return (TRUE);
    }

  if (strlen
      (gtk_entry_get_text
       (GTK_ENTRY (lookup_widget (window, "userpassword")))) == 0
      &&
      strlen (gtk_entry_get_text
	      (GTK_ENTRY (lookup_widget (window, "userpasswordconfirm")))) ==
      0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("You need to supply a password before continuing"));
			   gtk_widget_grab_focus(lookup_widget(window,"userpassword"));
      return (TRUE);
    }
  if (gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "userpassword")))
      &&
      gtk_entry_get_text (GTK_ENTRY
			  (lookup_widget (window, "userpasswordconfirm")))
      &&
      strcmp (gtk_entry_get_text
	      (GTK_ENTRY (lookup_widget (window, "userpassword"))),
	      gtk_entry_get_text (GTK_ENTRY
				  (lookup_widget
				   (window, "userpasswordconfirm")))) != 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("The passwords you entered do not match.  Please check them."));
			   gtk_widget_grab_focus(lookup_widget(window,"userpassword"));
      return (TRUE);
    }

if (preferences.avoidconflicts && preferences.avoidconflictscope == ENTIREDIR) {
found = cached_dir_entries_getbyuid( gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "uid")) ) );
if (found)
	{
      gtk_widget_show (create_messagebox_with_message
		       ("The user ID you typed already exists in the directory.  Please choose another."));
      return (TRUE);
    }
}
      //gtk_widget_grab_focus (lookup_widget
		//       (GTK_WIDGET (gnomedruidpage), "logontoallservers"));


  return (FALSE);


}


gboolean
on_druidpageaccesscontrol_next (GnomeDruidPage * gnomedruidpage,
				gpointer arg1, gpointer user_data)
{
      gtk_widget_grab_focus (lookup_widget
		       (GTK_WIDGET (gnomedruidpage), "o"));

	return FALSE;
}


gboolean
on_druidpageunixaccount_next (GnomeDruidPage * gnomedruidpage,
			      gpointer arg1, gpointer user_data)
{
  GtkWidget *window =
    lookup_widget (GTK_WIDGET (gnomedruidpage), "druid_new_user");
  gdouble test;
  gchar *gidnumber = NULL;

  if (GTK_TOGGLE_BUTTON
      (lookup_widget (GTK_WIDGET (gnomedruidpage), "automaticuid"))->active ==
      FALSE)
    {
      gidnumber =
	gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "uidnumber")));
      test = g_strtod (gidnumber, NULL);
      if (strlen (gidnumber) == 0)
	{
	  gtk_widget_show (create_messagebox_with_message
			   ("Type a number in the UNIX UID number entry"));
	  return (TRUE);
	}
      if (test == 0 && g_strcasecmp ("0", gidnumber) != 0)
	{
	  gtk_widget_show (create_messagebox_with_message
			   ("Invalid UNIX UID number"));
	  return (TRUE);
	}
    }
  if (strlen
      (gtk_entry_get_text
       (GTK_ENTRY (lookup_widget (window, "homedirectory")))) == 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("You need to supply a home directory"));
      return (TRUE);
    }

      //gtk_widget_grab_focus (lookup_widget
		//       (GTK_WIDGET (gnomedruidpage), "enablesambaobjectclass"));

  return (FALSE);
}


void
on_druidpagefinish3_finish (GnomeDruidPage * gnomedruidpage,
			    gpointer arg1, gpointer user_data)
{
  GtkWidget *window =
    lookup_widget (GTK_WIDGET (gnomedruidpage), "druid_new_user");
  if (newuser_commit (gnomedruidpage) == OK)
    gtk_widget_destroy (window);
}


void
on_uidnumber_map (GtkWidget * widget, gpointer user_data)
{
}


void
on_button_removeselection_clicked (GtkButton * button, gpointer user_data)
{

  if (objectview_has_selection())
  gtk_widget_show (create_deleteselection ());
}


gboolean
on_druidpagegroupinfo_next (GnomeDruidPage * gnomedruidpage,
			    gpointer arg1, gpointer user_data)
{

dir_entry*found;
  GtkWidget *window =
    lookup_widget (GTK_WIDGET (gnomedruidpage), "druid_new_group");
  gdouble test;
  gchar *gidnumber = NULL;
  if (strlen (gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "cn"))))
      == 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("Please enter a group name"));
      return (TRUE);
    }
  if (GTK_TOGGLE_BUTTON
      (lookup_widget (GTK_WIDGET (gnomedruidpage), "automaticgid"))->active ==
      FALSE)
    {
      gidnumber =
	gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "gidnumber")));
      test = g_strtod (gidnumber, NULL);
      if (strlen (gidnumber) == 0)
	{
	  gtk_widget_show (create_messagebox_with_message
			   ("Please type a particular ID"));
	  return (TRUE);
	}
      if (test == 0 && g_strcasecmp ("0", gidnumber) != 0)
	{
	  gtk_widget_show (create_messagebox_with_message
			   ("Invalid UNIX GID number"));
	  return (TRUE);
	}
    }


if (preferences.avoidconflicts && preferences.avoidconflictscope == ENTIREDIR) {
found = cached_dir_entries_getgroupbycn( gtk_entry_get_text (GTK_ENTRY (lookup_widget (window, "cn")) ) );
if (found)
	{
      gtk_widget_show (create_messagebox_with_message
		       ("The group name you typed already exists in the directory.  Please choose another."));
      return (TRUE);
    }
}


   //gtk_widget_grab_focus(lookup_widget(gnomedruidpage,"members"));

  return FALSE;
}


void
on_button_new_group_clicked (GtkButton * button, gpointer user_data)
{
  GtkWidget *mainwindow = NULL;

  if (connection_profile_is_connected (current_connection_profile))
    {

		if (!cached_dir_entries_has_ous())
			gtk_widget_show(create_messagebox_with_message("Your directory appears empty, or it does not have organizational units.\nPlease initialize your directory with the MigrationTools from PADL.com."));
		else {
			mainwindow = create_druid_new_group ();
      		gtk_widget_show (mainwindow);
		}

    }

}


void
on_gidnumber_map (GtkWidget * widget, gpointer user_data)
{

}


void
on_druid_new_group_druid_cancel (GnomeDruid * gnomedruid, gpointer user_data)
{
  gtk_widget_destroy (lookup_widget ((GtkWidget *) gnomedruid,
				     "druid_new_group"));

}


void
on_druidpagefinish4_finish (GnomeDruidPage * gnomedruidpage,
			    gpointer arg1, gpointer user_data)
{
  GtkWidget *window =
    lookup_widget (GTK_WIDGET (gnomedruidpage), "druid_new_group");
  if (newgroup_commit (gnomedruidpage) == OK)
    gtk_widget_destroy (window);

}


void
on_enablemailpolicycontrol_toggled (GtkToggleButton * togglebutton,
				    gpointer user_data)
{
  if (GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
      gtk_widget_show (lookup_widget (GTK_WIDGET (togglebutton), "frame6"));
      gtk_widget_grab_focus(lookup_widget
				(GTK_WIDGET (togglebutton), "mailroutingaddressset"));

    }
  else
    {
      gtk_widget_hide (lookup_widget (GTK_WIDGET (togglebutton), "frame6"));
    }

}


void
on_mailroutingaddressset_toggled (GtkToggleButton * togglebutton,
				  gpointer user_data)
{
  if (GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton),
				 "mailroutingaddress"), TRUE);
      gtk_widget_grab_focus(lookup_widget
				(GTK_WIDGET (togglebutton), "mailroutingaddress"));

    }
  else
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton),
				 "mailroutingaddress"), FALSE);
    }

}


void
on_mailhostset_toggled (GtkToggleButton * togglebutton, gpointer user_data)
{
  if (GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton), "mailhost"),
				TRUE);
      gtk_widget_grab_focus(lookup_widget
				(GTK_WIDGET (togglebutton), "mailhost"));

    }
  else
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton), "mailhost"),
				FALSE);
    }

}


void
on_user_baseoudropdown_map (GtkWidget * widget, gpointer user_data)
{

  gint i;
  GList* j;
  gchar* bestmatch = NULL;
  gchar* b;
  gchar *alternatives[] =  { "People","User",NULL } ;
  GList * dnlist;
  GList*papa;


  g_print ("\ncalled: on_user_baseoudropdown_map\n");

  dnlist = get_orgunit_dn_list_from_cache ();

  b = connection_profile_get_last_user_ou
      (connection_profile_list_getbyname
       (connection_profile_list,
        connection_profile_get_name (current_connection_profile)));


  gtk_combo_set_popdown_strings (GTK_COMBO (widget),dnlist);

  if (b) {
    papa = g_list_find_custom(dnlist,b,(GCompareFunc)g_strcasecmp);
	if (papa != NULL)
		gtk_entry_set_text (GTK_ENTRY(lookup_widget (widget, "baseou")),b);
}

  else {
   // busquemos una buena alternativa
    for (i=0;alternatives[i];i++)
      for (j=dnlist;j;j=j->next)
        if (strstr((char*)j->data,alternatives[i]) != NULL)
 	  bestmatch = (char*)j->data;

  if (bestmatch)
    gtk_entry_set_text (GTK_ENTRY
			(lookup_widget (widget, "baseou")),bestmatch);

  }

}


void
on_group_baseoudropdown_map (GtkWidget * widget, gpointer user_data)
{

  gint i;
  GList* j;
  gchar* bestmatch = NULL;
  gchar* b;
  gchar *alternatives[] =  { "Group",NULL } ;
  GList * dnlist;
  GList* papa;

  g_print ("\ncalled: on_group_baseoudropdown_map\n");

  dnlist = get_orgunit_dn_list_from_cache ();

  b = connection_profile_get_last_group_ou
      (connection_profile_list_getbyname
       (connection_profile_list,
        connection_profile_get_name (current_connection_profile)));

  gtk_combo_set_popdown_strings (GTK_COMBO (widget),dnlist);

  if (b) {
    papa = g_list_find_custom(dnlist,b,(GCompareFunc)g_strcasecmp);
	if (papa != NULL)
    	gtk_entry_set_text (GTK_ENTRY(lookup_widget (widget, "baseou")),b);
}
  else {
   // busquemos una buena alternativa
    for (i=0;alternatives[i];i++)
      for (j=dnlist;j;j=j->next)
        if (strstr((char*)j->data,alternatives[i]) != NULL)
  	  bestmatch = (char*)j->data;

  if (bestmatch)
    gtk_entry_set_text (GTK_ENTRY
			(lookup_widget (widget, "baseou")),bestmatch);
  }


}

void
on_automaticuid_toggled (GtkToggleButton * togglebutton, gpointer user_data)
{
  if (GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton), "uidnumber"),
				FALSE);
    }
  else
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton), "uidnumber"),
				TRUE);
				gtk_widget_grab_focus(lookup_widget
				(GTK_WIDGET (togglebutton), "uidnumber"));
    }

}

void
on_automaticgid_toggled (GtkToggleButton * togglebutton, gpointer user_data)
{
  if (GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton), "gidnumber"),
				FALSE);
    }
  else
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton), "gidnumber"),
				TRUE);
				gtk_widget_grab_focus(lookup_widget
				(GTK_WIDGET (togglebutton), "gidnumber"));
    }

}


void
on_loginshellsdropdown_realize (GtkWidget * widget, gpointer user_data)
{

  gtk_combo_set_popdown_strings (GTK_COMBO (widget),
				 preferences.logindefaults.shells);
}

void
on_gidnumberdropdown_realize (GtkWidget * widget, gpointer user_data)
{

  fill_groups_dropdown (widget);
//setting default group

g_print("Last group used: %s\n" ,preferences.userbox.lastgroup );
if (preferences.userbox.lastgroup && g_strcasecmp(preferences.userbox.lastgroup,"0") != 0) {
  gtk_entry_set_text ( GTK_ENTRY(lookup_widget(widget,"gidnumber")),preferences.userbox.lastgroup);
}


}


gint
on_deleteselection_closed (GnomeDialog * gnomedialog, gpointer user_data)
{
  return (FALSE);
}


void
on_okdeletion_click (GtkButton * button, gpointer user_data)
{
	dir_entry *entry = NULL;
	GnomeIconList *itemlist = NULL;
	GList* dns = NULL;
	GList* sl = NULL;

	if (objectview_has_selection()) {
	itemlist = (GnomeIconList *) lookup_widget (GTK_WIDGET (app),
			"itemlist");

	for (sl = itemlist->selection;sl;sl=sl->next) {
		entry =
		gnome_icon_list_get_icon_data (itemlist,GPOINTER_TO_INT (sl->data));
		g_assert(dir_entry_get_dn(entry));
		if (dir_entry_is_user(entry) ) {
			g_print("\n  Inserting %s first into the delete list",dir_entry_get_dn(entry));
			dns = g_list_prepend(dns,g_strdup(dir_entry_get_dn(entry)));
		} else {
			g_print("\n  Appending %s first to the end of the delete list",dir_entry_get_dn(entry));
			dns = g_list_append(dns,g_strdup(dir_entry_get_dn(entry)));
		}
	}
	if (app_delete_interactive(dns) == LDAP_SUCCESS) {
		gtk_widget_destroy (lookup_widget (GTK_WIDGET (button),
			"deleteselection"));
	}
	g_list_foreach(dns,(GFunc)g_free,NULL);
	g_list_free(dns);
	}
}

void
on_canceldeletion_click (GtkButton * button, gpointer user_data)
{
//
//gtk_signal_emit_by_name(GTK_OBJECT(lookup_widget(GTK_WIDGET(button),"deleteselection")),"close");
  gtk_widget_destroy (lookup_widget (GTK_WIDGET (button), "deleteselection"));
}


void
on_preferences_clicked (GnomeDialog * gnomedialog,
			gint arg1, gpointer user_data)
{
  g_print ("\nClicked preferences - processing and closing dialog\n");

  if (arg1 == 0)
    {
      //returns true in case everything went okay
      if (process_preferences_dialog (gnomedialog))
	{
	  save_prefs ();
	  gtk_widget_destroy (GTK_WIDGET (gnomedialog));
	}
    }
  else
    {
      gtk_widget_destroy (GTK_WIDGET (gnomedialog));
    }

}


gint
on_preferences_close (GnomeDialog * gnomedialog, gpointer user_data)
{
  g_print ("\nClosed preferences\n");
  return (TRUE);
}


gboolean
on_preferences_delete_event (GtkWidget * widget,
			     GdkEvent * event, gpointer user_data)
{
  gtk_widget_destroy (widget);
  return FALSE;
}


void
on_pass_crypt_map (GtkWidget * widget, gpointer user_data)
{
  if (preferences.passwordcrypttype == CRYPT)
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
}


void
on_pass_cleartext_map (GtkWidget * widget, gpointer user_data)
{
  if (preferences.passwordcrypttype == CLEARTEXT)
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);

}


void
on_pass_md5_map (GtkWidget * widget, gpointer user_data)
{
  if (preferences.passwordcrypttype == MD5)
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);

}

void
on_shadowmin_realize (GtkWidget * widget, gpointer user_data)
{
//pass_min_days
  char buf[32];
  if (preferences.logindefaults.PASS_MIN_DAYS)
    {
      snprintf (buf, sizeof buf, "%d",
		preferences.logindefaults.PASS_MIN_DAYS);
      gtk_entry_set_text (GTK_ENTRY (widget), buf);
    }
}


void
on_shadowmax_realize (GtkWidget * widget, gpointer user_data)
{
//pass_max_days
  char buf[32];
  if (preferences.logindefaults.PASS_MAX_DAYS)
    {
      snprintf (buf, sizeof buf, "%d",
		preferences.logindefaults.PASS_MAX_DAYS);
      gtk_entry_set_text (GTK_ENTRY (widget), buf);
    }
}


void
on_shadowwarning_realize (GtkWidget * widget, gpointer user_data)
{
//pass_warn_age
  char buf[32];
  if (preferences.logindefaults.PASS_WARN_AGE)
    {
      snprintf (buf, sizeof buf, "%d",
		preferences.logindefaults.PASS_WARN_AGE);
      gtk_entry_set_text (GTK_ENTRY (widget), buf);
    }
}


void
on_shadowinactive_realize (GtkWidget * widget, gpointer user_data)
{
//pass_inactive_age
  char buf[32];
  if (preferences.logindefaults.PASS_INACTIVE_AGE)
    {
      snprintf (buf, sizeof buf, "%d",
		preferences.logindefaults.PASS_INACTIVE_AGE);
      gtk_entry_set_text (GTK_ENTRY (widget), buf);
    }
}


void
on_shadowexpirecheck_toggled (GtkToggleButton * togglebutton,
			      gpointer user_data)
{
  if (GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton), "shadowexpire"),
				TRUE);
      gtk_widget_grab_focus(lookup_widget
				(GTK_WIDGET (togglebutton), "shadowexpire"));

    }
  else
    {
      gtk_widget_set_sensitive (lookup_widget
				(GTK_WIDGET (togglebutton), "shadowexpire"),
				FALSE);

    }
}



void
on_members_realize (GtkWidget * widget, gpointer user_data)
{
  static GtkTargetEntry drop_types[] = {
    {"x-application/x-directoryadmin-group", 0, TARGET_GROUP_DN}
  };

  g_print ("\nMember list realized - setting up drop properties\n");
  gtk_drag_dest_set (widget,
		     GTK_DEST_DEFAULT_ALL,
		     drop_types, ELEMENTS (drop_types), GDK_ACTION_COPY);



}


void
on_members_drag_data_received (GtkWidget * widget,
			       GdkDragContext * drag_context,
			       gint x,
			       gint y,
			       GtkSelectionData * data,
			       guint info, guint time, gpointer user_data)
{

  GtkCList *memberlist;
  gchar **row;
  gchar** uids;
  gchar* uid;
  int counter;
  gchar *received;

  received = (gchar*) data->data;
  g_print("\nThis data was received from %d: %s",info,received);
  uids = g_strsplit(received,"|",32767);

  memberlist = (GtkCList *) widget;

  for (counter=0;uids[counter];counter++) {
    uid = uids[counter];
    row = g_new0(gchar*,3);
    row[0] = g_strdup(uid);
    if (row[0])
    {
      gtk_clist_append (memberlist, row);
    }
  }

  g_strfreev(uids);

  return;


}


void
focus_me (GtkWidget * widget, gpointer user_data)
{
  gtk_widget_grab_focus (widget);
}


void
on_new_user2_activate (GtkMenuItem * menuitem, gpointer user_data)
{

  gtk_signal_emit_by_name (GTK_OBJECT (lookup_widget (GTK_WIDGET (menuitem),
						      "button_new")),
			   "clicked");
}


void
on_new_group1_activate (GtkMenuItem * menuitem, gpointer user_data)
{
  gtk_signal_emit_by_name (GTK_OBJECT (lookup_widget (GTK_WIDGET (menuitem),
						      "button_new_group")),
			   "clicked");

}


void
on_modify1_activate (GtkMenuItem * menuitem, gpointer user_data)
{
/*  gtk_signal_emit_by_name (GTK_OBJECT (lookup_widget (GTK_WIDGET (menuitem),
						      "button_modifyselection")),
			   "clicked");*/

}


void
on_remove1_activate (GtkMenuItem * menuitem, gpointer user_data)
{
  gtk_signal_emit_by_name (GTK_OBJECT (lookup_widget (GTK_WIDGET (menuitem),
						      "button_removeselection")),
			   "clicked");

}


void
on_itemlist_select_icon (GnomeIconList * gnomeiconlist,
			 gint arg1, GdkEvent * event, gpointer user_data)
{
  gboolean found = FALSE;
  GList * wa;
  int duplicatedelement = -1;

  //g_print ("\n\nSelected icon %d",arg1);

  for (wa=gnomeiconlist->selection;wa;wa=wa->next) {
    if (found == TRUE && (int)wa->data == arg1) {
      g_print("\nFound duplicate selection. Killing.");
      duplicatedelement = arg1;
      break;
    }
    if ((int)wa->data == arg1) {
      found = TRUE;
    }

  }

  if (duplicatedelement > -1)
  gnomeiconlist->selection =
g_list_remove(gnomeiconlist->selection,(gpointer)arg1);

  objectview_icon_dump_selections(gnomeiconlist);

//  gnome_icon_list_select_icon(gnomeiconlist,wa->data);


  if (objectview_has_selection())
  app_enable_editing_controls();





}


void
on_itemlist_realize (GtkWidget * widget, gpointer user_data)
{
  static GtkTargetEntry drag_types[] = {
    {"x-application/x-directoryadmin-group", 0, TARGET_GROUP_DN}
  };

  g_print ("\nIcon list realized - setting up drag and drop\n");
  gtk_drag_source_set (widget,
		       GDK_BUTTON1_MASK,
		       drag_types, ELEMENTS (drag_types), GDK_ACTION_COPY);


}

void
on_itemlist_drag_data_get (GtkWidget * widget,
			   GdkDragContext * drag_context,
			   GtkSelectionData * data,
			   guint info, guint time, gpointer user_data)
{
  GnomeIconList *itemlist;
  int pos;
  dir_entry *entry = NULL;
  GList* iter = NULL;
  gchar* ttmp = NULL;
  gchar* tobsent = NULL;

  itemlist = (GnomeIconList *) widget;
  if (objectview_has_selection())
    tobsent = g_strdup("");
    g_print("\nNumber of icons selected: %d     list length: %d",
       itemlist->icons,g_list_length(itemlist->selection)
    );


    for (iter=itemlist->selection;iter;iter=iter->next)
    {
      pos = GPOINTER_TO_INT (iter->data);
      entry = gnome_icon_list_get_icon_data (itemlist, pos);
/*      g_print("\n   Selected position: %d",pos);
      g_print("\n   Selected DN: %s",dir_entry_get_dn(entry));
      g_print("\n   Selected UID: %s",dir_entry_get_uid(entry));
	  */


      if (dir_entry_get_uid(entry)) {
        ttmp = tobsent;
        tobsent = g_strconcat(tobsent,dir_entry_get_uid(entry),"|",NULL);
        g_free(ttmp);
      }

    }

      g_print ("\nFinally sending: %s", tobsent);

      gtk_selection_data_set
         (data,data->target, strlen(tobsent), tobsent, strlen(tobsent));

}

gboolean
on_itemlist_button_press_event (GtkWidget * widget,
				GdkEventButton * event, gpointer user_data)
{
  GtkWidget *scrolledwindow;
 scrolledwindow= lookup_widget(app,"itemlistscrolledwindow");
gtk_widget_grab_focus(scrolledwindow);

  icon_list_click_event ((GnomeIconList *) widget, event, user_data);


  return FALSE;
}

void
on_druid_firsttime_druid_cancel (GnomeDruid * gnomedruid, gpointer user_data)
{
  gtk_widget_destroy (lookup_widget ((GtkWidget *) gnomedruid,
				     "druid_firsttime"));

}



void
on_finish_finish (GnomeDruidPage * gnomedruidpage,
		  gpointer arg1, gpointer user_data)
{
  connection_profile *newone;
  gchar *nombrecitocojudo;
  GtkWidget *button;

  button = (GtkWidget *) gnomedruidpage;

  nombrecitocojudo =
    gtk_entry_get_text ((GtkEntry *)
			lookup_widget ((GtkWidget *) button,
				       "entry_profile_name"));
  if (strlen (nombrecitocojudo) == 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("You need to supply a profile name"));
      return;
    }

  nombrecitocojudo =
    gtk_entry_get_text ((GtkEntry *)
			lookup_widget ((GtkWidget *) button,
				       "entry_login_server"));
  if (strlen (nombrecitocojudo) == 0)
    {
      gtk_widget_show (create_messagebox_with_message
		       ("You need to supply a server address"));
      return;
    }

  nombrecitocojudo =
    gtk_entry_get_text ((GtkEntry *)
			lookup_widget ((GtkWidget *) button,
				       "entry_profile_name"));
  if (connection_profile_list_getbyname
      (connection_profile_list, nombrecitocojudo) != NULL)
    {
//    g_print("\nItem was found on the list.  Not admissible.");
      gtk_widget_show (create_messagebox_with_message
		       ("An entry with this name already exists"));
      return;
    }


  newone =
    connection_profile_new (gtk_entry_get_text
			    ((GtkEntry *)
			     lookup_widget ((GtkWidget *) button,
					    "entry_profile_name")),
			    gtk_entry_get_text ((GtkEntry *)
						lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_dn")),
			    gtk_entry_get_text ((GtkEntry *)
						lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_pw")),
			    gtk_entry_get_text ((GtkEntry *)
						lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_server")),
			    gtk_toggle_button_get_active ((GtkToggleButton *)
				    		lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_tls")),
			    gtk_entry_get_text ((GtkEntry *)
						lookup_widget ((GtkWidget *)
							       button,
							       "entry_login_treeroot")));
  connection_profile_list =
    connection_profile_list_add (connection_profile_list, newone);


  while (button->parent != NULL)
    button = button->parent;

/*  button = lookup_widget ((GtkWidget *) button, "druid_new_profile");
  if (button == NULL) 
      button = lookup_widget ((GtkWidget *) button, "druid_firsttime"); */


  if (gtk_object_get_user_data ((GtkObject *) button))
    list_profiles_fill (gtk_object_get_user_data ((GtkObject *) button));

  gtk_widget_destroy (button);

}


void
on_rfc2307bis_map (GtkWidget * widget, gpointer user_data)
{
  if (preferences.rfc2307bis == FALSE)
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
}


void
on_enablesambaobjectclass_toggled (GtkToggleButton * togglebutton,
				   gpointer user_data)
{

  if (GTK_TOGGLE_BUTTON ((GtkToggleButton *) togglebutton)->active)
    {
      g_print ("Samba activado\n");
      gtk_widget_show (lookup_widget (GTK_WIDGET (togglebutton),
				      "framesamba"));
					        gtk_widget_grab_focus(lookup_widget
				(GTK_WIDGET (togglebutton), "smbHome"));

    }
  else
    {
      g_print ("Samba desactivado\n");
      gtk_widget_hide (lookup_widget (GTK_WIDGET (togglebutton),
				      "framesamba"));
    }
}

gboolean
on_itemlist_key_press_event            (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{
//  g_print("\nTecla %d (%s) releaseada",event->keyval,event->string);
  return FALSE;
}


gboolean
on_itemlist_key_release_event          (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{
//  g_print("\nTecla %d (%s) releaseada",event->keyval,event->string);
  return FALSE;
}


gboolean
on_itemlist_client_event               (GtkWidget       *widget,
                                        GdkEventClient  *event,
                                        gpointer         user_data)
{
  g_print("\nClient event");
  return FALSE;
}


void
on_button_refresh_clicked              (GtkButton       *button,
                                        gpointer         user_data)
{
  app_refresh();
}


gboolean
on_mainwindow_client_event             (GtkWidget       *widget,
                                        GdkEventClient  *event,
                                        gpointer         user_data)
{
  g_print("\nClient event");
  return FALSE;
}


gboolean
on_mainwindow_key_press_event          (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{

gboolean r;
r =objectview_keypress(event);
if (r) {g_print("Key processed - not allowing it to bubble up into the UI\n\n");return TRUE;
}
  return FALSE;

}


gboolean
on_mainwindow_key_release_event        (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{
//  g_print("\nTecla %d (%s) releaseada",event->keyval,event->string);
  return FALSE;

}


void
on_itemlist_unselect_icon              (GnomeIconList   *gnomeiconlist,
                                        gint             arg1,
                                        GdkEvent        *event,
                                        gpointer         user_data)
{


//g_print ("\n\nUnselected icon %d",arg1);
objectview_icon_dump_selections(gnomeiconlist);

if (objectview_has_selection() == FALSE) {
 app_disable_editing_controls();
}

}


void
on_invcredok_clicked                   (GtkButton       *button,
                                        gpointer         user_data)
{
   gchar * name;
   connection_profile * a;

   name = gtk_object_get_user_data((GtkObject*)lookup_widget ((GtkWidget *) button, "invalidcredentials"));
   g_print(name);
   a= connection_profile_list_getbyname (connection_profile_list, name);

    connection_profile_set_dn(a,
      gtk_entry_get_text((GtkEntry*)lookup_widget ((GtkWidget *) button, "userid")));
    connection_profile_set_password(a,
      gtk_entry_get_text((GtkEntry*)lookup_widget ((GtkWidget *) button, "password")));

    gtk_widget_destroy (lookup_widget ((GtkWidget *) button, "invalidcredentials"));


gtk_signal_handler_block_by_func   (
GTK_OBJECT(lookup_widget (app, "button_connect")),
                                             (GtkSignalFunc)on_button_connect_toggled,
                                             NULL);

    gtk_toggle_button_set_active ((GtkToggleButton *)
                                    lookup_widget (app, "button_connect"),
                                    TRUE);
gtk_signal_handler_unblock_by_func   (
GTK_OBJECT(lookup_widget (app, "button_connect")),
                                             (GtkSignalFunc)on_button_connect_toggled,
                                             NULL);

    app_connect(name);




    g_free(name);
}


void
on_button45_clicked                    (GtkButton       *button,
                                        gpointer         user_data)
{
    gchar * name;

    name = gtk_object_get_user_data((GtkObject*)lookup_widget ((GtkWidget *) button, "invalidcredentials"));

    gtk_toggle_button_set_active ((GtkToggleButton *)
                                    lookup_widget (app, "button_connect"),
                                    FALSE);
    g_free(name);
    gtk_widget_destroy (lookup_widget ((GtkWidget *) button, "invalidcredentials"));

}




void
on_selectuser_members_realize          (GtkWidget       *widget,
                                        gpointer         user_data)
{
	GList* eligibles=NULL;
	GtkCList*d;
	GtkCList*parentlist;
	char* row[2];
	char*name;
	gint currow;
	gboolean found;
	char*dn;
    GList*l=NULL;
	dir_entry* currentry;
	GtkEntry* textbox;
	gchar* filter;
	gchar*tempname;
	//gchar*tempneedle;gchar*temphaystack;
	row[1]=NULL;

	d=(GtkCList*)lookup_widget(widget,"members");
	parentlist=(GtkCList*)lookup_widget(widget,"selectuser");
	parentlist=gtk_object_get_user_data((GtkObject*)parentlist);
	textbox = (GtkEntry*)lookup_widget(widget,"filter");



//collect eligibles
	g_print("\nClearing list...\n");
	gtk_clist_clear(d);
	g_print("\nSelecting eligibles...\n");
	for (l=g_list_first(cached_dir_entries);l;l=l->next) {
		g_assert(l->data);
		currentry = l->data;
		if(dir_entry_is_user(currentry)) {
			g_print("Found user %s\n",dir_entry_get_name(currentry));
			//loop through the list to find out whether there is such item
			found = 0;
			for (currow=parentlist->rows - 1;currow>=0;currow --) {
	//			g_print("    Comparing against %s...",gtk_clist_get_row_data(parentlist,currow));
				if (g_strcasecmp(gtk_clist_get_row_data(parentlist,currow),currentry->dn) == 0) {
					found = 1;
					g_print("   Match! Appending to list since not found yet on current user list\n");
				}
				g_print("\n");
			}
			if (found == 0) eligibles=g_list_append(eligibles,currentry);
		}
	}
//save the eligibles list on the members list of this window
	g_print("Saving the eligibles...\n");
	gtk_object_set_user_data((GtkObject*)d,eligibles);

//fill the list for the first time with eligibles
	filter = gtk_entry_get_text(textbox);
	if (strlen(filter) < 1 ) filter = NULL;
	if (filter) { filter = g_strdup(filter);g_strdown(filter); }
	g_print("Filling list with eligibles...\n");
	for (l=g_list_first(eligibles);l;l=l->next) {
		dn=g_strdup(dir_entry_get_dn(l->data));
		g_assert(dn);
		name=dir_entry_get_name(l->data);
		if (name) name=g_strconcat(name, " (",dn,")",NULL);
		else name=g_strdup(dn);
		tempname = name;
		g_assert(name);
		g_print("Name before lowercasing: %s\n",name);
		tempname = g_strdup(name); g_strdown(tempname);
		g_print("Name after lowercasing: %s\n",tempname);
		if (filter == NULL || strstr(tempname,filter) != NULL) {
			if (filter) g_print("Filter matched: %s\n",filter);
			else g_print("No filter, appending to list anyway\n");
			row[0] = name;
			currow = gtk_clist_append(d,row);
			gtk_clist_set_row_data(d,currow,dn);
		}
		g_free(tempname);
/*		g_free(dn);
		g_free(name);*/
	}
	g_free(filter);


	gtk_clist_columns_autosize(d);


}



void
on_selectuser_combofilter_map (GtkWidget * widget, gpointer user_data)
{

  //gint i;
  GList * dnlist;
  GtkEntry*m;

  dnlist = get_orgunit_dn_list_from_cache ();

  gtk_combo_set_popdown_strings (GTK_COMBO (widget),dnlist);

m=(GtkEntry*)lookup_widget(widget,"filter");
gtk_entry_set_text(m,"");
}


void
on_connect1____activate                (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
	  gtk_toggle_button_set_active ((GtkToggleButton*)lookup_widget(app,"button_connect"), TRUE);

}


void
on_disconnect1_activate                (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
	  gtk_toggle_button_set_active ((GtkToggleButton*)lookup_widget(app,"button_connect"), FALSE);

}


void
on_manage_profiles1_activate           (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
gtk_widget_show (create_preferences ());

}


void
on_refresh1_activate                   (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
  app_refresh();
}

void
on_entry_login_tls_released            (GtkButton       *button,
                                        gpointer         user_data)
{
# ifndef HAVE_TLS
  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget
			       (button, "entry_login_tls")), FALSE);
  g_print("TLS was not found by configure to be supported by ");
  g_print("your ldap libraries.\n");
  gtk_widget_show (create_messagebox_with_message
    ("TLS was not found by configure to be supported by your ldap libraries."));
# endif

}




gboolean
on_modifyuser_key_press_event          (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{

modifyuser_keypress(widget,event);

  return TRUE;
}


gboolean
on_modifygroup_key_press_event          (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{

  modifygroup_keypress(widget,event);

  return TRUE;
}




gboolean
on_druid_new_group_key_press_event
                                        (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{
newgroup_keypress(widget,event);

  return FALSE;
}




gboolean
on_druidpagegroupstart_next            (GnomeDruidPage  *gnomedruidpage,
                                        gpointer         arg1,
                                        gpointer         user_data)
{
   gtk_widget_grab_focus(lookup_widget((GtkWidget*)gnomedruidpage,"cn"));

  return FALSE;
}


gboolean
on_druid_new_user_key_press_event      (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{
newuser_keypress(widget,event);

  return FALSE;
}


void
on_druid_new_user_show                 (GtkWidget       *widget,
                                        gpointer         user_data)
{


/// kill default accelerators
GSList*accel ;
accel = gtk_accel_groups_from_object(GTK_OBJECT(widget));
gtk_accel_group_unref(accel->data);
gtk_window_remove_accel_group((GtkWindow*)widget,accel->data);


}


gboolean
on_druidpagestart3_next                (GnomeDruidPage  *gnomedruidpage,
                                        gpointer         arg1,
                                        gpointer         user_data)
{
      gtk_widget_grab_focus (lookup_widget
		       (GTK_WIDGET (gnomedruidpage), "givenname"));

  return FALSE;
}


gboolean
on_druidpageorginfo_next               (GnomeDruidPage  *gnomedruidpage,
                                        gpointer         arg1,
                                        gpointer         user_data)
{
      gtk_widget_grab_focus (lookup_widget
		       (GTK_WIDGET (gnomedruidpage), "mail"));

  return FALSE;
}


gboolean
on_druidpagemail_next                  (GnomeDruidPage  *gnomedruidpage,
                                        gpointer         arg1,
                                        gpointer         user_data)
{
      gtk_widget_grab_focus (lookup_widget
		       (GTK_WIDGET (gnomedruidpage), "homedirectory"));

  return FALSE;
}


gboolean
on_druidpagesamba_next                 (GnomeDruidPage  *gnomedruidpage,
                                        gpointer         arg1,
                                        gpointer         user_data)
{
      gtk_widget_grab_focus (lookup_widget
		       (GTK_WIDGET (gnomedruidpage), "shadowmin"));

  return FALSE;
}


gboolean
on_invalidcredentials_key_press_event  (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{
		if (event->keyval == 65293 || event->keyval == 65421) {
			gtk_button_clicked ( (GtkButton*)lookup_widget(widget,"invcredok") );
        }

  return FALSE;
}



void
on_seleccionar_todo_activate           (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
    objectview_select_all();
}


void
on_deseleccionar_todo_activate         (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
    objectview_clear_selection();

}


void
on_druid_new_user_druid_realize        (GtkWidget       *widget,
                                        gpointer         user_data)
{


	// now it's time to load defaults for the new user.

	if (preferences.userbox.sambaused) {
	gtk_toggle_button_set_active((GtkToggleButton*)lookup_widget(widget,"enablesambaobjectclass"),TRUE);
	} else {
	gtk_toggle_button_set_active((GtkToggleButton*)lookup_widget(widget,"enablesambaobjectclass"),FALSE);
	}


}


void
on_filterbutton_clicked                (GtkButton       *button,
                                        gpointer         user_data)
{
   objectview_fill();
}


void
on_filterclear_clicked                 (GtkButton       *button,
                                        gpointer         user_data)
{
  gtk_entry_set_text(GTK_ENTRY(lookup_widget(app,"filter")),"");
  objectview_fill();
}


void
on_avoidconflicts_toggled              (GtkToggleButton *togglebutton,
                                        gpointer         user_data)
{

  if (GTK_TOGGLE_BUTTON (togglebutton)->active)
    {
      gtk_widget_set_sensitive (lookup_widget
		       (GTK_WIDGET (togglebutton), "frame_avoidconflictoptions"),TRUE);
      /* If control reaches here, the toggle button is down */

    }
  else
    {
      gtk_widget_set_sensitive (lookup_widget
		       (GTK_WIDGET (togglebutton), "frame_avoidconflictoptions"),FALSE);
      /* If control reaches here, the toggle button is up */
    }


}


void
on_preferences_show                    (GtkWidget       *widget,
                                        gpointer         user_data)
{
//now here we're supposed to load preference values into the dialog box

fill_prefsdialog(widget);

}



syntax highlighted by Code2HTML, v. 0.9.1