WPSN = function(){

    /**
    * Shortcut for document.getElementById()
    * @param {id} id of html element to return
    * @method $
    * @return {Object} Html element with id id
    */
    var $ = function(id){
        return document.getElementById(id);
    }

    /**
    * Render the WPSN toolbar at the top of the page
    * @param {String} twitterLinkCallbackUrl
    * @method renderToolbar
    * @return {Function} 
    */
    var renderToolbar = function(twitterCallbackUrl, verbose){
        if(verbose){
  	    YAHOO.log("Rendering toolbar", "info", "wpsn.js");
        }
	var toolbar = $div({'id':'wpsnToolbar'});
	var bodyElements = document.getElementsByTagName('body');
        var newBody = document.createElement('body');
//        YAHOO.util.Dom.insertAfter(newBody, bodyElements[0]);        
//        newBody.appendChild(toolbar);
	bodyElements[0].insertBefore($div({'id':'fb-root'}), YAHOO.util.Dom.getFirstChild(bodyElements[0]));
        bodyElements[0].appendChild(toolbar);
        // Render the twitter login button
//	TWITTER.renderTwitterLogin(toolbar, twitterCallbackUrl, null)(null);
        // Render the google plus login
//	GOOGLEPLUS.renderLoginlink(toolbar)(null);
//	LINKEDIN.renderLoginlink(toolbar)(null);
	return toolbar;
    }

    /**
    * Redirect user after saving facebook user
    * @param {String} redirectTo
    * @param {Object} o
    * @method saveFBUserSuccess
    * @return {Function} 
    */
    var saveFBUserSuccess = function(redirectTo, verbose){
	return function(o){
            if(verbose){
      	        YAHOO.log("Successfully saved Facebook user", "info", "wpsn.js");
            }
	    if(redirectTo){
		if(verbose){
		    alert('Redirecting to '+redirectTo);  
		}
		document.location.href = redirectTo;
	    }
	}
    }

    /**
    * Placeholder for if there a connection error when saving the facebook user
    * @param {Integer} i
    * @param {Object} o
    * @method saveFBUserFailure
    * @return {Function} 
    */
    var saveFBUserFailure = function(verbose){
	return function(o){
            if(verbose){
      	        YAHOO.log("Failed saving Facebook user", "info", "wpsn.js");
            }
	}
    }

    /**
    * Save facebook user (also applies to twitter user)
    * @param {Boolean} liked
    * @param {Str} redirectTo
    * @param {Object} user
    * @method saveFBUser
    * @return {Function} 
    */
    var saveFBUser = function(liked, redirectTo, verbose){
	return function(user){
	    if($('userDetails')){
	        //$('userDetails').innerHTML = 'Facebook user details: '+YAHOO.lang.JSON.stringify(user);
	    }
  	    var callback =
            {
  	        success: saveFBUserSuccess(redirectTo, verbose), // Redirect user after saving facebook user
		failure: saveFBUserFailure(verbose)
            };  
    	    var cObj = YAHOO.util.Connect.asyncRequest('POST', '?run=saveFBUser', callback, 'liked='+(liked?'1':'0')+'&user='+YAHOO.lang.JSON.stringify(user));
	}
    }

    /**
    * Called when a user is saved to the database
    * @param {Str} redirectTo
    * @param {Object} o
    * @method saveGooglePlusSuccess
    * @return {Function} 
    */
    var saveGooglePlusSuccess = function(redirectTo, verbose){
	return function(o){
            if(verbose){
      	        YAHOO.log("Successfully saved gooleplus user", "info", "wpsn.js");
            }
	    if(redirectTo){
		if(verbose){
		    alert('Redirecting to '+redirectTo);
		}
		document.location.href = redirectTo;
	    }
	}
    }

    /**
    * Placeholder
    * @param {Object} o
    * @method saveGooglePlusFailure
    * @return {Function} 
    */
    var saveGooglePlusFailure = function(verbose){
	return function(o){
            if(verbose){
      	        YAHOO.log("Failed saving gooleplus user", "info", "wpsn.js");
            }
	}

    }

    /**
    * Save user to database
    * @param {Str} redirectTo
    * @param {Object} user
    * @method saveGooglePlus
    * @return {Function} 
    */
    var saveGooglePlus = function(redirectTo, verbose){
	return function(user){
  	    var callback =
            {
  	        success: saveGooglePlusSuccess(redirectTo, verbose),
		failure: saveGooglePlusFailure(verbose)
            };  
    	    var cObj = YAHOO.util.Connect.asyncRequest('POST', '?run=saveGooglePlus', callback, 'user='+YAHOO.lang.JSON.stringify(user));
	}
    }

    /**
    * Called when a user is saved to the database
    * @param {Str} redirectTo
    * @param {Object} o
    * @method saveLinkedInSuccess
    * @return {Function} 
    */
    var saveLinkedInSuccess = function(redirectTo, verbose){
	return function(o){
            if(verbose){
  	        YAHOO.log("Successfully saved linkedIn user", "info", "wpsn.js");
            }
	    if(redirectTo){
		if(verbose){
		    alert('Redirecting to '+redirectTo);
		}
		document.location.href = redirectTo;
	    }
	}
    }

    /**
    * Placeholder
    * @param {Object} o
    * @method saveLinkedInFailure
    * @return {Function} 
    */
    var saveLinkedInFailure = function(verbose){
	return function(o){
            if(verbose){
  	        YAHOO.log("Failed saving linkedIn user", "info", "wpsn.js");
            }
	}
    }

    /**
    * Save user to database
    * @param {Str} redirectTo
    * @param {Object} user
    * @method saveLinkedIn
    * @return {Function} 
    */
    var saveLinkedIn = function(redirectTo, verbose){
	return function(user){
  	    var callback =
            {
  	        success: saveLinkedInSuccess(redirectTo),
		failure: saveLinkedInFailure()
            };  
    	    var cObj = YAHOO.util.Connect.asyncRequest('POST', '?run=saveLinkedIn', callback, 'user='+YAHOO.lang.JSON.stringify(user));
	}
    }

    /**
    * Redirect user after saving user details
    * @param {Str} redirectTo
    * @param {Object} o
    * @method saveTweetSuccess
    * @return {Function} 
    */
    var saveTweetSuccess = function(redirectTo, verbose){
	return function(o){
	   if(verbose){
  	            YAHOO.log("Successfully saved twitter user to database", "info", "wpsn.js");
            }
	    if(redirectTo){
   	        if(verbose){
		    alert('Redirecting to '+redirectTo);
                }
		document.location.href = redirectTo;
	    }
	}
    }

    /**
    * Placeholder for when there is a connection error saving a tweet
    * @param {Object} o
    * @method saveTweetFailure
    * @return {Function} 
    */
    var saveTweetFailure = function(verbose){
	return function(o){
	   if(verbose){
  	            YAHOO.log("Failed saving twitter user to database", "info", "wpsn.js");
            }
	}
    }

    /**
    * Save current user to database
    * @param {Str} redirectTo
    * @param {Object} user
    * @method saveTweet
    * @return {Function} 
    */
    var saveTweet = function(redirectTo, verbose){
	return function(user){
	   if(verbose){
  	            YAHOO.log("Saving twitter user to database", "info", "wpsn.js");
            }
  	    var callback =
            {
  	        success: saveTweetSuccess(redirectTo, verbose), // Redirect user after saving tweet
		failure: saveTweetFailure(verbose)
            };  
    	    var cObj = YAHOO.util.Connect.asyncRequest('POST', '?run=saveTweet', callback, 'user='+YAHOO.lang.JSON.stringify(user));
	}
    }

    /**
    * Render the twitter and gooleplus buttons, and attach an event to the facebook 'like' button, so that when it is clicked, the user is saved and subscribed to aweber
    * @param {Str} redirectTo
    * @param {Str} aweberFormHTMLLink
    * @param {Str} urlToTweet
    * @param {Object} user
    * @method showSocialButtons
    * @return {Function} 
    */
    var showSocialButtons = function(redirectTo, aweberFormHTMLLink, urlToTweet, twitterCallbackUrl, panelObj, fbUser, scrollPerc, twConsumerKey, twConsumerSecret, verbose){
	    // Facebook
            if(fbUser['first_name']){
	        if(verbose){
  	            YAHOO.log("Got facebook user, showing 'Like' button", "info", "wpsn.js");
                }
                panelObj.setBody('');
   	        panelObj.setBody('<div id="facebookButton"></div><div id="twitterButtonContainer"></div><div id="googlePlusButtonContainer"></div><div id="linkedInButtonContainer"></div>');

                if($('fbLike')){
                    $('facebookButton').appendChild($('fbLike'));
		}
                YAHOO.util.Dom.setStyle($('fbLike'), 'display', 'block');
                YAHOO.util.Dom.setStyle($('fbLoginButton'), 'display', 'none');
                // Subscribe the user when he clicks the FB Like button
	        if(verbose){
  	            YAHOO.log("Attaching facebookSubscribeCallback() to 'Like' button click", "info", "wpsn.js");
                }
                FB.Event.subscribe('edge.create',
                     function(response) {
               	         facebookSubscribeCallback(redirectTo, aweberFormHTMLLink, fbUser, verbose);
                    }
	        );

            }
	    else{
	        if(verbose){
  	            YAHOO.log("No facebook user, showing Facebook login button", "info", "wpsn.js");
                }
   	        panelObj.setBody('<div id="facebookButton"></div><div id="twitterButtonContainer"></div><div id="googlePlusButtonContainer"></div><div id="linkedInButtonContainer"></div><div id="linkedInLoginContainer"></div>');
		if($('fbLoginButton')){
                    $('facebookButton').appendChild($('fbLoginButton'));
                }
                YAHOO.util.Dom.setStyle($('fbLike'), 'display', 'none');
                YAHOO.util.Dom.setStyle($('fbLoginButton'), 'display', 'block');
	    }
	    
            // Save facebook user (also applies to twitter user)
	    if(verbose){
  	       YAHOO.log("Saving Facebook user(if any)", "info", "wpsn.js");
            }
            saveFBUser(false, false, verbose)(fbUser);  // this should be renamed

            // Render twitter button
	    if(verbose){
  	       YAHOO.log("Getting twitter user (if any)", "info", "wpsn.js");
            }
            TWITTER.getTwitterUser(loadTwitterButtonCallback(fbUser, aweberFormHTMLLink, redirectTo, urlToTweet, twitterCallbackUrl, twConsumerKey, twConsumerSecret, verbose), twConsumerKey, twConsumerSecret)(null);

            // Render google plus button if signed in, otherwised show connect button
	    if(verbose){
  	       YAHOO.log("Getting googleplus user (if any)", "info", "wpsn.js");
            }
            GOOGLEPLUS.getSignedInUser(loadGooglePlusButtonCallback(fbUser, aweberFormHTMLLink, redirectTo, verbose))(null);

	    if(verbose){
  	       YAHOO.log("Rendering linkedIn button", "info", "wpsn.js");
            }
            LINKEDIN.renderLinkedInButton($('linkedInButtonContainer'), handleLinkedIn(fbUser, aweberFormHTMLLink, redirectTo, verbose))(null);

            // Render the popup when user exits page unless we're using scrolling to activate the popup
        if(scrollPerc==-1){
            window.onbeforeunload = renderOnExitPopup(fbUser, aweberFormHTMLLink, redirectTo);
	}
    }

    var loadTwitterButtonCallback = function(fbUser, aweberFormHTMLLink, redirectTo, urlToTweet, twitterCallbackUrl, twConsumerKey, twConsumerSecret, verbose){
        return function(tuser){
            if(tuser['name']==null){
    	        if(verbose){
  	           YAHOO.log("Twitter user not found, rendering twitter login link", "info", "wpsn.js");
                }
  	        TWITTER.renderTwitterLogin($('twitterButtonContainer'), twitterCallbackUrl, null, twConsumerKey, twConsumerSecret)(null);
	    }
	    else{
    	        if(verbose){
  	           YAHOO.log("Twitter user found, rendering twitter tweet button", "info", "wpsn.js");
                }
                TWITTER.renderTwitterButton($('twitterButtonContainer'), 0, urlToTweet, handleTweet(fbUser, aweberFormHTMLLink, redirectTo, twConsumerKey, twConsumerSecret, verbose))(null)
	    }
	}
    }
    
    var loadGooglePlusButtonCallback = function(fbUser, aweberFormHTMLLink, redirectTo, verbose){
        return function(guser){
            if(guser['displayName']==null){
    	        if(verbose){
  	           YAHOO.log("No googleplus user found, rendering googleplus login link", "info", "wpsn.js");
                }
		// Not logged into google plus so show connect link
                GOOGLEPLUS.renderLoginlink($('googlePlusButtonContainer'))(null);
	    }
	    else{
    	        if(verbose){
  	           YAHOO.log("Googleplus user found, rendering googleplus  link", "info", "wpsn.js");
                }
               // Render the google plus button and attach the 'handleGooglePlus()' callback function
  		GOOGLEPLUS.renderGooglePlusButton($('googlePlusButtonContainer'), handleGooglePlus(fbUser, aweberFormHTMLLink, redirectTo, verbose)(guser))(null);
	    }
	}
    }

    var facebookSubscribeCallback = function(redirectTo, aweberFormHTMLLink, user, verbose){
                    var subscriberName = user['first_name']?user['first_name']:'me';
                    var subscriberEmail = user['email']?user['email']:'noone@example.com';
		    // Subscribe user to aweber
		    AWEBER.aweberSubscribe(subscriberName, subscriberEmail, aweberFormHTMLLink)(null);
                    // Save facebook user (also applies to twitter user)
                    saveFBUser(true, redirectTo, verbose)(user); // save user and set 'like' field to 1
    }

    /**
    * When the user does a tweet subscribe the user to aweber and save the user details
    * @param {Object} user
    * @param {Str} aweberFormHTMLLink
    * @param {Str} redirectTo
    * @param {Object} fbUser
    * @param {Str} twitterLink
    * @param {Object} twitterUser
    * @method handleTweet
    * @return {Function} 
    */
    var handleTweet = function(fbUser, aweberFormHTMLLink, redirectTo, twConsumerKey, twConsumerSecret, verbose){
	return function(twitterLink, twitterUser){
    	   if(verbose){
  	       YAHOO.log("Attaching handleTweet() callback", "info", "wpsn.js");
            }
	    return function(e){
    	            if(verbose){
  	                YAHOO.log("Calling handleTweet() callback", "info", "wpsn.js");
                    }
                    var subscriberName = twitterUser['name']?twitterUser['name']:(fbUser['first_name']?fbUser['first_name']:'me');
                    var subscriberEmail = twitterUser['email']?twitterUser['email']:(fbUser['email']?fbUser['email']:'');
		    // Subscribe user to aweber
    	            if(verbose){
  	                YAHOO.log("Subscribing twitter user (if any) to aWeber)", "info", "wpsn.js");
                    }
                    AWEBER.aweberSubscribe(subscriberName, subscriberEmail, aweberFormHTMLLink)(null);
                saveTweet(redirectTo, verbose)(twitterUser['name']?twitterUser:fbUser);
	    }
	}
    }

    /**
    * Subscribe and save user
    * @param {Object} user
    * @param {Str} aweberFormHTMLLink
    * @param {Str} redirectTo
    * @method handleGooglePlus
    * @return {Function} 
    */
//             handleGooglePlus(null, aweberFormHTMLLink, redirectTo, verbose)(data.guser)(null);
    var handleGooglePlus = function(fbUser, aweberFormHTMLLink, redirectTo, verbose){
	return function(user){
	    return function(e){
		var subscriberName = user['displayName']?user['displayName']:(fbUser!=null && fbUser['first_name']?fbUser['first_name']:'me');
		var subscriberEmail = user['email']?user['email']:(fbUser!=null && fbUser['email']?fbUser['email']:'noone@example.com');
               // Subscribe user to aweber
               AWEBER.aweberSubscribe(subscriberName, subscriberEmail, aweberFormHTMLLink)(null);
	       saveGooglePlus(redirectTo, verbose)(user); 
	    }
	}
    }

    /**
    * Subscribe and save user
    * @param {Object} fbUser
    * @param {Str} aweberFormHTMLLink
    * @param {Str} redirectTo
    * @method handleLinkedIn
    * @return {Function} 
    */
    var handleLinkedIn = function(fbUser, aweberFormHTMLLink, redirectTo, verbose){
	return function(){
            return function(e){
		var user = null;
                var linkedInProfile = LINKEDIN.getLinkedInProfile()(null);
   	        if(verbose){
 	            YAHOO.log("linkedInProfile="+linkedInProfile, "info", "wpsn.js");
                }
	        if(linkedInProfile!=''){
   	            if(verbose){
  	                YAHOO.log("Got linkedIn user", "info", "wpsn.js");
                    }
		    user = linkedInProfile;
                }   
		if(!user){
   	            if(verbose){
  	                YAHOO.log("No linkedIn user", "info", "wpsn.js");
                    }
		    user = fbUser;
                }
                var subscriberName = user['values']['firstName']?user['values']['firstName']:(fbUser!=null && fbUser['first_name']?fbUser['first_name']:'me');
                var subscriberEmail = user['values']['email']?user['values']['firstName']:(fbUser!=null && fbUser['email']?fbUser['email']:'me@example.com');
                // Subscribe user to aweber
   	        if(verbose){
  	            YAHOO.log("Subscribing linkedIn user (if any) to aWeber", "info", "wpsn.js");
                }
                AWEBER.aweberSubscribe(subscriberName, subscriberEmail, aweberFormHTMLLink)(null);
                saveLinkedIn(redirectTo, verbose)(user); 
            }
	}
    }

    /*
    * Render the content for the popup window
    * @param {String} title
    * @param {String} footer
    * @param {Str} redirectTo
    * @param {Str} aweberFormHTMLLink
    * @param {String} urlToTweet
    * @method renderSNWindowContent
    * @return {Function} 
    */
    var renderSNWindowContent = function(title, footer, redirectTo, aweberFormHTMLLink, urlToTweet, fbAppId, twitterCallbackUrl, fbUser, scrollPerc, twConsumerKey, twConsumerSecret, verbose, popupCustomText){
     	return function(panelObj){
	    if(verbose){
  	        YAHOO.log("Rendering popup window content", "info", "wpsn.js");
            }
            panelObj.setHeader(title);
            panelObj.setFooter(footer);
            $('snwin_bd').appendChild($div({'id':'userDetails'}, ''));
            // Get the facebook user details. Render the twitter and googleplus buttons, and attach an event to the facebook 'like' button, so that when it is clicked, the user is saved and subscribed to aweber
            //FACEBOOK.renderFBConnectButton($('facebookLoginContainer'), fbAppId)(e);
	    showSocialButtons(redirectTo, aweberFormHTMLLink, urlToTweet, twitterCallbackUrl, panelObj, fbUser, scrollPerc, twConsumerKey, twConsumerSecret, verbose);
            if(verbose){
  	        YAHOO.log("Rendering custom text for popup window", "info", "wpsn.js");
	    }
            $('snwin_bd').appendChild($div({'id':'wpsnPopupCustomText', '_class':'wpsnPopupCustomText', '_className':'wpsnPopupCustomText'}, popupCustomText));
	    YAHOO.util.Dom.setStyle('googlePlusButtonContainer', 'display','none');
	}
    }

    /*
    * Render the popup when user exits page
    * @method renderOnExitPopup
    * @return {Function} 
    */
    var renderOnExitPopup = function(user, aweberFormHTMLLink, redirectTo, verbose){
        return function(e){
            if(verbose){
  	        YAHOO.log("Rendering popup", "info", "wpsn.js");
            }
	    YAHOO.util.Dom.setStyle('snwin', 'display','block');
	    YAHOO.util.Dom.setStyle('snwin', 'visibility','visible');
	    YAHOO.util.Dom.setStyle('snwin_c', 'visibility','visible !important');
	    YAHOO.util.Dom.setStyle('googlePlusButtonContainer', 'display','block');

            if(verbose){
  	        YAHOO.log("Rendering linkedIn button", "info", "wpsn.js");
            }
            LINKEDIN.renderLinkedInButton($('linkedInButtonContainer'), handleLinkedIn(user, aweberFormHTMLLink, redirectTo, verbose))(null); 
	    return false;
        }

    }

    /*
    * Render the popup when user exits page
    * @param {Str} redirectTo
    * @param {Str} aweberFormHTMLLink
    * @param {String} urlToTweet
    * @method onexitPopup
    * @return {Function} 
    */
    var onexitPopup = function(redirectTo, aweberFormHTMLLink, urlToTweet, fbAppId, twitterCallbackUrl, fbUser, showPopup, scrollPerc, twConsumerKey, twConsumerSecret, verbose, popupCustomText){
        return function(e){
	    var modal = false;
            // Render the popup window.
            JWINDOW.render('snwin', modal, renderSNWindowContent('Tell your friends', '', redirectTo, aweberFormHTMLLink, urlToTweet, fbAppId, twitterCallbackUrl, fbUser, scrollPerc, twConsumerKey, twConsumerSecret, verbose, popupCustomText))(e);
//	    YAHOO.util.Dom.setStyle('snwin', 'width', 'auto');
	    YAHOO.util.Dom.setStyle('snwin', 'visibility',(showPopup?'visible':'hidden'));
            if(showPopup){
   	        YAHOO.util.Dom.setStyle('googlePlusButtonContainer', 'display','block');
            }
	    return false;

        }

    }

    var initCallback = function(renderExitWindow, redirectTo, aweberFormHTMLLink, urlToTweet, isHomePage, isPostPage, displayOption, fbAppId, showPopup, scrollPerc, twConsumerKey, twConsumerSecret, verbose, popupCustomText){
	return function(fbUser){
	    if(verbose){
                YAHOO.log("Calling initCallback()", "info", "wpsn.js");
	    }
              // user is the facebook user
            if(!showPopup && scrollPerc*1>-1){
  	        onexitPopup(redirectTo, aweberFormHTMLLink, urlToTweet, fbAppId, urlToTweet+'?run=twitterCallback', fbUser, showPopup, scrollPerc, twConsumerKey, twConsumerSecret, verbose, popupCustomText)(null);
                if(verbose){
                    YAHOO.log('Added "handleScroll()" event to "scroll" action on window', "info", "wpsn.js");
                }
                YAHOO.util.Event.on(window, 'scroll', handleScroll(scrollPerc, fbUser, aweberFormHTMLLink, redirectTo, verbose));
	    }
            else{
                renderExitWindow = true;
	        if(showPopup || (renderExitWindow && ((isHomePage && (displayOption ==0 || displayOption ==2)) || (isPostPage && (displayOption ==1 || displayOption ==2))))){
                    // displayOption: 0 = home page, 1 = post page, 2 = home or post page
  	            onexitPopup(redirectTo, aweberFormHTMLLink, urlToTweet, fbAppId, urlToTweet+'?run=twitterCallback', fbUser, showPopup, 0, twConsumerKey, twConsumerSecret, verbose, popupCustomText)(null);
               }
	    }

	}
    }

    var onexitPopupCallback = function(redirectTo, aweberFormHTMLLink, urlToTweet, fbAppId, urlToTweet, verbose, popupCustomText){
	return function(fbUser){
            // displayOption: 0 = home page, 1 = post page, 2 = home or post page
  	    onexitPopup(redirectTo, aweberFormHTMLLink, urlToTweet, fbAppId, urlToTweet+'?run=twitterCallback', fbUser, verbose, popupCustomText)(null);
	}
    }

    var fbAlreadyConnectedCallback = function(toolbar, urlToTweet){
	return function(){
            toolbar.innerHTML+=FACEBOOK.renderLikeButton(urlToTweet)(null);
	}
    }

    var _init = function(renderExitWindow, redirectTo, aweberFormHTMLLink, urlToTweet, isHomePage, isPostPage, displayOption, fbAppId, showPopup, scrollPerc, twConsumerKey, twConsumerSecret, verbose, popupCustomText){
         // Render the facebook connect button
	var authCallback = _refreshPage;
	var unauthCallback = _fbUnAuth;
  	FACEBOOK.init(fbAppId, initCallback(renderExitWindow, redirectTo, aweberFormHTMLLink, urlToTweet, isHomePage, isPostPage, displayOption, fbAppId, showPopup, scrollPerc, twConsumerKey, twConsumerSecret, verbose, popupCustomText), authCallback, unauthCallback);
        var FBUserInput = $input({'type':'hidden', 'id':'FBuser'});
	// Render the WPSN toolbar at the top of the page
	var toolbar = renderToolbar(urlToTweet+'?run=twitterCallback', verbose);
	toolbar.appendChild(FBUserInput);
        // Render facebook buttons - these will be moved to the popup window
        FACEBOOK.renderFBConnectButton(toolbar, fbAppId, false, fbAlreadyConnectedCallback(toolbar, urlToTweet))(null);
        toolbar.innerHTML+=FACEBOOK.renderLikeButton(urlToTweet)(null);
    }

    var _refreshPage = function(){
        // Remove the 'onexit' event
        window.onbeforeunload = null;
        // Reload the page so the icons are updated but not if the page has just been refreshed
        var href = document.location.href.replace("showPopup=1","").replace("&showPopup=1","").replace("#","");
        if(href.indexOf('&refreshed=1')==-1){
            var locParts = href.split('?');
            locParts[1] = locParts[1]?locParts[1]:'';
            window.location.href=locParts[0]+'?'+locParts[1]+'&showPopup=1';
	}
    }

    var _fbUnAuth = function(){
    }

    var openWindow = function(){
	return function(e){
            YAHOO.util.Event.stopEvent(e);
            window.open('?run=openWindow', "gWindow","width=800,height=400,left=150,top=100,scrollbar=no,resize=no");		    
	}
    }

    var handleScroll = function(scrollDown, fbUser, aweberFormHTMLLink, redirectTo, verbose){
	return function(e){
            if(verbose){
               YAHOO.log('Calling "handleScroll()" event handler', "info", "wpsn.js");
            }
            var doc = YAHOO.util.Event.getTarget(e);
   	    var scrollTop = YAHOO.util.Dom.getDocumentScrollTop();
            var docHeight = YAHOO.util.Dom.getDocumentHeight();
            var viewportHeight = YAHOO.util.Dom.getViewportHeight();
            var percScrolled = ((scrollTop + viewportHeight) / docHeight)*100;
            if(percScrolled>scrollDown){
                renderOnExitPopup(fbUser, aweberFormHTMLLink, redirectTo, verbose)(null);
                YAHOO.util.Event.removeListener(doc, 'scroll');
	    }
	}
    }

    var getGooglePlusUserSuccess = function(aweberFormHTMLLink, redirectTo, verbose){
	return function(o){
	    var data = YAHOO.lang.JSON.parse(o.responseText);
            handleGooglePlus(null, aweberFormHTMLLink, redirectTo, verbose)(data.guser)(null);
	}
    }

    var getGooglePlusUserFailure = function(){
	return function(o){
	}
    }


    return{
 
    /*
    * Initialize the javascript for the blog page 
    *
    * @param {Boolean} renderExitWindow
    * @param {Str} redirectTo
    * @param {Str} aweberFormHTMLLink
    * @param {String} urlToTweet
    * @param {Boolean} isHomePage
    * @param {Boolean} isPostPage
    * @param {Integer} displayOption
    * @param {String} facebook app id
    * @method init
    * @return {Function} 
    */
	init : function(renderExitWindow, redirectTo, aweberFormHTMLLink, urlToTweet, isHomePage, isPostPage, displayOption, fbAppId, showPopup, scrollPerc, twConsumerKey, twConsumerSecret, verbose, popupCustomText){
	   return function(e){
	       if(verbose){
		   var loggerParent = $div({'id':'loggerParent', '_class':'yui-skin-sam', 'className':'yui-skin-sam'});
		   var loggerContainer = $div({'id':'loggerContainer'});                   
		   loggerParent.appendChild(loggerContainer);
		   document.body.appendChild(loggerParent);
                   var logReader = new YAHOO.widget.LogReader('loggerContainer');
                   // Assigns a custom, case-insensitive category "mycategory", which will
                   // be styled by the custom CSS you define with the same string
                   // YAHOO.log("My log message", "mycategory");
                   // YAHOO.log("My log message", "error", "buggyscript.js");
                   YAHOO.log("Redirection link:"+redirectTo, "info", "wpsn.js");
	       }
	       _init(renderExitWindow, redirectTo, aweberFormHTMLLink, urlToTweet, isHomePage, isPostPage, displayOption, fbAppId, showPopup, scrollPerc, twConsumerKey, twConsumerSecret, verbose, popupCustomText);
	   }
	},

	refreshPage: function(){
	    _refreshPage();
	},
  
        saveGooglePlusLike : function(aweberFormHTMLLink, redirectTo, verbose){
  	    var callback =
            {
  	        success: getGooglePlusUserSuccess(aweberFormHTMLLink, redirectTo, verbose), 
		failure: getGooglePlusUserFailure()
            };  
    	    var cObj = YAHOO.util.Connect.asyncRequest('GET', '?run=getguser', callback);
	},

        saveLinkedInShare : function(aweberFormHTMLLink, redirectTo, verbose){
            handleLinkedIn(null, aweberFormHTMLLink, redirectTo, verbose)()(null);
	},

    /*
    * Render the javascript for the aweber form on the settings page
    * @param {Object} container
    * @param {String} aweberUsername
    * @param {String} aweberPassword
    * @param {String} aweberListName
    * @param {Str} aweberFormHTMLLink
    * @param {Str} aweberAccountInput
    * @method adminInit
    * @return {Function} 
    */
	adminInit : function(container, aweberUsername, aweberPassword, aweberListName, aweberFormHTMLLink, aweberAccountInput){
	   return function(e){
               // Render the aweber form elements, lists dropdown and forms dropdown
//	       alert(aweberUsername+aweberPassword+aweberListName+aweberFormHTMLLink+aweberAccountInput);
	       AWEBER.renderAWeberFormElements(container, aweberUsername, aweberPassword, aweberListName, aweberFormHTMLLink, aweberAccountInput)(e);
	   }
	}

                   
    };

}();



