/* Copyright © Pluck Corporation 2008. This software code and related intellectual property are the property of Pluck Corporation and are licensed for use solely on designated websites. Any distribution, copying, or other use of this intellectual property other than pursuant to a written agreement with Pluck Corporation is strictly prohibited. All Rights Reserved. */
// THIS FILE IS AUTOGENERATED. DO NOT EDIT THIS FILE DIRECTLY.
if (typeof(slwidgets) === 'undefined') {
  slwidgets = {};
}
if (typeof(slwidgets.widgetLoader) === 'undefined') {
  slwidgets.widgetLoader = {};
  (function(){
    // the local variable we'll use to queue up load calls
    var callbacks = [];
    // keeps track of what scripts we've already added
    var addedScripts = {};
    // have we added our onload handler before?
    var onLoadHandlerAdded = false;
    // called to check if every url is loaded
    var onLoadHandler = function(){
      // check that every url is loaded
      for (url in addedScripts) {
        if (addedScripts[url] == false) {
          // found a url that hasn't loaded, don't proceed
          return;
        }
      }
      // every url is loaded, so call all the callbacks
      for (var callbackIndex = 0; callbackIndex < callbacks.length; callbackIndex++) {
        callbacks[callbackIndex]();
      }
      // we've called all the callbacks, don't call them again
      callbacks = [];
    };
    
    var addUrlHandler = function(url) {
        // check to see if we've added this script before
        if (url in addedScripts) {
          // we've added it before, short circuit adding the script node to the head
          onLoadHandler();
          return;
        }
        // we've added the script, but haven't loaded it yet
        addedScripts[url] = false;
        // there should only be one head node
        var headNode = document.getElementsByTagName("head")[0];
        // make the script node
        var scriptNode = document.createElement("script");
        scriptNode.setAttribute("src", url);
        // if we're using Internet Explorer, use the onreadystatechange event; otherwise, use onload
        if ((/msie/i).test(navigator.userAgent)) {
          scriptNode.onreadystatechange = function(){
            if (this.readyState === 'loaded' || this.readyState === 'complete') {
              slwidgets.widgetLoader.requestComplete(url);
            }
          };
        } else {
          scriptNode.setAttribute("onload", "javascript:slwidgets.widgetLoader.requestComplete('" + url + "');");
        }
        headNode.appendChild(scriptNode);
    };
    
    slwidgets.widgetLoader.load = function(urls, callback){
        if (typeof(urls).length === 'undefined') {
            urls = [urls];
        }
        for (var i=0; i < urls.length; i++) {
            addUrlHandler(urls[i]);
        }
        
        // add the callback to our list of callbacks
        callbacks.push(callback);
        onLoadHandler();
    };
    
    slwidgets.widgetLoader.requestComplete = function(urlThatFinished){
      // set this url to loaded so our onload handler can check to make sure everything was loaded  before calling the callbacks
      addedScripts[urlThatFinished] = true;
      // check to see if we're done
      onLoadHandler();
    }
    
    slwidgets.widgetLoader.addWidgetDiv = function(){
        if (typeof(PLUCKSL_WIDGET_DIV) === 'string') {
            var id = PLUCKSL_WIDGET_DIV;
            delete PLUCKSL_WIDGET_DIV
            return id;
        } else if (typeof(PLUCKSLOLD_WIDGET_DIV) === 'string') {
            var id = PLUCKSLOLD_WIDGET_DIV;
            PLUCKSLOLD_WIDGET_DIV = false;
            return id;
        }
      var id = "widgetDiv-" + Math.random() + '-' + Math.random();
      document.write('<div id="' + id + '"><\/div>');
      return id;
    };
  })();
}
if (typeof(slwidgets.getServerBaseUrl) === 'undefined') {
	slwidgets.getServerBaseUrl = function(url){
		if(!url){ url = window.location.href; }
		if(url.indexOf('http://www.charlotteobserver.com/') >= 0) {
			return 'http://pluck.charlotteobserver.com/ver1.0';
		}
		if(url.indexOf('http://www.adn.com/') >= 0) {
			return 'http://pluck.adn.com/ver1.0';
		}
		if(url.indexOf('http://www.bellinghamherald.com/') >= 0) {
			return 'http://pluck.bellinghamherald.com/ver1.0';
		}
		if(url.indexOf('http://www.bnd.com/') >= 0) {
			return 'http://pluck.bnd.com/ver1.0';
		}
		if(url.indexOf('http://www.bradenton.com/') >= 0) {
			return 'http://pluck.bradenton.com/ver1.0';
		}
		if(url.indexOf('http://www.heraldonline.com/') >= 0) {
			return 'http://pluck.heraldonline.com/ver1.0';
		}
		if(url.indexOf('http://www.idahostatesman.com/') >= 0) {
			return 'http://pluck.idahostatesman.com/ver1.0';
		}
		if(url.indexOf('http://www.macon.com/') >= 0) {
			return 'http://pluck.macon.com/ver1.0';
		}
		if(url.indexOf('http://www.miamiherald.com/') >= 0) {
			return 'http://pluck.miamiherald.com/ver1.0';
		}
		if(url.indexOf('http://www.myrtlebeachonline.com/') >= 0) {
			return 'http://pluck.myrtlebeachonline.com/ver1.0';
		}
		if(url.indexOf('http://www.sacbee.com/') >= 0) {
			return 'http://pluck.sacbee.com/ver1.0';
		}
		if(url.indexOf('http://www.sanluisobispo.com/') >= 0) {
			return 'http://pluck.sanluisobispo.com/ver1.0';
		}
		if(url.indexOf('http://www.sunherald.com/') >= 0) {
			return 'http://pluck.sunherald.com/ver1.0';
		}
		if(url.indexOf('http://www.thatsracin.com/') >= 0) {
			return 'http://pluck.thatsracin.com/ver1.0';
		}
		if(url.indexOf('http://www.thesunnews.com/') >= 0) {
			return 'http://pluck.thesunnews.com/ver1.0';
		}
		return 'http://pluck.charlotteobserver.com/ver1.0';
	};
}

var PLUCKSL_WIDGET_OPTIONS_DEFAULT = {"urls":false,"overview":false,"updateGroup":false,"inviteFriend":false,"updateEvent":false,"eventList":false,"requestGroupDeletion":false,"manageMembers":false,"updateLink":false,"showEvent":false,"showDiscussion":false,"showDiscussionPost":false,"showBlogPost":false,"showBlog":false,"editBlogPosts":false,"showGallery":false,"showPhoto":false,"showVideo":false,"updatePhoto":false,"updateVideo":false,"searchResults":false,"groupList":false,"templateId":"","remoteTemplateUrl":"","useDefaultStylesheet":"true"};
if (typeof slwidgets.slGroupDispatcher === 'undefined') {
    slwidgets.slGroupDispatcher = (function() {
        
        var serialize = function(obj) {
            // Let Gecko browsers do this the easy way
            if (typeof(obj.toSource) !== 'undefined' && typeof(obj.callee) === 'undefined') {
                return obj.toSource();
            }
            // Other browsers must do it the hard way
            switch (typeof(obj)) {
                // numbers, booleans, and functions are trivial:
                // just return the object itself since its default .toString()
                // gives us exactly what we want
            case 'number':
            case 'boolean':
            case 'function':
                return obj;
                break;

                // for JSON format, strings need to be wrapped in quotes
            case 'string':
                return '\'' + obj + '\'';
                break;

            case 'object':
                var str;
                if (obj.constructor === Array || typeof(obj.callee) !== 'undefined')
                {
                    str = '[';
                    var i,
                    len = obj.length;
                    for (i = 0; i < len - 1; i++) {
                        str += serialize(obj[i]) + ',';
                    }
                    str += serialize(obj[i]) + ']';
                }
                else
                {
                    str = '{';
                    var key;
                    for (key in obj) {
                        str += key + ':' + serialize(obj[key]) + ',';
                    }
                    str = str.replace(/\,$/, '') + '}';
                }
                return str;
                break;

            default:
                return 'UNKNOWN';
                break;
            }
        }

        var isBasicType = function(varType) {
            return ":string:number:boolean:".indexOf(':' + varType + ':') > -1;
        }

        var overrideOptions = function(from, to) {
            for (var option in to) {
                if (from.hasOwnProperty(option)) {
                    if (isBasicType(typeof(to[option]))) {
                        to[option] = from[option];
                    } else
                    if (typeof(to[option]) == 'object') {
                        if (to[option].constructor.toString() != "Function") {
                            overrideOptions(from[option], to[option]);
                        }
                    } else
                    if (typeof(to[option]) == 'function') {
                        to[option] = from[option];
                    }
                }
            }
        }

        // override the options
        var localOptions = PLUCKSL_WIDGET_OPTIONS_DEFAULT;
        if (typeof(PLUCKSL_WIDGET_OPTIONS) !== 'undefined') {
            overrideOptions(PLUCKSL_WIDGET_OPTIONS, localOptions);
        }
        
        var localEvents = {};
        if (typeof(PLUCKSL_WIDGET_EVENTS) !== 'undefined') {
            localEvents = PLUCKSL_WIDGET_EVENTS;
        }
        
        var localWidgetDiv = null;
        if (typeof(PLUCKSL_WIDGET_DIV) === 'string') {
            localWidgetDiv = PLUCKSL_WIDGET_DIV;
            delete PLUCKSL_WIDGET_DIV;
        }

        // Returns an associative array of query params.
        var pullQueryParams = function() {
            var queryParams = {};
            var parameters = document.location.search.substring(1).split('&');
            for (var i = 0; i < parameters.length; i++) {
                queryVals = parameters[i].split('=');
                queryParams[queryVals[0]] = decodeURIComponent(queryVals[1]);
            };
            return queryParams;
        };

        // adds the "urls" object if it was passed in
        var addUrlObjectToOptions = function(optionsHash) {
            // check for the urls object... make sure the passed in urls object is given
            if (!optionsHash.urls) {
                optionsHash['urls'] = false;
                if (localOptions.urls) {
                    optionsHash['urls'] = serialize(localOptions.urls);
                }
            }
        }

        var widgetUrl = function(widgetUrl) {
            return slwidgets.getServerBaseUrl(window.location.domain) + '/content/widgets/' + widgetUrl + 'widget.js';
        }

        var safeKey = function(keySeed) {
            return keySeed ? keySeed: '';
        };

        // if the urls were set locally, use those. otherwise, use the global urls.
        // we would set these earlier, but slwidgets.slUrls doesn't exist at
        // initialization time.
        var getUrls = function() {
            if (localOptions.urls) {
                return localOptions.urls;
            }
            else {
                return slwidgets.slUrls;
            }
        };
        
        // Takes a hash and a url to a widget JS. Writes out the script node that
        // invokes the widget.
        var insertWidgetCall = function(widgetOptions, widgetPath, widgetName) {
            // it's possible for slPage to be blank in the case of groupList or overview widgets... be careful!
            // start with any options that were passed in as the base options
            if (localOptions[widgetName]) {
                var baseOptions = localOptions[widgetName];
                for (key in widgetOptions) {
                    baseOptions[key] = widgetOptions[key];
                }
                widgetOptions = baseOptions;
            }
            addUrlObjectToOptions(widgetOptions);
            // special case for the default stylesheet
            if (typeof(localOptions['useDefaultStylesheet']) !== 'undefined') {
                widgetOptions.useDefaultStylesheet = localOptions['useDefaultStylesheet'];
            }
            // set the widget options for the widget we're about to write out
            // the script tag will execute immediately with these options, so set them here instead of writing them
            window.PLUCKSL_WIDGET_OPTIONS = widgetOptions;
            // set the overidden events for the widget here as well
            if (localEvents[widgetName]) {
                window.PLUCKSL_WIDGET_EVENTS = localEvents[widgetName];
            }
            if (localWidgetDiv) {
                var scriptElem = document.createElement('script');
                scriptElem.type = 'text/javascript';
                scriptElem.src = widgetUrl(widgetPath);
                var widgetDivElem = document.getElementById(localWidgetDiv);
                widgetDivElem.appendChild(scriptElem);
            }
            else {
                document.write('<script type="text/javascript" src="' + widgetUrl(widgetPath) + '"></script>');
            }
        };

        var groupListPage = function(queryParams) {
            var opts = {};
            if (queryParams.slSearchString !== undefined) opts.searchString = decodeURIComponent(safeKey(queryParams.slSearchString));
            if (queryParams.slGroupNotFound !== undefined) opts.displayGroupNotFoundMessage = (queryParams.slGroupNotFound === 'true');
            insertWidgetCall(opts, 'groups/groupList/', 'groupList');
        }

        var eventListPage = function(queryParams) {
            var options = {
                'groupKey': queryParams.slGroupKey
            }
            insertWidgetCall(options, 'groups/events/', queryParams.slPage);
        }

        var search = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'searchType': queryParams.slSearchType,
                'searchString': queryParams.slSearchString
            }
            insertWidgetCall(options, 'groups/searchResults/', queryParams.slPage);
        };

        var overviewPage = function(queryParams) {
            if (!queryParams.slPage) {
                queryParams.slPage = 'overview';
            }
            var options = {
                'groupKey': queryParams.slGroupKey,
                'acceptInvitation': queryParams.slAcceptInvitation ? (queryParams.slAcceptInvitation.toLowerCase() == "true") : false
            }
            insertWidgetCall(options, 'groups/overview/', 'overview');
        }

        var updateGroupPage = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                // on success, go to the overview page for that group
                'success': function(groupKey) { window.location.href = getUrls().groups.overview(groupKey); },
                'cancel': function() { window.location.href = decodeURIComponent(queryParams.slCancelUrl); }
            };
            insertWidgetCall(options, 'groups/updateGroup/', queryParams.slPage);
        }

        var updateEventPage = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'eventKey': safeKey(queryParams.slEventKey),
                // on success, go to the event list page for the group
                'success': function(groupKey) { window.location.href = getUrls().groups.eventList(groupKey); },
                'cancel': function() { window.location.href = decodeURIComponent(queryParams.slCancelUrl); }
            };
            insertWidgetCall(options, 'groups/updateEvent/', queryParams.slPage);
        }

        var requestGroupDeletion = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                // on success, go to the overview page for the group we're requesting to delete
                'success': function(groupKey) { window.location.href = getUrls().groups.overview(groupKey); },
                'cancel': function() { window.location.href = decodeURIComponent(queryParams.slCancelUrl); }
            };
            insertWidgetCall(options, 'groups/requestGroupDeletion/', queryParams.slPage);
        };

        var inviteFriend = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'cancel': function() { window.location.href = decodeURIComponent(queryParams.slCancelUrl); }
            };
            insertWidgetCall(options, 'groups/inviteFriend/', queryParams.slPage);
        };

        var discussionPage = function(queryParams) {
            var showNewDiscussion = (queryParams.slShowNewDiscussion === 'true');
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'forumKey': safeKey(queryParams.slForumDiscussionKey),
                'showNewDiscussion': showNewDiscussion
            };
            insertWidgetCall(options, 'groups/discussions/', queryParams.slPage);
        };

        var discussionPostPage = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'postKey': safeKey(queryParams.slForumPostKey)
            };
            
            if(queryParams.onPage){
				options.onPage = queryParams.onPage;
            }
            if(queryParams.plckFindPostKey){
				options.gotoPostKey = queryParams.plckFindPostKey;
            }
            insertWidgetCall(options, 'groups/discussions/post/', queryParams.slPage);
        };

        var showBlogPostPage = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'blogKey': safeKey(queryParams.slBlogKey),
                'postKey': safeKey(queryParams.slBlogPostKey),
                'findCommentKey': safeKey(queryParams.plckFindCommentKey)
            };
            insertWidgetCall(options, 'groups/blog/showPost/', queryParams.slPage);
        };

        var showBlog = function(queryParams) {
            var slShowNewPost = (queryParams.slShowNewPost == 'true');
            var slShowPostNotFoundError = (queryParams.slPostNotFound == 'true');
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'blogKey': safeKey(queryParams.slBlogKey),
                'tag' : (queryParams.slTagFilter ? true : false),
                'tagFilter' : queryParams.slTagFilter,
                'archive': (queryParams.slArchiveMonth ? true : false),
                'archiveMonth': queryParams.slArchiveMonth,
                'showNewPost': slShowNewPost,
                'showPostNotFoundError': slShowPostNotFoundError
            };
            insertWidgetCall(options, 'groups/blog/', queryParams.slPage);
        };

        var manageBlogPosts = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'blogKey': safeKey(queryParams.slBlogKey)
            };
            insertWidgetCall(options, 'groups/blog/managePosts/', queryParams.slPage);
        };

        var showMediaGallery = function(queryParams) {
            var showUpload = (queryParams.slShowUpload === 'true');
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'mediaType': safeKey(queryParams.slMediaType),
                'galleryKey': safeKey(queryParams.slGalleryKey),
                'showUpload': showUpload
            };
            insertWidgetCall(options, 'groups/mediaGallery/', queryParams.slPage);
        };

        var showMediaDetails = function(queryParams, type) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'galleryKey': safeKey(queryParams.slGalleryKey),
                'mediaKey': safeKey(queryParams.slMediaKey),
                'mediaType': type,
                'findCommentKey': safeKey(queryParams.plckFindCommentKey)
            };
            if (queryParams.slSlideshowOnPage) {
                options['slideshowOnPage'] = queryParams.slSlideshowOnPage;
            }
            insertWidgetCall(options, 'groups/mediaGallery/mediaDetails/', queryParams.slPage);
        };

        var showMediaUpdate = function(queryParams, type) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'galleryKey': safeKey(queryParams.slGalleryKey),
                'mediaKeyArray': safeKey(queryParams.slMediaKeyArray),
                'mediaType': type,
                'editMode': queryParams.slEditMode
            };
            insertWidgetCall(options, 'groups/mediaGallery/mediaUpdate/', queryParams.slPage);
        };

        var manageMembersPage = function(queryParams) {
            var options = {
                'searchString': decodeURIComponent(safeKey(queryParams.slSearchString)),
                'groupKey': safeKey(queryParams.slGroupKey)
            };
            insertWidgetCall(options, 'groups/memberList/', queryParams.slPage);
        };

        var updateLinkPage = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey),
                'success': function(groupKey) { window.location.href = getUrls().groups.overview(groupKey); },
                'cancel': function() { window.location.href = decodeURIComponent(queryParams.slCancelUrl); }
            };
            insertWidgetCall(options, 'groups/bookmarks/', queryParams.slPage);
        };

        var showEventPage = function(queryParams) {
            var options = {
                'groupKey': safeKey(queryParams.slGroupKey)
            };
            insertWidgetCall(options, 'groups/events/', queryParams.slPage);
        };

        return function() {

            this.execute = function() {
                var queryParams = pullQueryParams();

                // if slPage is not there and slGroupKey is there, show overview
                if (queryParams.slPage == '' || queryParams.slPage == null) {
                    if (queryParams.slGroupKey) {
                        // show the group overview for this group
                        overviewPage(queryParams);
                        return;
                    }
                    else {
                        // no key and no page param... show the list of groups
                        groupListPage(queryParams);
                        return;
                    }
                }
                if (queryParams.slPage == 'overview' && queryParams.slGroupKey) {
                    overviewPage(queryParams);
                    return;
                }
                if (queryParams.slPage == 'updateGroup') {
                    updateGroupPage(queryParams);
                    return;
                }
                if (queryParams.slPage == 'inviteFriend' && queryParams.slGroupKey) {
                    inviteFriend(queryParams);
                    return;
                }
                if (queryParams.slPage == 'updateEvent' && queryParams.slGroupKey) {
                    updateEventPage(queryParams);
                    return;
                }
                if (queryParams.slPage == 'eventList' && queryParams.slGroupKey) {
                    eventListPage(queryParams);
                    return;
                }
                if (queryParams.slPage == 'requestGroupDeletion' && queryParams.slGroupKey) {
                    requestGroupDeletion(queryParams);
                    return;
                }
                if (queryParams.slPage == 'manageMembers' && queryParams.slGroupKey) {
                    manageMembersPage(queryParams);
                    return;
                }
                if (queryParams.slPage == 'updateLink' && queryParams.slGroupKey) {
                    updateLinkPage(queryParams);
                    return;
                }
                if (queryParams.slPage == 'showEvent' && queryParams.slGroupKey) {
                    showEventPage(queryParams);
                    return;
                }

                //discussion widgets
                if (queryParams.slPage == 'showDiscussion' && queryParams.slGroupKey) {
                    discussionPage(queryParams);
                    return;
                }
                if (queryParams.slPage == 'showDiscussionPost' && queryParams.slGroupKey) {
                    discussionPostPage(queryParams);
                    return;
                }
                if (queryParams.slPage == 'showBlogPost' && queryParams.slGroupKey && queryParams.slBlogPostKey) {
                    showBlogPostPage(queryParams);
                    return;
                }
                if (queryParams.slPage == 'showBlog' && queryParams.slGroupKey && queryParams.slBlogKey) {
                    showBlog(queryParams);
                    return;
                }
                if (queryParams.slPage == 'editBlogPosts') {
                    manageBlogPosts(queryParams);
                    return;
                }

                //media widgets
                if (queryParams.slPage == 'showGallery' && queryParams.slGroupKey) {
                    showMediaGallery(queryParams);
                    return;
                }
                if (queryParams.slPage == 'showPhoto' && queryParams.slGroupKey) {
                    showMediaDetails(queryParams, 'photo');
                    return;
                }
                if (queryParams.slPage == 'showVideo' && queryParams.slGroupKey) {
                    showMediaDetails(queryParams, 'video');
                    return;
                }
                if (queryParams.slPage == 'updatePhoto' && queryParams.slGroupKey) {
                    showMediaUpdate(queryParams, 'photo');
                    return;
                }
                if (queryParams.slPage == 'updateVideo' && queryParams.slGroupKey) {
                    showMediaUpdate(queryParams, 'video');
                    return;
                }

                // search results
                if (queryParams.slPage == 'searchResults') {
                    // searchType, searchString, groupKey
                    search(queryParams);
                    return;
                }
                // default to showing the group list
                groupListPage(queryParams);
            }

        };
    })();
}

new slwidgets.slGroupDispatcher().execute();
