done_ouvrir = false
oldpad = Controls.read()
blanc = Color.new(255,255,255)
noir = Color.new(0,0,0)
bleu = Color.new(0,0,255)
xligne = 66
x = 0
y = 0
chercher = true
debut = 1
fin = 7
n_liste = 1
fichier_selectionne = 1
ouvrir = false
aff_aide_ouvrir = false
curseur_ouvrir = Image.createEmpty(1,32)
curseur_ouvrir:clear(couleur_select)
xcurseur_ouvrir = 65
ycurseur_ouvrir = 243
yselectionneur = 64
lignes_fichier={}
lignes_fichier[1]="nom.txt"
lignes_a_ouvrir={}
ouvrir = Image.load("images/ouvrir.png")
repertoire_defaut = System.currentDirectory()
dossier_en_cours = "ms0:/PSP/GAME"

function afficher_partie(i, pos)
   if fichiers[i].name == "." or fichiers[i].name == ".." or fichiers[i].directory == true then
	 screen:blit(20,pos*22+42,ouvrir,3,273,18,20)
	 screen:print(40,pos*22+8+42,fichiers[i].name,noir)
   else
	 longueur = string.len(fichiers[i].name)
	 nom = string.sub(fichiers[i].name, longueur-3)
	 if string.lower(nom) == ".txt" then
	    screen:blit(20,pos*22+42,ouvrir,21,273,16,20)
	    screen:print(40,pos*22+8+42,fichiers[i].name,noir)
	 elseif string.lower(nom) == ".jpg" or string.lower(name) == ".jpeg" then
	    screen:blit(20,pos*22+42,ouvrir,53,273,25,20)
	    screen:print(48,pos*22+8+42,fichiers[i].name,noir)
	 elseif string.lower(nom) == ".gif" then
	    screen:blit(20,pos*22+42,ouvrir,78,273,25,20)
	    screen:print(48,pos*22+8+42,fichiers[i].name,noir)
	 elseif string.lower(nom) == ".bmp" then
	    screen:blit(20,pos*22+42,ouvrir,103,273,25,20)
	    screen:print(48,pos*22+8+42,fichiers[i].name,noir)
	 elseif string.lower(nom) == ".lua" then
	    screen:blit(20,pos*22+42,ouvrir,128,273,16,20)
	    screen:print(40,pos*22+8+42,fichiers[i].name,noir)
	 elseif string.lower(nom) == ".png" then
	    screen:blit(20,pos*22+42,ouvrir,144,273,25,20)
	    screen:print(48,pos*22+8+42,fichiers[i].name,noir)
	 elseif string.lower(nom) == ".mp3" or string.lower(nom) == ".wav" then
	    screen:blit(20,pos*22+42,ouvrir,169,273,16,20)
	    screen:print(40,pos*22+8+42,fichiers[i].name,noir)
	 else
	    screen:blit(20,pos*22+42,ouvrir,37,273,16,20)
	    screen:print(40,pos*22+8+42,fichiers[i].name,noir)
	 end
   end
end

function afficher_contenu(d, f, dossier)
   if chercher == true then
	 fichiers = nil
	 System.currentDirectory(dossier)
	 fichiers = System.listDirectory()
	 chercher = false
	 yselectionneur = 64
   end
   n_fichiers = table.getn(fichiers)
   pos = 1
   for i=d, n_fichiers do
	 if i <= f then
	    afficher_partie(i, pos)
	 end
	 pos = pos + 1
   end 
end
 
function afficher_selectionneur()
   screen:blit(15,yselectionneur,ouvrir,15,300,450,20)
   if pad:down() and oldpad:down() ~= pad:down()  and yselectionneur ~= 218 and fichier_selectionne<n_fichiers then
	 yselectionneur = yselectionneur + 22
	 fichier_selectionne = fichier_selectionne + 1
   end
   if pad:up() and oldpad:up() ~= pad:up() and yselectionneur ~= 42 then
	 yselectionneur = yselectionneur - 22
	 if position_selectionneur > 0 then
	    fichier_selectionne = fichier_selectionne - 1
	 end
   end
   position_selectionneur = (yselectionneur-64) / 22
end
 
function aff_dossier()
   tmp = System.currentDirectory()
   if string.len(tmp) > 55 then
   tmp = string.sub(tmp,-55)
   end
   screen:print(17,44,tmp,blanc)
   tmp = nil
end
 
function img_viewer(img_path)
img = Image.load(img_path)
   while true do
	 pad = Controls.read()
	 if pad:circle() then
	    oldpad = pad
	    img = nil
	    System.memclean()
	    return
	 end
	 screen:clear()
	 screen:blit(0,0,img)
	 screen.waitVblankStart()
	 screen.flip()
   end
end
 
function edit_menu()
   img_temp = Image.load("ms0:/PSP/GAME/LUAPROG/images/fichier.png")
   oldpad = pad
   total_s = (System.getTotalSize("ms0:/")/1024)
   free_s = (System.getFreeSpace("ms0:/")/1000)
   sum = System.md5sum(fichiers[fichier_selectionne].name)
   while true do
   pad=Controls.read()
   screen:clear()
   screen:blit(0,0,img_temp)
   screen:print(60,38,string.sub(dossier_en_cours.."/"..fichiers[fichier_selectionne].name,-60),blanc)
   screen:print(60,122,System.powerGetBatteryLifePercent().." % / "..System.powerGetBatteryLifeTime().." Min",blanc)
   screen:print(50,144,math.floor((free_s/1000)).." / "..math.floor((total_s/1024)).." MB",blanc)
   if pad:select() and oldpad:select() ~= pad:select() then
	 break
   end
   if pad:triangle() and oldpad:triangle() ~= pad:triangle() then
	 copy_selec = "ms0:/PSP/GAME/LUAPROG/"..fichiers[fichier_selectionne].name
	 img_copy = Image.load("ms0:/PSP/GAME/LUAPROG/images/copy.png")
	 while true do
		screen:clear()
		pad = Controls.read()
		screen:blit(0,0,img_copy)
		 if string.len(copy_selec) > 28 then
		screen:print(150,130,"..."..string.sub(copy_selec,-25),blanc)
		 else
		 screen:print(150,130,copy_selec,blanc)
		 end
		 if pad:cross() then
		    copy_selec = System.startOSK(copy_selec, "Nouveau nom")
		end
		 if pad:circle() and oldpad:circle() ~= pad:circle() then
		    oldpad = pad
		    break
		end
		 if pad:start() then
		    System.copyFile(fichiers[fichier_selectionne].name,copy_selec,0)
			 oldpad = pad
		    break
		end
		screen.flip()
		screen.waitVblankStart()
		oldpad = pad
	  end
	 img_copy = nil
	 System.memclean()
   end
   if pad:r() and oldpad:r() ~= pad:r() then
	 dir_selec = "Luaprog"
	 img_dir = Image.load("ms0:/PSP/GAME/LUAPROG/images/folder.png")
	 while true do
		screen:clear()
		pad = Controls.read()
		screen:blit(0,0,img_dir)
		screen:print(150,130,dir_selec,blanc)
		 if pad:cross() then
		    dir_selec = System.startOSK(dir_selec, "Nouveau nom")
		end
		 if pad:circle() and oldpad:circle() ~= pad:circle() then
		    oldpad = pad
		    break
		end
		 if pad:start() then
		    System.createDirectory(dir_selec)
			 oldpad = pad
		    break
		end
		screen.flip()
		screen.waitVblankStart()
		oldpad = pad
	  end
	 img_dir = nil
	 System.memclean()
   end
   if pad:circle() and oldpad:circle() ~= pad:circle() then
	 new="LuaProg"
	 select=1
	 oldpad = pad
	 img_rename = Image.load("ms0:/PSP/GAME/LUAPROG/images/rename.png")
	 while true do
	    screen:clear()
	    pad = Controls.read()
		screen:blit(0,0,img_rename)
	    screen:print(170,93,fichiers[fichier_selectionne].name,blanc)
	    screen:print(170,168,new,blanc)   
	    if pad:cross() then
		   new = System.startOSK(new, "Nouveau nom")
	    end
	    if pad:circle() and oldpad:circle() ~= pad:circle() then
		   oldpad = pad
		   break
	    end
	    if pad:start() then
		   System.rename(fichiers[fichier_selectionne].name,new)
			oldpad = pad
		   break
	    end
	    screen.flip()
	    screen.waitVblankStart()
	    oldpad = pad
	  end
	  img_rename = nil
	 System.memclean()
	  break
   end
   if pad:square() then
	 if fichiers[fichier_selectionne].directory == true then
	    System.removeDirectory(dossier_en_cours.."/"..fichiers[fichier_selectionne].name)
	 else
	    System.removeFile(dossier_en_cours.."/"..fichiers[fichier_selectionne].name)
	 end
	 break
   end
   if pad:cross() then
	 System.message("Md5 : "..sum,0)
   end
   screen.flip()
   screen.waitVblankStart()
   oldpad = pad
   end
   img_temp = nil
   System.memclean()
   chercher = true
   fichier_selectionne = 1
   n_liste = 1
   debut = 1
   fin = 7
end

function eboot_launcher(rep, file)
   img_temp = System.getEboot(rep..file,1)
   if img_temp == 0 then
	 img_temp = Image.load("ms0:/PSP/GAME/LUAPROG/images/icon0.png")
   end
   img_temp2 = System.getEboot(rep..file,2)
   if img_temp2 == 0 then
	 img_temp2 = Image.createEmpty(480,272)
	 img_temp2:clear(blanc)
   end
   img_temp3 = Image.createEmpty(170,21)
   img_temp3:clear(noir)
   oldpad=pad
   while true do
	 screen:clear()
	 screen:blit(0,0,img_temp2)
	 screen:blit(0,0,img_temp3)
	 screen:print(1,1,"X: Lancer l'EBOOT",blanc)
	 screen:print(1,11,"O: Retour",blanc)
	 screen:blit(180,100,img_temp)
	 pad=Controls.read()
	 if pad:cross() and oldpad:cross() ~= pad:cross() then
	    System.runeboot(rep..file) 
	 elseif pad:circle() then
	    break
	 end
	 screen.flip()
	 screen.waitVblankStart()
	 oldpad=pad
   end
   img_temp = nil
   img_temp2 = nil
   img_temp3 = nil
   System.memclean()
end
 
while done_ouvrir == false do
   pad = Controls.read()
   screen:clear()
   screen:blit(0,0,ouvrir,0,0,480,272)
   aff_dossier()
   afficher_selectionneur()
   afficher_contenu(debut, fin, dossier_en_cours)
   if position_selectionneur == 7 and pad:down() and oldpad:down() ~= pad:down() then
	 yselectionneur = 64
	 debut = debut + 7
	 fin = fin + 7
	 n_liste = n_liste + 1
   end
   if position_selectionneur == -1 and pad:up() and oldpad:up() ~= pad:up() and n_liste > 1 then
	 yselectionneur = 196
	 debut = debut - 7
	 fin = fin - 7
	 n_liste = n_liste - 1
	 fichier_selectionne = fichier_selectionne - 1
   elseif position_selectionneur == -1 and pad:up() and oldpad:up() ~= pad:up() and n_liste <= 1 then
	 yselectionneur = 64
   end
   if pad:select() and oldpad:select() ~= pad:select() then
	 edit_menu()
   end
   if pad:cross() and oldpad:cross() ~= pad:cross() and aff_aide_ouvrir == false then
	 lignes_fichier[1]=fichiers[fichier_selectionne].name
	 longueur = string.len(fichiers[fichier_selectionne].name)
	 nom = string.sub(fichiers[fichier_selectionne].name, longueur-3)
	 if dossier_en_cours == "ms0:/" then
	    repertoire = System.currentDirectory()
	 else
	    repertoire = System.currentDirectory().."/"
	 end
	 name = fichiers[fichier_selectionne].name
	 if fichiers[fichier_selectionne].directory == false then
	    if string.lower(nom) == ".png" or string.lower(nom) == ".jpg" then
		  img_viewer(fichiers[fichier_selectionne].name) 
	    elseif string.lower(nom) == ".mp3" then
		  if lect==1 then Mp3me.stop() System.memclean() end
		  Mp3me.load(fichiers[fichier_selectionne].name) 
		  Mp3me.play()
	    elseif string.lower(nom) == ".iso" or string.lower(nom) == ".cso" then
		  System.startISO(repertoire..fichiers[fichier_selectionne].name)
	    elseif string.lower(nom) == ".pbp" then
		  eboot_launcher(repertoire,fichiers[fichier_selectionne].name)
	    else
		  txt_fichier=name
		  file = io.open(repertoire..name)
		  n = 0
		  for line in file:lines() do
			n = n + 1
		  end
		  file:close()
		  file = io.open(repertoire..name)
		  p = 1
		  for line in file:lines() do
			lignes_a_ouvrir[p] = line
			p = p + 1
		  end
		  file:close()
		  for i=1, n do
			verifie_signe_bizarre = string.sub(lignes_a_ouvrir[i],string.len(lignes_a_ouvrir[i]))
			if verifie_signe_bizarre == "\r" then
			   lignes_a_ouvrir[i] = string.sub(lignes_a_ouvrir[i],0,string.len(lignes_a_ouvrir[i]) - 1)
			end
		  end
		  done_ouvrir = true
		  if multi_win_nb == 1 then   
			multi_win_nom1 = name
			multi_win_dir1 = System.currentDirectory()
		  else
			multi_win_nom2 = name
			multi_win_dir2 = System.currentDirectory()
		  end
		  System.currentDirectory(repertoire_defaut)
		  statut_menu = "no"
		  ouvrir = true
	    end
	 end
	 if fichiers[fichier_selectionne].directory == true then
	    if dossier_en_cours == "ms0:/" then
		  dossier_en_cours =  System.currentDirectory()..fichiers[fichier_selectionne].name
	    else
		  dossier_en_cours =  System.currentDirectory().."/"..fichiers[fichier_selectionne].name
	    end
	    chercher = true
	    fichier_selectionne = 1
	    n_liste = 1
	    debut = 1
	    fin = 7
	 end
   end
   if pad:l() and oldpad:l() ~= pad:l() then
	 done_ouvrir = true
	 System.currentDirectory(repertoire_defaut)
	 statut_menu = "no"
	 ouvrir = false
   end
   if pad:triangle() and oldpad:triangle() ~= pad:triangle() then
	 dossier_en_cours =  System.currentDirectory().."/.."
	 chercher = true
	 fichier_selectionne = 1
	 n_liste = 1
	 debut = 1
	 fin = 7
   end
   screen.waitVblankStart()
   screen.flip()
   oldpad = pad
end
