	public void characters(char ch[], int start, int length) throws SAXException {
		if (!parsingLoansOrRequests) {
			if (circulationStatusReached) {
				currentAlephItem.setCirculationStatus(new String(ch, start, length));
				circulationStatusReached = false;
			} else if (holdQueueLengthReached) {
				currentAlephItem.setHoldQueueLength(Integer.parseInt(new String(ch, start, length)));
				holdQueueLengthReached = false;
			} else if (itemDesrciptionReached) {
				currentAlephItem.setDescription(new String(ch, start, length));
				itemDesrciptionReached = false;
			} else if (docNoReached) {
				currentAlephItem.setDocNumber(new String(ch, start, length));
				docNoReached = false;
			} else if (itemSequenceReached) {
				currentAlephItem.setItemSeqNumber(new String(ch, start, length));
				itemSequenceReached = false;
			} else if (locationReached) {
				currentAlephItem.setLocation(new String(ch, start, length));
				locationReached = false;
			} else if (openDateReached) {
				currentAlephItem.setPublicationDate(new String(ch, start, length));
				openDateReached = false;
			} else if (callNoReached) {
				currentAlephItem.setCallNumber(new String(ch, start, length));
				callNoReached = false;
			} else if (secondCallNoTypeReached) {
				secondCallNoType = new String(ch, start, length);
				secondCallNoTypeReached = false;
			} else if (secondCallNoReached) {
				if (secondCallNoType != null && !secondCallNoType.equalsIgnoreCase("9"))
					currentAlephItem.setCallNumber(new String(ch, start, length));
				else if (secondCallNoType == null)
					currentAlephItem.setCallNumber(new String(ch, start, length));
				secondCallNoReached = false;
			} else if (copyNoReached) {
				currentAlephItem.setCopyNumber(new String(ch, start, length));
				copyNoReached = false;
			} else if (barcodeReached) {
				currentAlephItem.setBarcode(new String(ch, start, length));
				barcodeReached = false;
			} else if (materialReached) {
				currentAlephItem.setMediumType(new String(ch, start, length));
				materialReached = false;
			} else if (agencyReached) {
				currentAlephItem.setAgency(new String(ch, start, length));
				agencyReached = false;
			} else if (collectionReached) {
				currentAlephItem.setCollection(new String(ch, start, length));
				collectionReached = false;
			} else if (bibDescriptionDesired) {
				if (authorReached) {
					currentAlephItem.setAuthor(new String(ch, start, length));
					authorReached = false;
				} else if (isbnReached) {
					currentAlephItem.setIsbn(new String(ch, start, length));
					isbnReached = false;
				} else if (titleReached) {
					currentAlephItem.setTitle(new String(ch, start, length));
					titleReached = false;
				} else if (publisherReached) {
					currentAlephItem.setPublisher(new String(ch, start, length));
					publisherReached = false;
				} else if (bibIdReached) {
					currentAlephItem.setBibId(new String(ch, start, length));
					bibIdReached = false;
				}
			}
		} else {
			if (materialReached) {
				String mediumTypeParsed = new String(ch, start, length);
				MediumType mediumType = AlephUtil.detectMediumType(mediumTypeParsed);
				bibliographicDescription.setMediumType(mediumType);
				materialReached = false;
			} else if (authorReached) {
				bibliographicDescription.setAuthor(new String(ch, start, length));
				authorReached = false;
			} else if (isbnReached) {
				bibliographicDescription.setBibliographicLevel(null);
				isbnReached = false;
			} else if (titleReached) {
				bibliographicDescription.setTitle(new String(ch, start, length));
				titleReached = false;
			} else if (publisherReached) {
				bibliographicDescription.setPublisher(new String(ch, start, length));
				publisherReached = false;
			} else if (bibIdReached) {
				String parsedBibId = new String(ch, start, length);
				docNumber = parsedBibId;
				List<BibliographicItemId> bibliographicItemIds = new ArrayList<BibliographicItemId>();
				BibliographicItemId bibId = new BibliographicItemId();
				bibId.setBibliographicItemIdentifier(parsedBibId);
				bibId.setBibliographicItemIdentifierCode(Version1BibliographicItemIdentifierCode.URI);
				bibliographicItemIds.add(bibId);
				bibliographicDescription.setBibliographicItemIds(bibliographicItemIds);
				bibIdReached = false;
			} else if (itemSequenceReached) {
				itemSequence = new String(ch, start, length);
				itemSequenceReached = false;
			} else if (loansHandling) {
				if (dueDateReached) {
					String dateDueParsed = new String(ch, start, length);
					GregorianCalendar dateDue = AlephUtil.parseGregorianCalendarFromAlephDate(dateDueParsed);
					currentLoanedItem.setDateDue(dateDue);
					dueDateReached = false;
				} else if (loanDateReached) {
					String loanDateParsed = new String(ch, start, length);
					GregorianCalendar loanDate = AlephUtil.parseGregorianCalendarFromAlephDate(loanDateParsed);
					currentLoanedItem.setDateCheckedOut(loanDate);
					loanDateReached = false;
				}
			} else if (holdRequestsHandling) {
				if (datePlacedReached) {
					String datePlacedParsed = new String(ch, start, length);
					GregorianCalendar datePlaced = AlephUtil.parseGregorianCalendarFromAlephDate(datePlacedParsed);
					currentLoanedItem.setDateCheckedOut(datePlaced);
					datePlacedReached = false;
				} else if (hourPlacedReached) {
					String hourPlacedParsed = new String(ch, start, length);
					if (!hourPlacedParsed.equalsIgnoreCase("00000000")) {
						GregorianCalendar datePlaced = currentRequestedItem.getDatePlaced();
						GregorianCalendar hourPlaced = new GregorianCalendar(localTimeZone);
						try {
							hourPlaced.setTime(AlephConstants.ALEPH_HOUR_FORMATTER.parse(hourPlacedParsed));
						} catch (ParseException e) {
							e.printStackTrace();
						}
						datePlaced.add(Calendar.HOUR_OF_DAY, hourPlaced.get(Calendar.HOUR_OF_DAY) - 1);
						datePlaced.add(Calendar.MINUTE, hourPlaced.get(Calendar.MINUTE));
						currentRequestedItem.setDatePlaced(datePlaced);
					}
					hourPlacedReached = false;
				} else if (earliestDateNeededReached) {
					String earliestDateNeededParsed = new String(ch, start, length);
					GregorianCalendar earliestDateNeeded = AlephUtil.parseGregorianCalendarFromAlephDate(earliestDateNeededParsed);
					currentLoanedItem.setDateCheckedOut(earliestDateNeeded);
					earliestDateNeededReached = false;
				} else if (needBeforeDateReached) {
					String needBeforeDateParsed = new String(ch, start, length);
					GregorianCalendar needBeforeDate = AlephUtil.parseGregorianCalendarFromAlephDate(needBeforeDateParsed);
					currentLoanedItem.setDateCheckedOut(needBeforeDate);
					needBeforeDateReached = false;
				} else if (holdQueueLengthReached) {
					currentRequestedItem.setHoldQueueLength(new BigDecimal(new String(ch, start, length)));
					holdQueueLengthReached = false;
				} else if (pickupLocationReached) {
					PickupLocation pickupLocation = new PickupLocation(new String(ch, start, length));
					currentRequestedItem.setPickupLocation(pickupLocation);
					pickupLocationReached = false;
				} else if (pickupExpiryDateReached) {
					String pickupExpiryDateParsed = new String(ch, start, length);
					GregorianCalendar pickupExpiryDate = AlephUtil.parseGregorianCalendarFromAlephDate(pickupExpiryDateParsed);
					currentLoanedItem.setDateCheckedOut(pickupExpiryDate);
					pickupExpiryDateReached = false;
				} else if (reminderLevelReached) {
					currentRequestedItem.setReminderLevel(new BigDecimal(new String(ch, start, length)));
					reminderLevelReached = false;
				} else if (requestIdReached) {
					RequestId requestId = new RequestId();
					requestId.setRequestIdentifierValue(new String(ch, start, length));
					currentRequestedItem.setRequestId(requestId);
					requestIdReached = false;
				} else if (requestTypeReached) {
					RequestType requestType = null;
					String parsedValue = new String(ch, start, length);
					if (parsedValue == "30") 
						requestType = Version1RequestType.LOAN;
					else
						requestType = Version1RequestType.ESTIMATE; 
					currentRequestedItem.setRequestType(requestType);
					requestTypeReached = false;
				} else if (pickupDateReached) {
					String pickupDateParsed = new String(ch, start, length);
					GregorianCalendar pickupDate = AlephUtil.parseGregorianCalendarFromAlephDate(pickupDateParsed);
					currentLoanedItem.setDateCheckedOut(pickupDate);
					pickupDateReached = false;
				} else if (statusReached) {
					String parsedStatus = new String(ch, start, length);
					RequestStatusType requestStatusType;
					if (parsedStatus == "S")
						requestStatusType = Version1RequestStatusType.AVAILABLE_FOR_PICKUP;
					else
						requestStatusType = Version1RequestStatusType.IN_PROCESS;
					currentRequestedItem.setRequestStatusType(requestStatusType);
					statusReached = false;
				}
			}
		}
	}

	public void characters(char ch[], int start, int length) throws SAXException {
		if (!parsingLoansOrRequests) {
			if (circulationStatusReached) {
				currentAlephItem.setCirculationStatus(new String(ch, start, length));
				circulationStatusReached = false;
			} else if (holdQueueLengthReached) {
				currentAlephItem.setHoldQueueLength(Integer.parseInt(new String(ch, start, length)));
				holdQueueLengthReached = false;
			} else if (itemDesrciptionReached) {
				currentAlephItem.setDescription(new String(ch, start, length));
				itemDesrciptionReached = false;
			} else if (docNoReached) {
				currentAlephItem.setDocNumber(new String(ch, start, length));
				docNoReached = false;
			} else if (itemSequenceReached) {
				currentAlephItem.setItemSeqNumber(new String(ch, start, length));
				itemSequenceReached = false;
			} else if (locationReached) {
				currentAlephItem.setLocation(new String(ch, start, length));
				locationReached = false;
			} else if (openDateReached) {
				currentAlephItem.setPublicationDate(new String(ch, start, length));
				openDateReached = false;
			} else if (callNoReached) {
				currentAlephItem.setCallNumber(new String(ch, start, length));
				callNoReached = false;
			} else if (secondCallNoTypeReached) {
				secondCallNoType = new String(ch, start, length);
				secondCallNoTypeReached = false;
			} else if (secondCallNoReached) {
				if (secondCallNoType != null && !secondCallNoType.equalsIgnoreCase("9"))
					currentAlephItem.setCallNumber(new String(ch, start, length));
				else if (secondCallNoType == null)
					currentAlephItem.setCallNumber(new String(ch, start, length));
				secondCallNoReached = false;
			} else if (copyNoReached) {
				currentAlephItem.setCopyNumber(new String(ch, start, length));
				copyNoReached = false;
			} else if (barcodeReached) {
				currentAlephItem.setBarcode(new String(ch, start, length));
				barcodeReached = false;
			} else if (materialReached) {
				currentAlephItem.setMediumType(new String(ch, start, length));
				materialReached = false;
			} else if (agencyReached) {
				currentAlephItem.setAgency(new String(ch, start, length));
				agencyReached = false;
			} else if (collectionReached) {
				currentAlephItem.setCollection(new String(ch, start, length));
				collectionReached = false;
			} else if (bibDescriptionDesired) {
				if (authorReached) {
					currentAlephItem.setAuthor(new String(ch, start, length));
					authorReached = false;
				} else if (isbnReached) {
					currentAlephItem.setIsbn(new String(ch, start, length));
					isbnReached = false;
				} else if (titleReached) {
					currentAlephItem.setTitle(new String(ch, start, length));
					titleReached = false;
				} else if (publisherReached) {
					currentAlephItem.setPublisher(new String(ch, start, length));
					publisherReached = false;
				} else if (bibIdReached) {
					currentAlephItem.setBibId(new String(ch, start, length));
					bibIdReached = false;
				}
			}
		} else {
			if (materialReached) {
				String mediumTypeParsed = new String(ch, start, length);
				MediumType mediumType = AlephUtil.detectMediumType(mediumTypeParsed);
				bibliographicDescription.setMediumType(mediumType);
				materialReached = false;
			} else if (authorReached) {
				bibliographicDescription.setAuthor(new String(ch, start, length));
				authorReached = false;
			} else if (isbnReached) {
				bibliographicDescription.setBibliographicLevel(null);
				isbnReached = false;
			} else if (titleReached) {
				bibliographicDescription.setTitle(new String(ch, start, length));
				titleReached = false;
			} else if (publisherReached) {
				bibliographicDescription.setPublisher(new String(ch, start, length));
				publisherReached = false;
			} else if (bibIdReached) {
				String parsedBibId = new String(ch, start, length);
				docNumber = parsedBibId;
				List<BibliographicItemId> bibliographicItemIds = new ArrayList<BibliographicItemId>();
				BibliographicItemId bibId = new BibliographicItemId();
				bibId.setBibliographicItemIdentifier(parsedBibId);
				bibId.setBibliographicItemIdentifierCode(Version1BibliographicItemIdentifierCode.URI);
				bibliographicItemIds.add(bibId);
				bibliographicDescription.setBibliographicItemIds(bibliographicItemIds);
				bibIdReached = false;
			} else if (itemSequenceReached) {
				itemSequence = new String(ch, start, length);
				itemSequenceReached = false;
			} else if (loansHandling) {
				if (dueDateReached) {
					String dateDueParsed = new String(ch, start, length);
					GregorianCalendar dateDue = AlephUtil.parseGregorianCalendarFromAlephDate(dateDueParsed);
					currentLoanedItem.setDateDue(dateDue);
					dueDateReached = false;
				} else if (loanDateReached) {
					String loanDateParsed = new String(ch, start, length);
					GregorianCalendar loanDate = AlephUtil.parseGregorianCalendarFromAlephDate(loanDateParsed);
					currentLoanedItem.setDateCheckedOut(loanDate);
					loanDateReached = false;
				}
			} else if (holdRequestsHandling) {
				if (datePlacedReached) {
					String datePlacedParsed = new String(ch, start, length);
					GregorianCalendar datePlaced = AlephUtil.parseGregorianCalendarFromAlephDate(datePlacedParsed);
					currentRequestedItem.setDatePlaced(datePlaced);
					datePlacedReached = false;
				} else if (hourPlacedReached) {
					String hourPlacedParsed = new String(ch, start, length);
					if (!hourPlacedParsed.equalsIgnoreCase("00000000")) {
						GregorianCalendar datePlaced = currentRequestedItem.getDatePlaced();
						GregorianCalendar hourPlaced = new GregorianCalendar(localTimeZone);
						try {
							hourPlaced.setTime(AlephConstants.ALEPH_HOUR_FORMATTER.parse(hourPlacedParsed));
						} catch (ParseException e) {
							e.printStackTrace();
						}
						datePlaced.add(Calendar.HOUR_OF_DAY, hourPlaced.get(Calendar.HOUR_OF_DAY) - 1);
						datePlaced.add(Calendar.MINUTE, hourPlaced.get(Calendar.MINUTE));
						currentRequestedItem.setDatePlaced(datePlaced);
					}
					hourPlacedReached = false;
				} else if (earliestDateNeededReached) {
					String earliestDateNeededParsed = new String(ch, start, length);
					GregorianCalendar earliestDateNeeded = AlephUtil.parseGregorianCalendarFromAlephDate(earliestDateNeededParsed);
					currentRequestedItem.setEarliestDateNeeded(earliestDateNeeded);
					earliestDateNeededReached = false;
				} else if (needBeforeDateReached) {
					String needBeforeDateParsed = new String(ch, start, length);
					GregorianCalendar needBeforeDate = AlephUtil.parseGregorianCalendarFromAlephDate(needBeforeDateParsed);
					currentRequestedItem.setNeedBeforeDate(needBeforeDate);
					needBeforeDateReached = false;
				} else if (holdQueueLengthReached) {
					currentRequestedItem.setHoldQueueLength(new BigDecimal(new String(ch, start, length)));
					holdQueueLengthReached = false;
				} else if (pickupLocationReached) {
					PickupLocation pickupLocation = new PickupLocation(new String(ch, start, length));
					currentRequestedItem.setPickupLocation(pickupLocation);
					pickupLocationReached = false;
				} else if (pickupExpiryDateReached) {
					String pickupExpiryDateParsed = new String(ch, start, length);
					GregorianCalendar pickupExpiryDate = AlephUtil.parseGregorianCalendarFromAlephDate(pickupExpiryDateParsed);
					currentRequestedItem.setPickupExpiryDate(pickupExpiryDate);
					pickupExpiryDateReached = false;
				} else if (reminderLevelReached) {
					currentRequestedItem.setReminderLevel(new BigDecimal(new String(ch, start, length)));
					reminderLevelReached = false;
				} else if (requestIdReached) {
					RequestId requestId = new RequestId();
					requestId.setRequestIdentifierValue(new String(ch, start, length));
					currentRequestedItem.setRequestId(requestId);
					requestIdReached = false;
				} else if (requestTypeReached) {
					RequestType requestType = null;
					String parsedValue = new String(ch, start, length);
					if (parsedValue == "30") 
						requestType = Version1RequestType.LOAN;
					else
						requestType = Version1RequestType.ESTIMATE; 
					currentRequestedItem.setRequestType(requestType);
					requestTypeReached = false;
				} else if (pickupDateReached) {
					String pickupDateParsed = new String(ch, start, length);
					GregorianCalendar pickupDate = AlephUtil.parseGregorianCalendarFromAlephDate(pickupDateParsed);
					currentRequestedItem.setPickupDate(pickupDate);
					pickupDateReached = false;
				} else if (statusReached) {
					String parsedStatus = new String(ch, start, length);
					RequestStatusType requestStatusType;
					if (parsedStatus == "S")
						requestStatusType = Version1RequestStatusType.AVAILABLE_FOR_PICKUP;
					else
						requestStatusType = Version1RequestStatusType.IN_PROCESS;
					currentRequestedItem.setRequestStatusType(requestStatusType);
					statusReached = false;
				}
			}
		}
	}
