var EmailAliasesFrame = {
	Name: "EmailAliasesFrame",
	ModifyRowID: -1,
  ModifyAction: 'none',
	SessionUser: null,
	UserList: null,
	LocalRecipientList: null,
	FilterProfileList: null,

  InitFrame: function() {
		EmailAliasesFrame.CreateEmailAliasesList();	
		HidePanelContent(jQuery("#EmailAliasesInputPanel"));
    jQuery("#EmailAliasesListPanel").contextMenu({menu: 'EmailAliasesListMenu'}, EmailAliasesFrame.HandleContextMenu);

		jQuery("#EmailAliasesEditForm").submit(EmailAliasesFrame.SubmitLocalRecipient);
		jQuery("#EmailAliasesCancelButton").click(EmailAliasesFrame.clickEmailAliasesCancelButton);
  },

  ShowFrame: function() {
		jQuery('#EmailAliasesFrame').show();
		EmailAliasesFrame.OnFrameResize();

    EmailAliasesFrame.LoadData();
		SetWindowKeyPressHandler(EmailAliasesFrame.OnKeyPress);
	},

  HideFrame: function() {
    jQuery('#EmailAliasesFrame').hide();
  },

	OnKeyPress: function(event) {
		switch (event.keyCode) {
			case 116:
				EmailAliasesFrame.LoadData();
				return false;
				break;
		}
	},
	
	OnLogoff: function() {
		jQuery("#EmailAliasesList").clearGridData();
	},
	
  OnFrameResize: function() {
		var listWidth = jQuery("#EmailAliasesInputPanel").width();
		var listHeight = Layout.state.container.innerHeight - Layout.state.north.size - Layout.state.south.size - jQuery("#EmailAliasesInputPanel").height() - 80;
		
    jQuery("#EmailAliasesList").setGridWidth(listWidth, false); 
    jQuery("#EmailAliasesList").setGridHeight(listHeight, false); 
  },

  CreateEmailAliasesList: function() {
    jQuery("#EmailAliasesList").jqGrid({
			datatype: "local",
			height: 250,
			colNames:[_('ID'), '', _('E-Mail Address'), _('Filter profile'), _('Deputies')],
			colModel:[
				{name:'id',index:'id', width:200, hidden:true},
				{name:'image',index:'image', width:20, formatter:EmailAliasesFrame.ImageFormatter},
				{name:'alias',index:'alias', width:300},
				{name:'profile',index:'profiles', width:300},
				{name:'deputies',index:'deputies', width:500}
				],
			imgpath: gridimgpath,
			autoencode: true,
			multiselect: false,
			onSelectRow: EmailAliasesFrame.OnSelectEmailAliasesListRow,
			onRightClickRow: EmailAliasesFrame.OnRightClickEmailAliasesList,
			ondblClickRow: EmailAliasesFrame.OnDblClickEmailAliasesList
    }); 
  },

	ImageFormatter: function (cellvalue, options, rowObject) {
		if (rowObject.alias == EmailAliasesFrame.SessionUser.PrimaryAddress) {
      return '<img src="/gui/images/icons/id_card_ok.png">';
		} else {
      return '<img src="/gui/images/icons/id_card.png">';
		}
  },

  HandleContextMenu: function(action, el, pos) {
		switch(action) {
			case 'Add':
			  EmailAliasesFrame.AddLocalRecipient();
			  break;
			case 'Edit':
			  EmailAliasesFrame.EditLocalRecipient();
			  break;
			case 'Delete':
			  EmailAliasesFrame.DeleteLocalRecipient();
			  break;
			case 'SetPrimary':
			  EmailAliasesFrame.SetPrimaryAddress();
			  break;
		}
	},

  OnSelectEmailAliasesListRow: function(rowid, status) {
	  EmailAliasesFrame.SelectedListRow = rowid;
	},

  OnRightClickEmailAliasesList: function(rowid, iRow, iCol) {
		EmailAliasesFrame.SelectedListRow = rowid;
  },

  OnDblClickEmailAliasesList: function(rowid, iRow, iCol) {
    EmailAliasesFrame.HandleContextMenu('Edit', null, null);
  },

	LoadData: function() {
	  jQuery("#lui_EmailAliasesList, #load_EmailAliasesList").show();
    EmailAliasesFrame.LoadUserList();
  },

	LoadDataIntoGrid: function() {
		var ProfileName = 'unknown';
		var Profile;
		var Deputies = '';
		
	  jQuery("#EmailAliasesList").clearGridData();

    for (var i = 0; i < EmailAliasesFrame.LocalRecipientList.length; i++) {
			Profile = GetProfileByID(EmailAliasesFrame.FilterProfileList, EmailAliasesFrame.LocalRecipientList[i].ProfileID);
			if (Profile != null) {
				ProfileName = Profile.Name;
			}
			
			Deputies = '';
			for (var j = 0; j < EmailAliasesFrame.LocalRecipientList[i].Deputies.length; j++) {
				var User = GetUserByID(EmailAliasesFrame.UserList, parseInt(EmailAliasesFrame.LocalRecipientList[i].Deputies[j]));
				
				if (User != null) {
				  if (Deputies == '') {
					  Deputies = Deputies + User.Username + '@' + User.Realm;
					}	else {
					  Deputies = Deputies +  ', ' + User.Username + '@' + User.Realm;
					}	
				}
			}
			
	    Row = {id:EmailAliasesFrame.LocalRecipientList[i].ID,
			       image:'',
			       alias:EmailAliasesFrame.LocalRecipientList[i].EmailAddress,
			       profile:ProfileName,
						 deputies:Deputies
						};

      jQuery("#EmailAliasesList").addRowData(i+1, Row); 
	  }

	  jQuery("#lui_EmailAliasesList, #load_EmailAliasesList").hide();
	},

  //----------------------------------------------------------------------------------------------------------------

	LoadUserList: function() {
    var service = new CoreService(serviceURL, Session.SessionID);

    service.GetUserList(
      {
        success: EmailAliasesFrame.GetUserList,
        failure: ErrorHandler
      }
    );
  },

  GetUserList: function(result) {
		EmailAliasesFrame.UserList = result.Users;
		EmailAliasesFrame.SessionUser = GetUserByID(EmailAliasesFrame.UserList, Session.UserID);
    EmailAliasesFrame.LoadFilterProfileList();
  },

  //----------------------------------------------------------------------------------------------------------------

	LoadFilterProfileList: function() {
    var service = new Spamfinder(serviceURL, Session.SessionID);

    service.GetFilterProfileList(
      {
        success: EmailAliasesFrame.GetFilterProfileList,
        failure: ErrorHandler
      }
    );
  },

  GetFilterProfileList: function(result) {
		EmailAliasesFrame.FilterProfileList = result.FilterProfiles;

    EmailAliasesFrame.RefreshFilterProfileList();
    EmailAliasesFrame.LoadLocalRecipientList();
  },

  //----------------------------------------------------------------------------------------------------------------

	LoadLocalRecipientList: function() {
    var service = new CoreService(serviceURL, Session.SessionID);

    service.GetLocalRecipientList(0,
      {
        success: EmailAliasesFrame.GetLocalRecipientList,
        failure: ErrorHandler
      }
    );
  },

  GetLocalRecipientList: function(result) {
		EmailAliasesFrame.LocalRecipientList = result.LocalRecipients;
		EmailAliasesFrame.LoadDataIntoGrid();
  },

	RefreshFilterProfileList: function() {
	  var FilterProfileList = document.getElementById("EmailAliasesProfileList");
		
    // Remove all options
    while (FilterProfileList.hasChildNodes()) {
      FilterProfileList.removeChild(FilterProfileList.firstChild);
    }
		
		for (var i = 0; i < EmailAliasesFrame.FilterProfileList.length; i++) {
			if (EmailAliasesFrame.FilterProfileList[i].AllowUser) {
        var option = document.createElement("option");
    		option.value = EmailAliasesFrame.FilterProfileList[i].ID;
	    	option.appendChild(document.createTextNode(EmailAliasesFrame.FilterProfileList[i].Name));
        FilterProfileList.appendChild(option);
			}
		}
	},

	RefreshDeputyList: function(LocalRecipient) {
		// Reset EmailAliasesDeputyList
		jQuery("#EmailAliasesDeputyListContainer").html('<select id="EmailAliasesDeputyList" multiple="multiple"></select>');

	  DeputyList = document.getElementById("EmailAliasesDeputyList");
		
    // Remove all options
    while (DeputyList.hasChildNodes()) {
      DeputyList.removeChild(DeputyList.firstChild);
    }
		
		// Sort user list
		EmailAliasesFrame.UserList.sort(SortUserListByUserName);
		
		for (var i = 0; i < EmailAliasesFrame.UserList.length; i++) {
			if (EmailAliasesFrame.UserList[i].ID == 1) { continue; }  // No admin
			if (EmailAliasesFrame.UserList[i].Realm != Session.Realm) { continue; }  // Only users from the same Realm
			if (EmailAliasesFrame.UserList[i].ID == Session.UserID) { continue; }  // Don't add the user self

   		var option = document.createElement("option");
  		option.value = EmailAliasesFrame.UserList[i].ID;
			
			//Check if user is in deputy list
			for (var j = 0; j < LocalRecipient.Deputies.length; j++) {
				if (parseInt(LocalRecipient.Deputies[j]) == EmailAliasesFrame.UserList[i].ID) {
			    option.selected = true;
				  break;
				}
			}
			
			option.appendChild(document.createTextNode(EmailAliasesFrame.UserList[i].Username));
      DeputyList.appendChild(option);
		}
		
		jQuery('#EmailAliasesDeputyList').toChecklist();
		jQuery('#EmailAliasesDeputyList_checklist').height(150);
		jQuery('#EmailAliasesDeputyList_checklist').width(300);
		
		if (Session.GroupPolicy.CommonRules.DisableDeputies) { 
		  jQuery("#EmailAliasesDeputyListContainer").block({ message:null, overlayCSS:{opacity:0.1, cursor:'not-allowed'} });
		} else {
		  jQuery("#EmailAliasesDeputyListContainer").unblock();
		}
	},

	AddLocalRecipient: function() {
	  if (Session.GroupPolicy.CommonRules.DisableUserAddressChanges) {
			jAlert(_('This function was disabled by the administrator.'), _('Information'));
			return;
		}	
	
	  RequestAliasDialog.RequestAlias(function(result) {
		    if (result) {
				  EmailAliasesFrame.LoadData();
				}
			});
	},
	
	EditLocalRecipient: function() {
	  if (Session.GroupPolicy.CommonRules.DisableUserAddressChanges) {
			jAlert(_('This function was disabled by the administrator.'), _('Information'));
			return;
		}	

  	EmailAliasesFrame.ModifyRowID = jQuery("#EmailAliasesList").getGridParam('selrow'); 
		if( EmailAliasesFrame.ModifyRowID == null ) {
			jAlert(_('No row selected.'), _('Information'));
  		return;
		}

    var RowData = jQuery("#EmailAliasesList").getRowData(EmailAliasesFrame.ModifyRowID); 

    var LocalRecipient = GetLocalRecipientByID(EmailAliasesFrame.LocalRecipientList, RowData.id);

    document.getElementById("EmailAliasesEmailAddress").value = RowData.alias;
		document.getElementById("EmailAliasesEmailAddress").disabled = true;
		
		selectOptionByValue(document.getElementById("EmailAliasesProfileList"), LocalRecipient.ProfileID);
		document.getElementById("EmailAliasesProfileList").disabled = Session.GroupPolicy.SpamfinderRules.DisableProfileSelection;

		EmailAliasesFrame.RefreshDeputyList(LocalRecipient);
		
    EmailAliasesFrame.ModifyAction = 'EditLocalRecipient';
 		ShowPanelContent(jQuery("#EmailAliasesInputPanel"));
		EmailAliasesFrame.OnFrameResize();
		
    jQuery("#EmailAliasesProfileList").width(document.getElementById("EmailAliasesEmailAddress").offsetWidth);
    jQuery("#EmailAliasesListPanel").disableContextMenu();
		
    document.getElementById("EmailAliasesProfileList").focus();
	},

//----------------------------------------------------------------------------------------------------------------
	
	DeleteLocalRecipient: function() {
	  if (Session.GroupPolicy.CommonRules.DisableUserAddressChanges) {
			jAlert(_('This function was disabled by the administrator.'), _('Information'));
			return;
		}	

		EmailAliasesFrame.ModifyRowID = jQuery("#EmailAliasesList").getGridParam('selrow'); 
		if( EmailAliasesFrame.ModifyRowID == null ) {
			jAlert(_('No row selected.'), _('Information'));
  		return;
		}

		jConfirm(_('Do you want to delete the selected items ?'), _('Confirmation'),
		function(r) {
		  if (r) {
				jQuery("#EmailAliasesListPanel").disableContextMenu();

				var RowData = jQuery("#EmailAliasesList").getRowData(EmailAliasesFrame.ModifyRowID); 

				var service = new CoreService(serviceURL, Session.SessionID);
				service.DeleteLocalRecipient(RowData.id,
					{
						success: EmailAliasesFrame._DeleteLocalRecipient,
						failure: ErrorHandler
					}
				);
			}
		});
	},

  _DeleteLocalRecipient: function() {
    jQuery("#EmailAliasesList").delRowData(EmailAliasesFrame.ModifyRowID);
		EmailAliasesFrame.ModifyRowID = -1;
    jQuery("#EmailAliasesListPanel").enableContextMenu();
		jAlert(_('Selected items sucessfully deleted'), _('Information'));
	},

//----------------------------------------------------------------------------------------------------------------
	
	SetPrimaryAddress: function() {
		EmailAliasesFrame.ModifyRowID = jQuery("#EmailAliasesList").getGridParam('selrow'); 
		if( EmailAliasesFrame.ModifyRowID == null ) {
			jAlert(_('No row selected.'), _('Information'));
  		return;
		}

    jQuery("#EmailAliasesListPanel").disableContextMenu();

		var RowData = jQuery("#EmailAliasesList").getRowData(EmailAliasesFrame.ModifyRowID); 

		var service = new CoreService(serviceURL, Session.SessionID);
		service.SetPrimaryAddress(RowData.alias,
			{
				success: EmailAliasesFrame._SetPrimaryAddress,
				failure: ErrorHandler
			}
		);
	},

  _SetPrimaryAddress: function() {
		EmailAliasesFrame.ModifyRowID = -1;
    jQuery("#EmailAliasesListPanel").enableContextMenu();
		EmailAliasesFrame.LoadData();
	},
	
//----------------------------------------------------------------------------------------------------------------

  clickEmailAliasesCancelButton: function() {
    EmailAliasesFrame.ModifyAction = 'none';
    HidePanelContent(jQuery("#EmailAliasesInputPanel"));
		EmailAliasesFrame.OnFrameResize();
		
    jQuery("#EmailAliasesListPanel").enableContextMenu();
	},	

//----------------------------------------------------------------------------------------------------------------

  SubmitLocalRecipient: function() {
		switch(EmailAliasesFrame.ModifyAction) {
			case 'AddLocalRecipient':
			  break;
			case 'EditLocalRecipient':
					var RowData = jQuery("#EmailAliasesList").getRowData(EmailAliasesFrame.ModifyRowID); 
					var LocalRecipient = GetLocalRecipientByID(EmailAliasesFrame.LocalRecipientList, RowData.id);
			
			    var LocalRecipientList = document.getElementById("EmailAliasesProfileList");
			    LocalRecipient.ProfileID = LocalRecipientList.options[LocalRecipientList.selectedIndex].value;

					// Build Deputy List
					var x = 0;
					LocalRecipient.Deputies = new Array();
					for (var i=0 ; i < EmailAliasesFrame.UserList.length ; i++) {
					  if (jQuery("#EmailAliasesDeputyList_" + EmailAliasesFrame.UserList[i].ID).is(':checked')) {
							LocalRecipient.Deputies[x] = EmailAliasesFrame.UserList[i].ID;
							x++;
						}
					}
					
					var service = new CoreService(serviceURL, Session.SessionID);
					service.SaveLocalRecipient(LocalRecipient,
						{
							success: EmailAliasesFrame._SaveLocalRecipient,
							failure: ErrorHandler
						}
					);
			  break;
		}
		
		return false;
	},
	
  _SaveLocalRecipient: function() {
    EmailAliasesFrame.ModifyAction = 'none';
    HidePanelContent(jQuery("#EmailAliasesInputPanel"));
    EmailAliasesFrame.OnFrameResize();
	 
    jQuery("#EmailAliasesListPanel").enableContextMenu();

    EmailAliasesFrame.LoadData();
	}
}
