TWITTER = function(){

    var userLoggedIn = false;

    /**
    * 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 twitter tweet button
    * @param {Object} container
    * @param {Integer} countPosition
    * @param {String} urlToTweet
    * @param {Function} twitterLinkCallback
    * @method _renderTwitterButton
    * @return {Function} 
    */
    var _renderTwitterButton = function(container, countPosition, urlToTweet, twitterLinkCallback, twConsumerKey, twConsumerSecret){
	var twitterLink = $a({'target':'_NEW', 'id':'twitterLink', '_class':'twitter-share-button', 'className':'twitter-share-button', 'href':'https://twitter.com/share?count=none&url='+urlToTweet}, ' ');
        container.appendChild(twitterLink);
	_getTwitterUser(twitterButtonLoadedHandler(twitterLink, twitterLinkCallback, twConsumerKey, twConsumerSecret))(null);
    }

    /**
    * 
    * @param {String} twitterLink
    * @param {Function} twitterLinkCallback
    * @method twitterButtonLoadedHandler
    * @return {Function} 
    */
    var twitterButtonLoadedHandler = function(twitterLink, twitterLinkCallback){
        return function(twitterUser){
            if(twitterUser.name!=''){
               userLoggedIn = true;
            }
	    else{
		userLoggedIn = false;
		twitterUser = null;
	    }
    	    YAHOO.util.Event.on(twitterLink, 'click', twitterButtonHandler(twitterLink, twitterLinkCallback, twitterUser));
	}
    }

    /**
    * 
    * @param {String} twitterLink
    * @param {Function} twitterLinkCallback
    * @param {Object} twitterUser
    * @method twitterButtonLoadedHandler
    * @return {Function} 
    */
    var twitterButtonHandler = function(twitterLink, twitterLinkCallback, twitterUser){
        return function(e){
           if(!userLoggedIn){
               YAHOO.util.Event.stopEvent(e);
               showLoginMessage()(null);
           }
	   else{
               twitterLinkCallback(twitterLink, twitterUser)(null);
	   }
	}
    }

    /**
    * 
    * @method showLoginMessage
    * @return {Function} 
    */
    var showLoginMessage = function(){
	return function(e){
	    if(e!=null){
	       YAHOO.util.Event.stopEvent(e);
	    }
	    alert('Please sign in to twitter');
        }
    }

    /**
    * 
    * @param {Function} twitterLinkCallback
    * @param {Object} o
    * @method loginToTwitterSuccess
    * @return {Function} 
    */
    var loginToTwitterSuccess = function(twitterLinkCallback){
	return function(o){
            userLoggedIn = true;         
            if(o.responseText.substr(0,4)=='http'){
                window.open(o.responseText, "twcWindow","width=800,height=400,left=150,top=100,scrollbar=no,resize=no");		    
	    }
	    else{
		var resp = YAHOO.lang.JSON.parse(o.responseText);
	    }
	}
    }

    /**
    * 
    * @param {Object} o
    * @method loginToTwitterFailure
    * @return {Function} 
    */
    var loginToTwitterFailure = function(){
	return function(o){
	}
    }

   /**
    * 
    * @param {Object} form
    * @param {String}  callbackUrl
    * @param {Function} twitterLinkCallback
    * @method loginToTwitter
    * @return {Function} 
    */
    var loginToTwitter = function(form, callbackUrl, twitterLinkCallback, twConsumerKey, twConsumerSecret){
	return function(e){
            if(e!=null){
		YAHOO.util.Event.stopEvent(e);
	    }
  	    YAHOO.util.Connect.setForm(form);
  	    var callback =
            {
  	        success: loginToTwitterSuccess(twitterLinkCallback),
		failure: loginToTwitterFailure(),
            };  
    	    var cObj = YAHOO.util.Connect.asyncRequest('POST', 'wp-content/plugins/wpsn/twitter/server/twitter.php?run=login', callback, 'callbackUrl='+callbackUrl+'&twConsumerKey='+twConsumerKey+'&twConsumerSecret='+twConsumerSecret);
	}
    }

   /**
    * Render the twitter login button
    * @param {Object} toolbar
    * @param {String}  callbackUrl
    * @param {Function} twitterLinkCallback
    * @method _renderTwitterLogin
    * @return {Function} 
    */
    var _renderTwitterLogin = function(toolbar, callbackUrl, twitterLinkCallback, twConsumerKey, twConsumerSecret){
        var container = $div({'id':'twitterContainer'});
        var form = $form({});
   	var tLoginButton = $a({'href':'#', 'style':'text-decoration:none'}, $img({'border':'0', 'src':'wp-content/plugins/wpsn/images/sign_in_with_twitter.png','id':'tLoginButton', 'name':'tLoginButton'}));
        form.appendChild(tLoginButton);
        container.appendChild(form);
        YAHOO.util.Dom.insertBefore(container, toolbar);
        YAHOO.util.Event.addListener(tLoginButton, 'click', loginToTwitter(form, callbackUrl, twitterLinkCallback, twConsumerKey, twConsumerSecret)); 
    }

   /**
    * 
    * @param {Function} getTwitterUserCallback
    * @param {Object} o
    * @method getTwitterUserSuccess
    * @return {Function} 
    */
    var getTwitterUserSuccess = function(getTwitterUserCallback){
	return function(o){
	    var twitterUser = YAHOO.lang.JSON.parse(o.responseText);
	    getTwitterUserCallback(twitterUser);
	}
    }

   /**
    * 
    * @param {Object} o
    * @method getTwitterUserFailure
    * @return {Function} 
    */
    var getTwitterUserFailure = function(){
	return function(o){
	}
    }

   /**
    * Get the twitter user with the screen name $_SESSION['tscreeen_name']
    * @param {Function} getTwitterUserCallback
    * @method getTwitterUser
    * @return {Function} 
    */
    var _getTwitterUser = function(getTwitterUserCallback, twConsumerKey, twConsumerSecret){
	return function(e){
            if(e!=null){
		YAHOO.util.Event.stopEvent(e);
	    }
  	    var callback =
            {
  	        success: getTwitterUserSuccess(getTwitterUserCallback),
		failure: getTwitterUserFailure(),
            };  
    	    var cObj = YAHOO.util.Connect.asyncRequest('POST', 'wp-content/plugins/wpsn/twitter/server/twitter.php?run=getTwitterUser', callback, 'callbackUrl='+'&twConsumerKey='+twConsumerKey+'&twConsumerSecret='+twConsumerSecret);
	}
    }

    return{

   /**
    * Render the twitter login button
    * @param {Object} toolbar
    * @param {String}  callbackUrl
    * @param {Function} twitterLinkCallback
    * @method _renderTwitterLogin
    * @return {Function} 
    */
	renderTwitterLogin : function(container, callbackUrl, twitterLinkCallback, twConsumerKey, twConsumerSecret){
	   return function(e){
	       _renderTwitterLogin(container, callbackUrl, twitterLinkCallback, twConsumerKey, twConsumerSecret);
	   }
	},

    /**
    * Render twitter tweet button
    * @param {Object} container
    * @param {Integer} countPosition
    * @param {String} urlToTweet
    * @param {Function} twitterLinkCallback
    * @method _renderTwitterButton
    * @return {Function} 
    */
        renderTwitterButton : function(container, countPosition, urlToTweet, twitterLinkCallback, twConsumerKey, twConsumerSecret){
	    return function(e){
                _renderTwitterButton(container, countPosition, urlToTweet, twitterLinkCallback, twConsumerKey, twConsumerSecret);
	    }
	},

   /**
    * Get the twitter user with the screen name $_SESSION['tscreen_name']
    * @param {Function} getTwitterUserCallback
    * @method getTwitterUser
    * @return {Function} 
    */
	getTwitterUser : function(getTwitterUserCallback, twConsumerKey, twConsumerSecret){
	    return function(e){
		_getTwitterUser(getTwitterUserCallback, twConsumerKey, twConsumerSecret)(e);
	    }			   
	}
    };

}();









