"""
Tkinter interface mot annen kode.

Usage: <startscript> [-xml] [-flat] [-inline] [filename]
default method: xml, default filename: metadata.xml

2002-05-21, 2002-05-22 - Mats Lindh
"""

import Image, ImageTk, Tkinter, tkFileDialog, os, glob, string, DataHandler, shutil, sys, time

##########
# class App
#	- selve GUI-applikasjonen.
##########

class App:
	##########
	# __init__(master)
	#	- initialiserer og setter opp selve applikasjonen.
	#
	#	master:	handle til selve master-vinduet (rot-vinduet)
	##########
	
	def __init__(self, master):
		# setter opp lister etc.
		self.canvases = []
		self.texts = []
		self.tkim = []
		self.files = []
		self.dh = None
		
		# lager scrollbar på høyre side..
		scrollbar = Tkinter.Scrollbar(master)
		scrollbar.pack(side=Tkinter.RIGHT, fill=Tkinter.Y)
		
		# nei, selve redigeringsgreia for enkeltbilder er ikke åpen når vi starter..
		self.already_open = 0
		
		# x/y-verdiene er satt til øverst i venstre hjørne
		self.x = 0
		self.y = 0
		
		# oppretter canvas vi kan legge resten på..
		self.canvas = Tkinter.Canvas (master, width=640, height=480, yscrollcommand=scrollbar.set, scrollregion=(0,0,640,200*self.y))
		# binder scrollbaren til canvasen..
		scrollbar.config(command=self.canvas.yview)

		# oppretter en frame vi kan dytte resten inn i ..
		frame_master = Tkinter.Frame (width=640, height=480, relief='sunken', borderwidth=2)
		frame_master.pack()
		
		# legger framen vår på canvasen..
		self.canvas.create_window(0,0,window=frame_master, anchor='nw')
		self.canvas.pack()

		# setter at resten av applikasjonen skal tegne til frame'n vår istedetfor selve hovedvinduet..
		self.master = frame_master

	##########
	# AddPicture(file, comment)
	#	- legger til et bilde i applikasjonsvinduet..
	#
	#	file: 	path til fila som skal legges til..
	#	comment:	kommentar som skal legges til under bildet. hvis tom blir filnavnet satt som kommentar.
	##########
	
	def AddPicture(self, file, comment = ""):
		# legger til fila i lista vår..
		self.files.append(file)
		# legger til canvasen bildet legges på i lista vår..
		self.canvases.append(Tkinter.Canvas(self.master,width=150,height=150))
		# legger bildet på riktig sted i grid'en vår..
		self.canvases[-1].grid(row=(self.y*2), column=self.x)
		
		# leser inn bildet..
		self.image = Image.open(file)
		
		sx = 0
		sy = 0
		
		# setter riktig skalering med riktig ratio
		if (self.image.size[0] > self.image.size[1]):
			sx = 150
			sy = round(self.image.size[1] / (self.image.size[0] / 150))
		elif (self.image.size[1] > self.image.size[0]):
			sx = round(self.image.size[0] / (self.image.size[1] / 150))
			sy = 150
		else:
			sx = 150
			sy = 150
			
		# skriver ut til console at vi laster inn .. og størrelsen vi har skalert til. praktisk å vite.
		print "Laster inn " + file + " skalert til (" + str(int(sx)) + "," + str(int(sy)) + ")"
		
		# legger på den skalerte versjonen i lista vår.. og dytter den ut på canvasen.
		self.tkim.append(ImageTk.PhotoImage(self.image.resize((sx, sy), Image.BILINEAR)))
		self.item = self.canvases[-1].create_image(0, 0, image=self.tkim[-1], anchor='nw')
		
		# binder knapp 1, slik at vi kan trykke på bildene..
		self.canvases[-1].bind("<Button-1>", self.PictureClick)
		
		# legger til tekst-labelen med kommentar..
		self.texts.append(Tkinter.Label(self.master, width=23, height=3, anchor='nw', text=comment, justify='left', wraplength='140'))
		self.texts[-1].grid(row=((self.y*2)+1), column=self.x)
		
		# oppdaterer scrollverdiene, slik at vi kan scrolle dersom bildene kommer for langt ned.
		self.canvas.config(scrollregion=(0,0,640,200*(self.y+1)))
		
		# beveger oss til neste plass hvor neste bilde evnt. skal tegnes i grid'en.
		self.x = (self.x + 1)%4
		if (self.x == 0):
			self.y += 1

	##########
	# EditPicture(file, itemnum)
	#	- redigerer informasjon om et bilde..
	#
	#	file: 	filnavnet som skal redigeres..
	#	itemnum:	nummeret (indexen) på bildet som redigeres nå (i hovedvisningen)
	##########

	def EditPicture(self, file, itemnum):
		# henter ut informasjon om bildet fra datahandleren vår..
		info = self.dh.get_data(os.path.basename(file))
		
		# setter opp hvilken fil og hvilket bilde vi editerer, slik at vi kan oppdatere riktig i callback..
		self.active_file = file
		self.active_item = itemnum
		
		# setter defaultverdier..
		
		fnavn = os.path.basename(file)
		beskrivelse = ""
		kategori = ""
		sted = ""
		dato = ""
		fotograf = ""
		
		# hvis vi fikk noe fra datahandleren, så bruker vi det istedet..
		if not (info == None):
			beskrivelse = info.beskrivelse
			kategori = info.kategori
			sted = info.sted
			dato = info.dato
			fotograf = info.fotograf
		
		# laster inn bildet..
		self.img = Image.open(file)
		
		sx = self.img.size[0]
		sy = self.img.size[1]
		
		# og skalerer til passende oppløsning, slik at vi ikke bruker hele skjermen iallefall..
		
		if ((self.img.size[0] > 440) or (self.img.size[1] > 480)) :
			if (self.img.size[0] > self.img.size[1]):
				sx = 440
				sy = round(self.img.size[1] / (self.img.size[0] / 440))
			elif (self.img.size[1] > self.img.size[0]):
				sx = round(self.img.size[0] / (self.img.size[1] / 480))
				sy = 480
			else:
				sx = 440
				sy = 440
		
		# lager nytt topp-vindu
		self.top = Tkinter.Toplevel(width=640, height=480)
		
		# laster inn bildet i tk-format..
		self.tkimg = ImageTk.PhotoImage(self.img.resize((sx,sy), Image.BILINEAR))
		
		# setter opp bildet og lemper det på vinduet vårt..
		self.top_canvas = Tkinter.Canvas(self.top, width=440, height=480)
		self.top_canvas.create_image(0,0, image=self.tkimg, anchor='nw')
		self.top_canvas.pack()
		self.top_canvas.grid(row=0, rowspan=10)
		
		# lager alle dialogbokser og labels som forteller hva boksene er.
		
		Tkinter.Label(self.top, text="filnavn", anchor='nw', width=15, justify='left').grid(row=0, column=1)
		self.e1 = Tkinter.Entry(self.top, width=30)
		self.e1.grid(row=0, column=2)
		self.e1.insert(0, fnavn)
		self.e1.config(state='disabled')

		Tkinter.Label(self.top, text="beskrivelse", anchor='nw', width=15, justify='left').grid(row=1, column=1)
		self.e2 = Tkinter.Entry(self.top, width=30)
		self.e2.grid(row=1, column=2)
		self.e2.insert(0, beskrivelse)
		
		Tkinter.Label(self.top, text="kategori", anchor='nw', width=15, justify='left').grid(row=2, column=1)
		self.e3 = Tkinter.Entry(self.top, width=30)
		self.e3.grid(row=2, column=2)
		self.e3.insert(0, kategori)
		
		Tkinter.Label(self.top, text="sted", anchor='nw', width=15, justify='left').grid(row=3, column=1)
		self.e4 = Tkinter.Entry(self.top, width=30)
		self.e4.grid(row=3, column=2)
		self.e4.insert(0, sted)
		
		Tkinter.Label(self.top, text="dato", anchor='nw', width=15, justify='left').grid(row=4, column=1)
		self.e5 = Tkinter.Entry(self.top, width=30)
		self.e5.grid(row=4, column=2)
		self.e5.insert(0, dato)
		
		Tkinter.Label(self.top, text="fotograf", anchor='nw', width=15, justify='left').grid(row=5, column=1)
		self.e6 = Tkinter.Entry(self.top, width=30)
		self.e6.grid(row=5, column=2)
		self.e6.insert(0, fotograf)
		
		# setter opp to knapper, en som lagrer informasjon og en som avbryter. setter opp callback-funksjoner for disse.
		
		b1 = Tkinter.Button(self.top, text='update')
		b1.grid(row=6, column=1)
		b1.bind("<Button-1>", self.SaveComment)
		b2 = Tkinter.Button(self.top, text='cancel')
		b2.grid(row=6, column=2)
		b2.bind("<Button-1>", self.DestroyTop)

	##########
	# DestroyTop(event)
	#	- fjerner top-vinduet (som viser bildeinformasjon)
	#
	#	event:	internt event-objekt fra Tkinter
	##########

	def DestroyTop(self, event):
		self.top.destroy()
		self.already_open = 0

	##########
	# SaveComment(event)
	#	- lagrer informasjonen som er fyllt ut i bilderedigeringsvinduet.
	#
	#	event:	internt event-objekt fra Tkinter
	##########

	def SaveComment(self, event):
		# lagrer ting til datahandlerene vår..
		self.dh.set_data(self.active_file, self.e2.get(), self.e3.get(), self.e4.get(), self.e5.get(), self.e6.get())
		
		if (len(self.e2.get()) > 0):
			# oppdaterer labelen som inneholder kommentar for bildet..
			self.texts[self.active_item].configure(text=self.e2.get())
			
		# fjerner vinduet som viser enkeltbildet..
		self.top.destroy()
		self.already_open = 0
		
	##########
	# PictureClick(event)
	#	- callback-rutine for når man trykker på et bilde i hoved-applikasjonen
	#
	#	event:	internt event-objekt fra Tkinter
	##########

	def PictureClick(self, event):
		# hvis vi allerede redigerer et enkeltbilde, så vil vi ikke ha opp et til..
		if (self.already_open):
			return
			
		i = 0		
		# finner indexen til bildet som ble trykt på
		for widget in self.canvases:
			if (widget == event.widget):
				self.EditPicture(self.files[i], i)
				self.already_open = 1
				
			i += 1
	
	def load_metadata(self):
		if not (self.dh == None):
			self.dh.destroy()
			filnavn = tkFileDialog.askloadfilename(title='Filnavn for lasting av ' + self.handler + '-data')
			self.dh = DataHandler.DataHandler(self.handler, filnavn)
	
	##########
	# save_metadata(noquery)
	#	- sørger for at metainformasjonen blir lagret.
	#
	#	noquery:	hvis 1, så vil det ikke sprette opp en boks som spoer etter filnavn..
	##########

	def save_metadata(self, noquery = 0):
		if not (self.dh == None):
			if (noquery):
				self.dh.write()
			else:
				filnavn = tkFileDialog.asksaveasfilename(title='Filnavn for lagring av ' + self.handler + '-data')
				self.dh.write(filnavn)

		if (self.handler == 'xml'):
			# hvis vi bruker xml .. og imageCollection.dtd er i gjeldene katalog, så kopierer vi den også inn i katalogen hvor bildene ligger.
			if (os.path.isfile("imageCollection.dtd")):
				if not (os.path.isfile(self.directory + "/imageCollection.dtd")):
					shutil.copy("imageCollection.dtd", self.directory + "/imageCollection.dtd")

	##########
	# import_pictures()
	#	- sørger for å spørre etter et katalognavn og importerer alle .jpg-filene i denne katalogen.
	##########
	
	def import_pictures(self):
		# viser katalog-velger-dialog
		katalog = tkFileDialog.askdirectory()
		
		# hvis det faktisk ble valgt en katalog..
		if (os.path.isdir(katalog)):
			# fjerner alle eksisterende canvaser..
			for canvas in self.canvases:
				canvas.destroy()

			# fjerner alle eksisterende labler...
			for label in self.texts:
				label.destroy()

			# resetter listene..
			self.files = []
			self.tkim = []
			self.label = []
			self.canvases = []

			# setter opp handleren hvis det er første gang..
			if (self.dh == None):
				print ("setter opp morroa .. " + self.filename)
				if (self.handler == 'inline'):
					self.dh = DataHandler.DataHandler(self.handler, self.filename)
				else:
					self.dh = DataHandler.DataHandler(self.handler, katalog + "/" + self.filename)
			else:
				# ellers ber vi handleren om å fjerne all lagret informasjon..
				self.dh.destroy()
			
			# lagrer katalogen som ble valgt til senere bruk..
			self.directory = katalog
			
			# finner alle filene i katalogen..
			filer = os.listdir(katalog)
			
			self.x = 0
			self.y = 0
				
			# og så laster vi inn alle filene..		
			for fil in filer:
				# sørger for at ting i gui'et blir prosessert selv om vi er i en annen rutine..
				self.master.update_idletasks()
				# hvis det er et jpg-bilde..
				if (string.lower(fil[-4:]) == ".jpg"):
					# hent info..
					info = self.dh.get_data(fil)
					if (not info == None):
						# hvis info, bruk den til label..
						self.AddPicture(katalog + "/" + fil, info.beskrivelse)
					else:
						# ellers, bruk filnavnet..
						self.AddPicture(katalog + "/" + fil, fil)

	##########
	# export_thumbnails()
	#	- lagrer alle de aktive bildene til ./thumbs/ i katalogen hvor de ble importert fra.
	#	  lagrer også metainformasjonen.
	##########

	def export_thumbnails(self):
		print ("(-) starter export av thumbnails..")
		self.save_metadata(1)
		katalog = tkFileDialog.askdirectory()
		
		if not (os.path.isdir(katalog)):
			os.mkdir(katalog)
		
		for fil in self.files:
			thumb = katalog + "/" + os.path.basename(fil)

			# leser inn orginalfil ..
			image = Image.open(fil)
			
			sx = 0
			sy = 0
			
			# sørger for riktig resizing (slik at ikke ratioen blir fscket opp)
			if (image.size[0] > image.size[1]):
				sx = 150
				sy = round(image.size[1] / (image.size[0] / 150))
			elif (image.size[1] > image.size[0]):
				sx = round(image.size[0] / (image.size[1] / 150))
				sy = 150
			else:
				sx = 150
				sy = 150

			# resizer og lagrer.
			image = image.resize((sx,sy), Image.BILINEAR)
			image.save(thumb)
			
		print ("(-) ferdig med export av thumbnails..")

	##########
	# export_static_html()
	#	- eksporterer et komplett sett med statiske websider som viser de bildene som er i grensesnittet akkurat nå.
	#	  lagrer thumbnails og kopierer samtidig bildene til katalogen som angis som lagringssted, dersom denne er
	#	  en annen enn den eksisterende katalogen. lagrer også metainformasjonen.
	##########
		
	def export_static_html(self):
		print ("(-) starter export av statiske html-sider..")
		self.save_metadata(1)
		katalog = tkFileDialog.askdirectory()

		if not (os.path.isdir(katalog)):
			os.mkdir(katalog)
			
		if not (os.path.isdir(katalog + "/pictures")):
			os.mkdir (katalog + "/pictures")
			
		if not (os.path.isdir(katalog + "/thumbs")):
			os.mkdir (katalog + "/thumbs")
			
		for fil in self.files:
			shutil.copy(fil, katalog + "/pictures/" + os.path.basename(fil))
			
		for fil in self.files:
			thumb = katalog + "/thumbs/" + os.path.basename(fil)

			# leser inn orginalfil..
							
			image = Image.open(fil)
			
			sx = 0
			sy = 0
			
			# sørger for riktig resizing (slik at ikke ratioen blir fscket opp)
			if (image.size[0] > image.size[1]):
				sx = 150
				sy = round(image.size[1] / (image.size[0] / 150))
			elif (image.size[1] > image.size[0]):
				sx = round(image.size[0] / (image.size[1] / 150))
				sy = 150
			else:
				sx = 150
				sy = 150

			# resizer og lagrer.
			image = image.resize((sx,sy), Image.BILINEAR)
			image.save(thumb)

		index = open (katalog + "/index.html", "w")
		liste = open (katalog + "/liste.html", "w")
		stylesheet = open(katalog + "/style.css", "w")

		self.htmlWriteHeader(index)
		self.htmlWriteHeader(liste)
		self.htmlWriteStyleSheet(stylesheet)
		stylesheet.close()

		numpic = 0
		total_num_pic = 0

		index.write ("			<table>\n");
		liste.write ("			<table>\n");
		
		for fil in self.files:
			info = self.dh.get_data(fil)
	
			# hvis vi ikke har lagret noen beskrivelse, så setter vi beskrivelsen til filnavnet
			if (not info == None):
				beskrivelse = info.beskrivelse
			else:
				beskrivelse = os.path.basename(fil)

			if (numpic == 0):
				index.write("			<tr>\n")
	
			img_num = ("000" + str(total_num_pic))[-4:]
			index.write ("					<td class='bilde'><table><tr><td><a href='" + img_num + ".html'><img src='thumbs/" + os.path.basename(fil) + "' alt='" + os.path.basename(fil) + "'/></a></td></tr><tr><td class='kommentar'>" + beskrivelse + "</td></tr></table></td>\n")
			liste.write ("					<tr><td class='filnavn'><a href='" + img_num + ".html'>" + os.path.basename(fil) + "</a></td><td class='beskrivelse'>" + beskrivelse + "</td><td class='vis'><a href='" + img_num + ".html'>vis</a></td></tr>\n")

			neste = total_num_pic + 1
			forrige = total_num_pic - 1
			
			if (total_num_pic == 0):
				forrige = len(self.files) - 1
			if (total_num_pic == (len(self.files)-1)):
				neste = 0
				
			neste = ("000" + str(neste))[-4:]
			forrige = ("000" + str(forrige))[-4:]
			
			# lager selve siden som viser bildet..
				
			bilde_html = open (katalog + "/" + img_num + ".html", "w")
			
			self.htmlWriteHeader(bilde_html)
			
			bilde_html.write ("			<table>")
			bilde_html.write ("				<tr>")
			bilde_html.write ("					<td class='stortbilde'>")
			bilde_html.write ("						<a href='" + forrige + ".html'>forrige</a> - <a href='" + neste + ".html'>neste</a><br /><br />\n")
			bilde_html.write ("						<img src='pictures/" + os.path.basename(fil) + "' alt='" + os.path.basename(fil) + "' /><br /><br />")

			info = self.dh.get_data(fil)
			
			if not (info == None):
				bilde_html.write ("<span style='font-weight:	bold'>" + info.sted + "</span> - <span style='font-weight:	bold'>" + info.dato + "</span><br />")
				bilde_html.write (info.beskrivelse)
				bilde_html.write ("<br /><br />(kategori: " + info.kategori + ", fotograf: " + info.fotograf + ")")
			else:
				bilde_html.write ("<span style='font-weight:	bold'>" + os.path.basename(fil) + "</span><br />")
				bilde_html.write ("Ingen informasjon er lagret om denne filen.")

			bilde_html.write ("					</td>")
			bilde_html.write ("				</tr>")
			bilde_html.write ("			</table>")

			# avslutter bilde-siden..
			self.htmlWriteFooter(bilde_html)
			
			bilde_html.close()
			
			total_num_pic += 1
			numpic += 1
			
			# sørger for at vi får 4 bilder i hver rad..
			if (numpic == 4):
				numpic = 0
				index.write ("			</tr>\n")

		if not (numpic == 0):
			index.write ("			</tr>\n")
		
		index.write ("			</table>\n");
		liste.write ("			</table>\n");

		# avslutter index (thumbnail) og liste (vanlig liste)
		self.htmlWriteFooter(index)
		self.htmlWriteFooter(liste)

		index.close()
		liste.close()

		print ("(-) ferdig med export av statiske html-sider..")

	##########
	# htmlWriteHeader(file)
	#	- skriver ut en html-header for generering av statiske sider.
	#	  
	#	file:	et objekt som oppfører seg som et fil-objekt (.write)
	##########

	def htmlWriteHeader(self, file):
		file.write("""<?xml version="1.0" encoding="iso-8859-1"?>
	<!DOCTYPE
	  html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
	  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
	<html>
		<head>
			<title>Thumbinator 2000</title>
			<link rel="stylesheet" type="text/css" href="style.css" />
		</head>
		<body>
			<table width='100%'>
				<tr>
					<td class='header'>
						Thumbinator 2000 (static)
					</td>
				</tr>
			</table>
			<table width='100%'>
				<tr>
					<td class='view'>vis: <a href='index.html'>thumbnails</a> - <a href='liste.html'>liste</a></td>
				</tr>
			</table>
			<div class='images'>
	""")

	##########
	# htmlWriteStyleSheet(file)
	#	- skriver ut stylesheetet til de statiske websidene til ønsket fil
	#	  
	#	file:	et objekt som oppfører seg som et fil-objekt (.write)
	##########

	def htmlWriteStyleSheet(self, file):
		file.write ("""
td.header {
	background:		#282B5D;
	font-size:		large;
	font-family:	verdana, arial, sans-serif;
	color:			#cccccc;
	padding:		10px;
}
td.view {
	background:		#282B5D;
	font-size:		10pt;
	font-family:	verdana, arial, sans-serif;
	color:			#cccccc;
	padding-left:	5px;
}
td.login {
	background:		#282B5D;
	font-size:		10pt;
	font-family:	verdana, arial, sans-serif;
	color:			#cccccc;
	padding:	12pt;
	text-align:		center;
}

td.login A {
	color:			#eeeeee;
	text-decoration:	none;
}

td.login A:hover {
	color:			#ffffff;
	text-decoration:	underline;
}

.login {
	border-color:	#000000;
	border-style:	solid;
	border-width:	1px;
}
input.submit {
	border-color:	#000000;
	border-style:	solid;
	border-width:	1px;
	background:		#cccccc;
}
td.view A {
	color:			#eeeeee;
	text-decoration:	none;
}
td.view A:Hover {
	color:			#ffffff;
	text-decoration:	none;
}
body {
	margin:			0px;
	padding:		5px;
}
div.images {
	text-align:		center;
	width:			100%;
}

div.error {
	background:		#FF0000;
	color:			#000000;
	font-size:		30px;
}

img {
	border-width:	0px;
}

table.search {
	background:		#dddddd;
	font-family:	verdana, arial, sans-serif;
}

td.bilde {
	padding:		5px;
	background:		#dddddd;
	font-family:	verdana, arial, sans-serif;	
	width:			160px;
	vertical-align:	top;
}

td.stortbilde {
	padding:		5px;
	background:		#dddddd;
	font-family:	verdana, arial, sans-serif;	
	vertical-align:	top;
}

td.kommentar {
	font-size:		80%;
	text-align:	left;
}

td.filnavn {
	width:			20%;
	background:		#dddddd;
	font-family:	verdana, arial, sans-serif;
	text-align:	left;
}

td.beskrivelse {
	width:			60%;
	background:		#dddddd;
	font-family:	verdana, arial, sans-serif;
	text-align:	left;
}

td.vis {
	width:			10%;
	background:		#dddddd;
	font-family:	verdana, arial, sans-serif;
	text-align:	left;
}

td.rediger {
	width:			10%;
	background:		#dddddd;
	font-family:	verdana, arial, sans-serif;
	text-align:	left;
}
""")

	##########
	# htmlWriteFooter(file)
	#	- skriver ut html-footeren for de statiske sidene.
	#	  
	#	file:	et objekt som oppfører seg som et fil-objekt (.write)
	##########

	def htmlWriteFooter(self, file):
		file.write ("""		</div>
		<table width='100%'>
			<tr>
				<td class='login'>
				""")
		
		file.write("generert " + time.strftime("%d / %m / %Y (%H:%M)"))
		
		file.write("""				</td>
			</tr>
		</table>
	</body>
</html>""")

	
##########
# init()
#	- initialiserer GUI-applikasjonen. laster inn og behandler data fra kommandolinjen.
#	  starter GUI-applikasjonen
##########

def init():
	# sjekker om vi har noen argumenter fra kommandolinjen..
	if (len(sys.argv) > 1):
		if (len(sys.argv) == 2):
			if (sys.argv[1][0] == "-"):
				# velger hvilken datahandler vi ønsker å bruke.. (med default-filnavn)
				if (sys.argv[1] == "-xml"):
					handler = 'xml'
					filename = 'metadata.xml'
				elif (sys.argv[1] == "-flat"):
					handler = 'flat'
					filename = 'metadata.dat'
				elif (sys.argv[1] == "-inline"):
					handler = 'inline'
					filename = ''
				else:
					sys.stderr.write ("invalid options.. going for defaults!\n")
					handler = 'xml'
					filename = 'metadata.xml'
			else:
				handler = 'xml'
				filename = sys.argv[1]
		# har angitt mer enn bare handler..
		elif (len(sys.argv) == 3):
			# velger hvilken handler .. jada, her også, faktisk .. men denne gangen med angitt filnavn!
			if (sys.argv[1][0] == "-"):
				if (sys.argv[1] == "-xml"):
					handler = 'xml'
					filename = sys.argv[2]
				elif (sys.argv[1] == "-flat"):
					handler = 'flat'
					filename = sys.argv[2]
				elif (sys.argv[1] == "-inline"):
					handler = 'inline'
					filename = sys.argv[2]
				else:
					# kanskje vi skriver ut en fin feilmelding..
					sys.stderr.write ("invalid options.. going for defaults!\n")
					handler = 'xml'
					filename = 'metadata.xml'
			else:
				# .. og det samme her..
				sys.stderr.write ("invalid options.. going for defaults!\n")
				filename = 'metadata.xml'
				handler = 'xml'
		else:
			# og her da, selvsagt.
			sys.stderr.write ("invalid options.. going for defaults!\n")
			filename = 'metadata.xml'
			handler = 'xml'
	else:
		# hvis ingen options er gitt, så bruker vi xml og 'metadata.xml' som filnavn
		filename = 'metadata.xml'
		handler = 'xml'

	# starter tkinter og henter ut et rot-vindu..
	root = Tkinter.Tk()

	# starter opp Applikasjonen vår..
	app = App(root)
	
	# setter opp handleren..
	app.handler = handler
	app.filename = filename

	# lager menyene
	menuBar = Tkinter.Menu(root)
	
	filMeny = Tkinter.Menu(menuBar, tearoff=0)
	filMeny.add_command(label="Import pictures", command=app.import_pictures)
	filMeny.add_command(label="Import MetaData", command=app.load_metadata)
	filMeny.add_command(label="Save MetaData", command=app.save_metadata)
	filMeny.add_separator()
	filMeny.add_command(label="Export thumbnails", command=app.export_thumbnails)
	filMeny.add_command(label="Export static HTML", command=app.export_static_html)
	filMeny.add_separator()
	filMeny.add_command(label="Quit", command=root.quit)
	menuBar.add_cascade(label='File', menu=filMeny)

	# setter tittel på vinduet og legger til menyen..
	root.title("Thumbinator 2000")
	root.config(menu=menuBar)

	# kjører igang med vår evige loop :-)
	root.mainloop()

if __name__ == '__main__':
	# hvis noen finner på å starte oss rett fra kommandolinjen, så skal de søren meg få lov til det!
	init()