/**
 *  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 .
 * 
 */
 
// ***** periodically check non-complete async job (begin)***************************************************************
var g_nonCompleteAsyncJob = {};
function periodicallyCheckNonCompleteAsyncJob() {    
	var timerKey = "checkNonCompleteAsyncJob";		
	$("#dialog_action_complete").everyTime(
	    30000,
	    timerKey,
	    function() {   
	        for(var jobId in g_nonCompleteAsyncJob) {  
	            $.ajax({
	                data: createURL("command=queryAsyncJobResult&jobId="+jobId),
	                dataType: "json",	
	                async: false,
	                success: function(json) {		                                                     							                       
	                    var result = json.queryasyncjobresultresponse;										                   
	                    if (result.jobstatus == 0) {
	                        return; //Job has not completed
	                    } 
	                    else {		                    
	                        var label2 = g_nonCompleteAsyncJob[jobId];
	                        delete g_nonCompleteAsyncJob[jobId];   
	                        if(label2 != null) {
		                        var afterActionInfo;			                          			                                             
		                        if (result.jobstatus == 1) { // Succeeded 	
		                            afterActionInfo = (label2 + " - " + g_dictionary["label.succeeded"]);	                             
		                        } 
		                        else if (result.jobstatus == 2) { // Failed	
		                            afterActionInfo = label2 + " - " + g_dictionary["label.failed"] + " - " + fromdb(result.jobresult.errortext);                                                     
		                        }	                                            
		                        
		                        $("#dialog_action_complete")
		                        .text(afterActionInfo)
		                        .dialog("open");
	                        }
	                    }
	                },
	                error: function(XMLHttpResponse) { 
	                    var label2 = g_nonCompleteAsyncJob[jobId];
	                    delete g_nonCompleteAsyncJob[jobId];   
	                    if(label2 != null) {
		                    var errorMsg = "";
		                    if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {        
		                        errorMsg = parseXMLHttpResponse(XMLHttpResponse);	
		                    }        
		                   
		                    var afterActionInfo;
		                    if(errorMsg.length > 0) 
		                        afterActionInfo = label2 + " - " + g_dictionary["label.failed"] + " - " + errorMsg;	        
		                    else
		                        afterActionInfo = label2 + " - " + g_dictionary["label.failed"];
		                    
		                    $("#dialog_action_complete")
		                    .text(afterActionInfo)
		                    .dialog("open");	
	                    }
	                }
	            });	           
	        }
	    },
	    0
	);		
}
//***** periodically check non-complete async job (end)*****************************************************************
//***** 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());
  
    var label2;
    if(label in dictionary)
        label2 = dictionary[label];
    else
        label2 = label;    
    $listItem.find("#link").text(label2);   
        
    $listItem.data("label", label);	  
    $listItem.data("apiInfo", apiInfo);	 
      
    var id = $midmenuItem1.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 label2;
    if(label in dictionary)
        label2 = dictionary[label];
    else
        label2 = label;    
        
    var apiInfo = $actionLink.data("apiInfo");	
    
    var inProcessText = apiInfo.inProcessText;	
    var inProcessText2;
    if(inProcessText in dictionary)
        inProcessText2 = dictionary[inProcessText];   
    else
        inProcessText2 = inProcessText;    
    	           
    var isAsyncJob = apiInfo.isAsyncJob;
    var asyncJobResponse = apiInfo.asyncJobResponse;	
    var afterActionSeccessFn = apiInfo.afterActionSeccessFn;	    
            
    var $spinningWheel = $thisTab.find("#spinning_wheel");
    $spinningWheel.find("#description").text(inProcessText2);       
    $spinningWheel.show();  
        
    $midmenuItem1.find("#content").removeClass("selected").addClass("inaction");                          
    $midmenuItem1.find("#spinning_wheel").addClass("midmenu_addingloader").show();	
    $midmenuItem1.find("#spinning_wheel").data("inProcessText", inProcessText2);
    $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;		               
                g_nonCompleteAsyncJob[jobId] = label2;   
                $("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);				                       
			                        delete g_nonCompleteAsyncJob[jobId];
			                        $spinningWheel.hide(); 
			                        			                          			                                             
			                        if (result.jobstatus == 1) { // Succeeded 				                            	                            
                                        var afterActionInfo = afterActionSeccessFn(json, $midmenuItem1, id); //afterActionSeccessFn() will update $midmenuItem1.data("jsonObj")
                                        if($("#middle_menu").css("display") != "none") {
                                            if(afterActionInfo == null)
                                                handleMidMenuItemAfterDetailsTabAction($midmenuItem1, true, (label2 + " - " + g_dictionary["label.succeeded"]));                                             
                                            else
                                                handleMidMenuItemAfterDetailsTabAction($midmenuItem1, true, afterActionInfo); 
                                        }
                                        else {
                                            if(afterActionInfo == null)
                                                showAfterActionInfoOnTop(true, (label2 + " - " + g_dictionary["label.succeeded"]));		
                                            else
                                                showAfterActionInfoOnTop(true, afterActionInfo);				              
                                        }
			                        } else if (result.jobstatus == 2) { // Failed	
			                            var errorMsg = label2 + " - " + g_dictionary["label.failed"] + " - " + fromdb(result.jobresult.errortext);
			                            if($("#middle_menu").css("display") != "none")
			                                handleMidMenuItemAfterDetailsTabAction($midmenuItem1, false, errorMsg);		
			                            else
			                                showAfterActionInfoOnTop(false, errorMsg);	                            
			                        }											                    
		                        }
	                        },
	                        error: function(XMLHttpResponse) {	                            
		                        $("body").stopTime(timerKey);	
								handleError(XMLHttpResponse, function() {
									handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label2, $afterActionInfoContainer, $midmenuItem1); 		
								});
	                        }
                        });
                    },
                    0
                );
            },
            error: function(XMLHttpResponse) {
				handleError(XMLHttpResponse, function() {
					handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label2, $afterActionInfoContainer, $midmenuItem1); 
				});
            }
        });     
    }     
    //Async job (end) *****
    
    //Sync job (begin) *****
    else { 	    
        $.ajax({
            data: createURL(apiCommand),
	        dataType: "json",
	        async: false,
	        success: function(json) {	 	                  
	            $spinningWheel.hide(); 	 
	            var afterActionInfo = afterActionSeccessFn(json, $midmenuItem1, id); //afterActionSeccessFn() will update $midmenuItem1.data("jsonObj")   
	            if($("#middle_menu").css("display") != "none") {
	                if(afterActionInfo == null)	                
	                    handleMidMenuItemAfterDetailsTabAction($midmenuItem1, true, (label2 + " - " + g_dictionary["label.succeeded"])); //handleMidMenuItemAfterDetailsTabAction() will used updated $midmenuItem1.data("jsonObj")
	                else
	                    handleMidMenuItemAfterDetailsTabAction($midmenuItem1, true, afterActionInfo);
	            }
	            else {	                
	                if(afterActionInfo == null)
                        showAfterActionInfoOnTop(true, (label2 + " - " + g_dictionary["label.succeeded"]));		
                    else
                        showAfterActionInfoOnTop(true, afterActionInfo);		                
	            }
	        },
            error: function(XMLHttpResponse) {
				handleError(XMLHttpResponse, function() {
					handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label2, $afterActionInfoContainer, $midmenuItem1); 
				});
            }        
        });
    }
    //Sync job (end) *****
}
function handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label, $afterActionInfoContainer, $midmenuItem1) {     
    var errorMsg = "";
    if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {        
        errorMsg = parseXMLHttpResponse(XMLHttpResponse);	
    }        
   
    var afterActionInfo;
    if(errorMsg.length > 0) 
        afterActionInfo = label + " - " + g_dictionary["label.failed"] + " - " + errorMsg;	        
    else
        afterActionInfo = label + " - " + g_dictionary["label.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");	
	
	if($midmenuItem1.attr("id") == selected_midmenu_id) {
	    if($("#midmenu_container").find("#multiple_selection_sub_container").length == 0) //single-selection middle menu
	        $midmenuItem1.click();	    
	    else  //multiple-selection middle menu
	        clickItemInMultipleSelectionMidmenu($midmenuItem1);	           
	}	
}
  	                
//***** 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.data("label", label);	    
    
    var label2;
    if(label in dictionary)
        label2 = dictionary[label];   
    else
        label2 = label;
    $listItem.find("#link").text(label2);    
    
    $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 label2;
    if(label in dictionary)
        label2 = dictionary[label];   
    else
        label2 = label;
        
    var apiInfo = $actionLink.data("apiInfo");	
    
    var inProcessText = apiInfo.inProcessText;
    var inProcessText2;
    if(inProcessText in dictionary)
        inProcessText2 = dictionary[inProcessText];   
    else
        inProcessText2 = inProcessText;
    		           
    var isAsyncJob = apiInfo.isAsyncJob;
    var asyncJobResponse = apiInfo.asyncJobResponse;	
    var afterActionSeccessFn = apiInfo.afterActionSeccessFn;	 
           
    var $spinningWheel = $subgridItem.find("#spinning_wheel");
    $spinningWheel.find("#description").text(inProcessText2);  
    $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;	
                g_nonCompleteAsyncJob[jobId] = label2;   
                $("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);	
			                        delete g_nonCompleteAsyncJob[jobId];
			                        $spinningWheel.hide();      		                       
			                        if (result.jobstatus == 1) { // Succeeded 	
			                            $subgridItem.find("#after_action_info_container").removeClass("error").addClass("success").show();  
			                            var afterActionInfo = afterActionSeccessFn(json, id, $subgridItem);	
			                            if(afterActionInfo == null)	  
			                                $subgridItem.find("#after_action_info").text(label2 + " - " + g_dictionary["label.succeeded"]);
			                            else
			                                $subgridItem.find("#after_action_info").text(afterActionInfo);
			                        } else if (result.jobstatus == 2) { // Failed
			                            //var errorMsg = label2 + " - " + g_dictionary["label.failed"] + " - " + g_dictionary["label.error.code"] + " " + fromdb(result.jobresult.errorcode);
			                            var errorMsg = label2 + " - " + g_dictionary["label.failed"] + " - " + fromdb(result.jobresult.errortext);
			                            $subgridItem.find("#after_action_info").text(errorMsg);
                                        $subgridItem.find("#after_action_info_container").removeClass("success").addClass("error").show();			                          
			                        }											                    
		                        }
	                        },
	                        error: function(XMLHttpResponse) {	                  
		                        $("body").stopTime(timerKey);
								handleError(XMLHttpResponse, function() { 
									handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label2); 
								});
	                        }
                        });
                    },
                    0
                );
            },
            error: function(XMLHttpResponse) {	 
				handleError(XMLHttpResponse, function() {
					handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label2);
				});
            }
        });     
    }     
    //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_container").removeClass("error").addClass("success").show();  
                var afterActionInfo = afterActionSeccessFn(json, id, $subgridItem);    
                if(afterActionInfo == null)	  
                    $subgridItem.find("#after_action_info").text(label2 + " - " + g_dictionary["label.succeeded"]);
                else
                    $subgridItem.find("#after_action_info").text(afterActionInfo);
	        },
            error: function(XMLHttpResponse) {
				handleError(XMLHttpResponse, function() {
					handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label2);    
				});
            }        
        });
    }
    //Sync job (end) *****
}
function handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label) { 
    $subgridItem.find("#spinning_wheel").hide();      
		                        
    var errorMsg = "";
    if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
        errorMsg = parseXMLHttpResponse(XMLHttpResponse);		
    }
    
    var afterActionInfo;
    if(errorMsg.length > 0)  
        afterActionInfo = label + " - " + g_dictionary["label.failed"] + " - " + errorMsg;	
    else     
        afterActionInfo = label + " - " + g_dictionary["label.failed"];
    $subgridItem.find("#after_action_info").text(afterActionInfo); 
        
	$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 doActionToMidMenu(id, apiInfo, apiCommand) {   
    var label = apiInfo.label;	
    var label2;
    if(label in dictionary)
        label2 = dictionary[label];
    else
        label2 = label;   
    
    var inProcessText = apiInfo.inProcessText;   
    var inProcessText2;
    if(inProcessText in dictionary)
        inProcessText2 = dictionary[inProcessText];   
    else
        inProcessText2 = inProcessText;  
        		           
    var isAsyncJob = apiInfo.isAsyncJob;    
    var asyncJobResponse = apiInfo.asyncJobResponse;	
    var afterActionSeccessFn = apiInfo.afterActionSeccessFn;	    
        
    var $midmenuItem1 = $("#midmenuItem_"+id);	
    $midmenuItem1.find("#content").removeClass("selected").addClass("inaction");  //it's being un-selected now because it's in action now
    uncountTopButtonMapFn($midmenuItem1.data("jsonObj"));  //uncount it from topButtonMap 
    $midmenuItem1.find("#spinning_wheel").addClass("midmenu_addingloader").show();	
    $midmenuItem1.find("#spinning_wheel").data("inProcessText", inProcessText2);
    $midmenuItem1.find("#info_icon").hide();		  
	
	var $detailsTab = $("#right_panel_content #tab_content_details");  
    var $spinningWheel = $detailsTab.find("#spinning_wheel");
    $spinningWheel.find("#description").text(inProcessText2);  
    $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;	
                g_nonCompleteAsyncJob[jobId] = label2;   
                $("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);	
			                        delete g_nonCompleteAsyncJob[jobId];
			                        $midmenuItem1.find("#content").removeClass("inaction");
			                        $midmenuItem1.find("#spinning_wheel").hide();			                        
			                        	                        			                       
			                        
			                        if (result.jobstatus == 1) { // Succeeded  
			                            $midmenuItem1.find("#info_icon").removeClass("error").show();			                            		                            
			                            var afterActionInfo = afterActionSeccessFn(json, $midmenuItem1, id);  	
			                            if(afterActionInfo == null)	 
			                                $midmenuItem1.data("afterActionInfo", (label2 + " - " + g_dictionary["label.succeeded"])); 	
			                            else
			                                $midmenuItem1.data("afterActionInfo", afterActionInfo); 	
			                                
			                            hideDetailsTabActionSpinningWheel(id, inProcessText2, $midmenuItem1); //this line will use $midmenuItem1.data("afterActionInfo")	
			                            		                            
			                        } else if (result.jobstatus == 2) { // Failed				                            
			                            //var errorMsg = label2 + " - " + g_dictionary["label.failed"] + " - " + g_dictionary["label.error.code"] + " " + fromdb(result.jobresult.errorcode);
			                            var errorMsg = label2 + " - " + g_dictionary["label.failed"] + " - " + fromdb(result.jobresult.errortext);			                            
			                            handleErrorInMidMenu2(errorMsg, $midmenuItem1, id, inProcessText2); 
			                        }											                    
		                        }
	                        },
	                        error: function(XMLHttpResponse) {
		                        $("body").stopTime(timerKey);		                       		                        
		                        handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText2); 		                        
	                        }
                        });
                    },
                    0
                );
            },
            error: function(XMLHttpResponse) {
				handleError(XMLHttpResponse);
		        handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText2);    
            }
        });     
    }     
    //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(); 			    
			    hideDetailsTabActionSpinningWheel(id, inProcessText2, $midmenuItem1);	
				var afterActionInfo = afterActionSeccessFn(json, $midmenuItem1, id); 
				if(afterActionInfo == null)	   
				    $midmenuItem1.data("afterActionInfo", (label2 + " - " + g_dictionary["label.succeeded"])); 		
				else
				    $midmenuItem1.data("afterActionInfo", afterActionInfo); 					
	        },
            error: function(XMLHttpResponse) {	                
		        handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText2);    
            }        
        });
    }
    //Sync job (end) *****
}
function handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText) {     
    var errorMsg = "";
    if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
        errorMsg = parseXMLHttpResponse(XMLHttpResponse);		
    }
    handleErrorInMidMenu2(errorMsg, $midmenuItem1, id, inProcessText); 
}  
function handleErrorInMidMenu2(errorMsg, $midmenuItem1, id, inProcessText) { 
    $midmenuItem1.find("#content").removeClass("inaction");
	$midmenuItem1.find("#spinning_wheel").hide();	
	$midmenuItem1.find("#info_icon").addClass("error").show();	
	$midmenuItem1.data("afterActionInfo", errorMsg); 
	hideDetailsTabActionSpinningWheel(id, inProcessText, $midmenuItem1);	                    
    
    if(errorMsg.length > 0) 
        $midmenuItem1.find("#second_row").text(fromdb(errorMsg));   
    else
        $midmenuItem1.find("#second_row").html(" ");     
}  
function hideDetailsTabActionSpinningWheel(id, inProcessText, $midmenuItem1) {			                        
    var $detailsTab = $("#right_panel_content #tab_content_details");  
    var jsonObj = $detailsTab.data("jsonObj");
    var $spinningWheel = $detailsTab.find("#spinning_wheel");         
    if((id == $detailsTab.find("#id").text()) && (inProcessText == $spinningWheel.find("#description").text())) {     
        copyActionInfoFromMidMenuToRightPanel($midmenuItem1); 
    }
}	
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");
    var $detailsTabSpinningWheel = $("#right_panel_content #tab_content_details").find("#spinning_wheel");
    if($midMenuSpinningWheel.css("display") != "none") {         
        if($detailsTabSpinningWheel.css("display") == "none") {
            var inProcessText = $midMenuSpinningWheel.data("inProcessText");
            $detailsTabSpinningWheel.find("#description").text(inProcessText);             
            if(inProcessText in dictionary)
                $detailsTabSpinningWheel.find("#description").text(dictionary[inProcessText]);   
            else
                $detailsTabSpinningWheel.find("#description").text(inProcessText);  
            $detailsTabSpinningWheel.show();  
        }
    }
    else {
        $detailsTabSpinningWheel.hide();  
    }
}
                
//***** actions for middle menu (end) **************************************************************************
function createURL(url) {
    return url +"&response=json&sessionkey=" + g_sessionKey;
}
function fromdb(val) {
    return sanitizeXSS(noNull(val));
}
function todb(val) {
    return encodeURIComponent(val);
}
var midmenuItemCount = 20;
function setBooleanReadField(value, $field) {
	if(value == "true" || value == true)
        $field.text("Yes");
    else if(value == "false" || value == false)
        $field.text("No");	
    else
        $field.text("");
	
	/*
    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");	
   	
	/*
    if(value == "true" || value == true)
        $field.val("true");
    else if(value == "false" || value == false)
        $field.val("false");	
    else
        $field.hide();
    */
}
 var LeftMenuAdvancedSearchMap = {
    "leftmenu_instances_my_instances": "advanced_search_popup_nodomainaccount",
    "leftmenu_instances_running_instances": "advanced_search_popup_nostate",
    "leftmenu_instances_stopped_instances": "advanced_search_popup_nostate",
    "leftmenu_instances_destroyed_instances": "advanced_search_popup_nostate"
}			
function getAdvancedSearchPopup($container) {
    var $advancedSearchPopup;    
    if(currentLeftMenuId in LeftMenuAdvancedSearchMap)
        $advancedSearchPopup = $container.find("#"+LeftMenuAdvancedSearchMap[currentLeftMenuId]);
    else
        $advancedSearchPopup = $container.find("#advanced_search_popup");  //default
    return $advancedSearchPopup;
}
function getAdvancedSearchPopupInHiddenContainer() {
    return getAdvancedSearchPopup($("#hidden_container"));
}
function getAdvancedSearchPopupInSearchContainer() {
    return getAdvancedSearchPopup($("#advanced_search_container"));
}
function clearMiddleMenu() {
    $("#midmenu_container").empty();
    $("#midmenu_action_link").hide();       
    $("#basic_search").find("#search_input").val("");
    $("#advanced_search_icon").removeClass("up");    
    
    if($("#hidden_container").length > 0)   
	    getAdvancedSearchPopupInSearchContainer().hide().appendTo($("#hidden_container"));     
	else
	    getAdvancedSearchPopupInSearchContainer().remove();                
    
    $("#midmenu_prevbutton, #midmenu_nextbutton").hide();
    $("#middle_menu_pagination").data("params", null);
}
function clearButtonsOnTop() {
	return $("#top_button_container").empty(); 
}
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(); 
    
    cancelEditMode($("#tab_content_details")); 
}
    
var $selectedLeftMenu;
var $expandedLeftMenu;
function selectLeftMenu($menuToSelect, expandable, afterSelectFn) {
	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, afterSelectFn);
			if ($menuToExpand != null) $menuToExpand.slideDown(500);
			$expandedLeftMenu = null;
		} else if ($menuToExpand != null) {
			$menuToExpand.slideDown(500, afterSelectFn);
		} else if (afterSelectFn != undefined) {
			afterSelectFn();
		}
		$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; 
	}
	// Every time you click on a different menu item, we should stop all previous async job queries
	$("body").stopTime();
}
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().attr("id", "midmenu_item_clone");
	$midmenuItem1.find("#first_row").text(g_dictionary["label.adding.processing"]);    	
	$midmenuItem1.find("#second_row").html(" ");    			
	$midmenuItem1.find("#content").addClass("inaction"); 
	$midmenuItem1.find("#spinning_wheel").show();
	$midmenuItem1.find("#info_icon").removeClass("error").hide();
	$("#midmenu_container").prepend($midmenuItem1.show());
	return $midmenuItem1;
}
function afterAddingMidMenuItem($midmenuItem1, isSuccessful, secondRowText) {
    $midmenuItem1.find("#content").removeClass("inaction"); 
	$midmenuItem1.find("#spinning_wheel").hide();	
    if(isSuccessful == true) {
        $midmenuItem1.find("#info_icon").removeClass("error").show();
	    $midmenuItem1.data("afterActionInfo", g_dictionary["label.adding.succeeded"]); 
	    
	    var $container = $("#midmenu_container");
	    if($("#midmenu_container").find("#multiple_selection_sub_container").length > 0) {
	        $container = $("#midmenu_container").find("#multiple_selection_sub_container");
	        $("#midmenu_container #multiple_selection_sub_container").prepend($midmenuItem1);
	    }
	    	        
		var $noItemsAvailable = $container.find("#midmenu_container_no_items_available");
        if($noItemsAvailable.length > 0) {
            $noItemsAvailable.slideUp("slow", function() {
                $(this).remove();
            });
        }		   
	}
	else {	// Failed		
	    $midmenuItem1.find("#content").addClass("addingfailed");	        	    
	    $midmenuItem1.find("#icon").attr("src", "images/addingfailed_icon.png");
	    $midmenuItem1.find("#icon_container").show();	    
	    $midmenuItem1.find("#first_row").text(g_dictionary["label.adding.failed"]);	
	    
	    if(secondRowText != null)
	        $midmenuItem1.find("#second_row").text(secondRowText.substring(0,midMenuSecondRowLength));	
	    
	    $midmenuItem1.find("#close_icon").show().bind("click", function(event) {	        
	        $midmenuItem1.slideUp("slow", function() {	            
	            $(this).remove();
	        });	        
	        return false;
	    });	    
	}
	
	if(secondRowText != null) {
	    $midmenuItem1.find("#second_row").text(secondRowText.substring(0,midMenuSecondRowLength)); 	 
	}
}
function switchBetweenDifferentTabs(tabArray, tabContentArray, afterSwitchFnArray) {        
    for(var tabIndex=0; tabIndex 0)
            $("#"+selected_midmenu_id).find("#content").removeClass("selected");
        selected_midmenu_id = getMidmenuIdFn($currentMidmenuItem.data("jsonObj"));
               
        $currentMidmenuItem.find("#content").addClass("selected");  
                                              
        clearRightPanel();        
        toRightPanelFn($currentMidmenuItem);	  
        return false;
    }); 
}
function clickItemInMultipleSelectionMidmenu($midmenuItem1) {
    $midmenuItem1.find("#content").addClass("selected");  //"selected" is a CSS class in cloudstack-defined CSS
    if($midmenuItem1.hasClass("ui-selected") == false)  //"ui-selected" is a CSS class in JQuery selectable widget 
        $midmenuItem1.addClass("ui-selected");                
    
    clearRightPanel();
    var toRightPanelFn = $midmenuItem1.data("toRightPanelFn");
    toRightPanelFn($midmenuItem1);	
    
    var jsonObj = $midmenuItem1.data("jsonObj");    	
    selectedItemsInMidMenu[jsonObj.id] = $midmenuItem1;  
    countTopButtonMapFn(jsonObj);      
           
    selected_midmenu_id = $midmenuItem1.attr("id");
    $currentMidmenuItem = $midmenuItem1;
}
function unclickItemInMultipleSelectionMidmenu($midmenuItem1, id) {    
    delete selectedItemsInMidMenu[id];
    $midmenuItem1.find("#content").removeClass("selected"); 
    var jsonObj = $midmenuItem1.data("jsonObj");  
    uncountTopButtonMapFn(jsonObj);   
}
var countTopButtonMapFn = function() {};
var uncountTopButtonMapFn = function() {};
var grayoutTopButtonsFn = function() {};
var resetTopButtonMapFn = function() {};
function createMultipleSelectionSubContainer() {      
    var $multipleSelectionSubContainer = $(""); 
    $("#midmenu_container").empty().append($multipleSelectionSubContainer);    
    selectedItemsInMidMenu = {};  
    resetTopButtonMapFn();
    
    $multipleSelectionSubContainer.selectable({
        selecting: function(event, ui) {	 	                               
            if(ui.selecting.id.indexOf("midmenuItem") != -1) {                     
                var $midmenuItem1 = $("#"+ui.selecting.id);
                if($midmenuItem1.find("#content").hasClass("inaction") == false) { //only items not in action are allowed to be selected
                    clickItemInMultipleSelectionMidmenu($midmenuItem1);                
                }  
                else { //The item is in action. It can't be selected for another action, but its content still shows in right panel.                           
                    clearRightPanel();      
                    var toRightPanelFn = $midmenuItem1.data("toRightPanelFn");
                    toRightPanelFn($midmenuItem1);	   
                }       
            }                                             
        },
        unselecting: function(event, ui) {
            if(ui.unselecting.id.indexOf("midmenuItem") != -1) {                     
                var $midmenuItem1 = $("#"+ui.unselecting.id);
                var id = $midmenuItem1.data("jsonObj").id;
                if(id in selectedItemsInMidMenu) {                    
                    unclickItemInMultipleSelectionMidmenu($midmenuItem1, id);                   
                }
            }             
        },
        start: function(event, ui) {                 
              
        },
        stop: function(event, ui) {            
            grayoutTopButtonsFn();                         
        }
    }); 
    
    return $multipleSelectionSubContainer;   
}
function getMidmenuId(jsonObj) {
    return "midmenuItem_" + jsonObj.id; 
}
var autoCompleteDomains = [];
function applyAutoCompleteToDomainField($field) {  
    $field.autocomplete({
		source: function(request, response) {			
			$.ajax({
			    data: createURL("command=listDomains&keyword=" + request.term),				
				dataType: "json",
				async: false,
				success: function(json) {					   
					autoCompleteDomains = json.listdomainsresponse.domain;					
					var array1 = [];				
					if(autoCompleteDomains != null && autoCompleteDomains.length > 0) {									
						for(var i=0; i < autoCompleteDomains.length; i++) 					        
							array1.push(fromdb(autoCompleteDomains[i].name));		   					   			    
					}					
					response(array1);
				}
			});		
		}
	}); 
}
function applyAutoCompleteToDomainChildrenField($field, parentDomainId) {  
    $field.autocomplete({
		source: function(request, response) {			
			var array1 = [];
			$.ajax({
			    data: createURL("command=listDomainChildren&id="+parentDomainId+"&isrecursive=true&keyword=" + request.term),				
				dataType: "json",
				async: false,
				success: function(json) {	
					autoCompleteDomains = json.listdomainchildrenresponse.domain;								
					if(autoCompleteDomains != null && autoCompleteDomains.length > 0) {									
						for(var i=0; i < autoCompleteDomains.length; i++) 					        
							array1.push(fromdb(autoCompleteDomains[i].name));		   					   			    
					}								
				}
			});	
			$.ajax({
			    data: createURL("command=listDomains&id="+parentDomainId+"&keyword=" + request.term),				
				dataType: "json",
				async: false,
				success: function(json) {	
					var items = json.listdomainsresponse.domain;									
					if(items != null && items.length > 0) {	
					    autoCompleteDomains.push(items[0]);					
					    array1.push(fromdb(items[0].name));										   			    
					}	
				}
			});	
			response(array1);	
		}
	}); 
}
//var lastSearchType;
var currentCommandString;
var searchParams;
function listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, jsonResponse2, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, page) {                
	$("#midmenu_container").hide();
	$("#midmenu_spinning_wheel").show();
	
	var params = {
        "commandString": commandString,
        "getSearchParamsFn": getSearchParamsFn,
        "jsonResponse1": jsonResponse1,
        "jsonResponse2": jsonResponse2,
        "toMidmenuFn": toMidmenuFn,
        "toRightPanelFn": toRightPanelFn,
        "getMidmenuIdFn": getMidmenuIdFn,
        "isMultipleSelectionInMidMenu": isMultipleSelectionInMidMenu,        
        "page": page
    }                    
    $("#middle_menu_pagination").data("params", params);
	
	(page > 1)? $("#midmenu_prevbutton").show(): $("#midmenu_prevbutton").hide();
	
	searchParams = getSearchParamsFn();
	
    var count = 0;    
    $.ajax({
        cache: false,
        data: createURL("command="+commandString+searchParams+"&pagesize="+midmenuItemCount+"&page="+page),
        dataType: "json",
        async: false,
        success: function(json) {  
			var $container;			
			if(isMultipleSelectionInMidMenu != true)
			    $container = $("#midmenu_container").empty(); 
			else
				$container = createMultipleSelectionSubContainer();
		                                     
            var items = json[jsonResponse1][jsonResponse2];      
            if(items != null && items.length > 0) {
                (items.length == midmenuItemCount)? $("#midmenu_nextbutton").show(): $("#midmenu_nextbutton").hide();
                for(var i=0; i 0) 	    
	    $infoContainer.find("#info").text(errorMsg);	
	else 
	    $infoContainer.find("#info").text(g_dictionary["label.failed"]);	
	
	$thisDialog.find("#spinning_wheel").hide();
	$infoContainer.show();
}
function parseXMLHttpResponse(XMLHttpResponse) {	
	if(isValidJsonString(XMLHttpResponse.responseText) == false) {
	    return "";
	}
	
	//var json = jQuery.parseJSON(XMLHttpResponse.responseText);	
	var json = JSON.parse(XMLHttpResponse.responseText);
	if (json != null) {
		var property;
		for(property in json) {}
		var errorObj = json[property];
		return fromdb(errorObj.errortext);	
	} else {
		return "";
	}
}
function isValidJsonString(str) {
    try {         
        JSON.parse(str);     
    } 
    catch (e) {         
        return false;     
    }     
    return true;
}
function showLeftNavigationBasedOnRole() {
    if (isAdmin()) {				    
	    $("#leftmenu_domain, #leftmenu_account, #leftmenu_configuration, #leftmenu_system, #leftmenu_alert_container, #launch_test").show();					
	} 
	else if(isDomainAdmin()){				    
	    $("#leftmenu_domain, #leftmenu_account").show();					
	}
	else{  //isUser() == true					
	}
			
	if(getDirectAttachSecurityGroupsEnabled() == "true") {
	    $("#leftmenu_security_group_container").show();
	}		
	else {
	    $("#leftmenu_security_group_container").hide();
	}
	
	if (isAdmin() || (getUserPublicTemplateEnabled() == "true")) {
	    $("#leftmenu_submenu_community_template_container, #leftmenu_submenu_community_iso_container").show();
	}
	else {
	    $("#leftmenu_submenu_community_template_container, #leftmenu_submenu_community_iso_container").hide();
	}
}
   
function drawBarChart($capacity, percentused) { //percentused == "0.01%" (having % inside)    
    if(percentused == null) {
        $capacity.find("#percentused").text("");
        $capacity.find("#bar_chart").removeClass().addClass("db_barbox low").css("width", 0); 
        return;
    }
    $capacity.find("#percentused").text(percentused);
    
    var percentusedFloat; 
    if(percentused.indexOf("%") != -1) {
        percentused = percentused.replace("%", "");
        percentusedFloat = parseFloat(percentused);
        percentusedFloat = percentusedFloat * 0.01;   //because % is removed.  percentusedFloat == 0.0001
    }
    else {
        percentusedFloat = parseFloat(percentused);
    }
      
    if (percentusedFloat <= 0.6)
        $capacity.find("#bar_chart").removeClass().addClass("db_barbox low").css("width", percentused); 
    else if (percentusedFloat > 0.6 && percentusedFloat <= 0.8 )
        $capacity.find("#bar_chart").removeClass().addClass("db_barbox mid").css("width", percentused);
    else if (percentusedFloat > 0.8 )
        $capacity.find("#bar_chart").removeClass().addClass("db_barbox high").css("width", percentused);
}   
 
var $readonlyFields, $editFields;
function cancelEditMode($tab) {
    if($editFields != null)
        $editFields.hide();
    if($readonlyFields != null)
        $readonlyFields.show();   
    $tab.find("#save_button, #cancel_button").hide();     
}
function showAfterActionInfoOnTop(isSuccessful, afterActionInfo) {
    var $afterActionInfoContainer = $("#right_panel_content #after_action_info_container_on_top");       
    
    if(isSuccessful) 
        $afterActionInfoContainer.removeClass("errorbox");       
    else
        $afterActionInfoContainer.addClass("errorbox");
        
    $afterActionInfoContainer.find("#after_action_info").text(afterActionInfo);  
    
    $afterActionInfoContainer.show();    
}
function ipFindNetworkServiceByName(pName, networkObj) {    
    if(networkObj == null)
        return null;
    if(networkObj.service != null) {
	    for(var i=0; i 0) {
	    var disconnected = new Date();
	    disconnected.setISO8601(dateValue);	
	    var showDate;			
	    if(g_timezoneoffset != null) 
	        showDate = disconnected.getTimePlusTimezoneOffset(g_timezoneoffset);
	    else 
	        showDate = disconnected.format("m/d/Y H:i:s");
	    if(htmlMarkup == null)
	        dateField.text(showDate);
	    else
	        dateField.html(htmlMarkup + showDate);
    }
}
function initResizable(resizeElement, alsoResizeElement) {         
    var alsoResizeUi_originalHeight;
    $("#"+resizeElement).resizable({
        handles: 'e, w',
        autoHide: true,            
        //containment: ".grid_header"  , 
        alsoResize: "."+alsoResizeElement
    }); 
}
    
var sortBy = "";
var parseFunction = function() {}
var sortingOrder = "asc";
function sortArrayAlphabetically(a, b) {      
    if(a[sortBy] == null || b[sortBy] == null)
        return 0;
      
    var A = a[sortBy].toLowerCase();
    var B = b[sortBy].toLowerCase();
    
    if(sortingOrder == "asc") {
        if (A < B) 
            return -1;
        if (A > B) 
            return 1;
    } else {
        if (A < B) 
            return 1;
        if (A > B) 
            return -1;
    }
    return 0;
}	    
function sortArrayAlphabeticallyParse(a, b) {     
    if(a[sortBy] == null || b[sortBy] == null)
        return 0;
             
    var A = parseFunction(a[sortBy]).toLowerCase();
    var B = parseFunction(b[sortBy]).toLowerCase();
    
    if(sortingOrder == "asc") {
        if (A < B) 
            return -1;
        if (A > B) 
            return 1;
    } else {
        if (A < B) 
            return 1;
        if (A > B) 
            return -1;
    }
    return 0;
}	 
function sortArrayNumerically(a, b) {      
    if(a[sortBy] == null || b[sortBy] == null)
        return 0;
      
    var A = parseInt(a[sortBy]);
    var B = parseInt(b[sortBy]);
    
    if(sortingOrder == "asc") {
        if (A < B) 
            return -1;
        if (A > B) 
            return 1;
    } else {
        if (A < B) 
            return 1;
        if (A > B) 
            return -1;
    }
    return 0;
}
function sortArrayNumericallyParse(a, b) {     
    if(a[sortBy] == null || b[sortBy] == null)
        return 0;
     
    var A = parseFunction(parseInt(a[sortBy]));
    var B = parseFunction(parseInt(b[sortBy]));
        
    if(sortingOrder == "asc") {
        if (A < B) 
            return -1;
        if (A > B) 
            return 1;
    } else {
        if (A < B) 
            return 1;
        if (A > B) 
            return -1;
    }
    return 0;
}   
function sortArrayByDate(a, b) {    
    if(a[sortBy] == null || b[sortBy] == null)
        return 0;
        
    var A = convertMilliseconds(a[sortBy]);
    var B = convertMilliseconds(b[sortBy]);
    
    if(sortingOrder == "asc") {
        if (A < B) 
            return -1;
        if (A > B) 
            return 1;
    } else {
        if (A < B) 
            return 1;
        if (A > B) 
            return -1;
    }
    return 0;
}	
function convertMilliseconds(string) {
    if (string != null && string.length > 0) {
	    var date1 = new Date();
	    date1.setISO8601(string);	
	    return date1.getTime();	    
    } else {
        return null;
    }
}    
// Validation functions
function showError(isValid, field, errMsgField, errMsg) {    
	if(isValid) {
	    errMsgField.text("").hide();
	    field.addClass("text").removeClass("error_text");
	}
	else {
	    errMsgField.text(errMsg).show();
	    field.removeClass("text").addClass("error_text");	
	}
}
function showError2(isValid, field, errMsgField, errMsg, appendErrMsg) {    
	if(isValid) {
	    errMsgField.text("").hide();
	    field.addClass("text2").removeClass("error_text2");
	}
	else {
	    if(appendErrMsg) //append text
	        errMsgField.text(errMsgField.text()+errMsg).show();  
	    else  //reset text
	        errMsgField.text(errMsg).show();  
	    field.removeClass("text2").addClass("error_text2");	
	}
}
function showErrorInDropdown(isValid, field, errMsgField, errMsg, appendErrMsg) {    
	if(isValid) {
	    errMsgField.text("").hide();
	    field.addClass("select").removeClass("error_select");
	}
	else {
	    if(appendErrMsg) //append text
	        errMsgField.text(errMsgField.text()+errMsg).show();  
	    else  //reset text
	        errMsgField.text(errMsg).show();  
	    field.removeClass("select").addClass("error_select");	
	}
}
function validateDropDownBox(label, field, errMsgField, appendErrMsg) {  
    var isValid = true;
    var errMsg = "";   
    var value = field.val();     
	if (value == null || value.length == 0) {	   
	    //errMsg = label + " is a required value. ";	  
	    errMsg = g_dictionary["label.required"]; 
		isValid = false;		
	} 		
	showErrorInDropdown(isValid, field, errMsgField, errMsg, appendErrMsg);	
	return isValid;
}
function validateInteger(label, field, errMsgField, min, max, isOptional) {
    return validateNumber(label, field, errMsgField, min, max, isOptional, "integer");    
}
function validateNumber(label, field, errMsgField, min, max, isOptional, type) {
    var isValid = true;
    var errMsg = "";
    var value = field.val();  
         
	if (value != null && value.length != 0) {
		if(isNaN(value)) {
			//errMsg = label + " must be a number";
			errMsg = g_dictionary["label.invalid.number"]; 
			isValid = false;
		} 
		else {
		    if(type == "integer" && (value % 1) != 0) {
		        //errMsg = label + " must be an integer";
		        errMsg = g_dictionary["label.invalid.integer"]; 
				isValid = false;
		    }
		
			if (min != null && value < min) {
				//errMsg = label + " must be a value greater than or equal to " + min;
				errMsg = g_dictionary["label.minimum"] + ": " + min; 
				isValid = false;
			}
			if (max != null && value > max) {
				//errMsg = label + " must be a value less than or equal to " + max;
				errMsg = g_dictionary["label.maximum"] + ": " + max; 
				isValid = false;
			}
		}
	}
	else if(isOptional!=true){  //required field
		//errMsg = label + " is a required value. ";
		errMsg = g_dictionary["label.required"]; 
		isValid = false;
	}
	showError(isValid, field, errMsgField, errMsg);	
	return isValid;
}
function validateString(label, field, errMsgField, isOptional, maxLength) {  
    var isValid = true;
    var errMsg = "";
    var value = field.val();     
	if (isOptional!=true && (value == null || value.length == 0)) {	 //required field   
	    //errMsg = label + " is a required value. ";	  
	    errMsg = g_dictionary["label.required"];  
		isValid = false;		
	} 	
	else if (value!=null && value.length >= maxLength) {	    
	    //errMsg = label + " must be less than " + maxLength + " characters";	 
	    errMsg = g_dictionary["label.maximum"] + ": " + max + " " + g_dictionary["label.character"];   
		isValid = false;		
	} 	
	else if(value!=null && value.indexOf('"')!=-1) {
	    //errMsg = "Double quotes are not allowed";	
	    errMsg = g_dictionary["label.double.quotes.are.not.allowed"];   
		isValid = false;	
	}
	showError(isValid, field, errMsgField, errMsg);	
	return isValid;
}
function validateEmail(label, field, errMsgField, isOptional) {  
    if(validateString(label, field, errMsgField, isOptional) == false)
        return;
    var isValid = true;
    var errMsg = "";
    var value = field.val();     		    
    if(value!=null && value.length>0) {
        myregexp = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;   
        var isMatch = myregexp.test(value);
        if(!isMatch) {            
            errMsg = g_dictionary["label.example"] + ": xxxxxxx@hotmail.com";
	        isValid = false;		
	    }
	}	 	
	showError(isValid, field, errMsgField, errMsg);	
	return isValid;
}
function validateIp(label, field, errMsgField, isOptional) {  
    if(validateString(label, field, errMsgField, isOptional) == false)
        return;
    var isValid = true;
    var errMsg = "";
    var value = field.val();     		    
    if(value!=null && value.length>0) {
        myregexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;	   
        var isMatch = myregexp.test(value);
        if(!isMatch) {
            //errMsg = label + " should be like 75.52.126.11";	   
            errMsg = g_dictionary["label.example"] + ": 75.52.126.11";
	        isValid = false;		
	    }
	}	 	
	showError(isValid, field, errMsgField, errMsg);	
	return isValid;
}
function validateCIDR(label, field, errMsgField, isOptional) {  
    if(validateString(label, field, errMsgField, isOptional) == false)
        return;        
    var isValid = true;
    var errMsg = "";
    var value = field.val();     
    if(value!=null && value.length>0) {
        myregexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$/;	   
        var isMatch = myregexp.test(value);
        if(!isMatch) {
            //errMsg = label + " should be like 10.1.1.0/24";	   
            errMsg = g_dictionary["label.example"] + ": 10.1.1.0/24";
	        isValid = false;		
	    }
	}	
	showError(isValid, field, errMsgField, errMsg);	
	return isValid;
}
function validateCIDRList(label, field, errMsgField, isOptional) {  	
    if(validateString(label, field, errMsgField, isOptional) == false)
        return;        
    var isValid = true;
    var errMsg = "";
    var cidrList = field.val();    
        
    var array1 = cidrList.split(",");
    for(var i=0; i < array1.length; i++) {
        var value = array1[i];   
        if(value!=null && value.length>0) {
            myregexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$/;	   
            var isMatch = myregexp.test(value);
            if(!isMatch) { 
    	        isValid = false;		
    	    }
    	}	
    }       
    if(isValid == false)
    	errMsg = g_dictionary["label.example"] + ": 10.1.1.0/24,10.1.1.1/24,10.1.1.2/24";
    
	showError(isValid, field, errMsgField, errMsg);	
	return isValid;
}
/*
function validateFilename(label, field, errMsgField, isOptional) {  
    if(validateString(label, field, errMsgField, isOptional) == false)
        return;        
    var isValid = true;
    var errMsg = "";
    var value = field.val();     
    if(value!=null && value.length>0) {
        myregexp = /[^a-zA-Z0-9_\-\.]/;	   
        var isMatch = myregexp.test(value);
        if(isMatch) {
            errMsg = "Only alphanumeric, dot, dashes and underscore characters allowed";	   
	        isValid = false;		
	    }
	}	
	showError(isValid, field, errMsgField, errMsg);	
	return isValid;
}
*/
function validatePath(label, field, errMsgField, isOptional) {  
    if(validateString(label, field, errMsgField, isOptional) == false)
        return;
    var isValid = true;
    var errMsg = "";
    var value = field.val();    
    if(value!=null && value.length>0) {
        myregexp = /^\//;	   
        var isMatch = myregexp.test(value);
        if(!isMatch) {
            errMsg = label + " should be like /aaa/bbb/ccc";	   
	        isValid = false;		
	    }
	}	 	
	showError(isValid, field, errMsgField, errMsg);	
	return isValid;
}
function cleanErrMsg(field, errMsgField) {
    showError(true, field, errMsgField);
}	
// setter 
function setGridRowsTotal(field, gridRowsTotal) {   
    if(gridRowsTotal==null) {
        field.text("");
        return;
    }
 
    if(gridRowsTotal==1)
	    field.text(gridRowsTotal + " item");
	else
	    field.text(gridRowsTotal + " items");
} 
function changeGridRowsTotal(field, difference) {   
    var t = field.text();
    var oldTotal = 0;
    if(t.length>0 && t.indexOf(" item")!=-1) {      
        var s = t.substring(0, t.indexOf(" item"));
        if(!isNaN(s))
            oldTotal = parseInt(s);
    }
    var newTotal = oldTotal + difference;
    setGridRowsTotal(field, newTotal);
}
// others
function trim(val) {
    if(val == null)
        return null;
    return val.replace(/^\s*/, "").replace(/\s*$/, "");
}
function noNull(val) {
    if(val == null)
        return "";
    else
        return val;
}
// Prevent cross-site-script(XSS) attack. 
// used right before adding user input to the DOM tree. e.g. DOM_element.html(fromdb(user_input));  
function sanitizeXSS(val) {     
    if(val == null || typeof(val) != "string")
        return val; 
    val = val.replace(//g, ">");  //replace > whose unicode is \u003e  
    return unescape(val);
}
var midMenuFirstRowLength = 26;
var midMenuSecondRowLength = 33;
function getVmName(p_vmName, p_vmDisplayname) {
    if(p_vmDisplayname == null)
        return fromdb(p_vmName);
    
    var vmName = null;	
	if (p_vmDisplayname != p_vmName) {
		vmName = fromdb(p_vmName) + " (" + fromdb(p_vmDisplayname) + ")";
	} else {
		vmName = fromdb(p_vmName);
	}		
	return vmName;
}
// FUNCTION: Handles AJAX error callbacks.  You can pass in an optional function to 
// handle errors that are not already handled by this method.  
function handleError(XMLHttpResponse, handleErrorCallback) {
	// User Not authenticated
	if (XMLHttpResponse.status == ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED) {
		$("#dialog_session_expired").dialog("open");
	} 	
	else if (XMLHttpResponse.status == ERROR_INTERNET_NAME_NOT_RESOLVED) {
		$("#dialog_error_internet_not_resolved").dialog("open");
	} 
	else if (XMLHttpResponse.status == ERROR_INTERNET_CANNOT_CONNECT) {
		$("#dialog_error_management_server_not_accessible").dialog("open");
	} 
	else if (XMLHttpResponse.status == ERROR_VMOPS_ACCOUNT_ERROR && handleErrorCallback != undefined) {
		handleErrorCallback();
	} 
	else if (handleErrorCallback != undefined) {
		handleErrorCallback();
	}
	else {	  
		var errorMsg = parseXMLHttpResponse(XMLHttpResponse);				
		$("#dialog_error").text(fromdb(errorMsg)).dialog("open");
	}
}
// FUNCTION: Adds a Dialog to the list of active Dialogs so that
// when you shift from one tab to another, we clean out the dialogs
var activeDialogs = new Array();
function activateDialog(dialog, addToActive) {
	if (addToActive == undefined || addToActive) {
		activeDialogs[activeDialogs.length] = dialog;
	}
	
	//bind Enter-Key-pressing event handler to the dialog 	
	dialog.keypress(function(event) {
	    if(event.keyCode == keycode_Enter) {	        
	        $('[aria-labelledby$='+dialog.attr("id")+']').find(":button:first").click();	
	        return false; //event.preventDefault() + event.stopPropagation()
	    }    
	});
}
function removeDialogs() {
	for (var i = 0; i < activeDialogs.length; i++) {
		activeDialogs[i].remove();
	}
	activeDialogs = new Array();
}
function convertBytes(bytes) {
	if (bytes < 1024 * 1024) {
		return (bytes / 1024).toFixed(2) + " KB";
	} else if (bytes < 1024 * 1024 * 1024) {
		return (bytes / 1024 / 1024).toFixed(2) + " MB";
	} else if (bytes < 1024 * 1024 * 1024 * 1024) {
		return (bytes / 1024 / 1024 / 1024).toFixed(2) + " GB";
	} else {
		return (bytes / 1024 / 1024 / 1024 / 1024).toFixed(2) + " TB";
	}
}
function convertHz(hz) {
    if (hz == null)
        return "";
	if (hz < 1000) {
		return hz + " MHZ";
	} else {
		return (hz / 1000).toFixed(2) + " GHZ";
	} 
}
function toDayOfMonthDesp(dayOfMonth) {
    return "Day "+dayOfMonth +" of Month";
}
function toDayOfWeekDesp(dayOfWeek) {
    if (dayOfWeek == "1")
        return "Sunday";
    else if (dayOfWeek == "2")
        return "Monday";
    else if (dayOfWeek == "3")
        return "Tuesday";
    else if (dayOfWeek == "4")
        return "Wednesday";
    else if (dayOfWeek == "5")
        return "Thursday"
    else if (dayOfWeek == "6")
        return "Friday";
    else if (dayOfWeek == "7")
        return "Saturday";    
}
function toBooleanText(booleanValue) {
    if(booleanValue == true || booleanValue == "true")
        return "Yes";
    else if(booleanValue == false ||booleanValue == "false")
        return "No";
}
function toBooleanValue(booleanText) {
    if(booleanText == "Yes")
        return "true";
    else if(booleanText == "No")
        return "false";
}
function toNetworkType(usevirtualnetwork) {
    if(usevirtualnetwork == true || usevirtualnetwork == "true")
        return "Public";
    else
        return "Direct";
}
var roleTypeUser = "0";
var roleTypeAdmin = "1";
var roleTypeDomainAdmin = "2";
function toRole(type) {
	if (type == roleTypeUser) {
		return "User";
	} else if (type == roleTypeAdmin) {
		return "Admin";
	} else if (type == roleTypeDomainAdmin) {
		return "Domain-Admin";
	}
}
function toAlertType(alertCode) {
	switch (alertCode) {
		case 0 : return "Capacity Threshold - Memory";
		case 1 : return "Capacity Threshold - CPU";
		case 2 : return "Capacity Threshold - Storage Used";
		case 3 : return "Capacity Threshold - Storage Allocated";
		case 4 : return "Capacity Threshold - Public IP";
		case 5 : return "Capacity Threshold - Private IP";
		case 6 : return "Monitoring - Host";
		case 7 : return "Monitoring - VM";
		case 8 : return "Monitoring - Domain Router";
		case 9 : return "Monitoring - Console Proxy";
		case 10 : return "Monitoring - Routing Host";
		case 11 : return "Monitoring - Storage";
		case 12 : return "Monitoring - Usage Server";
		case 13 : return "Monitoring - Management Server";
		case 14 : return "Migration - Domain Router";
		case 15 : return "Migration - Console Proxy";
		case 16 : return "Migration - User VM";
		case 17 : return "VLAN";
		case 18 : return "Monitoring - Secondary Storage VM";
	}
}
// Timezones
var timezones = new Object();
timezones['Etc/GMT+12']='[UTC-12:00] GMT-12:00';
timezones['Etc/GMT+11']='[UTC-11:00] GMT-11:00';
timezones['Pacific/Samoa']='[UTC-11:00] Samoa Standard Time';
timezones['Pacific/Honolulu']='[UTC-10:00] Hawaii Standard Time';
timezones['US/Alaska']='[UTC-09:00] Alaska Standard Time';
timezones['America/Los_Angeles']='[UTC-08:00] Pacific Standard Time';
timezones['Mexico/BajaNorte']='[UTC-08:00] Baja California';
timezones['US/Arizona']='[UTC-07:00] Arizona';
timezones['US/Mountain']='[UTC-07:00] Mountain Standard Time';
timezones['America/Chihuahua']='[UTC-07:00] Chihuahua, La Paz';
timezones['America/Chicago']='[UTC-06:00] Central Standard Time';
timezones['America/Costa_Rica']='[UTC-06:00] Central America';
timezones['America/Mexico_City']='[UTC-06:00] Mexico City, Monterrey';
timezones['Canada/Saskatchewan']='[UTC-06:00] Saskatchewan';
timezones['America/Bogota']='[UTC-05:00] Bogota, Lima';
timezones['America/New_York']='[UTC-05:00] Eastern Standard Time';
timezones['America/Caracas']='[UTC-04:00] Venezuela Time';
timezones['America/Asuncion']='[UTC-04:00] Paraguay Time';
timezones['America/Cuiaba']='[UTC-04:00] Amazon Time';
timezones['America/Halifax']='[UTC-04:00] Atlantic Standard Time';
timezones['America/La_Paz']='[UTC-04:00] Bolivia Time';
timezones['America/Santiago']='[UTC-04:00] Chile Time';
timezones['America/St_Johns']='[UTC-03:30] Newfoundland Standard Time';
timezones['America/Araguaina']='[UTC-03:00] Brasilia Time';
timezones['America/Argentina/Buenos_Aires']='[UTC-03:00] Argentine Time';
timezones['America/Cayenne']='[UTC-03:00] French Guiana Time';
timezones['America/Godthab']='[UTC-03:00] Greenland Time';
timezones['America/Montevideo']='[UTC-03:00] Uruguay Time]';
timezones['Etc/GMT+2']='[UTC-02:00] GMT-02:00';
timezones['Atlantic/Azores']='[UTC-01:00] Azores Time';
timezones['Atlantic/Cape_Verde']='[UTC-01:00] Cape Verde Time';
timezones['Africa/Casablanca']='[UTC] Casablanca';
timezones['Etc/UTC']='[UTC] Coordinated Universal Time';
timezones['Atlantic/Reykjavik']='[UTC] Reykjavik';
timezones['Europe/London']='[UTC] Western European Time';
timezones['CET']='[UTC+01:00] Central European Time';
timezones['Europe/Bucharest']='[UTC+02:00] Eastern European Time';
timezones['Africa/Johannesburg']='[UTC+02:00] South Africa Standard Time';
timezones['Asia/Beirut']='[UTC+02:00] Beirut';
timezones['Africa/Cairo']='[UTC+02:00] Cairo';
timezones['Asia/Jerusalem']='[UTC+02:00] Israel Standard Time';
timezones['Europe/Minsk']='[UTC+02:00] Minsk';
timezones['Europe/Moscow']='[UTC+03:00] Moscow Standard Time';
timezones['Africa/Nairobi']='[UTC+03:00] Eastern African Time';
timezones['Asia/Karachi']='[UTC+05:00] Pakistan Time';
timezones['Asia/Kolkata']='[UTC+05:30] India Standard Time';
timezones['Asia/Bangkok']='[UTC+05:30] Indochina Time';
timezones['Asia/Shanghai']='[UTC+08:00] China Standard Time';
timezones['Asia/Kuala_Lumpur']='[UTC+08:00] Malaysia Time';
timezones['Australia/Perth']='[UTC+08:00] Western Standard Time (Australia)';
timezones['Asia/Taipei']='[UTC+08:00] Taiwan';
timezones['Asia/Tokyo']='[UTC+09:00] Japan Standard Time';
timezones['Asia/Seoul']='[UTC+09:00] Korea Standard Time';
timezones['Australia/Adelaide']='[UTC+09:30] Central Standard Time (South Australia)';
timezones['Australia/Darwin']='[UTC+09:30] Central Standard Time (Northern Territory)';
timezones['Australia/Brisbane']='[UTC+10:00] Eastern Standard Time (Queensland)';
timezones['Australia/Canberra']='[UTC+10:00] Eastern Standard Time (New South Wales)';
timezones['Pacific/Guam']='[UTC+10:00] Chamorro Standard Time';
timezones['Pacific/Auckland']='[UTC+12:00] New Zealand Standard Time';