define([
                                'dojo/_base/declare',
                                'dojo/Evented',
                                'dojo/on',
                                'dojo/json',
                                'dojo/dom',
                                'dojo/dom-class',
                                'dojo/dom-style',
                                'dojo/dom-construct',
                                'dojo/text!./ShareMenuView.html',
                                'xstyle/css!./ShareMenu.css'
                            ],
                            function (
                                declare,
                                Evented,
                                on,
                                JSON,
                                dom,
                                domClass,
                                domStyle,
                                domConstruct,
                                ShareMenuView) {
                            
                                return declare([Evented], {
                                    //properties
                                    options: null,
                                    map: null,
                            
                                    /**
                            	     * Constructs a new ShareMenu class.
                            	     * A class to encapsulate all the functionality related to sharing a map on social media.
                                     *
                                     * @class Common.ShareMenuController
                                     * @constructor
                            	     *
                                     * @example
                                     * var shareMenu = new ShareMenu({ position: "right", config: options.config, canCopyToClipboard: false, map: map });
                                     */
                                    constructor: function (options) {
                                        this.options = options;
                                        this.map = options.map;
                                        this.position = options.position;
                                        this.initialize(options);
                                    },
                            
                                    /**
                                       * @method initialize
                                       * @param {Object} options   
                                       */
                                    initialize: function (options) {
                                        var _self = this;
                                        var cssClassPosition = 'hrl-position-right';
                                        if (options.position)
                                            cssClassPosition = 'hrl-position-' + options.position;
                                        $('#hrl-sharemenu ul').addClass(cssClassPosition);
                                        domConstruct.place(ShareMenuView, _self.map.id, 'last');
                            
                                        $('#hrl-sharemenu').on('hidden.bs.modal', function () {
                                            _self.emit('share-menu-hidden', {});
                                        });
                                    },
                            
                                    show: function () {
                                        this.prepareShare();
                                        $('#hrl-sharemenu').modal('show');
                                    },
                            
                                    hide: function () {
                                        $('#hrl-sharemenu').modal('hide');
                                    },
                            
                                    prepareShare: function () {
                                        self = this;
                                        var url = self.options.url + "?extent=";
                                        var extent = self.map.extent.xmin + "," + self.map.extent.ymin + "," + self.map.extent.xmax + "," + self.map.extent.ymax;
                                        var layerids = self.map.layerIds;
                                        var basemap = self.map.getBasemap();
                                        var mfDefExp = "";
                            
                                        var visiblelayers = "";
                                        if (!self.map.visible) {
                                            visiblelayers = "";
                                        }
                                        else {
                                            var visibleLayersArr = [];
                                            for (var i = 0; i < layerids.length; i++) {
                                                var _layer = self.map.getLayer(layerids[i]);
                            
                                                //verify the layer is not a basemap
                                                if (_layer.id === basemap) { continue; }
                                                //bug with esri basemaps when a map is loaded from WebMapJson
                                                var isBasemap = false;
                                                for (var x = 0, _len = self.map.basemapLayerIds.length; x < _len; x++) {
                                                    if (_layer.id === self.map.basemapLayerIds[x]) {
                                                        isBasemap = true;
                                                        break;
                                                    }
                                                }
                                                if (isBasemap) { continue; }
                                                if (_layer && _layer.visible) { visibleLayersArr.push(layerids[i]); }
                            
                                                if (_layer.id === "mf-properties" && _layer.getDefinitionExpression()) {
                                                    mfDefExp = "&mfDefExp=true";
                                                }
                                            }
                            
                                            visiblelayers = visibleLayersArr.join(',');
                                        }
                            
                            
                                        var shareinfo = url + extent + "&visiblelayers=" + visiblelayers + "&basemap=" + basemap + mfDefExp;
                            
                                        var linkTitle = encodeURIComponent("HUD Resource Locator");
                            
                                        var facebookurl, twitterurl;
                                        if ($(window).width() < 768) {
                                            facebookurl = this.options.config.facebookMobileUrl;
                                            twitterurl = this.options.config.twitterMobileUrl + linkTitle;
                                        }
                                        else {
                                            facebookurl = this.options.config.facebookUrl;
                                            twitterurl = this.options.config.twitterUrl + linkTitle;
                                        }
                            
                                        //facebook
                                        self.getShortUrl(shareinfo, function (response) {
                                            var shortUrl = response.data.url;
                                            var url = facebookurl + shortUrl;
                                            dom.byId("hrl-link-facebook").setAttribute("href", url);
                                        });
                                        //twitter
                                        self.getShortUrl(shareinfo, function (response) {
                                            var shortUrl = response.data.url;
                                            var url = twitterurl + "%20" + shortUrl;
                                            dom.byId("hrl-link-twitter").setAttribute("href", url);
                                        });
                                        //google plus
                                        var googleurl = this.options.config.googlePlusUrl + linkTitle
                                        self.getShortUrl(shareinfo, function (response) {
                                            var shortUrl = response.data.url;
                                            var url = googleurl + "%20" + shortUrl;
                                            dom.byId("hrl-link-google").setAttribute("href", url);
                                        });
                            
                                        //email
                                        $("#hrl-link-email").click(function () {
                                            self.getShortUrl(shareinfo, function (response) {
                                                var shortUrl = response.data.url;
                                                var url = 'mailto:?subject=' + encodeURI('I\'ve Shared This Map with You from HUD Resource Locator&body=HUD Resource Locator ' + shortUrl);
                                                dom.byId("hrl-link-email").setAttribute("href", url);
                                            });
                                        });
                            
                                        $("#hrl-link-hyperlink").click(function () {
                                            self.getShortUrl(shareinfo, function (response) {
                                                var shortUrl = response.data.url;
                                                var sharelink = '<a id="sharelink" href="' + shortUrl + '">' + shortUrl + '</a>';
                                                var copyhtml = "";
                                                if (self.options.canCopyToClipboard)
                                                    copyhtml = '<span class="copy-group-btn"><button class="btn btn-default share-btn" type="button" id="copy-button"' +
                                                                'data-toggle="tooltip" data-placement="bottom"title="Copy to Clipboard">Copy</button></span>';
                                                domConstruct.place(sharelink + copyhtml, 'hrl-link-share', 'only');
                                                $("#hrl-sharemenu").modal("hide");
                                                $("#hrl-link-sharemenu-link").modal("show");
                                                $("#copy-button").click(function () {
                                                    var sharelink = dom.byId('sharelink').href;
                                                    copyText(sharelink);
                                                });
                                                var copyText = function (text) {
                                                    var textArea = document.createElement("textarea");
                                                    textArea.value = text;
                                                    document.body.appendChild(textArea);
                                                    textArea.select();
                                                    try {
                                                        var successful = document.execCommand('copy');
                                                        var msg = successful ? 'successful' : 'unsuccessful';
                                                        console.log('Copy was ' + msg);
                                                    } catch (err) {
                                                        console.log('Oops, unable to copy');
                                                    }
                                                    document.body.removeChild(textArea);
                                                }
                                            });
                                        });
                                    },
                            
                                    getShortUrl: function (url, callback) {
                                        var timestamp = new Date().getTime();
                            
                                        //return false;
                                        $.getJSON(
                                            this.options.config.urlShortenApiUrl + "&time=" + timestamp,
                                            {
                                                "format": "json",
                                                "apiKey": this.options.config.urlShortenApiKey,
                                                "login": this.options.config.urlShortenApiLogin,
                                                "longUrl": url
                                            },
                                            function (response) {
                                                if (callback) {
                                                    callback(response);
                                                }
                                            }
                                        );
                                    }
                                });
                            });