//TODO: The transfer should be in one transaction.
    protected void btnTransfer_Click(object sender, EventArgs e)
    {
        if (ddlTransferDeparment.SelectedValue == ddlDepartment.SelectedValue)
        {
            SetErrorMessage("Source and Target Departments are the same");
            return;
        }
        int targetCoId = int.Parse(ddlTransferCompany.SelectedValue);
        int targetDeptId = int.Parse(ddlTransferDeparment.SelectedValue);
        foreach (GridViewRow gr in gvDocs.Rows)
        {
            CheckBox cb = (CheckBox)gr.FindControl("cbSelect");
            HiddenField hfDocId = (HiddenField)gr.FindControl("hfDocId");
            if (cb.Checked)
            {
                DepartmentOrderDoc.DocumentEntityRow document = DatabaseUtility.GetDocument(int.Parse(hfDocId.Value));
                DepartmentOrderDoc.DocumentTypeEntityRow documentType = DatabaseUtility.GetDocumentType(document.co_id, document.dept_id, document.doc_type_id);

                //see if the document type exists in the target co and dept. If not then create it
                DepartmentOrderDoc.DocumentTypeEntityRow targetDocumentType = DatabaseUtility.GetDocumentType(targetCoId,targetDeptId, documentType.doc_data_type_desc);
                if (targetDocumentType == null)
                {
                    DepartmentOrderDocTableAdapters.DocumentTypeTableAdapter docTypeTA = new DepartmentOrderDocTableAdapters.DocumentTypeTableAdapter();
                    docTypeTA.Insert1(documentType.doc_data_type_desc, false, targetCoId, targetDeptId, documentType.sort_order, documentType.field_type, documentType.generator_class,
                        documentType.required, documentType.style, documentType.flg_landscape, documentType.num_of_sections, documentType.flg_checked);
                    targetDocumentType = DatabaseUtility.GetDocumentType(targetCoId, targetDeptId, documentType.doc_data_type_desc);
                }

                //see if the category exists in the target co and dept. If not then create it
                Categories.CategoryEntityRow targetCategory = DatabaseUtility.GetCategory(targetCoId, targetDeptId, "D", document.category_name);
                if (targetCategory == null)
                {
                    CategoriesTableAdapters.CategoryTableAdapter catTA = new CategoriesTableAdapters.CategoryTableAdapter();
                    catTA.Insert(targetCoId, targetDeptId, document.category_name, "D");
                    targetCategory = DatabaseUtility.GetCategory(targetCoId, targetDeptId, "D", document.category_name);
                }
                byte[] fileContents = null;

                //get fille contents if they are present
                DepartmentOrderDocTableAdapters.DocumentContentTableAdapter docContentTA = new DepartmentOrderDocTableAdapters.DocumentContentTableAdapter();
                IEnumerator iEDocContents = docContentTA.GetDocumentContentById(document.doc_id, document.co_id, document.dept_id).GetEnumerator();
                if (iEDocContents.MoveNext())
                {
                    fileContents = ((DepartmentOrderDoc.DocumentContentEntityRow)iEDocContents.Current).file_contents;
                }

                DepartmentOrderDocTableAdapters.DocumentTableAdapter docTA = new DepartmentOrderDocTableAdapters.DocumentTableAdapter();
                docTA.Insert1(targetCoId, targetDeptId, targetDocumentType.doc_data_type_id, document.doc_name, document.doc_desc, document.doc_code,
                    targetCategory.category_id, document.doc_index, fileContents,document.flg_default);

            }
        }
        SetInfoMessage(WebConstants.Messages.Information.RECORD_SAVED);
    }
    protected void btnAddCategory_Click(object sender, EventArgs e)
    {
        int coId = (int)Session[WebConstants.Session.USER_CO_ID];
        int deptId = int.Parse(ddlDepartment.SelectedValue);

        CategoriesTableAdapters.CategoryTableAdapter ta = new CategoriesTableAdapters.CategoryTableAdapter();
        if (ta.GetCategoryByName(deptId, coId, CategoryType, tbCategory.Text, 0).GetEnumerator().MoveNext())
        {
            SetErrorMessage(WebConstants.Messages.Error.ALREAD_EXISTS);
        }
        else
        {
            ta.Insert(coId, deptId, tbCategory.Text, CategoryType);
            gvCategories.DataBind();
        }
    }
    protected void btnTransfer_Click(object sender, EventArgs e)
    {
        if (ddlTransferDeparment.SelectedValue == ddlDepartment.SelectedValue)
        {
            SetErrorMessage("Source and Target Departments are the same");
            return;
        }
        int targetCoId = int.Parse(ddlTransferCompany.SelectedValue);
        int targetDeptId = int.Parse(ddlTransferDeparment.SelectedValue);

        int sourceCoId = int.Parse(ddlCompany.SelectedValue);
        int sourceDeptId = int.Parse(ddlDepartment.SelectedValue);
        bool isInserted = false;
        foreach (GridViewRow gr in gvDocTypes.Rows)
        {
            CheckBox cb = (CheckBox)gr.FindControl("cbSelect");
            if (cb.Checked)
            {
                int docTypeId = int.Parse(((HiddenField)gr.FindControl("hfDocTypeId")).Value);
                DepartmentOrderDoc.DocumentTypeEntityRow documentType = DatabaseUtility.GetDocumentType(sourceCoId, sourceDeptId, docTypeId);
                if (documentType != null)
                {
                    DepartmentOrderDocTableAdapters.DocumentTypeTableAdapter docTypeTA = new DepartmentOrderDocTableAdapters.DocumentTypeTableAdapter();
                    IEnumerator ie = docTypeTA.GetDocTypeByDeptId(targetDeptId, targetCoId).GetEnumerator();
                    bool alreadyExists = false;
                    while (ie.MoveNext())
                    {
                        DepartmentOrderDoc.DocumentTypeEntityRow targetDocType = (DepartmentOrderDoc.DocumentTypeEntityRow)ie.Current;
                        if (targetDocType.doc_data_type_desc == documentType.doc_data_type_desc)
                        {
                            SetErrorMessage(WebConstants.Messages.Error.ALREAD_EXISTS);
                            alreadyExists = true;
                            break;
                        }
                    }
                    if (alreadyExists == false)
                    {
                        Nullable<bool> flgLandscape = null;
                        if (documentType.Isflg_landscapeNull() == false) flgLandscape = documentType.flg_landscape;
                        Nullable<int> numOfSections = null;
                        if (documentType.Isnum_of_sectionsNull() == false) numOfSections = documentType.num_of_sections;

                        docTypeTA.DocumentTypeInsert(documentType.doc_data_type_desc, false, targetCoId, targetDeptId, documentType.sort_order,
                            (documentType.Isfield_typeNull()) ? null : documentType.field_type, (documentType.Isgenerator_classNull()) ? null : documentType.generator_class,
                            documentType.required, (documentType.IsstyleNull()) ? null : documentType.style, flgLandscape,
                            numOfSections, documentType.flg_checked, (documentType.IscategoryNull()) ? null : documentType.category);
                        isInserted = true;

                        if (cbTransferDocs.Checked)
                        {
                            DepartmentOrderDoc.DocumentTypeEntityRow targetDocType = DatabaseUtility.GetDocumentType(targetCoId, targetDeptId, documentType.doc_data_type_desc);
                            if (targetDocType != null)
                            {
                                //insert templates section
                                DocumentTemplateTableAdapters.DocumentSectionTableAdapter sectionTA = new DocumentTemplateTableAdapters.DocumentSectionTableAdapter();
                                IEnumerator ieSections = sectionTA.GetByDocType(sourceCoId, sourceDeptId, docTypeId).GetEnumerator();
                                while (ieSections.MoveNext())
                                {
                                    DocumentTemplate.DocumentSectionEntityRow sourceSection = (DocumentTemplate.DocumentSectionEntityRow)ieSections.Current;
                                    DocumentTemplate.DocumentSectionEntityRow targetSection = DatabaseUtility.GetSection(targetCoId, targetDeptId, sourceSection.section_desc);
                                    if (targetSection == null)
                                    {
                                        sectionTA.Insert(false, targetCoId, targetDeptId, sourceSection.section_index, sourceSection.section_desc, sourceSection.section_type,
                                            targetDocType.doc_data_type_id, sourceSection.repeat_columns);
                                        targetSection = DatabaseUtility.GetSection(targetCoId, targetDeptId, sourceSection.section_desc);
                                    }
                                    //insert section details for the sections for which it exists
                                    DocumentTemplateTableAdapters.DocumentSectionDetailsTableAdapter sectionDetailTA = new DocumentTemplateTableAdapters.DocumentSectionDetailsTableAdapter();
                                    IEnumerator ieSectionDetails = sectionDetailTA.GetBySecId(sourceCoId, sourceDeptId, sourceSection.section_id).GetEnumerator();
                                    while (ie.MoveNext())
                                    {
                                        DocumentTemplate.DocumentSectionDetailsEntityRow sourceSectionDetail = (DocumentTemplate.DocumentSectionDetailsEntityRow)ieSectionDetails.Current;
                                        DocumentTemplate.DocumentSectionDetailsEntityRow targetSectionDetail = DatabaseUtility.GetSectionDetail(targetCoId, targetDeptId, targetSection.section_id, sourceSectionDetail.section_detail_desc);
                                        if (targetSectionDetail == null)
                                        {
                                            sectionDetailTA.Insert(targetSection.section_id, targetCoId, targetDeptId, sourceSectionDetail.section_detail_index, sourceSectionDetail.section_detail_desc);
                                        }
                                    }
                                }
                                //insert docs
                                DepartmentOrderDocTableAdapters.DocumentTableAdapter docTA = new DepartmentOrderDocTableAdapters.DocumentTableAdapter();
                                IEnumerator ieDocs = docTA.GetDocsByTypeId(sourceCoId, sourceDeptId, docTypeId).GetEnumerator();
                                {
                                    DepartmentOrderDoc.DocumentEntityRow sourceDocument = (DepartmentOrderDoc.DocumentEntityRow)ieDocs.Current;
                                    DepartmentOrderDoc.DocumentEntityRow targetDocument = DatabaseUtility.GetDocument(targetCoId, targetDeptId, targetDocType.doc_data_type_id, sourceDocument.doc_name);
                                    if (targetDocument == null)
                                    {
                                        Categories.CategoryEntityRow targetCategory = DatabaseUtility.GetCategory(targetCoId, targetDeptId, "D", sourceDocument.category_name);
                                        if (targetCategory == null)
                                        {
                                            CategoriesTableAdapters.CategoryTableAdapter catTA = new CategoriesTableAdapters.CategoryTableAdapter();
                                            catTA.Insert(targetCoId, targetDeptId, sourceDocument.category_name, "D");
                                            targetCategory = DatabaseUtility.GetCategory(targetCoId, targetDeptId, "D", sourceDocument.category_name);
                                        }
                                        byte[] fileContents = null;

                                        //get fille contents if they are present
                                        DepartmentOrderDocTableAdapters.DocumentContentTableAdapter docContentTA = new DepartmentOrderDocTableAdapters.DocumentContentTableAdapter();
                                        IEnumerator iEDocContents = docContentTA.GetDocumentContentById(sourceDocument.doc_id, sourceCoId, sourceDeptId).GetEnumerator();
                                        if (iEDocContents.MoveNext())
                                        {
                                            fileContents = ((DepartmentOrderDoc.DocumentContentEntityRow)iEDocContents.Current).file_contents;
                                        }

                                        docTA.Insert1(targetCoId, targetDeptId, targetDocType.doc_data_type_id, sourceDocument.doc_name, sourceDocument.doc_desc, sourceDocument.doc_code,
                                            targetCategory.category_id, sourceDocument.doc_index, fileContents,sourceDocument.flg_default);

                                    }
                                }

                                //insert template items
                            }
                        }
                    }
                }
            }
        }
        if (isInserted)
        {
            ddlCompany.SelectedValue = ddlTransferCompany.SelectedValue;
            ddlDepartment.DataBind();
            ddlDepartment.SelectedValue = ddlTransferDeparment.SelectedValue;
            gvDocTypes.DataBind();
            SetInfoMessage(WebConstants.Messages.Information.RECORD_SAVED);
        }
    }