function _err(s) { }
function getAsciiHtml(s) { return '&#' + s.charCodeAt(0) + ';'; }
function _dbg(x){_obj("idbg").innerHTML=x+"<br>"+_obj("idbg").innerHTML;}


function init() {
go_roomArea  = _obj("roomArea");
go_listArea  = _obj("listArea");
go_chatPosts = _obj("chatPosts");
go_msgBox  = _obj("msgBox");
go_colorPicker = document.getElementById("colorPicker");
go_iggyList.listOut = iggyListOut;
go_markedList.listOut = markedListOut;
}

function setDefaults(){
gs_fg   = gs_def_fg;
gs_bg   = gs_def_bg;
gs_room = gs_def_room;
gs_name = gs_def_name;
}


function clearSettings(){
setDefaults();
go_iggyList.clear();
go_markedList.clear();
saveSettings();
closePopups();
goToRoom(gs_room);
chatPulse(0);
}


function saveSettings(){
var xargs;
xargs="action=savesettings&nick="+gs_name+"&tag="+gs_fg+","+gs_bg+"&iggy="+go_iggyList.list+"&marked="+go_markedList.list;
//alert(xargs);;
//try{top.busy(1);}catch(e){}
exeXml("_xajx.asp",xargs,"savesettings");
//window.open("_xajx.asp?"+xargs);
}


function pm(is_name) { go_msgBox.focus(); go_msgBox.value = 'pm@' + is_name + ' '; }

function pc(is_name) { go_msgBox.focus(); go_msgBox.value = 'pc@' + is_name + ' '; }

function openColorPicker(){
if(go_colorPicker.style.visibility.toLowerCase()=="hidden")_visible(go_colorPicker);
else _invisible(go_colorPicker);}

function closeColorPicker() { _invisible(go_colorPicker); }

function clickPost() {
var v,ls_pm,ls_pc,lo_element;
lo_element=_obj("msgBox");
v=lo_element.value;
lo_element.value="";
sendPost(v);
if(v){
 ls_pm = v.match(/pm@\S+/);
 ls_pc = v.match(/pc@\S+/);
 if(ls_pm||ls_pc)pmRow(v);
 if(ls_pm)lo_element.value=ls_pm+" ";
}
lo_element.focus(); 
gb_talk = true;
}

function pvtMsg(user){
var o=_obj("msgBox");
o.value='pm@'+user+' ';
o.focus();
}

function pvtChat(user,decline){
var msg="pm@"+user+" Sorry, request declined";
if(decline){sendPost(msg);pmRow(msg);return;}
//_obj("msgBox").value='';
var rm="pvt" + (Math.floor((99999-10000)*Math.random())+10001);
sendPost("pr@"+user+" #"+rm+"#");
goToRoom(rm);
}

function goToRoom(rm){
var oldroom=gs_room;
if(rm==null)gs_room=gs_def_room;
else{
 rm=rm.replace("pr@","");
 setRoom(rm);
}
updateTitle(); 
refreshChat(); 
chatPulse(oldroom);
}



function setRoom(rm) { _obj("roomBox").value = gs_room = gs_def_room = rm; }

function refreshChat() { gs_time = ''; clearTable( go_chatPosts ); ga_postBuffer = new Array(); getPosts(); }

function clearTable(t) { for( var i = t.rows.length-1; i >= 0; i-- ) { t.deleteRow(i); } }



function delItem(targetpost){
var rm=cleanName(gs_room);
var xargs="action=delitem&rm="+rm+"&itemnbr="+targetpost;
_obj("ip"+targetpost).style.display="none";
exeXml("_xajx.asp",xargs,"delitem"+targetpost);
//window.open("_xajx.asp?"+xargs);
}


function sendPost(v){
var rb=_obj("roomBox");
var rm=cleanName(rb.value);
var nb=_obj("nameBox");
var nm=cleanName(nb.value);
v=cleanx(v)
v=escape(v);
if(!rm)rm=rb.value=gs_room;
if(!nm)nm=nb.value=gs_name;
else{if(gs_name!=nm){
 nm=cleanName(nm);
 nb.value=nm;
 gs_name=nm; 
 saveSettings();
}}
if(rm!=gs_room)goToRoom(rm);
if(v.replace(/\s/g,"")==""){getPosts();return;}
//v=escape(cleanText(v));   //HTML!
v=v.replace(DCD," ","g");
v=v.replace(DCDe," ","g");
v=v.replace(DCX," ","g");
v=v.replace(DCXe," ","g");
var xargs="r="+gs_room+"&h="+gs_name;
if(gs_time!="")xargs+="&t="+gs_time;
xargs+="&v=0000"+DCDe+gs_name+DCDe+getTag()+DCDe+v;
//_dbg("sendPost()");
clearTimeout(gs_chatHandle);
//xargs=grep(xargs," ","+");
exeXml("_xchat.asp",xargs,"sendpost");
//window.open("_xchat.asp?"+xargs);;
}


function getTag(/* is_tagAdd */) {
var ls_size = 2;
var ls_tagAdd = arguments[0];
if( ls_tagAdd == null ) ls_tagAdd = gs_name;
var ls_fg = gs_fg;
var ls_bg = gs_bg; 
return  "%23" + ls_bg
  + "%23" + ls_fg 
  + "1" + ls_size + "0000000000%2C0%2C0%2C0%2C1%2C" 
  + ls_size + "%2C0%2C0%2C0%2C%23" + ls_bg
  + "%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0"
  + "%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%24%7C%7C%24%20" + escape(ls_tagAdd);
}

var gs_chatHandle;

function killChat(){gs_chatHandle=window.clearTimeout(gs_chatHandle);}

function getPosts() {
var xargs='r='+gs_room+'&h='+cleanName(gs_name);
if(gs_time!='')xargs+='&t='+gs_time;
//_dbg("getPosts() gDelay="+gDelay);
clearTimeout(gs_chatHandle);
exeXml("_xchat.asp",xargs,"getposts");
//window.open("_xchat.asp?"+xargs);;
}

function cleanName(s) { return s.replace( /[^A-Z0-9]/gi, '' ); }

function ffAddz( is_time, is_room, is_posts, i_x, in_number ) { displayPosts(is_posts); gs_time = is_time; gn_number = in_number; }


//------------- user popup stuff --------------------
function userPopup(e,name,targetpost){
if(!e)e=window.event;
//if(name==null){
// if(!e)e=window.event;
// var lo_element=e.srcElement||e.target;
// name=lo_element.id;
// while(!name){
//  lo_element=lo_element.parentNode;
//  name=lo_element.id;
//}}
_obj('userPopupName').innerHTML=name;
//alert(name+","+gs_name+","+targetpost);;
if(name==gs_name&&targetpost){
 _obj('itemPopupDel').style.display = 'block';
 _obj('userPopupIggy').style.display = 'none';
 _obj('userPopupUnIggy').style.display = 'none';
}else{
 _obj('itemPopupDel').style.display = 'none';
 if( go_iggyList.contains(name) ) {
  _obj('userPopupIggy').style.display = 'none';
  _obj('userPopupUnIggy').style.display = 'block';
 }else{
  _obj('userPopupIggy').style.display = 'block';
  _obj('userPopupUnIggy').style.display = 'none';
}}
//if( go_markedList.contains(name) ) {
// _obj('userPopupMarked').style.display = 'none';
// _obj('userPopupUnMarked').style.display = 'block';
//}else{
// _obj('userPopupMarked').style.display = 'block';
// _obj('userPopupUnMarked').style.display = 'none';
//}
var lo_popup = _obj('userPopup');  
_visible(lo_popup);
var ln_mx, ln_my;
try{
if(e.pageX||e.pageY){
  ln_mx = e.pageX;
  ln_my = e.pageY;
}else{
  if(e.clientX||e.clientY){
   ln_mx = e.clientX + document.body.scrollLeft	+ document.documentElement.scrollLeft;
 	 ln_my = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}}
}catch(e){ln_mx=ln_my=200;}
lo_popup.style.left = (ln_mx + 20) + 'px';
lo_popup.style.top = (ln_my - 20) + 'px';
gs_targetName=cleanName(name);
gs_targetPost=(targetpost)?targetpost:0;
//if(e)e.cancelBubble = true;
}


function closeUserPopup(ib_refresh) { _invisible(_obj('userPopup')); if(ib_refresh)chatPulse(0); }
function deletePost(is_post) { var o = _obj(is_post); o.parentNode.removeChild(o); }
function getName() { cleanName(gs_name); }



//===================== NUMBER LIST ======================================

function zNumberList() { this.list = '';  this.numbers = new Array(); }
zNumberList.prototype.load = function (is_list) {
  this.clear();
  if( is_list == null ) return;
  var la_list = is_list.split(',').sort();
  for( var i = la_list.length - 1; i >= 0 ; i-- ) {
    if( la_list[i] == null || la_list[i] == '' ) continue;
    this.numbers.binAdd( la_list[i] );
    this.list += ',' + la_list[i]; 
  }
}
String.prototype.trims=function(){return this.replace(/\s/g,"");}
zNumberList.prototype.getList = function() { return this.list; }
zNumberList.prototype.reload  = function() { this.load(this.list); }
zNumberList.prototype.clear   = function() { this.numbers = new Array(); this.list = ''; }
zNumberList.prototype.toArray = function() { return this.list.split(','); }
zNumberList.prototype.contains = function(s) { return (this.numbers.binSearch(s) != -1); }
zNumberList.prototype.add = function(is_name) {
  if(is_name=='')return false;
  if(this.contains(is_name))return true;
  if(this.list!='')this.list+=',';
  this.list+=is_name;
  this.numbers.binAdd(is_name);
  return true;
}
zNumberList.prototype.remove = function(is_name) {
  var ls_name, la_list=this.list.split(',');
  for( var i = la_list.length - 1; i >= 0; i-- ) {
    if(la_list[i]==null)continue;
    if(la_list[i]==is_name){ls_name=(i==0)?la_list[i]:','+la_list[i];}
  }
  if(ls_name!=null)this.list=this.list.replace(ls_name,'');
  this.numbers.binRemove(is_name);
  refreshNumberList();
}
zNumberList.prototype.refreshList = function(typ) {

}
zNumberList.prototype.toHtml = function() {
  var es_html = '', la_list = this.list.split(',');
  if( this.listOut == null ) return;
  if( !la_list ) return;
  for( var i = la_list.length - 1; i >= 0; i-- ) {
    if( la_list[i] == null || la_list[i] == '' ) continue;
    es_html += this.listOut(la_list[i]);
  }
  return es_html;
}


function iggyListOut(name) {
return '<div class="list_item" onclick="userPopup(event,\''
  + name + '\');viewIgnoreList();">' 
  + name + '</div>';
}

function markedListOut(name) {
return '<div class="list_item" onclick="userPopup(event,\''
  + name + '\');viewMarkedList();">'
  + name + '</div>';
}


function iggy(name) { go_iggyList.add(name);saveSettings();}
function uniggy(name) { go_iggyList.remove(name);saveSettings(); }
function markUser(name) { go_markedList.add(name);saveSettings(); }
function unmarkUser(name) { go_markedList.remove(name);saveSettings(); }


function viewIgnoreList() { viewNumberList('iggy','Ignored&nbsp;', '', go_iggyList.toHtml(), clearIgnoreList); }
function clearIgnoreList() { go_iggyList.clear(); viewIgnoreList(); chatPulse(0); }
function viewMarkedList() { viewNumberList('marked','Marked&nbsp;', '', go_markedList.toHtml(), clearMarkedList); }
function clearMarkedList() { go_markedList.clear(); viewMarkedList(); chatPulse(0); }


function refreshNumberList(){
var o=document.getElementById('numberList');
if(o.style.visibility!='hidden'){
 if(document.getElementById('numberListTyp').innerHTML=='iggy')viewIgnoreList();
 else viewMarkedList();
}}

function viewNumberList(typ, is_title, is_tip, is_html, if_clear) {
_visible(document.getElementById('numberList')); 
document.getElementById('numberListTyp').innerHTML=typ; 
document.getElementById('numberListContent').innerHTML = is_html;
document.getElementById('numberListTitle').innerHTML = is_title;
document.getElementById('numberListTitle').title = is_tip;
document.getElementById('numberListClear').onclick = if_clear;
}  

function closeNumberList() { _invisible(document.getElementById('numberList')); }

function closePopups(){
closeColorPicker();
closeUserPopup();
closeNumberList();
}




//--------- array functions ---------
Array.prototype.remove = function(s){ for(var i = this.length - 1; i >= 0; i--) { if( this[i] == s ) this.splice(i, 1); } }
Array.prototype.binAdd = function(s) { this.splice(this.binSearch( s, true ),0,s) };
Array.prototype.binRemove = function(s) { this.splice(this.binSearch(s,true),1); }
Array.prototype.binSearch = function(v, i){
    var h = this.length, l = -1, m;
    while(h - l > 1) if(this[m = h + l >> 1] < v) l = m; else h = m;
    return (this[h] != v) ? (i ? h : -1) : h;
    
}




// ========================= Window Functions =================================

function _invisible(o){ o.style.visibility = 'hidden'; }
function _visible(o) { o.style.visibility = 'inherit'; }
function xy(s) { window.status = s; }

function updateTitle() {
//document.title='GonzoChat!';
}



function _onResize() { go_listArea.style.height = _winHeight() - getElementTop(go_listArea) + 'px'; }

function _winWidth() {
  if(self.innerHeight) { return self.innerWidth; }
  if(document.documentElement && document.documentElement.clientHeight) { return document.documentElement.clientWidth; }
  if(document.body) { return document.body.clientWidth; }
}

function _winHeight() {
  if(self.innerHeight) { return self.innerHeight; }
  if(document.documentElement && document.documentElement.clientHeight) { return document.documentElement.clientWidth; }
  if(document.body) { return document.body.clientHeight; }
}


function _loon(){
_obj("fxLoon").innerHTML="<object><param name='movie' value='loon.swf'><embed src='loon.swf'></embed></object>";
}





/**************************************************
 *  from chatpulse.js 
 **************************************************/

var gs_pulseHandle,gs_lastRoom,gs_lastRoomUsers;

function startChatPulse(){chatPulse(0); gs_pulseHandle = window.setInterval("chatPulse(0)", 15000);}

function killChatPulse(){gs_pulseHandle = window.clearInterval(gs_pulseHandle);}

function chatPulse(oldroom){
var tmp=(oldroom!=0)?"&oldroom="+oldroom:"";
exeXml("_xpulse.asp","nick="+gs_name+"&r="+gs_room+tmp,"pulse");
}

function updOnline(items){
var x,a,i,itm,name,xname,cnt,html;
var la_rooms=new Array(),la_users=new Array(),rooms=',',users=',';
items=items.split(',');
for(i=0;i<items.length;i++){
 x=items[i];
 if(x){
  if(x.charAt(0)=='$'){
   itm=x.substr(4);
   x=x.substr(1,2)+itm;
   if(!_in(rooms,","+itm+",")){
    rooms+=itm+",";
    la_rooms.push(x); 
   }
  }else{
   if(!_in(users,","+x+",")){
    users+=x+",";
    la_users.push(x); 
   }
}}}
la_rooms.sort();
la_users.sort(alphaComp);
//---rooms---
html='';
for(i=0;i<la_rooms.length;i++){
 x=la_rooms[i];
 name=x.substr(2);
 cnt=99-parseInt(x.substr(0,2));
 xname=(name==gs_room)?"<span class=currentitem>"+name+"</span>":name;
 html+='<div class="listRoom" onclick="javascript:goToRoom(\''
   + name + '\');" title="Go to room \'' 
   + name + '\'..."><div class="mini">' 
   + cnt + '</div>&nbsp;-&nbsp;'
   + xname + '</div>';
}
go_roomArea.innerHTML=html;
//---users---
html='';
var newuser=0;
for(i=0;i<la_users.length;i++){
 name=la_users[i];
 if(go_iggyList.contains(name))xname="<span style='text-decoration:line-through;color:gray;'>"+name+"</span>";
 else{
  //if(go_markedList.contains(name))xname="<b><span style='color:red;'>*</span>"+name+"</b>";
  //else xname=(name==gs_name)?"<span class=currentitem>"+name+"</span>":name;
  xname=name;

  //--- check if new user? ----
  if(!newuser && gs_lastRoomUsers){
   var user_found=0;
   for(var ixn=0;ixn<gs_lastRoomUsers.length;ixn++){
    if(gs_lastRoomUsers[ixn]==name)user_found=1;
   }
   if(!user_found)newuser=1;
  }
 }
 html+='<div class="listName" onclick="userPopup(event,\''+name+'\');">&nbsp;'+xname+'</div>';
}
if(newuser)_loon();
go_listArea.innerHTML=html;
gs_lastRoomUsers=la_users;
}


function alphaComp(a,b){ 
try{
  a = a.toLowerCase(); 
  b = b.toLowerCase(); 
  if( a < b ) { return -1; }
  if( a > b ) { return 1; }
}catch(e){}
return 0;}


/**************************************************
 *  from display.js 
 **************************************************/



function checkKey(e) {
var ls_keyCode,ls_pm,lo_element;
ls_keyCode = e.keyCode||e.which;
if(ls_keyCode!="13")return;
lo_element = e.srcElement||e.target;
switch(lo_element.id){
  case "msgBox": case "sendBtn":
   clickPost();
   break;
  case "roomBox":
   gs_room=lo_element.value=cleanName(lo_element.value);
   goToRoom(gs_room); break;
  case "nameBox":
   lo_element.value=cleanName(lo_element.value);
   if(gs_name!=lo_element.value){
    gs_name=lo_element.value;
    saveSettings();
   }
   break;
}}



//==================== DISPLAY POSTS ==========================================

var ga_postBuffer = new Array();
var gAutoPlay=1;  //temp way to only start one video???  this definitely has problems!!!!

function displayPosts(is_buffer) {
  var dingdong=0;
  var loonPlayed=0,iggy;
  var lo_chatPosts = go_chatPosts;
  var lr_pc    = /pc@\S+/;
  var lr_pm    = /pm@\S+/;
  var lr_pr    = /pr@\S+/;
  is_buffer = is_buffer.replace( '!&!', '\\', 'g' );
  var la_postBuffer = ga_postBuffer;
  var la_posts = is_buffer.split(DCX);
  is_buffer = null;
  var lo_cell, lo_row, ls_fg, ls_bg, ls_cleanName;
  var la_post, ls_position, ls_userId, ls_xName, ls_tag, txt, ln_newlen, ls_size;
  var ls_html = '';
  var ls_postId;
  for( var i = la_posts.length - 1; i > 0; i--) {
    la_post = la_posts[i].split(DCD);
    if( la_post.length != 5 )continue; 
    ls_position = la_post[0];
    ls_userId   = la_post[1];
    ls_xName    = la_post[2];
    ls_tag      = la_post[3];
    txt         = la_post[4];
    if( txt.length < 1 )continue;
    ls_cleanName = ls_xName;
    iggy=(go_iggyList.contains(ls_xName))?1:0;
    //ls_postId = ls_cleanName;
    ls_postId   = "ip"+ls_position;

    if(!iggy)txt=uncleanx(txt);    //???? moved from below

    if(txt.indexOf('pc@')==0){txt=txt.replace(lr_pc, '<b>PC: </b> [<span class=pmchat onclick="pvtChat(\''+ls_cleanName+'\')">accept</span>]&nbsp;&nbsp;[<span class=pmchat onclick="pvtChat(\''+ls_cleanName+'\',1)">decline</span>]&nbsp;&nbsp;');  if(!loonPlayed){_loon();loonPlayed=1;} }
    if(txt.indexOf('pm@')==0){txt=txt.replace(lr_pm, '<b>PM: </b> [<span class=pmchat onclick="pvtMsg(\''+ls_cleanName+'\')">reply</span>]&nbsp;&nbsp;' ); if(!loonPlayed){_loon();loonPlayed=1;} }
    if(txt.indexOf('pr@')==0){
     var a=txt.split("#"),rm=a[1];
     txt=txt.replace(lr_pr, '<b><font color=red>'+ls_cleanName+'</font> Has accepted a Private Chat: </b> [<span class=pmchat onclick="goToRoom(\''+rm+'\')">goto '+rm+'</span>]&nbsp;&nbsp;' );
     txt=txt.replace("#"+rm+"#","");
    }
    lo_row = lo_chatPosts.insertRow(0);
    lo_row.className = 'displayRow';
    lo_row.id        = ls_postId;
    la_postBuffer.binAdd( ls_postId );
    lo_cell = lo_row.insertCell(0);
    lo_cell.className        = 'nameCell'+iggy;
    if(!iggy){
     lo_cell.style.background = ls_tag.substring(0,7);
     lo_cell.style.color      = ls_tag.substring(7,14);
    }
    //alert(ls_cleanName+","+ls_xName);;

    //lo_cell.onclick = function(e) { userPopup(e); };

    //lo_cell.innerHTML = ls_xName;
    lo_cell.innerHTML = "<div onclick=\"userPopup(null,'"+ls_cleanName+"',"+ls_position+")\">" + ls_xName + "</div>";

    lo_cell = lo_row.insertCell(1);
    lo_cell.className        = 'textCell'+iggy;

    //if(!iggy)txt=uncleanx(txt);    //???? moved above pm stuff

    if(_ix(txt,"<img")!=0)lo_cell.style.paddingLeft="8px";

    if(_in(txt,">dingdong") && !dingdong){
     txt="<img src='bell.png' style='width:20px;'>";
     _loon();
    }

    lo_cell.innerHTML = '' + txt;
  }
  ga_postBuffer = la_postBuffer;
  limitPosts(gn_maxChatPosts);
}
 


function pmRow(is_text) {
var lo_row = go_chatPosts.insertRow(0);
lo_row.className = 'displayRow';
lo_row.id = gs_time + '_' + gn_number + getName();
ga_postBuffer.binAdd(lo_row.id);
var lo_cell = lo_row.insertCell(0);
lo_cell.className = 'nameCell';
lo_cell.style.background = "#"+gs_bg;
lo_cell.style.color      = "#"+gs_fg;
lo_cell.onclick          = function(e) { userPopup(e,gs_name); };
lo_cell.innerHTML        = gs_name;
lo_cell = lo_row.insertCell(1);
lo_cell.className = 'textCell';
lo_cell.style.paddingLeft= "8px";
if(_in(is_text,">dingdong")){
 is_text="<img src='bell.png' style='width:20px;'>";
 _loon();
}
lo_cell.innerHTML = '' + uncleanx(is_text);
}



function limitPosts(in_max) { 
  var lo_t = go_chatPosts, la_a = ga_postBuffer;
  for( var i = la_a.length - 1; i >= in_max; i-- ) { deletePost(la_a.pop()); }
  ga_postBuffer = la_a;
}


//========================== COLORS =====================================
var gs_colorMode='Fg';

function toggleColor(o){gs_colorMode=o.value=(o.value=="Fg")?"Bg":"Fg";}
function xz(clr){setColor(clr);}

function setColor(clr,mode){
if(mode==null)mode=gs_colorMode;
switch(mode){
 case 'Fg': gs_fg=clr;break;
 case 'Bg': gs_bg=clr;break;
}
var o=_obj("isample").style;
o.color="#"+gs_fg;
o.background="#"+gs_bg;
}



//========================== UTILITY =====================================
function _in(x,v){x=''+x;if(!x)return false;if(_ix(x,v)>-1)return true;return false;}
function _ix(x,v){if(x==null)return -1;return x.indexOf(v);}


