/*  Copyright (C) 2001-2002  Kenichi Suto
 *
 *  This program 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 of the License, or
 *  (at your option) any later version.
 *
 *  This program 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 this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/


#include "defs.h"
#include "global.h"
#include "statusbar.h"
#include <pthread.h>
#include <sys/wait.h>

#ifdef HAVE_ICONV_H
#include <iconv.h>
#include <langinfo.h>
#endif

#define MAX_ENGINES 100

void go_home();
void web_search();
void split_word(gchar *word, gchar **keywords);

static GtkWidget *web_tree;
static GtkCTreeNode *current_node;
static GtkItemFactory *tree_item_factory;
static GtkItemFactoryEntry tree_menu_items[] = {
	{ N_("/Go Home"),    NULL, go_home, 0, NULL },
	{ N_("/Search"),    NULL, web_search, 0, NULL },
};

extern GdkPixmap *book_open_pixmap;
extern GdkPixmap *book_closed_pixmap;
extern GdkBitmap *book_open_mask;
extern GdkBitmap *book_closed_mask;


extern GtkWidget *dict_viewport;
extern GtkWidget *dict_scroll;
extern GtkWidget *progress_web;
extern GList *web_list;


struct _engine {
	gchar *group;
	gchar *title;
	gchar *url;
	gchar *delimit;
	gchar *rest;
};

struct _engine engines[MAX_ENGINES];


static unsigned char *any_to_sjis(unsigned char *str)
{
	iconv_t cd;
	const char* icode = "euc-jp";
//	const char* ocode = "iso-2022-jp";
	const char* ocode = "shift_jis";

	int r = 0;
	size_t isize;
	size_t osize;
	char *outbuf;
	char *result;
	char *lang;

	strdup(str);

	lang = getenv("LANG");
	if(lang == NULL) {
		lang = getenv("LC_ALL");
		if(lang == NULL){
			fprintf(stderr, "Failed to get current locale.\n");
			exit(1);
		}
	}
	if((strcmp(lang, "ja_JP.eucJP") == 0) || (strcmp(lang, "ja_JP.EUC") == 0) || (strcmp(lang, "ja_JP.ujis") == 0)){
		icode = "euc-jp";
	} else if(strcmp(lang, "ja_JP.SJIS") == 0){
		icode = "shift_jis";
	} else {
		return(NULL);		
	}

//	p = gdk_wcstombs(wc_buff);

	cd = iconv_open( ocode, icode );
	if( (int)cd == -1 )
		return(NULL);		

	isize = strlen(str) + 1;
	osize = isize*2;

	result = outbuf = (char*)malloc(osize);
	r = iconv(cd, (const char **)&str, &isize, &outbuf, &osize);

	iconv_close(cd);
//	free(result);
	return(result);
}

static unsigned char *codeconv(unsigned char *str, const char *ocode)
{
	iconv_t cd;
	const char* icode;

	int r = 0;
	size_t isize;
	size_t osize;
	char *outbuf;
	char *result;

	g_assert(str != NULL);
	if(ocode == NULL)
		return(strdup(str));

	if((strcmp(ocode, "euc-jp") != 0) &&
	   (strcmp(ocode, "shift_jis") != 0) &&
	   (strcmp(ocode, "iso-2022-jp") != 0) &&
	   (strcmp(ocode, "utf-8") != 0))
		return(strdup(str));

	icode = nl_langinfo(CODESET);
	if (strcasecmp(icode, "EUCJP") == 0){
	  icode = "euc-jp";
	}

	if(strcasecmp(icode, ocode) == 0){
		return(strdup(str));
	}

	cd = iconv_open( ocode, icode );
	if( (int)cd == -1 )
		return(NULL);		

	isize = strlen(str) + 1;
	osize = isize*2;

	result = outbuf = (char*)malloc(osize);
	r = iconv(cd, (char **)&str, &isize, &outbuf, &osize);
	iconv_close(cd);

	return(result);
}


//void do_web_search(GtkWidget *widget, gpointer data){
void web_search()
{
	gchar url[512];
	pid_t pid;
	gint i, j;
	unsigned char c;
	gchar *keywords[EB_MAX_KEYWORDS + 1];
	unsigned char *kanji_str;
	gint status;
	char *words[128];
	gchar *p;
	gchar *cmd_template;
	gchar cmd[512];
	WEB_MEMBER *member;
	char *word;

	if(current_node == NULL){
		warning(_("Please select web site"));
		return;
	}

	word = gtk_entry_get_text(GTK_ENTRY(word_entry));

	member = gtk_ctree_node_get_row_data(GTK_CTREE(web_tree), current_node);
	if(member == NULL){
		warning(_("Please select web site"));
		return;
	}

	if(strlen(word) == 0)
		return;
	split_word(word, keywords);

	status_message("Lanuching web browser...");

	switch(pid = fork()){
	case -1: 
		perror("fork");
		status_message("Lanuching web browser...failed.");
		return;
	case  0:
		url[0] = '\0';
		strcat(url, member->pre);

		for(i=0 ; ; i++){
			if(keywords[i] == NULL)
				break;
			if((i != 0) &&(member->glue))
				strcat(url, member->glue);
#ifdef HAVE_ICONV_H
//			kanji_str = any_to_sjis(keywords[i]);
			kanji_str = codeconv(keywords[i], member->charcode);
#else
			kanji_str = keywords[i];
#endif
			for(j=0 ; j < strlen(kanji_str) ; j ++){
				c = kanji_str[j];
				sprintf(url, "%s%%%02X", url, c);
			}
#ifdef HAVE_ICONV_H
			free(kanji_str);
#endif
		}
		if(member->post)
			strcat(url, member->post);

		cmd_template = strdup(browser_template);
		p = strstr(cmd_template, "%f");
		if(p != NULL){
			*p = '%';
			p++;
			*p = 's';
		}
		sprintf(cmd, cmd_template, url);
//		system(cmd);

		split_word(cmd, words);

		if(execvp(words[0], words) == -1){
			perror("exec");
			_exit(1);
		}

		free(cmd_template);

		_exit(0);
		break;
	default:
		waitpid(pid, &status, 0);
		break;
	}

	status_message("Lanuching web browser...done.");
}

void go_home()
{
	gchar url[512];
	pid_t pid;
	gint status;
	char *words[128];
	gchar *p;
	gchar *cmd_template;
	gchar cmd[512];
	WEB_MEMBER *member;

	if(current_node == NULL){
		fprintf(stderr, "Please select Web site.\n");
		return;
	}

	member = gtk_ctree_node_get_row_data(GTK_CTREE(web_tree), current_node);

	switch(pid = fork()){
	case -1: 
		perror("fork");
		return;
	case  0:
		url[0] = '\0';
		strcat(url, member->home);

		cmd_template = strdup(browser_template);
		p = strstr(cmd_template, "%f");
		if(p != NULL){
			*p = '%';
			p++;
			*p = 's';
		}
		sprintf(cmd, cmd_template, url);
//		system(cmd);

		split_word(cmd, words);

		if(execvp(words[0], words) == -1){
			perror("exec");
			gtk_main_quit();
			_exit(1);
		}

		free(cmd_template);

		_exit(0);
		break;
	default:
		waitpid(pid, &status, 0);
		break;
	}


}

void web_select_row(GtkWidget *widget,
			       gint row, 
			       gint column, 
			       GdkEventButton *bevent,
			       gpointer user_data)
{

	current_node = gtk_ctree_node_nth(GTK_CTREE(web_tree), row);


	if (bevent)
	{
		switch (bevent->type)
		{
		case GDK_BUTTON_PRESS:
			break;
			
		case GDK_2BUTTON_PRESS:
//			embeded_load_url(moz_embed, member->home);
			web_search();

			break;
			
		default:
			break;
		}
	}

	return;
}

gint web_button_press(GtkWidget *widget, GdkEventButton *event)
{
	if ((event->type == GDK_BUTTON_PRESS) && 
	    ((event->button == 2) || (event->button == 3))){
		gtk_item_factory_popup (GTK_ITEM_FACTORY (tree_item_factory), 
					event->x_root, event->y_root, 
					event->button, event->time);
		return(TRUE);
         }

	return(FALSE);
}

void web_unselect_row(GtkWidget *widget,
			       gint row, 
			       gint column, 
			       GdkEventButton *bevent,
			       gpointer user_data)
{
	g_return_if_fail (GTK_IS_CLIST (widget));
	current_node = NULL;
	return;
}


GtkWidget *create_web_tree()
{
	GtkWidget *node=NULL;
	GtkWidget *leaf;
	GtkWidget *web_box;
	gint i;
	char *text[1];
	GList *group_item;
	GList *member_item;
	WEB_GROUP *group;
	WEB_MEMBER *member;
	gint nmenu_items;


	web_box = gtk_scrolled_window_new (NULL, NULL);

	web_tree = gtk_ctree_new(1, 0);
	gtk_clist_set_row_height(GTK_CLIST(web_tree),HEADING_HEIGHT+2);
	gtk_ctree_set_line_style(GTK_CTREE(web_tree),GTK_CTREE_LINES_NONE);

        gtk_signal_connect (GTK_OBJECT(web_tree), "select_row",
                            GTK_SIGNAL_FUNC(web_select_row), web_tree);

        gtk_signal_connect (GTK_OBJECT(web_tree), "unselect_row",
                            GTK_SIGNAL_FUNC(web_unselect_row), web_tree);

        gtk_signal_connect (GTK_OBJECT(web_tree), "button_press_event",
                            GTK_SIGNAL_FUNC(web_button_press), NULL);


	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (web_box),
					GTK_POLICY_AUTOMATIC,
					GTK_POLICY_AUTOMATIC);
//	gtk_clist_set_selection_mode(GTK_CLIST(web_tree),
//				     GTK_SELECTION_SINGLE);

	gtk_clist_set_reorderable(GTK_CLIST(web_tree), FALSE);




//	gtk_widget_set_usize(GTK_WIDGET(web_tree), 200, 350);
	gtk_container_add (GTK_CONTAINER (web_box), web_tree);


	group_item = g_list_first(web_list);
	while(group_item != NULL){
		group = (WEB_GROUP *)(group_item->data);

		text[0] = group->name;
		node = (GtkWidget *)gtk_ctree_insert_node(GTK_CTREE(web_tree), 
							  NULL, //parent
							  NULL, //sibling
							  text, //text
							  0,    //spacing
							  html_pixmap, //pixmap closed 
							  html_mask, //mask closed
							  html_pixmap, //pixmap opened 
							  html_mask, //mask opened
							  FALSE,//is leaf
							  FALSE);//expanded


		member_item = g_list_first(group->member);
		while(member_item != NULL){
			member = (WEB_MEMBER *)(member_item->data);


			text[0] = member->name;
			leaf = (GtkWidget *)gtk_ctree_insert_node(GTK_CTREE(web_tree), 
								  GTK_CTREE_NODE(node), //parent
								  NULL, //sibling
								  text, //text
								  2,    //spacing
								  NULL, //pixmap closed 
								  NULL, //mask closed
								  NULL, //pixmap opened 
								  NULL, //mask opened
								  TRUE,//is leaf
								  TRUE);//expanded
/*

			leaf = (GtkWidget *)gtk_ctree_insert_node(GTK_CTREE(web_tree), 
								  GTK_CTREE_NODE(node), //parent
								  NULL, //sibling
								  text, //text
								  2,    //spacing
								  html_pixmap, //pixmap closed 
								  html_mask, //mask closed
								  html_pixmap, //pixmap opened 
								  html_mask, //mask opened
								  TRUE,//is leaf
								  TRUE);//expanded
*/
			
			gtk_ctree_node_set_row_data(GTK_CTREE(web_tree), 
						    GTK_CTREE_NODE(leaf), 
						    (gpointer)member);

			member_item = g_list_next(member_item);
		}

		group_item = g_list_next(group_item);
	}

	nmenu_items = sizeof (tree_menu_items) / sizeof (tree_menu_items[0]);
	for(i=0 ; i<nmenu_items ; i++){
		tree_menu_items[i].path = _(tree_menu_items[i].path);
	}

	tree_item_factory = gtk_item_factory_new (GTK_TYPE_MENU, "<tree>", 
					     NULL);
	gtk_item_factory_create_items (tree_item_factory, nmenu_items, 
				       tree_menu_items, NULL);

	gtk_clist_set_column_width(GTK_CLIST(web_tree), 0, 640);


	return(web_box);
}



syntax highlighted by Code2HTML, v. 0.9.1