var tags = {}
var usertags = {}
var votevals = {}


function externalLinks() {
 if (!document.getElementsByTagName) return;
 var anchors = document.getElementsByTagName("a");
 for (var i=0; i<anchors.length; i++) {
   var anchor = anchors[i];
   if (anchor.getAttribute("href") &&
       anchor.getAttribute("rel") == "external")
     anchor.target = "_blank";
 }
}

window.onload = externalLinks;


function makeHandleOnReadyStateChange(XmlHttp,div) {
	return function() {
		if (XmlHttp.readyState == 4) {
			if (XmlHttp.status == 200) {
				$(div).innerHTML=XmlHttp.responseText;
			}
		}
	}
}

function makeResponseFunction(XmlHttp,func) {
	return function() {
		if (XmlHttp.readyState == 4) {
			if (XmlHttp.status == 200) {
				func(XmlHttp)
			}
		}
	}
}


function asyncLoadDiv(url,postdata,div) {
	this.req=getRequestObj();
	if (this.req) {
		if (div!=null) {
			this.req.onreadystatechange = makeHandleOnReadyStateChange(this.req,div);
		}
		this.req.open("POST", url, true);
		this.req.setRequestHeader('Content-Type',
			'application/x-www-form-urlencoded');
		this.req.send(postdata);
	}
}

function ajax(url,postdata,returnFunc) {
	this.req=getRequestObj();
	if (this.req) {
		if (returnFunc!=null) {
			this.req.onreadystatechange = makeResponseFunction(this.req,returnFunc);
		}
		this.req.open("POST", url, true);
		this.req.setRequestHeader('Content-Type',
			'application/x-www-form-urlencoded');
		this.req.send(postdata);
	}
}

function getRequestObj() {
	req = false;
	if(window.XMLHttpRequest) {
		try {
			req = new XMLHttpRequest();
		} catch(e) {
			req = false;
		}
	}
	else
		if(window.ActiveXObject) {
			try {
				req = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
					req = new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e) {
					req = false;
				}
			}
		}
	return req
}

function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element =
				document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}

function getQueryString(args) {
	var retval='';
	for (var i=0;i<args.length;i++) {
		retval+=args[i]+'&';
	}
	retval=retval.substring(0,retval.length-1);
	return retval;
}

function getRadioValue(radio) {
	var buttons=document.forms['logform'][radio];
	if (buttons==null) buttons=document.forms[0][radio];
	var retval='';
	if (buttons) {
		var l=buttons.length;
		for (var i=0;i<l;i++) {
			if(buttons[i].checked) retval = buttons[i].value
		}
	}
	return retval;
}

function $F(field) {
	return document.forms['logform'][field].value;
}


function toggleRatetags() {
	ratetags=getElementsByClass('rate',document,'a');
	for (i = 0; i < ratetags.length; i++) {
		toggle(ratetags[i]);
	}
}

function disable_arrows() {
	ratetags=getElementsByClass('rate',document,'a');
	for (i = 0; i < ratetags.length; i++) {
		ratetags[i].href="javascript:o()";
	}
}

function hideSaveLinks() {
	var savelinks=getElementsByClass('savelink',document,'a');
	for (i = 0; i < savelinks.length; i++) {
		$(savelinks[i]).style.display = 'none';
	}
}

function hide_mark_links() {
	var mark_links=getElementsByClass('mark_link',document,'a');
	for (i = 0; i < mark_links.length; i++) {
		$(mark_links[i]).style.display = 'none';
	}
}

function hideSaved() {
	var saved=getElementsByClass('saved',document,'span');
	for (i = 0; i < saved.length; i++) {
		$(saved[i]).style.display = 'none';
	}
}

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function registerReturn(req) {
	var parts=req.responseText.split(',');
	if (parts[0]=='1') {
		if (parts.length>1) {
			var autologinid=parts[1];
			setCookie('autologinid',autologinid,180);
		}
		location=location;
		return;
    }
	if (parts.length>1) {
		$('loginresults').innerHTML=parts[1]
	}
}

function login(postdata) {
	req=getRequestObj();
	req.onreadystatechange = loginReturn;
	req.open("POST", '/login', true);
	req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	req.send(postdata);
}

function loginReturn(req) {
			var response=req.responseText;
			var parts=response.split(',');
			if (parts[0]=='1') {
				if (parts.length>1) {
					var autologinid=parts[1];
					setCookie('autologinid',autologinid,180);
				}					
				location='/hot';
				return;
			}
 			$('loginresults').innerHTML=req.responseText;
}


function logout() {
	ajax('/logout', '', null);
	toggle('useractions');
	toggle('loginbox');
	toggle('logout');
  disable_arrows();
	hideSaveLinks();
	hideSaved();
    hide_mark_links();
    //location='/hot';
}

function logoutReturn() {
	var ready=req.readyState;
	if (ready==4) {
		var status=req.status;
		if (status==200) {
			toggle('useractions');
			toggle('loginbox');
			toggle('logout');
			toggle('submitstory');
			toggleRatetags();
		}
	}
}
	
function loginOrRegister() {
	var loginOrReg=getRadioValue('loginOrReg');
	var autologin=document.forms['logform'].autologin;
	if (autologin.checked) autologin='1';
	else autologin='0';
	var username=$F('username');
	if (username.length==0) {
		$('loginresults').innerHTML="<b>username is blank!</b>";
		return false;
	}
	var password=$F('password');
	if (password.length==0) {
		$('loginresults').innerHTML="<b>password is blank!</b>";
		return false;
	}
	var postdata='username='+encodeURIComponent(username);
  postdata+='&password='+encodeURIComponent(password);
	postdata+='&autologin='+autologin;
  postdata+='&version=1.1';
	if (loginOrReg=='register') {
		ajax('/register',postdata,registerReturn);
	}
	if (loginOrReg=='login') {
		ajax('/login',postdata,loginReturn)
	}
}
function vote(sbid,dir) {
	if ($('usernamedisplay').innerHTML=='') {
		return;
	}
  var isbid = parseInt(sbid);
  var voteval = votevals[isbid];
  var votebal = votes[isbid];
	if (dir=="down") {
		$('up'+sbid+'img').src='/static/up.png'
    if (voteval!=-1) {
	    votes[isbid] = votebal - voteval - 1
      if (votes[isbid] < 0) {
         //$('votebal'+sbid).style.color = "red";
         //$('votebal'+sbid).style['fontSize'] = "14pt";
      }
      votevals[isbid] = -1
      $('votebal'+sbid).innerHTML=''+votes[isbid];

    }
	}
	if (dir=="neutral") {
		$('up'+sbid+'img').src='/static/up.png'
	}
	if (dir=="up") {
		$('up'+sbid+'img').src='/static/upvoted.png'
    if (voteval!=1) {
	    votes[isbid] = votebal - voteval + 1
      if (votes[isbid] >= 0) {
         //$('votebal'+sbid).style.fontSize = "18pt";
         //$('votebal'+sbid).style.color = "blue";
      }
      votevals[isbid] = 1
      $('votebal'+sbid).innerHTML=''+votes[isbid];
    }
	}
  if (votes[isbid]==1) {
     $('votelabel'+sbid).innerHTML='vote';
  } else {
     $('votelabel'+sbid).innerHTML='votes';
  }
	var postdata='sbid='+sbid+'&dir='+dir;
	ajax('/vote',postdata,null);
}

function setCookie(NameOfCookie, value, expiredays) {
	var ExpireDate = new Date ();
	ExpireDate.setTime(ExpireDate.getTime() + (expiredays * 24 * 3600 * 1000));
	document.cookie = NameOfCookie + "=" + escape(value) +
		((expiredays == null) ? "" : "; expires=" + ExpireDate.toGMTString());
}

function getCookie(NameOfCookie) { 
	if (document.cookie.length > 0) { 
		begin = document.cookie.indexOf(NameOfCookie+"=");
		if (begin != -1) { 
			begin += NameOfCookie.length+1;
			end = document.cookie.indexOf(";", begin);
			if (end == -1) end = document.cookie.length;
			return unescape(document.cookie.substring(begin, end)); 
		}
	}
	return null;
}


function clickSend(sbid)
{
	var postdata="sbid="+sbid;
	ajax('/click', postdata, null);
}

function save(sbid)
{
	var postdata="sbid="+sbid;
	toggle($('save'+sbid));
	toggle($('saved'+sbid));
	ajax('/save', postdata, null);
}

function mark(sbid, markval)
{
	var postdata="sbid="+sbid;
    postdata+="&markval="+markval;
    if (markval=="read") {
        $('a'+sbid).style.color='#ef2a24';
    } 
    if (markval=="unread") {
        $('a'+sbid).style.color='#4768b1';
    }
	//toggle($('read'+sbid));
	//toggle($('unread'+sbid));
	ajax('/mark', postdata, null);
}



function toggle(obj) {
	var el = $(obj)
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = '';
	}
	
}

function initialUnhide() {
	toggle('logname');
}

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + //all caps
"abcdefghijklmnopqrstuvwxyz" + //all lowercase
"0123456789+/="; // all numbers plus +/=


function encode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
   
   return output;
}

function prompt_login() {
    alert('Please login or register to vote.');
}
function o() {
    scroll(0,0);
	el = document.getElementById("overlay");
	el.style.visibility = (el.style.visibility == "visible") ? "hidden" : "visible";
	el = document.getElementById("popup");
	el.style.visibility = (el.style.visibility == "visible") ? "hidden" : "visible";
    document.getElementById('loginresults').innerHTML='';
    var innerHTML=document.getElementById('loginbox').innerHTML;
    document.getElementById('loginbox').innerHTML=document.getElementById('popuplogin').innerHTML;
    document.getElementById('popuplogin').innerHTML=innerHTML;
}

function hov(loc,cls){
	if(loc.className)
		loc.className=cls;
}

function validate_comment(form, msg) {
  var comment_text = document.forms[form].comment_text.value;
  //comment_text = strip_spaces(comment_text);
  //alert(comment_text);
  if (all_spaces(comment_text) || comment_text=='') {
     document.getElementById(msg).style.display='';
     return false;
  }
  document.forms[form].submit();
  return true;
}

function all_spaces(mystr) {
  for (var i=0; i<mystr.length; ++i) {
    if (mystr.charAt(i)!=' ') return false;
  }
  return true;
}

function show_reply_form(cmid) {
  //var other_forms = getElementsByClass('comment_form');
  //for (i = 0; i < other_forms.length; i++) {
  //  other_forms[i].style.display = 'none';
  //}
  var form_name = 'comment_form' + cmid;
  var form = $(form_name);
  form.style.display='';
  var href = $('reply' + cmid);
  href.style.display='none';
}

function hide_reply_form(cmid) {
  //var other_forms = getElementsByClass('comment_form');
  //for (i = 0; i < other_forms.length; i++) {
  //  other_forms[i].style.display = 'none';
  //}
  var form_name = 'comment_form' + cmid;
  var form = $(form_name);
  form.style.display='none';
  var href = $('reply' + cmid);
  href.style.display='';
}

function show_edit_tags_form(sbid) {
    var form_name = 'edit_tags_form' + sbid;
    var form = $(form_name);
    //$('tags_edit_text'+sbid).innerHTML=$('tags'+sbid).innerHTML;
    $('tags_edit_text'+sbid).value='';
    form.style.display='';
    var input_field = $('tags_edit_text'+sbid);
    input_field.focus();
}

function hide_edit_tags_form(sbid) {
    var form_name = 'edit_tags_form' + sbid;
    var form = $(form_name);
    form.style.display='none';
}

function vote_comment(cmid,dir) {
	if (dir=="down") {
		$('down_comment'+cmid+'img').src='/static/downvoted.png'
		$('up_comment'+cmid+'img').src='/static/up.png'
	}
	if (dir=="up") {
		$('down_comment'+cmid+'img').src='/static/down.png'
		$('up_comment'+cmid+'img').src='/static/upvoted.png'
	}
	var postdata='cmid='+cmid+'&dir='+dir;
	ajax('/vote_comment',postdata,null);
}

function clean(s) {
    var cleaned = '';
    var allowed_chars = /[0-9a-z, .]/;
    for (var i=0; i<s.length; ++i) {
        if (allowed_chars.test(s.charAt(i))) {
            cleaned += s.charAt(i);
        }
    }
    return cleaned;
  }


function validate_tags(sbid) {
    var input_field = 'tags_edit_text' + sbid;
    var tags_to_add = $(input_field).value;
    if (tags_to_add!='') {
        tags_to_add = clean(tags_to_add.toLowerCase());
        var pat = new RegExp(" *[, ] *");
        var new_tags = tags_to_add.split(pat)
        for (var n=0;n<new_tags.length;++n) {
            if (!inlist(new_tags[n],usertags[sbid])) {
                usertags[sbid].splice(0,0,new_tags[n]);
            }
        }
        var postdata = 'sbid='+sbid+'&tags=' + tags_to_add;
        ajax('/process_edit_tags',postdata,null);
    }
    $('edit_tags_form'+sbid).style.display='none';
    update_tag_display(sbid)
}

function show_delete_tags_form(sbid) {
    var form_name = 'delete_tags_form' + sbid;
    var form = $(form_name);
    //$('tags_edit_text'+sbid).innerHTML=$('tags'+sbid).innerHTML;
    $('tags_edit_text'+sbid).value='';
    var delspan = $('delete_tags_html'+sbid);
    delspan.innerHTML='';
    var input_node;
    var checkbox_text;
    var sometext = document.createTextNode('thi is some text');
    //input_node.appendChild(sometext)
    for (var i=0; i<usertags[sbid].length; ++i) {
        input_node = document.createElement('input');
        input_node.setAttribute('type','checkbox');
        input_node.setAttribute('name',usertags[sbid][i]);
        input_node.setAttribute('class','tag_delete_checkbox');
        delspan.appendChild(input_node);
        checkbox_text = document.createTextNode(usertags[sbid][i]);
        delspan.appendChild(checkbox_text);
        delspan.appendChild(document.createElement('br'));
    }
    form.style.display='';
}

function hide_delete_tags_form(sbid) {
    var form_name = 'delete_tags_form' + sbid;
    var form = $(form_name);
    form.style.display='none';
}

function delete_tags(sbid) {
    var delspan = $('delete_tags_html'+sbid);
    var kids = delspan.childNodes;
    var postdata = 'sbid='+sbid+'&tags=';
    for (var k=0;k<kids.length;++k) {
    	try {
            if (kids[k].checked) {
                tag = kids[k].getAttribute('name')
                postdata += tag+' ';
                remove_user_tag(sbid, tag);
            }
		} catch(e) {
			
		}
        
    }
    hide_delete_tags_form(sbid);
    update_tag_display(sbid);
    ajax('/delete_tags',postdata,null);
}

function remove_user_tag(sbid, tag) {
    var new_list = [];
    for (t = 0;t<usertags[sbid].length;++t) {
        if (usertags[sbid][t]!=tag) new_list.splice(0,0,usertags[sbid][t]);
    }
    usertags[sbid]=new_list; //replace the usertags
}

function inlist(elem, list) {
    for (var i=0;i<list.length;++i) {
        if (elem==list[i]) return true;
    }
    return false;
}

function update_tag_display(sbid) {
    var newtags = [];
    for (var t=0; t<tags[sbid].length; ++t) {
        var tag=tags[sbid][t];
        var taglink=sprintf('<a class="tag_sub_link" href="/hot?tags=%s">%s</a>',tag,tag);
        if (inlist(tags[sbid][t], usertags[sbid])) {
            newtags.splice(0,0,taglink+'<sup>2</sup>');
        } else {
            newtags.splice(0,0,taglink);
        }
    }
    for (var t=0; t<usertags[sbid].length; ++t) {
        var tag=usertags[sbid][t];
        var taglink=sprintf('<a class="tag_sub_link" href="/hot?tags=%s">%s</a>',tag,tag);
        if (!inlist(usertags[sbid][t], tags[sbid])) {
            newtags.splice(0,0,taglink+'<sup>1</sup>');
        }
    }
    newtags.sort()
    $('tags'+sbid).innerHTML=newtags.join(' ');
    if (usertags[sbid].length>0) {
        $('delete_tag'+sbid).style.display='';
    } else {
        $('delete_tag'+sbid).style.display='none';
    }
}
    
function sprintf(){
	var parts=arguments[0].split('%s');
	var l=parts.length;
	var k=arguments.length;
	var retval=parts[0];
	for (i=1;i<l; i++) {
		if (i<k) retval+=arguments[i];
		retval+=parts[i];
	}
	return retval;
}



