﻿/* =====================================
 * jquery.sphinxly.share.js v1.0.0
 * http://www.sphinxly.se/
 *
 * Copyright 2011, Sphinxly AB
 *
 * Programming by 
 * Patrik Ilola and Martin Eriksson
 * ===================================== */
(function ($) {
    $.fn.share = function (options) {
        // Extend our default options with those provided.
        // Note that the first arg to extend is an empty object -
        // this is to keep from overriding our "defaults" object.
        $.fn.share.options = $.extend({}, $.fn.share.defaults, options);

        //
        // Bind Click to the document to hide the window if click is outside
        //
        $('html').bind('click', function (e) {
            if ($.fn.share.active()) {
                var target = $(e.target);

                if (target.parents('.tellafriendmodal').size() == 0 && !target.is('.tellafriendmodal')) {
                    hideModal();
                }
            }
        });

        //
        // Set the window to reposition if the document scrolls or the window resizes
        //
        $(window).bind('resize scroll', function () {
            if ($.fn.share.active()) {
                positionShareWindow($.fn.share.currentOwner);
            }
        });

        //
        // Bind the escape key to close the window
        //
        $(document).keyup(function (e) {
            if (e.keyCode == 27 && $.fn.share.active()) {
                hideModal();
            }
        });


        return this.each(function () {
            var $this = $(this);

            $this.bind('click', function (e) {
                e.preventDefault();
                e.stopPropagation();

                showModal($(this));
            });
        });
    };


    function showModal(elm) {
        positionShareWindow(elm);
        getShareWindow().show();
        $.fn.share.currentOwner = elm;
    }

    function hideModal() {
        getShareWindow().hide();
        $.fn.share.currentOwner = null;
    }

    function positionShareWindow(elm) {
        //the clickable element
        var tellafriendlink = elm;

        //linkposition and dimensions
        var linkOffset = elm.offset();
        var linkHeight = elm.height();
        var linkWidth = $(tellafriendlink).width();

        //browser window width
        var $window = $(window);
        var windowWidth = $window.width();
        var windowHeight = $window.height();

        //dimensions of the modal window
        var modalWindow = getShareWindow();
        var modalWidth = modalWindow.width();
        var modalHeight = modalWindow.height();

        //set offsets for modal window
        var setLeftOffset = linkOffset.left - (modalWidth / 2) + (linkWidth / 2);
        var setTopOffset = linkOffset.top + linkHeight;

        if (($(window).scrollTop()) + modalHeight < linkOffset.top) {
            setTopOffset = linkOffset.top - linkHeight - modalHeight;
        }

        //check if too close to browser edges
        if (windowWidth <= setLeftOffset + modalWidth) {
            //To close to the right, set manual position on right;
            modalWindow.css({ 'right': '0', 'top': setTopOffset, 'left': 'auto' });
        } else if (setLeftOffset <= 0) {
            //To close to the left, set manual position on left;
            modalWindow.css({ 'left': '0', 'top': setTopOffset, 'right': 'auto' });
        } else {
            //Ok
            modalWindow.css({ 'right': 'auto', 'left': setLeftOffset, 'top': setTopOffset });
        }
    }

    //
    // private function for lazy loading of the modal window
    //
    function getShareWindow() {
        var shareWindow = $('.tellafriendmodal');
        var options = $.fn.share.options;

        if (!shareWindow.length) {
            var shareWindowHtml;

            shareWindowHtml += '<div class="tellafriendmodal">';
            shareWindowHtml += '<div class="tellafriendcontent">';

            if (options.showTwitter || options.showFacebook) {
                shareWindowHtml += (options.showTwitter && options.showFacebook) ? '<ul class="social">' : '<ul class="social single">';

                if (options.showFacebook) {
                    shareWindowHtml += '<li class="tellafriendfb">';
                    shareWindowHtml += '<a href="http://www.facebook.com/sharer.php?u=' + options.url + '" target="_blank"><span>' + options.facebookText + '</span></a>';
                    shareWindowHtml += '</li>';
                }

                if (options.showTwitter) {
                    shareWindowHtml += '<li class="tellafriendtweet">';
                    shareWindowHtml += '<a href="https://twitter.com/share/?url=' + options.url + '" target="_blank"><span>' + options.twitterText + '</span></a>';
                    shareWindowHtml += '</li>';
                }

                shareWindowHtml += '</ul>';
            }

            shareWindowHtml += '<div class="form">';
            shareWindowHtml += '<form>';
            shareWindowHtml += '<p><label class="req email"><span>' + options.emailToText + '</span><input type="text" class="formfield" name="to" /></label></p>';
            shareWindowHtml += '<p><label class="req email"><span>' + options.emailFromText + '</span><input type="text" class="formfield" name="from" /></label></p>';
            shareWindowHtml += '<p><label class="req"><span>' + options.nameFromText + '</span><input type="text" class="formfield" name="name" /></label></p>';
            shareWindowHtml += '<p><input type="submit" class="formbtn" value="' + options.sendText + '" /><input type="hidden" name="url" value="' + options.url + '" /> <span class="result"></span></p>';
            shareWindowHtml += '</form>';
            shareWindowHtml += '</div>';
            shareWindowHtml += '</div>';
            shareWindowHtml += '</div>';

            shareWindow = $(shareWindowHtml).appendTo($('body'));

            shareWindow.find('.tellafriendtweet a').click(function (e) {
                e.preventDefault();
                window.open($(this).attr("href"), "Twitter", "WIDTH=800,HEIGHT=530");
            });

            shareWindow.find('.tellafriendfb a').click(function (e) {
                e.preventDefault();
                window.open($(this).attr("href"), "Facebook", "WIDTH=800,HEIGHT=530");
            });

            shareWindow.find('input[type=text]').blur(function () {
                $(this).parents("form").find('span.result').html('');
                validateInput($(this));
            });

            shareWindow
                .find('form')
                .submit(function (e) {
                    e.preventDefault();

                    var $this = $(this);
                    var $message = $this.find('span.result');
                    var valid = true;

                    $message.html('');

                    $this.find('input[type=text]').each(function () {
                        if (!validateInput($(this)))
                            valid = false;
                    });

                    if (valid) {
                        var postData = {
                            to: $this.find('input[name=to]').val(),
                            from: $this.find('input[name=from]').val(),
                            name: $this.find('input[name=name]').val(),
                            url: $this.find('input[name=url]').val()
                        }

                        $this.find('input[type=submit]').attr('disabled', 'disabled');
                        $this.parents('.tellafriendmodal').addClass('ajax').find('form').css({ 'opacity': '.5' });

                        $.ajax({
                            type: 'post',
                            url: options.action,
                            data: postData,
                            dataType: 'json',
                            success: function (data) {
                                debug(data);

                                if (data.success) {
                                    $this.find('input[name=to]').val('');
                                    $message.html($.fn.share.options.successText);
                                } else {
                                    $message.html($.fn.share.options.failureText);
                                }
                            },
                            error: function () {
                                $message.html($.fn.share.options.failureText);
                            },
                            complete: function () {
                                $this.find('input[type=submit]').removeAttr('disabled');
                                $this.parents('.tellafriendmodal').removeClass('ajax').find('form').css({ 'opacity': '1' });
                            }
                        });
                    }
                });
        }

        return shareWindow;
    }

    //
    // private function for debugging
    //
    function validateInput(elm) {
        var parent = elm.parent();

        if (parent.hasClass("req")) {
            if (elm.val() == "") {
                parent.addClass("error").removeClass("ok");
                return false;
            }

            if (parent.hasClass('email') && !validateEmail(elm.val())) {
                elm.parent().addClass("error").removeClass("ok");
                return false;
            }
        }

        elm.parent().removeClass("error").addClass("ok");
        return true;
    };

    //
    // Private method for validating e-mails
    //
    function validateEmail(value) {
        var t = value;
        var x = t.indexOf('@');
        var y = t.lastIndexOf('.');
        return (x == -1 || y == -1 || (x + 2) >= y) ? false : true;
    }

    //
    // private function for debugging
    //
    function debug(obj) {
        if (window.console && window.console.log)
            window.console.log(obj);
    };

    //
    // plugin defaults - added as a property on our plugin function
    //
    $.fn.share.defaults = {
        showFacebook: true,
        showTwitter: true,
        facebookText: 'Dela',
        twitterText: 'Twittra',
        sendText: 'Skicka',
        nameFromText: 'Ditt namn:',
        emailToText: 'Din väns e-postadress:',
        emailFromText: 'Din e-postadress:',
        failureText: 'Misslyckades. Försök igen.',
        successText: 'Tipset är skickat.',
        url: window.location.href,
        action: '/tools/tellafriend'
    };

    //
    // public property to share the options
    //
    $.fn.share.options = null;

    //
    // public method to indicate whether the modal is displayed or not
    //
    $.fn.share.active = function () {
        return $.fn.share.currentOwner != null;
    };

    //
    // public property to indicate the current owner of the modal
    //
    $.fn.share.currentOwner = null;
})(jQuery);
