(function(){

var $ = jQuery;

var LoginModel = function() {
  var cookieOpts = { raw: true, path: '/', domain: '.acponline.org' };
  var dnnCookieOpts = { domain: 'www.acponline.org' };

  // ajax call.
  return {
    // add options obj to config url, type...
    login_request: function(id, pw, remember_me, callback) {
      var that = this;

      if (remember_me){
        cookieOpts['expires'] = 30;
      } else {
        cookieOpts['expires'] = null;
      }

      $.ajax({
        cache: false,
        dataType: 'json',
        type: 'POST',
        url: '/cgi-bin/sso.cgi',
        timeout: 10000,
        data: {'do':'login', username:id, password:pw},
        success: function(response) {
          // check response for errors before calling callback...
          var name = response.salutation;
          var is_member = response.is_member;
          var type = (is_member === '1') ? "member" : "nonmember";
          var id = response.id;

          if (name && type && id) { 
            $.cookie('AcpAuth', id, cookieOpts);
            $.cookie('AcpSalutation', name, cookieOpts);
            $.cookie('AcpMember', is_member === '1' ? 'true' : 'false', cookieOpts);
            callback({status:'success', msg:'', name:name, type:type}); 
          }
          else { 
            that.logout();
            callback({status:'error', msg:'user'}); 
          }
        },
        error: function(xhr) { 
          that.logout();

          if (xhr.status === 401) { callback({status:'error', msg:'user'}); }
          else { callback({status:'error', msg:'server'}); }
        }
      });
    },
    login: function(id, pw, remember_me, callback) {
      var valid = this.validate(id, pw);

      if (valid) { this.login_request(id, pw, remember_me, callback); }
      else { callback({status:'error', msg:'user'}); }
    },
    logout: function(){
      $.cookie('AcpAuth', null, cookieOpts);
      $.cookie('AcpSalutation', null, cookieOpts);
      $.cookie('AcpMember', null, cookieOpts);
      $.cookie('AcpJS', null, cookieOpts);
      $.cookie('.DOTNETNUKE', null, dnnCookieOpts);
      $.cookie('.ASPXANONYMOUS', null, dnnCookieOpts);
    },
    validate: function(id, pw) {
      if (id === '') { return false; }
      else if (pw === '') { return false; }
      else { return true; }
    },
    get_loggedin_status: function(callback){
      if ($.cookie('AcpAuth', cookieOpts) !== null) {
        var user_name, member, member_type;
        user_name = $.cookie('AcpSalutation', cookieOpts);
        member = $.cookie('AcpMember', cookieOpts);
        member_type = member === 'true' ? 'member' : 'nonmember';

        if (user_name !== null && member != null){
          return callback({
            user_name: user_name,
            member_type: member_type
          });
        }
        else {
          $.ajax({
            cache: false,
            dataType: 'json',
            type: 'POST',
            url: '/cgi-bin/sso.cgi',
            timeout: 10000,
            data: {'do':'reset'},
            success: function(response) {
              var name = response.salutation;
              var is_member = response.is_member;
              var type = (is_member === '1') ? "member" : "nonmember";

              if (name !== null && is_member !== null) { 
                $.cookie('AcpSalutation', name, cookieOpts);
                $.cookie('AcpMember', is_member === '1' ? 'true' : 'false', cookieOpts);
                return callback({
                  user_name: name,
                  member_type: type
                });
              }
              return callback({
                user_name: null,
                member_type: 'default'
              });
            },
            error: function(xhr) { 
              return callback({
                user_name: null,
                member_type: 'default'
              });
            }
          });
          return;
        }
      } else {
        return callback({
          user_name: null,
          member_type: 'default'
        });
      }
    }
  };
};

var noop_view_functions = {
    initialize: function(){},
    add_observers: function(){},
    update_state: function(state){},
    show_error: function(){},
    hide_login_form: function(){},
    set_logged_in_state: function(){},
    view_loaded_properly: function(){return false;}
};

var TopNavLoginView = function() {
  var this_view = null;
  var member_login_states = 'show loading user_error server_error';
  var $utility = $('#utility');
  var $member_login        = $utility.find('#member_login');
  var $member_login_form   = $utility.find('#member_login_form');
  var controller          = null;
  var login_bar_items     = {
    'default': [
          'login_button', 
          {text: 'Pay&nbsp;Dues', href: '/my/dues'}, 
          {text: 'ACP&nbsp;Chapters', href: '/my/chapter'},
          {text: 'Join&nbsp;ACP', href: '/membership/join'}
         ],
    'member': [
          'welcome_message', 
          {text: 'Pay&nbsp;Dues', href: '/my/dues'}, 
          {text: 'My&nbsp;Benefits &amp; Products', href: '/my/membership'},
          {text: 'My&nbsp;Chapter', href: '/my/chapter'}
         ],
    'nonmember': [
          'welcome_message', 
          {text: 'My&nbsp;Products', href: '/my/membership'},
          {text: 'ACP&nbsp;Chapters', href: '/my/chapter'},
          {text: 'Join&nbsp;ACP', href: '/membership/join'}
         ]
  };

  if ($utility.length == 0){
    return noop_view_functions;
  }
  return {
    initialize: function(ctrl, model) {
      this_view = this;
      this.set_controller(ctrl);
      this.add_observers();
      
      model.get_loggedin_status(function(login_info){
        this_view.set_logged_in_state(login_info.member_type, login_info.user_name);
      });
    },
    set_controller: function(ctrl) {
      controller = ctrl;
    },
    add_observers: function() {
      var this_view = this;
      if ($member_login_form.is('form')){
        $member_login_form.submit(function(event) {
          this_view.submit_form();
          event.preventDefault();
        });
      } else {
        // Needed for ebiz login form.
        $member_login_form.find('#member_id, #member_pw, #remember_me').keydown(function(event){
          // Submit form when the use presses enter on the id or pw field.
          if (event.keyCode === 13){
            event.preventDefault();
            this_view.submit_form();
          }
        });
        $member_login_form.find('#submit_login_form').click(function(event){
          this_view.submit_form();
        });
      }
    },
    submit_form: function(){
        if (!$member_login.hasClass('loading')){
          var id = $member_login_form.find('#member_id').val();
          var pw = $member_login_form.find('#member_pw').val();
          var remember_me = $member_login_form.find('#remember_me').is(':checked');
          controller.submit_login_form(this_view, id, pw, remember_me);  
        }
    },
    update_state: function(classname) {
      $member_login.removeClass(member_login_states);
      $member_login.addClass(classname);
    },
    show_error: function(msg) {
      if (msg === 'server') { this.update_state('server_error'); }
      else { this.update_state('user_error'); }
    },
    hide_login_form: function(){
      $('#utility .login .inner').slideUp('fast');
    },
    show_login_form: function(){
      var pos = $utility.offset();
      var height = $utility.height();
      $member_login.css({'top': (pos.top + height + 5) + 'px'});
      
      this.update_state('show');
      $utility.find('.login .inner').slideDown(
        'fast',
        function() {
            $member_login_form.find('#member_id').focus();
        }
      );
    },
    toggle_login_form: function(){
      if ($utility.find('.login .inner').is(':hidden')) { 
        this.show_login_form();
      }
      else {   
        this.hide_login_form();
      }
    },
    set_logged_in_state: function(member_type_name, member_name){
      var bar_items = login_bar_items[member_type_name];
      var $membership_list = $utility.find('#membership');  
      var first_link = true;
      var that = this;

      $membership_list.empty();
      $.each(bar_items, function(i, menu_item){
        if (menu_item === 'login_button'){
          var $button = $('<a href="/login.html" id="show_login_form"><img src="/i/sso_lock.png" alt="secure login" /><span>Log&nbsp;In</span></a>');
          $button.bind('click', function(event) {
            that.toggle_login_form();
            event.preventDefault();
          });
          var $list_item = $('<li></li>').addClass('first').append($button);
          $membership_list.append($list_item);
        } else if (menu_item === 'welcome_message') {
          var $list_item = $('<li class="first welcome_message">Welcome&nbsp;<span class="member_id"></span>&nbsp;(&nbsp;<a href="/cgi-bin/sso.cgi?do=logout">Log Out</a>&nbsp;)</li>');
          $list_item.find('.member_id').html(member_name);
          $list_item.find("a").bind('click', function(event){
            $member_login_form.find('#member_pw').val('');
          });
          
          $membership_list.append($list_item);
        } else {
          var link = $('<a></a>').attr('href', menu_item['href'])
                       .html(menu_item['text'])
                       .addClass();
          var list_item = $('<li></li>').append(link);
          if (first_link){
            list_item.addClass('first');
            first_link = false;
          }
          $membership_list.append(list_item);
        }
      });
    },
    view_loaded_properly: function(){return true;}
  };
};

var ErrorDocLoginView = function() {
  var this_view = null;
  var controller;
  var $login_form = $('form#default');
  var $username_field = $login_form.find('#username');
  var $password_field = $login_form.find('#password');
  var $remember_me_field = $login_form.find('#remember_me');
  var $login_info = $login_form.find('#login-info');
  var $img = $('<img/>').attr({
      src: '/i/ajax-loader.gif', width: '16', height: '16'
  });
  var still_loading = false;

  if ($login_form.length == 0 || $username_field.length == 0 
      || $password_field.length == 0){
    return noop_view_functions;
  } else if(!$login_form[0].action
      || !$login_form[0].action.match(/\/cgi-bin\/sso.cgi$/)){
    return noop_view_functions;
  }
  // Just in case there is more tha one form#default, only use
  // the one(s) that has a #username field.
  if ($login_form.length > 1){
    $login_form = $username_field.parents('form#default');
  }
  return {
    initialize: function(ctrl, model){
      this_view = this;
      controller = ctrl;
      this.add_observers();

      $login_info.hide();
      $username_field.focus();
    },
    add_observers: function(){
      $login_form.submit(function(event){
        if (!still_loading){
          var id = $username_field.val();
          var pw = $password_field.val();
          var remember_me = $remember_me_field.is(':checked');
          controller.submit_login_form(this_view, id, pw, remember_me);  
        }
        event.preventDefault();
      });
    },
    update_state: function(state){
      if (state === 'loading'){
        still_loading = true;
        $login_info
            .empty()
            .append($img)
            .append(' Working...')
            .removeAttr('class')
            .show();
        $login_form.find('.error_wrapper').hide();
      }
    },
    show_error: function(error){
        /*
         * var msg = 'Login incorrect. Please double check that your user name and password are correct.';
         * $login_info.html(msg).attr('class', 'info').show();
         */
        $login_info.html('').attr('class', 'info').hide();
        $login_form.find('.error_wrapper').show();
        $username_field.focus();
        still_loading = false;
    },
    hide_login_form: function(){
    },
    set_logged_in_state: function(){
      
    },
    view_loaded_properly: function(){return true;}
  };
}

var LoginController = function() {
  return {
    initialize: function(model) {
      this.model = model;

      this.error_doc_view  = new ErrorDocLoginView();
      this.error_doc_view.initialize(this, model);

      this.topnav_view  = new TopNavLoginView();
      this.topnav_view.initialize(this, model);
    },
    submit_login_form: function(src_view, id, pw, remember_me) {
      var that = this;
      src_view.update_state('loading');
      this.model.login(id, pw, remember_me, function(obj){
        that.on_response(src_view, obj);
      });
    },
    on_response: function(src_view, obj) {
      if (obj.status === 'error') { 
        src_view.show_error(obj.msg); 
      } else { 
        this.topnav_view.set_logged_in_state(obj.type, obj.name);
        this.topnav_view.hide_login_form();

        this.error_doc_view.set_logged_in_state(obj.type, obj.name);
        this.error_doc_view.hide_login_form();
        
        var uri = window.location.href;
        if (window.location.pathname === '/login.html'){
          uri = '/';
        }
        window.location.replace(uri);
      }
    }
  };
};

$(document).ready(function() {
  var login_model      = new LoginModel();
  var login_controller = new LoginController();
  login_controller.initialize(login_model);

  // Set 'hint' on search box
  var $search_box = $('#utility #main_search');
  var search_hint = 'Search ACP Content';
  if ($search_box.val() === ''){
    $search_box.val(search_hint);
  }
  $search_box.focus(function(){
    if ($search_box.val() === search_hint){ 
      $search_box.val('');
    }
  });
  $search_box.blur(function(){
    if ($search_box.val() === ''){
      $search_box.val(search_hint);
    }
  });
});

})();


