/*
 * WebBook
 * Copyright (C) 2008 Hitomi Narusegawa
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

function printHide(id)
{
  document.write('<img src="'+base+'/img/open.png" onclick="javascript:forumHide(this, '+"'"+id+"'"+')" style="cursor: pointer" />&nbsp;');
}

function forumHide(img, id) {
  var e=document.getElementById('forum-row:body:'+id);
  if(e.style.display=="none") {
    img.src=base+"/img/open.png";
    e.style.display="";
  } else {
    img.src=base+"/img/close.png";
    e.style.display="none";
  }
}

function threadTextChange(id)
{
  var t = getElementByName('forum-row:text:'+id);
  var c = document.getElementById('forum-row:counter:'+id);
  var i = forum_max_char - t.value.length;
  c.innerHTML = i + " characters left";
  if (i<0) {
    t.style.color="#f80";
  } else {
    t.style.color="#000";
  }
}

function threadReply(id) {
  if (user_uid==0) {
    ajax('cmd=captcha&id='+escape(id), threadReplyCaptcha);
    return;
  }

  var e = document.getElementById('forum-row:ctrl:'+id);
  var t =
    '<textarea rows="8" cols="60" name="forum-row:text:'+id+'"></textarea><br />';
  if (forum_max_char>0)
  t=
    '<textarea rows="8" cols="60" name="forum-row:text:'+id+'" onkeyup="javascript:return threadTextChange('+"'"+id+"'"+')" onkeyup="javascript:return threadTextChange('+"'"+id+"'"+')"></textarea><br />'+
    '<div id="forum-row:counter:'+id+'">'+forum_max_char+' characters left</div>';
  t+=
    '<input class="button" type="submit" name="'+id+':comment" onclick="javascript:forumComment(\''+id+'\');return false;" value="comment" />'+
    '<input class="button" type="submit" name="'+id+':cancel" onclick="javascript:forumCancel(\''+id+'\');return false;" value="cancel" />'+
    '<input class="button" type="submit" onclick="javascript: forumHelp(this); return false;" value="help" />';
  e.innerHTML=t;
  getElementByName('forum-row:text:'+id).focus();
}

function threadReplyCaptcha(r)
{
  id=r['id'];
  cid=r['cid'];
  var e = document.getElementById('forum-row:ctrl:'+id);
/*
  img = new Image();
  img.src = base+'captcha.php5?id='+cid;
*/
  html=
    '<b>comment:</b><br />';
  if (forum_max_char>0)
    html+=
      '<textarea rows="8" cols="60" name="forum-row:text:'+id+'" onkeyup="javascript:return threadTextChange('+"'"+id+"'"+')" onkeyup="javascript:return threadTextChange('+"'"+id+"'"+')"></textarea><br />'+
      '<div id="forum-row:counter:'+id+'">'+forum_max_char+' characters left</div>';
  else
    html+=
      '<textarea rows="8" cols="60" name="forum-row:text:'+id+'"></textarea><br />';
  html+=
    '<b>your e-mail address (required):</b><br />'+
    '<input type="input" size="60" name="forum-row:email:'+id+'" /><br />'+
    '<img src="'+base+'/captcha.php5?id='+cid+'" border="0" id="captcha:img:'+id+'" width="130" height="65" alt="captcha" /><br />'+
    '<b>are you human? please type the letters from the image above:</b><br />'+
    '<input name="captcha:text:'+id+'" maxlength="6" size="7" />'+
    '<input name="captcha:id:'+id+'" type="hidden" value="'+cid+'" /><br />'+
    '<input class="button" type="submit" name="'+id+':comment" onclick="javascript:forumComment(\''+id+'\');return false;" value="comment" />'+
    '<input class="button" type="submit" name="'+id+':cancel" onclick="javascript:forumCancel(\''+id+'\');return false;" value="cancel" />'+
    '<input class="button" type="submit" onclick="javascript: forumHelp(this); return false;" value="help" />';
  e.innerHTML=html;
  e.style.border='1px #000000 dotted';
  e.style.background='#eeeeee';
/*
  e = document.getElementById('captcha:'+cid);
  e.src = img.src;
*/
}

forumOldValue = new Object();

function forumHelp(id)
{
  document.getElementById('help').style.display='';
}

function threadEdit(id) {
  var e;
  e = document.getElementById('forum-text:'+id);
  forumOldValue[id] = e.innerHTML;
  if (forum_max_char>0) {
    var txt=unformatText(e.innerHTML);
    e.innerHTML=
      '<textarea rows="8" cols="60" name="forum-row:text:'+id+'" onkeyup="javascript:return threadTextChange('+"'"+id+"'"+')" onkeyup="javascript:return threadTextChange('+"'"+id+"'"+')">'+
      txt+
      '</textarea>'+
      '<div id="forum-row:counter:'+id+'">'+(forum_max_char-txt.length)+' characters left</div>';
  } else {
    e.innerHTML=
      '<textarea rows="8" cols="60" name="forum-row:text:'+id+'">'+
      unformatText(e.innerHTML)+
      '</textarea>';
  }
  e = document.getElementById('forum-row:ctrl:'+id);
  e.innerHTML='<input class="button" type="submit" name="'+id+':change" onclick="javascript:forumChange(\''+id+'\');return false;" value="change" />'+
              '<input class="button" type="submit" name="'+id+':cancel" onclick="javascript:forumCancelEdit(\''+id+'\');return false;" value="cancel" />'+
              '<input class="button" type="submit" onclick="javascript: forumHelp(this); return false;" value="help" />';
  getElementByName('forum-row:text:'+id).focus();
}

function forumCancelEdit(id) {
  forumFinishEdit(id, forumOldValue[id]);
}

function forumFinishEdit(id, v)
{
  var e;
  e = document.getElementById('forum-text:'+id);
  e.innerHTML=v;
  e = document.getElementById('forum-row:ctrl:'+id);
  e.innerHTML='<input class="button" type="submit" value="edit" name="forum-edit:'+id+'" onclick="javascript: return threadEdit(\''+id+'\');return false;" />';
}

// convert to UTF8
function escape_utf8(s) {
  var r="";
  for(var i=0; i<s.length; ++i) {
    var c = s.charCodeAt(i);
    if (c<0x7f) {
      r+=String.fromCharCode(c);
    }
    else if (c<0x7ff) {
      r+=String.fromCharCode((c>>6)|0xc0)+
         String.fromCharCode((c&0x3f)|0x80);
    }
    else if (c<0xffff) {
      r+=String.fromCharCode((c>>12)|0xe0)+
         String.fromCharCode(((c>>6)&0x3f)|0x80)+
         String.fromCharCode((c&0x3f)|0x80);
    }
    else if (c<=0x1ffff) {
      r+=String.fromCharCode((c>>18)|0xf0)+
         String.fromCharCode(((c>>12)&0x3f)|0x80)+
         String.fromCharCode(((c>> 6)&0x3f)|0x80)+
         String.fromCharCode((c&0x3f)|0x80);
    }
    else if (c<=0x3ffffff) {
      r+=String.fromCharCode((c>>24)|0xf8)+
         String.fromCharCode(((c>>18)&0x3f)|0x80)+
         String.fromCharCode(((c>>12)&0x3f)|0x80)+
         String.fromCharCode(((c>> 6)&0x3f)|0x80)+
         String.fromCharCode((c&0x3f)|0x80);
    } else {
      r+=String.fromCharCode((c>>30)|0xfc)+
         String.fromCharCode(((c>>24)&0x3f)|0x80)+
         String.fromCharCode(((c>>18)&0x3f)|0x80)+
         String.fromCharCode(((c>>12)&0x3f)|0x80)+
         String.fromCharCode(((c>> 6)&0x3f)|0x80)+
         String.fromCharCode((c&0x3f)|0x80);
    }
  }
  return escape(r);
}

// convert from UTF8
function decode_utf8(s) {
  var r="";
  for(var i=0; i<s.length; ++i) {
    var c = s.charCodeAt(i), l=0;
    if (c<0x7f) {
    } else
    if ((c&0xe0)==0xc0) { // 110
      c &= 0x1f;
      l = 1;
    } else
    if ((c&0xf0)==0xe0) { // 1110
      c &= 0x0f;
      l = 2;
    } else
    if ((c&0xf8)==0xf0) { // 11110
      c &= 0x07;
      l = 3;
    } else {
      continue;
    }
    for(var j=0; j<l; ++j) {
      ++i;
      c <<= 6;
      c |= s.charCodeAt(i) & 0x3f;
    }
    r+=String.fromCharCode(c);
  }
  return r;
}

function forumChange(id) {
  try {
    var t = getElementByName('forum-row:text:'+id);
    ajax('cmd=change&id='+escape(id)+'&text='+escape_utf8(t.value)+'&auth='+user_authkey, forumChangeFinish);
  } catch(e) {
    alert(e.name + ": " + e.message);
  }
}

function forumChangeFinish(r)
{
  var id = r['id'];
  var txt = getElementByName('forum-row:text:'+id).value;
  forumFinishEdit(id, formatText(txt));
//  alert(r['comment']);
}

function forumCancel(id) {
  var e = document.getElementById('forum-row:ctrl:'+id);
  e.innerHTML='<input class="button" type="submit" value="comment" name="forum-reply:'+id+'" onclick="javascript:threadReply(\''+id+'\');return false;" />';
  e.style.border='';
  e.style.background='';
}

function forumComment(id) {
  try {
    var t = escape_utf8(getElementByName('forum-row:text:'+id).value);
    var ce = '';
    var ct = '';
    var ci = '';
    if (user_uid==0) {
      ce=escape_utf8(getElementByName('forum-row:email:'+id).value);
      ct=escape_utf8(getElementByName('captcha:text:'+id).value);
      ci=escape_utf8(getElementByName('captcha:id:'+id).value);
    }
    ajax('cmd=comment&id='+escape(id)+'&text='+t+'&email='+ce+'&ci='+ci+'&ct='+ct+'&auth='+user_authkey, forumCommentFinish);
  } catch(e) {
    alert(e.name + ": " + e.message);
  }
}

function forumCommentFinish(r)
{
  id=r['parent_id'];
  if (r['cid'] && r['cid']!='') {
    document.getElementById('captcha:img:'+id).src = base+'/captcha.php5?id='+r['cid'];
    getElementByName('captcha:id:'+id).value = r['cid'];
    alert(r['msg']);
    return;
  }
  var t;
  t = document.getElementById('forum-row:ctrl:'+id);
  t.innerHTML="";
  t.style.border='';
  t.style.background='';
  t = document.getElementById('forum-row:chld:'+id);
  t.innerHTML =
    '<div class="forum-row">'+
      '<b><i>you</i> replied</b><br />'+
      decode_utf8(r['text'])+'<br />'+
      '<div id="forum-row:ctrl:'+id+'"></div>'+
      '<div id="forum-row:chld:'+id+'"></div>'+
    '</div>'+
    t.innerHTML;
}

vote = new Object();

function printVote(id, state)
{
  if (!window.user_authkey)
    return;
  document.write(
    '<span id="vote:'+id+'">'+
      '<img onclick="javascript:forumVote(\''+id+'\',1);" src="'+base+'/img/up.png" width="14" height="15" />'+
      '<img onclick="javascript:forumVote(\''+id+'\',0);" src="'+base+'/img/down.png" width="14" height="15" />'+
    '</span>');
  forumSetState(id, state);
}

function forumVote(id, kind)
{
//  alert(id+": "+vote[id]);
  if (kind==0) {
    if (vote[id]==-1)
      return;
  } else {
    if (vote[id]==1)
      return;
  }
  ajax('cmd=vote&id='+escape(id)+'&kind='+escape(kind)+'&auth='+user_authkey, forumVoteFinish);
}

function forumVoteFinish(r)
{
  var id=r['unique_id'];
  forumSetState(id, parseInt(r['rate']));
  var t = document.getElementById('pts:'+id);
  t.innerHTML=r['pts'];
};

function forumSetState(id, state)
{
  vote[id]=state;
  var t = document.getElementById('vote:'+id);
  switch(state) {
    case -1:
      t.childNodes[0].src=base+"/img/up.png";
      t.childNodes[1].src=base+"/img/down0.png";
      break;
    case 0:
      t.childNodes[0].src=base+'/img/up.png';
      t.childNodes[1].src=base+'/img/down.png';
      break;
    case 1:
      t.childNodes[0].src=base+'/img/up0.png';
      t.childNodes[1].src=base+'/img/down.png';
      break;
    default:
      alert('forumSetState: unknown state: '+state);
  }
}

function formatText(a)
{
  var a0;
  a=a.replace(/&/g, '&amp;')
     .replace(/</g, '&lt;')
     .replace(/>/g, '&gt;')

     .replace(/\*(.+?)\*/g, '<b>$1</b>')
     .replace(/_(.+?)_/g, '<i>$1</i>')
     
     .replace(/(http:\/\/[^ \t\n"<>]*)/g, '<a href="$1">$1</a>')
     
     .replace(/^\* ([^\n]*)\n/g, "<ul><li>$1</li></ul>\n")
     .replace(/^\* (.*)$/,  "<ul><li>$1</li></ul>")
     .replace(/\n\* (.*)$/, "\n<ul><li>$1</li></ul>");
  do {
    a0 = a;
    a=a.replace(/\n\*([^\n]*)\n/, "\n<ul><li>$1</li></ul>\n");
  } while(a0!=a);
  a=a.replace(/<\/ul>\n/g, '</ul>')
     .replace(/<\/ul><ul>/g, '')

     .replace(/^&gt; ([^\n]*)/, '<div class="blockquote">$1</div>')
     .replace(/\n&gt; (.*)$/, '\n<div class="blockquote">$1</div>')
     .replace(/<\/ul>&gt; ([^\n]*)/, '</ul><div class="blockquote">$1</div>');
  do {
    a0 = a;
    a = a.replace(/\n&gt; ([^\n]*)/, '\n<div class="blockquote">$1</div>');
  } while(a0 != a);
  a=a.replace(/<\/div>\n<div class="blockquote">/g, "\n")
     .replace(/<\/div>\n/g, '</div>')

     .replace(/\n/g, "<br />");

  return a;
}

function unformatText(a)
{
  a=a.replace(/\n/g, "")
     .replace(/\r/g, "")
     .replace(/<[bB][rR] \/>/g, "\n")
     .replace(/<[bB][rR]\/>/g, "\n")
     .replace(/<[bB][rR]>/g, "\n")
     .replace(/<[dD][iI][vV] /g, "<div ")
     .replace(/<div [cC][lL][aA][sS][sS]=[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE]/g, '<div class="blockquote"')
     .replace(/<\/[dD][iI][vV]>/g, "</div>");

  do {
    a0=a;
    a=a.replace(/<div class="blockquote">([^\n]*)\n(.*?<\/div>)/, '<div class="blockquote">$1</div><div class="blockquote">$2')
  } while(a0!=a);
  a=a
  a=a.replace(/<div class="blockquote">(.*?)<\/div>/g, '> $1\n')

  a=a.replace(/<[iI]>(.+?)<\/[iI]>/g, "_$1_")
     .replace(/<[bB]>(\S+?)<\/[bB]>/g, "*$1*")
     
     .replace(/<[aA][^>]*>/g, "")
     .replace(/<\/[aA][^>]*>/g, "")

     .replace(/<[uU][lL]>/g, "")
     .replace(/<\/[uU][lL]>/g, "")

     .replace(/<[lL][iI]>(.*?)<\/[lL][iI]>/g, "* $1\n")

     .replace(/\n$/g, '')
     ;
/*
  a=a.replace(/&/g, '&amp;')
     .replace(/</g, '&lt;')
     .replace(/>/g, '&gt;')
     .replace(/\n/g, '\\n');
*/
  return a;
}

var lock=false;

function ajax(vars, callbackFunction) {
  var request;
  var url=base+'/ajax.php5';

  if (lock)
    return;

  lock = true;

  if (window.XMLHttpRequest) {
    request = new XMLHttpRequest();
  } else {
    try { request = new ActiveXObject("MSXML3.XMLHTTP"); } catch(e) {}
    if (!request)
      try { request = new ActiveXObject("MSXML2.XMLHTTP.3.0"); } catch(e) {}
    if (!request)
      try { request = new ActiveXObject("MSXML2.XMLHTTP"); } catch(e) {}
    if (!request)
      try { request = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
    if (!request) {
      alert("Your browser does not support an XMLHttpRequest alternative.");
      lock = false;
      return;
    }
  }

  request.open("POST", url, true);
  request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

  request.onreadystatechange = function() {
    if(request.readyState == 4 && request.status == 200) {
      if(request.responseText){
//alert(request.responseText + "\n" + request.status);
        var r=new Object;
        var i0=0;
        while(true) {
          var i1=request.responseText.indexOf("=",i0);
          if(i1==-1) break;
          var k=unescape(request.responseText.substring(i0,i1));
          i0=i1+1;
          i1=request.responseText.indexOf("\n",i0);
          if(i1==-1)break;
          r[k]=unescape(request.responseText.substring(i0,i1));
          i0=i1+1;
        }
/*
var e = document.getElementById('debug');
e.value = request.responseText + '<' + r['parent_id'] + '>';
*/
        if (request.responseText.substring(i0,i0+5)=="<ok>\n") {
          callbackFunction(r);
        } else
        if (request.responseText.substring(i0,i0+8)=="<error>\n") {
          alert("Server error: " + r['msg']);
        } else {
	  alert(request.responseText + "\n" + request.status);
	}
      }
      lock = false;
    } else 
    if (request.readyState==4) {
      alert("Server error " + request.status + ":\n" + request.responseText);
      lock = false;
    }
  };
  request.send(vars);
}

function getElementByName(name)
{
  var e = document.getElementsByName(name)[0];
  if(!e) {
    e = msieGetElementByName(name, document);
  }
  return e;
}

function msieGetElementByName(name, node)
{
  if(node.nodeType == 1) { 
    if (name == node.name) {
      return node;
    }
  }
  var children = node.childNodes;
  for(var i=0; i < children.length; i++) { 
    var nnode = msieGetElementByName(name, children[i]);
    if(nnode != null)
      return nnode;
  }
  return null;
}
