package is.idega.idegaweb.marathon.presentation.user.runoverview; import is.idega.idegaweb.marathon.IWBundleStarter; import java.io.IOException; import javax.faces.application.Application; import javax.faces.component.UIComponent; import javax.faces.component.UIInput; import javax.faces.component.html.HtmlCommandButton; import javax.faces.component.html.HtmlInputHidden; import javax.faces.component.html.HtmlInputText; import javax.faces.component.html.HtmlMessage; import javax.faces.component.html.HtmlMessages; import javax.faces.component.html.HtmlOutputLabel; import javax.faces.component.html.HtmlOutputText; import javax.faces.context.FacesContext; import javax.faces.el.ValueBinding; import org.apache.myfaces.custom.creditcardvalidator.CreditCardValidator; import org.apache.myfaces.custom.htmlTag.HtmlTag; import org.apache.myfaces.validator.ValidatorBase; import com.idega.idegaweb.IWResourceBundle; import com.idega.presentation.IWBaseComponent; import com.idega.presentation.IWContext; import com.idega.presentation.ui.UICreditCardNumber; import com.idega.presentation.ui.UIDateInput; import com.idega.presentation.wizard.Wizard; import com.idega.presentation.wizard.WizardStep; import com.idega.util.IWTimestamp; /** * * @author <a href="civilis@idega.com">Vytautas Čivilis</a> * @version $Revision: 1.11 $ * * Last modified: $Date: 2008/01/07 09:18:19 $ by $Author: civilis $ * */ public class UIPaymentStep extends IWBaseComponent implements WizardStep { public static final String COMPONENT_TYPE = "idega_PaymentStep"; private static final long serialVersionUID = 983517329599024600L; static final String stepIdentifier = "PaymentStep"; private Wizard wizard; private static final String valueAtt = "value"; private static final String divTag = "div"; private static final String spanTag = "span"; private static final String containerFacet = "container"; private static final String wizardModeFacet = "wizardMode"; private static final String assetsCartStyleClass = UIDistanceChangeWizard.distanceChangeWizard_cssPrefix+"assetsCart"; private static final String creditCardInformationStyleClass = UIDistanceChangeWizard.distanceChangeWizard_cssPrefix+"creditCardInformation"; private static final String headerStyleClass = "header"; private static final String contentsStyleClass = "contents"; private static final String entryStyleClass = "entry"; private static final String subentryStyleClass = "subentry"; private static final String ccvNumberStyleClass = "ccvNumber"; private static final String errorStyleClass = "error"; private static final String generalErrorStyleClass = "generalError"; private static final String credCardNrStyleClass = "credCardNr"; private static final String ccnStyleClass = entryStyleClass+" "+credCardNrStyleClass; public String getIdentifier() { return stepIdentifier; } public UIComponent getStepComponent(FacesContext context, Wizard wizard) { UIPaymentStep step = (UIPaymentStep)context.getApplication().createComponent(COMPONENT_TYPE); step.setId(context.getViewRoot().createUniqueId()); step.setRendered(true); step.setWizard(wizard); return step; } /** * @Override */ protected void initializeComponent(FacesContext context) { Application application = context.getApplication(); IWContext iwc = IWContext.getIWContext(context); IWResourceBundle iwrb = iwc.getIWMainApplication().getBundle(IWBundleStarter.IW_BUNDLE_IDENTIFIER).getResourceBundle(iwc); HtmlInputHidden hidden = (HtmlInputHidden)application.createComponent(HtmlInputHidden.COMPONENT_TYPE); hidden.setId(context.getViewRoot().createUniqueId()); hidden.setValueBinding(valueAtt, application.createValueBinding(UIDistanceChangeWizard.distanceChangeStepBean_wizardModeExp)); getFacets().put(wizardModeFacet, hidden); HtmlTag container = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); container.setId(context.getViewRoot().createUniqueId()); container.setValue(divTag); container.getChildren().add(getAssetsCartArea(context, iwrb)); container.getChildren().add(getCreditCardInformationArea(context, iwrb)); HtmlCommandButton prevButton = wizard.getPreviousButton(context, this); prevButton.setId(context.getViewRoot().createUniqueId()); container.getChildren().add(prevButton); HtmlCommandButton submitButton = wizard.getSubmissionSuccessStepButton(context); submitButton.setValue(iwrb.getLocalizedString("dist_ch.changeDistance", "Change distance")); submitButton.setAction(application.createMethodBinding(UIDistanceChangeWizard.distanceChangeWizardBean_submitDistanceChangeExp, null)); container.getChildren().add(submitButton); getFacets().put(containerFacet, container); } private UIComponent getAssetsCartArea(FacesContext context, IWResourceBundle iwrb) { Application application = context.getApplication(); HtmlTag abdiv = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); abdiv.setId(context.getViewRoot().createUniqueId()); abdiv.setStyleClass(assetsCartStyleClass); abdiv.setValue(divTag); // header HtmlTag div = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); div.setId(context.getViewRoot().createUniqueId()); div.setValue(divTag); div.setStyleClass(headerStyleClass); abdiv.getChildren().add(div); HtmlOutputText text = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE); text.setId(context.getViewRoot().createUniqueId()); text.setValue(iwrb.getLocalizedString("dist_ch.payingFor", "You need to pay for:")); div.getChildren().add(text); // cart area HtmlTag container = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); container.setId(context.getViewRoot().createUniqueId()); container.setStyleClass(contentsStyleClass); container.setValue(divTag); abdiv.getChildren().add(container); // currently chosen distance HtmlTag entryDiv = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); entryDiv.setId(context.getViewRoot().createUniqueId()); entryDiv.setStyleClass(entryStyleClass); entryDiv.setValue(divTag); container.getChildren().add(entryDiv); // currently chosen distance label text = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE); text.setId(context.getViewRoot().createUniqueId()); text.setValue(iwrb.getLocalizedString("runDistance.chosenDistance", "Currently chosen distance: ")); entryDiv.getChildren().add(text); // currently chosen distance value div = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); div.setId(context.getViewRoot().createUniqueId()); div.setValue(divTag); entryDiv.getChildren().add(div); text = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE); text.setId(context.getViewRoot().createUniqueId()); text.setValueBinding(valueAtt, application.createValueBinding(UIDistanceChangeWizard.distanceChangeStepBean_chosenDistanceNameExp)); div.getChildren().add(text); // Change distance to entry entryDiv = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); entryDiv.setId(context.getViewRoot().createUniqueId()); entryDiv.setStyleClass(entryStyleClass); entryDiv.setValue(divTag); container.getChildren().add(entryDiv); // Change distance to entry label text = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE); text.setId(context.getViewRoot().createUniqueId()); text.setValue(iwrb.getLocalizedString("dist_ch.changeTo", "Change distance to:")); entryDiv.getChildren().add(text); // Change distance to entry value div = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); div.setId(context.getViewRoot().createUniqueId()); div.setValue(divTag); entryDiv.getChildren().add(div); text = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE); text.setId(context.getViewRoot().createUniqueId()); text.setValueBinding(valueAtt, application.createValueBinding(UIDistanceChangeWizard.distanceChangeWizardBean_newDistanceNameExp)); div.getChildren().add(text); // price entry entryDiv = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); entryDiv.setId(context.getViewRoot().createUniqueId()); entryDiv.setStyleClass(entryStyleClass); entryDiv.setValue(divTag); container.getChildren().add(entryDiv); // price entry label text = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE); text.setId(context.getViewRoot().createUniqueId()); text.setValue(iwrb.getLocalizedString("run_reg.price", "Price")); entryDiv.getChildren().add(text); // price entry value div = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); div.setId(context.getViewRoot().createUniqueId()); div.setValue(divTag); entryDiv.getChildren().add(div); text = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE); text.setId(context.getViewRoot().createUniqueId()); text.setValueBinding(valueAtt, application.createValueBinding(UIDistanceChangeWizard.distanceChangeWizardBean_distanceChangePriceLabelExp)); div.getChildren().add(text); return abdiv; } private UIComponent getCreditCardInformationArea(FacesContext context, IWResourceBundle iwrb) { Application application = context.getApplication(); HtmlTag ccidiv = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); ccidiv.setId(context.getViewRoot().createUniqueId()); ccidiv.setStyleClass(creditCardInformationStyleClass); ccidiv.setValue(divTag); HtmlTag div = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); div.setId(context.getViewRoot().createUniqueId()); div.setValue(divTag); div.setStyleClass(headerStyleClass); ccidiv.getChildren().add(div); HtmlOutputText text = (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE); text.setId(context.getViewRoot().createUniqueId()); text.setValue(iwrb.getLocalizedString("run_reg.credit_card_information", "Credit card information")); div.getChildren().add(text); // Collection images = getRunBusiness(iwc).getCreditCardImages(); // if (images != null) { // Iterator iterator = images.iterator(); // while (iterator.hasNext()) { // Image image = (Image) iterator.next(); // if (image != null) { // String imageURL = image.getURL(); // if (imageURL != null && !imageURL.equals("")) { // image.setToolTip(imageURL.substring(imageURL.lastIndexOf('/')+1,imageURL.lastIndexOf('.'))); // } // } // creditCardTable.add(image, 3, creditRow); // if (iterator.hasNext()) { // creditCardTable.add(Text.getNonBrakingSpace(), 3, creditRow); // } // } // } div = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); div.setId(context.getViewRoot().createUniqueId()); div.setValue(divTag); div.setStyleClass(generalErrorStyleClass); ccidiv.getChildren().add(div); HtmlMessages generalErrMessages = (HtmlMessages)application.createComponent(HtmlMessages.COMPONENT_TYPE); generalErrMessages.setId(context.getViewRoot().createUniqueId()); div.getChildren().add(generalErrMessages); HtmlTag contentsDiv = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); contentsDiv.setId(context.getViewRoot().createUniqueId()); contentsDiv.setValue(divTag); contentsDiv.setStyleClass(contentsStyleClass); ccidiv.getChildren().add(contentsDiv); // card holder name contentsDiv.getChildren().add(createEntry(context, iwrb.getLocalizedString("run_reg.card_holder", "Card holder"), HtmlInputText.COMPONENT_TYPE, null, UIDistanceChangeWizard.distanceChangeWizardBean_cardHolderNameExp, null, true)); // ccn UICreditCardNumber ccNumber = (UICreditCardNumber)application.createComponent(UICreditCardNumber.COMPONENT_TYPE); ccNumber.setId(context.getViewRoot().createUniqueId()); ValidatorBase validator = (CreditCardValidator)application.createValidator(CreditCardValidator.VALIDATOR_ID); validator.setMessage(iwrb.getLocalizedString("run_reg.not_valid_card_number", "Not a valid card number")); ccNumber.addValidator(validator); HtmlTag entry = createEntry(context, iwrb.getLocalizedString("run_reg.card_number", "Card number"), UICreditCardNumber.COMPONENT_TYPE, ccNumber, UIDistanceChangeWizard.distanceChangeWizardBean_creditCardNumberExp, null, true); entry.setStyleClass(ccnStyleClass); contentsDiv.getChildren().add(entry); // ccv HtmlInputText ccvNumber = (HtmlInputText)application.createComponent(HtmlInputText.COMPONENT_TYPE); ccvNumber.setId(context.getViewRoot().createUniqueId()); ccvNumber.setSize(3); ccvNumber.setMaxlength(3); ccvNumber.setStyleClass(ccvNumberStyleClass); contentsDiv.getChildren().add(createEntry(context, iwrb.getLocalizedString("run_reg.ccv_number", "CCV number"), HtmlInputText.COMPONENT_TYPE, ccvNumber, UIDistanceChangeWizard.distanceChangeWizardBean_ccvNumberExp, UIDistanceChangeWizard.distanceChangeStepBean_validateCCVNumberExp, true)); // card expires UIDateInput dateInput = (UIDateInput)application.createComponent(UIDateInput.COMPONENT_TYPE); dateInput.setId(context.getViewRoot().createUniqueId()); dateInput.setRendered(true); dateInput.setYearRange(IWTimestamp.RightNow().getYear(), IWTimestamp.RightNow().getYear()+10); dateInput.setShowDay(false); contentsDiv.getChildren().add(createEntry(context, iwrb.getLocalizedString("run_reg.card_expires", "Card expires"), UIDateInput.COMPONENT_TYPE, dateInput, UIDistanceChangeWizard.distanceChangeWizardBean_cardExpirationDateExp, null, true)); return ccidiv; } private HtmlTag createEntry(FacesContext context, String labelStr, String inputComponentType, UIComponent uiinput, String valueBindingExp, String validatorMethodExp, boolean required) { Application application = context.getApplication(); HtmlTag entryDiv = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); entryDiv.setId(context.getViewRoot().createUniqueId()); entryDiv.setStyleClass(entryStyleClass); entryDiv.setValue(divTag); // label HtmlOutputLabel label = (HtmlOutputLabel)application.createComponent(HtmlOutputLabel.COMPONENT_TYPE); label.setId(context.getViewRoot().createUniqueId()); label.setValue(labelStr); entryDiv.getChildren().add(label); // input HtmlTag span = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); span.setId(context.getViewRoot().createUniqueId()); span.setValue(spanTag); span.setStyleClass(subentryStyleClass); entryDiv.getChildren().add(span); if(uiinput == null) { uiinput = application.createComponent(inputComponentType); uiinput.setId(context.getViewRoot().createUniqueId()); } uiinput.setValueBinding(valueAtt, application.createValueBinding(valueBindingExp)); span.getChildren().add(uiinput); label.setFor(uiinput.getId()); if(uiinput instanceof UIInput) { ((UIInput)uiinput).setRequired(required); if(validatorMethodExp != null) { ((UIInput)uiinput).setValidator(application.createMethodBinding(validatorMethodExp, new Class[] {FacesContext.class, UIComponent.class, Object.class})); } HtmlTag errSpan = (HtmlTag)application.createComponent(HtmlTag.COMPONENT_TYPE); errSpan.setId(context.getViewRoot().createUniqueId()); errSpan.setStyleClass(errorStyleClass); errSpan.setValue(spanTag); span.getChildren().add(errSpan); HtmlMessage errMsg = (HtmlMessage)application.createComponent(HtmlMessage.COMPONENT_TYPE); errMsg.setId(context.getViewRoot().createUniqueId()); errMsg.setFor(uiinput.getId()); errSpan.getChildren().add(errMsg); } return entryDiv; } public void setWizard(Wizard wizard) { this.wizard = wizard; } /** * @Override */ public void encodeChildren(FacesContext context) throws IOException { super.encodeChildren(context); renderChild(context, getFacet(wizardModeFacet)); UIComponent container = getFacet(containerFacet); if(container != null) { container.setRendered(true); renderChild(context, container); } } /** * @Override */ public boolean getRendersChildren() { return true; } /** * @Override */ public void decode(FacesContext context) { super.decode(context); ValueBinding vb = context.getApplication().createValueBinding(UIDistanceChangeWizard.distanceChangeStepBean_wizardModeExp); vb.setValue(context, Boolean.valueOf((String)context.getExternalContext().getRequestParameterMap().get(getFacet(wizardModeFacet).getClientId(context)))); } /** * @Override */ public boolean isRendered() { return IWContext.getIWContext(FacesContext.getCurrentInstance()).isLoggedOn(); } }