/**
 * daapi handler
 *
 * @author Wade 
 * @classDescription Daapi request wrapper
 * 
 **/

/* ---[ Add Global Daapi Values ]--- */
mdp.daapiDebug=false;

function daapi(subdomain, regSource, communityPath, domain, params){

    /* ---[ CLASS VARIABLES ]--- */	
 
 	/* public */
       /*
        * mdp values - if these are not passed set them to ''
        * This may need to get moved to a file with a jsp switch for each site
        * as regSource and subdomain vary
        * 
        */
        (!subdomain) ? mdp.subdomain = '' : mdp.subdomain = subdomain;
        (!regSource) ? mdp.regSource = '9999' : mdp.regSource = regSource;
        (!communityPath) ? mdp.communityPath = 'dgroups' : mdp.communityPath = communityPath;
        mdp.basepath = mdp.environment + mdp.subdomain + domain;
 
    /* private */
	var pluckDaapiUrl;
	
	
    /* ---[ CONSTRUCTOR ]--- */
	
    function init(){
		pluckDaapiUrl = "http://" + mdp.pluck.environment + domain + "/ver1.0/Direct/Process";		
	}
	
    
    /* ---[ PUBLIC METHODS ]--- */
	
	/* Batch Request Handler*/
    this.request = function(){
		if (typeof(RequestBatch) == 'function') {
			var requestBatch = new RequestBatch();
			
					/* build request */
					for(var i=0; i<params.requests.length; i++){
							/* 
							 * Pluck will only accept 20 non-paginated requests at one time.
							 * 19 non-paginated with 1 paginated.
							 * Each paginated request needs to be in it's own request.
							 */
							if (i < 20) {requestBatch.AddToRequest(params.requests[i].object);}
							else {alert("Daapi request limit has been exceeded!");}
					}
			requestBatch.BeginRequest(pluckDaapiUrl, ReturnedFromPluck);
		}
		else{alert("Pluck DirectProxy scripts not present!");}
    };


    /* ---[ PRIVATE METHODS ]--- */
	
	/* 
	 * Batch Response Handlers
	 * Response handler for each Pluck daapi object.
	 * Add in alphabetical order as needed.
	 */
	function ReturnedFromPluck(responseBatch){
		/*    if(window.console && mdp.daapiDebug && mdp.pluck.environment !="sitelife."){console.dir(responseBatch);}   */
		 
		if (responseBatch.Responses != null && responseBatch.Responses.length > 0) {
			for(var i=0; i<responseBatch.Responses.length; i++){
				
					
					
                    /* ArticleKey */
                    if(responseBatch.Responses[i].Article != null){
                        mdp.pluck.Article = responseBatch.Responses[i].Article;
                        if (params.requests[i].handler != null) {
                            params.requests[i].handler();
                        }
                        else {
                            alert('Article cannot be rendered via daapi.js');
                        }
                    }


                    /* CommunityGroup */
                    else if(responseBatch.Responses[i].CommunityGroup != null){
                        mdp.pluck.CommunityGroup = responseBatch.Responses[i].CommunityGroup;
                        if (params.requests[i].handler != null) {
                            params.requests[i].handler();
                        }
                        else {
                            alert('CommunityGroup cannot be rendered via daapi.js');
                        }
                    }


                    /* CommentPage */
                    else if(responseBatch.Responses[i].CommentPage != null){
                        mdp.pluck.CommentPage = responseBatch.Responses[i].CommentPage;
                        if (params.requests[i].handler != null) {
                            params.requests[i].handler();
                        }
                        else {
                            alert('CommentPage cannot be rendered via daapi.js');
                        }
                    }


					/* CommunityGroupRecentForumDiscussions */
					else if(responseBatch.Responses[i].CommunityGroupRecentForumDiscussions != null){
						mdp.pluck.CommunityGroupRecentForumDiscussions = responseBatch.Responses[i].CommunityGroupRecentForumDiscussions;
						if (params.requests[i].handler != null) {
							params.requests[i].handler();
						}
					else {
							alert('CommunityGroupRecentForumDiscussions cannot be rendered via daapi.js');
						}
					}
					
					
					/* FriendPage */
					else if(responseBatch.Responses[i].FriendPage != null){
						mdp.pluck.FriendPage = responseBatch.Responses[i].FriendPage;
						if (params.requests[i].handler != null) {
							params.requests[i].handler();
						}
					else {
							alert('FriendPage cannot be rendered via daapi.js');
						}
					}
					
					
					/* PersonaMessagePage */
					else if(responseBatch.Responses[i].PersonaMessagePage != null){
						mdp.pluck.PersonaMessagePage = responseBatch.Responses[i].PersonaMessagePage;
						if (params.requests[i].handler != null) {
							params.requests[i].handler();
						}
					else {
							alert('PersonaMessagePage cannot be rendered via daapi.js');
						}
					}
					
					
					/* RecentMiniFeedActivity */
					else if(responseBatch.Responses[i].RecentMiniFeedActivity != null){
						mdp.pluck.RecentMiniFeedActivity = responseBatch.Responses[i].RecentMiniFeedActivity;
						if (params.requests[i].handler != null) {
							params.requests[i].handler();
						}
					else {
							alert('RecentMiniFeedActivity cannot be rendered via daapi.js');
						}
					}
					
					
					/* RequestCommunityGroupMembershipAction */
					else if(responseBatch.Responses[i].CommunityGroupInvitationKey != null){
						mdp.pluck.membershipResponse = responseBatch.Responses[i].CommunityGroupInvitationKey.Key;
						if (params.requests[i].handler != null) {
							params.requests[i].handler();
						}
						else {
							mdp.pluck.serverMessage = 'Membership Request Response: '+responseBatch.Messages[i].Message+' | '+mdp.pluck.membershipResponse;
							if(window.console && mdp.daapiDebug && mdp.pluck.environment !="sitelife."){console.log(mdp.pluck.serverMessage);}
						}
					}
					
					
					/* SearchResults */
					else if(responseBatch.Responses[i].SearchResult != null){
						mdp.pluck.SearchResult = responseBatch.Responses[i].SearchResult;
						if (params.requests[i].handler != null) {
							params.requests[i].handler();
						}
						else {
							alert('SearchResults cannot be rendered via daapi.js');
						}
					}
					
				
					/* User *** Render function still in daapi.js */
					else if(responseBatch.Responses[i].User != null){
						mdp.pluck.User = responseBatch.Responses[i].User;
						if (params.requests[i].handler != null) {
							params.requests[i].handler();
						}
						else {
							render(responseBatch.Responses[i].User, params.requests[i].elements);
						}
					}

					
																
			}
            /*
            * Executes for EVERY daapi call -
            * if(window.console && mdp.daapiDebug && mdp.pluck.environment !="sitelife."){console.dir(mdp)};
            */
        }else{
			/* Display Server Message Returned From Pluck
			* 'Simple Actions' - actions with nothing other than confirmation from Pluck, may be handled here.
			* */
			if (responseBatch.Messages != null && responseBatch.Messages.length > 0) {
				for (var i = 0; i < responseBatch.Messages.length; i++) {
					mdp.pluck.serverMessage = 'Server Response From Pluck: '+responseBatch.Messages[i].Message;
					if(window.console && mdp.daapiDebug && mdp.pluck.environment !="sitelife."){console.log(mdp.pluck.serverMessage);console.log(responseBatch);}
                    /*CommentAction has no response other than 'OK' this re-fires CommentPage to show the comment just submitted.
                    * getComments is in daapiComments.js */
                    if((mdp.pluck.CommentPage !=null) && (typeof(mdp.getComments) == "function")){
                            mdp.getComments(1);
                    }
				}
			}
		}
		
		
		/* call on complete */
		if (params.onComplete != null) {
			params.onComplete();
        }
	}
	
	/* Render Batch Response Handler*/
	function render(object,elements){
		for(var i=0; i<elements.length; i++){
			switch (elements[i].render){
				case 'SurfacePersona':
					RenderSurfacePersona(object,elements[i].id);					
				break;
				default:
				
				break;
			}
		}
	}

/* ---[ RUN ]--- */
   init();
}




/* Comment Count *
 *
 * Initial Implementation in ShareMy only But it will spread, I'm certain. Consider a cros-site daapiFunctions.js
 * couldn't justify an external file for a this... and since it's on ALL Sites with sharemy...
*/
    function CommentsCounter(Article, element){
        var container = $(element);
        var NumComments = Article.Comments.NumberOfComments;
        (container).setHTML('('+NumComments+')');
    }
