textFieldValue = (textField) ->
Jnoid.Stream.fromDOM(textField, "keyup input").map((e) ->
$(e.target).val()
).box($(textField).val()).skipDuplicates()
Messages =
provideLogin: "Provide login"
provideFullname: "Provide fullname"
fullnameTooLong: "Fullname is too long"
checking: "Checking"
good: "Good"
isGood = (message) -> message is Messages.good
nonEmpty = (x) -> x.length > 0
validateAjax = (params) ->
Jnoid.Stream.fromPromise($.ajax(params)).box(Messages.checking).map(->
Messages.good
).recover (e) ->
e.responseText
validateLogin = (login) ->
if login.length <= 0
Messages.provideLogin
else
Messages.good
validateFullname = (fullname) ->
if fullname.length <= 0
Messages.provideFullname
else if fullname.length > 30
Messages.fullnameTooLong
else
Messages.good
login = textFieldValue($("#login input"))
fullname = textFieldValue($("#fullname input"))
toLoginCheck = (login) ->
url: "/check-login/" + login
availMessages = login.filter(nonEmpty).map(toLoginCheck).flatMap(validateAjax)
loginMessages = login.map(validateLogin).merge(availMessages)
fullnameMessages = fullname.map(validateFullname)
buttonEnabled = loginMessages.map(isGood).and(fullnameMessages.map(isGood))