package is.idega.idegaweb.travel.service.hotel.presentation;
import is.idega.idegaweb.travel.block.search.presentation.AbstractSearchForm;
import is.idega.idegaweb.travel.service.hotel.data.Hotel;
import is.idega.idegaweb.travel.service.hotel.data.HotelHome;
import is.idega.idegaweb.travel.service.hotel.data.HotelType;
import is.idega.idegaweb.travel.service.hotel.data.HotelTypeHome;
import is.idega.idegaweb.travel.service.hotel.data.RoomType;
import is.idega.idegaweb.travel.service.hotel.data.RoomTypeHome;
import is.idega.idegaweb.travel.service.presentation.BookingForm;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.ejb.FinderException;
import com.idega.block.trade.stockroom.data.Product;
import com.idega.block.trade.stockroom.data.Supplier;
import com.idega.block.trade.stockroom.data.SupplierHome;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.data.IDORelationshipException;
import com.idega.idegaweb.IWResourceBundle;
import com.idega.presentation.IWContext;
import com.idega.presentation.Image;
import com.idega.presentation.PresentationObject;
import com.idega.presentation.Table;
import com.idega.presentation.text.Link;
import com.idega.presentation.ui.DateInput;
import com.idega.presentation.ui.DropdownMenu;
import com.idega.presentation.ui.util.SelectorUtility;
import com.idega.user.data.Group;
import com.idega.util.IWTimestamp;
/**
* @author gimmi
*/
public class HotelSearch extends AbstractSearchForm {
protected String PARAMETER_TYPE_COUNT = HotelBookingForm.parameterCountToCheck;
protected String PARAMETER_HOTEL_TYPE = "hs_pht";
protected String PARAMETER_MIN_RATING = "hs_mir";
protected String PARAMETER_MAX_RATING = "hs_mar";
private IWContext iwc;
private static Image star = null;
public HotelSearch() {
super();
}
public void main(IWContext iwc) throws Exception {
this.iwc = iwc;
super.main(iwc);
}
protected String getServiceName(IWResourceBundle iwrb) {
return iwrb.getLocalizedString("travel.search.accomodation","Accomodation");
}
protected Image getHeaderImage(IWResourceBundle iwrb) {
return iwrb.getImage("/search/accomodation.png");
}
protected String getPriceCategoryKey() {
return HotelSetup.HOTEL_SEARCH_PRICE_CATEGORY_KEY;
}
protected Collection getResults() throws RemoteException {
String sManyDays = iwc.getParameter(PARAMETER_MANY_DAYS);
String sRoomType[] = iwc.getParameterValues(PARAMETER_TYPE);
String sRoomTypeCount[] = iwc.getParameterValues(PARAMETER_TYPE_COUNT);
String sHotelType[] = iwc.getParameterValues(PARAMETER_HOTEL_TYPE);
String sMinRating = iwc.getParameter(PARAMETER_MIN_RATING);
String sMaxRating = iwc.getParameter(PARAMETER_MAX_RATING);
String supplierName = iwc.getParameter(PARAMETER_SUPPLIER_NAME);
if (supplierName != null) {
supplierName = supplierName.trim();
}
try {
Object[] roomTypeIds = null;
if (sRoomType != null && sRoomType.length > 0) {
roomTypeIds = new Object[sRoomType.length];
for (int i = 0; i < roomTypeIds.length; i++) {
roomTypeIds[i] = sRoomType[i];
}
}
Object[] hotelTypeIds = null;
if (sHotelType != null && sHotelType.length > 0) {
hotelTypeIds = new Object[sHotelType.length];
for (int i = 0; i < hotelTypeIds.length; i++) {
if ("-1".equals(sHotelType[i])) {
hotelTypeIds = null;
break;
}
hotelTypeIds[i] = sHotelType[i];
}
}
float min = -1;
float max = -1;
try {
min = Float.parseFloat(sMinRating);
} catch (Exception e) {}
try {
max = Float.parseFloat(sMaxRating);
} catch (Exception e) {}
Collection postalCodes = getBookingForm().getPostalCodeIds(iwc);
Object[] suppIds = getSupplierIDs();
HotelHome hHome = (HotelHome) IDOLookup.getHome(Hotel.class);
Collection coll = new Vector();
if (suppIds.length > 0) {
coll = hHome.find(null, null, roomTypeIds, hotelTypeIds, postalCodes, suppIds, min, max, supplierName);
}
return coll;
} catch (IDOLookupException e) {
e.printStackTrace();
} catch (FinderException e) {
e.printStackTrace();
}
return null;
}
private void showCollectionContent(Collection coll) {
try {
Iterator iter = coll.iterator();
while (iter.hasNext()) {
System.out.print(iter.next().toString()+", ");
}
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
protected void setupSearchForm() throws RemoteException {
BookingForm bf = getBookingForm();
int state = getSession(iwc).getState();
Product prod = super.definedProduct;
boolean defined = super.hasDefinedProduct();
Hotel hotel = null;
if (defined) {
try {
hotel = getHotelHome().findByPrimaryKey(definedProduct.getPrimaryKey());
} catch (Exception e1) {
e1.printStackTrace();
}
}
IWTimestamp now = IWTimestamp.RightNow();
DateInput fromDate = new DateInput(PARAMETER_FROM_DATE, true);
fromDate.setDate(now.getDate());
now.addDays(1);
DateInput toDate = new DateInput(PARAMETER_TO_DATE, true);
toDate.setDate(now.getDate());
Collection hotelTypes = new Vector();
try {
HotelTypeHome trh = (HotelTypeHome) IDOLookup.getHome(HotelType.class);
hotelTypes = trh.findAllUsedBySuppliers(engine.getSuppliers());
// hotelTypes = trh.findAll();
} catch (Exception e) {
e.printStackTrace();
}
DropdownMenu spHotelTypes = getHotelTypeDropdown(hotelTypes, iwrb, PARAMETER_HOTEL_TYPE);
DropdownMenu roomTypeDrop = null;
try {
roomTypeDrop = getRoomTypeDropdown(engine.getSuppliers(), PARAMETER_TYPE);
}
catch (IDORelationshipException e) {
e.printStackTrace();
}
DropdownMenu min = getDropdownWithNumbers(PARAMETER_MIN_RATING, 1, 5);
DropdownMenu max = getDropdownWithNumbers(PARAMETER_MAX_RATING, 1, 5);
min.addMenuElementFirst("-1", iwrb.getLocalizedString("travel.search.any", "Any"));
min.setSelectedElement("-1");
max.addMenuElementFirst("-1", iwrb.getLocalizedString("travel.search.any", "Any"));
max.setSelectedElement("-1");
if (hotelTypes != null) {
Iterator iter = hotelTypes.iterator();
HotelType hotelType;
boolean first = true;
while (iter.hasNext()) {
hotelType = (HotelType) iter.next();
if (first) {
min.setDisabled(!hotelType.getUseRating());
max.setDisabled(!hotelType.getUseRating());
}
spHotelTypes.setToDisableWhenSelected(min, hotelType.getPrimaryKey().toString(), !hotelType.getUseRating(), true);
spHotelTypes.setToDisableWhenSelected(max, hotelType.getPrimaryKey().toString(), !hotelType.getUseRating(), true);
first = false;
}
}
roomTypeDrop.setSelectedElement(super.getDefaultValue(PARAMETER_TYPE));
spHotelTypes.setSelectedElement(super.getDefaultValue(PARAMETER_HOTEL_TYPE));
boolean vertical = !isHorizontal();
if (this.isHorizontal()) {
if (!defined) {
try {
bf.addAreaCodeInput(null, engine.getCountries(), vertical, getDefaultValue(PARAMETER_POSTAL_CODE_NAME));
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-1, 2, bf.getCurrentBookingPartRow()-1);
}
catch (IDORelationshipException e1) {
e1.printStackTrace();
}
// bf.addSupplierNameInput();
}
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.check_in_date","Check in date")}, new PresentationObject[]{fromDate}, false, false, vertical);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-1, 2, bf.getCurrentBookingPartRow()-1);
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.check_out_date","Check out date")}, new PresentationObject[]{toDate}, vertical);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-1, 2, bf.getCurrentBookingPartRow()-1);
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.minimum_rating","Minimum rating"), iwrb.getLocalizedString("travel.search.maximum_rating","Maximum rating")}, new PresentationObject[] { min, max}, vertical);
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.number_of_rooms","Number of rooms")}, new PresentationObject[]{getDropdownWithNumbers(PARAMETER_TYPE_COUNT, 1, 7)}, false, true, vertical);
if ( !defined ) {
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.type_of_accomodation","Type of accomodation")}, new PresentationObject[]{spHotelTypes}, vertical);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-1, 2, bf.getCurrentBookingPartRow()-1);
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.type_of_rooms","Type of rooms")}, new PresentationObject[]{roomTypeDrop}, vertical);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-1, 2, bf.getCurrentBookingPartRow()-1);
}
} else {
if (!defined) {
try {
bf.addAreaCodeInput(null, engine.getCountries(), vertical,getDefaultValue(PARAMETER_POSTAL_CODE_NAME));
}
catch (IDORelationshipException e1) {
e1.printStackTrace();
}
bf.addSupplierNameInput(vertical);
}
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.check_in_date","Check in date")}, new PresentationObject[]{fromDate}, false, true, vertical);
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.check_out_date","Check out date")}, new PresentationObject[]{toDate}, vertical);
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.number_of_rooms","Number of rooms")}, new PresentationObject[]{getDropdownWithNumbers(PARAMETER_TYPE_COUNT, 1, 7)}, false, true, vertical);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-1, 2, bf.getCurrentBookingPartRow()-1);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-2, 2, bf.getCurrentBookingPartRow()-2);
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.minimum_rating","Minimum rating"), iwrb.getLocalizedString("travel.search.maximum_rating","Maximum rating")}, new PresentationObject[] { min, max}, vertical);
if ( !defined ) {
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.type_of_accomodation","Type of accomodation")}, new PresentationObject[]{spHotelTypes}, vertical);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-1, 2, bf.getCurrentBookingPartRow()-1);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-2, 2, bf.getCurrentBookingPartRow()-2);
bf.addInputLine(new String[]{iwrb.getLocalizedString("travel.search.type_of_rooms","Type of rooms")}, new PresentationObject[]{roomTypeDrop}, vertical);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-1, 2, bf.getCurrentBookingPartRow()-1);
bf.getCurrentBookingPart().mergeCells(1, bf.getCurrentBookingPartRow()-2, 2, bf.getCurrentBookingPartRow()-2);
}
}
}
/**
* @return
*/
private DropdownMenu getRoomTypeDropdown(Collection suppliers, String parameterName) {
Collection roomTypes = new Vector();
try {
RoomTypeHome trh = (RoomTypeHome) IDOLookup.getHome(RoomType.class, getDatasource());
roomTypes = trh.findAllUsedBySuppliers(suppliers);
} catch (Exception e) {
e.printStackTrace();
}
DropdownMenu roomTypeDrop = new DropdownMenu(roomTypes, parameterName);
return roomTypeDrop;
}
private DropdownMenu getHotelTypeDropdown(Collection hotelTypes, IWResourceBundle iwrb, String parameterName) {
DropdownMenu spHotelTypes = new DropdownMenu( parameterName);
SelectorUtility su = new SelectorUtility();
spHotelTypes = (DropdownMenu) su.getSelectorFromIDOEntities(spHotelTypes, hotelTypes, "getLocalizationKey", iwrb);
spHotelTypes.addMenuElementFirst("-1", iwrb.getLocalizedString("travel.any_types", "Any type"));
spHotelTypes.setSelectedElement("-1");
return spHotelTypes;
}
public DropdownMenu getRoomTypeDropdown(Group supplierManager, String parameterName) {
try {
// RoomTypeHome trh = (RoomTypeHome) IDOLookup.getHome(RoomType.class);
SupplierHome sHome = (SupplierHome) IDOLookup.getHome(Supplier.class, getDatasource());
// Collection hotelTypes = trh.findAllUsedBySuppliers(sHome.findAll(supplierManager));
return getRoomTypeDropdown(sHome.findAll(supplierManager), parameterName);
} catch (Exception e) {
e.printStackTrace();
return new DropdownMenu(parameterName);
}
}
public DropdownMenu getHotelTypeDropdown(Group supplierManager, IWResourceBundle iwrb, String parameterName) {
try {
HotelTypeHome trh = (HotelTypeHome) IDOLookup.getHome(HotelType.class, getDatasource());
SupplierHome sHome = (SupplierHome) IDOLookup.getHome(Supplier.class, getDatasource());
Collection hotelTypes = trh.findAllUsedBySuppliers(sHome.findAll(supplierManager));
return getHotelTypeDropdown(hotelTypes, iwrb, parameterName);
} catch (Exception e) {
e.printStackTrace();
return new DropdownMenu(parameterName);
}
}
protected Link getBookingLink(int productId) {
Link link = super.getBookingLink(productId);
link.maintainParameter(PARAMETER_TYPE, iwc);
link.maintainParameter(PARAMETER_TYPE_COUNT, iwc);
return link;
}
protected String getParameterTypeCountName() {
return PARAMETER_TYPE_COUNT;
}
protected void setupSpecialFieldsForBookingForm(Table table, int row, List errorFields) {
}
/* (non-Javadoc)
* @see is.idega.idegaweb.travel.block.search.presentation.AbstractSearchForm#getBookingFieldsToErrorCheck()
*/
protected List getErrorFormFields() {
return null;
}
/* (non-Javadoc)
* @see is.idega.idegaweb.travel.block.search.presentation.AbstractSearchForm#getParametersInUse()
*/
protected Collection getParametersInUse() {
Vector coll = new Vector();
coll.add(PARAMETER_HOTEL_TYPE);
coll.add(PARAMETER_MAX_RATING);
coll.add(PARAMETER_MIN_RATING);
coll.add(PARAMETER_TYPE_COUNT);
coll.add(PARAMETER_TYPE);
return coll;
}
protected HotelHome getHotelHome() throws RemoteException {
return (HotelHome) IDOLookup.getHome(Hotel.class);
}
protected Image getStar() {
if (star == null) {
star = bundle.getImage("images/rating_01.gif");
}
return star;
}
protected void addProductInfo(Product product, Table contentTable, int column, int row) {
try {
Hotel hotel = getHotelHome().findByPrimaryKey(product.getPrimaryKey());
int rating = (int) hotel.getRating();
for (int i = 1; i <= rating; i++) {
contentTable.add(getStar(), column, row);
}
//contentTable.add(this.getLinkText(" |", false), column, row);
} catch (Exception e) {
e.printStackTrace();
}
}
protected Table getProductInfoDetailed(Product product) {
try {
if (product != null){
Table table = new Table(2, 1);
table.setCellpaddingAndCellspacing(0);
Hotel hotel = getHotelHome().findByPrimaryKey(product.getPrimaryKey());
int rating = (int) hotel.getRating();
if (rating > 0) {
table.add(getText(iwrb.getLocalizedString("travel.search.hotel.rating", "Rating")), 1, 1);
table.setWidth(1, 1, 50);
table.setCellpaddingBottom(1, 1, 5);
//addProductInfo(product, table, 2, 1);
for (int i = 1; i <= rating; i++) {
table.add(getStar(), 2, 1);
}
return table;
}
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
return null;
}
}