Ciao,
Pure io ultimamente mi sono trovato ad affrontare un problema analogo. Ti espongo la mia soluzione.

Ho utilizzato una textbox lato mittente con id e un div esteticamente equivalente lato destinatario con id ctl00_ContentHomePage_DivViewTextPM; successivamente mi sono scritto il seguente script:

Codice PHP:
//smileys.js

//Lista dei nomi delle smileys
 
listSmileName=new Array(  
    
"ahah1","confirm","zzz","confuse1","confuse2","cool","cry4","cry1","cry2",     
    
"cry3","devil","fun","gun1","hands","kiss1","kiss2","lol1","lol2","lol3","love2",
    
"nono","ooh","happy1","happy2","yes");
      
//Come vedi ho messo le gif nella cartella ../Messages/smile/ e il nome delle smile coincide 
//con il nome delle gif
      
function listImage(){      
            
listSmile =new Array();
             for(var 
0i<listSmileName.length;i++)
                 
listSmile[i] ="[img]../Messages/smile/"+listSmileName[i]+".gif[/img] ";
            return 
listSmile;
    }

      
//sostituisco il codice delle smileys "(nomesmile)" con img associata 
      
function Addsmile(){
    if((
document.getElementById("ctl00_ContentHomePage_DivViewTextPM"))== null)return;
       
divEl document.getElementById("ctl00_ContentHomePage_DivViewTextPM").innerHTML;
        
repl divEl;
      var 
listimg listImage(); 
      for(var 
0i<listSmileName.length;i++){
      var 
tmp "\\("+listSmileName[i]+"\\)";
      
//espressione regolare globale
         
reg = new RegExp(tmp,"g")
      
repl repl.replace(reglistimg[i]);

      
        }
    
//visto che non volevo permette che il mittente potesse inserire codice html ho utilizzato un 
   //codice "(breakbrspace)",da me definito, per creare i break; 
   //tu lo puoi fare in manira più semplice lato server
         
reg = new RegExp("\\(breakbrspace\\)","g")
      
repl repl.replace(reg"
"
);

      
document.getElementById("ctl00_ContentHomePage_DivViewTextPM").innerHTML repl;
      }
      
//creo la lista per la selezione delle smileys nel div con id SmileysContent
     
function addListSmile(){
           var 
listSmileTable document.getElementById("SmileysContent");
         var 
result "<table style='border:solid 1px;background-color:white'>";
         
idx 0;
         var 
ListImg listImage();
        
//creo una tabella 5x5
              
for(var  0;i<5;i++){
                
result += "<tr>";
               for(var  
0;j<5;j++){            
                 
result += "<th onclick=\"thClick('"+listSmileName[idx]+"');\" style='border:Solid 1px black;'>";
                               
result +=   ListImg[idx];                  
                      
result += "</th>";                    
                      
idx++;
      }
              
result += "</th>";
     }
     
result += "</table>";
     
listSmileTable.innerHTML result;
     };
     
//aggiungo il codice della smile nella text con id ctl00_ContentHomePage_TextBoxTextMess"
     
function thClick(id){
      var 
text document.getElementById("ctl00_ContentHomePage_TextBoxTextMess");
       
text.value+="("+id+")";
//ho utilizzzato jquery per nascondere il div di selezione smileys dopo la selezione
         
$("div#SmileysContent").hide("fast");
// logicamente nel corpo della pagina ho anche il duale .show("fast");
     
}; 
Ovviamente il messaggio contenente i codici delle smileys và salvato nel db