function AJAXComment(id, opt) {

  this.id=id;
  
  /**
   * Save the comment
   */
  this.save = function() {

    var me=this;
    var cm = document.getElementById("comment$" + this.id);
    if(cm.value=="" || cm.value==AJAXComment.defaultText) return;
    
    var ar = new ICAJAX();
    var qrData = "id=" + this.id + "&comment=" + encodeURIComponent(AJAXComment.encodeHTML(cm.value));

    ar.send({url:opt.saveUrl, method:"post", data: qrData, onComplete:function(reg){me.onSaveComplete({"reg":reg});} });
    
    document.getElementById("comment_progress$"+this.id).style.display="block";
    document.getElementById("btnComment$"+this.id).disabled=true;
    cm.disabled = true;
    
  };

  /**
   * Load complete.   
   * @param ev, object. Properties: reg=xmlhttprequest object.
   */
  this.onSaveComplete=function(ev) {

    var resp = ev.reg.responseText;
    var respObj = eval("(" + resp + ")");


    var feed = document.createElement("DIV");
    feed.innerHTML = respObj.comment;
    document.getElementById("feed_content$" + this.id).appendChild(feed);
    
    document.getElementById("comment_progress$"+this.id).style.display="none";
    document.getElementById("btnComment$"+this.id).disabled=false;    
    var cm = document.getElementById("comment$" + this.id);
    cm.disabled = false;
    cm.value="";
    cm.focus();
    NlsAutoGrowTextbox.objs[cm.id].keyup();
  };

  /**
   * Load comment.   
   * @param arg, object. 
   *    -loadUrl, load comment url
   *    -xtra, object properties: -
   *           -container, container where the comment will be rendered.
   */
  this.load = function(arg) {

    var me=this, surl="", xtra=null;

    surl=opt.loadUrl + "?id=" + this.id;

    if(arg) {
      surl += "&" + arg.qrData;
      xtra = arg.xtra;
    }


    var ar = new ICAJAX();
    ar.send({url:surl, method:"get", "xtra":xtra,
             onComplete:function(reg){
                          var ev = {"reg":reg, "xtra":this.xtra};
                          me.onLoadComplete(ev);
                        } 
           });
    var p = document.getElementById('comment_load_progress$' + this.id);
    if(p) p.style.display='block';           
  };

  /**
   * Load complete.   
   * @param ev, object. Properties: reg=xmlhttprequest object, xtra= any data object.
   */
  this.onLoadComplete=function(ev) {

    var cnt = "feed_content$" + this.id;
    if(ev.xtra && ev.xtra.container) {
      cnt = ev.xtra.container
    }
    var cm = document.getElementById(cnt);
    var resp = ev.reg.responseText;
    cm.innerHTML = resp;

  };
  
   /**
   * Delete comment item.   
   * @param cmId, id of comment item.
   */ 
  this.deleteItem = function(cmId) {
    
    var surl = opt.delUrl + "?cmid=" + cmId  ;
    
    var ar = new ICAJAX();
    ar.send({url:surl, method:"get",
             onComplete:function(reg){
                            var resp = reg.responseText;
                            var respObj = eval("(" + resp + ")");
                            if(respObj.status==0) {
                                var p = document.getElementById('comment_item$' + cmId);
                                p.parentNode.removeChild(p);
                            } else if (respObj.status == 1) {
                                alert(respObj.message);
                            }
                        }
            });     
    var p = document.getElementById('comment_delete_progress$' + cmId);
    if(p) p.style.display='block';
  };

  this.loadItem=function(cmId) {
    var surl = opt.itemUrl + "?cmid=" + cmId;    
    var ar = new ICAJAX();
    ar.send({url:surl, method:"get",
             onComplete:function(reg){
                            var resp = reg.responseText;
                            var p = document.getElementById('comment_item$' + cmId);
                            p.innerHTML = resp;                           
                        }
            });     
    var p = document.getElementById('comment_load_item_progress$' + cmId);
    if(p) p.style.display='block';    
  };

  AJAXComment.objs["$" + this.id] = this;

};

AJAXComment.objs={};

AJAXComment.encodeHTML=function(s) {
  return s.replace(/\&/gi,"&amp;").replace(/</gi,"&lt;").replace(/>/gi,"&gt;");
};

AJAXComment.defaultText = "Write a comment...";

AJAXComment.run=function(opt) {

  var re = /comment\$([\S]+)/gi;

  var a = document.getElementsByTagName("TEXTAREA");

  for(var i=0;i<a.length;i++) {

    if(a[i].id.match(re)) {
      
      AJAXComment.defaultText = a[i].value;
      if(opt.defaultText) AJAXComment.defaultText = opt.defaultText;
      var c = new AJAXComment(RegExp.$1, opt);
      NlsAutoGrowTextbox.replaceTextbox(a[i], opt);
    }

  }

};

AJAXComment.onFocus=function(obj) {
  var re = /comment\$([\S]+)/gi;
  obj.id.match(re);
  var tid = RegExp.$1;

  var elm = document.getElementById("comment$" + tid);
  if(elm) elm.className="comment_edit_textarea";
  elm = document.getElementById("comment_edit_avatar$" + tid);
  if(elm) elm.style.display="";
  elm = document.getElementById("btnComment$" + tid);
  if(elm) elm.style.display="";
};

AJAXComment.onBlur=function(obj, atg) {
  if(obj.value!=atg.defText) return;

  var re = /comment\$([\S]+)/gi;
  obj.id.match(re);
  var tid = RegExp.$1;

  var elm = document.getElementById("comment$" + tid);
  if(elm) elm.className="comment_edit_textarea_idle";
  elm = document.getElementById("comment_edit_avatar$" + tid);
  if(elm) elm.style.display="none";
  elm = document.getElementById("btnComment$" + tid);
  if(elm) elm.style.display="none";
};


