function VIET_vnl_ui_User() {
    this.iAccountId = 0;
    this.sFirstName = '';
    this.sLastName = '';
    this.sEmail = '';
    this.bIsSubscribed = false;
    this.sSubscriptionExpire = null;
    this.bIsLogin = false;

    // subscription
    this.oSubscribeTimer = null;

    this.SYS_ERR_MSG = 'System error - please let our administrator know.';
    this.SUBS_VAL_DELAY = iSVDelay; // minutes delay before validate subscr. after page start 
    this.SUBS_VAL_INT = iSVInt; // interval (in minutes) b/w validating subscr.
    this.SUBS_PAGE = 'http://vietnamlive.tv/helpus.php';
}
VIET_vnl_ui_User.prototype = {

    init: function() {
        this.sCurrLang = $_COOKIES('lang') || 'en';
        this.checkUserSession();
    },

    //
    // check to see if user is logged in; if so, return all user information
    //
    checkUserSession: function() {
        var me = this;
        var handleSuccess = function(o){
            try {
                me.fillData( eval("(" + o.responseText + ")") );
                me.updateLoginLink();
                me.initAdminUI();
            }
            catch(ex) {}
        }

        var handleFailure = function() {}

        YAHOO.util.Connect.asyncRequest('GET', '/zf/account/getuserinfo', {success:handleSuccess, failure:handleFailure});
    },
    
    //
    // result array got back from $auth->getIdentity(), fill out attributes for this Js object
    //
    fillData: function(arRes) {
        this.bIsLogin = (arRes['result']==1);
        if( this.bIsLogin ) {
            this.iAccountId = arRes['id'];
            this.sFirstName = arRes['firstname'];
            this.sLastName = arRes['lastname'];
            this.sEmail = arRes['username'];
            this.bIsSubscribed = (arRes['subscribe']==1);
            this.sSubscriptionExpire = arRes['subscribeExpireTime'];
        }
    },
    
    //
    // change text and link of page footer:
    // - if user login, display email and logout link
    // - if user not login, display login link
    //
    updateLoginLink: function() {
        $('footer_logoutbusy').style.display = 'none';
        $('footer_login').style.display = (this.bIsLogin ? 'none' : '');
        //$('footer_account').style.display = (this.bIsLogin ? '' : 'none');
        //$('footer_logout').style.display = (this.bIsLogin ? '' : 'none');
        $('footer_loginusername').style.display = (this.bIsLogin ? '' : 'none');
        if( this.bIsLogin )
            $('footer_loginusername').innerHTML = '<span class="footer_loginusername">' + this.sEmail 
                + '</span> &nbsp; (<a id="footer_logout_lk" href="javascript:oUser.signOut();">' + (oGlobal.sCurrLang=='en' ? 'Logout' : 'Truy xuất') + '</a>)';
            
        // update subscription page
        if( $('accountsubscribe_accountinfopanel')!=null )
            accountsubscribe_validate();

    },

    //
    // validate login; if successful, return all user information
    //
    signIn: function(username, password) {
    
        var bUseLoginForm = (username==null);
        username = username || $('lg_username').value;
        password = password || $('lg_password').value;

        if( bUseLoginForm && (username=='' || password=='') ) {
            this.showLoginMsg('err');
            return;
        }

        if( bUseLoginForm )
            this.showLoginMsg('busy');

        var me = this;
        var handleSuccess = function(o){
            try {
                me.fillData( eval("(" + o.responseText + ")") );

                if( bUseLoginForm ) {
                    if( me.bIsLogin ) {
                        //if( oAgent.needSubscribe() && !me.isSubscribedUser() ) 
                        //    document.location.href = me.SUBS_PAGE;
                        //else {

                            YAHOO.util.History.navigate("p", '/account/index');
                            me.showLoginMsg('msg');
                        //}
                    }
                    else
                        me.showLoginMsg('err');
                }
                else {

                    if( me.bIsLogin )
                        js_skip_commercial();
                    else
                        alert('Login unsuccessful. Please try again.');
                }

                me.initAdminUI();
                me.updateLoginLink();
            }
            catch(ex) {
                alert(me.SYS_ERR_MSG);
            }
        }

        var handleFailure = function() { alert(me.SYS_ERR_MSG); }

        YAHOO.util.Connect.asyncRequest('POST', '/zf/userauth/signin', {success:handleSuccess, failure:handleFailure}, 'username=' + username + '&password=' + password);

        if( bUseLoginForm )
            $('lg_password').value = '';
    },
    
    initAdminUI: function() {
        if( (this.bIsLogin==true) && (this.iAccountId==9) ) {
            // side bar popular
            var d = document.createElement('div');
            d.className = 'sidebar_popularctrl';
            d.innerHTML = '<form action="javascript:oGlobal.admin_insertPopularKeyword()"><input type="text" id="admin_popularkeyword" style="width:120px;padding-left:3px;" onkeyup="telexingVietUC(this, event)" /> <input type="text" id="admin_popularkeywordscore" style="width:20px;" /> <input type="submit" value="Submit" /></form>';
            $('sidebar_content').appendChild(d);
            
            //
            // load vietuni8.js
            //
            if( typeof telexingVietUC == 'undefined' ) {
                YAHOO.util.Get.script("/js/vietuni8.js", { onSuccess: function() { setTypingMode(2); } });
            }

        }
    },
    
    showLoginMsg: function(s) {
        $('loginbox_msg').style.display = (s=='msg' ? '' : 'none');
        $('loginbox_busy').style.display = (s=='busy' ? '' : 'none');
        $('loginbox_err').style.display = (s=='err' ? '' : 'none');
    },
    
    //
    // auto-signin without user interaction
    //
    quietSignIn: function(username, password, callback) {
        var sUrl = '/zf/userauth/signin';

        var me = this;
        var handleSuccess = function(o){
            try {
                //if( oAgent.needSubscribe() && !me.isSubscribedUser() ) 
                //    document.location.href = me.SUBS_PAGE;
                //else {
                    me.fillData( eval("(" + o.responseText + ")") );
                    me.updateLoginLink();
                    if( callback!=null )
                        eval(callback + '()');
                //}
                
                me.initAdminUI();
            }
            catch(ex) {}
        }
        var handleFailure = function() {}
        YAHOO.util.Connect.asyncRequest('POST', sUrl, {success:handleSuccess, failure:handleFailure}, 'username=' + username + '&password=' + password);
    },

    signOut: function() {
        $('footer_loginusername').style.display = 'none';
        //$('footer_account').style.display = 'none';
        //$('footer_logout').style.display = 'none';
        $('footer_logoutbusy').style.display = '';

        var sUrl = '/zf/userauth/signout';
        var me = this;
        var handleSuccess = function(o) {
            try {
                me.bIsLogin = false;
                me.updateLoginLink();
                //oGlobal.hideTextContent();
            }
            catch(ex) {
                alert(me.SYS_ERR_MSG);
            }
        }
        var handleFailure = function() { alert(me.SYS_ERR_MSG); }
        YAHOO.util.Connect.asyncRequest('GET', sUrl, {success:handleSuccess, failure:handleFailure});
    },
    
    signUp: function(firstName, lastName, email, password) {

        var bUseSignupForm = (firstName==null);
        firstName = firstName || $('su_firstName').value;
        lastName = lastName || $('su_lastName').value;
        email = email || $('su_email').value;
        password = password || $('su_password').value;

        if( firstName=='' || lastName=='' || email=='' || password=='' ) {
            if( bUseSignupForm ) {
                $('signupbox_err').innerHTML = this.sCurrLang=='en' ? 'Error: Missing required fields.' : 'Lỗi dữ liệu: Những ô in đậm là nhất thiết phải điền.';
                this.showSignupMsg('err');
            }
            else
                alert('Error: Missing required fields.');

            return;
        }
        else if( !validEmail(email) ) {
            if( bUseSignupForm ) {
                $('signupbox_err').innerHTML = this.sCurrLang=='en' ? 'Error: Invalid email address.' : 'Lỗi dữ liệu: Địa chỉ điện thư không hợp lệ.';
                this.showSignupMsg('err');
            }
            else
                alert('Error: Invalid email address.');

            return;
        }

        if( bUseSignupForm )
            this.showSignupMsg('busy');

        var sUrl = '/zf/user/register';

        var me = this;
        var handleSuccess = function(o){
            try {
                var arRes = eval("(" + o.responseText + ")");
                var bSuccess = (arRes['result']!=null && arRes['result']!=0);
                
                if( bSuccess ) {
                
                    if( bUseSignupForm ) {
                        oGlobal.hideSignup($('lg_username').value);
                        me.showSignupMsg('msg');
                    }
                    else
                        js_skip_commercial();
                    
                    if( oGlobal.sCurrLang=='en' ) 
                        alert('Registered successfully!\nAn email has been sent to your email address provided.\nPlease use it to activate your account.\nThank you.');
                    else
                        alert('Đăng ký tài khoản thành công!\nChúng tôi đã gởi một điện thư đến cho bạn.\nXin hãy dùng điện thư này để kích hoạt tài khoản.\nXin cám ơn.');

                    // quiteSignIn will redirect to subscription page if needed
                    me.quietSignIn(email, password);
                }
                else {
                    if( bUseSignupForm ) {
                        $('signupbox_err').innerHTML = oGlobal.sCurrLang=='en' ? 'Error: Email already registered.' : 'Lỗi dữ liệu: Địa chỉ điện thư này đã được đăng ký.';
                        me.showSignupMsg('err');
                    }
                    else
                        alert(oGlobal.sCurrLang=='en' ? 'Error: Email already registered.' : 'Lỗi dữ liệu: Địa chỉ điện thư này đã được đăng ký.');
                }
            }
            catch(ex) {
                alert(me.SYS_ERR_MSG);
            }
        }

        var handleFailure = function() { alert(me.SYS_ERR_MSG); }

        YAHOO.util.Connect.asyncRequest('POST', sUrl, {success:handleSuccess, failure:handleFailure}, 
            'firstName=' + firstName + '&lastName=' + lastName + '&email=' + email + '&password=' + password );
    },
    
    showSignupMsg: function(s) {
        $('signupbox_msg').style.display = (s=='msg' ? '' : 'none');
        $('signupbox_busy').style.display = (s=='busy' ? '' : 'none');
        $('signupbox_err').style.display = (s=='err' ? '' : 'none');
    },

    isSubscribedUser: function() {

        if( !this.bIsLogin )
            return false;

        var dtSubsExpire = VIET_vnl_util_ParseDateTimeFromMySQL(this.sSubscriptionExpire);
        var dtNow = getServerTime();
        dtNow.setHours(0); dtNow.setMinutes(0); dtNow.setSeconds(0); dtNow.setMilliseconds(0);

        return (dtSubsExpire.getTime()>=dtNow.getTime());
    },
    
    //
    // SUBCRIPTION_REQUIRED event is triggered when a user used up his free allowance.
    // This event is triggered from AgentTracking class at start of a session or while user is watching
    // (and accumulate all free allowance).
    //
    // This handler will start a timer that get called every 60 seconds to see if user subscribes yet.
    // If not, direct him to login page or subscription page.
    //
    handle_SubscriptionRequired: function() {

        // don't call this function twice
        /*if( this.oSubscribeTimer!=null )
            return;

        this.oSubscribeTimer = new VIET_vnl_util_Timer(this.SUBS_VAL_INT*60);
        var me = this;
        this.oSubscribeTimer.RegisterEvent(function() { me.validateSubscription(); });
        
        // delay a little bit after page start to prevent started before player inited
        setTimeout( function() {me.oSubscribeTimer.Start();}, this.SUBS_VAL_DELAY*60*1000 );*/
    },
    
    //
    // This function is called to check if subscription is required but user is not subscribed
    // (it can be called every 60 seconds if user reaches his free allowance limit).
    // 
    // - if user is logged in and have subscription: just ignore
    // - if user is logged in but don't have subscription, forward to subscription page
    // - if user is not logged in, ask user to login
    //
    validateSubscription: function() {
        if( this.isSubscribedUser() ) return;
        if( !oAgent.needSubscribe() ) return; // double check

        if( this.bIsLogin )
            document.location.href = this.SUBS_PAGE;
        else {
            oPlayer.playpause();
            oPlayer.hide();
            oGlobal.showLogin();
        }
    }
}
var oUser = new VIET_vnl_ui_User();

