/* Module resizer:
Boutons de resize de sous frames.
Génère dynamiquement des boutons permettant d'ouvrir et fermer des frames de niveau 2
Préfixes externes "frameCollapseButtons" (pour variables globales et IDs externes)
Exemple
<frameset>
<frame1></frame1>
<frame2>
<frameset>
<frame21></frame21>
...
<frame2x></frame2x>
</frameset>
</frame2>
</frameset>
Toutes les sous frames de la frame 2 (frames 21 à 2x) verront généré un bouton
permettant de les ouvrir et fermer.
Le script est actuellement statique dans ses targets et ne gère que
la frame les frames de 2e niveau de la 2e frame de l'écran principal.
*/
/* Création des variables globales:
frameCollapseButtonsTimerLock pour ne pas rafraichir les boutons alors qu'on les a activés
frameCollapseButtonsTimer pour pouvoir stopper le timer
*/
var frameCollapseButtonsTimerLock = false;
var frameCollapseButtonsTimer = null;
// Fonction de boucle principale
function frameCollapseButtonsPollFrames() {
// Si on a locké l'évènement, sortie de la fonction
if(frameCollapseButtonsTimerLock)
return;
/* Si les objets et éléments nécessaires à l'exécution n'existent pas
On arrête le timer et on sort de la fonction
*/
if( !document.getElementById || !document.createElement || !document.createTextNode
|| !top.frames[1]
|| !top.frames[1].document
|| !top.frames[1].document.getElementsByTagName
) {
clearInterval(frameCollapseButtonsTimer);
return; }
// Récupération du formulaire généré contenant les boutons
var form = document.getElementById('frameCollapseButtons');
// Récupération du frameset contenant les frames à manipuler
var frameset = top.frames[1].document.getElementsByTagName('frameset')[0];
var i=0;
// Si frameset indisponible, sortie
if(!frameset)
return;
if(!form) {
// Si formulaire contenant les boutons inexistant, le créer
form = document.createElement('FORM');
// ID permettant de hooker les styles CSS // + récupération du formulaire dans les itérations suivantes
form.id="frameCollapseButtons";
document.body.appendChild(form);
} else {
// Frameset visé non modifié => les frames contenues n'ont pas changé
// => inutile de faire le poll
if(form.frameset == frameset)
return;
// Nettoyage de contenu du formulaire
for(i=form.childNodes.length-1; i>=0; --i)
form.removeChild(form.childNodes[i]);
}
// Stockage référence vers frameset pour vérification de modification
form.frameset = frameset
var sizes;
var rows = false;
/* Obtention des tailles des frames */
if(frameset.rows) {
rows = true;
sizes = frameset.rows;
} else
sizes = frameset.cols;
var framesSizes;
var framesArray = [];
framesSizes = sizes.split(',');
for(i=0; i<frameset.getElementsByTagName('frame').length; ++i)
framesArray.push(frameset.getElementsByTagName('frame')[i].name);
/* /Obtention */
// Si les deux tables (frames et tables des frames), illogisme > sortie
if(framesSizes.length != framesArray.length)
return;
// Pour chaque frame du frameset visé
for(i=0; i<framesArray.length; ++i)
{
// On crée un pushbouton
var button = document.createElement('INPUT');
button.type="button";
// On stocke l'index de la frame et la taille initiale de celle ci
button.indexValue = i;
button.initialSize = framesSizes[i];
// Nommage du bouton via attribut "name" de la frame
button.value= framesArray[i];
button.className = "pushed";
/* Sur clic bouton:
* Activer le lock
* Si la frame associée est réduite, le bouton est sorti
-> Rendre à la frame sa taille initiale
-> Enfoncer le bouton
* Si la frame associé n'est pas réduite, le bouton est enfoncé
-> Stocker la taille actuelle de la frame
-> Réduire la frame
-> Sortir le bouton
* Mettre à jour les tailles des frames au niveau du frameset
* Rendre le lock
*/
button.onclick = function () {
frameCollapseButtonsTimerLock = true;
var sizes = (rows?frameset.rows:frameset.cols).split("," );
var currentSize = sizes[this.indexValue];
if(currentSize == "0" ) {
sizes[this.indexValue] = this.initialSize;
this.className = "pushed";
} else {
this.initialSize = currentSize;
sizes[this.indexValue]="0";
this.className = "poped";
}
if(rows)
frameset.rows = sizes.join("," );
else
frameset.cols = sizes.join("," );
frameCollapseButtonsTimerLock = false;
return false;
};
// Ajouter le bouton nouvellement généré au formulaire
form.appendChild(button);
button = null;
}
}
// On lance la fonction après le chargement de la page
// Puis on ajoute une exécution automatisée chaque seconde (1000ms)
addEvent(window, "load", function () {
frameCollapseButtonsPollFrames();
frameCollapseButtonsTimer = setInterval("frameCollapseButtonsPollFrames()",1000);
}
); |