mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			2247 lines
		
	
	
		
			86 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			2247 lines
		
	
	
		
			86 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  /**
 | |
|  *  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 <http://www.gnu.org/licenses/>.
 | |
|  * 
 | |
|  */
 | |
|  
 | |
| // ***** 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<tabArray.length; tabIndex++) {  
 | |
|         switchToTab(tabIndex, tabArray, tabContentArray, afterSwitchFnArray);
 | |
|     }
 | |
| }
 | |
| 
 | |
| function switchToTab(tabIndex, tabArray, tabContentArray, afterSwitchFnArray) {
 | |
|   tabArray[tabIndex].bind("click", function(event){               
 | |
|         tabArray[tabIndex].removeClass("off").addClass("on"); //current tab turns on
 | |
|         for(var k=0; k<tabArray.length; k++) { 
 | |
|             if(k != tabIndex)
 | |
|                 tabArray[k].removeClass("on").addClass("off");  //other tabs turns off
 | |
|         }                    
 | |
|                         
 | |
|         tabContentArray[tabIndex].show();    //current tab content shows             
 | |
|         for(var k=0; k<tabContentArray.length; k++) {
 | |
|             if(k != tabIndex)
 | |
|                 tabContentArray[k].hide();   //other tab content hide
 | |
|         }   
 | |
|         if(tabIndex != 0)   //when switching to a tab that is not details tab
 | |
|             cancelEditMode(tabContentArray[0]);  //cancel edit mode in details tab
 | |
|         
 | |
|         if(afterSwitchFnArray != null) {
 | |
|             if(afterSwitchFnArray[tabIndex] != null)
 | |
|                 afterSwitchFnArray[tabIndex]();  
 | |
|         }         
 | |
|         return false;
 | |
|     });   
 | |
| }
 | |
| 
 | |
| function updateVmStateInMidMenu(jsonObj, $midmenuItem1) {         
 | |
|     if(jsonObj.state == "Running")
 | |
|         $midmenuItem1.find("#icon").attr("src", "images/status_green.png");
 | |
|     else if(jsonObj.state == "Stopped" || jsonObj.state == "Error")
 | |
|         $midmenuItem1.find("#icon").attr("src", "images/status_red.png");
 | |
|     else  //Destroyed, Creating, ~                                  
 | |
|         $midmenuItem1.find("#icon").attr("src", "images/status_gray.png");
 | |
|     
 | |
|     $midmenuItem1.find("#icon_container").show();
 | |
| }
 | |
|  
 | |
| function updateHostStateInMidMenu(jsonObj, $midmenuItem1) {         
 | |
|     if(jsonObj.state == "Up" || jsonObj.state == "Connecting")
 | |
|         $midmenuItem1.find("#icon").attr("src", "images/status_green.png");
 | |
|     else if(jsonObj.state == "Down" || jsonObj.state == "Alert")
 | |
|         $midmenuItem1.find("#icon").attr("src", "images/status_red.png");
 | |
|     else  //ErrorInMaintenance, PrepareForMaintenance, Maintenance, Disconnected                               
 | |
|         $midmenuItem1.find("#icon").attr("src", "images/status_gray.png");
 | |
|     
 | |
|     $midmenuItem1.find("#icon_container").show();
 | |
| } 
 | |
| 
 | |
| function enableConsoleHover($viewConsoleContainer, $viewConsoleTemplate) {
 | |
|     var imgUrl = $viewConsoleTemplate.data("imgUrl");		
 | |
|     var time = new Date();	
 | |
| 	
 | |
| 	$viewConsoleTemplate.find("#box0").css("background", "url("+imgUrl+"&t="+time.getTime()+")");
 | |
| 	$viewConsoleTemplate.find("#box1").css("background", "url("+imgUrl+"&t="+time.getTime()+")");
 | |
| 				
 | |
| 	var index = 0;
 | |
| 	$viewConsoleContainer.everyTime(5000, function() {
 | |
| 		var time = new Date();	
 | |
| 		if ((index % 2) == 0) {
 | |
| 			$viewConsoleTemplate.find("#box0").hide().css("background", "url("+imgUrl+"&t="+time.getTime()+")");
 | |
| 			$viewConsoleTemplate.find("#box1").show();
 | |
| 		} else {
 | |
| 			$viewConsoleTemplate.find("#box1").hide().css("background", "url("+imgUrl+"&t="+time.getTime()+")");
 | |
| 			$viewConsoleTemplate.find("#box0").show();
 | |
| 		}
 | |
| 		index++;
 | |
| 	}, 0);	
 | |
| } 
 | |
|   
 | |
| function disableConsoleHover($viewConsoleContainer) {
 | |
|     $viewConsoleContainer.stopTime();		  
 | |
| } 
 | |
|   
 | |
| function resetViewConsoleAction(jsonObj, $detailsTab) {
 | |
|     var $viewConsoleContainer = $detailsTab.find("#view_console_container").empty(); //reset view console panel
 | |
|     if(jsonObj == null)
 | |
|         return;
 | |
|     
 | |
|     var $viewConsoleTemplate = $("#view_console_template").clone();
 | |
|     $viewConsoleContainer.append($viewConsoleTemplate.show());       
 | |
| 	if (jsonObj.state == 'Running') {	
 | |
| 	    //console proxy thumbnail
 | |
| 	    var imgUrl = "console?cmd=thumbnail&vm=" + jsonObj.id + "&w=144&h=110";		
 | |
| 		$viewConsoleTemplate.data("imgUrl", imgUrl);
 | |
| 		
 | |
| 		$viewConsoleContainer.bind("mouseover", function(event) {	    
 | |
| 			enableConsoleHover($viewConsoleContainer, $viewConsoleTemplate);
 | |
| 			return false;
 | |
| 		});
 | |
| 		$viewConsoleContainer.bind("mouseout", function(event) {       
 | |
| 			disableConsoleHover($viewConsoleContainer);
 | |
| 			return false;
 | |
| 		});	 
 | |
| 						
 | |
| 		//console proxy popup
 | |
| 		$viewConsoleTemplate.data("proxyUrl", "console?cmd=access&vm=" + jsonObj.id).data("vmId",jsonObj.id).click(function(event) {				
 | |
| 			var proxyUrl = $(this).data("proxyUrl");				
 | |
| 			//proxyUrl = "http://localhost:8080/client/" + proxyUrl;  //***** temporary hack. This line will be removed after new UI code (/ui/new/*) moves to /ui/*
 | |
| 			var viewer = window.open(proxyUrl, $(this).data("vmId"),"width=820,height=640,resizable=yes,menubar=no,status=no,scrollbars=no,toolbar=no,location=no");
 | |
| 			viewer.focus();
 | |
| 			return false;
 | |
| 		});	
 | |
| 	} 	
 | |
| }    
 | |
| 
 | |
| function setVmStateInRightPanel(stateValue, $stateField) {   
 | |
|     if(stateValue == null) {
 | |
|         $stateField.text("").removeClass("green red gray");  
 | |
|         return;
 | |
|     }          	
 | |
|      
 | |
|     if(stateValue == "Running")
 | |
|         $stateField.text(stateValue).removeClass("red gray").addClass("green");
 | |
|     else if(stateValue == "Stopped" || stateValue == "Error")
 | |
|         $stateField.text(stateValue).removeClass("green gray").addClass("red");
 | |
|     else  //Destroyed, Creating, ~                                  
 | |
|         $stateField.text(stateValue).removeClass("green red").addClass("gray");            			       
 | |
| }
 | |
| 
 | |
| function setHostStateInRightPanel(stateValue, $stateField) {    
 | |
|     if(stateValue == "Up" || stateValue == "Connecting")
 | |
|         $stateField.text(stateValue).removeClass("status_red status_gray").addClass("status_green");
 | |
|     else if(stateValue == "Down" || stateValue == "Alert" || stateValue == "ErrorInMaintenance")
 | |
|         $stateField.text(stateValue).removeClass("status_green status_gray").addClass("status_red");
 | |
|     else  //"PrepareForMaintenance", "Maintenance", "Disconnected"                                
 | |
|         $stateField.text(stateValue).removeClass("status_green status_red").addClass("status_gray");            			       
 | |
| }
 | |
| 
 | |
| function setTemplateStateInRightPanel(stateValue, $stateField) {   
 | |
|     $stateField.text(stateValue);    
 | |
|      
 | |
|     if(stateValue == "Ready")
 | |
|         $stateField.text(stateValue).removeClass("status_red status_gray").addClass("status_green");
 | |
|     else if(stateValue != null && stateValue.indexOf("%") != -1)
 | |
|         $stateField.text(stateValue).removeClass("status_green status_red").addClass("status_gray");
 | |
|     else 
 | |
|         $stateField.text(stateValue).removeClass("status_green status_gray").addClass("status_red");              			       
 | |
| }
 | |
| 
 | |
| function initDialog(elementId, width1, addToActive) {
 | |
| 	if(width1 == null) {
 | |
| 	    activateDialog($("#"+elementId).dialog({    	            
 | |
| 	        autoOpen: false,
 | |
| 	        modal: true,
 | |
| 	        zIndex: 2000
 | |
|         }), addToActive); 
 | |
|     }
 | |
|     else {
 | |
|         activateDialog($("#"+elementId).dialog({ 
 | |
|    	        width: width1,	
 | |
| 	        autoOpen: false,
 | |
| 	        modal: true,
 | |
| 	        zIndex: 2000
 | |
|         }), addToActive); 
 | |
|     }
 | |
| } 
 | |
| 
 | |
| function initDialogWithOK(elementId, width1, addToActive) {
 | |
| 	if(width1 == null) {
 | |
| 	    activateDialog($("#"+elementId).dialog({    	            
 | |
| 	        autoOpen: false,
 | |
| 	        modal: true,
 | |
| 	        zIndex: 2000,
 | |
| 	        buttons: { "OK": function() { $(this).dialog("close"); } }
 | |
|         }), addToActive); 
 | |
|     }
 | |
|     else {
 | |
|         activateDialog($("#"+elementId).dialog({ 
 | |
|    	        width: width1,	
 | |
| 	        autoOpen: false,
 | |
| 	        modal: true,
 | |
| 	        zIndex: 2000,
 | |
| 	        buttons: { "OK": function() { $(this).dialog("close"); } }
 | |
|         }), addToActive); 
 | |
|     }
 | |
| } 
 | |
| 
 | |
| var $currentMidmenuItem;
 | |
| function bindClickToMidMenu($midmenuItem1, toRightPanelFn, getMidmenuIdFn) {
 | |
|     $midmenuItem1.bind("click", function(event){  
 | |
|         $currentMidmenuItem = $(this);
 | |
|         
 | |
|         if(selected_midmenu_id != null && selected_midmenu_id.length > 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 = $("<div id='multiple_selection_sub_container'></div>"); 
 | |
|     $("#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<items.length;i++) { 
 | |
|                     var $midmenuItem1 = $("#midmenu_item").clone();                      
 | |
|                     $midmenuItem1.data("toRightPanelFn", toRightPanelFn);                             
 | |
|                     toMidmenuFn(items[i], $midmenuItem1);    
 | |
|                     if(isMultipleSelectionInMidMenu != true)
 | |
|                         bindClickToMidMenu($midmenuItem1, toRightPanelFn, getMidmenuIdFn);             
 | |
|                       
 | |
|                     $container.append($midmenuItem1.show());   
 | |
|                     if(i == 0)  { //click the 1st item in middle menu as default                        
 | |
|                         if(isMultipleSelectionInMidMenu != true) {
 | |
|                             $midmenuItem1.click(); 
 | |
|                         }
 | |
|                         else {                                                            
 | |
|                             clickItemInMultipleSelectionMidmenu($midmenuItem1);                              
 | |
|                             grayoutTopButtonsFn();                       
 | |
|                         }                        
 | |
|                     }                 
 | |
|                 }  
 | |
|                 count = items.length;
 | |
|             }  
 | |
|             else {
 | |
|                 clearRightPanel(); //general one
 | |
|                 
 | |
|                 var clearRightPanelFn = $("#right_panel_content").data("clearRightPanelFn"); //page-specific one. e.g. vmClearRightPanel()
 | |
|                 if(clearRightPanelFn != null)
 | |
|                     clearRightPanelFn();  
 | |
|                     
 | |
|                 $container.append($("#midmenu_container_no_items_available").clone().show());  
 | |
|             }
 | |
|             $("#midmenu_container").show();
 | |
| 	        $("#midmenu_spinning_wheel").hide();           
 | |
|         }
 | |
|     });	 
 | |
|     
 | |
|     return count;
 | |
| }
 | |
| 
 | |
| var currentLeftMenuId;
 | |
| var currentRightPanelJSP = null;
 | |
| function listMidMenuItems(commandString, getSearchParamsFn, jsonResponse1, jsonResponse2, rightPanelJSP, afterLoadRightPanelJSPFn, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, leftmenuId, refreshDataBindingFn) { 
 | |
| 	clearMiddleMenu();
 | |
| 	showMiddleMenu();	
 | |
| 	
 | |
| 	currentLeftMenuId = leftmenuId;
 | |
| 	$("#right_panel").data("onRefreshFn", function() {
 | |
| 	    //$("#"+leftmenuId).click();	    
 | |
| 	    var params = $("#middle_menu_pagination").data("params");
 | |
|         if(params == null)
 | |
|             return;	 	         	    
 | |
|         listMidMenuItems2(params.commandString, params.getSearchParamsFn, params.jsonResponse1, params.jsonResponse2, params.toMidmenuFn, params.toRightPanelFn, params.getMidmenuIdFn, params.isMultipleSelectionInMidMenu, 1);	    
 | |
| 	});
 | |
| 
 | |
| 	if (currentRightPanelJSP != rightPanelJSP) {
 | |
| 		$("#right_panel").load(rightPanelJSP, function(){     
 | |
| 		    currentRightPanelJSP = rightPanelJSP;
 | |
| 		    
 | |
| 		    var $topButtonContainer = clearButtonsOnTop();			    	       
 | |
| 		    $("#top_buttons").appendTo($topButtonContainer); 
 | |
| 		    
 | |
| 			removeDialogs();			
 | |
| 								    
 | |
| 			var $actionLink = $("#right_panel_content #tab_content_details #action_link");
 | |
| 			bindActionLink($actionLink);
 | |
| 			/*
 | |
| 			$actionLink.bind("mouseover", function(event) {	    
 | |
| 				$(this).find("#action_menu").show();    
 | |
| 				return false;
 | |
| 			});
 | |
| 			$actionLink.bind("mouseout", function(event) {       
 | |
| 				$(this).find("#action_menu").hide();    
 | |
| 				return false;
 | |
| 			});	   
 | |
| 			*/
 | |
| 			
 | |
| 			afterLoadRightPanelJSPFn();                
 | |
| 			listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, jsonResponse2, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, 1);   			
 | |
| 		});     
 | |
| 	} else {	    
 | |
| 	    if(refreshDataBindingFn != null)
 | |
| 	        refreshDataBindingFn();
 | |
| 	
 | |
| 		listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, jsonResponse2, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, 1);        
 | |
| 	}
 | |
| 	return false;
 | |
| }
 | |
| 
 | |
| function bindAndListMidMenuItems($leftmenu, commandString, getSearchParamsFn, jsonResponse1, jsonResponse2, rightPanelJSP, afterLoadRightPanelJSPFn, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu) {	
 | |
| 	$leftmenu.unbind().bind("click", function(event) {
 | |
| 		selectLeftSubMenu($(this));		
 | |
|         listMidMenuItems(commandString, getSearchParamsFn, jsonResponse1, jsonResponse2, rightPanelJSP, afterLoadRightPanelJSPFn, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, $(this).attr("id"), null);
 | |
|         return false;
 | |
|     });
 | |
| }
 | |
| 
 | |
| function bindActionLink($actionLink) {
 | |
|     $actionLink.bind("mouseover", function(event) {	    
 | |
|         $(this).find("#action_menu").show();    
 | |
|         return false;
 | |
|     });
 | |
|     $actionLink.bind("mouseout", function(event) {          
 | |
|         var $thisElement = $(this)[0];
 | |
| 	    var relatedTarget1 = event.relatedTarget;
 | |
| 	    while(relatedTarget1 != null && relatedTarget1.nodeName != "BODY" && relatedTarget1 != $thisElement) {
 | |
| 	        relatedTarget1 = relatedTarget1.parentNode;
 | |
| 	    }    	
 | |
| 	    if(relatedTarget1 == $thisElement) { 
 | |
| 	        return;        
 | |
|         }
 | |
|         
 | |
|         $(this).find("#action_menu").hide();    
 | |
|         return false;
 | |
|     });	  
 | |
| }
 | |
| 
 | |
| function handleErrorInDialog(XMLHttpResponse, $thisDialog) {    
 | |
| 	var errorMsg = parseXMLHttpResponse(XMLHttpResponse);	
 | |
| 	handleErrorInDialog2(errorMsg, $thisDialog);
 | |
| }
 | |
| 
 | |
| function handleErrorInDialog2(errorMsg, $thisDialog) { 
 | |
| 	var $infoContainer = $thisDialog.find("#info_container");
 | |
| 
 | |
| 	if(errorMsg != null && errorMsg.length > 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<networkObj.service.length; i++) {
 | |
| 	        var networkServiceObj = networkObj.service[i];
 | |
| 	        if(networkServiceObj.name == pName)
 | |
| 	            return networkServiceObj;
 | |
| 	    }
 | |
|     }    
 | |
|     return null;
 | |
| }
 | |
| 
 | |
| function ipFindCapabilityByName(pName, networkServiceObj) {  
 | |
|     if(networkServiceObj == null)
 | |
|         return null;  
 | |
|     if(networkServiceObj.capability != null) {
 | |
| 	    for(var i=0; i<networkServiceObj.capability.length; i++) {
 | |
| 	        var capabilityObj = networkServiceObj.capability[i];
 | |
| 	        if(capabilityObj.name == pName)
 | |
| 	            return capabilityObj;
 | |
| 	    }
 | |
|     }    
 | |
|     return null;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|                                   
 | |
|                            
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| var g_mySession = null;
 | |
| var g_sessionKey = null;
 | |
| var g_role = null; // roles - root, domain-admin, ro-admin, user
 | |
| var g_username = null;
 | |
| var g_account = null;
 | |
| var g_domainid = null;
 | |
| var g_enableLogging = false; 
 | |
| var g_timezoneoffset = null;
 | |
| var g_timezone = null;
 | |
| var g_supportELB = null;
 | |
| 
 | |
| // capabilities
 | |
| var g_directAttachSecurityGroupsEnabled = "false";
 | |
| function getDirectAttachSecurityGroupsEnabled() { return g_directAttachSecurityGroupsEnabled; }
 | |
| 
 | |
| var g_userPublicTemplateEnabled = "true";
 | |
| function getUserPublicTemplateEnabled() { return g_userPublicTemplateEnabled; }
 | |
| 
 | |
| var g_supportELB = null;
 | |
| 
 | |
| //keyboard keycode
 | |
| var keycode_Enter = 13;
 | |
| 
 | |
| //XMLHttpResponse.status
 | |
| var ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED = 401;
 | |
| var ERROR_INTERNET_NAME_NOT_RESOLVED = 12007;
 | |
| var ERROR_INTERNET_CANNOT_CONNECT = 12029;
 | |
| var ERROR_VMOPS_ACCOUNT_ERROR = 531;
 | |
| 
 | |
| //localization
 | |
| var dictionary = {};   //initialized in each JSP file
 | |
| var g_dictionary = {}; //initialized in index.jsp
 | |
| 
 | |
| var g_logger = new Logger();
 | |
| $(function() {
 | |
| 	if(g_enableLogging)
 | |
| 		g_logger.open();
 | |
| });
 | |
| 
 | |
| // Test Tool.  Please comment this out or remove this when going production.
 | |
| // This is intended to provide a simple test tool to create user accounts and
 | |
| // domains.
 | |
| function initializeTestTool() {
 | |
| 	$("#launch_test").click(function(event) {
 | |
| 		testWindow = window.open('/client/test');
 | |
|                 testWindow.g_sessionKey=g_sessionKey;
 | |
| 		return false;
 | |
| 	});
 | |
| }
 | |
| 
 | |
| // Role Functions
 | |
| function isAdmin() {
 | |
| 	return (g_role == 1);
 | |
| }
 | |
| 
 | |
| function isDomainAdmin() {
 | |
| 	return (g_role == 2);
 | |
| }
 | |
| 
 | |
| function isUser() {
 | |
| 	return (g_role == 0);
 | |
| }
 | |
| 
 | |
| function setDateField(dateValue, dateField, htmlMarkup) {
 | |
|     if (dateValue != null && dateValue.length > 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 \u003c     
 | |
|     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';
 |