RelatedTags = {}

RelatedTags.user_tags = []

RelatedTags.recent_tags = []

RelatedTags.recent_search = {}

RelatedTags.title = []

RelatedTags.append = ""


RelatedTags.init = function(user_tags) {
	
  RelatedTags.user_tags = user_tags.match(/\S+/g)
  
  this.recent_tags = Cookie.get("recent_tags").match(/\S+/g)
  if (this.recent_tags)
  {
      this.recent_tags = this.recent_tags.sort().uniq(true)
  }
  else
  {
      this.recent_tags = []
  }
  
  RelatedTags.title = ""
  

  RelatedTags.build_all_advanced({})
 
}

RelatedTags.toggle = function(link, field) {
  var field = $(field)
  var tags = field.value.match(/\S+/g) || []
  var tag = link.innerHTML

  if (tags.include(tag)) {
    field.value = tags.without(tag).join(" ") + " "
  } else {
    field.value = tags.concat([tag]).join(" ") + " "
  }

  RelatedTags.build_all(RelatedTags.recent_search)
  return false
}



RelatedTags.toggle_advanced = function(link, field) {
  var field = $(field)
  var tags = field.value.match(/\S+/g) || []
  var tag = (link.innerText || link.textContent).replace(/ /g, "_")

  if (tags.include(tag)) {
    field.value = tags.without(tag).join(" ") + " "
  } else {
    field.value = tags.concat([tag]).join(" ") + " "
  }

  RelatedTags.build_all_advanced(RelatedTags.recent_search)
  return false
}

RelatedTags.convert_related_js_response_advanced = function(resp) {
  var converted = {}
  
  for (k in resp) {
    var tags = resp[k].map(function(x) {return x[0]+":"+x[1]})
    converted[k] = tags
  }
  
  return converted
}


RelatedTags.build_html_advanced = function(key, tags) {
  if (tags == null || tags.length == 0) {
    return ""
  }
  
  
  var html = ""
  var current = $F("post_tags").match(/\S+/g) || []

  html += '<div class="tag-column">'
  var is_tree = false
  if(key.substr(0, 4) == "Tree"){is_tree = true}
  if(key == "Related Tags"){tags.sort()}
  if(is_tree == false){html += '<h6><em>' + key + '</em></h6>'}
  
  for (i=0; i<tags.length; ++i) {
    var split_tag = tags[i]
	var tag = split_tag.substr(0, split_tag.length -2)
	var tag_type = split_tag.substr(split_tag.length -1, 1)
	
	var text_type = "tag-type-normal"
	if(tag_type == "5")text_type = "tag-type-copyright"
	else if(tag_type == "4")text_type = "tag-type-character"
	else if(tag_type == "3")text_type = "tag-type-artist"
	
	if(is_tree && i!=0)html += "&nbsp;&nbsp;"
    html += ('<a class = "' + text_type + '" href="/post/index?tags=' + encodeURIComponent(tag) + '" onclick="RelatedTags.toggle_advanced(this, \'post_tags\'); return false"')
    
    if (current.include(tag)) {
      if(tag_type == "5") html += ' style="background: rgb(170, 0, 170); color: white;"'
	  else if(tag_type == "4") html += ' style="background: rgb(0, 170, 0); color: white;"'
	  else if(tag_type == "3") html += ' style="background: rgb(170, 0, 0); color: white;"'
	 
	  else html += ' style="background: rgb(0, 111, 250); color: white;"'
    }
    
    html += '>' + tag.escapeHTML().replace(/_/g, " ") + '</a><br> '
  }
  html += '</div>'

  return html
}

RelatedTags.build_all_advanced = function(tags) {
	
  RelatedTags.recent_search = tags
  
  var html = "";
  
  if(RelatedTags.title != "")
  {
	  html = "<h5>" + RelatedTags.title  + "</h5>"
  }
  
  html += this.build_html_advanced("My Tags", this.user_tags) + this.build_html_advanced("Recent Tags", this.recent_tags)
  
  var keys = []

  for (key in tags) {
    keys.push(key)
  }
     
  keys.sort()

  for (var i=0; i<keys.size(); ++i) {
	
    html += RelatedTags.build_html_advanced(keys[i], tags[keys[i]])
	
  }
  
  if(RelatedTags.append != ""){html += RelatedTags.append;}
  if(html == ""){html = "<em>None</em>";}
 
  
  $("related").innerHTML = html
}

RelatedTags.find_relative = function(field, type) {
  $("related").innerHTML = "<em>Fetching...</em>"
  RelatedTags.append = "";
  var field = $(field)
  var tags = field.value
  var type_param = ""
  if(tags == ""){$("related").innerHTML = "<em>No tags specfied to find relative</em>";return false;}
  
  if (type != null) {
    type_param = "&type=" + type
  }
  
  new Ajax.Request("/tags/relative", {
    method: 'get',
    parameters: "tags=" + tags,
    onComplete: function(res) {
	  //notice(res.responseText);
      var resp = eval("(" + res.responseText + ")")
	   if (resp["error"])
	   {
		 $("related").innerHTML = "<em>" + resp["reason"] + "</em>";
	   }
	   else
	   {
		 RelatedTags.title = "Copyright Trees"
         RelatedTags.build_all_advanced(RelatedTags.convert_related_js_response_advanced(resp))
	   }
    }
  })
}




RelatedTags.build_html = function(key, tags) {
  if (tags == null || tags.length == 0) {
    return ""
  }
  
  tags = tags.sort()
  var html = ""
  var current = $F("post_tags").match(/\S+/g) || []

  html += '<h5>' + key + '</h5>'
  html += '<p>'
  
  for (i=0; i<tags.length; ++i) {
    var tag = tags[i]
    html += ('<a href="/post/index?tags=' + encodeURIComponent(tag) + '" onclick="RelatedTags.toggle(this, \'post_tags\'); return false"')
    
    if (current.include(tag)) {
      html += ' style="background: rgb(0, 111, 250); color: white;"'
    }
    
    html += '>' + tag + '</a> '
  }
  html += '</p>'

  return html
}

RelatedTags.build_all = function(tags) {
	
  RelatedTags.recent_search = tags
  
  var html = "";
  var keys = []

  for (key in tags) {
    keys.push(key)
  }
     
  keys.sort()

  for (var i=0; i<keys.size(); ++i) {
	
    html += RelatedTags.build_html(keys[i], tags[keys[i]])
	
  }
  
  if(RelatedTags.append != ""){html += RelatedTags.append;}
  if(html == ""){html = "<em>None</em>";}
 
  
  $("related").innerHTML = html
}

RelatedTags.find = function(field, type) {
  $("related").innerHTML = "<em>Fetching...</em>"
  RelatedTags.append = "";
  var field = $(field)
  var tags = field.value
  var type_param = ""
  if(tags == ""){$("related").innerHTML = "<em>No tags specfied to find related</em>";return false;}
  
  if (type != null) {
    type_param = "&type=" + type
  }
  
  new Ajax.Request("/tags/related", {
    method: 'get',
    parameters: "tags=" + tags,
    onComplete: function(res) {
	  //notice(res.responseText);
      var resp = eval("(" + res.responseText + ")")
	   if (resp["error"])
	   {
		 $("related").innerHTML = "<em>" + resp["reason"] + "</em>";
	   }
	   else
	   {
         RelatedTags.build_all_advanced(RelatedTags.convert_related_js_response_advanced(resp))
	   }
    }
  })
}

RelatedTags.complete = function(field, type)
{
  $("related").innerHTML = "<em>Fetching...</em>"
  RelatedTags.append = "";
  var field = $(field)
  var tag = field.value
  var type_param = ""
  if(tag == ""){$("related").innerHTML = "<em>Please enter part of a tag.</em>";return false;}
 
  new Ajax.Request("/tags/complete", {
    method: 'get',
    parameters: "tag=" + tag,
    onComplete: function(res) {
	  
      var resp = eval("(" + res.responseText + ")")
	  	 
	  RelatedTags.build_all(RelatedTags.convert_related_js_response(resp))
	 
    }
  })
}

RelatedTags.check_danbooru = function(hash)
{
  $("related").innerHTML = "<em>Fetching...</em>"
  RelatedTags.append = "";
    
  new Ajax.Request("/tags/check_danbooru", {
    method: 'get',
    parameters: "hash=" + hash,
    onComplete: function(res) {
	  //notice(res.responseText);
      var resp = eval("(" + res.responseText + ")");
	  if (resp["success"])
	  {
		  RelatedTags.append = "<h5>Danbooru Source</h5>" + resp["source"];
		RelatedTags.build_all(RelatedTags.convert_related_js_response(resp["tags"]))
		
	  }
	  else
	  {
		  $("related").innerHTML = "<em>" + resp["reason"] +"</em>"
	  }
      
    }
  })
}

RelatedTags.convert_related_js_response = function(resp) {
  var converted = {}
  
  for (k in resp) {
    var tags = resp[k].map(function(x) {return x[0]}).sort()
    converted[k] = tags
  }
  
  return converted
}

RelatedTags.find_artist = function(url) {
  if (url.match(/^http/)) {
    new Ajax.Request("/artist/index.js", {
      method: "get",
      parameters: "url=" + url,
      onComplete: function(res) {
        var resp = eval(res.responseText)
        RelatedTags.build_all({"Artist": resp.map(function(x) {return x.name})})
      }
    })
  }
}
