bootstrapClasses = new Map([ [ "Err", "bg-danger" ], [ "0", "bg-danger" ], [ "1", "bg-warning" ], [ "2", "bg-info" ], [ "3", "bg-primary" ], [ "4", "bg-success" ] ])
barWidth = new Map([["Err", "0"], ["0", "20"], ["1", "40"], ["2", "60"], ["3", "80"], ["4", "100"]])

# display entropy bar with correct level
displayEntropyBar = (level) ->
	# Remove all classes from progressbar and restore default progress-bar class
	$("#entropybar div").removeClass()
	$("#entropybar div").addClass 'progress-bar'

	# set width
	$("#entropybar div").width(barWidth.get(level) + '%')

	# set color
	$("#entropybar div").addClass bootstrapClasses.get(level)

	# display percentage width inside the bar
	$("#entropybar div").html( barWidth.get(level) + '%')


# display custom message if any, else remove hide div block
displayEntropyBarMsg = (msg) ->
	$("#entropybar-msg").html(msg)
	if ( msg.length == 0 )
		$("#entropybar-msg").addClass("entropyHidden");
	else
		$("#entropybar-msg").removeClass("entropyHidden");


$(document).on 'checkpassword', (event, context) ->

	password = context.password
	evType = context.evType
	setResult = context.setResult


	# if checkEntropy is enabled
	if $('#ppolicy-checkentropy-feedback').length > 0
		newpasswordVal = $( "#newpassword" ).val()
		entropyrequired = $( "span[trspan='checkentropyLabel']" ).attr("data-checkentropy_required")
		entropyrequiredlevel = $( "span[trspan='checkentropyLabel']" ).attr("data-checkentropy_required_level")
		if newpasswordVal.length == 0
			# restore default empty bar
			displayEntropyBar("Err")
			displayEntropyBarMsg("")
			setResult('ppolicy-checkentropy-feedback', "unknown")
		if newpasswordVal.length > 0
			# send a request to checkentropy endpoint
			$.ajax
				dataType: "json"
				url: "/checkentropy"
				method: "POST"
				data: { "password": btoa(newpasswordVal) }
				context: document.body
				success: (data) ->
					level = data.level
					msg = data.message
					if level != undefined
						if parseInt(level) >= 0 and parseInt(level) <= 4
							# display entropy bar with correct level
							displayEntropyBar(level)
							displayEntropyBarMsg(msg)
							# set a warning if level < required level and prevent form validation
							if entropyrequired == "1" and entropyrequiredlevel.length > 0
								if parseInt(level) >= parseInt(entropyrequiredlevel)
									setResult('ppolicy-checkentropy-feedback', "good")
								else
									setResult('ppolicy-checkentropy-feedback', "bad")
							# entropy criteria is set to ok if entropy check is not required
							if entropyrequired != "1"
								setResult('ppolicy-checkentropy-feedback', "good")
						else if parseInt(level) == -1
							# error when computing entropy: display entropy bar with error level
							displayEntropyBar(level)
							displayEntropyBarMsg(msg)
							setResult('ppolicy-checkentropy-feedback', "bad")
						else
							# unexpected error: display entropy bar with error level
							displayEntropyBar(level)
							displayEntropyBarMsg(msg)
							setResult('ppolicy-checkentropy-feedback', "unknown")
				error: (j, status, err) ->
					console.log 'checkentropy: frontend error: ', err  if err
					res = JSON.parse j.responseText if j
					if res and res.error
						console.log 'checkentropy: returned error: ', res