/*-
 * Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

 */


$(document).ready(function() {
    $('input:eq(1)').keyup(function(evt){
      if(evt.which == 13){//enter
        evt.preventDefault();
        $('#login-btn').click();
        $('#login-btn').focus();
      }
    });

    $('input:eq(0)').focus(function(evt){
      $('#loginMsg').hide();
    });

    $('input:eq(1)').focus(function(evt){
      $('#loginMsg').hide();
    });

    $('#login-btn').click(function() {



        var name = $('input:eq(0)').val();
        var password = $('input:eq(1)').val();

       var loginUrl = '/api/v1/login/authenticate';



        loginBtnWait();
        $.ajax({
            type: 'POST',
            url: loginUrl,
            data: JSON.stringify({username:name, password:password}),
            contentType: 'application/json',
            dataType: 'json',
            success: function(data){
                console.log(data);
                if(data.status == 0){//logon success
                    //console.log($('input:eq(3)').val());
                    if($('input:eq(2)').prop('checked')){
                        setCookie('ntAccount', data.ntAccount, 30);
                        setCookie('fullName', data.fullName, 30);
                    }else{
                        setCookie('ntAccount', data.ntAccount);
                        setCookie('fullName', data.fullName);
                    }

                    loginBtnActive()
                    window.location.replace('/');
                }else{
                    showLoginFailed();
                    loginBtnActive();
                };
            },
            error: function(jqXHR, textStatus, errorThrown){
//                showLoginFailed();
//                loginBtnActive();
                //::TODO ignore login for test purpose
                setCookie('ntAccount', 'test', 30);
                setCookie('fullName', 'test', 30);
                window.location.replace('/');
                //::TODO ignore login for test purpose done
            }

        });
    });

    function setCookie(name, value, days){
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            expires = "; expires=" + date.toGMTString();
	    } else {
	        expires = "";
	    }
	    document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + expires + "; path=/";
	}

	function getCookie(key) {
        var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)');
        return keyValue ? keyValue[2] : null;
    }

    function loginBtnWait() {
      $('#login-btn').addClass('disabled')
        .text('Logging in......');
    }

    function loginBtnActive() {
        $('#login-btn').removeClass('disabled')
        .text('Log in');
    }

    function showLoginFailed() {
      $('#loginMsg').show()
        .text('Login failed. Try again.');
    }
});
