Imports AppCommon

Partial Class recruit_Hunt
    Inherits System.Web.UI.Page

#Region "******************** ページイベント ********************"

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        '---------------------------------------------------------------
        'HTMLタグを追加
        '---------------------------------------------------------------
        Dim ctl As Control = Page.Master.FindControl("msp_header")
        'CSS
        SetTagCss(ctl, "hunt.css")

        If IsPostBack Then
            Exit Sub
        End If

        '2ページ以上の場合のみページャを表示
        SetPagerVisible(HasMultiplePages(0))
    End Sub

#End Region

#Region "***************** コントロールイベント *****************"

    Protected Sub lv_就職活動一覧_ItemCommand(ByVal sender As Object, ByVal e As ListViewCommandEventArgs) Handles lv_就職活動一覧.ItemCommand
        ClearMessage()
    End Sub

    Protected Sub lv_就職活動一覧_ItemInserting(sender As Object, e As ListViewInsertEventArgs) Handles lv_就職活動一覧.ItemInserting
        '初期化
        ClearMessage()
        e.Cancel = True

        '入力チェック
        If String.IsNullOrEmpty(e.Values("活動年度")) Then
            SetErrorMessage("活動年度を入力してください。")
            Exit Sub
        End If

        If Not Regex.IsMatch(e.Values("活動年度"), "^[0-9]{4}$") Then
            SetErrorMessage("活動年度は数値4桁で入力してください。")
            Exit Sub
        End If

        If String.IsNullOrEmpty(e.Values("区分CD")) Then
            SetErrorMessage("活動区分を選択してください。")
            Exit Sub
        End If

        Dim selected_company_code As String = DirectCast(lv_就職活動一覧.InsertItem.FindControl("企業選択"), DropDownList).SelectedValue
        If String.IsNullOrEmpty(selected_company_code) Then
            SetErrorMessage("企業を選択してください。")
            Exit Sub
        End If

        Dim splited_company_code As String() = selected_company_code.Split(" "c)
        If IsNothing(splited_company_code) OrElse splited_company_code.Length <> 2 Then
            SetErrorMessage("選択された企業情報が正しくありません。管理者に問い合わせてください。")
            Exit Sub
        End If

        If Not IsDateString(e.Values("活動日")) Then
            SetErrorMessage("活動日に正しい日付を入力してください。")
            Exit Sub
        End If

        If Not IsDateString(e.Values("採否日")) Then
            SetErrorMessage("採否日に正しい日付を入力してください。")
            Exit Sub
        End If

        'パラメータ設定
        e.Values.Add("企業CD", splited_company_code(0))
        e.Values.Add("拠点CD", splited_company_code(1))
        e.Values("活動年度") = Short.Parse(e.Values("活動年度").ToString)

        If lv_就職活動一覧.DataKeys.Count = 0 Then
            e.Cancel = False
            Exit Sub
        End If

        '主キー重複チェック (セッション変数に請求NOがないため、既存DataKeyから取得。セッション変数に請求NOを持つようになれば、CreateArrayを使わずきれいにできる。)
        Dim new_key As Object() = CreateArray(lv_就職活動一覧.DataKeyNames, e.Values, lv_就職活動一覧.DataKeys(0).Values("請求NO"))
        If IsDublicateKey(lv_就職活動一覧.DataKeys, new_key) Then
            SetErrorMessage("活動内容が重複しています。")
            Exit Sub
        End If

        e.Cancel = False
    End Sub

    Protected Sub lv_就職活動一覧_ItemInserted(sender As Object, e As ListViewInsertedEventArgs) Handles lv_就職活動一覧.ItemInserted
        SetPagerVisible(HasMultiplePages(+1))
    End Sub

    Protected Sub lv_就職活動一覧_ItemUpdating(sender As Object, e As ListViewUpdateEventArgs) Handles lv_就職活動一覧.ItemUpdating
        ClearMessage()
        e.Cancel = True

        If Not IsDateString(e.NewValues("活動日")) Then
            SetErrorMessage("活動日に正しい日付を入力してください。")
            Exit Sub
        End If

        If Not IsDateString(e.NewValues("採否日")) Then
            SetErrorMessage("採否日に正しい日付を入力してください。")
            Exit Sub
        End If

        e.Cancel = False
    End Sub

    Protected Sub lv_就職活動一覧_ItemDeleted(sender As Object, e As ListViewDeletedEventArgs) Handles lv_就職活動一覧.ItemDeleted
        SetPagerVisible(HasMultiplePages(-1))

        If lv_就職活動一覧.Items.Count > 1 Then
            Exit Sub
        End If

        'データ1件のみのページであった場合、削除したら1つ前のページに戻る。
        Using pager As uc_Pager = DirectCast(lv_就職活動一覧.Controls(0).FindControl("div_就職活動一覧_top").FindControl("pg_就職活動一覧_top"), uc_Pager)
            pager.SetPageIndex(pager.CurrentPageIndex - 1)
        End Using
    End Sub

    Protected Sub 企業名_TextChanged(sender As Object, e As EventArgs)
        sql_企業.SelectParameters("企業名").DefaultValue = DirectCast(lv_就職活動一覧.InsertItem.FindControl("企業名"), TextBox).Text

        Using ddl As DropDownList = DirectCast(lv_就職活動一覧.InsertItem.FindControl("企業選択"), DropDownList)
            Dim null_item As ListItem = ddl.Items(0)

            ddl.Items.Clear()
            If String.IsNullOrEmpty(null_item.Value) Then
                ddl.Items.Add(null_item)
            End If
            ddl.DataBind()

            If ddl.Items.Count = 2 Then
                ddl.SelectedIndex = 1
            End If
        End Using
    End Sub

#End Region

#Region "******************* Sub及びFunction ********************"

    'レコード挿入/削除時に、実件数とページャが認識する件数で差が発生するためoffsetで件数を調整 (実装方法が悪い。時間があれば改善したい。)
    Private Function HasMultiplePages(ByVal offset As Integer) As Boolean
        Using pager As uc_Pager = DirectCast(lv_就職活動一覧.Controls(0).FindControl("div_就職活動一覧_top").FindControl("pg_就職活動一覧_top"), uc_Pager)
            Return (pager.TotalRowCount + offset) > pager.PageSize
        End Using
    End Function

    Private Sub SetPagerVisible(ByVal visible As Boolean)
        lv_就職活動一覧.Controls(0).FindControl("div_就職活動一覧_top").Visible = visible
        lv_就職活動一覧.Controls(0).FindControl("div_就職活動一覧_bottom").Visible = visible
    End Sub

    Private Sub ClearMessage()
        SetMessage(Nothing, Nothing)
    End Sub

    Private Sub SetErrorMessage(ByVal msg As String)
        SetMessage(msg, "error")
    End Sub

    Private Sub SetMessage(ByVal msg As String, ByVal type As String)
        lbl_Error.Text = msg
    End Sub

    Private Function IsDateString(ByVal value As String) As Boolean
        Return String.IsNullOrEmpty(value) OrElse DateTime.TryParse(value, Nothing)
    End Function

    Private Function CreateArray(ByVal names As String(), ByVal values As IOrderedDictionary, ByVal no As Integer) As Object()
        Return names.Select(Function(name) If(name = "請求NO", no, values(name))).ToArray()
    End Function

    Private Function IsDublicateKey(ByVal existing_keys As DataKeyArray, ByVal new_key As Object()) As Boolean
        Dim key_values As Object() = New Object(new_key.Length - 1) {}

        For Each key As DataKey In existing_keys
            key.Values.Values.CopyTo(key_values, 0)
            If key_values.SequenceEqual(new_key) Then
                Return True
            End If
        Next
        Return False
    End Function

#End Region

End Class