if (typeof SocialStrataWidget == 'undefined') {
    SocialStrataWidget = {
        nextWidgetAreaId: 0,
        appendHeadElement: function(element) {
            document.getElementsByTagName("head")[0].appendChild(element);
        },
        includeJavascript: function(url) {
            var js = document.createElement('script');
            js.setAttribute('language', 'javascript');
            js.setAttribute('type', 'text/javascript');
            js.setAttribute('src', url);

            SocialStrataWidget.appendHeadElement(js);
        },
        includeCssDefinitions: function(cssText, googleFontsUrl, baseId) {
            var styleElement = document.createElement("style");
            styleElement.setAttribute('type', "text/css");
            styleElement.id = baseId + 'Css';

            var includeGoogleFonts = googleFontsUrl && googleFontsUrl!=null;
            if (styleElement.styleSheet) {
                styleElement.styleSheet.cssText = cssText;
            } else {
                if (includeGoogleFonts) {
                    cssText = '@import url('+googleFontsUrl+');\n\n' +cssText;
                }
                styleElement.appendChild(document.createTextNode(cssText));
            }

            SocialStrataWidget.appendHeadElement(styleElement);

            if (styleElement.styleSheet && includeGoogleFonts) {
                // jw: IE requires that additional imports associated with this style sheet have to be done after the
                //     stylesheet has been added to the DOM, otherwise the webpage will crash, hard, and with no real
                //     error explaining why.
                // per: http://msdn.microsoft.com/en-us/library/ms531193%28VS.85%29.aspx
                styleElement.styleSheet.addImport(googleFontsUrl);
            }
        },
        getFullWidgetAreaId: function (id) {
            return 'socialStrataWidgetArea'+ id;
        },
        getDisplaySettingsAsUrlParameters: function(displaySettings) {
            var parameters = '';
            if (displaySettings!=null) {
                for (var name in displaySettings) {
                    parameters += '&'+name+'='+escape(displaySettings[name]);
                }
            }

            return parameters;
        },
        embed: function(baseUrl, widgetOid, displaySettings, embedIntoId) {
            if (embedIntoId==null) {
                embedIntoId = SocialStrataWidget.getFullWidgetAreaId(SocialStrataWidget.nextWidgetAreaId++);
                document.write('<span id="'+embedIntoId+'"> </span>');
            }

            var url = baseUrl + '/ew';
            url += "?widgetOid="+widgetOid;
            url += "&remoteWidgetAreaId="+embedIntoId;

            url += SocialStrataWidget.getDisplaySettingsAsUrlParameters(displaySettings);

            SocialStrataWidget.includeJavascript(url);
        },
        embedResponse: function(widgetAreaid, widgetHtml, widgetCss, googleFontsUrl) {
            var widgetArea = document.getElementById(widgetAreaid);

            SocialStrataWidget.includeCssDefinitions(widgetCss, googleFontsUrl, widgetAreaid);

            if (typeof widgetArea != 'undefined') {
                widgetArea.innerHTML = widgetHtml;
            }
        },
        isIE: navigator.userAgent.toLowerCase().indexOf('msie') > -1,
        mouseOver: function(divToMouseOver,event,widgetOid,fadeTitle) {
            if(SocialStrataWidget.isIE) {
                var currentTarget = divToMouseOver;
                var relatedTarget = event.relatedTarget || event.fromElement;
                if (relatedTarget && (relatedTarget==currentTarget || relatedTarget.childOf(currentTarget))) {
                    return;
                }
            }
            document.getElementById('widgetHoverTools'+widgetOid).style.display = '';
            if (fadeTitle) {
                document.getElementById('widgetTitleTable'+widgetOid).className = 'fadedWidgetTitleTable';
            }
        },
        mouseOut: function(divToMouseOut,event,widgetOid, fadeTitle) {
            if(SocialStrataWidget.isIE) {
                var currentTarget = divToMouseOut;
                var relatedTarget = event.relatedTarget || event.toElement;
                if (relatedTarget && (relatedTarget==currentTarget || relatedTarget.childOf(currentTarget))) {
                    return;
                }
            }
            document.getElementById('widgetHoverTools'+widgetOid).style.display = 'none';
            if (fadeTitle) {
                document.getElementById('widgetTitleTable'+widgetOid).className = 'widgetTitleTable';
            }
        }
    };
}

