Skip Navigation

The Place to Shop for Luxury Vinyl Planks in Owen Sound, ON

Luxury Vinyl Planks in Owen Sound, ON Choose a flooring style that combines beauty, comfort, and value — choose vinyl. Greyfair Flooring, Inc offers a wide range of vinyl styles, including those that mimic the look of hardwood. LVP provides the handsome appearance of wood flooring and a range of desirable benefits, all at a price you’ll love. Visit our store to browse one of the most diverse collections of luxury vinyl planks in Owen Sound, ON.


A Great Wood Alternative

Hardwood has long been one of the most desired flooring materials, renowned for its natural beauty and strength. However, hardwood flooring is not suitable for every construction and renovation project. For one thing, it simply doesn’t fit into some people’s home improvement budget. And another, wood doesn’t do well in rooms that are frequently exposed to water.

With a luxury vinyl plank floor, you can get the same appearance and texture as hardwood at a fraction of the usual cost. Likewise, vinyl doesn’t have the same moisture concerns as hardwood. In fact, vinyl is highly water resistant, making it a great choice for the following spaces:

  • Kitchens
  • Bathrooms
  • Basements
  • Laundry Rooms
  • Entryways

Making Your Home a Better Place to Be

LVP flooring offers a lot of comfort for your home. It’s softer underfoot than other hard surface materials; you’ll be glad you choose vinyl when you stand at the stove cooking or at the sink washing dishes for long periods. Furthermore, vinyl’s temperature insulation and soundproofing qualities help transform your rooms into better environments.

You’ll also appreciate how easy your LVP floor is to clean and maintain. Routine sweeping or vacuuming is all you need to keep vinyl free of debris. With some occasional mopping and spot treatments, your vinyl flooring will look great long after installation — no special maintenance is needed!


Leave the Hard Work to Us

Make the most of your new flooring purchase by hiring our professionals for installation. We have a team of installers trained to work with every product we sell. Leave the hard work to us, and we’ll ensure all warranty standards are met and that the surface looks just as good in your home as it did in our showroom.

Luxury vinyl plank floor installation provides a wide range of possibilities. Vinyl planks can be installed over virtually any surface without much need for preparation. Explore your options today by consulting with our staff.

Submit

Contact us for further information on our wood-alternative vinyl products. We proudly serve clients from throughout Owen Sound, Port Eglin, Wiarton, Kincardine, Hanover, Meaford, Flesherton, and Tobermory, Ontario, as well as the neighboring communities.

Contact Us

Name
Address
Make An Appointment
document.querySelectorAll("form:not(.filter-dropdown-wrapper)").forEach(elem => { elem.addEventListener('submit', function (event) { return handleFormSubmit(event, this); }) }); $(document).ready(function () { $("div.custom-form").each((index, element) => { const formData = $(element).data(); Object.keys(formData).forEach(key => { if (formData[key] == null || formData[key] === "") { delete formData[key]; } }); const queryString = $.param(formData); $.get("/custom/ajax/form?" + queryString, (response) => { $(element).html(response); // if any col-md-6 elements are present, and there are odd number of them switch the last one to col-md-12 const colMd6Elements = $(element).find('.col-md-6'); if (colMd6Elements.length > 0 && colMd6Elements.length % 2 !== 0) { colMd6Elements.last().removeClass('col-md-6').addClass('col-md-12'); } // Initialize Parsley validation const form = $(element).find("form"); form.parsley(); // Attach submit handler to the custom form form.on('submit', function (event) { return handleFormSubmit(event, this); }); //update hidden input PageURL and LeadSourceUrl to the current page URL const pageUrl = window.location.href; $(element).find('input[name="PageURL"]').val(pageUrl); $(element).find('input[name="LeadSourceUrl"]').val(pageUrl); }).fail(() => { console.error("Failed to load custom form."); }); }); }); function handleFormSubmit(event, cForm) { if (window.jQuery && $(cForm).parsley().isValid()) { event.preventDefault(); fetchLeadOrigin(cForm).then(() => { leadCleanUp(cForm); if (window.grecaptcha && window.globalRecaptchaKey) { grecaptcha.ready(function () { grecaptcha.execute(window.globalRecaptchaKey, { action: 'submit' }).then(function (token) { $(cForm).find('.g-recaptcha-response').val(token); handleFormSubmission(event, cForm); }); }); } else { handleFormSubmission(event, cForm); } }); } return false; } function leadCleanUp(cForm) { if ($("input[name='Phone']", $(cForm)).length > 0) { var cleanphone = $("input[name='Phone']", $(cForm)).val(); $("input[name='Phone']", $(cForm)).val(cleanphone.replace(/\D/g, '')) } if ($("input[name='CleanHomePhone']", $(cForm)).length > 0) { var cleanphone = $("input[name='CleanHomePhone']", $(cForm)).val(); $("input[name='CleanHomePhone']", $(cForm)).val(cleanphone.replace(/\D/g, '')) } if ($("input[name='CleanMobilePhone']", $(cForm)).length > 0) { var cleanphone = $("input[name='CleanMobilePhone']", $(cForm)).val(); $("input[name='CleanMobilePhone']", $(cForm)).val(cleanphone.replace(/\D/g, '')) } var notesField = $("input[name=OpportunityNotes]", $(cForm)); if (notesField.length == 0) { notesField = $("textarea[name=OpportunityNotes]", $(cForm)); } if (notesField, length > 0) { let messageField = $("textarea[name=MyMessage]", $(cForm)); if (messageField.length == 0) { messageField = $("textarea[name=Message]", $(cForm)); } var notesVal = ""; if (messageField && messageField.length > 0) { notesVal += messageField.val(); } $(".add-to-notes").each(function () { if ($(this).find("input").attr("name") && $(this).find("input").attr("name") !== undefined) { notesVal += "\n\n" + $(this).find("input").attr("name") + ": " + $(this).find("input").val(); } // Also check for select elements within .add-to-notes if ($(this).find("textarea").attr("name") && $(this).find("textarea").attr("name") !== undefined) { notesVal += "\n\n" + $(this).find("textarea").attr("name") + ": " + $(this).find("textarea").val(); } //if ($(this).find("input[type=checkbox]").attr("name") && $(this).find("input[type=checkbox]").attr("name") !== undefined) { // notesVal += "\n\n" + $(this).find("input[type=checkbox]").attr("name") + ": " + ($(this).find("input[type=checkbox]").is(":checked") ? "Yes" : "No"); //} //if ($(this).find("input[type=radio]:checked").attr("name") && $(this).find("input[type=radio]:checked").attr("name") !== undefined) { // notesVal += "\n\n" + $(this).find("input[type=radio]:checked").attr("name") + ": " + $(this).find("input[type=radio]:checked").val(); //} if ($(this).find("select").attr("name") && $(this).find("select").attr("name") !== undefined) { notesVal += "\n\n" + $(this).find("select").attr("name") + ": " + $(this).find("select").val(); } }) $(notesField).val(notesVal); } } function handleFormSubmission(event, cForm) { if (event.target.className.indexOf("external-form-handling") == -1) { if (event.target.className.indexOf("gnix-ajax-form") > -1) { submitViaAjax(cForm); } else { cForm.submit(); } } } function submitViaAjax(formElem) { /* get the action attribute from theelement */ var $form = $(formElem), url = $form.attr('action'); /* Send the data using post with element id name and name2*/ $form.children('[type=submit]').addClass("disabled"); var origText = $form.children('[type=submit]').html(); $form.children('[type=submit]').html(`
Loading...
`); if (!url) { url = window.location; } $.ajax({ url: url, type: 'POST', data: $form.serialize() }).done(function (result) { $form.addClass("d-none"); $form.parent().children("div.form-thank-you").removeClass("d-none"); }).fail(function (result) { // Try to parse the response text as JSON try { if (result.responseText) { const errorResponse = JSON.parse(result.responseText); handleServerValidationErrors($form, errorResponse); } } catch (e) { console.error("Could not parse error response:", e); } $form.children('[type=submit]').removeClass("disabled"); $form.children('[type=submit]').html(origText); }).always(function (result) { $form.children('[type=submit]').removeClass("disabled"); $form.children('[type=submit]').html(origText); }); } function handleServerValidationErrors($form, response) { // Check if we have errors to display in the ValidationProblemDetails format if (response && response.errors) { // Get all error fields const errorFields = Object.keys(response.errors); // Check if the only error is related to g-recaptcha const isOnlyCaptchaError = errorFields.length === 1 && errorFields[0] === "g-recaptcha"; // Only show captcha modal if it's the only error if (isOnlyCaptchaError) { showCaptchaModal(); } // Process each error field errorFields.forEach(function (fieldName) { const errorMessages = response.errors[fieldName]; if (fieldName && errorMessages && errorMessages.length > 0) { // Find the field by name const $field = $form.find(`[name="${fieldName}"]`); if ($field.length > 0) { // Get the Parsley instance for this field const fieldInstance = $field.parsley(); if (fieldInstance) { // Create a unique error name to avoid conflicts const errorName = fieldName + "-custom"; // Remove any existing errors with this name fieldInstance.removeError(errorName, { updateClass: true }); // Add the new error message fieldInstance.addError(errorName, { message: errorMessages[0], // Use the first error message updateClass: true }); // Remove existing event handlers to prevent duplicates $field.off('focus.customError input.customError change.customError'); // Add event handlers to clear errors when field is focused and then changed $field.on('focus.customError', function () { // Store reference to the field for the change event $(this).data('focused', true); }); // Handle input/change events $field.on('input.customError change.customError', function () { // Only process if field was previously focused if ($(this).data('focused') && $(this).val().trim() !== '') { const fieldInstance = $(this).parsley(); if (fieldInstance) { // Remove the custom error fieldInstance.removeError(errorName, { updateClass: true }); // If no other errors exist, remove error class if (fieldInstance.isValid()) { $(this).removeClass('parsley-error'); $(this).addClass('parsley-success'); } } } }); } } } }); // Focus on the first field with an error const $firstErrorField = $form.find('.parsley-error').first(); if ($firstErrorField.length > 0) { $firstErrorField.focus(); } } } async function fetchLeadOrigin(formElem) { var hiddenInput = $(formElem).find('input[name="__leadOrigin"]'); if (hiddenInput.length === 0) { // If the hidden input doesn't exist, create it hiddenInput = $('', { type: 'hidden', name: '__leadOrigin' }).appendTo(formElem); } try { const response = await fetch("https://api.ipify.org/?format=json"); const data = await response.json(); if (data) { // && data.serverVariables && data.serverVariables.RemoteIpAddress) { let leadOrigin = btoa(data.ip); hiddenInput.val(leadOrigin); } else { hiddenInput.val(btoa("0.0.0.0")); } } catch (error) { hiddenInput.val(btoa("0.0.0.0")); } }