Ext.onReady(function()
{
    var TDO = Framework.Setting.Translation; 
    var LoginServiceURL = Framework.Setting.Path.Root+'/index.php/mpath/services_Login';
    var LoginMask;
    var LoginGridWindowIsInPosition = false;
    var LoginDirectWindowIsInPosition = false;    
    var LoginRequiredWindow;
    var LoginConnection=new Ext.data.Connection({
        timeout: 30000,
        url:  Framework.Setting.Path.Root+'/index.php/mpath/services_Login'
    });
    
    
    var LoginJsonStore = new Ext.data.JsonStore(
     {
         mode: 'local',
         root: '',
         fields: [ 'System', 'Username', 'Customer', 'Valid', 'Type' ]
     }
    );
    
    
    var CaptchaPanel=new Ext.Panel({
       border: false,
       renderTo: 'LoginCaptcha',
       hidden: true
    });
    
    var Username = new Ext.form.TextField(
        {    
            baseCls:   'x-plain',
            allowBlank: false,
            applyTo: 'username',
            width:      170,
            autoCreate: {tag: "input", type: "text", size: "20", autocomplete: "on"},
            listeners: { 
              'specialkey': catchEnterPressOnLoginTextField 
           }                                                  
         }
    );
            
    var Password = new Ext.form.TextField(
      {   
          baseCls:   'x-plain',
          inputType: 'password',
          applyTo: 'password',
          allowBlank: false,
          width:      170,
          listeners: { 
              'specialkey': catchEnterPressOnLoginTextField 
         }
      }
     );
    

                                                
    function createLoadingMask(msg)
    {
        if (typeof LoginMask == 'object')
        {
            LoginMask.hide();
            LoginMask = null;
        }
        LoginMask = new Ext.LoadMask(Ext.getBody(), {msg: msg});
    }
    
    function showLoadingMask()
    {
        LoginMask.show();
    }
    
    function hideLoadingMask()
    {
        LoginMask.hide();
    }
    
    function LoginGridRowRenderer(msg)
    {
        return '<div style="font-size: 11px; height: 25px; cursor: pointer;">'+msg+'</div>';
    }

    function LoginGridHeaderRenderer(msg)
    {
        return '<span style="font-size: 11px; font-weight: bold;">'+msg+'</span>';
    }

    function LoginGridTypeRenderer(type)
    {
        return ((type == '1') ? '<img src="'+Framework.Setting.Path.Root+'/images/loginCustomer.png" />' : '<img src="'+Framework.Setting.Path.Root+'/images/loginSystem.png" />');
    }
    
    var LoginGrid = new Ext.grid.GridPanel(
    {
        store:  LoginJsonStore,
        region: 'center',
        listeners: { rowclick: function(Object, RowId, Event) 
           {
               // user is allowed to login immediately
               if (LoginJsonStore.getAt(RowId).get('Valid') == '1')
               {
                    LoginGridWindow.hide();
                    createLoadingMask(TDO._IDF_LOGIN_WAIT);
                    showLoadingMask();
                    LoginService(LoginJsonStore.getAt(RowId).get('Username'), Password.getValue(), SingleLoginSuccess, SingleLoginFailure);
               }
               // additional login is required
               else
               {
                    LoginRequiredWindow = brodos.login.dialog(TDO, LoginServiceURL, LoginJsonStore.getAt(RowId).get('Username'), $F('setCookie'), directLoginSuccess, directLoginFailure, executeLoginWait); 
                    LoginRequiredWindow.on('close', function () { LoginGridWindow.show(); });
                    
                    LoginRequiredWindow.show();
                    LoginRequiredWindow.setPosition(LoginRequiredWindow.getPosition()[0], LoginRequiredWindow.getPosition()[1]-100);
                    LoginGridWindow.hide();
               }
           }  
        },
        columns: [
            { name: 'Type',     header: LoginGridHeaderRenderer(TDO._IDF_TYPE),       width: 35,  fixed: true, resizable: false, menuDisabled: true, sortable: false, renderer: LoginGridTypeRenderer, dataIndex: 'Type'     },
            { name: 'System',   header: LoginGridHeaderRenderer(TDO._IDF_SYSTEM),     width: 200, fixed: true, resizable: false, menuDisabled: true, sortable: false, renderer: LoginGridRowRenderer,  dataIndex: 'System'   },
            { name: 'Username', header: LoginGridHeaderRenderer(TDO._IDF_USER),       width: 160, fixed: true, resizable: false, menuDisabled: true, sortable: false, renderer: LoginGridRowRenderer,  dataIndex: 'Username' },
            { name: 'Customer', header: LoginGridHeaderRenderer(TDO._IDF_CUSTOMERNO), width: 105, fixed: true, resizable: false, menuDisabled: true, sortable: false, renderer: LoginGridRowRenderer,  dataIndex: 'Customer' }
          ],
        stripeRows: true,
        autoHeight: true,
        width: 504
      }
   );

    var LoginGridWindow = new Ext.Window(
     {
        title:       TDO._IDF_SELECT_LOGIN,
        closable:    true,
        width:       504,
        modal:       true,
        resizable:   false,
        draggable:   false,
        closeAction: 'hide',
        layout:      'fit',
        items:       [LoginGrid]
     }
    );
    
        function showLoginGridWindow()
        {
            LoginGridWindow.show();
            
            if (!LoginGridWindowIsInPosition)
            {
                LoginGridWindow.setPosition(LoginGridWindow.getPosition()[0], LoginGridWindow.getPosition()[1]-130);
                LoginGridWindowIsInPosition = true;
            }
        }
        
        if ($('LoginButton'))
        {
             var LoginButton = new Ext.Button({
                text:     TDO._IDF_LOGIN_BUTTON,
                renderTo: 'LoginButton',
                autoShow:  true,
                listeners: { 
                     'click': function () 
                          { 
                             var captchaResponse, captchaChallenge;
                             
                             if (Username.isValid() && Password.isValid())
                             {
                                 if (Ext.get('captcha_response_field')!=null)
                                 {
                                     captchaResponse=Ext.get('captcha_response_field').dom.value;
                                     captchaChallenge=Ext.DomQuery.selectNode('input[name=captcha_challenge_field]').value;
                                 }
                                     
                                 Account(Username.getValue(), Password.getValue(), captchaResponse, captchaChallenge); 
                                 
                                 Ext.get('LoginMessage').update('');
                             }
                          }
                     }
              });
        }
        
        function Account(identifier, password, captchaResponseValue, captchaChallengeValue)
        {
            if (identifier.length && password.length)
            {
                LoginJsonStore.removeAll();
                createLoadingMask(TDO._IDF_LOGIN_WAIT);
                showLoadingMask();
                
                
                LoginConnection.request({
                    params: {
                        Id: identifier,
                        Password: password,
                        Mode: 'List',
                        captcha_response_field: captchaResponseValue,
                        captcha_challenge_field: captchaChallengeValue
                    },
                    success: function (resp, opt)
                    {
                        var oData=Ext.decode(resp.responseText);
                        
                        var captcha_challenge=oData.captcha_challenge;
                        
                        LoginJsonStore.loadData(oData.Data);
                        
                        // check if we have valid logins
                        if (LoginJsonStore.getTotalCount() > 1)
                        {
                            hideLoadingMask();
                            // Multi-Login, so show selection
                            showLoginGridWindow();
                        }
                        else if (LoginJsonStore.getTotalCount()===1)
                        {
                            // single-Login, so do Login
                            LoginService(LoginJsonStore.getAt(0).get('Username'), Password.getValue(), SingleLoginSuccess, SingleLoginFailure);
                        }
                        else
                        {
                            hideLoadingMask();
                            // set focus to username field
                            Username.focus();
                            
                            // no valid logins, so check if we have to show captcha
                            switch (captcha_challenge)
                            {
                                case "requestFailed":
                                case "noChallenge":
                                    // show invalid login message
                                    Ext.get('LoginMessage').update(TDO._IDF_LOGIN_INVALID);
                                    // empty captcha panel
                                    CaptchaPanel.getEl().update('');
                                    break;
                                default:
                                    // show captcha, if provided
                                    if (captcha_challenge.length>0)
                                    {
                                        showCaptcha(captcha_challenge);
                                    }
                                    else
                                    {
                                        Ext.get('LoginMessage').update(TDO._IDF_LOGIN_INVALID);
                                    }
                                    break;
                            }
                        }
                    },
                    failure: function (resp, opt)
                    {
                        hideLoadingMask();
                        Ext.get('LoginMessage').update(TDO._IDF_LOGIN_ERROR);
                    }
                });
                /*LoginJsonStore.load(
                {  
                    params: 
                        { 
                            Id: identifer, 
                            Password: password, 
                            Mode: 'List' 
                        },
                    callback: AccountResultHandler
                }
               ); */   
            }
        }
        
        /*function AccountResultHandler(record, options, success)
        {
            Ext.get('LoginMessage').update('');

            if (success)
            {
                // Multi logins
                if (LoginJsonStore.getTotalCount() > 1)
                {
                    hideLoadingMask();
                    showLoginGridWindow();
                }
                // Single login
                else if (LoginJsonStore.getTotalCount() == 1)
                {
                    LoginService(LoginJsonStore.getAt(0).get('Username'), Password.getValue(), $F('setCookie'), SingleLoginSuccess, SingleLoginFailure);
                }
                // Invalid login
                else
                {
                    hideLoadingMask();
                    Ext.get('LoginMessage').update(TDO._IDF_LOGIN_INVALID);
                }
            }
            else
            {
                hideLoadingMask();
                Ext.get('LoginMessage').update(TDO._IDF_LOGIN_ERROR);
            }
        }*/
        
        function LoginService(identifer, password, successCallback, failureCallback)
        {
            brodos.login.execute(LoginServiceURL, identifer, password, 0, successCallback, failureCallback);
        }
        
        function SingleLoginSuccess(data)
        {
            if (data.responseText == '1')
            {
               $('LoginForm').submit();
            }
            else
            {
                LoginGridWindow.hide();
				hideLoadingMask();
                if(data.responseText == '2') {
                    Ext.get('LoginMessage').update(TDO._IDF_LOGIN_USERLEVEL_ERROR);
                } else {
                    Ext.get('LoginMessage').update(TDO._IDF_LOGIN_ERROR);
                }
            }
        }
        
        function SingleLoginFailure()
        {
            LoginGridWindow.hide();
            hideLoadingMask();
            Ext.get('LoginMessage').update(TDO._IDF_LOGIN_ERROR);
        }
        
        function executeLoginWait()
        {
            createLoadingMask(TDO._IDF_LOGIN_WAIT);
            showLoadingMask();
            LoginRequiredWindow.hide();
        }

        function directLoginSuccess(data)
        {
            if (data.responseText == '1')
            {
                $('LoginForm').submit();
            }
            else
            {
                hideLoadingMask();
                LoginGridWindow.hide();
                LoginRequiredWindow.show();
                Ext.getCmp('idfSystemPassword').markInvalid();
            }
        }
          
        function directLoginFailure(data)
        {
            hideLoadingMask();
            LoginRequiredWindow.show();
            Ext.getCmp('idfSystemPassword').markInvalid();
        }
        
        /**
         * shows captcha from captcha-service in container for error messages
         * @param string sCaptcha - html-code captcha
         * @return void 
         */
        function showCaptcha(sCaptcha)
        {
            CaptchaPanel.getEl().update(sCaptcha);
            CaptchaPanel.show();
            
            if (Ext.get('captcha_response_field')!=null)
            {
                Ext.get('captcha_response_field').addClass("x-form-text x-form-text-field");
                Ext.get('captcha_response_field').dom.onkeydown=catchEnterCaptchaField.createDelegate(null, window.event);
            }
        }
        
        
        
        // -------------------------------------------------------------------------------------------------------------------------------- //
        
        
        function catchEnterPressOnLoginTextField(Sender, EventArgs)
        {
           if (EventArgs.getCharCode() == EventArgs.ENTER && Username.isValid() && Password.isValid())
           {
               LoginButton.fireEvent('click');
           }
        }
        
        function catchEnterCaptchaField(evt)
        {
            if (!evt)
                evt=window.event;
            
            if (evt.keyCode==13)
            {
                LoginButton.fireEvent('click');
            }
        }

                                  
        if (Username.getValue().length > 0)
        {
            Password.focus();
        }

        if (Username.getValue().length == 0)
        {
            Username.focus();
        }
});
