/* ------------------------------------------------------------------------
 * feedback.js
 * Copyright (c) Perfect Memorials. All rights reserved.
 * ------------------------------------------------------------------------ */

$(document).ready(function(){
    PMTFeedback.setEventHandlers();
});

var PMTFeedback = {
    
    feedbackDisplayed: false,
    
    setEventHandlers: function(){
    	// Attach onclick to give feedback link, cancel feedback button link and close feedback link
    	$('#link-give-feedback,#feedback-cancel').click(PMTFeedback.toggleFeedback);
    	// Attach onsubmit to give feedback form
    	$('#frm-feedback-header').submit(PMTFeedback.submitFeedback);
    	
    	// Attach onsubmit to give feedback form (standalone)
    	$('#frm-feedback').submit(PMTFeedback.submitFeedbackStandalone);
    },

    toggleFeedback: function(){
        $giveFeedback     = $('#give-feedback');
        $giveFeedbackLink = $('#link-give-feedback');
        $feedback         = $('#feedback-container');
        if(PMTFeedback.feedbackDisplayed){
            // Hide feedback form
            $feedback.addClass('hide');
            // Remove open style from 'Give Feedback' link
            $giveFeedbackLink.removeClass('open');
        }
        else{
            // Get position of 'Give Feedback' link
            var posLink = $giveFeedback.position();
            // Apply open style to 'Give Feedback' link
            $giveFeedbackLink.addClass('open');
            // Position and display feedback form
            $feedback.css('left', posLink.left);
            $feedback.removeClass('hide');
            // Focus on feedback textarea
            $('#f_feedback_header').focus();
        }
        PMTFeedback.feedbackDisplayed = !PMTFeedback.feedbackDisplayed;
        return false;
    },
    
    submitFeedback: function(){
        var error           = false;
        var $feedbackField  = $('#f_feedback_header');
        if($feedbackField.length==1){
            var feedbackValue = $feedbackField.val();
            if(feedbackValue != ''){
                // Resolution / Viewport Size
                var screenViewport  = PMTFeedback.screenViewportProperties();
                // Construct feedback data object
                var feedbackData = {
                                    f_js_enabled:           'True',
                                    
                                    f_screen_width:         screenViewport.screenWidth,
                                    f_screen_height:        screenViewport.screenHeight,
                                    f_viewport_width:       screenViewport.viewportWidth,
                                    f_viewport_height:      screenViewport.viewportHeight,
                            
                                    f_feedback:             feedbackValue,
                                    f_tribute_viewed:       ($('#f_tribute_viewed_header').val() || ''),
                                    f_current_page:         ($('#f_current_page_header').val() || '')
                                   };
                // Submit feedback data
                PMTCore.initAjax();
                $.ajax({
                    url:       '/feedback-submit/',
                    data:      feedbackData,
                    success:   PMTFeedback.submitFeedbackSuccess,
                    error:     PMTFeedback.submitFeedbackError
                });
            }
            else{
                error = true;
            }
        }
        else{
            error = true;
        }
        if(error){
            // Re-enable save button
            PMTCore.reenableSubmit('frm-feedback-header', 'Send Feedback');
        }
        return false;
    },
    
    submitFeedbackSuccess: function(result, textStatus){
        if(result.status){
            $('#feedback').html(result.msg);
            $('#link-close-feedback').click(PMTFeedback.toggleFeedback);
            $('#feedback-container').removeClass('give-feedback').addClass('feedback-thanks');
        }
        else{
            PMTFeedback.submitFeedbackError();
        }
    },
    
    submitFeedbackError: function(xmlHttpObj, result, errorObj){
        alert('We\'re sorry, there was a problem submitting your feedback. Please try again.');
        // Re-enable save button
        PMTCore.reenableSubmit('frm-feedback-header', 'Send Feedback');
    },
    
    submitFeedbackStandalone: function(){
        // Resolution / Viewport Size
        var screenViewport  = PMTFeedback.screenViewportProperties();
        // Set hidden form field values
        PMTFeedback.setFieldValue('f_js_enabled_standalone',        'True');
        PMTFeedback.setFieldValue('f_screen_width_standalone',      screenViewport.screenWidth);
        PMTFeedback.setFieldValue('f_screen_height_standalone',     screenViewport.screenHeight);
        PMTFeedback.setFieldValue('f_viewport_width_standalone',    screenViewport.viewportWidth);
        PMTFeedback.setFieldValue('f_viewport_height_standalone',   screenViewport.viewportHeight);
        return true;
    },
    
    screenViewportProperties: function(){
        var properties = {};
        // Resolution / Viewport Size
        properties.screenWidth     = screen.width;
        properties.screenHeight    = screen.height;
        // Standards browsers
        if(typeof window.innerWidth != 'undefined'){
            properties.viewportWidth   = window.innerWidth;
            properties.viewportHeight  = window.innerHeight;
        }
        // IE6 in standards compliant mode
        else if(typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0){
            properties.viewportWidth   = document.documentElement.clientWidth;
            properties.viewportHeight  = document.documentElement.clientHeight;
        }
        // Older versions of IE
        else{
            properties.viewportWidth   = document.getElementsByTagName('body')[0].clientWidth;
            properties.viewportHeight  = document.getElementsByTagName('body')[0].clientHeight;
        }
        return properties;
    },
    
    setFieldValue: function(targetField, fieldValue){
        $targetField = $('#' + targetField);
        if($targetField.length==1){
            $targetField.val(fieldValue);
        }
    }
    
};
