

function validateLogin() {

    if($('#username').val() === "" || $('#password').val() === "") {
        alert("Email address and password are required.");
    } else {
		return true;//form "validated"
    }

    return false;
}

function register() {
    var username = $('#regusername').val();
    var email = $('#regemail').val();
    var password = $('#regpassword').val();
    var password2 = $('#regpassword2').val();
    //clear out passwords, even if api call fails
    $('#password').val('');
    $('#password2').val('');
	//trim fields
	username = username.replace(/^\s+|\s+$/g, '');
	email = email.replace(/^\s+|\s+$/g, '');
	password = password.replace(/^\s+|\s+$/g, '');
    
    if(email.indexOf('@') === -1 || email.indexOf('.') === -1) {
        alert("Invalid email address.");
    } else if(username.length === 0) {
        alert("Usernname must not be blank.");
    } else if(username.length > 32) {
        alert("Usernname must not be blank.");
    } else if(username.indexOf('@') != -1) {
        alert("Username may not contain the @ symbol.");
    } else if (password === "") {
        alert("Invalid password.");
    } else if (password !== password2) {
        alert("Passwords don't match.");
    } else {
        //form validated
        var input = {};
        input["username"] = username;
        input["email"] = email;
        input["password"] = password;
        input["optin"] = $('#optin').is(':checked');
        
        var callback = function (data, textStatus) {
            if(data['success']) {
                $.cookie('token', data['token']);
                window.location = "/";
            } else {
                alert("Error registering: " + data['error']);
            }
        };
        
        api.post('register_user', input, callback);
    }
    
    return false;
}

// Home Screen

function showMyAccount() {
    $('.screen').hide();
    $('#screen_my_account').show();    
}

function changePassword() {
	
	var oldPass = $('#change_password_old').val();
	var newPass = $('#change_password_new').val();
	var newPass2 = $('#change_password_new2').val();
	
	if(oldPass == "" || newPass == "") {
		alert("Password can't be blank.");
	} else if(newPass !== newPass2) {
		alert("New passwords don't match.");
	} else {
		var input = {};
		input['old_password'] = oldPass;
		input['new_password'] = newPass;		
		var callback = function (data, textStatus) {
			if(data['success']) {
				alert("Your password has been changed.");
			} else {
				alert("Error changing password.");
			}
		};		
		api.post('change_password', input, callback);
		//clear old values
		$('#change_password_old').val('');
		$('#change_password_new').val('');
		$('#change_password_new2').val('');
	}
}

function changeUsername() {
	var newUsername = $('#change_username').val();
	if(newUsername == "") {
		alert("Username can't be blank.");
	} else if (newUsername.indexOf('@') != -1) {
		alert("Invalid character(s) in username.");
	} else {
		var input = {};
		input['new_username'] = newUsername;		
		var callback = function (data, textStatus) {
			if(data['success']) {
				$('#current_username').text(newUsername);
				alert("Your username has been changed.");
			} else {
				alert("Error changing your username.");
			}
		};		
		api.post('change_username', input, callback);		
	}
}

function showGettingStarted() {
    $('.screen').hide();
    $('#screen_getting_started').show();    
}

// Training Screen

function createTrainingSession() {
    var input = {};
	if($('#trainingwordlists').is(":visible")) {
		input['list_id'] = $('#trainingwordlists').val();
	} else {
		input['list_id'] = $('#trainingagainwordlists').val();
	}
    
    var callback = function (data, textStatus) {
		if(data['success']) {
			$('#pre_training').hide();
			$('#training_done').hide();
			$('#training').show();
			//alert("data: " + JSON.stringify(data));
			trainer.init(data['id'], data['words']);
		} else {
			alert("Error creating training session.");
		}
    };
    
    api.post('create_training_session', input, callback);
}

function getWordListsForTraining() {
	var input = {};
	var callback = function (data, textStatus) {
		if (data['success'] == false) {
			alert("Error getting word lists.\n" + data['error']);
		} else {
			var trainingwordlists = $("#trainingwordlists");
			var trainingagainwordlists = $('#trainingagainwordlists');
			var options = '';
			options += '<option id="wordlists_0" value="0">Auto-Select Words</option>';
			for(var i = 0; i < data['lists'].length; i++) {
				var list = data['lists'][i];
				if(list['count'] > 0) {
					options += '<option id="wordlists_' + list['id'] + '" value="' + list['id'] + '">' + list['name'] + '</option>';
				}
				
			}
			trainingwordlists.html(options);
			trainingagainwordlists.html(options);
		}
	};
	api.post('get_word_lists', input, callback);
	
}

function logTrainingResult(trainingSessionId, wordId, result, guess) {
    var input = {};
    input["training_session_id"] = trainingSessionId;
    input["word_id"] = wordId;
    input["result"] = result;
	guess = guess || "";
	input["guess"] = guess;
    
    var callback = function (data, textStatus) {};
    
    api.post('log_training_result', input, callback);
}

function endTrainingSession(stats) {
    var input = {};
    input["training_session_id"] = stats.trainingSessionId;
    
    var callback = function (data, textStatus) {
        //getTrainingSessionDetails(stats.trainingSessionId);
        getUserDashboard();
		getNewAchievements();
    };
    
    api.post('end_training_session', input, callback);
    $('#training').hide();
    $('#training_done').show();
    showTrainingSessionDetails(stats);
	setTimeout(function() { $('#train_again_btn').focus(); }, 10);//can't (directly) focus here because stupid IE will auto-click it
}

function showTrainingSessionDetails(stats) {
	var elapsedSec = Math.round((stats.endTime - stats.startTime) / 1000);
	$('#training_results_time_sec').text(elapsedSec);
	
	var words = [];
	var wordToId = {};
	for(var id in stats.wordsById) {
		if(typeof id == "string") {
			words.push(stats.wordsById[id].word);
			wordToId[stats.wordsById[id].word] = id;
		}
	}
	words.sort();
	
	var wordsTable = "<table border='1' cellspacing='0' cellpadding='2'>"
	wordsTable += "<tr><th> Word </th><th> Times Wrong </th><th> Study </th></tr>";//<th> Skill </th>
	//for(var i = 0; i < details['words'].length; i++) {
	for(var i = 0; i < words.length; i++) {
		var id = wordToId[words[i]];
		wordsTable += "<tr><td>" + makeDefinitionLink(stats.wordsById[id].word) + "</td>";
		//wordsTable += "<td align='right'>" + stats.wordsById[id].timesRight + "</td>";
		wordsTable += "<td align='right'>" + stats.wordsById[id].timesWrong + "</td>";
		wordsTable += "<td align='center'><input type='button' value='+ More' onclick='studyMore(" + id + ")' title='Study More' />&nbsp;";
		wordsTable += "<input type='button' value='- Less' onclick='studyLess(" + id + ")' title='Study Less' /></td></tr>";
	}
	wordsTable += "</table>";
	$('#training_results_words').html(wordsTable);
}

function makeDefinitionLink(word) {
	// also see: defineWord()
	return '<a href="http://www.merriam-webster.com/dictionary/' + word + '" target="dict" title="Define">' + word + '</a>';
}

function studyMore(id) {
    var input = {};
    input["word_id"] = id;
    
    var callback = function (data, textStatus) {
		$("#word_" + id + "_level").attr('src', 'images/level_' + data['level'] + '.png');
		//alert("new training level: " + data['level']);
    };
    
    api.post('study_word_more', input, callback);
}

function studyLess(id) {
    var input = {};
    input["word_id"] = id;
    
    var callback = function (data, textStatus) {
		$("#word_" + id + "_level").attr('src', 'images/level_' + data['level'] + '.png');
		//alert("new training level: " + data['level']);
    };
    
    api.post('study_word_less', input, callback);
}

function getUserDashboard() {
    var input = {};
    var callback = function (data, textStatus) {
        if (data['success']) {
			$('#business_today').text(data['points']['business_today']);
			$('#accuracy_today').text(Math.round(data['points']['accuracy_today'] * 1000));
			
			if (data['next_training']['test_now']) {
				$('#train_again').text("Try a test.");
			} else if (data['next_training']['train_now']) {
				$('#train_again').text("It's time to study.");
			} else if (data['next_training']['train_again_days'] == 1) {
				$('#train_again').text("Take a test and study tomorrow.");
			} else if (data['next_training']['train_again_days'] > 1) {
				$('#train_again').text("Study in " + data['next_training']['train_again_days'] + " days or take a test.");
			} else {
				var timeParts = data['next_training']['train_again_time'].split(':');
				var hours = Number(timeParts[0]);
				var minutes = Number(timeParts[1]);
				if (hours > 0) {
					$('#train_again').text("Study in " + (hours + 1) + " hours or take a test.");
				} else if (minutes > 1) {
					$('#train_again').text("Study in " + (minutes + 1) + " minutes.");
				} else {
					$('#train_again').text("Study in a minute.");
				}
			}
        }
    };
    api.post('get_user_dashboard', input, callback);
}

function incScore(value) {
    if(typeof value == "undefined")
        value = 1;
    //$('#points_total').text(Number($('#points_total').text()) + value);
    $('#business_today').text(Number($('#business_today').text()) + value);
}

// TEST pages

function createHundredWordTestSession() {
    var input = {};
    
    var callback = function (data, textStatus) {
		if(data['success']) {
			$('#pre_test').hide();
			$('#post_test').hide();
			$('#testing').show();
			//alert("data: " + JSON.stringify(data));
			tester.init(data['id'], data['words']);
		} else {
			alert("Error creating test session.");
		}
    };
    
    api.post('create_hundred_word_test_session', input, callback);
}

function createOneMinuteTestSession() {
    var input = {};
    
    var callback = function (data, textStatus) {
		if(data['success']) {
			$('#pre_test').hide();
			$('#post_test').hide();
			$('#testing').show();
			//alert("data: " + JSON.stringify(data));
			oneminutetester.init(data['id'], data['words']);
		} else {
			alert("Error creating test session.");
		}
    };
    
    api.post('create_one_minute_test_session', input, callback);
}

function logTestResult(testSessionId, wordId, result, guess) {
    var input = {};
    input["test_session_id"] = testSessionId;
    input["word_id"] = wordId;
    input["result"] = result;
	input["guess"] = (guess || "");
    
    var callback = function (data, textStatus) {};
    
    api.post('log_test_result', input, callback);
}

function endTestSession(stats) {
    var input = {};
    input["test_session_id"] = stats.testSessionId;
    
    var callback = function (data, textStatus) {
        getUserDashboard();
		getNewAchievements();
    };
    
    api.post('end_test_session', input, callback);
    $('#testing').hide();
    $('#post_test').show();
}


function getNewAchievements() {
	var input = [];
	var callback = function (data, textStatus) {
		var earned = data['achievements'];
		if(earned != null) {
			for(var i = 0; i < earned.length; i++) {
				showAchievmentEarned(earned[i]);
			}
		}
	};
	api.post('get_new_achievements', input, callback);
}

function addUserWord() {
	word = $('#user_add_word').val();
	if(word) {
		var input = {};
		input["word"] = word;
		var callback = function (data, textStatus) {
			if (data['success']) {
				$('#user_add_word').val('');
				alert("Added training word \"" + word + "\".");
				$('#user_add_word').focus();
				getNewAchievements();
				//TODO:if we're on the wordlists page, refresh and select 'Quick Add'
				//if($('#wordlists').is(':visible')) {
				//}
			} else {
				showUnrecognizedWordConfirmation(word, data['suggestions'], function (word) {
					if(word != null) {
						confirmAddUserWord(word);
					}
				});
			}
		};
		api.post('add_user_word', input, callback);
	}
}

function confirmAddUserWord(word) {
	if(word) {
		var input = {};
		input["word"] = word;
		input["confirmed"] = true;
		var callback = function (data, textStatus) {
			if (data['success']) {
				$('#user_add_word').val('');
				alert("Added training word \"" + word + "\".");
				getNewAchievements();
			} else {
				alert("Problem adding word \"" + word + "\".");
			}
		};
		api.post('add_user_word', input, callback);
	}
}

function changeNewsletterOptin() {
	var optin_cbx = $('#change_newsletter_optin');
	if (optin_cbx) {
		var input = {};
		input['optin'] = optin_cbx.is(':checked');
		var callback = function (data, textStatus) {
			if (data['success'] == false) {
				alert("Error saving change to newsletter opt-in.");
			}
		};
		api.post('change_newsletter_optin', input, callback);
	}
}

function getWordLists(autoSelectId) {
	var input = {};
	var callback = function (data, textStatus) {
		if (data['success'] == false) {
			alert("Error getting word lists.\n" + data['error']);
		} if (data['lists'].length === 0) {
			$("#wordlistsarea").hide();
			$('#wordlisteditor').hide();
		} else {
			$("#wordlistsarea").show();
			var options = '';
			//if nothing is set to auto-select, go with the first item
			if(!autoSelectId && data['lists'].length > 0) {
				autoSelectId = data['lists'][0]['id'];
			}
			for(var i = 0; i < data['lists'].length; i++) {
				var list = data['lists'][i];
				if(list['id'] == autoSelectId) {
					options += '<option id="wordlists_' + list['id'] + '" value="' + list['id'] + '" selected="selected">' + list['name'] + '</option>';
				} else {
					options += '<option id="wordlists_' + list['id'] + '" value="' + list['id'] + '">' + list['name'] + '</option>';
				}
			}
			$("#wordlists").html(options);
			$('#wordlisteditor').show();
			getWordListDetails(autoSelectId);
		}
	};
	api.post('get_word_lists', input, callback);
}

function createWordList() {
	var newListName = $("#newwordlist");
	if(newListName && newListName.val() != "") {
		var input = {};
		input['name'] = newListName.val();
		newListName.val('');
		var callback = function (data, textStatus) {
			if (data['success'] == false) {
				alert("Error creating word lists.\n" + data['error']);
			} else {
				getWordLists(data['id']);
				$("#newwordlist").focus();
			}
		};
		api.post('get_or_create_word_list', input, callback);
	}
}

function deleteWordList(wordListId) {
	var input = {};
	input['list_id'] = wordListId;
	var callback = function (data, textStatus) {
		if (data['success'] == false) {
			alert("Error deleting word lists.\n" + data['error']);
		} else {
			getWordLists();
		}
	};
	api.post('delete_word_list', input, callback);	
}

function deleteSelectedWordList() {
	deleteWordList($('#wordlists').val());
}

function getWordListDetails(wordListId) {
	var input = {};
	input['list_id'] = wordListId;
	var callback = function (data, textStatus) {
		if (data['success'] == false) {
			alert("Error getting word list details.");
		} else {
			$('#wordlistname').text(data['name']);
			$('#newword').val('');
			var options = '';
			for(var i = 0; i < data['words'].length; i++) {
				var word = data['words'][i];
				options += '<option value="' + word['id'] + '">' + word['word'] + '</option>';
			}
			var words = $("#words").html(options);
		}
	};
	api.post('get_word_list_details', input, callback);
}

function getSelectedWordList() {
	getWordListDetails($('#wordlists').val());
}

function renameWordList() {
	var selectedWordListId = $('#wordlists').val();
	var currentListName = $('#wordlistname').text();
	if(selectedWordListId) {
		var newListName = prompt("Rename word list to:", currentListName);
		if(newListName && newListName != currentListName) {
			var input = {};
			input['list_id'] = selectedWordListId;
			input['name'] = newListName;
			var callback = function (data, textStatus) {
				if (data['success'] == false) {
					alert("Error renaming word lists.\n" + data['error']);
				} else {
					getWordLists(data['id']);
				}
			};
			api.post('rename_word_list', input, callback);
		}
	}
}

function addNewWordToWordList() {
	var selectedWordListId = $('#wordlists').val();
	var word = $('#newwordlistword').val();
	$('#newwordlistword').val('');
	if(selectedWordListId && word != "") {
		var input = {};
		input['list_id'] = selectedWordListId;
		input['word'] = word;
		var callback = function (data, textStatus) {
			if (data['success']) {
				getWordListDetails(selectedWordListId);
				$('#newwordlistword').focus();
				getNewAchievements();
			} else if(data['error']) {
				alert("Error adding word to word list:\n" + data['error']);
			} else {
				showUnrecognizedWordConfirmation(word, data['suggestions'], function (word) {
					if(word != null) {
						confirmAddNewWordToWordList(selectedWordListId, word);
					}
				});
			}
		};
		api.post('add_word_to_word_list', input, callback);
	}
}

function confirmAddNewWordToWordList(wordListId, word) {
	if(wordListId && word != "") {
		var input = {};
		input['list_id'] = wordListId;
		input['word'] = word;
		input['confirmed'] = true;
		var callback = function (data, textStatus) {
			if (data['success']) {
				getWordListDetails(wordListId);
				$('#newwordlistword').focus();
				getNewAchievements();
			} else {
				alert("Error adding word to word list:\n" + data['error']);
			}
		};
		api.post('add_word_to_word_list', input, callback);
	}
}

function deleteSelectedWordListWord() {
	var selectedWordListId = $('#wordlists').val();
	var selectedWordId = $('#words').val();
	if(selectedWordListId && selectedWordId) {
		var input = {};
		input['list_id'] = selectedWordListId;
		input['word_id'] = selectedWordId;
		var callback = function (data, textStatus) {
			if (data['success'] == false) {
				alert("Error deleting word.\n" + data['error']);
			} else {
				getWordListDetails(selectedWordListId);
			}
		};
		api.post('delete_word_list_word', input, callback);	
	}
}

function disableDoubleClick() {
	//this function can be used on buttons that we don't want to allow people to double click on
	//it works by disabeling the button for a brief moment when it's clicked
	var btn = this;
	btn.disabled = true;
	setTimeout(function() {
		btn.disabled = false;
	}, 1000);
}

// Init

$(document).ready(function () {

	//global
	$('.jqbutton').button();

    $('#login_form').submit(validateLogin);
    $('#register_form').submit(register);
	
    //top right menu
	
	//add user word
	$('#user_add_word').keypress(function (e) {
		var code = (e.keyCode ? e.keyCode : e.which);
        if (code == 13 || code == 10)
			addUserWord();
	});
	$('#user_add_word_btn').click(addUserWord);
    
	
	//my account page
	$('#change_password_btn').click(changePassword);
	$('#change_username_btn').click(changeUsername);
	$('#change_newsletter_optin').change(changeNewsletterOptin);
    
    //training page
    $('.starttraining').click(createTrainingSession);
	$('.nodblclick').click(disableDoubleClick);
	
	//testing pages
    $('.starthundredwordtest').click(createHundredWordTestSession);
    $('.startoneminutetest').click(createOneMinuteTestSession);
	
	//word list page
	$('#newwordlist').keypress(function (e) {
		var code = (e.keyCode ? e.keyCode : e.which);
        if (code == 13 || code == 10) {
			createWordList();
		}
	});
	$('#addnewwordlist').click(createWordList);
	$('#delwordlist').click(function() {
		if(confirm('Are you sure you want to delete the selected word list?'))
			deleteSelectedWordList();
	});
	$('#wordlists').change(getSelectedWordList);
	$('#renamewordlist').click(renameWordList);
	$('#addnewwordtowordlist').click(addNewWordToWordList);
	$('#newwordlistword').keypress(function (e) {
		var code = (e.keyCode ? e.keyCode : e.which);
        if (code == 13 || code == 10) {
			addNewWordToWordList();
		}
	});
	$('#delwordlistword').click(deleteSelectedWordListWord);
            
    if($.cookie('token')) {
		setInterval(getUserDashboard, 1000 * 60);
        getUserDashboard();
    }
});

// Helper

//returns a marked up version of the correct word to indicate edits
function getDiff(correct, incorrect) {
	var seq = lcs(correct, incorrect);
	var diff = "";
	var s = 0;
	var a = 0;
	var b = 0;
	//run until we've seen it all
	while (s < seq.length || a < correct.length || b < incorrect.length) {
		var chS = seq.charAt(s);
		var chA = correct.charAt(a);
		var chB = incorrect.charAt(b);
		//if everything is aligned, append the normal form, advance all
		//else if neither are aligned
		//	then advance correct (writing chars as something wrong) until aligned,
		//	and advance incorrect too (we'll ignore these) until aligned
		//else if correct is aligned, then incorrect has some extra chars
		//	advance incorrect until aligned, append these chars as something to remove
		//else (if incorrect is aligned), then incorrect is missing some chars
		//	advance correct until aligned, and append these chars as something to add
		if (chA === chB) {//if these two are the same, then so is chS
			diff += chS;
			s++; a++; b++;
		} else if (chA !== chS && chB !== chS) {//both diff from chS
			diff += "<span class='diff_mod'>";
			while(chA !== chS) {
				diff += chA;
				a++;
				chA = correct.charAt(a);
			}
			diff += "</span>";
			while(chB !== chS) {
				b++;
				chB = incorrect.charAt(b);
			}
		} else if (chB !== chS) {//just chB is diff (extra)
			diff += "<span class='diff_rem'>";
			while(chB !== chS) {
				diff += chB;
				b++;
				chB = incorrect.charAt(b);
			}
			diff += "</span>";
		} else {//ust chA is diff (missing)
			diff += "<span class='diff_add'>";
			while(chA !== chS) {
				diff += chA;
				a++;
				chA = correct.charAt(a);
			}
			diff += "</span>";
		}
	}
	
	return diff;
}

//returns the longest common sub-sequence for the given strings
function lcs(correct, incorrect) {
    var seq = "";
	var lens = lcsLen(correct, incorrect);
    var i = 0;
    var j = 0;
	
    while (i < correct.length && j < incorrect.length) {
		if (correct.charAt(i) === incorrect.charAt(j)) {
			seq += correct.charAt(i);
			i++;
			j++;
		} else if (lens[i+1][j] >= lens[i][j+1]) {
			i++;
		} else {
			j++;
		}
    }
	return seq;
}

//returns an array of the longest common sub-sequences for each starting position in [c, i]
function lcsLen(correct, incorrect) {
		
	//walk through the strings backwards to populate the lengths
	//lengths for the far edges (off the string) are always zeros
	//lengths for the rest are:
	//	1 + current length if the strings match at this position (a, b)
	//	the max of (the cell to the right, or down) if the strings don't match
	var lens = [];
	for (var a = correct.length; a >= 0; a--) {
		lens[a] = [];
		for (var b = incorrect.length; b >= 0; b--) {
			if (a === correct.length || b === incorrect.length) {
				lens[a][b] = 0;
			} else if (correct.charAt(a) === incorrect.charAt(b)) {
				lens[a][b] = 1 + lens[a+1][b+1];
			} else {
				lens[a][b] = Math.max(lens[a+1][b], lens[a][b+1]);
			}
		}			
	}
	
	return lens;
}

function padLeft(text, size, padChar) {
    while(text.length < size) text = padChar + text;
    return text;
}
function defineWord (word) {
	//alt. http://dictionary.reference.com/search?q=
	//also see: makeDefinitionLink
	window.open('http://www.merriam-webster.com/dictionary/' + word, 'define', 'width=800');
}

function showUnrecognizedWordConfirmation(word, suggestions, addWordFunc) {
	//build the HTML
	var html = '<div class="confdialog">';
	html += '<table width="100%" border="0">';
	html += '<tr><td colspan="2">I don\'t recognize the word:</td></tr>';
	html += '<tr><td align="right" width="50%"><b>' + word + '</b></td>';
	html += '<td><button class="add_orig">Add Anyway</button></td></tr>';
	html += '<tr><td colspan="2">Did you mean:</td></tr>';
	for(var i = 0; i < suggestions.length; i++) {
		html += '<tr><td align="right"><b>' + suggestions[i] + '</b></td>';
		html += '<td><button class="addsug_' + i + '">Add</button>';
		html += '&nbsp;&nbsp;<button class="define_' + i + '">Define</button></td></tr>';
	}
	html += '</table>';
	html += '</div>';
	
	//create the DOM objects
	var confbox = $(html);
	
	//hook up events
	$('.add_orig', confbox).click(function () { addWordFunc(word); confbox.remove(); return false; });
	for(var i = 0; i < suggestions.length; i++) {
		$('.addsug_' + i, confbox).click(function (el) {
			var sugI = Number(el.target.className.split('_')[1]);
			addWordFunc(suggestions[sugI]);
			confbox.remove();
			return false;
		});
	}
	for(var i = 0; i < suggestions.length; i++) {
		$('.define_' + i, confbox).click(function (el) {
			var sugI = Number(el.target.className.split('_')[1]);
			defineWord(suggestions[sugI]);
			return false;
		});
	}

	//attach to page
	confbox.dialog({
		autoOpen: true,
		width: 500,
		modal: true,
		title: 'Confirm Word',
		buttons: {
			"Cancel": function() { 
				$(this).dialog("close"); 
			} 
		},
		open: function() {
			$(this).parents('.ui-dialog-buttonpane button:eq(0)').focus();
		}
	});
}

function showAchievmentEarned(achievement) {
	//alert("You've earned an achievement!\n" + achievement['message']);
	$.gritter.add({
		title: 'Achievment Unlocked',
		text: achievement['message'],
		image: '/images/onebit_44.png'
	});
}

function secToHHMMSS(sec) {
	//split into hh mm ss
	var hh = Math.floor(sec / 3600);
	sec = sec % 3600;
	var mm = Math.floor(sec / 60);
	var ss = sec % 60;
	
	var time = '';
	if(hh >= 10) {
		time += hh;
	} else if (hh > 0) {
		time += '0' + hh;
	}
	
	if(time != '') {
		time += ':';
	}
	
	if(mm >= 10) {
		time += mm + ':';
	} else if (mm > 0 || hh > 0) {
		time += '0' + mm + ':';
	}
	
	if(ss < 10) {
		time += '0';
	}
	time += ss;
	
	return time;
}
