private void btnSubmit_Click(object sender, EventArgs e)
        {
            if (!this.checkRequiredFields())
                return;
            
            BookDAO dao = new BookDAO(_topParent.CurrentDatabase.FullName);

            bool success = dao.LoanBook(_bookId, this.txtLoanTo.Text);
            if (!success)
            {
                MessageBox.Show("An unknown error occurred and this book was not updated.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.Close();
            }
            else
            {
                _topParent.SetStatusStripText("Book " + this.lblBook.Text + " was successfully loaned to " + this.txtLoanTo.Text);
                this.Close();
            }
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            MainForm form = (MainForm)this.MdiParent;
            BookDAO dao = new BookDAO(form.CurrentDatabase.FullName);
            this.clearErrors();
            for (int i = 0; i < _textboxes.Length; i++)
            {

                string isbn = _textboxes[i].Text;
                string uri = Constants.GetWebServiceURI("isbn", isbn);
                if (isbn == null || isbn.Equals(""))
                    continue;

                TextBox txtbox = _textboxes[i];
                Label lbl = _resultLabels[i];

                this.setTextBox(txtbox, lbl, "Processing...", Color.Blue, true, true);

                WebRequest request = null;
                WebResponse response = null;
                try
                {
                    request = WebRequest.Create(uri);
                    response = request.GetResponse();
                }
	            catch(WebException e2)
	            {
	            	MessageBox.Show(ErrorMessages.Common.WEB_SERVICE_ERROR, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
	            	this.setTextBox(txtbox,lbl,"No Connection",Color.Red,true,false);
	            	return;
	            }
	            catch (Exception e1)
	            {
	                ExceptionHandler.HandleException(e1);
	                this.setTextBox(txtbox, lbl, "Failure", Color.Red, true, false);
	       			continue;
	            }
            

                Element element = XMLParser.ParseXML(response.GetResponseStream());
#if DEBUG
                string tree = "";
                int level = 0;
                XMLParser.GetParseTreeInfo(element, ref tree, ref level);
                Console.Out.WriteLine(tree);
#endif
                Book book = new Book();
                Constants.XMLResultReturnValue result = book.FillFromXMLResults(element);


                if (result == Constants.XMLResultReturnValue.NOT_FOUND)
                    this.setTextBox(txtbox, lbl, "Not Found", Color.Red, true, false);
                else if (result == Constants.XMLResultReturnValue.UNKNOWN)
                    this.setTextBox(txtbox, lbl, "Failure", Color.Red, true, false);
                else if (book != null)
                {
                    if (_mode == Constants.LibraryMode.LIBRARY && dao.ExistsInLibrary(book))
                        this.setTextBox(txtbox, lbl, "Already Exists", Color.Red, true, false);
                    else if (_mode == Constants.LibraryMode.WISHLIST && dao.ExistsInWishList(book))
                        this.setTextBox(txtbox, lbl, "Already Exists", Color.Red, true, false);
                    else if (_mode == Constants.LibraryMode.LIBRARY && !dao.InsertIntoLibrary(book))
                        this.setTextBox(txtbox, lbl, "Failure", Color.Red, true, false);
                    else if (_mode == Constants.LibraryMode.WISHLIST && !dao.InsertIntoWishList(book))
                        this.setTextBox(txtbox, lbl, "Failure", Color.Red, true, false);
                    else
                    {
                        this.setTextBox(txtbox, lbl, "Success", Color.Green, true, false);

                        foreach (Form f in this.MdiParent.MdiChildren)
                        {
                            if (f is ViewBooksForm)
                                (f as ViewBooksForm).Refresh();
                        }
                    }
                }
            }
        }
 /// <summary>
 /// This calls on the dao to get the results depending on the mode we are currently in
 /// </summary>
 /// <param name="mode"></param>
 /// <param name="value"></param>
 public void Search(Constants.SearchMode mode, string value)
 {
     MainForm main = (MainForm)this.ParentForm.MdiParent;
     BookDAO dao = new BookDAO(main.CurrentDatabase.FullName);
     this.gridBooks.DataSource = dao.SearchBooks(_mode, mode, value).Tables[0];
 }
        /// <summary>
        /// refreshes the grid with base results
        /// </summary>
        public override void Refresh()
        {
            base.Refresh();
            MainForm parent = (MainForm)this.ParentForm.MdiParent;
            BookDAO dao = new BookDAO(parent.CurrentDatabase.FullName);
            if (_mode == Constants.LibraryMode.LOANHISTORY)
                this.gridBooks.DataSource = dao.SearchBooks(_mode, Constants.SearchMode.BOOK_ID, _bookId).Tables[0];
            else
                this.gridBooks.DataSource = dao.SearchBooks(_mode, Constants.SearchMode.NONE, null).Tables[0];

            if (_mode == Constants.LibraryMode.LOANHISTORY && this.gridBooks.Rows.Count > 0)
            {
                ViewBooksForm f = this.ParentForm as ViewBooksForm;
                f.SetTitleBar(_mode, this.gridBooks.Rows[0].Cells["short_title"].Value.ToString());
            }
        }
        /// <summary>
        /// Called when right click->check in is called
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkDetailsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MainForm form = this.ParentForm.MdiParent as MainForm;
            BookDAO dao = new BookDAO(form.CurrentDatabase.FullName);
            foreach (string id in SelectedIds)
            {
                dao.ReturnBook(id);
            }

            this.Refresh();
        }
 private void transferBookToWishListToolStripMenuItem_Click(object sender, EventArgs e)
 {
     MainForm form = this.ParentForm.MdiParent as MainForm;
     BookDAO dao = new BookDAO(form.CurrentDatabase.FullName);
     foreach (string id in this.SelectedIds)
     {
         dao.TransferFromLibraryToWishList(id);
     }
     this.Refresh();
 }
        /// <summary>
        /// Called when right click ->loan book is called
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void loanBookToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MainForm parent = this.ParentForm.MdiParent as MainForm;
            BookDAO dao = new BookDAO(parent.CurrentDatabase.FullName);


            foreach (DataGridViewRow row in this.gridBooks.SelectedRows)
            {
                string id = (row.Cells["id"].Value.ToString());
                string title = (row.Cells["short_title"].Value.ToString());


                if (dao.IsBookLoaned(id))
                {
                    MessageBox.Show("'" + title + "' has already been loaned, please check it in to loan it to someone different.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                LoanBookForm form = new LoanBookForm(id, title, parent);
                form.ShowDialog(this.ParentForm);
            }

            this.Refresh();

        }
        /// <summary>
        /// Called when right click ->view details is called
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void viewDetailsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MainForm parent = (MainForm)this.ParentForm.MdiParent;
            BookDAO dao = new BookDAO(parent.CurrentDatabase.FullName);

            foreach (string id in this.SelectedIds)
            {
                AddBookForm form = new AddBookForm(_mode, Constants.AddBookMode.VIEWONLY);
                form.BookData = dao.GetBookById(id);
                form.MdiParent = parent;
                form.Show();
            }

        }
        /// <summary>
        /// called when right click->Delete book is called
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void deleteBookToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Are you sure you want to delete these books?", "Delete?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                MainForm parent = (MainForm)this.ParentForm.MdiParent;
                BookDAO dao = new BookDAO(parent.CurrentDatabase.FullName);
                foreach (string id in this.SelectedIds)
                    dao.DeleteBook(id);

                this.Refresh();
            }
        }
 /// <summary>
 /// We override refresh to refresh the text boxees from the data
 /// </summary>
 public override void Refresh()
 {
 	if(_bookId != null)
 	{
 		MainForm frm = this.MdiParent as MainForm;
     	BookDAO dao = new BookDAO(frm.CurrentDatabase.Name);
     	this._book = dao.GetBookById(_bookId);
 	}
     Book b = _book;
     base.Refresh();
     txtISBN.Text = b.ISBN;
     txtShortTitle.Text = b.ShortTitle;
     txtLongTitle.Text = b.LongTitle;
     string authors = "";
     foreach (Person p in b.Authors)
         authors += p.FullName + Environment.NewLine;
     txtAuthors.Text = authors;
     string editors = "";
     foreach (Person p in b.Editors)
         editors += p.FullName + Environment.NewLine;
     txtEditors.Text = editors;
     txtPublisher.Text = b.PublisherInfo;
     txtDewey.Text = b.Dewey;
     txtDeweyNorm.Text = b.DeweyNormalized;
     txtLCC.Text = b.LibraryOfCongress;
     txtPhysDesc.Text = b.PhysicalDescription;
     txtEdition.Text = b.Edition;
     txtLanguage.Text = b.Language;
     txtSummary.Text = b.Summary;
     txtNotes.Text = b.Notes;
     txtAwards.Text = b.Awards;
     txtURLs.Text = b.Urls;
     txtNewPrice.Text = b.NewPrice;
     txtUsedPrice.Text = b.UsedPrice;
     string subjects = "";
     foreach (Subject s in b.Subjects)
     {
         subjects += s.Name + "\r\n";
     }
     txtSubjects.Text = subjects;
 }
        /// <summary>
        /// Erm...well...it saves.
        /// </summary>
        private void save()
        {
            if (!this.isRequiredFieldsFilled())
                return;

            MainForm parent = (MainForm)this.MdiParent;
            BookDAO dao = new BookDAO(parent.CurrentDatabase.FullName);
            
            if(_addMode == Constants.AddBookMode.EDIT)
            {
            	if(dao.Updatebook(_book))
            		this.setInfoLabel("Success");
            	else
            		this.setInfoLabel("Failed");
            	return;
            }

            if (dao.ExistsInLibrary(_book))
            {
                if (this.chkAutoAdd.Checked == true)
                    this.errorProvider1.SetError(this.txtLookup, ErrorMessages.Common.BOOK_EXISTS_IN_LIBRARY);
                else
                    this.errorProvider1.SetError(this.txtShortTitle, ErrorMessages.Common.BOOK_EXISTS_IN_LIBRARY);
              
                this.setInfoLabel("Failed");
                this.btnClear.Focus();
                return;
            }
            else
            {
                this.errorProvider1.SetError(this.txtShortTitle, "");
                this.errorProvider1.SetError(this.txtLookup, "");
            }

            if (dao.InsertIntoLibrary(_book))
            {
                this.setInfoLabel("Success");
                this.clear();
                this.errorProvider1.SetError(this.txtShortTitle, "");
                this.errorProvider1.SetError(this.txtLookup, "");
                foreach (Form f in this.MdiParent.MdiChildren)
                {
                    if (f is ViewBooksForm)
                    {
                        ViewBooksForm frm = (ViewBooksForm)f;
                        frm.Refresh();
                    }
                }
            }
            else
            {
                this.setInfoLabel("Failed");
            }
 
        }