Newsgroup: it.comp.lang.javascript
Titolo: Creare un bottone "copia"

Ciao a Tutti vi voglio chiedere un aiuto:
Ho creato un form, questo è il codice:
<HTML>
 <HEAD></HEAD>
  <TITLE>Ricerca Congresso</TITLE>
    <BODY>
    <!-- Parte Html con gli oggetti del form di inserimento -->
     <P ALIGN="CENTER">
      <B>DATI CONGRESSO</B> (* Campi obbligatori)
      <BR><BR>
       <FORM NAME="frmcongresso" METHOD=POST
ACTION="javascript:alert('Inserimento effettuato')" ONRESET="return
verificaazzera();" ONSUBMIT="return validaform();">
        <TABLE BORDER=1 STYLE="WIDTH:500PX;">
         <TR>
           <TD><B>NOME*</B></TD>
           <TD><INPUT TYPE="TEXT" ID="txtnome" STYLE="WIDTH:350PX;"
maxlength=30></B></TD>
         </TR>
         <TR>
           <TD><B>LUOGO CONFERENZA*</B></TD>
           <TD><INPUT TYPE="TEXT" ID="txtluogoconferenza"
STYLE="WIDTH:350PX;" maxlength=30></B></TD>
         </TR>
         <TR>
           <TD><B>DATA*</B></TD>
           <TD><INPUT TYPE="TEXT" ID="txtdata" STYLE="WIDTH:100PX;"
maxlength=10></B></TD>
         </TR>
         <TR>
           <TD width="150"><B>ARGOMENTO</B></TD>
           <TD width="324"><textarea name="myTeaxtArea"
ID="txtargomento" STYLE="WIDTH:350PX;" rows="4" value=""
cols="20"></textarea> </B></TD>
         </TR>
				 <TR>
           <TD width="150"><B>TUTORIAL</B></TD>
           <TD width="324"><textarea name="myTeaxttutorial"
ID="txttutorial" STYLE="WIDTH:350PX;" rows="4" value=""
cols="20"></textarea> </B></TD>
         </TR>
				 <TR>
           <TD width="150"><B>WORKSHOPS</B></TD>
           <TD width="324"><textarea name="myTeaxtworkshops"
ID="txtworkshops" STYLE="WIDTH:350PX;" rows="4" value=""
cols="20"></textarea> </B></TD>
         </TR>
				 <TR>
           <TD width="150"><B>REGISTRAZIONE</B></TD>
           <TD width="324"><textarea name="myTeaxtregistrazione"
ID="txtregistrazione" STYLE="WIDTH:350PX;" rows="4" value=""
cols="20"></textarea> </B></TD>
         </TR>
         <TR>
           <TD><B>SEDE</B></TD>
           <TD><INPUT TYPE="TEXT" ID="txtsede" STYLE="WIDTH:250PX;"
maxlength=30></B></TD>
         </TR>
         <TR>
           <TD><B>LINK SITO</B></TD>
           <TD><INPUT TYPE="TEXT" ID="txtlinksito" STYLE="WIDTH:400PX;"
maxlength=2></B></TD>
         </TR>
         <TR>
           <TD><B>DATA SCADENZA</B></TD>
           <TD><INPUT TYPE="TEXT" ID="txtdatascadenza"
STYLE="WIDTH:100PX;" maxlength=10></B></TD>
         </TR>
        </TABLE>
        <BR>
        <INPUT TYPE="SUBMIT" ID="cmdok" VALUE="COPIA">
        <INPUT TYPE="RESET" ID="cmdazzera" VALUE="AZZERA CAMPI">
       </FORM>
     </P>
     <!-- Parte Javascript con le funzioni -->
     <SCRIPT LANGUAGE=JAVASCRIPT>
      function verificaazzera()
      // Funzione associata all'evento onreset del form
      // chiede conferma per l'azzeramento del form ed in base alla
      // scelta dell'utente consente o meno l'esecuzione dell'evento.
      // La finestra di conferma è attivabile con l'istruzione
      // window.confirm e va associata ad una variabile che restituirà
true
      // (l'utente ha scelto Ok) o false (l'utente ha scelto annulla)
      {
        var risposta=window.confirm('Tutti i dati non salvati andranno
persi.Continuare?');
        if (risposta)
          return true;
        else
          return false;
      }
      function numerico(stringain)
      // la funzione si basa sull'utilizzo del metodo parseInt
      // di cui si riporta di seguito un esempio:
      // esempio1 : ParseInt(11) = 11
      // esempio2 : ParseInt(11ss) = 11
      // esempio3 : ParseInt(aaa) = NaN
      // Se il dato in input è un numero parseInt restituisce lo
stesso valore
      // mentre in caso di contenuto alfanumerico restituisce NaN (la
stringa
      // è totalmente non numerica) oppure // la parte numerica della
stringa
      // (la stringa è parzialmente numerica).
      //
      // Per evitare che possa verificarsi l'esempio 2 e che quindi
parseint
      // dia esito positivo per una stringa che è solo parzialmente
numerica
      // (verificando ad esempio la data
      // (12/12/200a) non viene controllata stringain per intero ma
ogni
      // singolo carattere utilizzando un ciclo for.
      // Se uno solo dei caratteri non è numerico (verificato con il
metodo
      // isNaN) l'intera funzione restituisce false e termina atrimenti
      // all'uscita del ciclo viene restituito true.
      {
        var stringaout;
        var carattere;
        for (i=0;i<stringain.length;i++)
          {
            carattere=stringain.charAt(i);
            if (isNaN(parseInt(carattere)))
              return false;
          }
        return true;
      }
      function nonumerico(stringain)
      // funzione analoga alla precedente ma verifica che non siano
presenti
      // numeri
      {
        var stringaout;
        var carattere;
        for (i=0;i<stringain.length;i++)
          {
            carattere=stringain.charAt(i);
            if (!(isNaN(parseInt(carattere))))
              return false;
          }
        return true;
      }
      function verificadata(datainput)
       {
        var dataverifica;
        var dataoutput;
        var gginput;
        var mminput;
        var aaaainput;
        var ggoutput;
        var mmoutput;
        var aaaaoutput;
       // la prima cosa che si controlla è che la data sia di 10
caratteri
        if (datainput.length!=10)
         {
          alert ('La data deve essere in formato GG/MM/AAAA');
          return false;
         }
        // vengono ricavati il l'anno, il mese ed il giorno dalla data
in input
        gginput=datainput.substr(0,2);
        mminput=datainput.substr(3,2);
        aaaainput=datainput.substr(6,4);
        // tramite la funzione numerico viene verificato che il giorno,
il mese
        // e l'anno immessi siano effettivamente in formato numerico
        if(!(numerico(gginput)))
         {
          alert ('Il giorno inserito non è in formato numerico');
          return false;
         }
        if(!(numerico(mminput)))
         {
          alert ('Il mese inserito non è in formato numerico');
          return false;
         }
        if(!(numerico(aaaainput)))
         {
          alert ('L`anno inserito non è in formato numerico');
          return false;
         }
        // viene utilizzato un oggetto data per la verifica
costruendola
        // in base ai parametri ricavati in input (l'anno è sottratto
di 1
        // perchè la funzione data considera i mesi partendo da zero)
        dataverifica =new Date(aaaainput,mminput-1,gginput)
        // dalla data creata viene ricavato l'anno, il mese ed il
giorno
        // (il mese è incrementato di 1 per restituire il mese nel
formato
        // standard)
        aaaaoutput=dataverifica.getFullYear().toString();
        mmoutput=(dataverifica.getMonth()+1).toString();
        ggoutput=dataverifica.getDate().toString();
        // poichè le funzioni getMonth e getDate restituiscono valori
numerici
        // occorre aggiungere lo zero per i mesi e gli anni unitari
        // (es "1/1/2005") il controllo è effettuato sulla lunghezza
della
        // stringa
        if (mmoutput.length<2)
         mmoutput="0"+mmoutput;
        if (ggoutput.length<2)
         ggoutput="0"+ggoutput;
        // La data in output è costituita dai dati ricavati
precedentemente
        // separati dal carattere "/"
        dataoutput=ggoutput+"/"+mmoutput+"/"+aaaaoutput;
        // viene confrontata la data in input con quella in output
        // se non coincidono vuol dire che la data non è corretta
        if (datainput!=dataoutput)
         {
          alert ('la data immessa non è valida');
          return false;
         }
        else
         return true;
       }
      function validaform()
      // Funzione associata all'evento onsubmit del form
      // in base all'esito della funzione viene eseguito o meno
l'evento.
       {
        // i dati nelle caselle di testo del form vengono immagazzinati
        // in variabili
        var nome=document.getElementById("txtnome").value;
        var
luogoconferenza=document.getElementById("txtluogoconferenza").value;
        var data=document.getElementById("txtdata").value;
        var argomento=document.getElementById("txtargomento").value;
				var tutorial=document.getElementById("txttutorial").value;
				var workshops=document.getElementById("txtworkshops").value;
        var
registrazione=document.getElementById("txtregistrazione").value;
				var sede=document.getElementById("txtsede").value;
        var linksito=document.getElementById("txtlinksito").value;
        var
datascadenza=document.getElementById("txtdatascadenza").value;
        var stringaric;
        var posizioneat;
        var posizionepunto;
        var stringapunto;
        var nome1;
        var luogoconferenza1;
        var data1;
        // nome1 e luogoconferenza1 contengono le variabili nome e
luogoconferenza ripulite
        // da ogni spazio ed è su queste che viene effettuato il
controllo dei
        // campi obbligatori poichè se l'utente inserisse un semplice
spazio
        // il campo conterrebbe effettivamente un carattere e quindi il
        // controllo sarebbe validato ma ai fini pratici il dato
sarebbe
        // comunque un blank
        stringaric=/ /i
        nome1=nome.replace(stringaric,"");
        luogoconferenza1=luogoconferenza.replace(stringaric,"");
        // controllo sui campi obbligatori (nel nostro caso
        // nome, cognome e data )
        if (nome1=="" || luogoconferenza1=="" || data=="")
         {
          alert('Uno o più campi obbligatori non valorizzati');
          return false;
         }
        // controllo sulla data
        // in questo caso non visualizziamo alert poichè sono
        // già inclusi nella funzione verificadata
        if (!(verificadata(data)))
					return false;
        // se la funzione arriva qui non ha passato tutti i controlli
        return true;
       }
     function verificadata()
 {
   var dataverifica;
   var dataoutput;
   var gginput;
   var mminput;
   var aaaainput;
   var ggoutput;
   var mmoutput;
   var aaaaoutput;
var datainput=document.getElementById("txtdatascadenza").value;
// la prima cosa che si controlla è che la data sia stata
effettivamente
// immessa e che sia di 10 caratteri
   if (datainput=="")
    {
     alert ('Immettere una data');
     return;
    }
   if (datainput.length!=10)
    {
     alert ('La data deve essere in formato GG/MM/AAAA');
     return;
    }
// vengono ricavati il l'anno, il mese ed il giorno dalla data in input
   gginput=datainput.substr(0,2);
   mminput=datainput.substr(3,2);
   aaaainput=datainput.substr(6,4);
// tramite la funzione numerico viene verificato che il giorno, il mese
// e l'anno immessi siano effettivamente in formato numerico
   if(!(numerico(gginput)))
    {
     alert ('Il giorno inserito non è in formato numerico');
     return;
    }
   if(!(numerico(mminput)))
    {
     alert ('Il mese inserito non è in formato numerico');
     return;
    }
   if(!(numerico(aaaainput)))
    {
     alert ('L`anno inserito non è in formato numerico');
     return;
    }
// viene utilizzato un oggetto data per la verifica costruendola in
base
// ai parametri ricavati in input (l'anno è sottratto di 1 perchè la
funzione data
// considera i mesi partendo da zero)
   dataverifica =new Date(aaaainput,mminput-1,gginput)
// dalla data creata viene ricavato l'anno, il mese ed il giorno (il
mese è incrementato
// di 1 per restituire il mese nel formato standard)
   aaaaoutput=dataverifica.getFullYear().toString();
   mmoutput=(dataverifica.getMonth()+1).toString();
   ggoutput=dataverifica.getDate().toString();
// poichè le funzioni getMonth e getDate restituiscono valori numerici
// occorre aggiungere lo zero per i mesi e gli anni unitari (es
"1/1/2005")
// il controllo è effettuato sulla lunghezza della stringa (se < 2
aggiungi lo zero)
   if (mmoutput.length<2)
     mmoutput="0"+mmoutput;
   if (ggoutput.length<2)
     ggoutput="0"+ggoutput;
// La data in output è costituita dai dati ricavati precedentemente
separati
// dal carattere "/" dopo aver aggiunto
   dataoutput=ggoutput+"/"+mmoutput+"/"+aaaaoutput;
// viene confrontata la data in input con quella in output
// se non coincidono vuol dire che la data non è corretta
   if (datainput!=dataoutput)
         {
          alert ('la data immessa non è valida');
          return false;
         }
        else
         return true;
       }
</SCRIPT>
    </BODY>
</HTML>
Devo creare un bottone che mi copi i dati contenuti nel Form
Chi mi puo aiutare??
vi prego .......è importantissimo
ciao e grazie

Che te li copi dove?

Copia dove?
-negli appunti? (per un copia & incolla)
-a un altra form?
-in una casella di testo?
A seconda dell'uso che ne devi fare ci sono soluzioni diverse.
Alex.

Potrei quindi fare copia e incollarlo in un file .txt e  fare "salva"
alla fine.

chi mi puo aiutare a fare un tasto copia e incolla ???
per il mi codice
aiutooooooooooo

 chi mi puo aiutare a fare un tasto copia e incolla ???
premessa: chi ti dice che il client ha windows? spero sia per una intranet;
in tal caso per IE esiste createTextRange, es.
http://generale.altervista.org/programmazione/javascript/seleziona_e_copia_testo.php
se ti serve anche per Gecko qua c'è qualcosa per createTextRange:
 
http://www.sitepoint.com/article/life-autocomplete-textboxes
e per execCommand("copy"):
 
http://www.mozilla.org/editor/midas-spec.html
-- 
"e mai che mi sia venuto in mente
 di essere più ubriaco di voi
 di essere molto più ubriaco di voi"
									  F.D.A.

  
http://www.mozilla.org/editor/midas-spec.html
A meno che non abbiano cambiato le cose nel frattempo, la possibilità
d'interagire con la clipboard di sistema in Gecko è permessa unicamente con i
relativi privilegi abilitati, o da signed script.
-- 
"E' un vero peccato che tutte le persone che sanno come far funzionare 
il Paese siano troppo occupate a guidare taxi o a tagliare capelli."
(George Burns)

 relativi privilegi abilitati, o da signed script.
sì, è scritto nella pagina che le ho postato:
"note: this command won't work without setting a pref or using signed JS.
See: 
http://www.mozilla.org/editor/midasdemo/securityprefs.html
"
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 aiutooooooooooo
mi sfugge qualcosa... qual è l'utilità di quel che vorresti fare?
Se compili un form è per spedire i dati da qualche parte, in
una intranet, su internet, è uguale. Cosa compili il form a fare
se poi vuoi copiarti il contenuto dei campi in un file .txt??
Ti conviene aprire direttamente notepad e scrivere lì :-)
Se ho capito male scusami, è che proprio non riesco ad intravedere
l'obiettivo che ti sei proposta di realizzare.
raenkrus

Mi associo!

Vi spiego il mio problema per chi non ha capito:
Io devo creare una steansione per Firefox.
Consiste in : Dato un congresso tipo 
http://www.interact2005.org./
la mia estensione per prima cosa si deve aprire come una side bar (sul
lato sinistro dello schermo) poi la devo usare nel momento in cui ho
aperto la pagina del congresso.
Dopo che ho compilato i campi il file verrà memorizzato e tramite
un'applicazione web sarà possibile accedere a questo file xml e
visualizzare le informazioni riguardanti ogni singola conferenza.
Come progettare il plug-in per consentire di prendere le info
necessarie?
Potrebbe essere una side bar (piuttosto grande) strutturata come un
form contenente i campi necessari. POtrei quindi fare copia e incolla
di quello che mi serve e fare "salva" alla fine
allora io devo creare il tasto copia chi mi puo aiutare??
avete capito adesso??
chi mi potrebbe scrivere un il pezzo di codice da inserire??
grazie a tutti

 chi mi potrebbe scrivere un il pezzo di codice da inserire??
Prima deve essere chiarito bene cosa vuoi fare di preciso.
Una possibilita' di memorizzare i dati puo' essere l'uso di RDF (locali o
remoti).
'bye

allora:
io devo creare una estensione per Firefox (una sidebar)
dal punto di vista grafico deve assomogliare a un Form. La mia
estensione la richiamero solo dopo che avrò aperto la pagina che mi
interessa.
Dopo aperto la Pagina attivo la mia estensione ci scrivo tutte le
informazioni che mi servo e poi le devo copiare. Il file verrà
memorizzato e tramite un'applicazione web sarà possibile accedere a
questo file xml e visualizzare le informazioni riguardanti ogni singola
conferenza.
La mia estensione potrebbe essere una side bar (piuttosto grande)
strutturata come un form contenente i campi necessari. Dovrei fare
copia e incolla di quello che mi serve e fare "salva" alla fine.
Io devo fare nel mio codice scritto sopra il bottone copia che non
riesco 
Chi mi potrebbe aiuatre?

 riesco 
Se questo bottone deve eseguire una funzione che prende i dati dalla form e
li scrive in un file potrebbe essere utile usare il formato RDF/XML per i
dati nel file, formato che viene gia' gestito da Gecko tramite appositi
XPCOM. Per questo puoi partire come spunto iniziale da qualcosa del genere:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window id="testrdf"
xmlns="
http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul
"
title="test rdf">
<script type="application/x-javascript">
<![CDATA[
function save(){
 // URL per il file RDF/XML contenente i dati
 var rdfFile='file:///foobat/conference.rdf';
 // per la definizione del resource subject
 var rdfsub="
http://www.some-conference.com/rdf/conference/
";
 // per la definizione del resource predicate
 var rdfpred="
http://www.some-conference.com/rdf#
";
 // resource subject del Seq per la lista di conferenze
 var confseq="conferencelist";
try{
 // dati inseriti nella "form"
 var aname=document.getElementById("name").value;
 var atitle=document.getElementById("title").value;
 // solo se non in chrome system, ma caricato da file locale, abilita l'uso
di XPCOM
 // in un'estensione non serve, mentre una remote application deve essere
signed
 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
 // Service per la gestionde dei RDF
 var rdfService = Components.classes["@
mozilla.org/rdf/rdf-service;1
"].
                   getService(Components.interfaces.nsIRDFService);
 // apre e carica il data source 
 var datasource = rdfService.GetDataSourceBlocking(rdfFile);
 // definisce il subject per il nome
 var subject = rdfService.GetResource(rdfsub+aname);
 // definisce il predicate per il nome
 var predicate = rdfService.GetResource(rdfpred+"name");
 // controlla se esiste 
 var esiste=datasource.hasArcOut(subject, predicate);
 if(esiste){
	alert(aname+" gia' presente");
	return;
 }
 // predicate per il titolo
 var predicate1 = rdfService.GetResource(rdfpred+"title");
 // formato literal per il target del nome
 var name = rdfService.GetLiteral(aname);
 // formato literal per il target del titolo
 var title = rdfService.GetLiteral(atitle);
 // inserisce il nome
 datasource.Assert(subject, predicate, name, true);
 // inserisce il titolo
 datasource.Assert(subject, predicate1, title, true);
 // subject per il Seq con la lista delle conferenze
 var folderRes = rdfService.GetResource(rdfsub+confseq);
 var cont=true;
 // Instance per la gestione dei contaneirs RDF
 var container = Components.classes["@
mozilla.org/rdf/container;1
"].
                  createInstance(Components.interfaces.nsIRDFContainer);
 try {
	// prova ad inizializzare il container della lista
	container.Init(datasource, folderRes);
 } catch (ex){ 
	// non possibile inizializzarlo, non esiste
	cont=false;
 }
 if(!cont){
	// non esiste
	// Service per la gestione dei contaneirs RDF
	var rdfContainerUtils =
Components.classes["@
mozilla.org/rdf/container-utils;1
"].
getService(Components.interfaces.nsIRDFContainerUtils);
	// Crea container di tipo "Seq" per la lista
	container = rdfContainerUtils.MakeSeq(datasource, folderRes);
 }
 // agginge elemento alla lista "Seq"
 container.AppendElement(subject);
 // salva il datasource nel file
 datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);  
 datasource.Flush();
 alert(aname+" inserito");
} catch(e){
	alert("errore "+e);
}
}
]]>
</script>
<vbox>
<label value="Conferences"/>
<listbox id="lb"
 datasources="file:///foobat/conference.rdf" 
 ref="
http://www.some-conference.com/rdf/conference/conferencelist
">
<listhead>
    <listheader label="Name"/>
    <listheader label="Title"/>
  </listhead>
  <listcols>
    <listcol flex="1"/>
    <listcol flex="2"/>
  </listcols>
  <template>
  <listitem  uri="rdf:*">
   <listcell label="rdf:
http://www.some-conference.com/rdf#name
" />
   <listcell label="rdf:
http://www.some-conference.com/rdf#title
" />
  </listitem>
  </template>
</listbox>
</vbox>
<vbox>
<hbox>
<label control="name" value="Name" flex="1"/>
<textbox id="name" flex="2"/>
</hbox>
<hbox>
<label control="title" value="Title" flex="1"/>
<textbox id="title" flex="2"/>
</hbox>
<hbox class="box2">
<button label="Clear" oncommand="clear();" flex="1"/>
<spacer flex="1"/>
<button label="Save" oncommand="save();" flex="1"/>
</hbox>
</vbox>
</window>
Per la gestione di RDF/XML leggi a partire da questa pagina:
http://xulplanet.com/tutorials/mozsdk/rdfstart.php
N.B. Questo e' solo un esempio e ovviamente, dato che devi scrivere
un'estensione, e' in XUL.
Dato che devi creare un'estensione, spero tu sappia come farlo, altrimenti
inizia a leggere qualche documentazione tipo:
http://kb.mozillazine.org/Dev_:_Extensions
http://roachfiend.com/archives/2004/12/08/how-to-create-firefox-extensions/
http://xulplanet.com/tutorials/
'bye

Io devo copiare le informazioni scritte nella mia form in un file,
cioe'
salvare i dati in un file.
Il pezzo di codice che tu mi hai scritto come faccio ad inserirlo nel
mio codice ??
Ti mi consigli di fare il tutto con XML ??
Pero io so che l'interfaccia grafica la si fa con XUL è giusto ??
Se devo ricominciare e cancellare il codice che ho scritto mi puoi dare
tu delle direttive  da dove cominciare per fare questa estensione ??
ciao e grazie per la tua disponibilità
aspetto tua risposta

 tu delle direttive  da dove cominciare per fare questa estensione ??
Il tuo codice e' una form in HTML, sebbene sia possibile usare HTML in uno
XUL usando un apposito namespace (
http://xulplanet.com/tutorials/xultu/htmlelem.html
 ) e' comunque meglio
evitarlo e usare solo XUL. Per i campi della form usa l'elemento textbox, e
l'elemento button per i comandi, vedi
http://xulplanet.com/tutorials/xultu/inputs.html
 e
http://xulplanet.com/tutorials/xultu/buttons.html
Ti conviene comunque iniziare a studiare XUL partendo da
http://xulplanet.com/tutorials/xultu/
 
Per una tua estensione che aggiunga un sidebar devi realizzare due file
XUL. Il primo e' quello del tuo sidebar, come contenitore non devi usare
l'elemento window ma l'elemento page, dato che verra' poi caricato
nell'elemento browser che gestisce i sidebars di FF. Il secondo XUL e'
l'overlay che ti permette di aggiungere il tuo sidebar a FF.
Nel tutorial si parla di overlay qui 
http://xulplanet.com/tutorials/xultu/
e qui 
http://xulplanet.com/tutorials/xultu/crosspov.html
La scrittura/lettura da files richiede l'uso di XPCOM, vedi
http://xulplanet.com/tutorials/xultu/xpcom.html
 per un'introduzione e
http://xulplanet.com/references/xpcomref/group_Files.html
 per il reference
degli XPCOM per lavorare con i files. Per RDF il reference e' qui
http://xulplanet.com/references/xpcomref/group_RDF.html
 ma ti conviene
leggere prima 
http://xulplanet.com/tutorials/mozsdk/rdfstart.php
 e le
pagine seguenti.
Questa pagina 
http://kb.mozillazine.org/Dev_:_Extensions
 ti puo' servire
per studiare come realizzare le estensioni, mentre qui c'e' un esempio su
come creare un sidebar per FF 
http://occidopagus.nl/firefox/emptysidebar/
Se non sai gia' come scrivere codice XUL inizia da
http://xulplanet.com/tutorials/xultu/
 prima di tutto il resto.
'bye