/**
 *  Copyright (C) 2010 Cloud.com, Inc.  All rights reserved.
 * 
 * This software is licensed under the GNU General Public License v3 or later.
 * 
 * It is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 * 
 */
//***** actions for a tab in right panel (begin) ************************************************************************
function buildActionLinkForTab(label, actionMap, $actionMenu, $midmenuItem1, $thisTab) { 
    var apiInfo = actionMap[label];
    var $listItem = $("#action_list_item").clone();
    $actionMenu.find("#action_list").append($listItem.show());
    $listItem.find("#link").text(label);   
    $listItem.data("label", label);	  
    $listItem.data("apiInfo", apiInfo);	 
      
    var id = $thisTab.data("jsonObj").id;
    
    $listItem.bind("click", function(event) {   
        $actionMenu.hide();    	 
        var $actionLink = $(this);   
                
        var dialogBeforeActionFn = apiInfo.dialogBeforeActionFn;         
        if(dialogBeforeActionFn == null) {	 
            var apiCommand = "command="+apiInfo.api+"&id="+id;                      
            doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $thisTab); 
        }
        else {
            dialogBeforeActionFn($actionLink, $thisTab, $midmenuItem1);	
        }               
        return false;
    });  
} 
function doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $thisTab) {  
    var label = $actionLink.data("label");	
    var apiInfo = $actionLink.data("apiInfo");	
    
    var inProcessText = apiInfo.inProcessText;		           
    var isAsyncJob = apiInfo.isAsyncJob;
    var asyncJobResponse = apiInfo.asyncJobResponse;	
    var afterActionSeccessFn = apiInfo.afterActionSeccessFn;	    
            
    var $spinningWheel = $thisTab.find("#spinning_wheel");
    $spinningWheel.find("#description").text(inProcessText);  
    $spinningWheel.show();  
        
    $midmenuItem1.find("#content").removeClass("selected").addClass("inaction");                          
    $midmenuItem1.find("#spinning_wheel").addClass("midmenu_addingloader").show();	
    $midmenuItem1.find("#spinning_wheel").data("inProcessText", inProcessText);
    $midmenuItem1.find("#info_icon").hide();		
    
    var $afterActionInfoContainer = $("#right_panel_content #after_action_info_container_on_top");   
    $afterActionInfoContainer.removeClass("errorbox").hide();       
    
	//Async job (begin) *****
	if(isAsyncJob == true) {	                     
        $.ajax({
            data: createURL(apiCommand),
            dataType: "json",           
            success: function(json) {	                       	                        
                var jobId = json[asyncJobResponse].jobid;                  			                        
                var timerKey = "asyncJob_" + jobId;					                       
                $("body").everyTime(
                    10000,
                    timerKey,
                    function() {
                        $.ajax({
                            data: createURL("command=queryAsyncJobResult&jobId="+jobId),
	                        dataType: "json",									                    					                    
	                        success: function(json) {		                                                     							                       
		                        var result = json.queryasyncjobresultresponse;										                   
		                        if (result.jobstatus == 0) {
			                        return; //Job has not completed
		                        } else {											                    
			                        $("body").stopTime(timerKey);				                        
			                        $spinningWheel.hide(); 
			                        			                          			                                             
			                        if (result.jobstatus == 1) { // Succeeded 	
			                            handleMidMenuItemAfterDetailsTabAction($midmenuItem1, true, (label + " action succeeded."));	
			                            $afterActionInfoContainer.find("#after_action_info").text(label + " action succeeded.");
                                        $afterActionInfoContainer.removeClass("errorbox").show();  
                                        afterActionSeccessFn(json, $midmenuItem1, id);     
			                        } else if (result.jobstatus == 2) { // Failed	
			                            handleMidMenuItemAfterDetailsTabAction($midmenuItem1, false, (label + " action failed. Reason: " + fromdb(result.jobresult.errortext)));		
			                            $afterActionInfoContainer.find("#after_action_info").text(label + " action failed. Reason: " + fromdb(result.jobresult.errortext));
                                        $afterActionInfoContainer.addClass("errorbox").show();     
			                        }											                    
		                        }
	                        },
	                        error: function(XMLHttpResponse) {	                            
		                        $("body").stopTime(timerKey);		                       		                        
		                        handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label, $afterActionInfoContainer, $midmenuItem1); 		                                             
	                        }
                        });
                    },
                    0
                );
            },
            error: function(XMLHttpResponse) {	                 
		        handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label, $afterActionInfoContainer, $midmenuItem1);  		        
            }
        });     
    }     
    //Async job (end) *****
    
    //Sync job (begin) *****
    else { 	    
        $.ajax({
            data: createURL(apiCommand),
	        dataType: "json",
	        async: false,
	        success: function(json) {	 	                  
	            $spinningWheel.hide(); 	      
	            handleMidMenuItemAfterDetailsTabAction($midmenuItem1, true, (label + " action succeeded."));	
	            	              
	            $afterActionInfoContainer.find("#after_action_info").text(label + " action succeeded.");
                $afterActionInfoContainer.removeClass("errorbox").show();              	
                                 				
				afterActionSeccessFn(json, $midmenuItem1, id);				
	        },
            error: function(XMLHttpResponse) {	                
		        handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label, $afterActionInfoContainer, $midmenuItem1); 		       
            }        
        });
    }
    //Sync job (end) *****
}
function handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label, $afterActionInfoContainer, $midmenuItem1) {     
    var errorMsg = "";
    if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
        var start = XMLHttpResponse.responseText.indexOf("h1") + 3;
        var end = XMLHttpResponse.responseText.indexOf(" 0) 
        afterActionInfo = label + " action failed. Reason: " + fromdb(errorMsg);
    else
        afterActionInfo = label + " action failed.";
    
    $afterActionInfoContainer.find("#after_action_info").text(afterActionInfo);         
    $afterActionInfoContainer.addClass("errorbox").show();
    
    $thisTab.find("#spinning_wheel").hide();  
    handleMidMenuItemAfterDetailsTabAction($midmenuItem1, false, afterActionInfo);	 	
}  
function handleMidMenuItemAfterDetailsTabAction($midmenuItem1, isSuccessful, afterActionInfo) {
    $midmenuItem1.find("#content").removeClass("inaction");
	$midmenuItem1.find("#spinning_wheel").hide();	
	
	$midmenuItem1.data("afterActionInfo", afterActionInfo); 
	
	var $infoIcon = $midmenuItem1.find("#info_icon").show();
	if(isSuccessful)
	    $infoIcon.removeClass("error");	    
	else
	    $infoIcon.addClass("error");	    
}
  	                
//***** actions for a tab in right panel (end) **************************************************************************
//***** actions for a subgrid item in right panel (begin) ************************************************************************
function buildActionLinkForSubgridItem(label, actionMap, $actionMenu, $subgridItem) {
    var apiInfo = actionMap[label];
    var $listItem = $("#action_list_item").clone();
    $actionMenu.find("#action_list").append($listItem.show());    
    $listItem.find("#link").text(label);   
    $listItem.data("label", label);	  
    $listItem.data("apiInfo", apiInfo);	 
    
    var id = $subgridItem.data("jsonObj").id;
    
    $listItem.bind("click", function(event) {   
        $actionMenu.hide();    	 
        var $actionLink = $(this);   
        
        var dialogBeforeActionFn = apiInfo.dialogBeforeActionFn;    
        if(dialogBeforeActionFn == null) {	 
            var apiCommand = "command="+apiInfo.api+"&id="+id;                      
            doActionToSubgridItem(id, $actionLink, apiCommand, $subgridItem); 
        }
        else {
            dialogBeforeActionFn($actionLink, $subgridItem);	
        }                        
        return false;
    });  
} 
function doActionToSubgridItem(id, $actionLink, apiCommand, $subgridItem) {       
    var label = $actionLink.data("label");	
    var apiInfo = $actionLink.data("apiInfo");	
    
    var inProcessText = apiInfo.inProcessText;		           
    var isAsyncJob = apiInfo.isAsyncJob;
    var asyncJobResponse = apiInfo.asyncJobResponse;	
    var afterActionSeccessFn = apiInfo.afterActionSeccessFn;	 
           
    var $spinningWheel = $subgridItem.find("#spinning_wheel");
    $spinningWheel.find("#description").text(inProcessText);  
    $spinningWheel.show();  
    $subgridItem.find("#after_action_info_container").removeClass("error").addClass("success").hide();      
    
	//Async job (begin) *****
	if(isAsyncJob == true) {	                     
        $.ajax({
            data: createURL(apiCommand),
            dataType: "json",           
            success: function(json) {	                    	                        
                var jobId = json[asyncJobResponse].jobid;                  			                        
                var timerKey = "asyncJob_" + jobId;					                       
                $("body").everyTime(
                    10000,
                    timerKey,
                    function() {
                        $.ajax({
                            data: createURL("command=queryAsyncJobResult&jobId="+jobId),
	                        dataType: "json",									                    					                    
	                        success: function(json) {		                                              							                       
		                        var result = json.queryasyncjobresultresponse;										                   
		                        if (result.jobstatus == 0) {
			                        return; //Job has not completed
		                        } else {											                    
			                        $("body").stopTime(timerKey);				                        
			                        $spinningWheel.hide();      		                       
			                        if (result.jobstatus == 1) { // Succeeded 				                        
			                            $subgridItem.find("#after_action_info").text(label + " action succeeded.");
                                        $subgridItem.find("#after_action_info_container").removeClass("error").addClass("success").show();  
			                            afterActionSeccessFn(json, id, $subgridItem);	
			                        } else if (result.jobstatus == 2) { // Failed
			                            $subgridItem.find("#after_action_info").text(label + " action failed. Reason: " + fromdb(result.jobresult.errortext));
                                        $subgridItem.find("#after_action_info_container").removeClass("success").addClass("error").show();			                          
			                        }											                    
		                        }
	                        },
	                        error: function(XMLHttpResponse) {	                  
		                        $("body").stopTime(timerKey);		                       		                        
		                        handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label); 		                        
	                        }
                        });
                    },
                    0
                );
            },
            error: function(XMLHttpResponse) {	 
		        handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label);    
            }
        });     
    }     
    //Async job (end) *****
    
    //Sync job (begin) *****
    else { 	            
        $.ajax({
            data: createURL(apiCommand),
	        dataType: "json",
	        async: false,
	        success: function(json) {	   
	            $spinningWheel.hide();   
	            $subgridItem.find("#after_action_info").text(label + " action succeeded.");
                $subgridItem.find("#after_action_info_container").removeClass("error").addClass("success").show();  
                afterActionSeccessFn(json, id, $subgridItem);    
	        },
            error: function(XMLHttpResponse) {	             
		        handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label);    
            }        
        });
    }
    //Sync job (end) *****
}
function handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label) { 
    $subgridItem.find("#spinning_wheel").hide();      
		                        
    var errorMsg = "";
    if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
        var start = XMLHttpResponse.responseText.indexOf("h1") + 3;
        var end = XMLHttpResponse.responseText.indexOf(" 0)  
        $subgridItem.find("#after_action_info").text(label + " action failed. Reason: " + fromdb(errorMsg));    
    else     
        $subgridItem.find("#after_action_info").text(label + " action failed."); 
        
	$subgridItem.find("#after_action_info_container").removeClass("success").addClass("error").show();  
}    	                
//***** actions for a subgrid item in right panel (end) **************************************************************************
//***** actions for middle menu (begin) ************************************************************************
var selectedItemsInMidMenu = {};
function buildActionLinkForMidMenu(label, actionMap, $actionMenu) {
    var apiInfo = actionMap[label];
    var $listItem = $("#action_list_item_middle_menu").clone();
    $actionMenu.find("#action_list").append($listItem.show());
    var $link = $listItem.find("#link").text(label);
    $link.data("apiInfo", apiInfo);
    
    /*
    $link.data("label", label);	  
    $link.data("api",apiInfo .api);				                 
    $link.data("isAsyncJob", apiInfo.isAsyncJob);
    $link.data("asyncJobResponse", apiInfo.asyncJobResponse);		     
    $link.data("afterActionSeccessFn", apiInfo.afterActionSeccessFn);
    $link.data("dialogBeforeActionFn", apiInfo.dialogBeforeActionFn);
    */
    
    $link.bind("click", function(event) {	
        $actionMenu.hide();    	 
                
        var itemCounts = 0;
        for(var id in selectedItemsInMidMenu) {
            itemCounts ++;
        }
        if(itemCounts == 0) {
            $("#dialog_info_please_select_one_item_in_middle_menu").dialog("open");		
            return;
        }        
        
        var $actionLink = $(this);   
        var dialogBeforeActionFn = $actionLink.data("dialogBeforeActionFn"); 
        if(dialogBeforeActionFn == null) {		                   
            for(var id in selectedItemsInMidMenu) {	
                var apiCommand = "command="+$actionLink.data("api")+"&id="+id;                      
                doActionToMidMenu(id, apiInfo, apiCommand); 	
            }
        }
        else {
            dialogBeforeActionFn(apiInfo, selectedItemsInMidMenu);	
            
        }        
        selectedItemsInMidMenu = {}; //clear selected items for action	                          
        return false;
    });  
} 
function doActionToMidMenu(id, apiInfo, apiCommand) {   
    var label = apiInfo.label;			           
    var isAsyncJob = apiInfo.isAsyncJob;
    var inProcessText = apiInfo.inProcessText;   
    var asyncJobResponse = apiInfo.asyncJobResponse;	
    var afterActionSeccessFn = apiInfo.afterActionSeccessFn;	    
        
    var $midmenuItem1 = $("#midmenuItem_"+id);	
    $midmenuItem1.find("#content").removeClass("selected").addClass("inaction");                          
    $midmenuItem1.find("#spinning_wheel").addClass("midmenu_addingloader").show();	
    $midmenuItem1.find("#spinning_wheel").data("inProcessText", inProcessText);
    $midmenuItem1.find("#info_icon").hide();		  
	
	var $detailsTab = $("#right_panel_content #tab_content_details");  
    var $spinningWheel = $detailsTab.find("#spinning_wheel");
    $spinningWheel.find("#description").text(inProcessText);  
    $spinningWheel.show();     
	
	//Async job (begin) *****
	if(isAsyncJob == true) {	                     
        $.ajax({
            data: createURL(apiCommand),
            dataType: "json",           
            success: function(json) {	                	                        
                var jobId = json[asyncJobResponse].jobid;                  			                        
                var timerKey = "asyncJob_" + jobId;					                       
                $("body").everyTime(
                    10000,
                    timerKey,
                    function() {
                        $.ajax({
                            data: createURL("command=queryAsyncJobResult&jobId="+jobId),
	                        dataType: "json",									                    					                    
	                        success: function(json) {		                            							                       
		                        var result = json.queryasyncjobresultresponse;										                   
		                        if (result.jobstatus == 0) {
			                        return; //Job has not completed
		                        } else {											                    
			                        $("body").stopTime(timerKey);	
			                        $midmenuItem1.find("#content").removeClass("inaction");
			                        $midmenuItem1.find("#spinning_wheel").hide();			                        
			                        hideDetailsTabActionSpinningWheel(id, inProcessText);				                        			                       
			                        if (result.jobstatus == 1) { // Succeeded  
			                            $midmenuItem1.find("#info_icon").removeClass("error").show();
			                            $midmenuItem1.data("afterActionInfo", (label + " action succeeded.")); 			                            
			                            afterActionSeccessFn(json, $midmenuItem1, id);  			                            
			                        } else if (result.jobstatus == 2) { // Failed	
			                            $midmenuItem1.find("#info_icon").addClass("error").show();
			                            $midmenuItem1.data("afterActionInfo", (label + " action failed. Reason: " + fromdb(result.jobresult.errortext)));    
			                        }											                    
		                        }
	                        },
	                        error: function(XMLHttpResponse) {
		                        $("body").stopTime(timerKey);		                       		                        
		                        handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText); 		                        
	                        }
                        });
                    },
                    0
                );
            },
            error: function(XMLHttpResponse) {	
		        handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText);    
            }
        });     
    }     
    //Async job (end) *****
    
    //Sync job (begin) *****
    else { 	              
        $.ajax({
            data: createURL(apiCommand),
	        dataType: "json",
	        async: false,
	        success: function(json) {
	            $midmenuItem1.find("#content").removeClass("inaction");
				$midmenuItem1.find("#spinning_wheel").hide();				
				$midmenuItem1.find("#info_icon").removeClass("error").show();
			    $midmenuItem1.data("afterActionInfo", (label + " action succeeded.")); 		
			    hideDetailsTabActionSpinningWheel(id, inProcessText);	
				afterActionSeccessFn(json, $midmenuItem1, id); 		
	        },
            error: function(XMLHttpResponse) {	                
		        handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText);    
            }        
        });
    }
    //Sync job (end) *****
}
function handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText) { 
    $midmenuItem1.find("#content").removeClass("inaction");
	$midmenuItem1.find("#spinning_wheel").hide();	
	$midmenuItem1.find("#info_icon").addClass("error").show();		
	$midmenuItem1.find("#first_row").text("Action failed");		
	hideDetailsTabActionSpinningWheel(id, inProcessText);		
		                        
    var errorMsg = "";
    if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
        var start = XMLHttpResponse.responseText.indexOf("h1") + 3;
        var end = XMLHttpResponse.responseText.indexOf(" 0) 
        $midmenuItem1.find("#second_row").text(fromdb(errorMsg));   
    else
        $midmenuItem1.find("#second_row").html(" ");     
}  
function hideDetailsTabActionSpinningWheel(id, inProcessText) {			                        
    var $detailsTab = $("#right_panel_content #tab_content_details");  
    var jsonObj = $detailsTab.data("jsonObj");
    var $spinningWheel = $detailsTab.find("#spinning_wheel");         
    if(jsonObj != null && ("id" in jsonObj) && jsonObj.id == id && ($spinningWheel.find("#description").text() == inProcessText)) {                                                                           
        $spinningWheel.hide();     
    }
}	
/*
function handleAsyncJobFailInMidMenu(errorMsg, $midmenuItem1) { 
    $midmenuItem1.find("#content").removeClass("inaction");
	$midmenuItem1.find("#spinning_wheel").hide();	
	$midmenuItem1.find("#info_icon").addClass("error").show();		
	$midmenuItem1.find("#first_row").text("Adding failed");			                       
    
    if(errorMsg.length > 0) 
        $midmenuItem1.find("#second_row").text(fromdb(errorMsg));   
    else
        $midmenuItem1.find("#second_row").html(" ");   
}       
*/
/*
If Cancel button in dialog is clicked, action won't preceed. 
i.e. doActionToMidMenu() won't get called => highlight won't be removd from middle menu. 
So, we need to remove highlight here. Otherwise, it won't be consistent of selectedItemsInMidMenu which will be emptied soon.
*/
function removeHighlightInMiddleMenu(selectedItemsInMidMenu) {
    for(var id in selectedItemsInMidMenu) {
        var $midmenuItem1 = $("#midmenuItem_"+id);	
        $midmenuItem1.find("#content").removeClass("selected");
    }
}	     	
function copyActionInfoFromMidMenuToRightPanel($midmenuItem1) {     
    var $afterActionInfoContainer = $("#right_panel_content #after_action_info_container_on_top");       
    
    if($midmenuItem1.find("#info_icon").css("display") != "none") {                
        $afterActionInfoContainer.find("#after_action_info").text($midmenuItem1.data("afterActionInfo"));     
        if($midmenuItem1.find("#info_icon").hasClass("error"))
            $afterActionInfoContainer.addClass("errorbox");
        else
            $afterActionInfoContainer.removeClass("errorbox");                                        
        $afterActionInfoContainer.show(); 
        
        $midmenuItem1.find("#info_icon").hide(); //make info icon disappear after the middle menu item is clicked once                                    
    }  
    else {
        $afterActionInfoContainer.find("#after_action_info").text("");
        $afterActionInfoContainer.hide();                
    }  
    
    var $midMenuSpinningWheel = $midmenuItem1.find("#spinning_wheel");
    if($midMenuSpinningWheel.css("display") != "none") { 
        var $detailsTabSpinningWheel = $("#right_panel_content #tab_content_details").find("#spinning_wheel");
        if($detailsTabSpinningWheel.css("display") == "none") {
            var inProcessText = $midMenuSpinningWheel.data("inProcessText");
            $detailsTabSpinningWheel.find("#description").text(inProcessText);  
            $detailsTabSpinningWheel.show();  
        }
    }
}
                
//***** actions for middle menu (end) **************************************************************************
function createURL(url) {
    return url +"&response=json&sessionkey=" + g_sessionKey;
}
function fromdb(val) {
    return sanitizeXSS(unescape(noNull(val)));
}
function todb(val) {
    return encodeURIComponent(escape(val));
}
var midmenuItemCount = 20;
function setBooleanReadField(value, $field) {
    if(value == "true" || value == true)
        $field.text("Yes").show();
    else if(value == "false" || value == false)
        $field.text("No").show();	
    else
        $field.hide();
}
function setBooleanEditField(value, $field) {
    if(value == "true" || value == true)
        $field.val("true");
    else if(value == "false" || value == false)
        $field.val("false");	
    else
        $field.hide();
}
function clearMiddleMenu() {
    $("#midmenu_container").empty();
    $("#midmenu_action_link").hide();
    clearAddButtonsOnTop();
}
function clearAddButtonsOnTop() {
    $("#midmenu_add_link").unbind("click").hide();    
    $("#midmenu_add2_link").unbind("click").hide();     
    $("#midmenu_add3_link").unbind("click").hide();          
    $("#midmenu_startvm_link").unbind("click").hide();     
    $("#midmenu_stopvm_link").unbind("click").hide(); 
    $("#midmenu_rebootvm_link").unbind("click").hide(); 
    $("#midmenu_destroyvm_link").unbind("click").hide(); 
}
function clearRightPanel() {
    var $actionMenu = $("#right_panel_content #tab_content_details #action_link #action_menu");
    $actionMenu.find("#action_list").empty();
    $actionMenu.find("#action_list").append($("#no_available_actions").clone().show());
     
    $("#right_panel_content #tab_content_details #spinning_wheel").hide();
    $("#right_panel_content #after_action_info_container").hide(); 
}
    
var $selectedLeftMenu;
var $expandedLeftMenu;
function selectLeftMenu($menuToSelect, expandable) {
	if ($selectedLeftMenu == null || ($menuToSelect.attr("id") != $selectedLeftMenu.attr("id"))) {
		if($selectedLeftMenu != null) {
			$selectedLeftMenu.removeClass("selected");  
			$selectedLeftMenu.find(".leftmenu_arrows_firstlevel_open").hide();
		}
		$menuToSelect.addClass("selected");
		$menuToSelect.find(".leftmenu_arrows_firstlevel_open").show();
		$selectedLeftMenu = $menuToSelect; 
		
		// collapse any current expanded menu
		var $menuToExpand;
		if (expandable != undefined && expandable) {
			$menuToExpand = $selectedLeftMenu.siblings(".leftmenu_expandedbox");
		}
		
		if ($expandedLeftMenu != null) {
			$expandedLeftMenu.slideUp(500, function() {
				//if ($menuToExpand != null) $menuToExpand.slideDown(200);
			});
			if ($menuToExpand != null) $menuToExpand.slideDown(500);
			$expandedLeftMenu = null;
		} else if ($menuToExpand != null) {
			$menuToExpand.slideDown(500);
		}
		$expandedLeftMenu = $menuToExpand;
		
		// Close the help link if it's opened
		$("#help_dropdown_dialog").hide();
		$("#help_button").removeClass("selected");
		return true;
	}
	return false;
}
var $selectedSubMenu;
function selectLeftSubMenu($menuToSelect) {
	if ($selectedSubMenu == null || ($menuToSelect.attr("id") != $selectedSubMenu.attr("id"))) {
		if($selectedSubMenu != null)
			$selectedSubMenu.removeClass("selected");  
		$menuToSelect.addClass("selected");
		$selectedSubMenu = $menuToSelect; 
	}
}
var selected_midmenu_id = null; 
function hideMiddleMenu() {
    $("#middle_menu, #search_panel, #middle_menu_pagination").hide();
    $("#midmenu_container").empty();
    $("#right_panel").removeClass("main_contentarea_with_midmenu").addClass("main_contentarea_without_midmenu");            
}
function showMiddleMenu() {
    $("#middle_menu, #search_panel, #middle_menu_pagination").show();
    $("#right_panel").removeClass("main_contentarea_without_midmenu").addClass("main_contentarea_with_midmenu");
}    
function isMiddleMenuShown() {
    if($("#middle_menu").css("display") == "none")
        return false;
    else
        return true;
}
// adding middle menu item ***
function beforeAddingMidMenuItem() {
    var $midmenuItem1 = $("#midmenu_item").clone();
	$midmenuItem1.find("#first_row").text("Adding....");    	
	$midmenuItem1.find("#second_row").html(" ");    			
	$midmenuItem1.find("#content").addClass("inaction"); 
	$midmenuItem1.find("#spinning_wheel").show();
	$midmenuItem1.find("#info_icon").removeClass("error").hide();
	$("#midmenu_container").append($midmenuItem1.show());
	return $midmenuItem1;
}
function afterAddingMidMenuItem($midmenuItem1, isSuccessful, extraMessage) {
    $midmenuItem1.find("#content").removeClass("inaction"); 
	$midmenuItem1.find("#spinning_wheel").hide();	
    if(isSuccessful == true) {
        $midmenuItem1.find("#info_icon").removeClass("error").show();
	    $midmenuItem1.data("afterActionInfo", ("Adding succeeded.")); 
	    
		var $noItemsAvailable = $("#midmenu_container").find("#midmenu_container_no_items_available");
        if($noItemsAvailable.length > 0) {
            $noItemsAvailable.slideUp("slow", function() {
                $(this).remove();
            });
        }		   
	}
	else {	
	    $midmenuItem1.find("#content").addClass("addingfailed");
	        	    
	    $midmenuItem1.find("#icon").attr("src", "images/addingfailed_icon.png");
	    $midmenuItem1.find("#icon_container").show();	    
	    
	    $midmenuItem1.find("#close_icon").show().bind("click", function(event) {	        
	        $midmenuItem1.slideUp("slow", function() {	            
	            $(this).remove();
	        });	        
	        return false;
	    });	  
	    //$midmenuItem1.find("#info_icon").addClass("error").show();	
	    $midmenuItem1.find("#first_row").text("Adding failed");		        
	}
	
	if(extraMessage != null)
	    $midmenuItem1.find("#second_row").text(extraMessage);  
}
function bindClickToMidMenu($midmenuItem1, toRightPanelFn, getMidmenuIdFn) {
    $midmenuItem1.bind("click", function(event){  
        var thisMidmenuItem = $(this);
        
        if(selected_midmenu_id != null && selected_midmenu_id.length > 0)
            $("#"+selected_midmenu_id).find("#content").removeClass("selected");
        selected_midmenu_id = getMidmenuIdFn(thisMidmenuItem.data("jsonObj"));
               
        thisMidmenuItem.find("#content").addClass("selected");  
                                              
        clearRightPanel();        
        toRightPanelFn(thisMidmenuItem);	  
        return false;
    }); 
}
function switchBetweenDifferentTabs(tabArray, tabContentArray, afterSwitchFnArray) {        
    for(var tabIndex=0; tabIndex