TagHandler = {
  tags : [],
  callback : false,
  prefix : "0t_",
  lTrim : function(str) {
    var re = /\s*((\S+\s*)*)/;
    return str.replace(re, "$1");
  },
  rTrim : function(str) {
    var re = /((\s*\S+)*)\s*/;
    return str.replace(re, "$1");
  },
  trim : function(str) {
    return TagHandler.lTrim(TagHandler.rTrim(str));
  },
  remove_tag : function(n) {
    TagHandler.tags.splice(n,1);
    TagHandler.renderTags();
    if (TagHandler.callback) {
      TagHandler.callback();
    }
  },
  add_tag : function(str) {
    var str2 = str.replace(/[!@#$%&\(\)_+=\{\}\[\]|\\<">,\?\/\^\*;:]+/g, " ");
    str2 = TagHandler.trim(str2);
    str2 = str2.replace(/(\s)+/g, " ");
    str2 = str2.replace(/^\s+/, '');
    str2 = str2.replace(/\s+$/, '');
    if (str2=="")
      return;
    TagHandler.tags.push(str2);
    TagHandler.renderTags();
    if (TagHandler.callback) {
      TagHandler.callback();
    }
  },
  renderTags : function() {
    var s = "";
    if (!TagHandler.tagprompt)
    {
			TagHandler.tagprompt=LocStrings['My Tags:'];
		}
    for (var i = 0; i < TagHandler.tags.length; i++) {
      s += "<span style='color:#5da251'>"+TagHandler.tags[i] +"</span> <a style='color:#bababa;cursor:pointer' onclick='TagHandler.remove_tag("+ i + ")'>[x]</a> ";
    }
    if (s != "") {
      s = "<span>"+TagHandler.tagprompt+" </span>" + s;
    }
    document.getElementById("tagdisplay").innerHTML = s;
  },
  typetag : function (field, raw) {
    var value = raw ? field.getRawValue() : field.getValue();
    if (value == '') return;
    var myarr = value.split(",");
    for(i=0;i<myarr.length;i++) {
      myarr[i] = TagHandler.trim(myarr[i]);
      TagHandler.add_tag(myarr[i]);
    }
    field.setValue("");
  },
  onSpecialKey : function(field, event) {
    if (!event || (event.getKey() == Ext.EventObject.ENTER)) {
      TagHandler.typetag(field, true);
    }
  },
  addTagClicked : function() {
    TagHandler.typetag(Grouply.get('newtag'), true);
  },
  splitTags : function(taglist, splitby) {
    if (!splitby)
    {
      splitby = ' ';
    }
    
    TagHandler.tags = [];
    
    if (taglist.length) {
      var tagar = taglist.split(splitby);
      for (var i = 0; i < tagar.length; i++) {
        var t = tagar[i];
        if (TagHandler.prefix && t.indexOf(TagHandler.prefix) == 0) {
          t = t.substring(TagHandler.prefix.length);
          t = t.replace(/_/g, " ");
        }
        TagHandler.tags.push(t);
      }
    }
  },
  joinTags : function(joinby) {
    if (!joinby)
    {
      joinby = ' ';
    }
    
    var a = [];
    for (var i = 0; i < TagHandler.tags.length; i++) {
      var t = TagHandler.tags[i];      
      if (TagHandler.prefix)
      {
        t = t.replace(/\s/g, "_");
        t = TagHandler.prefix + t;
      }
      a.push(t);
    }
    return a.join(joinby);
  },
  init : function(callback) {
    var tagbox = Grouply.get("newtag");
    if (tagbox) {
      tagbox.on("specialKey", TagHandler.onSpecialKey, TagHandler);
    }
    TagHandler.callback = callback;
  }
}
