Test Form

NANTUCKET MONOGRAPH WITH RIZZOLI: PRE-ORDER COMMITMENT
PHOTOGRAPHS BY MICHAEL GAILLARD

Thank you for your interest in helping bring my Nantucket monograph with Rizzoli to life. The anticipated list price is $125, though no payment is due at this stage. By submitting this form, you are registering a good-faith commitment that will become payable only once the publishing contract with Rizzoli is finalized. Your early support will help demonstrate to Rizzoli the extent of the anticipation for this publication and strengthen the case for bringing it fully into being.

I can’t thank you enough for the support you continue to show. I’ve been both grateful and overwhelmed to receive over 950 pre-orders in just a few days. Whether you’re submitting for the first time or following up with details, the information below helps us process orders and plan production and distribution of the signed copies and prints. You will receive your print within a couple months. The book’s release date will depend on what is determined in conversation with Rizzoli and their production schedule.

Please complete the fields below and click SUBMIT.

Pre-order quantity

Enter the number of signed copies you’d like to reserve.

With this order you are reserving as many signed copies of the monograph as you've designated. You are also entitled to a signed, limited-edition 8 x 10-inch fine art pigment print valued at $300.
Underwrite additional copies for artwork credit

Optional unless you leave pre-order quantity blank.

Each copy is calculated at the monograph’s anticipated price of $125. In return, I will credit 1.3 times the total dollar amount of your underwriting toward your next artwork purchase or commission. As an example, 80 copies, worth 10,000 dollars, would result in a 13,000-dollar credit toward my net of any future commission or purchase(s).
Piece selection

Select your piece from any of these collections and submit your answer here:

Select your piece from any of the collections and submit your answer here. With your $125 pre-order purchase of my monograph, you are entitled to an 8 x 10-inch signed print (valued at $300).
Framing preference
If you do not want the piece framed, there is no additional cost to you and I will cover shipping. If you do want the piece to be framed, the forthcoming invoice will reflect the 300-dollar cost of production (paid directly to my mounter and framer) as well as the shipping cost to your address.
EMAIL
NAME AND ADDRESS
SEND A MESSAGE OF SUPPORT TO RIZZOLI (OPTIONAL)
{ const form = document.getElementById("mgSupportForm"); if (!form) return; const qtyPre = document.getElementById("mg_preorder_quantity"); const qtyUnder = document.getElementById("mg_underwritten_copies"); const piece = document.getElementById("mg_piece_selection"); const email = document.getElementById("mg_email"); const address = document.getElementById("mg_address"); const notes = document.getElementById("mg_notes"); const framingGroup = document.getElementById("mgFramingGroup"); const framingInputs = form.querySelectorAll('input[name="framing_preference"]'); const warnLine = document.getElementById("mgSubmitWarning"); const summary = document.getElementById("mgSubmissionSummary"); const toInt = (v) => { const n = parseInt(String(v || "").trim(), 10); return Number.isFinite(n) ? n : 0; }; const getCheckedValue = (nodes) => { for (const n of nodes) if (n.checked) return n.value; return ""; }; const setWarnLine = (on) => { if (!warnLine) return; warnLine.classList.toggle("is-active", !!on); }; const markFramingWarn = (on) => { if (!framingGroup) return; framingGroup.querySelectorAll(".mg-yn span").forEach((s) => { s.classList.toggle("mg-warn", !!on); }); }; const clearWarn = () => { qtyPre?.classList.remove("mg-warn"); qtyUnder?.classList.remove("mg-warn"); piece?.classList.remove("mg-warn"); email?.classList.remove("mg-warn"); address?.classList.remove("mg-warn"); markFramingWarn(false); }; const validate = () => { clearWarn(); setWarnLine(false); let ok = true; const pre = toInt(qtyPre?.value); const under = toInt(qtyUnder?.value); if (pre <= 0 && under <= 0) { qtyPre?.classList.add("mg-warn"); qtyUnder?.classList.add("mg-warn"); ok = false; } if (!String(piece?.value || "").trim()) { piece?.classList.add("mg-warn"); ok = false; } if (!String(email?.value || "").trim() || (email && !email.checkValidity())) { email?.classList.add("mg-warn"); ok = false; } if (!String(address?.value || "").trim()) { address?.classList.add("mg-warn"); ok = false; } const framingVal = getCheckedValue(framingInputs); if (!framingVal) { markFramingWarn(true); ok = false; } if (!ok) setWarnLine(true); return { ok, pre, under, framingVal }; }; for (const el of [qtyPre, qtyUnder]) { if (!el) continue; el.addEventListener("input", () => { el.value = el.value.replace(/[^\d]/g, ""); }); } const revalidateOn = (el, events) => { if (!el) return; const evts = Array.isArray(events) ? events : [events]; evts.forEach((evt) => { el.addEventListener(evt, () => { if (!warnLine?.classList.contains("is-active")) return; validate(); }); }); }; revalidateOn(qtyPre, ["input", "focus", "blur"]); revalidateOn(qtyUnder, ["input", "focus", "blur"]); revalidateOn(piece, ["input", "focus", "blur"]); revalidateOn(email, ["input", "focus", "blur"]); revalidateOn(address, ["input", "focus", "blur"]); framingInputs.forEach((r) => { r.addEventListener("change", () => { if (!warnLine?.classList.contains("is-active")) return; validate(); }); }); form.addEventListener("submit", (e) => { const { ok, pre, under, framingVal } = validate(); if (!ok) { e.preventDefault(); return; } if (summary) { summary.value = [ `Pre-order quantity: ${pre || 0}`, `Underwritten copies: ${under || 0}`, `Piece selection: ${String(piece?.value || "").trim()}`, `Framing: ${framingVal}`, `Email: ${String(email?.value || "").trim()}`, `Shipping address: ${String(address?.value || "").trim()}`, `Message to Rizzoli: ${String(notes?.value || "").trim()}` ].join("\n"); } }); })(); // ]]>