Passiamo ora alla parte più importante del nostro lavoro: lo script di gestione della chat. Incominciamo con dichiarare alcune variabili globali, subito dopo le funzioni fontcolor e bkcolor le quali come vi ho già accennato impostano le variabili sty e sty2 in modo da considerare i pannelli della formattazione del colore e background del testo come parte visibile e quindi utilizzabile o invisibile della tabella. L'evento Page_Load devinisce alcune variabili in modo da contenere i valori di ViewState che serviranno per agire sulla formattazione del testo immesso dall'utente, se è la prima volta che si accede a questa pagina ViewState saranno vuoti quindi le rispettive variabili non conterranno nulla. Inoltre viene controllato se l'utente ha passato il login e ha permesso ad entrare nella chat. Vedremo più in la a cosa serviranno i ViewState.
<script runat="server">
dim javacode, NelBody, sty, styDue, sty2, styDue2, jv as String
dim bolFine, varT, varB as boolean
dim Nuovo, carica, completo, comple, compl, comp, change as String
dim strV1, strV2, strV3, strV4, strVT3, strVT4, strVT5, strVT6 as String
public function fontcolor(varT as boolean)
if not varT then
sty = "<!-- "
sty2 = "-->"
else
sty = ""
sty2 = ""
end if
end function
public function bkcolor(varB as boolean)
if not varB then
styDue = "<!-- "
styDue2 = "-->"
else
styDue = ""
styDue2 = ""
end if
end function
public function chiudi(esc as string)
Return jv = esc
end function
sub Page_Load(obj as object, e as EventArgs)
strV1 = ViewState("fontcolor")
strV2 = ViewState("bkcolor")
strV3 = ViewState("Quattro")
strV4 = ViewState("Cinque")
strVT3 = ViewState("TestoTre")
strVT4 = ViewState("TestoQuattro")
strVT5 = ViewState("TestoCinque")
strVT6 = ViewState("TestoSei")
if (Session("Nick") = "") OR not Session("Autentificazione") then
Response.End()
end if
if not ViewState("fontcolor") then
fontcolor(False)
end if
if strV1 = "" then
sty = "<!-- "
sty2 = "-->"
end if
if not ViewState("bkcolor") then
bkcolor(False)
end if
if strV2 = "" then
styDue = "<!-- "
styDue2 = "-->"
end if
if strV3 = "" then
ViewState("Quattro") = "#000000"
end if
if strV4 = "" then
ViewState("Cinque") = "#FFFFFF"
end if
Il codice sopra descritto viene eseguito sempre, ad ogni reload della pagina, ora invece verrà eseguito un codice solo una volta, per cui ad ogni reload della pagina questo codice non verrà eseguito. Vediamo di cosa tratta:
if not Page.IsPostBack then
Application.Lock()
Application("NumeroAncorato") = Application("NumeroAncorato") + 1
Nuovo = "<em style=""color:white; background-color: blue"">" & Now() & "
E' entrato " & Session("Nick") & "</em>" & "<a name=a" & Application("NumeroAncorato") & " id=a" & Application("NumeroAncorato") &
"></a>"
dim arrTestoF(3000) as string
dim nRighe as Integer
If IsArray(Application("Testo")) then
if (Application("Righe") <= 2999) then
Application("Righe") = Application("Righe") + 1
nRighe = Application("Righe")
arrTestoF = Application("Testo")
arrTestoF(nRighe) = Nuovo
Application("Testo") = arrTestoF
if Session("Righe") = "" then
Session("Righe") = Application("Righe")
end if
end if
else
arrTestoF(0) = Nuovo
Application("Testo") = arrTestoF
Application("Righe") = 0
Session("Righe") = 0
end If
Application.Unlock()
end if
Viene creata e assegnato un valore alla variabile Application("NumeroAncorato"). In questa variabile viene salvato un valore intero che indica il numero delle righe immesse dagli utenti, servirà questo numero per un trucchetto permessomi grazie al java il quale consiste nel poter visualizzare il Dialogo della chat sempre partendo dall'ultima riga immessa e soprattutto visualizzando l'History del dialogo dall' basso.
strVT3 = ViewState("TestoTre")
If strVT3 = "" then
n.ImageUrl = "images/n_inset.gif"
b.ImageUrl = "images/g.gif"
em.ImageUrl = "images/c.gif"
end if
strVT4 = ViewState("TestoQuattro")
if strVT4 = "" then
fontc.ImageUrl = "images/font-color.gif"
bk.ImageUrl = "images/bk-color.gif"
end if
strVT5 = ViewState("TestoCinque")
if strVT5 = "" then
s000000.ImageUrl = "images/font.gif"
sFFFFFF.ImageUrl = "images/font.gif"
s0000FF.ImageUrl = "images/font.gif"
sFFCCCC.ImageUrl = "images/font.gif"
s00FF00.ImageUrl = "images/font.gif"
end if
strVT6 = ViewState("TestoSei")
if strVT6 = "" then
t000000.ImageUrl = "images/font.gif"
tFFFFFF.ImageUrl = "images/font.gif"
t0000FF.ImageUrl = "images/font.gif"
tFFCCCC.ImageUrl = "images/font.gif"
t00FF00.ImageUrl = "images/font.gif"
end if
NelBody = "setfocus()"
end sub
Questa parte di codice è esterna all'istruzione Page.IsPostBack quindi verrà considerata ad ogni reload della pagina in quanto fa parte sempre della sub Page_Load. Si assegna nuovamente alle variabili strVT1, strVT2, ecc..., che conservano il valore dei ViewState, i nuovi valori. Si ottiene così l'aggiornamento delle variabili. Così facendo le istruzioni if individuano quale dei tasti di formattazione testo è stato cliccato, abbassandolo (sostituendo l'immagine precedente con quella del rispettivo tasto rialzato), e abbassando gli altri a mo di interruttore. Qui si conclude la sub Page_Load. Ora analizziamo le subroutine e le funzioni richiamate dalla sub Page_Load a all'evento 'onClick' dei controlli ASP.NET.
sub Testo_Modifica(obj as object, e as System.Web.UI.ImageClickEventArgs)
select case obj.ID
case "n"
completo = "images/n_inset.gif"
ViewState("Testo") = ""
ViewState("TestoDue") = ""
case "b"
completo = "images/g_inset.gif"
ViewState("Testo") = ""
ViewState("TestoDue") = ""
case "em"
completo = "images/c_inset.gif"
ViewState("Testo") = ""
ViewState("TestoDue") = ""
end select
n.ImageUrl = "images/n.gif"
b.ImageUrl = "images/g.gif"
em.ImageUrl = "images/c.gif"
obj.ImageUrl = completo
ViewState("TestoTre") = "Pieno"
Page_Load(obj, e)
end sub
La subroutine Testo_Modifica generato dall'evento onClick dei bottoni di formattazione N (normale), B (Bold), Em (corsivo). La subroutine riceve l'ID del bottone cliccato e determina i valori delle variabili ViewState in modo da contenere i tag html corrispondenti per ottenere il corsivo, il grassetto o nulla (stringa vuota) per ottenere la stringa normale. Viene assegnato all'indirizzo dell'immagine il rispettivo simbolo di tasto premuto e viene richiamata la subsostituisce Page_Load per ricaricare tutte le immagini dei bottoni con le rispettive modifiche. La subroutine Testo_Colore preleva l'ID dall'immagine del tasto sostituendola con la rispettiva immagine inset (cliccata). Richiama la funzione fontcolor e bkcolor per aprire o chiudere il pannello della scelta dei colori del testo. In questo caso la routine Testo_Colore, lo si intende già dal nome, si occupa della formattazione del colore del testo digitato dall'utente. Vediamo il codice:
sub Testo_Colore(obj as object, e as System.Web.UI.ImageClickEventArgs)
select case obj.ID
case "fontc"
comple = "images/font-color_inset.gif"
ViewState("fontcolor") = true
fontcolor(True)
ViewState("bkcolor") = False
bkcolor(false)
case "bk"
comple = "images/bk-color_inset.gif"
ViewState("bkcolor") = True
bkcolor(true)
ViewState("fontcolor") = false
fontcolor(false)
end select
fontc.ImageUrl = "images/font-color.gif"
bk.ImageUrl = "images/bk-color.gif"
obj.ImageUrl = comple
ViewState("TestoQuattro") = "Pieno"
Page_Load(obj, e)
end sub
Al resto della formattazione ci pensano le subroutine Colore_F, Bk_F, bk_color per la colorazione del testo e del suo background. Viene semplicemente prelevato dall'ID del tasto rappresentante il colore (ho usato un tasto trasparente all'interno di una cella colorata, basta cambiare il colore della cella, e il rispettivo valore di ID per determinare nuovi colori di default). Mentre per la sub font_color è richiamata come abbiamo detto dalla subroutine Testo_Colore.
sub Colore_F(obj as object, e as System.Web.UI.ImageClickEventArgs)
select case obj.ID
case "s000000"
compl = "images/font_inset.gif"
colore.text = "#" & Right(obj.ID, 6)
case "sFFFFFF"
compl = "images/font_inset.gif"
colore.text = "#" & Right(obj.ID, 6)
case "s0000FF"
colore.text = "#" & Right(obj.ID, 6)
compl = "images/font_inset.gif"
case "sFFCCCC"
colore.text = "#" & Right(obj.ID, 6)
compl = "images/font_inset.gif"
case "s00FF00"
colore.text = "#" & Right(obj.ID, 6)
compl = "images/font_inset.gif"
end select
s000000.ImageUrl = "images/font.gif"
sFFFFFF.ImageUrl = "images/font.gif"
s0000FF.ImageUrl = "images/font.gif"
sFFCCCC.ImageUrl = "images/font.gif"
s00FF00.ImageUrl = "images/font.gif"
obj.ImageUrl = compl
ViewState("TestoCinque") = "Pieno"
Page_Load(obj, e)
end sub
sub font_color(obj as object, e as System.Web.UI.ImageClickEventArgs)
fontc.ImageUrl = "images/font-color.gif"
ViewState("Quattro") = colore.text
ViewState("fontcolor") = false
fontcolor(false)
end sub
sub Bk_F(obj as object, e as System.Web.UI.ImageClickEventArgs)
select case obj.ID
case "t000000"
comp = "images/font_inset.gif"
bkc.text = "#" & Right(obj.ID, 6)
case "tFFFFFF"
comp = "images/font_inset.gif"
bkc.text = "#" & Right(obj.ID, 6)
case "t0000FF"
bkc.text = "#" & Right(obj.ID, 6)
comp = "images/font_inset.gif"
case "tFFCCCC"
bkc.text = "#" & Right(obj.ID, 6)
comp = "images/font_inset.gif"
case "t00FF00"
bkc.text = "#" & Right(obj.ID, 6)
comp = "images/font_inset.gif"
end select
t000000.ImageUrl = "images/font.gif"
tFFFFFF.ImageUrl = "images/font.gif"
t0000FF.ImageUrl = "images/font.gif"
tFFCCCC.ImageUrl = "images/font.gif"
t00FF00.ImageUrl = "images/font.gif"
obj.ImageUrl = comp
ViewState("TestoSei") = "Pieno"
Page_Load(obj, e)
end sub
sub bk_color(obj as object, e as System.Web.UI.ImageClickEventArgs)
bk.ImageUrl = "images/bk-color.gif"
ViewState("Cinque") = bkc.text
ViewState("bkcolor") = false
bkcolor(false)
end sub
Altra parte importante del codice è quella che riguarda il codice generato dall'evento 'onClick' del tasto invia. Si effettuano vari filtraggi e alla fine, si crea quella che sarà la stringa immessa. Si preleva il Nick dell'utente, e partendo da sinistra si salva in nella variabile il Nick, la stringa immessa dall'utente con i valori di ViewState che in base ai casi determina il corsivo, il grassetto o i colori del testo, e per finire viene aggiunto nella stringa l'ancora html '<a name=a... id=a...></a>', al posto dei puntini il valore di Application("NumeroAncorato") che indica il numero di stringhe immesse dagli utenti dall'avvio della chat. Questo servirà per uno script java presente nella pagina 'finsetra.aspx' che visualizzerà la discussione della chat a partire dall'ultimo valore di Application("NumeroAncorato") e quindi dall'ultima riga immessa tra tutti gli utenti. Considerate inoltre il tag target=a<%=application("NumeroAncorato") % > dell'iframe digitato nel codice html, il target servirà per visualizzare il corpo della pagina a partire dall'indirizzo prelevato.
sub Submit(sender As Object, e As System.Web.UI.ImageClickEventArgs)
Dim varTesto, Nick, TestoDaFormattare as String
varTesto = Testo.text
varTesto = Replace(varTesto, "<", "<")
varTesto = Replace(varTesto, ":))", "<img
src=images/sonofelice.gif></img>")
varTesto = Replace(varTesto, ":)", "<img
src=images/sorriso.gif></img>")
varTesto = Replace(varTesto, ";)", "<img
src=images/occhiolino.gif></img>")
varTesto = Replace(varTesto, ":(", "<img
src=images/infelice.gif></img>")
varTesto = Replace(varTesto, ":sonno:", "<img
src=images/hosonno.gif></img>")
varTesto = Replace(varTesto, ":bah:", "<img
src=images/bah.gif></img>")
varTesto = Replace(varTesto, ":grr:", "<img
src=images/grr.gif></img>")
Nick = "<b><font color=#0000FF>" & Session("Nick") & " :" &
"</font></b>"
Application("NumeroAncorato") = Application("NumeroAncorato") + 1
varTesto = Nick & "<font color=" & ViewState("Quattro") & "
style=""background-color:" & ViewState("Cinque") & """ >" & ViewState("Testo") & varTesto & ViewState("TestoDue") & "</font>" & "<a
name=a" & Application("NumeroAncorato") & " id=a" & Application("NumeroAncorato") & "></a>"
Application.Lock()
dim arrTestoF(3000) as string
dim nRighe as Integer
If IsArray(Application("Testo")) then
if (Application("Righe") <= 2999) then
Application("Righe") = Application("Righe") + 1
nRighe = Application("Righe")
arrTestoF = Application("Testo")
arrTestoF(nRighe) = varTesto
Application("Testo") = arrTestoF
end if
end If
Application.Unlock()
ViewState("DiSubmit") = True
Testo.text = ""
end sub
Sub Disconnetti(sender As Object, e As System.Web.UI.ImageClickEventArgs)
NelBody = "top.close()"
End Sub
</script>
<script>
function fnTrapKD() {
if (event.keyCode == 122) {
//alert('Funzione disabilitata');
event.keyCode=0;
event.cancelBubble=true;
event.returnValue=false;
}
}
</script>
<script>function setfocus(){
document.FormTesto.Testo.focus();
}
</script>