public HtmlTag Build(ElementRequest request)
        {
            if (_url.IsEmpty())
            {
                _url = request.Get<IUrlRegistry>().UrlFor(_lookupType);
            }

            request.Get<IAssetRequirements>().Require("fubu.autocomplete.js");

            var label = request.Get<IDisplayFormatter>().GetDisplayForValue(request.Accessor, request.RawValue);
            var hidden = new HiddenTag()
                .Id(request.ElementId)
                .Name(request.ElementId)
                .AddClass("lookup")
                .Attr("value", request.RawValue == null ? string.Empty : request.RawValue.ToString());

            var textboxId = "{0}Value".ToFormat(request.ElementId);
            var textbox = new TextboxTag(textboxId, label)
                .Id(textboxId)
                .Data("lookup-url", _url)
                .Data("value-for", request.ElementId)
                .AddClass("autocomplete");

            hidden.After(textbox);
            
            return hidden;
        }
        public DefaultAspNetMvcHtmlConventions()
        {
            Editors.IfPropertyIs<bool>().BuildBy(req =>
            {
                var check = new CheckboxTag(req.Value<bool>()).Attr("value", req.StringValue());
                var hidden = new HiddenTag().Attr("name", req.ElementId).Attr("value", false);
                return check.Append(hidden);
            });

            Editors.IfPropertyIs<IEnumerable<SelectListItem>>().BuildBy(req =>
            {
                var list = req.Value<IEnumerable<SelectListItem>>();
                var drop = new SelectTag();
                foreach (var item in list)
                {
                    drop.Add("option").Attr("value", item.Value).Attr("selected", item.Selected).Text(item.Text);
                }
                return drop;
            });

            Editors.Always.ModifyWith(AddElementName);

            //Editors.Always.BuildBy(TagActionExpression.BuildTextbox);
            //Displays.Always.BuildBy(req => new HtmlTag("span").Text(req.StringValue()));
            //Labels.Always.BuildBy(req => new HtmlTag("span").Text(req.Accessor.Name));
        }
        public DataAnnotationHtmlConventions()
        {
            Labels.IfAttribute<DisplayNameAttribute>().Modify((h, r, a) => h.Text(a.DisplayName));

            Inputs.IfAttribute<DataTypeAttribute>().BuildBy((r, a) =>
            {
                if (a.DataType == DataType.Text)
                    return new HtmlTag("textarea").Text(r.GetAttemptedValue() ?? r.GetValue<string>());
                
                return null;
            });

            Inputs.IfAttribute<DataTypeAttribute>().Modify((h, r, a) =>
            {
                if (a.DataType == DataType.Password)
                    h.Attr("type", "password").Attr("value", null).Attr("autocomplete", "off");
            });
            
            Inputs.IfAttribute<HiddenInputAttribute>().BuildBy((r, a) =>
            {
                var hidden = new HiddenTag().Attr("value", r.GetAttemptedValue() ?? r.GetValue<object>());
                return hidden;
            });

            Inputs.IfAttribute<StringLengthAttribute>().Modify((h, r, a) =>
            {
                h.Attr("maxlength", a.MaximumLength);
                if (a.MinimumLength > 0)
                    h.Attr("minlength", a.MinimumLength);
            });

            Inputs.Always.Modify((h, r) => AddNumberClasses(r, h));
        }
        public SamlResponseRedirectionDocument(string response, string destination)
        {
            Title = "Saml2 Response Redirection";

            var form = new FormTag(destination);

            Push(form);

            var hiddenTag = new HiddenTag().Attr("name", SamlAuthenticationStrategy.SamlResponseKey)
                                           .Attr("value", response);

            Add(hiddenTag);

            Pop();

            AddJavaScript("window.onload = function () { document.forms[0].submit(); }");
        }
        public DefaultHtmlConventions()
        {
            Displays.Always.BuildBy(req => new HtmlTag("span").Text(req.GetValue<string>()));
            Labels.Always.BuildBy(req => new HtmlTag("label").Attr("for", req.Id).Text(req.Accessor.InnerProperty.Name.BreakUpCamelCase()));
            Inputs.Always.BuildBy(req =>
            {
                return new TextboxTag().Attr("value", req.GetAttemptedValue() ?? req.GetValue<string>());
            });

            Inputs.If<bool>().BuildBy(req =>
            {
                var attemptedVal = req.GetAttemptedValue();
                var isChecked = attemptedVal != null ? attemptedVal.Split(',').First() == Boolean.TrueString: req.GetValue<bool>();
                var check = new CheckboxTag(isChecked).Attr("value", true);
                var hidden = new HiddenTag().Attr("name", req.Name).Attr("value", false);
                return check.After(hidden);
            });

            Inputs.If<IEnumerable<SelectListItem>>().BuildBy(BuildSelectList);
            Inputs.If<MultiSelectList>().BuildBy(BuildSelectList);
            
            All.Always.Modify((h, r) =>
            {
                h.Id((string.IsNullOrEmpty(r.Id) ? null : r.Id) ?? (string.IsNullOrEmpty(h.Id()) ? null : h.Id()));
                if (h.IsInputElement())
                {
                    h.Attr("name", r.Name ?? (string.IsNullOrEmpty(h.Attr("name")) ? null : h.Attr("name")));
                }
            });

            Labels.Always.Modify((h, r) => h.Id(r.Id + "_" + "Label"));
            Displays.Always.Modify((h, r) => h.Id(r.Id + "_" + "Display"));

            Inputs.Always.Modify((h, r) =>
            {
                //Validation class
                ModelState modelState;
                if (r.ViewContext.ViewData.ModelState.TryGetValue(r.Name, out modelState) && modelState.Errors.Count > 0)
                {
                    h.AddClass(HtmlHelper.ValidationInputCssClassName);
                }
            });
        }
        public CombinationConventions()
        {
            Inputs.If<CombinationType>().BuildBy((r,p) =>
            {
                var val = r.GetValue<CombinationType>();
                if (val.IsSingle)
                {
                    var div = new DivTag().Text(val.Name);
                    var hidden = new HiddenTag().Id(r.Id).Attr("name", r.Name).Attr("value", val.Value);
                    hidden.WrapWith(div);
                    return hidden.RenderFromTop();
                }
                return p.Build<CombinationType>(x=>x.Items);
            });

            All.If<DateTime>().Modify((h, r) =>
            {
                var val = r.GetValue<DateTime>();
                h.Text(val.ToString("yyyyMMdd"));
            });
        }
 private static HtmlTag MethodOverride(this HtmlTag tag, HttpVerbs method)
 {
     var hidden = new HiddenTag().Attr("name", "X-HTTP-Method-Override");
     switch (method)
     {
         case HttpVerbs.Put:
             return tag.Append(hidden.Attr("value", "PUT"));
         case HttpVerbs.Delete:
             return tag.Append(hidden.Attr("value", "DELETE"));
         case HttpVerbs.Head:
             return tag.Append(hidden.Attr("value", "HEAD"));
     }
     throw new InvalidOperationException(string.Format("There is no need for an override for {0}.", method));
 }