function putFocus(formInst, elementInst) {
    if ($('#searchBox').size() > 0) $('#searchBox').get(0).focus();
}


function getInternetExplorerVersion() {
    var rv = -1; // Return value assumes failure
    if (navigator.appName == 'Microsoft Internet Explorer') {
        var ua = navigator.userAgent;
        var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat( RegExp.$1 );
    }
    return rv;
}


//---------------------------------


function AddSearchPlugin() {
    window.sidebar.addSearchEngine(
            "http://metaglossary.com/MetaFox/MetaFox.src",
            "http://metaglossary.com/MetaFox/MetaFox.png",
            "MetaFox", 
            "Glossary"
            );
    var msg = "Installation complete. Please select MetaGlossary from the ";
    msg += "search bar in the upper-right hand corner of FireFox.";
    alert(msg);
}


function AddFavorite() {
    window.external.AddFavorite(document.location.href, document.title); 
}


function AddToDelicious() {
    var url = 'http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url=';
    url += encodeURIComponent(location.href) + '&amp;title=' 
    url += encodeURIComponent(document.title)
    window.open(url, 'delicious','toolbar=no,width=700, height=400');
}


function AddIE7Plugin(){
    window.external.AddSearchProvider("http://MetaGlossary.com/MetaFox/MetaGlossary.xml");
}

//----------------------------------------------------------------------------


function toggleSubmission(clusterId) {
	if(!isLoggedIn) {
        showLoginReg();
        return;
    }
    $('#submitDiv' + clusterId).toggle();
    $('#zippyDown' + clusterId).toggle();
    $('#zippyRight' + clusterId).toggle();
}


function markVoted(direction, defId) {
    setNodeAttribute('scoreDiv' + defId, "previousVote", direction);

    if (direction > 0) {
        $('#UnclickedUp' + defId).hide();
        $('#ClickedUp' + defId).show();
        $('#UnclickedDown' + defId).show();
        $('#ClickedDown' + defId).hide();
    } else {
        $('#UnclickedUp' + defId).show();
        $('#ClickedUp' + defId).hide();
        $('#UnclickedDown' + defId).hide();
        $('#ClickedDown' + defId).show();
    }
}

function submitVote(direction, defId) {
    if(!isLoggedIn) {
        showLoginReg(partial(submitVote, direction, defId));
        return;
    }
    //prevents pressing the other arrow
    var prevVote = $('#scoreDiv' + defId).attr("previousVote") || 0;
    if (prevVote == direction)
        return;
    markVoted(direction, defId);

    var oldScore = parseInt($('#scoreDiv' + defId).html());
    //prevVote gets canceled out, so subtract it
    var newScore = oldScore + direction - prevVote;
    $('#scoreDiv' + defId).html(newScore + "");
    
	$('#msg' + defId).html("Thank you for voting!");
    $.ajax({
	    url: '/submitVote/',
	    type: 'POST',
	    data: {"isPlus": direction > 0, "defId": defId}
	});
	// Wait 5 seconds and remove
	setTimeout(function(){$('#msg' + defId).html("");}, 5000);
}


function showEmailDef(defId)
{
	if(!isLoggedIn) {
		showLoginReg();
        return;
    }
	$('#email' + defId).toggleClass('hidden').find('input').get(0).focus();
}


function _submitDef(url, fields, suffix) {
    //show BusySubmitDef (take identified)
    $('#Busy' + suffix).show();
    var success = function() {
        //toggleSubmission(suffix);
        //TODO: Don't page refresh, do this client-side
        $('#Busy' + suffix).hide();
	    window.location.reload(true);
    };
    if(!fields['dtext']){
        $('#Busy' + suffix).hide();
        toggleSubmission(suffix);
        return;
    }
    var deferred = loadJSONDoc(url, fields);
    deferred.addCallbacks(
            success,
            partial(alert, "Sorry, your definition was not received."));
}


function submitDef(cluster) {
    if(!isLoggedIn) {
        showLoginReg(partial(submitDef, cluster));
        return;
    }

    def = MochiKit.DOM.$("textarea" + cluster).value;
    _submitDef("/submitDef/", {"dtext": def, "cid": cluster}, cluster)
}


function submitCluster(term) {
    //TODO: Refactor out all these userLoggedIn checks
    if(!isLoggedIn) {
        showLoginReg(partial(submitTerm, term));
        return;
    }
    def = MochiKit.DOM.$("textarea-1").value;
    _submitDef("/submitTerm/", {"dtext": def, "term": term}, "-1")
}


function submitTerm(term) {
    if(!isLoggedIn) {
        showLoginReg(partial(submitTerm, term));
        return;
    }

    def = MochiKit.DOM.$("textarea").value;
    _submitDef("/submitTerm/", {"dtext": def, "term": term}, "")
}


function submitTags(term, tags) {
    if(!isLoggedIn) {
        showLoginReg(partial(submitTerm, term));
        return;
    }

    $('#BusyTag').show();
    var success = function() {
        $('#BusyTag').hide();
    }
    var failure = function() {
        $('#BusyTag').hide();
        alert("Sorry, your submission was not received.");
    }
    var deferred = loadJSONDoc('/submitTags/', {'term': term, 'tags': tags});
    deferred.addCallbacks(success, failure);
}


function removeTag(tagId) {
    if(!isLoggedIn) {
        showLoginReg(partial(submitTerm, term));
        return;
    }

    removeElement("tag" + tagId);

    var success = function() {
    }
    var failure = function() {
        alert("Sorry, your submission was not received.");
    }
    var deferred = loadJSONDoc('/removeTag/', {'tagId': tagId});
    deferred.addCallbacks(success, failure);
}


function showSubmitTag(term, tag) {
    var li = "<li><a href=/terms/" + term + ">" + term + "</a>";
    li += "&nbsp;&nbsp;&nbsp;<a href='#'>X</a></li>";
    MochiKit.DOM.$('Ul' + tag).innerHTML += li;

    submitTags(term, tag);
}


function sendDefMail(form)
{
    $(form).ajaxSubmit({
        success: function(json){
        	$(form).parents('div.rpEmail').parent().find(".e_msg").html("Email sent!");
	    },
	    error: function(req, err, exc){
	    	$(form).parents('div.rpEmail').parent().find(".e_msg").html("Error sending email.");
	    }
    });
	// Wait for 5 seconds
	setTimeout(function(){
	  if ( req ) $(form).parents('div.rpEmail').parent().find(".e_msg").html("");
	}, 5000);
	return false;
}


function uponLogin(url)
{
	isLoggedIn = true;
    if(!isUndefinedOrNull(loginCallback))
    {
    	TB_remove();
		loginCallback();
    }
    window.location = url;
}


var loginOptions = {
    dataType: "json",
    beforeSubmit: function (formData, jqForm, options) {
        $('#LoginError').children().remove();
        $("#BusyLogin").show();
	    //let the server know it's a JS submit
	    formData.push({ 'name':  'dt', 'value': 'json'});
	    return true;
	},
    success: function(json){
    	if (json['url'])
        {
        	$('#LoginError').append($.DIV({}, json['msg'] || ''));
        	uponLogin(json['url']);
        }
        else if (json['errors'])
        {
        	var errors = json['errors'];
            for (var i in errors)
                $('#LoginError').append($.DIV({}, errors[i]));
        }
    },
    error: function(req, err, exc){
    	//shouldn't get here...
    	$('#LoginError').append($.DIV({}, "An unknown error occurred while trying to login. Please try again."));
    },
    complete: function(req, st){
    	$("#BusyLogin").hide();
    }
};


var registerOptions = {
    dataType: "json",
    beforeSubmit: function (formData, jqForm, options) {
        $('#RegError').html('');
        $("#BusyReg").show();
	    //let the server know it's a JS submit
	    formData.push({ 'name':  'dt', 'value': 'json'});
	    return true;
	},
    success: function(json){
    	if (json['url'])
        {
        	$('#RegError').append($.DIV({}, json['msg'] || ''));
        	uponLogin(json['url']);
        }
        else if (json['errors'])
        {
        	var errors = json['errors'];
            for (var i in errors)
                $('#RegError').append($.DIV({}, errors[i]));
        }
    },
    error: function(req, err, exc){
    	//shouldn't get here...
    	$('#RegError').append($.DIV({}, "An unknown error occurred while trying to register. Please try again."));
    },
    complete: function(req, st){
    	$("#BusyReg").hide();
    }
};


var forgotPasswordOptions = {
    dataType: "json",
    beforeSubmit: function (formData, jqForm, options) {
        $('#ForgotError').html('');
        $("#BusyForgot").show();
	    //let the server know it's a JS submit
	    formData.push({ 'name':  'dt', 'value': 'json'});
	    return true;
	},
    success: function(json){
    	if (json['url'])
        {
        	$('#ForgotError').append($.DIV({}, json['msg'] || ''));
			setTimeout(function(){
			  uponLogin(json['url']);
			}, 2000);
        }
        else if (json['errors'])
        {
        	var errors = json['errors'];
            for (var i in errors)
                $('#ForgotError').append($.DIV({}, errors[i]));
        }
    },
    error: function(req, err, exc){
    	//shouldn't get here...
    	$('#ForgotError').append($.DIV({}, "An unknown error occurred while trying to reset your password. Please try again."));
    },
    complete: function(req, st){
    	$("#BusyForgot").hide();
    }
};


var resetPasswordOptions = {
    dataType: "json",
    beforeSubmit: function (formData, jqForm, options) {
        $('#ResetError').html('');
        $("#BusyReset").show();
	    //let the server know it's a JS submit
	    formData.push({ 'name':  'dt', 'value': 'json'});
	    return true;
	},
    success: function(json){
    	if (json['url'])
        {
        	$('#ResetError').append($.DIV({}, json['msg'] || ''));
	        window.location = json['url'];
        }
        else if (json['errors'])
        {
        	var errors = json['errors'];
            for (var i in errors)
                $('#ResetError').append($.DIV({}, errors[i]));
        }
    },
    error: function(req, err, exc){
    	//shouldn't get here...
    	$('#ResetError').append($.DIV({}, "An unknown error occurred while trying to reset your password. Please try again."));
    },
    complete: function(req, st){
    	$("#BusyReset").hide();
    }
};


function showLoginReg(loginAction)
{
	loginCallback = loginAction;
	TB_show("Please Sign In", "/login/?a=fetch&height=480&width=380", false,
	   function(){
	       $('#LoginForm').ajaxForm(loginOptions);
	       $('#RegForm').ajaxForm(registerOptions);
	       $('#forgotForm').ajaxForm(forgotPasswordOptions);
	       $('#id_login_username').get(0).focus();
	   });
}

function addToList(select, term)
{
    if(!isLoggedIn) {
        showLoginReg();
        return;
    }
    
	if(select.value.length > 0)
	{
	    var options = {
            url : '/lists/addTerm/',
            type : 'POST',
            dataType : 'json',
            error : function(){
              alert("There was an error attempting to add the term to the list.");
            },
            success : function(){
                $('.rpListMsg').html($.DIV({}, 'Successfully tagged term!'));
                setTimeout(function(){$('.rpListMsg').html("");}, 5000);
            }
        };
	    
		if (select.value == '__NEW_LIST__')
		{
			//pop open a dialog for them to insert a value into
			var val = prompt('Please enter a new list name:', term);
			if (val && val.length > 0)
			{
			    options['data'] = {'tag':val, 'term':term};
			    $.ajax(options);
			    var opts = $(select).children();
			    var opt = $.OPTION({'value':val}, val);
			    $(opts[opts.size() - 2]).before(opt);
			    $(opt).attr('selected', 'true');
				//TODO sort the list
			}
		}
		else
		{
		    options['data'] = {'tag':select.value, 'term':term};
			$.ajax(options);
		}
	}
}


function removeSearches()
{
    if(!isLoggedIn) {
        showLoginReg();
        return;
    }
    
    $('.searchItem').find('input[@type=checkbox][@checked]').each(function(i){
        var name = this.name;
        $.ajax({
            url : '/searches/remove/',
            type : 'POST',
            data : {'term': name},
            dataType : 'json',
            success : function(){
                $('.searchItem').find('input[@type=checkbox][@checked][@name=' + name + ']').parents('.searchItem').remove();
            }
        });
    });
    return;
}


function initJS(loggedIn)
{
	isLoggedIn = loggedIn;
}

function initVoteLinks()
{
    $("span.vote").css({ cursor: "pointer" });
	$("span.vote").each(function(){
	   if (/^UnclickedUp(.*)/.test(this.id)){
	       $(this).hover(function(){
	           $(this).parents("td").siblings("td").children("span.vote_msg").html($.SPAN({"class":"up"},"I like this definition!"));
	       },function(){
	           $(this).parents("td").siblings("td").children("span.vote_msg").html("");
	       });
        }
        if (/^UnclickedDown(.*)/.test(this.id)){
            $(this).hover(function(){
                $(this).parents("td").siblings("td").children("span.vote_msg").html($.SPAN({"class":"down"},"I do not like this definition!"));
    	    },function(){
    	       $(this).parents("td").siblings("td").children("span.vote_msg").html("");
    	    });
        }
	});
}

function copyToClipboard(id)
{
    if ($('#flashcopier').size() == 0)
    	$($(document).find('div').get(0)).append($.DIV({'class':'hidden', 'id':'flashcopier'},''));
    var data = $('#' + id).html();
    var divinfo = '<embed src="/js/_clipboard.swf" FlashVars="clipboard='+escape(data)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
    $('#flashcopier').html(divinfo);
}


var updateListsOptions = {
    dataType: "json",
    beforeSubmit: function (formData, jqForm, options) {
	    //let the server know it's a JS submit
	    formData.push({ 'name':  'dt', 'value': 'json'});
	    return true;
	},
    complete: function(req, st){
    	$('#TagTermFormMsg').append($.DIV({'class':'darkOrange'}, 'Updated Lists!'));
    	setTimeout(function(){TB_remove();}, 2000);
    }
};


function showTagForm(term)
{
	if(!isLoggedIn) {
        showLoginReg();
        return;
    }
	
	TB_show("Add " + term + " To A Word List",
		"/lists/add/?a=fetch&term=" + escape(term) + "&height=300&width=380", false,
	   	function(){
	   	addNewList();
	   	$('#TagTermForm').ajaxForm(updateListsOptions);
	});
}

function addNewList()
{
	var div = $.DIV({'class':'tagListItem'}, $.INPUT({'name':'newList', 'type':'text'}));
	$('#newLists').append(div);
	$('#newLists').find('input:last').focus();
}