// Universite de Provence - Service Commun Autoformation Multimedia - Christian Blanvillain - http://newsup.univ-mrs.fr/~blanvill
// 07.09.99 Version 1.1 - gestion des appels recursifs de plusieurs fenetres avec le meme nom
// 26.02.99 Version 1.0 - l'utilisateur peut fermer les fenetres ouvertes par autoOpen a la main sans que cela genere d'erreur au niveau du JavaScript

// autoOpen - ouvre une page Html dans une nouvelle fenetre 
// autoClose - ferme toutes les fenetres ouvertes avec autoOpen 
// setFocus - affiche au premier plan toutes les fenetres ouvertes avec autoOpen

function autoOpen(newWin, winLook) // Ouvre le fichier Html passe en parametre dans une nouvelle fenetre
{
   var founded // Bascule indiquant si une fenetre ouverte existe deja avec le fichier newWin ouvert
   var aWindowName // Gestion des appels recursifs de plusieurs fenetres avec le meme nom grace a la concatenation des nom des fenetres parents
   globalNewWin = newWin // Variable globale pour un appel recursif en cas d'erreur lors de la tentative d'ouverture d'une fenetre fermee a la main
   globalWinLook = winLook // Variable globale pour un appel recursif en cas d'erreur lors de la tentative d'ouverture d'une fenetre fermee a la main
   mode = "autoOpen" // Permet le rattrapage automatique en cas d'erreur
   founded = 0 // Indique si l'on a trouve une fenetre deja ouverte avec le meme fichier Html ou pas
   for (i=0; i<iCount; i++) // Parcours toutes les fenetres ouvertes et non fermees a la main
   {
      if (indexWin[i] == newWin) // Recherche une fenetre presentant le meme fichier Html que celui que l'on desire re-ouvrir
      {
         if (! lostWin[i]) // JavaScript ERROR si la fenetre a ete fermee a la main !!!
         {
            childWin[i].focus() // Fait passer la fenetre deja ouverte en premier plan. En cas d'erreur la routine est definitivement interrompue et ne peut pas reprendre la ou elle s'est arretee ! D'ou l'appel recursif fait dans le traitement d'erreur.
            founded = 1 // Indicateur de la fenetre trouvee 
         }
      }
   }
   i = -1 // Desactive le traitement d'erreur automatique
   if (founded == 0) // Aucune fenetre deja ouverte a ete trouvee. On va donc en ouvrir une nouvelle.
   {
      if (window.name == "principal")  // Genere un nom unique pour chaque nouvelle fenetre en concatenant le nom des fenetres parentes
      {
         aWindowName = iCount // Par soucis d'esthetisme uniquement
      }
      else 
      {
         aWindowName = window.name + "_" + iCount
      }
      // window.defaultStatus = aWindowName // Deboggage uniquement !
      childWin[iCount] = window.open(newWin,aWindowName,winLook) // Ouvre la nouvelle fenetre avec un nom unique
      indexWin[iCount] = newWin // Memorise le nom de la page Html ouverte pour eviter des ouvertures multiples de la meme fenetre
      lostWin[iCount] = false // Initialise un tableau d'indicateur d'etat pour identifier les "fenetres perdues" (ie: fenetre fermee a la main par l'utilisateur). Evite de multiplier les erreurs.
      iCount++ // Compte le nombre total de fenetres deja ouvertes. Permet de generer des noms de fenetre uniques.
   }
   founded = 0 // Etat de non detection d'une fenetre deja ouverte
}

function autoClose() // Fermeture automatique de toutes les fenetres ouvertes a l'aide de autoOpen
{  
   mode = "autoClose" // Permet le rattrapage automatique en cas d'erreur
   for (i=0; i<iCount; i++) // Parcours toutes les fenetres ouvertes et non fermees a la main
   {
      if (! lostWin[i]) // JavaScript ERROR si la fenetre a ete fermee a la main !!!
      {
         childWin[i].close() // Parcours des fenetres et fermeture
      }  
   }
   i = -1 // Desactive le traitement d'erreur automatique
}

function setFocus() // Met les fenetres filles au premier plan
{  
   mode = "setFocus" // Permet le rattrapage automatique en cas d'erreur
   for (i=0; i<iCount; i++) // Parcours toutes les fenetres ouvertes et non fermees a la main
   {
      if (! lostWin[i]) // JavaScript ERROR si la fenetre a ete fermee a la main !!!
      {
         childWin[i].setTimeout("focus()",(i+1)*50+1000) // Passe la fenetre au premier plan apres un temps donne
         // alert(i) // Deboggage
      }
   }
   i = -1 // Desactive le traitement d'erreur automatique
}

function doNothing() // Intercepte les erreurs dues a une fermeture manuelle d'une des fenetres
{
   if (i != -1) // Erreur viens de nos routines... ratrapage possible !
   {
      lostWin[i] = true // Marque la fenetre comme etant fermee manuellement
      i = -1 // Desactive le traitement d'erreur automatique
      if (mode == "autoOpen") autoOpen(globalNewWin, globalWinLook) // Appels recursifs pour eviter de devoir cliquer deux fois sur l'icone pour le faire apparaitre
      if (mode == "autoClose") autoClose() // Appels recursifs pour continuer la fermeture de toutes les fenetres
      if (mode == "setFocus") setFocus() // Appels recursifs pour continue la mise au premier plan de toutes les fenetres
   }
   return true // Sinon on continue sans pouvoir rien faire
}

// Declaration des variables globales

var iCount = 0 // Compte le nombre total de fenetres ouvertes
var i = 0 // Indice de la fenetre en cours de traitement. Variable globale utile pour le traitement d'erreur lorsqu'une fenetre referencee est fermee par l'utilisateur.
var globalNewWin // Utile pour eviter a l'utilisateur de cliquer deux fois sur l'icone d'ouverture de la fenetre
var globalWinLook // Utile pour eviter a l'utilisateur de cliquer deux fois sur l'icone d'ouverture de la fenetre
var childWin = new Array // Pointeurs vers les fenetres ouvertes. Tableau dynamique => pas de limite maximale.
var indexWin = new Array // Memorise les noms des fenetres deja ouvertes pour les faire passer en premier plan en cas d'appels multiples.
var lostWin = new Array // Tableau des fenetres perdues... Utile pour memoriser quand l'utilisateur ferme a la main une fenetre.

window.onerror = doNothing // Intercepte les erreurs JavaScript de toute la page

