Merge "Add extsys gui"
diff --git a/openo-portal/portal-extsys/pom.xml b/openo-portal/portal-extsys/pom.xml
new file mode 100644
index 0000000..fb21cd8
--- /dev/null
+++ b/openo-portal/portal-extsys/pom.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+

+    Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

+    <modelVersion>4.0.0</modelVersion> 

+    <parent>

+      <groupId>openo-portal</groupId>

+      <artifactId>openo-portal</artifactId>

+      <version>1.0.0-SNAPSHOT</version>

+      <relativePath></relativePath>

+    </parent>

+

+    <groupId>openo-portal.module.extsys</groupId>

+    <artifactId>module-extsys</artifactId>

+	<version>1.0.0-SNAPSHOT</version>

+    <packaging>pom</packaging>

+</project>

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/css/sdn.css b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/css/sdn.css
new file mode 100644
index 0000000..558ac20
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/css/sdn.css
@@ -0,0 +1,492 @@
+/**

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+body {

+	font-family: microsoft yahei !important;

+}

+

+/* blue pill (inspired by iTunes)

+*******************************************************************************/

+

+.grey {

+  background-color: #e5e5e5;

+  color: #333;

+}

+

+.blue {

+

+	background-color: #5b9bd1;

+	border-radius: 20px;

+	color: #fff;

+	font-weight: bold;

+	padding: 8px 0;

+	text-align: center;

+	width: 100px;

+}

+

+.blue:hover {

+	background-color: #e8f3fd;

+	color: #5b9bd1;

+}

+

+.blue.selected {

+	border: 0;

+	background-color: #5b9bd1;

+	color: #fff;

+}

+

+.blue.selected:hover {

+	border: 0;

+	background-color: #5b9bd1;

+	color: #fff;

+}

+

+p {

+	color: #444;

+	font-size: 14px;

+	font-weight: normal;

+	line-height: 21px;

+	margin: 0 0 12px 0;

+}

+

+p.credit {

+	border-top: 1px solid #ccc;

+	font-size: 14px;

+	line-height: 140%;

+	margin: 36px 0 12px 0;

+	padding: 8px 0 0 0;

+	text-align: center;

+}

+

+ul.column {

+	float: left;

+	list-style: none;

+	width: 675px;

+}

+

+ul.column li {

+	background: #eee;

+	-webkit-border-radius: 5px;

+	border-radius: 5px;

+	-webkit-box-shadow: inset 0 1px 1px 0 #c7c7c7;

+	box-shadow: inset 0 1px 1px 0 #c7c7c7;

+	float: left;

+	margin: 10px 0 0 10px;

+	display: block;

+	height: 150px;

+	text-align: center;

+	width: 215px;

+}

+

+/* Clear Floated Elements

+------------------------------------------------------------------------------*/

+.column:after,.button-collection:after,.clearfix:after,div.project-info:after

+	{

+	clear: both;

+	content: ' ';

+	display: block;

+	font-size: 0;

+	line-height: 0;

+	visibility: hidden;

+	width: 0;

+	height: 0;

+}

+

+.container-fluid {

+	background-color:white !important;

+	min-height:500px;

+}

+

+.nav-tabs {

+	border: 0;

+}

+

+.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus

+	{

+	border: 0;

+	border-top: 3px solid #F3565D;

+}

+

+.nav-tabs>li>a {

+	border-radius: 0;

+}

+

+.nav-tabs>li>a:hover {

+	background-color: #f1f3fa;

+	border: 1Px solid #f1f3fa;

+}

+

+.c3 {

+	margin-top: 120px;

+}

+

+.skills-chart-breadcrumb {

+	

+}

+

+.blue:selected {

+	border: 0;

+	background-color: #5b9bd1;

+}

+

+.btn {

+	/* border-width: 0; */

+	/* padding: 7px 14px; */

+	/* font-size: 14px; */

+	/* outline: none !important; */

+	/* background-image: none !important; */

+	/* filter: none; */

+	/* -webkit-box-shadow: none; */

+	-moz-box-shadow: none;

+	/* box-shadow: none; */

+	/* text-shadow: none; */

+}

+

+select {

+	border-width: 1px;

+	padding: 4px 1px;

+	border-radius: 4px;

+}

+

+.input-sm {

+	padding: 4px 10px;

+}

+

+.btn-block {

+	display: block;

+	width: 100%;

+	padding-left: 0;

+	padding-right: 0;

+}

+

+/* Bootstrap buttons */

+

+

+.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active

+	{

+	color: #333;

+	background-color: #ededed;

+	border-color: #b3b3b3;

+}

+

+.open .btn-default.dropdown-toggle {

+	color: #333;

+	background-color: #ededed;

+	border-color: #b3b3b3;

+}

+

+.btn-default:active,.btn-default.active {

+	background-image: none;

+	background-color: #e0e0e0;

+	font-weight: bold;

+}

+

+.btn-default:active:hover,.btn-default.active:hover {

+	background-color: #e6e6e6;

+}

+

+.open .btn-default.dropdown-toggle {

+	background-image: none;

+}

+

+.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default[disabled].active,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active

+	{

+	background-color: #fff;

+	border-color: #ccc;

+}

+

+.btn-default .badge {

+	color: #fff;

+	background-color: #333;

+}

+

+

+.btn-default>i[class^="icon-"],.btn-default>i[class*="icon-"] {

+	color: #8c8c8c;

+}

+

+div[data-name="tab_zone"] div {

+	background-color: #f1f3fa;

+	padding: 0px;

+}

+

+div[data-name="cond_zone"] div {

+	background-color: #fff;

+	margin-top: 15px;

+	margin-bottom: 15px;

+}

+

+div[data-name="res-conds-zone"] {

+	display: inline;

+}

+

+div[data-name="res-conds-zone"] select,div[data-name="res-conds-zone"] span

+	{

+	/**height:33px;*/

+	margin-left: 15px;

+	color: #5b9bd1;

+	border-color: #ccc;

+	font-weight: bold;

+}

+

+.input{

+	width:250px;

+  height: 34px;

+  padding: 6px 12px;

+  font-size: 14px;

+  line-height: 1.42857143;

+  color: #555;

+  background-color: #fff;

+  background-image: none;

+  border: 1px solid #ccc;

+  border-radius: 4px;

+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);

+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075);

+  -webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;

+  transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;

+}

+

+div.separator {

+	margin: 20px;

+}

+

+div.separator div {

+	text-align: center;

+	line-height: 0;

+}

+

+div.separator-line {

+	height: 1px !important;

+	width: 100%;

+	background: #ddd;

+	overflow: hidden;

+}

+

+.dropdown-toggle {

+	color: #5b9bd1;

+}

+

+.calendar-date {

+	color: #5b9bd1;

+}

+

+.range_inputs {

+	color: #5b9bd1;

+}

+

+.btn.dropdown-toggle,.btn-group .btn.dropdown-toggle,.btn:hover,.btn:disabled,.btn[disabled],.btn:focus,.btn:active,.btn.active

+	{

+	outline: none !important;

+	background-image: none !important;

+	filter: none;

+	-webkit-box-shadow: none;

+	-moz-box-shadow: none;

+	box-shadow: none;

+	text-shadow: none;

+}

+

+#skills-chart-breadcrumb {

+	margin-bottom: 10px

+}

+

+/*增加daterangepicker的css*/

+input[name="daterange"] {

+	width: 220px;

+	line-height: 0;

+	height: 31px;

+	vertical-align: top;

+	margin-top: 2px;

+}

+

+.daterangepicker .ranges {

+	width: 205px;

+}

+

+.daterangepicker .ranges input {

+	width: 95px !important;

+}

+

+td.details-control {

+	background: url('../images/details_open.png') no-repeat center center;

+	cursor: pointer;

+}

+

+tr.shown td.details-control {

+	background: url('../images/details_close.png') no-repeat center center;

+}

+

+.details table td {

+	word-wrap: break-word;

+	word-break: normal;

+	border-top: 1px solid #dddddd;

+}

+

+.details table  tr:first-child td {

+	border-top: none;

+}

+

+.details table {

+	table-layout: fixed;

+	width: 100%;

+}

+

+td.title {

+	width: 10%;

+}

+

+table.dataTable tbody th,table.dataTable tbody td {

+	padding: 8px 10px;

+}

+

+div.dataTables_length,div.dataTables_info {

+	display: inline;

+}

+

+div.dataTables_paginate {

+	display: inline;

+	float: right;

+}

+

+div.pagination-panel {

+	margin-right: 10px;

+}

+

+input.pagination-panel-input {

+	width: 50px;

+}

+

+#ict_res_table_div {

+	margin-top: 15px;

+}

+

+#ict_res_table_div label {

+	font-weight: 100;

+}

+

+.daterangepicker .daterangepicker_start_input label,.daterangepicker .daterangepicker_end_input label

+	{

+	color: #5b9bd1;

+}

+

+.daterangepicker .ranges .input-mini {

+	color: #5b9bd1;

+}

+

+.cancelBtn {

+	padding: 5px 10px 5px 10px;

+}

+

+.btn:focus,.btn:active:focus,.btn.active:focus {

+	outline: 0;

+}

+

+#ict_res_table_div  table {

+	width: 100% !important;

+}

+

+.control-label .required {

+  color: #e02222;

+  font-size: 12px;

+  padding-left: 2px;

+}

+

+#ict_vim_table tbody tr{

+	cursor:pointer;

+}

+

+

+/*卡片面板样式*/

+.animated-panel {

+  -webkit-animation-duration: .5s;

+  animation-duration: .5s;

+  -webkit-animation-fill-mode: both;

+  animation-fill-mode: both;

+}

+

+.hpanel {

+  background-color: none;

+  border: none;

+  box-shadow: none;

+  margin-bottom: 25px;

+    

+}

+

+.hpanel .panel-body {

+  border: 1px solid #e4e5e7;

+  border-radius: 2px;

+  padding: 20px;

+  position: relative;

+}

+.h-200 {

+  min-height: 220px;

+}

+

+.m-t-xl {

+  margin-top: 40px;

+}

+

+.m-t-xl div {

+  margin-bottom: 15px;

+}

+

+.text-success {

+  color: #0d638f;

+}

+.hpanel > .panel-footer {

+  color: inherit;

+  border: 1px solid #e4e5e7;

+  border-top: none;

+  font-size: 90%;

+  background: #f7f9fa;

+  height:40px;

+  padding: 5px 15px;

+}

+.color_cloud{

+	color:#ccc;

+}

+.stats-title{

+

+}

+

+h3{

+  margin-top: 10px;

+  margin-bottom: 40px;

+  font-weight: 200;

+}

+

+.blue-font{

+	color:#428bca;

+}

+

+.hpanel > .panel-footer .pull-right a{

+	margin-left: 5px;

+}

+

+.hpanel > .panel-footer .pull-right .btn{

+	min-width: 30px !important;

+}

+

+.font-bold {

+  font-weight: 600;

+  margin-bottom: 15px;

+}

+

+.hpanel_show{

+	background-color: #f7f9fa;

+}

+

+.sdn-padding {

+	padding-left: 0;

+}
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/i18n/loadi18nApp.js b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/i18n/loadi18nApp.js
new file mode 100644
index 0000000..df99343
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/i18n/loadi18nApp.js
@@ -0,0 +1,42 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+function loadPropertiesSideMenu(lang, propertiesFileNamePrefix, propertiesFilePath){

+    jQuery.i18n.properties({

+        language:lang,

+        name:propertiesFileNamePrefix,

+        path:propertiesFilePath,

+        mode:'map',

+        callback: function() {

+            var i18nItems = $('[name_i18n=org_openo_nfv_roc_ui_i18n]');

+            for(var i=0;i<i18nItems.length;i++){

+                var $item = $(i18nItems.eq(i));

+                var itemId = $item.attr('id');

+                var itemTitle = $item.attr('title');

+                if(typeof($item.attr("title")) == "string"){

+                    $item.attr("title", ($.i18n.prop(itemTitle)));

+                }

+                if(undefined != itemId && typeof($item.attr("placeholder"))=="undefined"){

+                    $item.text($.i18n.prop(itemId));

+                }else if(undefined != itemId && typeof($item.attr("placeholder"))!="undefined"){

+                    $item.attr("placeholder", $.i18n.prop(itemId));

+                }

+            }

+        }

+    });

+}

+var lang = getLanguage();

+loadPropertiesSideMenu(lang, 'roc-sdn-iui-i18n', 'i18n/');

+

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/i18n/roc-sdn-iui-i18n-en-US.properties b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/i18n/roc-sdn-iui-i18n-en-US.properties
new file mode 100644
index 0000000..efdaea5
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/i18n/roc-sdn-iui-i18n-en-US.properties
@@ -0,0 +1,49 @@
+#

+# Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+#

+# Licensed under the Apache License, Version 2.0 (the "License");

+# you may not use this file except in compliance with the License.

+# You may obtain a copy of the License at

+#

+#         http://www.apache.org/licenses/LICENSE-2.0

+#

+# Unless required by applicable law or agreed to in writing, software

+# distributed under the License is distributed on an "AS IS" BASIS,

+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+# See the License for the specific language governing permissions and

+# limitations under the License.

+#

+

+roc-sdn-iui-common-tip=Tip:

+

+roc-sdn-iui-text-register=Register SDN controller info

+

+roc-sdn-iui-message-growl-msg-title=SDN controller info

+roc-sdn-iui-message-query-fail=Query SDN controller failed.

+roc-sdn-iui-message-save-success=Save successfully.

+roc-sdn-iui-message-save-fail=Save failed.

+roc-sdn-iui-message-update-success=Update successfully.

+roc-sdn-iui-message-update-fail=Update failed.

+roc-sdn-iui-message-delete-confirm=Do you want to delete the current SDN controller?

+roc-sdn-iui-message-delete-success=SDN controller deleted successfully.

+roc-sdn-iui-message-delete-fail=SDN controller deleted failed.

+

+roc-sdn-iui-text-update=Modify SDN controller info

+roc-sdn-iui-text-registerBtn=Register

+roc-sdn-iui-text-name=Name

+roc-sdn-iui-text-type=Type

+roc-sdn-iui-text-userName=Username

+roc-sdn-iui-text-password=Password

+roc-sdn-iui-text-cancelBtn=Cancel

+roc-sdn-iui-text-saveBtn=Save

+roc-sdn-iui-text-status-normal=Normal

+roc-sdn-iui-text-status-fail=Alarm

+roc-sdn-iui-text-total=Total

+roc-sdn-iui-text-total-sdn= of SDN Controller

+

+roc-sdn-iui-validate-name=Please enter a name

+roc-sdn-iui-validate-url-required=Please enter the right URL

+roc-sdn-iui-validate-url=Example: http://10.0.0.1:8181

+roc-sdn-iui-validate-username=Please enter a username

+roc-sdn-iui-validate-password=Please enter a password

+roc-sdn-iui-text-url-tip=Example: http://10.0.0.1:8181
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/i18n/roc-sdn-iui-i18n-zh-CN.properties b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/i18n/roc-sdn-iui-i18n-zh-CN.properties
new file mode 100644
index 0000000..a8e7dbc
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/i18n/roc-sdn-iui-i18n-zh-CN.properties
@@ -0,0 +1,49 @@
+#

+# Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+#

+# Licensed under the Apache License, Version 2.0 (the "License");

+# you may not use this file except in compliance with the License.

+# You may obtain a copy of the License at

+#

+#         http://www.apache.org/licenses/LICENSE-2.0

+#

+# Unless required by applicable law or agreed to in writing, software

+# distributed under the License is distributed on an "AS IS" BASIS,

+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+# See the License for the specific language governing permissions and

+# limitations under the License.

+#

+

+roc-sdn-iui-common-tip=提示:

+

+roc-sdn-iui-text-register=注册SDN控制器信息

+

+roc-sdn-iui-message-growl-msg-title=SDN控制器信息

+roc-sdn-iui-message-query-fail=查询SDN控制器失败。

+roc-sdn-iui-message-save-success=保存成功。

+roc-sdn-iui-message-save-fail=保存失败。

+roc-sdn-iui-message-update-success=修改成功。

+roc-sdn-iui-message-update-fail=修改失败。

+roc-sdn-iui-message-delete-confirm=确定删除所选SDN控制器信息?

+roc-sdn-iui-message-delete-success=删除成功。

+roc-sdn-iui-message-delete-fail=删除失败。

+

+roc-sdn-iui-text-update=修改SDN控制器信息

+roc-sdn-iui-text-registerBtn=注册

+roc-sdn-iui-text-name=名称

+roc-sdn-iui-text-type=类型

+roc-sdn-iui-text-userName=用户名

+roc-sdn-iui-text-password=密码

+roc-sdn-iui-text-cancelBtn=取消

+roc-sdn-iui-text-saveBtn=保存

+roc-sdn-iui-text-status-normal=正常

+roc-sdn-iui-text-status-fail=报警

+roc-sdn-iui-text-total=共

+roc-sdn-iui-text-total-sdn= SDN控制器

+

+roc-sdn-iui-validate-name=请输入名称

+roc-sdn-iui-validate-url-required=请输入正确的URL

+roc-sdn-iui-validate-url=例如:http://10.0.0.1:8181

+roc-sdn-iui-validate-username=请输入用户名

+roc-sdn-iui-validate-password=请输入密码

+roc-sdn-iui-text-url-tip=例如:http://10.0.0.1:8181
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/js/sdn-validate.js b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/js/sdn-validate.js
new file mode 100644
index 0000000..21b711a
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/js/sdn-validate.js
@@ -0,0 +1,67 @@
+$(function () {

+    var form = $('#sdn_form');

+    var error = $('.alert-danger', form);

+    var success = $('.alert-success', form);

+

+    form.validate({

+        doNotHideMessage : true, //this option enables to show the error/success messages on tab switch.

+        errorElement : 'span', //default input error message container

+        errorClass : 'help-block', // default input error message class

+        focusInvalid : false, // do not focus the last invalid input

+        rules : {

+            name : {

+                required : true,

+                maxlength : 20

+            },

+            url : {

+                required : true,

+                url : true

+            },

+            userName : {

+                required : true,

+                maxlength : 20

+            },

+            password : {

+                required : true,

+                maxlength : 20

+            }

+        },

+        messages : {

+            name : {

+                required : $.i18n.prop("roc-sdn-iui-validate-name")

+            },

+            url : {

+                required : $.i18n.prop("roc-sdn-iui-validate-url-required"),

+                url : $.i18n.prop("roc-sdn-iui-validate-url")

+            },

+            userName : {

+                required : $.i18n.prop('roc-sdn-iui-validate-username')

+            },

+            password : {

+                required : $.i18n.prop('roc-sdn-iui-validate-password')

+            }

+        },

+        errorPlacement : function (error, element) { // render error placement for each input type

+            error.insertAfter(element); // for other inputs, just perform default behavior

+        },

+        invalidHandler : function (event, validator) { //display error alert on form submit

+            success.hide();

+            error.show();

+        },

+        highlight : function (element) { // hightlight error inputs

+            $(element).closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group

+        },

+        unhighlight : function (element) { // revert the change done by hightlight

+            $(element).closest('.form-group').removeClass('has-error'); // set error class to the control group

+        },

+        success : function (label) {

+            label.addClass('valid') // mark the current input as valid and display OK icon

+            .closest('.form-group').removeClass('has-error'); // set success class to the control group

+        },

+        submitHandler : function (form) {

+            success.show();

+            error.hide();

+            //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax

+        }

+    });

+});

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/js/sdnController.js b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/js/sdnController.js
new file mode 100644
index 0000000..0b6c5c2
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/js/sdnController.js
@@ -0,0 +1,202 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+

+var vm = avalon

+    .define({

+        $id : "sdnController",

+        sdnInfo : [],

+        server_rtn : {

+            info_block : false,

+            warning_block : false,

+            rtn_info : "",

+            $RTN_SUCCESS : "RTN_SUCCESS",

+            $RTN_FAILED : "RTN_FAILED"

+        },

+        $Status : {

+            success : "active",

+            failed : "inactive"

+        },

+        $restUrl : {

+            querySdnControllerInfoUrl : '/openoapi/extsys/v1/sdncontrollers',

+            addSdnControllerInfoUrl : '/openoapi/extsys/v1/sdncontrollers',

+            updateSdnControllerInfoUrl : '/openoapi/extsys/v1/sdncontrollers',

+            delSdnControllerInfoUrl : '/openoapi/extsys/v1/sdncontrollers'

+        },

+        $htmlText : {

+            saveSuccess : $.i18n.prop("roc-sdn-iui-message-save-success"),

+            saveFail : $.i18n.prop("roc-sdn-iui-message-save-fail"),

+            updateSuccess : $.i18n.prop("roc-sdn-iui-message-update-success"),

+            updateFail : $.i18n.prop("roc-sdn-iui-message-update-fail")

+        },

+        $initTable : function () {

+            $.ajax({

+                "type" : 'GET',

+                "url" : vm.$restUrl.querySdnControllerInfoUrl,

+                "dataType" : "json",

+                "success" : function (resp) {

+                    if (resp.operationResult == "SUCCESS") {

+                        vm.sdnInfo = (resp == null) ? [] : resp.data;

+                    } else {

+                        vm.sdnInfo = [];

+                        bootbox.alert($.i18n.prop("roc-sdn-iui-message-query-fail"));

+                        return;

+                    }

+                },

+                error : function (XMLHttpRequest, textStatus, errorThrown) {

+                    bootbox.alert($.i18n.prop("roc-sdn-iui-message-query-fail") + ":" + textStatus + ":" + errorThrown);

+                    return;

+                },

+                complete : function () {

+                    sdnUtil.tooltipSdnStatus();

+                }

+            });

+        },

+        $sdnType : {

+            condName : $.i18n.prop("roc-sdn-iui-text-type"),

+            component_type : 'select',

+            selectItems : [{

+                    cond_value : 'ODL',

+                    name : "ODL",

+                    value : true

+                }, {

+                    cond_value : 'ONOS',

+                    name : "ONOS",

+                    value : true

+                }

+            ]

+        },

+        addSdn : {

+            title : $.i18n.prop("roc-sdn-iui-text-register"),

+            sdnId : "",

+            name : "",

+            type : "ODL",

+            typeDisabled : false,

+            url : "",

+            urlTip : $.i18n.prop("roc-sdn-iui-text-url-tip"),

+            userName : "",

+            password : "",

+            saveType : "add"

+        },

+        $showSdnTable : function () {

+            vm.addSdn.title = $.i18n.prop("roc-sdn-iui-text-register"),

+            vm.addSdn.sdnId = "";

+            vm.addSdn.name = "";

+            vm.addSdn.type = "ODL";

+            vm.addSdn.typeDisabled = false;

+            vm.addSdn.url = "";

+            vm.addSdn.userName = "";

+            vm.addSdn.password = "";

+            vm.addSdn.saveType = "add";

+            vm.server_rtn.warning_block = false;

+            vm.server_rtn.info_block = false;

+

+            $(".form-group").each(function () {

+                $(this).removeClass('has-success');

+                $(this).removeClass('has-error');

+                $(this).find(".help-block[id]").remove();

+            });

+            $("#addSdnDlg").modal("show");

+        },

+        $saveSdn : function () {

+            var form = $('#sdn_form');

+            if (form.valid() == false) {

+                return false;

+            }

+            vm.server_rtn.info_block = true;

+            vm.server_rtn.warning_block = false;

+            vm.addSdn.status = vm.$Status.success;

+

+            var param = {

+                name : vm.addSdn.name,

+                controllerType : $("#type").val(),

+                url : vm.addSdn.url,

+                userName : vm.addSdn.userName,

+                password : vm.addSdn.password

+            }

+            if (vm.addSdn.saveType == "add") {
+                for( var i = 0; i < vm.sdnInfo.length; i ++ ){
+                    if(vm.addSdn.url == vm.sdnInfo[i].url){
+                        sdnUtil.growl($.i18n.prop("roc-sdn-iui-message-growl-msg-title") +  'already exist',"info");
+                        $('#addSdnDlg').modal('hide');
+                        return;
+                    }
+                }

+                $.ajax({

+                    type : "POST",

+                    url : vm.$restUrl.addSdnControllerInfoUrl,

+                    data : JSON.stringify(param),

+                    dataType : "json",

+                    contentType : "application/json",

+                    success : function (data) {

+                        vm.server_rtn.info_block = false;

+                        vm.server_rtn.warning_block = false;

+                        if (data) {

+                            vm.sdnInfo = [];

+                            vm.$initTable();

+

+                            $('#addSdnDlg').modal('hide');

+                            sdnUtil.showMessage(vm.$htmlText.saveSuccess, "success");

+                        } else {

+                            vm.server_rtn.warning_block = true;

+                            vm.server_rtn.rtn_info = vm.$htmlText.saveFail;

+                            sdnUtil.showMessage(vm.$htmlText.saveFail, "failed");

+                        }

+                    },

+                    error : function (XMLHttpRequest, textStatus, errorThrown) {

+                        vm.server_rtn.warning_block = true;

+                        vm.server_rtn.rtn_info = textStatus + ":" + errorThrown;

+                        vm.server_rtn.info_block = false;

+                    }

+                });

+            } else {

+                $.ajax({

+                    type : "PUT",

+                    url : vm.$restUrl.updateSdnControllerInfoUrl + vm.addSdn.sdnId,

+                    data : JSON.stringify(param),

+                    dataType : "json",

+                    contentType : "application/json",

+                    success : function (data) {

+                        vm.server_rtn.info_block = false;

+                        vm.server_rtn.warning_block = false;

+                        if (data) {

+                            for (var i = 0; i < vm.sdnInfo.length; i++) {

+                                if (vm.sdnInfo[i].sdnControllerInstanceId == vm.addSdn.sdnId) {

+                                    vm.sdnInfo[i].name = vm.addSdn.name;

+                                    vm.sdnInfo[i].type = $("#type").val();

+                                    vm.sdnInfo[i].url = vm.addSdn.url;

+                                    vm.sdnInfo[i].userName = vm.addSdn.userName;

+                                    vm.sdnInfo[i].password = vm.addSdn.password;

+                                }

+                            }

+                            $('#addSdnDlg').modal('hide');

+                            sdnUtil.showMessage(vm.$htmlText.updateSuccess, "success");

+                        } else {

+                            vm.server_rtn.warning_block = true;

+                            vm.server_rtn.rtn_info = vm.$htmlText.updateFail;

+                            sdnUtil.showMessage(vm.$htmlText.updateFail, "failed");

+                        }

+                    },

+                    error : function (XMLHttpRequest, textStatus, errorThrown) {

+                        vm.server_rtn.warning_block = true;

+                        vm.server_rtn.rtn_info = textStatus + ":" + errorThrown;

+                        vm.server_rtn.info_block = false;

+                    }

+                });

+            }

+        },

+    });

+avalon.scan();

+vm.$initTable();

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/js/sdnUtil.js b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/js/sdnUtil.js
new file mode 100644
index 0000000..59062fc
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/js/sdnUtil.js
@@ -0,0 +1,89 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+var sdnUtil = {};

+

+sdnUtil.delSdn = function (el) {

+    bootbox.confirm($.i18n.prop("roc-sdn-iui-message-delete-confirm"), function (result) {

+        if (result) {

+            $.ajax({

+                type : "DELETE",

+                url : vm.$restUrl.delSdnControllerInfoUrl + el.sdnControllerInstanceId,

+                dataType : "json",

+                success : function (data) {

+                    if (data) {

+                        for (var i = 0; i < vm.sdnInfo.length; i++) {

+                            if (el.sdnControllerInstanceId == vm.sdnInfo[i].sdnControllerInstanceId) {

+                                vm.sdnInfo.splice(i, 1);

+                                break;

+                            }

+                        }

+                        sdnUtil.showMessage($.i18n.prop("roc-sdn-iui-message-delete-success"), "success");

+                    } else {

+                        sdnUtil.showMessage($.i18n.prop("roc-sdn-iui-message-delete-fail"), "warning");

+                    }

+                },

+                error : function () {

+                    sdnUtil.showMessage($.i18n.prop("roc-sdn-iui-message-delete-fail"), "warning");

+                }

+            });

+        }

+    });

+}

+

+sdnUtil.updateSdn = function (data) {

+    vm.addSdn.sdnId = data.sdnControllerInstanceId;

+    vm.addSdn.name = data.name;

+    vm.addSdn.type = data.controllerType;

+    vm.addSdn.typeDisabled = true;

+    vm.addSdn.url = data.url;

+    vm.addSdn.userName = data.userName;

+    vm.addSdn.password = data.password;

+    vm.addSdn.saveType = "update";

+    vm.addSdn.title = $.i18n.prop("roc-sdn-iui-text-update");

+    vm.server_rtn.info_block = false;

+    vm.server_rtn.warning_block = false;

+

+    $(".form-group").each(function () {

+        $(this).removeClass('has-success');

+        $(this).removeClass('has-error');

+        $(this).find(".help-block[id]").remove();

+    });

+    $("#addSdnDlg").modal("show");

+}

+

+sdnUtil.tooltipSdnStatus = function () {

+    $("[data-toggle='tooltip']").tooltip();

+}

+

+sdnUtil.growl = function (message, type) {

+    $.growl({

+        icon : "fa fa-envelope-o fa-lg",

+        title : "&nbsp;&nbsp;Notice: ",

+        message : message + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"

+    }, {

+        type : type

+    });

+}

+

+sdnUtil.showMessage = function(message, type) {

+    $.growl({

+        icon: "fa fa-envelope-o fa-lg",

+        title: "&nbsp;&nbsp;" + $.i18n.prop("roc-sdn-iui-common-tip"),

+        message: message

+    },{

+        type: type

+    });

+};

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/sdnView.html b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/sdnView.html
new file mode 100644
index 0000000..16fc12e
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/sdn/sdnView.html
@@ -0,0 +1,173 @@
+<!--

+

+    Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+<!DOCTYPE html>

+<html>

+<head lang="en">

+<meta charset="UTF-8">

+<title></title>

+<link href="../component/thirdparty/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"/>

+<link href="../component/thirdparty/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>

+<link href="../component/thirdparty/uniform/css/uniform.default.min.css" rel="stylesheet" type="text/css"/>

+<link href="../component/css/ZteIctIcons/style.css" rel="stylesheet" type="text/css"/>

+<link href="../framework/css/ngict-component.css" rel="stylesheet" type="text/css"/>

+<link href="../vendor/animate/animate.min.css" rel="stylesheet" type="text/css"/>

+<link href="css/sdn.css" rel="stylesheet" type="text/css"/>

+<style>

+.ms-controller {

+	visibility: hidden

+}

+</style>

+

+</head>

+<body>

+	<div class="ms-controller container-fluid" ms-controller="sdnController" >

+	<div id="addSdnDlg" class="modal  fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" >

+		<div class="modal-dialog">

+			<div class="modal-content Changepasswd">

+				<div class="content">

+					<div class="modal-header">

+						<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>

+						<h4 id="myModalLabel">{{addSdn.title}}</h4>

+					</div>

+					<div class="modal-body">

+					<form class="form-horizontal" id="sdn_form" role="form">

+						<input type="hidden" ms-duplex="addSdn.sdnId"  name="sdnId" class="form-control" />

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="roc-sdn-iui-text-name" name_i18n="org_openo_nfv_roc_ui_i18n"></span>

+								<span class="required" aria-required="true">*</span>

+							</label>

+						 	<div class="col-sm-7">

+								<input type="text" ms-duplex="addSdn.name"  name="name" class="form-control"/>

+								<span class="help-block"></span>

+							</div>

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="roc-sdn-iui-text-type" name_i18n="org_openo_nfv_roc_ui_i18n"></span>

+								<span class="required" aria-required="true">*</span>

+							</label>

+                            <div class="col-sm-7">

+                                <select class="form-control" id="type" ms-each="$sdnType.selectItems" ms-duplex="addSdn.type" ms-attr-disabled="addSdn.typeDisabled">

+                                    <option ms-attr-value='el.cond_value'>{{el.name}}</option>

+                                </select>

+                                <span class="help-block"></span>

+							</div>

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span>URL</span>

+								<span class="required" aria-required="true">*</span>

+							</label>

+							<div class="col-sm-7">

+								<input type="text" ms-duplex="addSdn.url" name="url" class="form-control" 

+									ms-attr-placeholder="addSdn.urlTip"/> 

+								<span class="help-block"></span>

+							</div>

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="roc-sdn-iui-text-userName" name_i18n="org_openo_nfv_roc_ui_i18n"></span>

+                                <span class="required" aria-required="true">*</span>

+							</label>

+							<div class="col-sm-7">

+								<input type="text" ms-duplex="addSdn.userName" name="userName" class="form-control" /> 

+								<span class="help-block"></span>

+							</div>

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="roc-sdn-iui-text-password" name_i18n="org_openo_nfv_roc_ui_i18n"></span>

+                                <span class="required" aria-required="true">*</span>

+							</label>

+							<div class="col-sm-7">

+								<input type="password" ms-duplex="addSdn.password" name="password" class="form-control" /> 

+								<span class="help-block"></span>

+							</div>

+						</div>

+					</form>

+					</div>

+					<div class="modal-footer">

+						<button class="btn" data-dismiss="modal" aria-hidden="true" id="roc-sdn-iui-text-cancelBtn" name_i18n="org_openo_nfv_roc_ui_i18n"></button>

+						<button class="btn btn-primary" type="submit" ms-click="$saveSdn" id="roc-sdn-iui-text-saveBtn" name_i18n="org_openo_nfv_roc_ui_i18n"></button>

+					</div>

+				</div>

+			</div>

+		</div>

+	</div>

+	<div class="row-fluid" data-name="cond_zone">

+		<div class="col-md-12">

+			<button class="btn white radius_l" id="app-new-btn" ms-click="$showSdnTable" >

+		        <i class="ict-new"></i> <span id="roc-sdn-iui-text-registerBtn" name_i18n="org_openo_nfv_roc_ui_i18n"></span>

+		    </button>

+		</div>

+	</div>

+

+	<div class="col-sm-12 sdn-padding" ms-each-el="sdnInfo">

+

+		<div class="col-sm-4 animated-panel zoomIn" style="-webkit-animation-delay: 0.1s;">

+            <div class="hpanel stats" >

+                <div class="panel-body h-200"  ms-hover="hpanel_show" >

+                    <div class="pull-left">

+                        <span class="label label-success" id="roc-sdn-iui-text-status-normal" name_i18n="org_openo_nfv_roc_ui_i18n"></span>

+                    </div>

+                    <div class="stats-icon pull-right">

+                        <i class="fa fa-server  fa-5x color_cloud"></i>

+                    </div>

+                    <div class="m-t-xl">

+                        <h3 ms-text="el.name"></h3>   

+                        <div><span id="roc-sdn-iui-text-type" name_i18n="org_openo_nfv_roc_ui_i18n"></span> : <span ms-text="el.controllerType"></span></div>

+                        <div>URL : <span ms-text="el.url"></span></div>

+                    </div>

+                </div>

+                <div class="panel-footer">

+                    <div  class="pull-right">

+                        <a class="btn btn-default btn-sm" ms-click="sdnUtil.updateSdn(el.$model)"><i class="fa fa-pencil-square-o fa-lg"></i></a>

+                        <a class="btn btn-default btn-sm" ms-click="sdnUtil.delSdn(el)"><i class="fa fa-trash-o fa-lg"> </i></a>

+                    </div>

+                </div>

+            </div> 

+        </div>

+    </div>

+    <div class="col-sm-12">

+        <div class="pull-left text-muted">

+        	<small><span id="roc-sdn-iui-text-total" name_i18n="org_openo_nfv_roc_ui_i18n"></span> <span class="blue-font" ms-text="sdnInfo.size()"></span> <span id="roc-sdn-iui-text-total-sdn" name_i18n="org_openo_nfv_roc_ui_i18n"></span></small>

+        </div>  

+	</div>

+	</div>

+	<script type="text/javascript" src="../component/thirdparty/jquery/jquery-1.10.2.min.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/bootstrap/js/bootstrap.min.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/bootbox/bootbox.min.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/jquery-validation/js/jquery.validate.min.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/jquery-validation/js/additional-methods.min.js"></script>

+	

+	<script type="text/javascript" src="../vendor/bootstrap-growl/bootstrap-growl.min.js"></script>

+	<script type="text/javascript" src="../vendor/cometd/cometd.js"></script>

+	<script type="text/javascript" src="../vendor/cometd/jquery.cometd.js"></script>

+	<script type="text/javascript" src="../vendor/avalon/avalon.js"></script>

+

+	<script type="text/javascript" src="../framework/js/tools.js"></script>

+	

+	<script type="text/javascript" src="i18n/loadi18nApp.js"></script> 

+	

+	<script type="text/javascript" src="js/sdn-validate.js"></script>

+	<script type="text/javascript" src="js/sdnUtil.js"></script>

+	<script type="text/javascript" src="js/sdnController.js"></script>

+</body>

+</html>
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/bootstrap.css b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/bootstrap.css
new file mode 100644
index 0000000..0193ce7
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/bootstrap.css
Binary files differ
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/skill.css b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/skill.css
new file mode 100644
index 0000000..092c7be
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/skill.css
@@ -0,0 +1,89 @@
+/**

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+body {

+  font-family: 'Open Sans', sans-serif;  

+  /*background-color: #f1f3fa;*/

+  width: '100%';

+  height: '100%';

+  margin-top: 10px;

+}

+div.skills-sunburst{

+	font-size: 12px;

+	font-weight: 400;

+	text-align:center;

+}

+

+#skillmap .skills-wrapper {

+  margin-top: 10px;

+  overflow: auto;

+}

+#skillmap .skills-sunburst {

+  float: left;

+  width: 500px;

+  margin-left: -80px;

+}

+#skillmap .skills-sunburst svg {

+  font: 11px 'Source Sans Pro', sans-serif;

+  font-weight: 900;

+  

+  cursor: pointer;

+}

+#skillmap .skills-chart {

+  float: right;

+  font-family: 'Source Sans Pro', sans-serif;

+  font-size: 15px;

+  margin: 80px 20px 0 0;

+}

+#skillmap .skills-chart .breadcumb-text {

+  font-size: 13px;

+  font-weight: 700;

+}

+#skillmap .skills-chart #skills-chart-line {

+  fill: none;

+  stroke-width: 3.5px;

+}

+#skillmap .skills-chart .axis path,

+#skillmap .skills-chart .axis line {

+  fill: none;

+}

+#skillmap .skills-chart .x-axis path,

+#skillmap .skills-chart .y-axis path {

+  stroke: #444;

+  stroke-width: 1px;

+  shape-rendering: geometricPrecision;

+}

+

+#explanation {

+  position: absolute;

+  top: 165px;

+  left: 170px;

+  width: 140px;

+  text-align: center;

+  color: #666;

+  margin-top:30px;

+}

+

+#percentage {

+  font-size: 2em;

+}

+

+#endlabel{

+	font-sizte:1.5em;

+}

+

+div.skills-sunburst text{

+	 text-anchor: middle;

+}
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/vim.css b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/vim.css
new file mode 100644
index 0000000..72de455
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/vim.css
@@ -0,0 +1,482 @@
+/**

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+body {

+	font-family: microsoft yahei !important;

+}

+

+/* blue pill (inspired by iTunes)

+*******************************************************************************/

+

+.grey {

+  background-color: #e5e5e5;

+  color: #333;

+}

+

+.blue {

+

+	background-color: #5b9bd1;

+	border-radius: 20px;

+	color: #fff;

+	font-weight: bold;

+	padding: 8px 0;

+	text-align: center;

+	width: 100px;

+}

+

+.blue:hover {

+	background-color: #e8f3fd;

+	color: #5b9bd1;

+}

+

+.blue.selected {

+	border: 0;

+	background-color: #5b9bd1;

+	color: #fff;

+}

+

+.blue.selected:hover {

+	border: 0;

+	background-color: #5b9bd1;

+	color: #fff;

+}

+

+a {

+	font-weight: bold;

+	text-decoration: none;

+}

+

+p {

+	color: #444;

+	font-size: 14px;

+	font-weight: normal;

+	line-height: 21px;

+	margin: 0 0 12px 0;

+}

+

+p.credit {

+	border-top: 1px solid #ccc;

+	font-size: 14px;

+	line-height: 140%;

+	margin: 36px 0 12px 0;

+	padding: 8px 0 0 0;

+	text-align: center;

+}

+

+ul.column {

+	float: left;

+	list-style: none;

+	width: 675px;

+}

+

+ul.column li {

+	background: #eee;

+	-webkit-border-radius: 5px;

+	border-radius: 5px;

+	-webkit-box-shadow: inset 0 1px 1px 0 #c7c7c7;

+	box-shadow: inset 0 1px 1px 0 #c7c7c7;

+	float: left;

+	margin: 10px 0 0 10px;

+	display: block;

+	height: 150px;

+	text-align: center;

+	width: 215px;

+}

+

+/* Clear Floated Elements

+------------------------------------------------------------------------------*/

+.column:after,.button-collection:after,.clearfix:after,div.project-info:after

+	{

+	clear: both;

+	content: ' ';

+	display: block;

+	font-size: 0;

+	line-height: 0;

+	visibility: hidden;

+	width: 0;

+	height: 0;

+}

+

+.container-fluid {

+	background-color: white !important;

+	min-height: 500px;

+}

+

+.nav-tabs {

+	border: 0;

+}

+

+.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus

+	{

+	border: 0;

+	border-top: 3px solid #F3565D;

+}

+

+.nav-tabs>li>a {

+	border-radius: 0;

+}

+

+.nav-tabs>li>a:hover {

+	background-color: #f1f3fa;

+	border: 1Px solid #f1f3fa;

+}

+

+.c3 {

+	margin-top: 120px;

+}

+

+.skills-chart-breadcrumb {

+	

+}

+

+.blue:selected {

+	border: 0;

+	background-color: #5b9bd1;

+}

+

+.btn {

+	/* border-width: 0; */

+	/* padding: 7px 14px; */

+	/* font-size: 14px; */

+	/* outline: none !important; */

+	/* background-image: none !important; */

+	/* filter: none; */

+	/* -webkit-box-shadow: none; */

+	-moz-box-shadow: none;

+	/* box-shadow: none; */

+	/* text-shadow: none; */

+}

+

+select {

+	border-width: 1px;

+	padding: 4px 1px;

+	border-radius: 4px;

+}

+

+.input-sm {

+	padding: 4px 10px;

+}

+

+.btn-block {

+	display: block;

+	width: 100%;

+	padding-left: 0;

+	padding-right: 0;

+}

+

+/* Bootstrap buttons */

+

+

+.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active

+	{

+	color: #333;

+	background-color: #ededed;

+	border-color: #b3b3b3;

+}

+

+.open .btn-default.dropdown-toggle {

+	color: #333;

+	background-color: #ededed;

+	border-color: #b3b3b3;

+}

+

+.btn-default:active,.btn-default.active {

+	background-image: none;

+	background-color: #e0e0e0;

+	font-weight: bold;

+}

+

+.btn-default:active:hover,.btn-default.active:hover {

+	background-color: #e6e6e6;

+}

+

+.open .btn-default.dropdown-toggle {

+	background-image: none;

+}

+

+.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default[disabled].active,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active

+	{

+	background-color: #fff;

+	border-color: #ccc;

+}

+

+.btn-default .badge {

+	color: #fff;

+	background-color: #333;

+}

+

+

+.btn-default>i[class^="icon-"],.btn-default>i[class*="icon-"] {

+	color: #8c8c8c;

+}

+

+div[data-name="tab_zone"] div {

+	background-color: #f1f3fa;

+	padding: 0px;

+}

+

+div[data-name="cond_zone"] div {

+	background-color: #fff;

+	margin-top: 15px;

+	margin-bottom: 15px;

+}

+

+

+

+

+.input{

+	width:250px;

+  height: 34px;

+  padding: 6px 12px;

+  font-size: 14px;

+  line-height: 1.42857143;

+  color: #555;

+  background-color: #fff;

+  background-image: none;

+  border: 1px solid #ccc;

+  border-radius: 4px;

+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);

+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075);

+  -webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;

+  transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;

+}

+

+div.separator {

+	margin: 20px;

+}

+

+div.separator div {

+	text-align: center;

+	line-height: 0;

+}

+

+div.separator-line {

+	height: 1px !important;

+	width: 100%;

+	background: #ddd;

+	overflow: hidden;

+}

+

+.dropdown-toggle {

+	color: #5b9bd1;

+}

+

+.calendar-date {

+	color: #5b9bd1;

+}

+

+.range_inputs {

+	color: #5b9bd1;

+}

+

+.btn.dropdown-toggle,.btn-group .btn.dropdown-toggle,.btn:hover,.btn:disabled,.btn[disabled],.btn:focus,.btn:active,.btn.active

+	{

+	outline: none !important;

+	background-image: none !important;

+	filter: none;

+	-webkit-box-shadow: none;

+	-moz-box-shadow: none;

+	box-shadow: none;

+	text-shadow: none;

+}

+

+#skills-chart-breadcrumb {

+	margin-bottom: 10px

+}

+

+/*增加daterangepicker的css*/

+input[name="daterange"] {

+	width: 220px;

+	line-height: 0;

+	height: 31px;

+	vertical-align: top;

+	margin-top: 2px;

+}

+

+.daterangepicker .ranges {

+	width: 205px;

+}

+

+.daterangepicker .ranges input {

+	width: 95px !important;

+}

+

+td.details-control {

+	background: url('../images/details_open.png') no-repeat center center;

+	cursor: pointer;

+}

+

+tr.shown td.details-control {

+	background: url('../images/details_close.png') no-repeat center center;

+}

+

+.details table td {

+	word-wrap: break-word;

+	word-break: normal;

+	border-top: 1px solid #dddddd;

+}

+

+.details table  tr:first-child td {

+	border-top: none;

+}

+

+.details table {

+	table-layout: fixed;

+	width: 100%;

+}

+

+td.title {

+	width: 10%;

+}

+

+table.dataTable tbody th,table.dataTable tbody td {

+	padding: 8px 10px;

+}

+

+div.dataTables_length,div.dataTables_info {

+	display: inline;

+}

+

+div.dataTables_paginate {

+	display: inline;

+	float: right;

+}

+

+div.pagination-panel {

+	margin-right: 10px;

+}

+

+input.pagination-panel-input {

+	width: 50px;

+}

+

+#ict_res_table_div {

+	margin-top: 15px;

+}

+

+#ict_res_table_div label {

+	font-weight: 100;

+}

+

+.daterangepicker .daterangepicker_start_input label,.daterangepicker .daterangepicker_end_input label

+	{

+	color: #5b9bd1;

+}

+

+.daterangepicker .ranges .input-mini {

+	color: #5b9bd1;

+}

+

+.cancelBtn {

+	padding: 5px 10px 5px 10px;

+}

+

+.btn:focus,.btn:active:focus,.btn.active:focus {

+	outline: 0;

+}

+

+#ict_res_table_div  table {

+	width: 100% !important;

+}

+

+.control-label .required {

+  color: #e02222;

+  font-size: 12px;

+  padding-left: 2px;

+}

+

+#ict_vim_table tbody tr{

+	cursor:pointer;

+}

+

+

+/*卡片面板样式*/

+.animated-panel {

+  -webkit-animation-duration: .5s;

+  animation-duration: .5s;

+  -webkit-animation-fill-mode: both;

+  animation-fill-mode: both;

+}

+

+.hpanel {

+  background-color: none;

+  border: none;

+  box-shadow: none;

+  margin-bottom: 25px;

+    

+}

+

+.hpanel .panel-body {

+  border: 1px solid #e4e5e7;

+  border-radius: 2px;

+  padding: 20px;

+  position: relative;

+}

+.h-200 {

+  min-height: 220px;

+}

+.m-t-xl {

+  margin-top: 40px;

+}

+.text-success {

+  color: #0d638f;

+}

+.hpanel > .panel-footer {

+  color: inherit;

+  border: 1px solid #e4e5e7;

+  border-top: none;

+  font-size: 90%;

+  background: #f7f9fa;

+  height:40px;

+  padding: 5px 15px;

+}

+.color_cloud{

+	color:#ccc;

+}

+.stats-title{

+

+}

+

+h3{

+  margin-top: 10px;

+  margin-bottom: 40px;

+  font-weight: 200;

+}

+

+.blue-font{

+	color:#428bca;

+}

+

+.hpanel > .panel-footer .pull-right a{

+	margin-left: 5px;

+}

+

+.hpanel > .panel-footer .pull-right .btn{

+    min-width: 30px !important;

+}

+

+.refresh-status-text{

+	float: right;

+}

+

+.font {

+  margin-bottom: 15px;

+}

+

+.hpanel_show{

+	cursor: pointer;

+	background-color: #f7f9fa;

+}

+

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/vimChart.css b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/vimChart.css
new file mode 100644
index 0000000..842ff48
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/css/vimChart.css
@@ -0,0 +1,54 @@
+body {

+  color: #333;

+  font-family: "Microsoft yahei", Verdana, Arial, Helvetica, sans-serif !important;

+  padding: 0px !important;

+  margin: 0px !important;

+  direction: ltr;

+  background-color: #f1f3fa !important; 

+}

+

+.row{

+     margin-left: 0px; 

+  margin-right: 0px; 

+}

+

+select {

+  border-width: 1px;

+  padding: 4px 1px;

+  border-radius: 4px;

+}

+

+.container-fluid {

+  background-color: #fff;

+}

+

+

+.titlefont {

+  font-size: 16px;

+   margin-left: 10px;

+}

+

+.separator-line {

+    height: 1px;

+    width: 100%;

+    background: #ddd;

+    overflow: hidden;

+    margin-bottom: 15px;

+    margin-top: 6px;

+    opacity: 0.6;

+}

+

+.main {

+    height: 400px;

+    /* width: 778px !important; */

+    overflow: hidden;

+    padding: 10px;

+    margin-bottom: 10px;

+    border: 1px solid #e3e3e3;

+    -webkit-border-radius: 4px;

+    -moz-border-radius: 4px;

+    border-radius: 4px;

+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);

+    -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);

+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);

+}
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/i18n/loadi18nApp.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/i18n/loadi18nApp.js
new file mode 100644
index 0000000..4f18870
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/i18n/loadi18nApp.js
@@ -0,0 +1,43 @@
+*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+function loadPropertiesSideMenu(lang, propertiesFileNamePrefix, propertiesFilePath){

+    jQuery.i18n.properties({

+        language:lang,

+        name:propertiesFileNamePrefix,

+        path:propertiesFilePath, // 资源文件路径

+        mode:'map', // 用 Map 的方式使用资源文件中的值

+        callback: function() {// 加载成功后设置显示内容

+            var i18nItems = $('[name_i18n=com_zte_conductor_ui_i18n]');

+            for(var i=0;i<i18nItems.length;i++){

+                var $item = $(i18nItems.eq(i));

+                var itemId = $item.attr('id_i18n');

+                var itemTitle = $item.attr('title');

+                /** id存在时元素内容需要国际化,title存在时元素title需要国际化 */

+                if(typeof($item.attr("title")) == "string"){

+                    $item.attr("title", ($.i18n.prop(itemTitle)));

+                }

+                if(undefined != itemId && typeof($item.attr("placeholder"))=="undefined"){

+                    $item.text($.i18n.prop(itemId));

+                }else if(undefined != itemId && typeof($item.attr("placeholder"))!="undefined"){

+                    $item.attr("placeholder", $.i18n.prop(itemId));

+                }

+            }

+        }

+    });

+}

+var lang = getLanguage();

+loadPropertiesSideMenu(lang, 'roc-vim-iui-i18n', 'i18n/');

+

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/i18n/roc-vim-iui-i18n-en-US.properties b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/i18n/roc-vim-iui-i18n-en-US.properties
new file mode 100644
index 0000000..35cdb63
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/i18n/roc-vim-iui-i18n-en-US.properties
@@ -0,0 +1,92 @@
+#

+# Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+#

+# Licensed under the Apache License, Version 2.0 (the "License");

+# you may not use this file except in compliance with the License.

+# You may obtain a copy of the License at

+#

+#         http://www.apache.org/licenses/LICENSE-2.0

+#

+# Unless required by applicable law or agreed to in writing, software

+# distributed under the License is distributed on an "AS IS" BASIS,

+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+# See the License for the specific language governing permissions and

+# limitations under the License.

+#

+

+############## vimView.html i18n ##############

+com_zte_ums_eco_roc_vim_checking_status=Checking vim status...

+com_zte_ums_eco_roc_vim_name=Display name

+com_zte_ums_eco_roc_vim_auth_url=Auth URL

+com_zte_ums_eco_roc_vim_username=Username

+com_zte_ums_eco_roc_vim_password=Password

+com_zte_ums_eco_roc_vim_tenant=Tenant

+com_zte_ums_eco_roc_vim_vendor=Vendor

+com_zte_ums_eco_roc_vim_type=Type

+com_zte_ums_eco_roc_vim_version=Version

+com_zte_ums_eco_roc_vim_cancel=Cancel

+com_zte_ums_eco_roc_vim_save=Save

+com_zte_ums_eco_roc_vim_status_update_time=Status update time:

+com_zte_ums_eco_roc_vim_register=Register

+com_zte_ums_eco_roc_vim_normal=Normal

+com_zte_ums_eco_roc_vim_abnormal=Abnormal

+com_zte_ums_eco_roc_vim_display_type=Type:

+com_zte_ums_eco_roc_vim_total=Total

+com_zte_ums_eco_roc_vim_metric=vims

+com_zte_ums_eco_roc_vim_register_info=Register

+com_zte_ums_eco_roc_vim_modify_info=Modify

+com_zte_ums_eco_roc_vim_domain=domain 

+com_zte_ums_eco_roc_vim_description=description  

+############## js  ######################

+com_zte_ums_eco_roc_vim_auth_url_require_message=please input auth url

+com_zte_ums_eco_roc_vim_auth_url_alarm_message=example: http://xx.xx.xx.xx:5000/v2.0

+com_zte_ums_eco_roc_vim_name_alarm_message=please input vim name

+com_zte_ums_eco_roc_vim_username_alarm_message=please input username

+com_zte_ums_eco_roc_vim_password_alarm_message=please input password

+com_zte_ums_eco_roc_vim_tenant_alarm_message=please input tenant

+com_zte_ums_eco_roc_vim_version_alarm_message=please input version

+com_zte_ums_eco_roc_vim_vendor_alarm_message=please input vendor

+com_zte_ums_eco_roc_vim_getting_info=getting info...

+com_zte_ums_eco_roc_vim_dealing_info=dealing

+com_zte_ums_eco_roc_vim_confirm_delete_vim_record=Do you want to delete this instance?

+com_zte_ums_eco_roc_vim_vdu_isExists=This VIM's VUDs are used, you can't remove it.

+com_zte_ums_eco_roc_vim_growl_msg_query_vdu_failed=query VDU failed

+

+com_zte_ums_eco_roc_vim_growl_msg_title=vim info

+com_zte_ums_eco_roc_vim_growl_msg_remove_success=delete success

+com_zte_ums_eco_roc_vim_growl_msg_remove_failed=delete failed

+com_zte_ums_eco_roc_vim_growl_msg_remove_server_success=delete server success:

+com_zte_ums_eco_roc_vim_growl_msg_remove_server_failed=delete server falied:

+com_zte_ums_eco_roc_vim_growl_msg_query_failed=query faile

+

+com_zte_ums_eco_roc_vim_growl_msg_save_success=save success

+com_zte_ums_eco_roc_vim_growl_msg_save_failed=save failed

+com_zte_ums_eco_roc_vim_growl_msg_add_server_success=add server success, access port:

+com_zte_ums_eco_roc_vim_growl_msg_add_server_failed=add server falied:

+

+

+############## vimChart.html i18n ##############

+

+com_zte_ums_eco_roc_vim_resource_use=-resource using status

+com_zte_ums_eco_roc_vim_resource_vim_use=virtual machine manager resource using status

+com_zte_ums_eco_roc_vim_resource_tenant_use=-tenant quota using status

+

+com_zte_ums_eco_roc_vim_resource_chart_used=used:

+com_zte_ums_eco_roc_vim_resource_chart_total=total:

+com_zte_ums_eco_roc_vim_resource_chart_return=return

+com_zte_ums_eco_roc_vim_resource_chart_save_picture=save picture as

+com_zte_ums_eco_roc_vim_resource_chart_click_save=click save

+

+com_zte_ums_eco_roc_vim_resource_vim_cpu=CPU

+com_zte_ums_eco_roc_vim_resource_vim_memory=Memory

+com_zte_ums_eco_roc_vim_resource_vim_disk=Disk

+

+com_zte_ums_eco_roc_vim_resource_tenant_cpu=CPU

+com_zte_ums_eco_roc_vim_resource_tenant_memoryMb=Memory

+com_zte_ums_eco_roc_vim_resource_tenant_instances=Instances

+com_zte_ums_eco_roc_vim_resource_tenant_floatingIps=FloatingIps

+com_zte_ums_eco_roc_vim_resource_tenant_securityGroups=securityGroup

+com_zte_ums_eco_roc_vim_resource_tenant_volumeStorage=volumeStorage

+com_zte_ums_eco_roc_vim_resource_tenant_volumes=Volumes

+

+com_zte_ums_eco_roc_vim_title_notice=Notice:

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/i18n/roc-vim-iui-i18n-zh-CN.properties b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/i18n/roc-vim-iui-i18n-zh-CN.properties
new file mode 100644
index 0000000..eeba672
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/i18n/roc-vim-iui-i18n-zh-CN.properties
@@ -0,0 +1,94 @@
+#

+# Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+#

+# Licensed under the Apache License, Version 2.0 (the "License");

+# you may not use this file except in compliance with the License.

+# You may obtain a copy of the License at

+#

+#         http://www.apache.org/licenses/LICENSE-2.0

+#

+# Unless required by applicable law or agreed to in writing, software

+# distributed under the License is distributed on an "AS IS" BASIS,

+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+# See the License for the specific language governing permissions and

+# limitations under the License.

+#

+

+############## vimView.html i18n ##############

+com_zte_ums_eco_roc_vim_checking_status=vim连接状态检查中...

+com_zte_ums_eco_roc_vim_name=名称

+com_zte_ums_eco_roc_vim_auth_url=接入URL

+com_zte_ums_eco_roc_vim_username=用户名

+com_zte_ums_eco_roc_vim_password=密码

+com_zte_ums_eco_roc_vim_tenant=租户

+com_zte_ums_eco_roc_vim_vendor=厂商

+com_zte_ums_eco_roc_vim_type=类型

+com_zte_ums_eco_roc_vim_version=版本

+com_zte_ums_eco_roc_vim_cancel=取消

+com_zte_ums_eco_roc_vim_save=保存

+com_zte_ums_eco_roc_vim_status_update_time=状态更新时间:

+com_zte_ums_eco_roc_vim_register=注册VIM

+com_zte_ums_eco_roc_vim_normal=正常

+com_zte_ums_eco_roc_vim_abnormal=报警

+com_zte_ums_eco_roc_vim_display_type=类型:

+com_zte_ums_eco_roc_vim_total=共

+com_zte_ums_eco_roc_vim_metric=个vim

+com_zte_ums_eco_roc_vim_register_info=注册vim信息

+com_zte_ums_eco_roc_vim_modify_info=修改vim信息

+com_zte_ums_eco_roc_vim_domain=域信息 

+com_zte_ums_eco_roc_vim_description=描述

+############## js  ######################

+com_zte_ums_eco_roc_vim_auth_url_require_message=请输入url

+com_zte_ums_eco_roc_vim_auth_url_alarm_message=url格式有误(参考:http://xx.xx.xx.xx:5000/v2.0)

+com_zte_ums_eco_roc_vim_name_alarm_message=请输入名称

+com_zte_ums_eco_roc_vim_username_alarm_message=请输入用户名

+com_zte_ums_eco_roc_vim_password_alarm_message=请输入密码

+com_zte_ums_eco_roc_vim_tenant_alarm_message=请输入租户

+com_zte_ums_eco_roc_vim_version_alarm_message=请输入版本号

+com_zte_ums_eco_roc_vim_vendor_alarm_message=请输入厂商

+

+com_zte_ums_eco_roc_vim_getting_info=获取中...

+com_zte_ums_eco_roc_vim_dealing_info=处理中...

+

+com_zte_ums_eco_roc_vim_confirm_delete_vim_record=确定删除所选vim信息?

+com_zte_ums_eco_roc_vim_vdu_isExists=业务编排仍在使用此VIM上的VDU,不能删除它

+com_zte_ums_eco_roc_vim_growl_msg_query_vdu_failed=查询VDU失败

+

+

+com_zte_ums_eco_roc_vim_growl_msg_title=vim信息

+com_zte_ums_eco_roc_vim_growl_msg_remove_success=删除成功

+com_zte_ums_eco_roc_vim_growl_msg_remove_failed=删除失败

+com_zte_ums_eco_roc_vim_growl_msg_save_success=保存成功

+com_zte_ums_eco_roc_vim_growl_msg_save_failed=保存失败

+com_zte_ums_eco_roc_vim_growl_msg_remove_server_success=删除Server成功:

+com_zte_ums_eco_roc_vim_growl_msg_remove_server_failed=删除Server失败:

+com_zte_ums_eco_roc_vim_growl_msg_query_failed=查询失败

+com_zte_ums_eco_roc_vim_growl_msg_add_server_success=增加Server成功,端口号:

+com_zte_ums_eco_roc_vim_growl_msg_add_server_failed=增加Server失败:

+

+

+############## vimChart.html i18n ##############

+

+com_zte_ums_eco_roc_vim_resource_use=-资源使用情况

+com_zte_ums_eco_roc_vim_resource_vim_use=虚拟机管理器资源使用情况

+com_zte_ums_eco_roc_vim_resource_tenant_use=-租户配额使用情况

+

+com_zte_ums_eco_roc_vim_resource_chart_used=已用:

+com_zte_ums_eco_roc_vim_resource_chart_total=总共:

+com_zte_ums_eco_roc_vim_resource_chart_return=返回

+com_zte_ums_eco_roc_vim_resource_chart_save_picture=保存为图片

+com_zte_ums_eco_roc_vim_resource_chart_click_save=点击保存

+

+com_zte_ums_eco_roc_vim_resource_vim_cpu=虚拟内核

+com_zte_ums_eco_roc_vim_resource_vim_memory=内存

+com_zte_ums_eco_roc_vim_resource_vim_disk=磁盘

+

+com_zte_ums_eco_roc_vim_resource_tenant_cpu=虚拟内核

+com_zte_ums_eco_roc_vim_resource_tenant_memoryMb=内存

+com_zte_ums_eco_roc_vim_resource_tenant_instances=实例

+com_zte_ums_eco_roc_vim_resource_tenant_floatingIps=浮动IP

+com_zte_ums_eco_roc_vim_resource_tenant_securityGroups=安全组

+com_zte_ums_eco_roc_vim_resource_tenant_volumeStorage=卷存储

+com_zte_ums_eco_roc_vim_resource_tenant_volumes=云硬盘

+

+com_zte_ums_eco_roc_vim_title_notice=提示:
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/client-cometd.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/client-cometd.js
new file mode 100644
index 0000000..660cd6f
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/client-cometd.js
@@ -0,0 +1,63 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+/**

+ * Created by 10184303 on 15-11-17.

+ */

+ 	

+$(function(){

+    var registerCometdMessage = function(url, callback) {

+        var cometd = new $.Cometd(); 

+        var cometdURL = location.protocol + "//" + location.host + "/api/nsocnotification/v1";

+        cometd.configure({

+            url : cometdURL,

+            logLevel : "debug"

+        });

+

+        cometd.addListener("/meta/handshake", function(handshake){

+            if(handshake.successful === true) {

+                cometd.batch(function(){

+                    cometd.subscribe(url, function(message){

+                        callback.call(this, message.data);

+                    });

+                });

+            }

+        });

+        cometd.handshake();

+}

+    registerCometdMessage("/VIMstatus", function(data){

+                    var alarmArray= JSON.parse(data.greeting);

+                    console.log(data.greeting);

+                    for(var i=0;i<alarmArray.length;i++){

+						vm.vimStatusTime = alarmArray[i].checkTime;

+                        for(var n=0;n<vm.vimInfo.length;n++){

+                            if(alarmArray[i].id==vm.vimInfo[n].oid && alarmArray[i].hostStorageInfo == ""){

+                                vm.vimInfo[n].status=alarmArray[i].status;

+                                vm.vimInfo[n].errorInfo=alarmArray[i].alarmContent;

+                                break;

+                            } 

+							if(alarmArray[i].id==vm.vimInfo[n].oid && alarmArray[i].hostStorageInfo.length != ""){

+								vm.vimInfo[n].status= "inactive";

+                                vm.vimInfo[n].errorInfo = alarmArray[i].hostStorageInfo;

+                                break;

+							}

+

+                        }

+                    }

+

+                    setTimeout('resUtil.tooltipVimStatus()',5000);

+     });

+});

+

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/jqBootstrapValidation.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/jqBootstrapValidation.js
new file mode 100644
index 0000000..e590a09
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/jqBootstrapValidation.js
@@ -0,0 +1,927 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+/* jqBootstrapValidation

+ * A plugin for automating validation on Twitter Bootstrap formatted forms.

+ *

+ * v1.3.6

+ *

+ * License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file

+ *

+ * http://ReactiveRaven.github.com/jqBootstrapValidation/

+ */

+

+(function( $ ){

+

+	var createdElements = [];

+

+	var defaults = {

+		options: {

+			prependExistingHelpBlock: false,

+			sniffHtml: true, // sniff for 'required', 'maxlength', etc

+			preventSubmit: true, // stop the form submit event from firing if validation fails

+			submitError: false, // function called if there is an error when trying to submit

+			submitSuccess: false, // function called just before a successful submit event is sent to the server

+            semanticallyStrict: false, // set to true to tidy up generated HTML output

+			autoAdd: {

+				helpBlocks: true

+			},

+            filter: function () {

+                // return $(this).is(":visible"); // only validate elements you can see

+                return true; // validate everything

+            }

+		},

+    methods: {

+      init : function( options ) {

+

+        var settings = $.extend(true, {}, defaults);

+

+        settings.options = $.extend(true, settings.options, options);

+

+        var $siblingElements = this;

+

+        var uniqueForms = $.unique(

+          $siblingElements.map( function () {

+            return $(this).parents("form")[0];

+          }).toArray()

+        );

+

+        $(uniqueForms).bind("submit", function (e) {

+          var $form = $(this);

+          var warningsFound = 0;

+          var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter);

+          $inputs.trigger("submit.validation").trigger("validationLostFocus.validation");

+

+          $inputs.each(function (i, el) {

+            var $this = $(el),

+              $controlGroup = $this.parents(".control-group").first();

+            if (

+              $controlGroup.hasClass("warning")

+            ) {

+              $controlGroup.removeClass("warning").addClass("error");

+              warningsFound++;

+            }

+          });

+

+          $inputs.trigger("validationLostFocus.validation");

+

+          if (warningsFound) {

+            if (settings.options.preventSubmit) {

+              e.preventDefault();

+            }

+            $form.addClass("error");

+            if ($.isFunction(settings.options.submitError)) {

+              settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true));

+            }

+          } else {

+            $form.removeClass("error");

+            if ($.isFunction(settings.options.submitSuccess)) {

+              settings.options.submitSuccess($form, e);

+            }

+          }

+        });

+

+        return this.each(function(){

+

+          // Get references to everything we're interested in

+          var $this = $(this),

+            $controlGroup = $this.parents(".control-group").first(),

+            $helpBlock = $controlGroup.find(".help-block").first(),

+            $form = $this.parents("form").first(),

+            validatorNames = [];

+

+          // create message container if not exists

+          if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) {

+              $helpBlock = $('<div class="help-block" />');

+              $controlGroup.find('.controls').append($helpBlock);

+							createdElements.push($helpBlock[0]);

+          }

+

+          // =============================================================

+          //                                     SNIFF HTML FOR VALIDATORS

+          // =============================================================

+

+          // *snort sniff snuffle*

+

+          if (settings.options.sniffHtml) {

+            var message = "";

+            // ---------------------------------------------------------

+            //                                                   PATTERN

+            // ---------------------------------------------------------

+            if ($this.attr("pattern") !== undefined) {

+              message = "Not in the expected format<!-- data-validation-pattern-message to override -->";

+              if ($this.data("validationPatternMessage")) {

+                message = $this.data("validationPatternMessage");

+              }

+              $this.data("validationPatternMessage", message);

+              $this.data("validationPatternRegex", $this.attr("pattern"));

+            }

+            // ---------------------------------------------------------

+            //                                                       MAX

+            // ---------------------------------------------------------

+            if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) {

+              var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax"));

+              message = "Too high: Maximum of '" + max + "'<!-- data-validation-max-message to override -->";

+              if ($this.data("validationMaxMessage")) {

+                message = $this.data("validationMaxMessage");

+              }

+              $this.data("validationMaxMessage", message);

+              $this.data("validationMaxMax", max);

+            }

+            // ---------------------------------------------------------

+            //                                                       MIN

+            // ---------------------------------------------------------

+            if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) {

+              var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin"));

+              message = "Too low: Minimum of '" + min + "'<!-- data-validation-min-message to override -->";

+              if ($this.data("validationMinMessage")) {

+                message = $this.data("validationMinMessage");

+              }

+              $this.data("validationMinMessage", message);

+              $this.data("validationMinMin", min);

+            }

+            // ---------------------------------------------------------

+            //                                                 MAXLENGTH

+            // ---------------------------------------------------------

+            if ($this.attr("maxlength") !== undefined) {

+              message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters<!-- data-validation-maxlength-message to override -->";

+              if ($this.data("validationMaxlengthMessage")) {

+                message = $this.data("validationMaxlengthMessage");

+              }

+              $this.data("validationMaxlengthMessage", message);

+              $this.data("validationMaxlengthMaxlength", $this.attr("maxlength"));

+            }

+            // ---------------------------------------------------------

+            //                                                 MINLENGTH

+            // ---------------------------------------------------------

+            if ($this.attr("minlength") !== undefined) {

+              message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters<!-- data-validation-minlength-message to override -->";

+              if ($this.data("validationMinlengthMessage")) {

+                message = $this.data("validationMinlengthMessage");

+              }

+              $this.data("validationMinlengthMessage", message);

+              $this.data("validationMinlengthMinlength", $this.attr("minlength"));

+            }

+            // ---------------------------------------------------------

+            //                                                  REQUIRED

+            // ---------------------------------------------------------

+            if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) {

+              message = settings.builtInValidators.required.message;

+              if ($this.data("validationRequiredMessage")) {

+                message = $this.data("validationRequiredMessage");

+              }

+              $this.data("validationRequiredMessage", message);

+            }

+            // ---------------------------------------------------------

+            //                                                    NUMBER

+            // ---------------------------------------------------------

+            if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") {

+              message = settings.builtInValidators.number.message;

+              if ($this.data("validationNumberMessage")) {

+                message = $this.data("validationNumberMessage");

+              }

+              $this.data("validationNumberMessage", message);

+            }

+            // ---------------------------------------------------------

+            //                                                     EMAIL

+            // ---------------------------------------------------------

+            if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") {

+              message = "Not a valid email address<!-- data-validator-validemail-message to override -->";

+              if ($this.data("validationValidemailMessage")) {

+                message = $this.data("validationValidemailMessage");

+              } else if ($this.data("validationEmailMessage")) {

+                message = $this.data("validationEmailMessage");

+              }

+              $this.data("validationValidemailMessage", message);

+            }

+            // ---------------------------------------------------------

+            //                                                MINCHECKED

+            // ---------------------------------------------------------

+            if ($this.attr("minchecked") !== undefined) {

+              message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required<!-- data-validation-minchecked-message to override -->";

+              if ($this.data("validationMincheckedMessage")) {

+                message = $this.data("validationMincheckedMessage");

+              }

+              $this.data("validationMincheckedMessage", message);

+              $this.data("validationMincheckedMinchecked", $this.attr("minchecked"));

+            }

+            // ---------------------------------------------------------

+            //                                                MAXCHECKED

+            // ---------------------------------------------------------

+            if ($this.attr("maxchecked") !== undefined) {

+              message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required<!-- data-validation-maxchecked-message to override -->";

+              if ($this.data("validationMaxcheckedMessage")) {

+                message = $this.data("validationMaxcheckedMessage");

+              }

+              $this.data("validationMaxcheckedMessage", message);

+              $this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked"));

+            }

+          }

+

+          // =============================================================

+          //                                       COLLECT VALIDATOR NAMES

+          // =============================================================

+

+          // Get named validators

+          if ($this.data("validation") !== undefined) {

+            validatorNames = $this.data("validation").split(",");

+          }

+

+          // Get extra ones defined on the element's data attributes

+          $.each($this.data(), function (i, el) {

+            var parts = i.replace(/([A-Z])/g, ",$1").split(",");

+            if (parts[0] === "validation" && parts[1]) {

+              validatorNames.push(parts[1]);

+            }

+          });

+

+          // =============================================================

+          //                                     NORMALISE VALIDATOR NAMES

+          // =============================================================

+

+          var validatorNamesToInspect = validatorNames;

+          var newValidatorNamesToInspect = [];

+

+          do // repeatedly expand 'shortcut' validators into their real validators

+          {

+            // Uppercase only the first letter of each name

+            $.each(validatorNames, function (i, el) {

+              validatorNames[i] = formatValidatorName(el);

+            });

+

+            // Remove duplicate validator names

+            validatorNames = $.unique(validatorNames);

+

+            // Pull out the new validator names from each shortcut

+            newValidatorNamesToInspect = [];

+            $.each(validatorNamesToInspect, function(i, el) {

+              if ($this.data("validation" + el + "Shortcut") !== undefined) {

+                // Are these custom validators?

+                // Pull them out!

+                $.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) {

+                  newValidatorNamesToInspect.push(el2);

+                });

+              } else if (settings.builtInValidators[el.toLowerCase()]) {

+                // Is this a recognised built-in?

+                // Pull it out!

+                var validator = settings.builtInValidators[el.toLowerCase()];

+                if (validator.type.toLowerCase() === "shortcut") {

+                  $.each(validator.shortcut.split(","), function (i, el) {

+                    el = formatValidatorName(el);

+                    newValidatorNamesToInspect.push(el);

+                    validatorNames.push(el);

+                  });

+                }

+              }

+            });

+

+            validatorNamesToInspect = newValidatorNamesToInspect;

+

+          } while (validatorNamesToInspect.length > 0)

+

+          // =============================================================

+          //                                       SET UP VALIDATOR ARRAYS

+          // =============================================================

+

+          var validators = {};

+

+          $.each(validatorNames, function (i, el) {

+            // Set up the 'override' message

+            var message = $this.data("validation" + el + "Message");

+            var hasOverrideMessage = (message !== undefined);

+            var foundValidator = false;

+            message =

+              (

+                message

+                  ? message

+                  : "'" + el + "' validation failed <!-- Add attribute 'data-validation-" + el.toLowerCase() + "-message' to input to change this message -->"

+              )

+            ;

+

+            $.each(

+              settings.validatorTypes,

+              function (validatorType, validatorTemplate) {

+                if (validators[validatorType] === undefined) {

+                  validators[validatorType] = [];

+                }

+                if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) {

+                  validators[validatorType].push(

+                    $.extend(

+                      true,

+                      {

+                        name: formatValidatorName(validatorTemplate.name),

+                        message: message

+                      },

+                      validatorTemplate.init($this, el)

+                    )

+                  );

+                  foundValidator = true;

+                }

+              }

+            );

+

+            if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) {

+

+              var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]);

+              if (hasOverrideMessage) {

+                validator.message = message;

+              }

+              var validatorType = validator.type.toLowerCase();

+

+              if (validatorType === "shortcut") {

+                foundValidator = true;

+              } else {

+                $.each(

+                  settings.validatorTypes,

+                  function (validatorTemplateType, validatorTemplate) {

+                    if (validators[validatorTemplateType] === undefined) {

+                      validators[validatorTemplateType] = [];

+                    }

+                    if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) {

+                      $this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]);

+                      validators[validatorType].push(

+                        $.extend(

+                          validator,

+                          validatorTemplate.init($this, el)

+                        )

+                      );

+                      foundValidator = true;

+                    }

+                  }

+                );

+              }

+            }

+

+            if (! foundValidator) {

+              $.error("Cannot find validation info for '" + el + "'");

+            }

+          });

+

+          // =============================================================

+          //                                         STORE FALLBACK VALUES

+          // =============================================================

+

+          $helpBlock.data(

+            "original-contents",

+            (

+              $helpBlock.data("original-contents")

+                ? $helpBlock.data("original-contents")

+                : $helpBlock.html()

+            )

+          );

+

+          $helpBlock.data(

+            "original-role",

+            (

+              $helpBlock.data("original-role")

+                ? $helpBlock.data("original-role")

+                : $helpBlock.attr("role")

+            )

+          );

+

+          $controlGroup.data(

+            "original-classes",

+            (

+              $controlGroup.data("original-clases")

+                ? $controlGroup.data("original-classes")

+                : $controlGroup.attr("class")

+            )

+          );

+

+          $this.data(

+            "original-aria-invalid",

+            (

+              $this.data("original-aria-invalid")

+                ? $this.data("original-aria-invalid")

+                : $this.attr("aria-invalid")

+            )

+          );

+

+          // =============================================================

+          //                                                    VALIDATION

+          // =============================================================

+

+          $this.bind(

+            "validation.validation",

+            function (event, params) {

+

+              var value = getValue($this);

+

+              // Get a list of the errors to apply

+              var errorsFound = [];

+

+              $.each(validators, function (validatorType, validatorTypeArray) {

+                if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) {

+                  $.each(validatorTypeArray, function (i, validator) {

+                    if (settings.validatorTypes[validatorType].validate($this, value, validator)) {

+                      errorsFound.push(validator.message);

+                    }

+                  });

+                }

+              });

+

+              return errorsFound;

+            }

+          );

+

+          $this.bind(

+            "getValidators.validation",

+            function () {

+              return validators;

+            }

+          );

+

+          // =============================================================

+          //                                             WATCH FOR CHANGES

+          // =============================================================

+          $this.bind(

+            "submit.validation",

+            function () {

+              return $this.triggerHandler("change.validation", {submitting: true});

+            }

+          );

+          $this.bind(

+            [

+              "keyup",

+              "focus",

+              "blur",

+              "click",

+              "keydown",

+              "keypress",

+              "change"

+            ].join(".validation ") + ".validation",

+            function (e, params) {

+

+              var value = getValue($this);

+

+              var errorsFound = [];

+

+              $controlGroup.find("input,textarea,select").each(function (i, el) {

+                var oldCount = errorsFound.length;

+                $.each($(el).triggerHandler("validation.validation", params), function (j, message) {

+                  errorsFound.push(message);

+                });

+                if (errorsFound.length > oldCount) {

+                  $(el).attr("aria-invalid", "true");

+                } else {

+                  var original = $this.data("original-aria-invalid");

+                  $(el).attr("aria-invalid", (original !== undefined ? original : false));

+                }

+              });

+

+              $form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation");

+

+              errorsFound = $.unique(errorsFound.sort());

+

+              // Were there any errors?

+              if (errorsFound.length) {

+                // Better flag it up as a warning.

+                $controlGroup.removeClass("success error").addClass("warning");

+

+                // How many errors did we find?

+                if (settings.options.semanticallyStrict && errorsFound.length === 1) {

+                  // Only one? Being strict? Just output it.

+                  $helpBlock.html(errorsFound[0] + 

+                    ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));

+                } else {

+                  // Multiple? Being sloppy? Glue them together into an UL.

+                  $helpBlock.html("<ul role=\"alert\"><li>" + errorsFound.join("</li><li>") + "</li></ul>" +

+                    ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));

+                }

+              } else {

+                $controlGroup.removeClass("warning error success");

+                if (value.length > 0) {

+                  $controlGroup.addClass("success");

+                }

+                $helpBlock.html($helpBlock.data("original-contents"));

+              }

+

+              if (e.type === "blur") {

+                $controlGroup.removeClass("success");

+              }

+            }

+          );

+          $this.bind("validationLostFocus.validation", function () {

+            $controlGroup.removeClass("success");

+          });

+        });

+      },

+      destroy : function( ) {

+

+        return this.each(

+          function() {

+

+            var

+              $this = $(this),

+              $controlGroup = $this.parents(".control-group").first(),

+              $helpBlock = $controlGroup.find(".help-block").first();

+

+            // remove our events

+            $this.unbind('.validation'); // events are namespaced.

+            // reset help text

+            $helpBlock.html($helpBlock.data("original-contents"));

+            // reset classes

+            $controlGroup.attr("class", $controlGroup.data("original-classes"));

+            // reset aria

+            $this.attr("aria-invalid", $this.data("original-aria-invalid"));

+            // reset role

+            $helpBlock.attr("role", $this.data("original-role"));

+						// remove all elements we created

+						if (createdElements.indexOf($helpBlock[0]) > -1) {

+							$helpBlock.remove();

+						}

+

+          }

+        );

+

+      },

+      collectErrors : function(includeEmpty) {

+

+        var errorMessages = {};

+        this.each(function (i, el) {

+          var $el = $(el);

+          var name = $el.attr("name");

+          var errors = $el.triggerHandler("validation.validation", {includeEmpty: true});

+          errorMessages[name] = $.extend(true, errors, errorMessages[name]);

+        });

+

+        $.each(errorMessages, function (i, el) {

+          if (el.length === 0) {

+            delete errorMessages[i];

+          }

+        });

+

+        return errorMessages;

+

+      },

+      hasErrors: function() {

+

+        var errorMessages = [];

+

+        this.each(function (i, el) {

+          errorMessages = errorMessages.concat(

+            $(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : []

+          );

+        });

+

+        return (errorMessages.length > 0);

+      },

+      override : function (newDefaults) {

+        defaults = $.extend(true, defaults, newDefaults);

+      }

+    },

+		validatorTypes: {

+      callback: {

+        name: "callback",

+        init: function ($this, name) {

+          return {

+            validatorName: name,

+            callback: $this.data("validation" + name + "Callback"),

+            lastValue: $this.val(),

+            lastValid: true,

+            lastFinished: true

+          };

+        },

+        validate: function ($this, value, validator) {

+          if (validator.lastValue === value && validator.lastFinished) {

+            return !validator.lastValid;

+          }

+

+          if (validator.lastFinished === true)

+          {

+            validator.lastValue = value;

+            validator.lastValid = true;

+            validator.lastFinished = false;

+

+            var rrjqbvValidator = validator;

+            var rrjqbvThis = $this;

+            executeFunctionByName(

+              validator.callback,

+              window,

+              $this,

+              value,

+              function (data) {

+                if (rrjqbvValidator.lastValue === data.value) {

+                  rrjqbvValidator.lastValid = data.valid;

+                  if (data.message) {

+                    rrjqbvValidator.message = data.message;

+                  }

+                  rrjqbvValidator.lastFinished = true;

+                  rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message);

+                  // Timeout is set to avoid problems with the events being considered 'already fired'

+                  setTimeout(function () {

+                    rrjqbvThis.trigger("change.validation");

+                  }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst

+                }

+              }

+            );

+          }

+

+          return false;

+

+        }

+      },

+      ajax: {

+        name: "ajax",

+        init: function ($this, name) {

+          return {

+            validatorName: name,

+            url: $this.data("validation" + name + "Ajax"),

+            lastValue: $this.val(),

+            lastValid: true,

+            lastFinished: true

+          };

+        },

+        validate: function ($this, value, validator) {

+          if (""+validator.lastValue === ""+value && validator.lastFinished === true) {

+            return validator.lastValid === false;

+          }

+

+          if (validator.lastFinished === true)

+          {

+            validator.lastValue = value;

+            validator.lastValid = true;

+            validator.lastFinished = false;

+            $.ajax({

+              url: validator.url,

+              data: "value=" + value + "&field=" + $this.attr("name"),

+              dataType: "json",

+              success: function (data) {

+                if (""+validator.lastValue === ""+data.value) {

+                  validator.lastValid = !!(data.valid);

+                  if (data.message) {

+                    validator.message = data.message;

+                  }

+                  validator.lastFinished = true;

+                  $this.data("validation" + validator.validatorName + "Message", validator.message);

+                  // Timeout is set to avoid problems with the events being considered 'already fired'

+                  setTimeout(function () {

+                    $this.trigger("change.validation");

+                  }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst

+                }

+              },

+              failure: function () {

+                validator.lastValid = true;

+                validator.message = "ajax call failed";

+                validator.lastFinished = true;

+                $this.data("validation" + validator.validatorName + "Message", validator.message);

+                // Timeout is set to avoid problems with the events being considered 'already fired'

+                setTimeout(function () {

+                  $this.trigger("change.validation");

+                }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst

+              }

+            });

+          }

+

+          return false;

+

+        }

+      },

+			regex: {

+				name: "regex",

+				init: function ($this, name) {

+					return {regex: regexFromString($this.data("validation" + name + "Regex"))};

+				},

+				validate: function ($this, value, validator) {

+					return (!validator.regex.test(value) && ! validator.negative)

+						|| (validator.regex.test(value) && validator.negative);

+				}

+			},

+			required: {

+				name: "required",

+				init: function ($this, name) {

+					return {};

+				},

+				validate: function ($this, value, validator) {

+					return !!(value.length === 0  && ! validator.negative)

+						|| !!(value.length > 0 && validator.negative);

+				},

+        blockSubmit: true

+			},

+			match: {

+				name: "match",

+				init: function ($this, name) {

+					var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first();

+					element.bind("validation.validation", function () {

+						$this.trigger("change.validation", {submitting: true});

+					});

+					return {"element": element};

+				},

+				validate: function ($this, value, validator) {

+					return (value !== validator.element.val() && ! validator.negative)

+						|| (value === validator.element.val() && validator.negative);

+				},

+        blockSubmit: true

+			},

+			max: {

+				name: "max",

+				init: function ($this, name) {

+					return {max: $this.data("validation" + name + "Max")};

+				},

+				validate: function ($this, value, validator) {

+					return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative)

+						|| (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative);

+				}

+			},

+			min: {

+				name: "min",

+				init: function ($this, name) {

+					return {min: $this.data("validation" + name + "Min")};

+				},

+				validate: function ($this, value, validator) {

+					return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative)

+						|| (parseFloat(value) >= parseFloat(validator.min) && validator.negative);

+				}

+			},

+			maxlength: {

+				name: "maxlength",

+				init: function ($this, name) {

+					return {maxlength: $this.data("validation" + name + "Maxlength")};

+				},

+				validate: function ($this, value, validator) {

+					return ((value.length > validator.maxlength) && ! validator.negative)

+						|| ((value.length <= validator.maxlength) && validator.negative);

+				}

+			},

+			minlength: {

+				name: "minlength",

+				init: function ($this, name) {

+					return {minlength: $this.data("validation" + name + "Minlength")};

+				},

+				validate: function ($this, value, validator) {

+					return ((value.length < validator.minlength) && ! validator.negative)

+						|| ((value.length >= validator.minlength) && validator.negative);

+				}

+			},

+			maxchecked: {

+				name: "maxchecked",

+				init: function ($this, name) {

+					var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");

+					elements.bind("click.validation", function () {

+						$this.trigger("change.validation", {includeEmpty: true});

+					});

+					return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements};

+				},

+				validate: function ($this, value, validator) {

+					return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative)

+						|| (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative);

+				},

+        blockSubmit: true

+			},

+			minchecked: {

+				name: "minchecked",

+				init: function ($this, name) {

+					var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");

+					elements.bind("click.validation", function () {

+						$this.trigger("change.validation", {includeEmpty: true});

+					});

+					return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements};

+				},

+				validate: function ($this, value, validator) {

+					return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative)

+						|| (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative);

+				},

+        blockSubmit: true

+			}

+		},

+		builtInValidators: {

+			email: {

+				name: "Email",

+				type: "shortcut",

+				shortcut: "validemail"

+			},

+			validemail: {

+				name: "Validemail",

+				type: "regex",

+				regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}",

+				message: "Not a valid email address<!-- data-validator-validemail-message to override -->"

+			},

+			passwordagain: {

+				name: "Passwordagain",

+				type: "match",

+				match: "password",

+				message: "Does not match the given password<!-- data-validator-paswordagain-message to override -->"

+			},

+			positive: {

+				name: "Positive",

+				type: "shortcut",

+				shortcut: "number,positivenumber"

+			},

+			negative: {

+				name: "Negative",

+				type: "shortcut",

+				shortcut: "number,negativenumber"

+			},

+			number: {

+				name: "Number",

+				type: "regex",

+				regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?",

+				message: "Must be a number<!-- data-validator-number-message to override -->"

+			},

+			integer: {

+				name: "Integer",

+				type: "regex",

+				regex: "[+-]?\\\d+",

+				message: "No decimal places allowed<!-- data-validator-integer-message to override -->"

+			},

+			positivenumber: {

+				name: "Positivenumber",

+				type: "min",

+				min: 0,

+				message: "Must be a positive number<!-- data-validator-positivenumber-message to override -->"

+			},

+			negativenumber: {

+				name: "Negativenumber",

+				type: "max",

+				max: 0,

+				message: "Must be a negative number<!-- data-validator-negativenumber-message to override -->"

+			},

+			required: {

+				name: "Required",

+				type: "required",

+				message: "This is required<!-- data-validator-required-message to override -->"

+			},

+			checkone: {

+				name: "Checkone",

+				type: "minchecked",

+				minchecked: 1,

+				message: "Check at least one option<!-- data-validation-checkone-message to override -->"

+			}

+		}

+	};

+

+	var formatValidatorName = function (name) {

+		return name

+			.toLowerCase()

+			.replace(

+				/(^|\s)([a-z])/g ,

+				function(m,p1,p2) {

+					return p1+p2.toUpperCase();

+				}

+			)

+		;

+	};

+

+	var getValue = function ($this) {

+		// Extract the value we're talking about

+		var value = $this.val();

+		var type = $this.attr("type");

+		if (type === "checkbox") {

+			value = ($this.is(":checked") ? value : "");

+		}

+		if (type === "radio") {

+			value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : "");

+		}

+		return value;

+	};

+

+  function regexFromString(inputstring) {

+		return new RegExp("^" + inputstring + "$");

+	}

+

+  /**

+   * Thanks to Jason Bunting via StackOverflow.com

+   *

+   * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910

+   * Short link: http://tinyurl.com/executeFunctionByName

+  **/

+  function executeFunctionByName(functionName, context /*, args*/) {

+    var args = Array.prototype.slice.call(arguments).splice(2);

+    var namespaces = functionName.split(".");

+    var func = namespaces.pop();

+    for(var i = 0; i < namespaces.length; i++) {

+      context = context[namespaces[i]];

+    }

+    return context[func].apply(this, args);

+  }

+

+	$.fn.jqBootstrapValidation = function( method ) {

+

+		if ( defaults.methods[method] ) {

+			return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));

+		} else if ( typeof method === 'object' || ! method ) {

+			return defaults.methods.init.apply( this, arguments );

+		} else {

+		$.error( 'Method ' +  method + ' does not exist on jQuery.jqBootstrapValidation' );

+			return null;

+		}

+

+	};

+

+  $.jqBootstrapValidation = function (options) {

+    $(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments);

+  };

+

+})( jQuery );

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vim-validate.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vim-validate.js
new file mode 100644
index 0000000..5e3c9c9
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vim-validate.js
@@ -0,0 +1,116 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+/**

+ * Created by 10184303 on 15-11-17.

+ */

+var form = $('#vim_form');

+var error = $('.alert-danger', form);

+var success = $('.alert-success', form);

+form.validate({

+    doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.

+    errorElement: 'span', //default input error message container

+    errorClass: 'help-block', // default input error message class

+    focusInvalid: false, // do not focus the last invalid input

+    rules: {

+        url: {

+            required: true,

+            url:true,

+            maxlength:50

+            //,repeatedName: true

+        },

+        vimName:{

+            required: true,

+            maxlength:20

+        },

+        version:{

+            required: true,

+            maxlength:20

+        },

+        vendor:{

+            required: true,

+            maxlength:20

+        },

+        userName:{

+            required: true,

+            maxlength:20

+        },

+        password:{

+            required: true,

+            maxlength:20

+        },

+        tenant:{

+            required: true,

+            maxlength:20

+        }

+    },

+    messages: {

+        url: {

+            //required: $.i18n.prop('com_zte_ums_zenic_topology_connectmanager_enter_name')

+            required: $.i18n.prop('com_zte_ums_eco_roc_vim_auth_url_require_message'),

+            url: $.i18n.prop('com_zte_ums_eco_roc_vim_auth_url_alarm_message')

+        },

+        vimName:{

+            required: $.i18n.prop('com_zte_ums_eco_roc_vim_name_alarm_message')

+        },

+        userName:{

+            required: $.i18n.prop('com_zte_ums_eco_roc_vim_username_alarm_message')

+        },

+        password:{

+            required: $.i18n.prop('com_zte_ums_eco_roc_vim_password_alarm_message')

+        },

+         version:{

+            required: $.i18n.prop('com_zte_ums_eco_roc_vim_version_alarm_message')

+        },

+         vendor:{

+            required: $.i18n.prop('com_zte_ums_eco_roc_vim_vendor_alarm_message')

+        },

+        tenant:{

+            required: $.i18n.prop('com_zte_ums_eco_roc_vim_tenant_alarm_message')

+        }

+    },

+    errorPlacement: function (error, element) { // render error placement for each input type

+        error.insertAfter(element); // for other inputs, just perform default behavior

+    },

+

+    invalidHandler: function (event, validator) { //display error alert on form submit

+        success.hide();

+        error.show();

+        //ZteFrameWork.scrollTo(error, -200);

+    },

+

+    highlight: function (element) { // hightlight error inputs

+        $(element)

+            .closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group

+    },

+

+    unhighlight: function (element) { // revert the change done by hightlight

+        $(element)

+            .closest('.form-group').removeClass('has-error'); // set error class to the control group

+    },

+

+    success: function (label) {

+        label

+            .addClass('valid') // mark the current input as valid and display OK icon

+            .closest('.form-group').removeClass('has-error'); // set success class to the control group

+    },

+

+    submitHandler: function (form) {

+        success.show();

+        error.hide();

+        //add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax

+    }

+

+});

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimChart.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimChart.js
new file mode 100644
index 0000000..259f83d
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimChart.js
@@ -0,0 +1,383 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+var vimChart = {};

+

+

+

+ var labelTop = {

+    normal : {

+        label : {

+            show : true,

+            position : 'outer',

+            formatter :function (params){

+                var total=params.series.data[1].value+params.series.data[0].value;

+                var util=params.series.data[0].util;

+                // return total+util+"中的"+"\n"+params.value+util+"已使用" ;

+                return $.i18n.prop('com_zte_ums_eco_roc_vim_resource_chart_used')+params.value+util+"\n"+

+                $.i18n.prop('com_zte_ums_eco_roc_vim_resource_chart_total')+ total+util;

+            }, 

+            textStyle: {

+                baseline : 'bottom',

+                fontWeight:'normal'

+

+            }

+        },

+        labelLine : {

+            show : true

+        }

+    }

+};

+

+

+var labelFromatter = {

+    normal : {

+        label : {

+            formatter :function (params){

+                return params.series.data[0].name+"\n"+(100-params.percent).toFixed(0) + '%'

+            },  

+            textStyle: {

+                baseline : 'center',

+                  color:"#000",

+                  fontWeight:'bold'

+

+               

+            }

+        }

+    }

+}

+var labelBottom = {

+    normal : {

+        color: '#ccc',

+        label : {

+            show : true,

+            position : 'center'

+        },

+        labelLine : {

+            show : false

+        }

+    },

+    emphasis: {

+        color: 'rgba(0,0,0,0)'

+    }

+};

+

+var radius = [40, 55];

+

+ var vimPieChart;

+

+vimChart.vimPieChartInit = function(){

+   vimPieChart = echarts.init(document.getElementById('vimPieChartDiv')); 

+   vimPieChart.showLoading({

+    text : "Loading",

+    effect :"whirling",

+    textStyle : {

+        fontSize : 20

+    }

+});

+

+}

+

+vimChart.vimPieChart = function(data){

+ 

+var option = {

+    animation:true,

+    legend: {

+        x : 'left',

+        y:"top",

+        data:[

+            $.i18n.prop('com_zte_ums_eco_roc_vim_resource_vim_cpu'),

+            $.i18n.prop('com_zte_ums_eco_roc_vim_resource_vim_memory'),

+            $.i18n.prop('com_zte_ums_eco_roc_vim_resource_vim_disk')

+        ],

+        orient: 'vertical'

+    },

+     color:["#578ebe","#44b6ae","#DABA36"],

+    title : {

+        text: '',

+        subtext: '',

+        x: 'center'

+    },   

+    toolbox: {

+        show : true,

+

+        feature : {       

+            saveAsImage : {

+            show : true,

+            title : $.i18n.prop('com_zte_ums_eco_roc_vim_resource_chart_save_picture'),

+            type : 'png',

+            lang : [$.i18n.prop('com_zte_ums_eco_roc_vim_resource_chart_click_save')]

+            }

+        }

+    },

+    series : [

+        {

+            type : 'pie',

+            center : ['15%', '55%'],

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_vim_cpu'), value:data.usage.cpu,itemStyle : labelTop,util:''},

+                {name:'other', value:data.resource.cpu -data.usage.cpu, itemStyle : labelBottom}

+                

+            ]

+        },

+        {

+            type : 'pie',

+            center : ['40%', '55%'],

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_vim_memory'), value:data.usage.memoryMb,itemStyle : labelTop,util:'MB' },

+                {name:'other', value:data.resource.memoryMb - data.usage.memoryMb,itemStyle : labelBottom}

+                

+            ]

+        },

+        {

+            type : 'pie',

+            center : ['65%', '55%'],

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                 {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_vim_disk'), value:data.usage.diskGb,itemStyle : labelTop,util:'GB'},

+                {name:'other', value:data.resource.diskGb -data.usage.diskGb,  itemStyle : labelBottom}

+               

+            ]

+        }

+         

+    ]

+};

+                    

+

+        // 为echarts对象加载数据 

+    vimPieChart.hideLoading();

+    vimPieChart.setOption(option);

+    window.onresize = vimPieChart.resize;

+

+

+}

+

+vimChart.getPieCenter=function(n){

+    var center;

+    switch(n)

+    {

+    case 1:

+      center=['15%', '30%'];

+      break;

+    case 2:

+      center=['40%', '30%'];

+      break;

+    case 3:

+      center=['65%', '30%'];

+      break;

+    case 4:

+      center=['15%', '80%'];

+      break;

+    case 5:

+      center=['40%', '80%'];

+      break;

+    case 6:

+      center=['65%', '80%'];

+      break;  

+    case 7:

+      center=['90%', '80%'];

+      break;         

+

+    }

+    return center;

+}

+

+

+ var tenantPieChart;

+vimChart.tenantPieChartInit = function(){

+    tenantPieChart= echarts.init(document.getElementById('tenantPieChartDiv')); 

+

+   tenantPieChart.showLoading({

+    text : "Loading",

+    effect :"whirling",

+    textStyle : {

+        fontSize : 20

+    }

+});

+}

+vimChart.tenantPieChart = function(data){

+

+var  legend_data=new Array();

+var series=new Array();

+var n=0;

+

+if(data.quota.instances!=-1){

+    n++;

+

+legend_data.push($.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_instances'));

+var instances_series={

+            type : 'pie',

+            center : vimChart.getPieCenter(n),

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_instances'), value:data.usage.instances,itemStyle : labelTop,util:''},

+                {name:'other', value:data.quota.instances -data.usage.instances, itemStyle : labelBottom}

+                

+            ]

+        };

+ series.push(instances_series);     

+

+}   

+if(data.quota.cpu!=-1){

+n++;

+legend_data.push($.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_cpu'));

+var cpu_series={

+            type : 'pie',

+            center : vimChart.getPieCenter(n),

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_cpu'), value:data.usage.cpu,itemStyle : labelTop,util:'' },

+                {name:'other', value:data.quota.cpu -data.usage.cpu,itemStyle : labelBottom}

+                

+            ]

+        };

+ series.push(cpu_series);

+} 

+if(data.quota.memoryMb!=-1){

+  n++;    

+legend_data.push($.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_memoryMb'));

+var memoryMb_series={

+            type : 'pie',

+            center : vimChart.getPieCenter(n),

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                 {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_memoryMb'), value:data.usage.memoryMb,itemStyle : labelTop,util:'MB'},

+                {name:'other', value:data.quota.memoryMb -data.usage.memoryMb,  itemStyle : labelBottom}

+               

+            ]

+        };

+ series.push(memoryMb_series);

+} 

+if(data.quota.floatingIps!=-1){

+  n++;    

+legend_data.push($.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_floatingIps'));

+var floatingIps_series={

+            type : 'pie',

+            center :vimChart.getPieCenter(n),

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                 {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_floatingIps'), value:data.usage.floatingIps,itemStyle : labelTop,util:''},

+                {name:'other', value:data.quota.floatingIps -data.usage.floatingIps,  itemStyle : labelBottom}

+               

+            ]

+        };

+ series.push(floatingIps_series);

+} 

+if(data.quota.securityGroups!=-1){

+  n++;    

+legend_data.push($.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_securityGroups'));

+var securityGroups_series={

+            type : 'pie',

+            center :vimChart.getPieCenter(n),

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                 {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_securityGroups'), value:data.usage.securityGroups,itemStyle : labelTop,util:''},

+                 {name:'other', value:data.quota.securityGroups -data.usage.securityGroups,  itemStyle : labelBottom}

+               

+            ]

+        };

+ series.push(securityGroups_series);

+} 

+if(data.quota.volumes!=-1){

+  n++;    

+legend_data.push($.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_volumes'));

+var volumes_series={

+            type : 'pie',

+            center :vimChart.getPieCenter(n),

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                 {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_volumes'), value:data.usage.volumes,itemStyle : labelTop,util:''},

+                 {name:'other', value:data.quota.volumes -data.usage.volumes,  itemStyle : labelBottom}

+               

+            ]

+        };

+ series.push(volumes_series);

+} 

+if(data.quota.volumeStorage!=-1){

+  n++;    

+legend_data.push($.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_volumeStorage'));

+var volumeStorage_series={

+            type : 'pie',

+            center :vimChart.getPieCenter(n),

+            radius : radius,

+            itemStyle : labelFromatter,

+            data : [

+                 {name:$.i18n.prop('com_zte_ums_eco_roc_vim_resource_tenant_volumeStorage'), value:data.usage.volumeStorage,itemStyle : labelTop,util:'GB'},

+                 {name:'other', value:data.quota.volumeStorage -data.usage.volumeStorage,  itemStyle : labelBottom}

+               

+            ]

+        };

+ series.push(volumeStorage_series);

+} 

+

+

+var option = {

+    animation:true,

+    legend: {

+        x : 'left',

+        y:"top",

+        data:legend_data,

+        orient: 'vertical'

+    },

+     color:["#578ebe","#44b6ae","#DABA36","#F79695","#9699e0","#57b5e3","#48c79c"],

+    title : {

+        text: '',

+        subtext: '',

+        x: 'center'

+    },   

+    toolbox: {

+        show : true,       

+        feature : {       

+            saveAsImage : {

+            show : true,

+            title : $.i18n.prop('com_zte_ums_eco_roc_vim_resource_chart_save_picture'),

+            type : 'png',

+            lang : [$.i18n.prop('com_zte_ums_eco_roc_vim_resource_chart_click_save')]

+            }

+        }

+    },

+    series : series

+};

+                    

+      

+        // 为echarts对象加载数据 

+         tenantPieChart.hideLoading();

+         tenantPieChart.setOption(option);

+         window.onresize = tenantPieChart.resize;

+

+

+}

+

+vimChart.growl=function(message,type){

+      $.growl({

+        icon: "fa fa-envelope-o fa-lg",

+        title: "&nbsp;&nbsp;" + $.i18n.prop('com_zte_ums_eco_roc_vim_title_notice'),

+        message: message+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"

+            },{

+                type: type,

+				delay:0

+            });

+}
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimChartController.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimChartController.js
new file mode 100644
index 0000000..1e9126b
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimChartController.js
@@ -0,0 +1,162 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+var vm = avalon

+		.define({

+			$id : "vimChartController",

+			$vimChartUrl : '../../api/vim/v1/{vim_id}/resource',

+			$tenantChartUrl : '../../api/vim/v1/{vim_id}/resource/{tenant_name}',

+			$tenantListUrl : '../../api/vim/v1/{vim_id}/tenants',

+			$tenantRoleUrl : '../../api/vim/v1/{vim_id}/roles',

+			vimInfo:{

+				name:name,

+				id:id,

+				tenant:tenant,

+				isAdmin:true

+			},	

+			tenantSelectList:  {

+					condName : $.i18n.prop("com_zte_ums_eco_roc_vim_type"),

+					component_type : 'select',

+					selectItems : []

+			},

+			initChart : function() {

+

+				//判断租户是否有admin权限

+				var tenantRoleUrl=vm.$tenantRoleUrl.replace("{vim_id}",vm.vimInfo.id); 

+				 $.ajax({

+	                "type": 'get',

+	                "url": tenantRoleUrl,

+	                "dataType": "json",

+	                success: function (resp) {  

+	                     vm.vimInfo.isAdmin= (resp==null)?false:resp.isAdminRole; 

+	                                  	

+	                },

+	                 error: function(XMLHttpRequest, textStatus, errorThrown) {

+						   vimChart.growl("get [tenant Role] is error :"+textStatus+":"+errorThrown,"danger"); 

+	                 },

+	                  complete: function() { 

+	                  	if(vm.vimInfo.isAdmin==true){

+

+	                  		//获取全部资源使用情况 

+	                  		vm.vimChartLoad();

+

+	                  		 //获取租户列表

+	                  		vm.vimListLoad();

+	                  	}

+

+	                 }

+	            });

+				//获取租户资源使用情况 

+				vm.tenantChartLoad();

+			},

+			gotoVimPage:function(){

+					window.parent.ZteFrameWork.goToURLByIDAndNewAction('eco_roc_vimmgr');

+			},

+			vimListLoad:function(){

+				 var tenantListUrl=vm.$tenantListUrl.replace("{vim_id}",vm.vimInfo.id); 

+				 $.ajax({

+	                "type": 'get',

+	                "url": tenantListUrl,

+	                "dataType": "json",

+	                success: function (resp) {  

+	                      vm.tenantSelectList.selectItems= (resp==null)?[]:resp;               	

+	                },

+	                 error: function(XMLHttpRequest, textStatus, errorThrown) {

+						    vimChart.growl("get [tenant List] is error :"+textStatus+":"+errorThrown,"danger"); 

+	                 }

+	            });

+			},

+			vimChartLoad:function(){

+				var viminitData={

+					    "resource": {

+					        "cpu": 0,

+					        "memoryMb": 503,

+					        "diskGb": 9.8

+					    },

+					    "usage": {

+					        "cpu": 0,

+					        "memoryMb": 0,

+					        "diskGb": 0

+					    }

+					}

+

+				  vimChart.vimPieChartInit();

+

+				  var vimChartUrl=vm.$vimChartUrl.replace("{vim_id}",vm.vimInfo.id); 

+				  

+

+				 

+				 $.ajax({

+	                "type": 'get',

+	                "url": vimChartUrl,

+	                "dataType": "json",

+	                success: function (resp) {  

+	                     var vimData= (resp==null)?viminitData:resp;  

+	                     vimChart.vimPieChart(vimData);                	

+	                },

+	                 error: function(XMLHttpRequest, textStatus, errorThrown) {

+						   vimChart.growl("get [virtual machine manager resource using status] is error :"+textStatus+":"+errorThrown,"danger"); 

+	                 }

+	            });

+	

+			},

+			tenantChartLoad:function(){

+				 var tenantChartUrl=vm.$tenantChartUrl.replace("{vim_id}",vm.vimInfo.id).replace("{tenant_name}",vm.vimInfo.tenant);

+

+				var tenantinitData={

+						    "tenant_name": "",

+							"errormsg":"",

+						    "quota": {

+						        "cpu": 0,

+						        "memoryMb": 0,

+						        "instances": 0,

+						        "floatingIps": 0,

+						        "securityGroups": 0,

+						        "volumeStorage": 0,

+						        "volumes": 0

+						    },

+						    "usage": {

+						        "cpu": 0,

+						        "memoryMb": 0,

+						        "instances": 0,

+						        "floatingIps": 0,

+						        "securityGroups": 0,

+						        "volumeStorage": 0,

+								"volumes": 0

+						    }

+						};

+				vimChart.tenantPieChartInit();

+				 $.ajax({

+	                "type": 'get',

+	                "url": tenantChartUrl,

+	                "dataType": "json",

+	                success: function (resp) {  

+	                     var tenantData= (resp==null)?tenantinitData:resp;  

+						 if(tenantData.errormsg!=null)

+						 {

+						   vimChart.growl(tenantData.errormsg,"danger");

+						 }

+	                      vimChart.tenantPieChart(tenantData);                	

+	                },

+	                 error: function(XMLHttpRequest, textStatus, errorThrown) {

+						   vimChart.growl("get [tenant quota using status] occur error :"+textStatus+":"+errorThrown,"danger"); 

+	                 }

+	            });

+

+			}

+

+});

+avalon.scan();

+vm.initChart();
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimController.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimController.js
new file mode 100644
index 0000000..ccade47
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimController.js
@@ -0,0 +1,302 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+var vm = avalon

+		.define({

+			$id : "vimController",

+			vimInfo :  [],

+			//vimStatusTime:$.i18n.prop('com_zte_ums_eco_roc_vim_getting_info'),

+			// ifSearch : 0,

+			// server_rtn:{

+			// 	info_block:false,

+			// 	warning_block:false,

+			// 	rtn_info:"",

+			// 	$RTN_SUCCESS:"RTN_SUCCESS",

+			// 	$RTN_FAILED:"RTN_FAILED",

+   //              wait : $.i18n.prop('com_zte_ums_eco_roc_vim_checking_status')

+			// },

+             executeWait : {clazz : 'alert-info', visible : true, text : $.i18n.prop('com_zte_ums_eco_roc_vim_checking_status')},

+             executeError : {clazz : 'alert-danger', visible : true, text : 'error'},

+			$Status	:{

+                success:"active",

+                failed:"inactive",

+				displayActive: $.i18n.prop('com_zte_ums_eco_roc_vim_normal'),

+				displayInactive: $.i18n.prop('com_zte_ums_eco_roc_vim_abnormal')

+			},

+            isSave : true,

+            action : {ADD : 'add', UPDATE : 'update'},

+			$queryVimInfoUrl : '../../openoapi/extsys/v1/vims',

+            $addVimInfoUrl : '../../openoapi/extsys/v1/vims/',

+			$updateVimInfoUrl : '../../openoapi/extsys/v1/vims/',

+			$delVimInfoUrl : '../../openoapi/extsys/v1/vims/{vim_id}',

+			$initTable : function() {

+                $.ajax({

+                    "type": 'get',

+                    "url": vm.$queryVimInfoUrl,

+                    //"dataType": "json",

+                    "success": function (resp,statusText,jqXHR) {

+                       if(jqXHR.status=="200")

+                       {

+                         vm.vimInfo = resp;

+                       }

+                       else{

+                        vm.vimInfo=[];

+                        bootbox.alert($.i18n.prop("com_zte_ums_eco_roc_vim_growl_msg_query_failed"));

+                        return;

+                       }

+                    },

+                     error: function(XMLHttpRequest, textStatus, errorThrown) {

+                           bootbox.alert($.i18n.prop("com_zte_ums_eco_roc_vim_growl_msg_query_failed") + textStatus+":"+errorThrown);

+                           return;

+                     },

+                     complete: function() {

+                       resUtil.tooltipVimStatus();

+                     }

+                });

+				

+			},		 

+			$vimType:  {

+					condName : $.i18n.prop("com_zte_ums_eco_roc_vim_type"),

+					component_type : 'select',

+					selectItems : [

+							{

+								cond_value : 'vmware',

+								name : "vmware",

+								value : true

+							},

+							{

+								cond_value : 'openstack',

+								name :"openstack",

+								value : true

+							}

+							]

+				},

+			addVim : {

+				titleName: $.i18n.prop("com_zte_ums_eco_roc_vim_register_info"),

+                vimId : "",

+                vimName : "",

+                domain : '',

+				userName : "",

+                tenant : "",

+				password : "",               

+				url : "",

+				saveType :"add",

+				description : "",               

+                vimType :"openstack",

+                vendor :""

+			},

+        $showVimTable : function(el, action) {

+            vm.isSave = false;

+            if(vm.action.ADD == action){

+                vm.addVim.vimId = "";

+                vm.addVim.vimName = "";

+                vm.addVim.userName = "";

+                vm.addVim.password = "";

+                vm.addVim.url = "";

+                vm.addVim.domain = "";

+                vm.addVim.description = "";

+                vm.addVim.tenant = "";

+                vm.addVim.vendor = "";

+                vm.addVim.saveType = "add";

+                vm.addVim.vimType = "openstack";

+                vm.addVim.titleName = $.i18n.prop("com_zte_ums_eco_roc_vim_register_info");

+

+            } else {

+                vm.addVim.vimId = el.vimId;

+                vm.addVim.vimName = el.name;

+                vm.addVim.url = el.url;

+                vm.addVim.description = el.description;

+                vm.addVim.userName = el.userName;

+                vm.addVim.password = el.password;

+                vm.addVim.tenant = el.tenant;

+                vm.addVim.domain = el.domain;

+                vm.addVim.saveType = "update";

+                vm.addVim.titleName = $.i18n.prop('com_zte_ums_eco_roc_vim_modify_info');

+                vm.addVim.vimType = el.type;

+                vm.addVim.vendor = el.vendor;

+            }

+            vm.executeError.visible=false;

+            vm.executeWait.visible=false;

+            $(".form-group").each(function () {

+                $(this).removeClass('has-success');

+                $(this).removeClass('has-error');

+                $(this).find(".help-block[id]").remove();

+            });

+            $("#addVimDlg").modal("show");

+		},

+

+        $saveVimTable : function() {

+            vm.isSave = true;

+            success.hide();

+            error.hide();

+            if (form.valid() == false) {

+                vm.isSave = false;

+                return false;

+            }

+            vm.executeWait.visible = true;

+            vm.executeError.visible = false;

+            if(vm.addVim.saveType=="add") {

+                //不能重复添加

+				/*

+                for( var i = 0; i < vm.vimInfo.length; i ++ ){

+                    if(vm.addVim.url == vm.vimInfo[i].url){

+                        resUtil.growl($.i18n.prop("com_zte_ums_eco_roc_vim_growl_msg_title") +  'already exists',"info");

+                        $('#addVimDlg').modal('hide');

+                        return;

+                    }

+                }

+				*/

+                vm.persistVim();

+            } else if( vm.addVim.saveType == "update" ){

+                vm.updateVim();

+            }

+        },

+        //新增vim

+        persistVim : function(){

+            $.ajax({

+                type : "Post",

+                url : vm.$addVimInfoUrl,

+                data : JSON.stringify({

+                    name       : vm.addVim.vimName, 

+                    url        : vm.addVim.url,                 

+                    userName   : vm.addVim.userName,

+                    password   : vm.addVim.password,

+                    tenant     : vm.addVim.tenant,

+                    domain     : vm.addVim.domain,

+                    vendor     : vm.addVim.vendor,

+                    version    : vm.addVim.version, 

+                    description: vm.addVim.description,  

+                    type       : vm.addVim.vimType,                    

+                }),

+                async : false,

+                dataType : "json",

+                contentType : 'application/json',

+                success : function(data,statusText,jqXHR) {

+                    vm.executeWait.visible=false;

+                    vm.executeError.visible=false;

+                    if ( jqXHR.status=="201" ) {

+                        vm.addVim.vimId = data.vimId;                       

+                        vm.addVim.name = data.name;

+                        vm.addVim.tenant = data.tenant;

+                        vm.addVim.type = data.type;

+                        var newVim=jQuery.extend({}, vm.addVim);

+                        vm.vimInfo.push(newVim);

+

+                        $('#addVimDlg').modal('hide');

+                        resUtil.growl($.i18n.prop("com_zte_ums_eco_roc_vim_growl_msg_title") + $.i18n.prop("com_zte_ums_eco_roc_vim_growl_msg_save_success"),"success");

+					} else{

+						vm.executeError.visible=true;

+						vm.executeError.text = $.i18n.prop("com_zte_ums_eco_roc_vim_growl_msg_save_failed");

+                    }

+                },

+                error: function(XMLHttpRequest, textStatus, errorThrown) {

+                  vm.executeError.visible = true;

+                  vm.executeError.text = textStatus+":"+errorThrown;

+                  vm.executeWait.visible = false;

+				  vm.isSave = false;

+               }

+            });

+        },

+        //更新vim

+        updateVim : function(){

+            $.ajax({

+                type : "Put",

+                url : vm.$updateVimInfoUrl+vm.addVim.vimId,

+				contentType : 'application/json',

+                data : JSON.stringify({

+                    name : vm.addVim.vimName,

+                    userName : vm.addVim.userName,

+                    password : vm.addVim.password,

+                    domain   : vm.addVim.domain,

+                    version   : vm.addVim.version,

+                    description   : vm.addVim.description,

+                    url : vm.addVim.url,

+                    tenant:vm.addVim.tenant,

+                    type : vm.addVim.vimType,

+                    vendor : vm.addVim.vendor,

+                }),

+                dataType : "json",

+                async : false,

+                success : function(data,statusText,jqXHR) {

+                    vm.executeWait.visible=false;

+                    vm.executeError.visible=false;

+                    if (jqXHR.status=="200") {

+                        for(var i=0;i<vm.vimInfo.length;i++){

+                            if(vm.vimInfo[i].vimId == vm.addVim.vimId)

+                            {

+                                vm.vimInfo[i].name = vm.addVim.vimName;

+                                vm.vimInfo[i].userName = vm.addVim.userName;

+                                vm.vimInfo[i].password = vm.addVim.password;

+                                vm.vimInfo[i].url = vm.addVim.url;

+                                vm.vimInfo[i].tenant = vm.addVim.tenant;

+                                vm.vimInfo[i].domain = vm.addVim.domain;

+                                vm.vimInfo[i].description = vm.addVim.description;                               

+                                vm.vimInfo[i].type=vm.addVim.vimType;

+                            }

+                         }

+                        $('#addVimDlg').modal('hide');

+                     resUtil.growl($.i18n.prop('com_zte_ums_eco_roc_vim_growl_msg_title') + $.i18n.prop('com_zte_ums_eco_roc_vim_growl_msg_save_success'),"success");

+                    }

+                    else{

+                        vm.executeError.visible = true;

+                        vm.executeError.text = $.i18n.prop('com_zte_ums_eco_roc_vim_growl_msg_save_failed');

+                    }

+                },

+                error: function(XMLHttpRequest, textStatus, errorThrown) {

+                    vm.isSave = false;

+                    vm.executeError.visible=true;

+                    vm.executeError.text = textStatus+":"+errorThrown;

+                    vm.executeWait.visible = false;

+               }

+            });

+        },

+        delVim : function(el){

+            bootbox.confirm($.i18n.prop('com_zte_ums_eco_roc_vim_confirm_delete_vim_record'),function(result){

+                if(result){

+                    $.ajax({

+                        type : "DELETE",

+                        url : vm.$delVimInfoUrl.replace('{vim_id}', el.vimId),

+                        success : function(data,statusText,jqXHR) {

+                            if( jqXHR.status=="204")

+                            {

+                                for(var i=0;i<vm.vimInfo.length;i++){

+                                    if(el.vimId == vm.vimInfo[i].vimId){

+                                        vm.vimInfo.splice(i, 1);

+                                        break;

+                                    }

+                                }

+                                resUtil.growl($.i18n.prop('com_zte_ums_eco_roc_vim_growl_msg_title') + $.i18n.prop('com_zte_ums_eco_roc_vim_growl_msg_remove_success'),"success");

+                            }

+                            else{

+                                resUtil.growl($.i18n.prop('com_zte_ums_eco_roc_vim_growl_msg_title') + $.i18n.prop('com_zte_ums_eco_roc_vim_growl_msg_remove_failed'),"warning");

+                            }

+                        },

+                        error: function(XMLHttpRequest, textStatus, errorThrown) {

+                            resUtil.growl($.i18n.prop('com_zte_ums_eco_roc_vim_growl_msg_title') +  errorThrown, "danger");

+                        }

+                    });

+                }

+            });

+        },

+        gotoChartPage:function(oid,name,tenant){

+            window.location.href = "vimChart.html?"+oid+"&"+name+"&"+tenant;

+        }

+});

+avalon.scan();

+vm.$initTable();

+

+

+

+

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimUtil.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimUtil.js
new file mode 100644
index 0000000..bab4f3b
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/js/vimUtil.js
@@ -0,0 +1,51 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+var resUtil = {};

+

+resUtil.tooltipVimStatus=function(){

+ $("[data-toggle='tooltip']").tooltip();

+

+}

+

+resUtil.growl=function(message,type){

+    $.growl({

+        icon: "fa fa-envelope-o fa-lg",

+        title: "&nbsp;&nbsp;Notice: ",

+        message: message+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"

+    },{

+        type: type

+    });

+    /*

+    $.bootstrapGrowl(message, {

+        ele: 'body', // which element to append to

+        type: type, // (null, 'info', 'danger', 'success')

+        offset: {from: 'bottom', amount: 20}, // 'top', or 'bottom'

+        align: 'right', // ('left', 'right', or 'center')

+        width: 'auto', // (integer, or 'auto')

+        delay: 3000, // Time while the message will be displayed. It's not equivalent to the *demo* timeOut!

+        allow_dismiss: false, // If true then will display a cross to close the popup.

+        stackup_spacing: 10 // spacing between consecutively stacked growls.

+    });

+    */

+}

+

+

+

+

+

+

+

+

diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/vimChart.html b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/vimChart.html
new file mode 100644
index 0000000..1bb1373
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/vimChart.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>

+<!--

+

+Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+

+Licensed under the Apache License, Version 2.0 (the "License");

+you may not use this file except in compliance with the License.

+You may obtain a copy of the License at

+

+    http://www.apache.org/licenses/LICENSE-2.0

+

+Unless required by applicable law or agreed to in writing, software

+distributed under the License is distributed on an "AS IS" BASIS,

+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+See the License for the specific language governing permissions and

+limitations under the License.

+

+-->

+<html>

+<head lang="en">

+<meta charset="UTF-8">

+<title></title>

+<link href="../component/thirdparty/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"/>

+<link href="../component/thirdparty/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>

+<link href="../framework/css/ngict-component.css" rel="stylesheet" type="text/css">

+<link href="../component/css/ZteIctIcons/style.css" rel="stylesheet" type="text/css">

+<link href="../vendor/animate/animate.min.css" rel="stylesheet" type="text/css" />

+<link href="./css/vimChart.css" rel="stylesheet" type="text/css"/>

+<style>

+.ms-controller {

+	visibility: hidden

+}

+</style>

+<script>

+var id,name,tenant;

+  if (window.location.search && window.location.search.length > 1) {

+    var arr=window.location.search.split("&");

+        id = arr[0].replace("?","");

+        name = arr[1];

+        tenant = arr[2];

+    }

+</script>

+</head>

+<body>

+<div class="ms-controller" ms-controller="vimChartController">

+ <div class="container-fluid">

+

+  <div class="row" style=" margin-top: 15px;">

+         <div class="col-xs-6 col-md-6 col-sm-6 col-lg-6 titlefont">

+          {{vimInfo.name}}<span  id_i18n="com_zte_ums_eco_roc_vim_resource_use" name_i18n="com_zte_conductor_ui_i18n"></span>

+         </div>  

+         <div class="pull-right">  

+          <a href="#" ms-click="gotoVimPage()" id_i18n="com_zte_ums_eco_roc_vim_resource_chart_return" name_i18n="com_zte_conductor_ui_i18n"></a>

+

+         </div>      

+   </div>

+   <div class="separator-line"></div>

+

+    <div class="row row-fluid">

+

+ <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 " ms-if="vimInfo.isAdmin==true" >

+

+ <div class="form-body">

+      <div class="form-title">

+        <span id_i18n="com_zte_ums_eco_roc_vim_resource_vim_use" name_i18n="com_zte_conductor_ui_i18n"></span>

+      </div>

+      <div  id="vimPieChartDiv" style="width:100%;height:200px" class="main"></div>

+                  

+      </div>  

+  </div>

+

+        

+

+   <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 " >

+   <div class="form-body">

+      <div class="form-title">

+        {{vimInfo.tenant}}<span id_i18n="com_zte_ums_eco_roc_vim_resource_tenant_use" name_i18n="com_zte_conductor_ui_i18n"></span>

+        <div class="pull-right">

+         <select class="form-control m-b" ms-if="vimInfo.isAdmin==true"  ms-each="tenantSelectList.selectItems"   ms-duplex="vimInfo.tenant" ms-change="tenantChartLoad()">             

+                            <option ms-attr-value='el.name'>{{el.name}}</option>

+                        </select>

+

+        

+         </div>

+      </div>

+    

+      <div  id="tenantPieChartDiv" style="width:100%;height:400px" class="main"></div>

+                  

+      </div> 

+     

+   </div>

+

+    </div>

+

+ </div>

+

+

+</div>

+

+<script type="text/javascript" src="../component/thirdparty/jquery/jquery-1.10.2.min.js"></script>

+<script type="text/javascript" src="../framework/js/tools.js"></script>

+<script type="text/javascript" src="../component/thirdparty/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>

+<script type="text/javascript" src="../component/thirdparty/bootstrap/js/bootstrap.min.js"></script>

+<script src="../vendor/bootstrap-growl/bootstrap-growl.min.js"></script>

+<script type="text/javascript" src="./i18n/loadi18nApp.js"></script> 

+<script src="../vendor/echarts/echarts-all.js"></script>

+<script type="text/javascript" src="../component/thirdparty/bootbox/bootbox.min.js"></script>

+<script src="../vendor/avalon/avalon.js"></script>

+<script type="text/javascript" src="./js/vimChart.js"></script>

+<script type="text/javascript" src="./js/vimChartController.js"></script>

+<script type="text/javascript" src="../framework/js/core/hk.min.js" ></script>

+</body>

+</html>
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vim/vimView.html b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/vimView.html
new file mode 100644
index 0000000..b638cac
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vim/vimView.html
@@ -0,0 +1,242 @@
+<!DOCTYPE html>

+<!--

+

+Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+

+Licensed under the Apache License, Version 2.0 (the "License");

+you may not use this file except in compliance with the License.

+You may obtain a copy of the License at

+

+    http://www.apache.org/licenses/LICENSE-2.0

+

+Unless required by applicable law or agreed to in writing, software

+distributed under the License is distributed on an "AS IS" BASIS,

+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+See the License for the specific language governing permissions and

+limitations under the License.

+

+-->

+<html>

+<head lang="en">

+<meta charset="UTF-8">

+<title></title>

+<link href="../component/thirdparty/font-awesome/css/font-awesome.min.css" rel="stylesheet"/>

+<link href="../component/thirdparty/bootstrap/css/bootstrap.min.css" rel="stylesheet"/>

+<link href="../component/thirdparty/uniform/css/uniform.default.css" rel="stylesheet"/>

+<link href="../framework/css/ngict-component.css" rel="stylesheet" type="text/css">

+<link href="../component/css/ZteIctIcons/style.css" rel="stylesheet" type="text/css">

+<link href="./css/vim.css" rel="stylesheet" type="text/css"/>

+<link href="./css/skill.css" rel="stylesheet" type="text/css"/>

+<link href="../vendor/animate/animate.min.css" rel="stylesheet" type="text/css"/>

+

+

+<style>

+.ms-controller {

+	visibility: hidden

+}

+</style>

+

+</head>

+<body>

+<div class="ms-controller container-fluid" ms-controller="vimController">

+

+<div id="addVimDlg" class="modal  fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" >

+		<div class="modal-dialog">

+			<div class="modal-content Changepasswd">

+				<div class="content">

+					<div class="modal-header">

+						<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>

+						<h4 id="myModalLabel" ms-text="addVim.titleName"></h4>

+					</div>

+                    <!-- modal body begin-->

+					<div class="modal-body">

+					<div class="alert alert-info" ms-visible="executeWait.visible">{{executeWait.text}}</div>

+					<div class="alert alert-danger " ms-visible="executeError.visible">{{executeError.text}}</div>

+

+					<form class="form-horizontal" id="vim_form" role="form">

+						<input type="hidden" ms-duplex="addVim.vimId"  name="vimId" class="form-control"/>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+                                <span id_i18n="com_zte_ums_eco_roc_vim_name" name_i18n="com_zte_conductor_ui_i18n"></span>

+                                <span class="required" aria-required="true">*</span>

+							</label>

+						 	<div class="col-sm-7">

+								<input type="text" ms-duplex="addVim.vimName"  name="vimName" class="form-control"/>

+								<span class="help-block"></span>

+							</div>

+						</div>

+						 <div class="form-group">

+                            <label class="control-label col-sm-3">

+                                <span id_i18n="com_zte_ums_eco_roc_vim_auth_url" name_i18n="com_zte_conductor_ui_i18n"></span>

+                                <span class="required" aria-required="true">*</span>

+                            </label>

+							 <div class="col-sm-7">

+								<input type="text" ms-duplex="addVim.url" placeholder="http://xx.xx.xx.xx:5000/v2.0" name="url" class="form-control"/> 

+								<span class="help-block"></span>			

+							</div>

+							

+						</div>

+						 <div class="form-group">

+								<label class="control-label col-sm-3">

+									<span id_i18n="com_zte_ums_eco_roc_vim_username" name_i18n="com_zte_conductor_ui_i18n"></span>

+									<span class="required" aria-required="true">*</span>

+								</label>

+							 <div class="col-sm-7">

+								<input type="text" ms-duplex="addVim.userName" name="userName" class="form-control" /> 

+								<span class="help-block"></span>			

+							</div>

+						</div>

+

+						 <div class="form-group">

+								<label class="control-label col-sm-3">

+									<span id_i18n="com_zte_ums_eco_roc_vim_password" name_i18n="com_zte_conductor_ui_i18n"></span>

+									<span class="required" aria-required="true">*</span>

+								</label>

+							 <div class="col-sm-7">

+								<input type="password" ms-duplex="addVim.password"  name="password"  class="form-control" /> 

+								<span class="help-block"></span>			

+							</div>

+						</div>

+						<div class="form-group">

+								<label class="control-label col-sm-3">

+									<span id_i18n="com_zte_ums_eco_roc_vim_tenant" name_i18n="com_zte_conductor_ui_i18n"></span>

+									<span class="required" aria-required="true">*</span>

+								</label>

+							 <div class="col-sm-7">

+								<input type="text" ms-duplex="addVim.tenant"  name="tenant"  class="form-control" />

+								<span class="help-block"></span>			

+							</div>							

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id_i18n="com_zte_ums_eco_roc_vim_version" name_i18n="com_zte_conductor_ui_i18n"></span>

+								<span class="required" aria-required="true">*</span>

+								</label>

+							 <div class="col-sm-7">

+								<input type="text" ms-duplex="addVim.version"  name="version"  class="form-control" />

+								<span class="help-block"></span>			

+							</div>							

+						</div>			

+						<div class="form-group">

+                            <label class="control-label col-sm-3">

+                                <span id_i18n="com_zte_ums_eco_roc_vim_vendor" name_i18n="com_zte_conductor_ui_i18n"></span>

+                                <span class="required" aria-required="true">*</span>

+                            </label>

+							 <div class="col-sm-7">

+								<input type="text" ms-duplex="addVim.vendor"  name="vendor"  class="form-control" /> 

+								<span class="help-block"></span>			

+							</div>							

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id_i18n="com_zte_ums_eco_roc_vim_domain" name_i18n="com_zte_conductor_ui_i18n"></span>								

+								</label>

+							 <div class="col-sm-7">

+								<input type="text" ms-duplex="addVim.domain"  name="domain"  class="form-control" />

+								<span class="help-block"></span>			

+							</div>							

+						</div>	

+						 <div class="form-group">

+                            <label class="control-label col-sm-3">

+                                <span id_i18n="com_zte_ums_eco_roc_vim_type" name_i18n="com_zte_conductor_ui_i18n"></span>

+                                <span class="required" aria-required="true">*</span>

+                            </label>

+							<div class="col-sm-7">

+                                <select id="vimTypeSelect"  ms-each="$vimType.selectItems" ms-duplex="addVim.vimType" >

+                                    <option ms-attr-value='el.cond_value'>{{el.name}}</option>

+                                </select>

+                                <span class="help-block"></span>

+							</div>

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id_i18n="com_zte_ums_eco_roc_vim_description" name_i18n="com_zte_conductor_ui_i18n"></span>

+								<span class="" aria-required="" style="visibility: hidden;">*</span>

+								</label>

+							 <div class="col-sm-7">

+								<textarea class="form-control" rows="3"  ms-duplex="addVim.description"  name="description"></textarea>

+								<span class="help-block"></span>			

+							</div>							

+						</div>

+					</form>

+					</div>

+                    <!-- modal body end-->

+					<div class="modal-footer">

+						<button class="btn" data-dismiss="modal" aria-hidden="true"><span id_i18n="com_zte_ums_eco_roc_vim_cancel" name_i18n="com_zte_conductor_ui_i18n"></span></button>

+						<button class="btn btn-primary" type="submit" ms-disabled="isSave" ms-click="$saveVimTable()"><span id_i18n="com_zte_ums_eco_roc_vim_save" name_i18n="com_zte_conductor_ui_i18n"></span></button>

+					</div>

+				</div>

+

+			</div>

+		</div>

+	</div>

+

+		<div class="row-fluid col-sm-12" data-name="cond_zone">

+            <div class="col-sm-4">

+                <button class= "btn white radius_l" id="app-new-btn"  ms-click="$showVimTable('', 'add')">

+                    <i class="ict-new"></i> <span id_i18n="com_zte_ums_eco_roc_vim_register" name_i18n="com_zte_conductor_ui_i18n"></span>

+                </button>

+            </div>

+           <!-- <div class="fa fa-refresh text-muted refresh-status-text"><small><span id_i18n="com_zte_ums_eco_roc_vim_status_update_time" name_i18n="com_zte_conductor_ui_i18n"></span></small><small ms-text="vimStatusTime"></small></div>-->

+        </div>

+

+    <div class="row-fluid col-sm-12 " ms-each-el="vimInfo">

+		<div class="col-sm-4 animated-panel zoomIn" style="-webkit-animation-delay: 0.1s;">

+                <div class="hpanel stats" >

+				

+                    <div class="panel-body h-200" ms-hover="hpanel_show">

+                        <div class="pull-left">

+                            <span class="label label-success"  ms-text="$Status.displayActive"></span>

+                        </div>

+                        <div class="stats-icon pull-right">

+                            <i class="fa fa-cloud  fa-5x color_cloud"></i>

+                        </div>

+                        <div class="m-t-xl">

+                            <h3 ms-text="el.name"></h3>   

+                            <div class="font">  

+                                <span id_i18n="com_zte_ums_eco_roc_vim_display_type" name_i18n="com_zte_conductor_ui_i18n"></span>

+                                <span ms-text="el.type"></span>

+                   			 </div>             

+                            <div  ms-text="el.url"></div>

+                         </div>

+                    </div>					

+                    <div class="panel-footer">

+                        <div  class="pull-right">

+                         <a class="btn btn-default btn-sm" ms-click="$showVimTable(el, 'update')"><i class="fa fa-pencil-square-o fa-lg"></i></a>

+                         <a class="btn btn-default btn-sm" ms-click="delVim(el)"><i class="fa fa-trash-o fa-lg"> </i></a>

+                         <!--<a class="btn btn-default btn-sm" ms-click="gotoChartPage(el.oid,el.name,el.user)"><i class="fa fa-pie-chart fa-lg"> </i></a>-->

+                        </div>

+                    </div>

+                </div>

+            </div>

+          

+    </div>

+    <div class="row-fluid">

+			<div class="col-md-12">

+	         <div class="pull-left text-muted"><small><span id_i18n="com_zte_ums_eco_roc_vim_total" name_i18n="com_zte_conductor_ui_i18n"></span> 

+			 <span class="blue-font" ms-text="vimInfo.size()"></span> 

+			 <span id_i18n="com_zte_ums_eco_roc_vim_metric" name_i18n="com_zte_conductor_ui_i18n"></span></small></div>  

+			</div>

+	</div>

+		

+	</div>

+<script type="text/javascript" src="../component/thirdparty/jquery/jquery-1.10.2.min.js"></script>

+<script type="text/javascript" src="../framework/js/tools.js"></script>

+<script type="text/javascript" src="../component/thirdparty/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>

+<script type="text/javascript" src="../framework/js/json2.js"></script>

+<script type="text/javascript" src="../component/thirdparty/bootstrap/js/bootstrap.min.js"></script>

+<script type="text/javascript" src="../component/thirdparty/jquery-validation/js/jquery.validate.js"></script>

+<script type="text/javascript" src="../component/thirdparty/jquery-validation/js/additional-methods.min.js"></script>

+<script type="text/javascript" src="../component/thirdparty/bootbox/bootbox.min.js"></script>

+<!--<script type="text/javascript" src="../component/thirdparty/cometd/cometd.js"></script>-->

+<!--<script type="text/javascript" src="../component/thirdparty/cometd/jquery/jquery.cometd.js"></script>-->

+<script type="text/javascript" src="js/loadi18nApp.js"></script> 

+<script type="text/javascript" src="js/vim-validate.js"></script>

+<!--<script type="text/javascript" src="./js/client-cometd.js"></script>-->

+<script src="../vendor/avalon/avalon.js"></script>

+<script type="text/javascript" src="js/vimUtil.js"></script>

+<script type="text/javascript" src="js/vimController.js"></script>

+<script src="../vendor/bootstrap-growl/bootstrap-growl.min.js"></script>

+<script type="text/javascript" src="../framework/js/core/hk.min.js" ></script>

+</body>

+</html>
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/css/animate.min.css b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/css/animate.min.css
new file mode 100644
index 0000000..b007c1b
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/css/animate.min.css
@@ -0,0 +1,21 @@
+/**

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+@charset "UTF-8";/*!

+Animate.css - http://daneden.me/animate

+Licensed under the MIT license - http://opensource.org/licenses/MIT

+

+Copyright (c) 2014 Daniel Eden

+*/.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);-ms-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);-ms-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);-ms-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);-ms-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);-ms-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);-ms-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);-ms-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);-ms-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);-ms-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);-ms-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);-ms-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);-ms-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);-ms-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);-ms-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);-ms-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);-ms-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);-ms-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);-ms-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;-ms-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);-ms-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);-ms-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);-ms-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);-ms-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);-ms-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);-ms-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);-ms-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);-ms-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);-ms-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);-ms-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);-ms-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);-ms-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);-ms-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);-ms-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);-ms-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);-ms-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);-ms-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);-ms-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);-ms-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);-ms-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);-ms-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);-ms-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);-ms-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);-ms-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);-ms-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);-ms-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);-ms-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);-ms-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);-ms-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);-ms-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-ms-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-ms-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);-ms-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;-ms-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-ms-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);-ms-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);-ms-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);-ms-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-ms-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);-ms-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);-ms-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);-ms-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);-ms-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);-ms-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);-ms-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);-ms-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);-ms-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);-ms-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0,0,1,45deg);transform:rotate(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0,0,1,45deg);-ms-transform:rotate(0,0,1,45deg);transform:rotate(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);-ms-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);-ms-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);-ms-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);-ms-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);-ms-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);-ms-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-ms-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-ms-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);-ms-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);-ms-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/css/vnfm.css b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/css/vnfm.css
new file mode 100644
index 0000000..c4b588b
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/css/vnfm.css
@@ -0,0 +1,492 @@
+/**

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+body {

+	font-family: microsoft yahei !important;

+}

+

+/* blue pill (inspired by iTunes)

+*******************************************************************************/

+

+.grey {

+  background-color: #e5e5e5;

+  color: #333;

+}

+

+.blue {

+

+	background-color: #5b9bd1;

+	border-radius: 20px;

+	color: #fff;

+	font-weight: bold;

+	padding: 8px 0;

+	text-align: center;

+	width: 100px;

+}

+

+.blue:hover {

+	background-color: #e8f3fd;

+	color: #5b9bd1;

+}

+

+.blue.selected {

+	border: 0;

+	background-color: #5b9bd1;

+	color: #fff;

+}

+

+.blue.selected:hover {

+	border: 0;

+	background-color: #5b9bd1;

+	color: #fff;

+}

+

+p {

+	color: #444;

+	font-size: 14px;

+	font-weight: normal;

+	line-height: 21px;

+	margin: 0 0 12px 0;

+}

+

+p.credit {

+	border-top: 1px solid #ccc;

+	font-size: 14px;

+	line-height: 140%;

+	margin: 36px 0 12px 0;

+	padding: 8px 0 0 0;

+	text-align: center;

+}

+

+ul.column {

+	float: left;

+	list-style: none;

+	width: 675px;

+}

+

+ul.column li {

+	background: #eee;

+	-webkit-border-radius: 5px;

+	border-radius: 5px;

+	-webkit-box-shadow: inset 0 1px 1px 0 #c7c7c7;

+	box-shadow: inset 0 1px 1px 0 #c7c7c7;

+	float: left;

+	margin: 10px 0 0 10px;

+	display: block;

+	height: 150px;

+	text-align: center;

+	width: 215px;

+}

+

+/* Clear Floated Elements

+------------------------------------------------------------------------------*/

+.column:after,.button-collection:after,.clearfix:after,div.project-info:after

+	{

+	clear: both;

+	content: ' ';

+	display: block;

+	font-size: 0;

+	line-height: 0;

+	visibility: hidden;

+	width: 0;

+	height: 0;

+}

+

+.container-fluid {

+	background-color:white !important;

+	min-height:500px;

+}

+

+.nav-tabs {

+	border: 0;

+}

+

+.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus

+	{

+	border: 0;

+	border-top: 3px solid #F3565D;

+}

+

+.nav-tabs>li>a {

+	border-radius: 0;

+}

+

+.nav-tabs>li>a:hover {

+	background-color: #f1f3fa;

+	border: 1Px solid #f1f3fa;

+}

+

+.c3 {

+	margin-top: 120px;

+}

+

+.skills-chart-breadcrumb {

+	

+}

+

+.blue:selected {

+	border: 0;

+	background-color: #5b9bd1;

+}

+

+.btn {

+	/* border-width: 0; */

+	/* padding: 7px 14px; */

+	/* font-size: 14px; */

+	/* outline: none !important; */

+	/* background-image: none !important; */

+	/* filter: none; */

+	/* -webkit-box-shadow: none; */

+	-moz-box-shadow: none;

+	/* box-shadow: none; */

+	/* text-shadow: none; */

+}

+

+select {

+	border-width: 1px;

+	padding: 4px 1px;

+	border-radius: 4px;

+}

+

+.input-sm {

+	padding: 4px 10px;

+}

+

+.btn-block {

+	display: block;

+	width: 100%;

+	padding-left: 0;

+	padding-right: 0;

+}

+

+/* Bootstrap buttons */

+

+

+.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active

+	{

+	color: #333;

+	background-color: #ededed;

+	border-color: #b3b3b3;

+}

+

+.open .btn-default.dropdown-toggle {

+	color: #333;

+	background-color: #ededed;

+	border-color: #b3b3b3;

+}

+

+.btn-default:active,.btn-default.active {

+	background-image: none;

+	background-color: #e0e0e0;

+	font-weight: bold;

+}

+

+.btn-default:active:hover,.btn-default.active:hover {

+	background-color: #e6e6e6;

+}

+

+.open .btn-default.dropdown-toggle {

+	background-image: none;

+}

+

+.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default[disabled].active,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active

+	{

+	background-color: #fff;

+	border-color: #ccc;

+}

+

+.btn-default .badge {

+	color: #fff;

+	background-color: #333;

+}

+

+

+.btn-default>i[class^="icon-"],.btn-default>i[class*="icon-"] {

+	color: #8c8c8c;

+}

+

+div[data-name="tab_zone"] div {

+	background-color: #f1f3fa;

+	padding: 0px;

+}

+

+div[data-name="cond_zone"] div {

+	background-color: #fff;

+	margin-top: 15px;

+	margin-bottom: 15px;

+}

+

+div[data-name="res-conds-zone"] {

+	display: inline;

+}

+

+div[data-name="res-conds-zone"] select,div[data-name="res-conds-zone"] span

+	{

+	/**height:33px;*/

+	margin-left: 15px;

+	color: #5b9bd1;

+	border-color: #ccc;

+	font-weight: bold;

+}

+

+.input{

+	width:250px;

+  height: 34px;

+  padding: 6px 12px;

+  font-size: 14px;

+  line-height: 1.42857143;

+  color: #555;

+  background-color: #fff;

+  background-image: none;

+  border: 1px solid #ccc;

+  border-radius: 4px;

+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);

+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075);

+  -webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;

+  transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;

+}

+

+div.separator {

+	margin: 20px;

+}

+

+div.separator div {

+	text-align: center;

+	line-height: 0;

+}

+

+div.separator-line {

+	height: 1px !important;

+	width: 100%;

+	background: #ddd;

+	overflow: hidden;

+}

+

+.dropdown-toggle {

+	color: #5b9bd1;

+}

+

+.calendar-date {

+	color: #5b9bd1;

+}

+

+.range_inputs {

+	color: #5b9bd1;

+}

+

+.btn.dropdown-toggle,.btn-group .btn.dropdown-toggle,.btn:hover,.btn:disabled,.btn[disabled],.btn:focus,.btn:active,.btn.active

+	{

+	outline: none !important;

+	background-image: none !important;

+	filter: none;

+	-webkit-box-shadow: none;

+	-moz-box-shadow: none;

+	box-shadow: none;

+	text-shadow: none;

+}

+

+#skills-chart-breadcrumb {

+	margin-bottom: 10px

+}

+

+/*增加daterangepicker的css*/

+input[name="daterange"] {

+	width: 220px;

+	line-height: 0;

+	height: 31px;

+	vertical-align: top;

+	margin-top: 2px;

+}

+

+.daterangepicker .ranges {

+	width: 205px;

+}

+

+.daterangepicker .ranges input {

+	width: 95px !important;

+}

+

+td.details-control {

+	background: url('../images/details_open.png') no-repeat center center;

+	cursor: pointer;

+}

+

+tr.shown td.details-control {

+	background: url('../images/details_close.png') no-repeat center center;

+}

+

+.details table td {

+	word-wrap: break-word;

+	word-break: normal;

+	border-top: 1px solid #dddddd;

+}

+

+.details table  tr:first-child td {

+	border-top: none;

+}

+

+.details table {

+	table-layout: fixed;

+	width: 100%;

+}

+

+td.title {

+	width: 10%;

+}

+

+table.dataTable tbody th,table.dataTable tbody td {

+	padding: 8px 10px;

+}

+

+div.dataTables_length,div.dataTables_info {

+	display: inline;

+}

+

+div.dataTables_paginate {

+	display: inline;

+	float: right;

+}

+

+div.pagination-panel {

+	margin-right: 10px;

+}

+

+input.pagination-panel-input {

+	width: 50px;

+}

+

+#ict_res_table_div {

+	margin-top: 15px;

+}

+

+#ict_res_table_div label {

+	font-weight: 100;

+}

+

+.daterangepicker .daterangepicker_start_input label,.daterangepicker .daterangepicker_end_input label

+	{

+	color: #5b9bd1;

+}

+

+.daterangepicker .ranges .input-mini {

+	color: #5b9bd1;

+}

+

+.cancelBtn {

+	padding: 5px 10px 5px 10px;

+}

+

+.btn:focus,.btn:active:focus,.btn.active:focus {

+	outline: 0;

+}

+

+#ict_res_table_div  table {

+	width: 100% !important;

+}

+

+.control-label .required {

+  color: #e02222;

+  font-size: 12px;

+  padding-left: 2px;

+}

+

+#ict_vim_table tbody tr{

+	cursor:pointer;

+}

+

+

+/*卡片面板样式*/

+.animated-panel {

+  -webkit-animation-duration: .5s;

+  animation-duration: .5s;

+  -webkit-animation-fill-mode: both;

+  animation-fill-mode: both;

+}

+

+.hpanel {

+  background-color: none;

+  border: none;

+  box-shadow: none;

+  margin-bottom: 25px;

+    

+}

+

+.hpanel .panel-body {

+  border: 1px solid #e4e5e7;

+  border-radius: 2px;

+  padding: 20px;

+  position: relative;

+}

+.h-200 {

+  min-height: 220px;

+}

+

+.m-t-xl {

+  margin-top: 40px;

+}

+

+.m-t-xl div {

+  margin-bottom: 15px;

+}

+

+.text-success {

+  color: #0d638f;

+}

+.hpanel > .panel-footer {

+  color: inherit;

+  border: 1px solid #e4e5e7;

+  border-top: none;

+  font-size: 90%;

+  background: #f7f9fa;

+  height:40px;

+  padding: 5px 15px;

+}

+.color_cloud{

+	color:#ccc;

+}

+.stats-title{

+

+}

+

+h3{

+  margin-top: 10px;

+  margin-bottom: 40px;

+  font-weight: 200;

+}

+

+.blue-font{

+	color:#428bca;

+}

+

+.hpanel > .panel-footer .pull-right a{

+	margin-left: 5px;

+}

+

+.hpanel > .panel-footer .pull-right .btn{

+	min-width: 30px !important;

+}

+

+.font-bold {

+  font-weight: 600;

+  margin-bottom: 15px;

+}

+

+.hpanel_show{

+	background-color: #f7f9fa;

+}

+

+.vnfm-padding {

+	padding-left: 0;

+}
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/i18n/nfv-nso-iui-i18n-en-US.properties b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/i18n/nfv-nso-iui-i18n-en-US.properties
new file mode 100644
index 0000000..6a1f354
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/i18n/nfv-nso-iui-i18n-en-US.properties
@@ -0,0 +1,54 @@
+#
+# Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+//vnfm
+nfv-vnfm-iui-title=VNFM Manage
+nfv-vnfm-iui-message-title=vnfm info
+nfv-vnfm-iui-message-query-fail=Query vnfm failed.
+nfv-vnfm-iui-message-save-success=Save successfully.
+nfv-vnfm-iui-message-save-fail=Save failed.
+nfv-vnfm-iui-message-update-success=Update successfully.
+nfv-vnfm-iui-message-update-fail=Update failed.
+nfv-vnfm-iui-message-delete-confirm=Do you want to delete the current vnfm?
+nfv-vnfm-iui-message-delete-success=Vnfm deleted successfully.
+nfv-vnfm-iui-message-delete-fail=Vnfm deleted failed.
+
+nfv-vnfm-iui-test-update=Modify vnfm info
+nfv-vnfm-iui-text-register=Register vnfm info
+nfv-vnfm-iui-text-name=Name
+nfv-vnfm-iui-text-type=type
+nfv-vnfm-iui-text-version=version
+nfv-vnfm-iui-text-certificateUrl=certificate URL
+nfv-vnfm-iui-text-vendor=Vendor
+nfv-vnfm-iui-text-userName=Username
+nfv-vnfm-iui-text-password=Password
+nfv-vnfm-iui-text_description=description
+nfv-vnfm-iui-text-cancelBtn=cancel
+nfv-vnfm-iui-text-saveBtn=save
+nfv-vnfm-iui-text-registerBtn=Register
+nfv-vnfm-iui-text-status-normal=Normal
+nfv-vnfm-iui-text-status-fail=Alarm
+nfv-vnfm-iui-text-total=Total
+nfv-vnfm-iui-text-total-vnfm= of vnfm
+
+nfv-vnfm-iui-validate-name=Please enter a name
+nfv-vnfm-iui-validate-type=Please enter the vnfm type
+nfv-vnfm-iui-validate-version=Please enter version
+nfv-vnfm-iui-validate-vendor=Please enter vendor
+nfv-vnfm-iui-validate-vim=Please select a VIM
+nfv-vnfm-iui-validate-url-required=Please enter the URL
+nfv-vnfm-iui-validate-url=Please enter the right URL
+nfv-vnfm-iui-text-url-tip=Example: http://10.0.0.1
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/i18n/nfv-nso-iui-i18n-zh-CN.properties b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/i18n/nfv-nso-iui-i18n-zh-CN.properties
new file mode 100644
index 0000000..39ed473
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/i18n/nfv-nso-iui-i18n-zh-CN.properties
@@ -0,0 +1,54 @@
+#
+# Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+//vnfm
+nfv-vnfm-iui-title=VNFM管理
+nfv-vnfm-iui-message-title=vnfm信息
+nfv-vnfm-iui-message-query-fail=查询vnfm失败。
+nfv-vnfm-iui-message-save-success=保存成功。
+nfv-vnfm-iui-message-save-fail=保存失败。
+nfv-vnfm-iui-message-update-success=修改成功。
+nfv-vnfm-iui-message-update-fail=修改失败。
+nfv-vnfm-iui-message-delete-confirm=确定删除所选vnfm信息?
+nfv-vnfm-iui-message-delete-success=删除成功
+nfv-vnfm-iui-message-delete-fail=删除失败
+
+nfv-vnfm-iui-test-update=修改vnfm信息
+nfv-vnfm-iui-text-register=注册vnfm信息
+nfv-vnfm-iui-text-name=名称
+nfv-vnfm-iui-text-type=类型
+nfv-vnfm-iui-text-version=版本
+nfv-vnfm-iui-text-certificateUrl=认证url
+nfv-vnfm-iui-text_description=描述
+nfv-vnfm-iui-text-vendor=厂商
+nfv-vnfm-iui-text-userName=接入用户
+nfv-vnfm-iui-text-password=接入密码
+nfv-vnfm-iui-text-cancelBtn=取消
+nfv-vnfm-iui-text-saveBtn=保存
+nfv-vnfm-iui-text-registerBtn=注册vnfm
+nfv-vnfm-iui-text-status-normal=正常
+nfv-vnfm-iui-text-status-fail=报警
+nfv-vnfm-iui-text-total=共
+nfv-vnfm-iui-text-total-vnfm= vnfm
+
+nfv-vnfm-iui-validate-name=请输入名称
+nfv-vnfm-iui-validate-type=请输入vnfm类型
+nfv-vnfm-iui-validate-version=请输入版本号
+nfv-vnfm-iui-validate-vendor=请输入厂商
+nfv-vnfm-iui-validate-vim=请选择VIM
+nfv-vnfm-iui-validate-url-required=请输入URL
+nfv-vnfm-iui-validate-url=请输入正确的URL
+nfv-vnfm-iui-text-url-tip=例如:http://10.0.0.1
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/commonUtil.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/commonUtil.js
new file mode 100644
index 0000000..abc4cd6
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/commonUtil.js
@@ -0,0 +1,128 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+var commonUtil = {};

+commonUtil.arrayRemove = function( aryInstance , index ){

+    if(aryInstance == undefined || aryInstance == null){

+        return;

+    }

+    for(var i=0,n=0;i<aryInstance.length;i++) {

+        if(aryInstance[i]!=aryInstance[dx]) {

+            aryInstance[n++]=aryInstance[i];

+        }

+    }

+    aryInstance.length-=1;

+};

+

+//For the expansion of the Date, convert the Date to specify the format String

+// examples:

+// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423

+// (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18

+commonUtil.parseDate = function( dateObj , format){

+    var o = {

+        "M+" : dateObj.getMonth()+1, //month

+        "d+" : dateObj.getDate(),    //day

+        "h+" : dateObj.getHours(),   //hour

+        "m+" : dateObj.getMinutes(), //minute

+        "s+" : dateObj.getSeconds(), //second

+        "q+" : Math.floor((dateObj.getMonth()+3)/3),  //quarter

+        "S" : dateObj.getMilliseconds() //millisecond

+    }

+    if(/(y+)/.test(format)) format=format.replace(RegExp.$1,

+        (dateObj.getFullYear()+"").substr(4 - RegExp.$1.length));

+    for(var k in o)

+        if(new RegExp("("+ k +")").test(format))

+            format = format.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] :

+                    ("00"+ o[k]).substr((""+ o[k]).length));

+    return format;

+};

+

+//tooltip

+commonUtil.showMessage = function(message, type) {

+    $.growl({

+        icon: "fa fa-envelope-o fa-lg",

+        title: "&nbsp;&nbsp;" + $.i18n.prop("nfv-nso-iui-common-tip"),

+        message: message

+    },{

+        type: type

+    });

+};

+

+commonUtil.registerCometdMessage = function(url, channel, callback) {

+    var cometd = new $.Cometd();

+    var cometdURL = location.protocol + "//" + location.host + url;

+    cometd.configure({

+        url : cometdURL,

+        logLevel : "info"

+    });

+    // unregister websocket transport, use long-polling transport

+    cometd.unregisterTransport('websocket');

+    // store channel object parameters(this object include channel and callback function), start from arguments[1]

+    var _args = arguments;  

+

+    cometd.addListener("/meta/handshake", function(handshake){

+        if(handshake.successful === true) {

+            cometd.batch(function() {

+                //subscribe channel

+                cometd.subscribe(channel, function(message){

+                    callback.call(this, message.data);

+                });

+            });

+        }

+    });

+    cometd.handshake();

+}

+

+commonUtil.format = function() {

+    if(arguments.length == 0) {

+        return null;

+    }

+    var str = arguments[0];

+    for(var i=0; i<arguments.length; i++) {

+        var reg = new RegExp("\\{" + (i - 1) + "\\}" , "gm");

+        str = str.replace(reg, arguments[i]);

+    }

+    return str;

+}

+

+commonUtil.get = function(url, params, callback) {

+    $.ajax({

+        type : "GET",

+        url : url,

+        //contentType : contentType || "application/x-www-form-urlencoded; charset=UTF-8",

+        dataType : "json",

+        data : params || {},

+        success : callback

+    });

+}

+

+commonUtil.post = function(url, params, callback, contentType) {

+    $.ajax({

+        type : "POST",

+        url : url,

+        contentType : contentType || "application/x-www-form-urlencoded; charset=UTF-8",

+        data : params || {},

+        success : callback

+    });

+}

+

+commonUtil.delete = function(url, callback, contentType) {

+    $.ajax({

+        type : "DELETE",

+        url : url,

+        contentType : contentType || "application/x-www-form-urlencoded; charset=UTF-8",

+        success : callback

+    });

+}
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/loadi18n_nsoc.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/loadi18n_nsoc.js
new file mode 100644
index 0000000..c809aa2
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/loadi18n_nsoc.js
@@ -0,0 +1,23 @@
+function loadPropertiesSideMenu(lang, fileNamePrefix, filePath){

+	jQuery.i18n.properties({

+	    language:lang,

+	    name:fileNamePrefix,

+	    path:filePath,

+	    mode:'map',

+	    callback: function() {

+	        var i18nItems = $("[name_i18n=com_zte_nfv_nsoc_i18n]");

+	        for(var i=0;i<i18nItems.length;i++) {

+	        	var $item = $(i18nItems.eq(i));

+	        	var itemId = $item.attr("id");

+	        	var itemTitle = $item.attr("title");

+	        	if(typeof(itemTitle) != "undefined") {

+	        		$item.attr("title", $.i18n.prop(itemId));

+	        	} else {

+	        		$item.text($.i18n.prop(itemId));

+	        	}

+	        }

+	    }

+	});

+}

+var lang = getLanguage();

+loadPropertiesSideMenu(lang, 'nfv-nso-iui-i18n', 'i18n/');
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/vnfm-validate.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/vnfm-validate.js
new file mode 100644
index 0000000..ff99b9d
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/vnfm-validate.js
@@ -0,0 +1,74 @@
+$(function(){

+	var form = $('#vnfm_form');

+	var error = $('.alert-danger', form);

+	var success = $('.alert-success', form);

+

+	form.validate({

+		doNotHideMessage: true, //this option enables to show the error/success messages on tab switch.

+		errorElement: 'span', //default input error message container

+		errorClass: 'help-block', // default input error message class

+		focusInvalid: false, // do not focus the last invalid input

+		rules: {			

+			name:{

+				required: true,

+				maxlength:20

+			},

+			type:{

+				required: true,

+				maxlength:20

+			},

+			version:{

+				required: true,

+				maxlength:20

+			},

+			vendor:{

+				required: true,

+				maxlength:20

+			},

+			url:{

+				required: true,

+				url: true

+			}

+		},

+		messages: {		

+			name:{

+				required: $.i18n.prop("nfv-vnfm-iui-validate-name")

+			},

+			type:{

+				required: $.i18n.prop("nfv-vnfm-iui-validate-type")

+			},

+			version:{

+				required: $.i18n.prop("nfv-vnfm-iui-validate-version")

+			},

+			vendor:{

+				required: $.i18n.prop("nfv-vnfm-iui-validate-vendor")

+			},

+			url:{

+				required: $.i18n.prop("nfv-vnfm-iui-validate-url-required"),

+				url: $.i18n.prop("nfv-vnfm-iui-validate-url")

+			}

+		},

+		errorPlacement: function (error, element) { // render error placement for each input type

+			error.insertAfter(element); // for other inputs, just perform default behavior

+		},

+		invalidHandler: function (event, validator) { //display error alert on form submit   

+			success.hide();

+			error.show();

+		},

+		highlight: function (element) { // hightlight error inputs

+			$(element).closest('.form-group').removeClass('has-success').addClass('has-error'); // set error class to the control group

+		},

+		unhighlight: function (element) { // revert the change done by hightlight

+			$(element).closest('.form-group').removeClass('has-error'); // set error class to the control group

+		},

+		success: function (label) {

+			label.addClass('valid') // mark the current input as valid and display OK icon

+				.closest('.form-group').removeClass('has-error'); // set success class to the control group

+		},

+		submitHandler: function (form) {

+			success.show();

+			error.hide();

+			//add here some ajax code to submit your form or just call form.submit() if you want to submit the form without ajax

+		}

+	});

+});
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/vnfmController.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/vnfmController.js
new file mode 100644
index 0000000..8e1f8ac
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/vnfmController.js
@@ -0,0 +1,293 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+

+var vm = avalon

+		.define({

+			$id : "vnfmController",

+			vnfmInfo :  [],	

+			//mocSelectItems : [],

+			vimSelectItems : [],	

+			server_rtn:{

+				info_block:false,

+				warning_block:false,

+				rtn_info:"",

+				$RTN_SUCCESS:"RTN_SUCCESS",

+				$RTN_FAILED:"RTN_FAILED"

+			},	

+			$Status	:{

+                success:"active",

+                failed:"inactive"

+			},	

+			$restUrl : {

+				queryVnfmInfoUrl : '/openoapi/extsys/v1/vnfms',

+				addVnfmInfoUrl : '/openoapi/extsys/v1/vnfms',

+				updateVnfmInfoUrl : '/openoapi/extsys/v1/vnfms/',

+				delVnfmInfoUrl : '/openoapi/extsys/v1/vnfms/',

+				queryMocUrl : '',

+				queryVimUrl : '/openoapi/extsys/v1/vims'

+			},

+			$htmlText:{

+				saveSuccess:$.i18n.prop("nfv-vnfm-iui-message-save-success"),

+				saveFail:$.i18n.prop("nfv-vnfm-iui-message-save-fail"),

+				updateSuccess:$.i18n.prop("nfv-vnfm-iui-message-update-success"),

+				updateFail:$.i18n.prop("nfv-vnfm-iui-message-update-fail")

+			},

+			$initTable : function() {				

+				$.ajax({

+	                "type": 'GET',

+	                "url": vm.$restUrl.queryVnfmInfoUrl,

+	                //"dataType": "json",

+	                "success": function (resp) {

+	                	for(var i=0;i<resp.length;i++){ 

+			                 resp[i].status = vm.$Status.success;			                        

+				           }

+	                	vm.vnfmInfo = resp;	                   	

+	                },

+	                error: function(XMLHttpRequest, textStatus, errorThrown) {

+						bootbox.alert($.i18n.prop("nfv-vnfm-iui-message-query-fail") + ":"+textStatus+":"+errorThrown);                       

+	                    return;

+	                },

+	                complete: function() {    

+	                   	vnfmUtil.tooltipVnfmStatus();

+	                }

+	            });	

+			},

+			// $initMoc : function() {

+			// 	/*var url = vm.$restUrl.queryMocUrl;

+			//     commonUtil.get(url, null, function(resp) {

+			//         if (resp) {

+			//             vm.addVnfm.moc = resp.data;

+			//         }

+			//     });*/

+			//     var resp = [

+			//     	{ id : "nfv.vnfm.eco", name : "VNFM(ECO)"},

+			//     	{ id : "nfv.vnfm.tacker", name : "VNFM(Tacker)"},

+			//     	{ id : "nfv.vnfm.cmcc", name : "VNFM(CMCC)"},

+			//     	{ id : "nfv.vnfm.etsi", name : "VNFM(ETSI)"}

+			//     ]

+			//     vm.mocSelectItems = resp;

+			// },

+			$initVim : function() {

+				$.ajax({

+					type : 'get',

+					url : vm.$restUrl.queryVimUrl,

+					dataType : 'json',

+					success : function(resp) {

+						if(resp) {

+							vm.vimSelectItems = resp;

+						}

+						vm.vimSelectItems.push({"vimId":"","name":""});						

+					}

+				});

+			},

+			addVnfm : {

+				title : $.i18n.prop("nfv-vnfm-iui-text-register"),

+				vnfmId : "",

+				name : "",

+				type :"",

+				//moc : "",

+				//mocDisabled : false,

+				vimId : "",

+				//vimVisiable : false,

+				vendor : "",

+				version :"",

+				description:"",

+				certificateUrl:"",

+				url : "",

+				urlTip : $.i18n.prop("nfv-vnfm-iui-text-url-tip"),

+				userName : "",

+				password : "",

+				saveType :"add",

+				status: ""

+			},

+			$showVnfmTable : function() { 

+				vm.addVnfm.title = $.i18n.prop("nfv-vnfm-iui-text-register"),  				

+				vm.addVnfm.vnfmId = "";

+				vm.addVnfm.name = "";

+				vm.addVnfm.type = "";

+				//vm.addVnfm.moc = "";

+				//vm.addVnfm.mocDisabled = false;

+				vm.addVnfm.vimId = "";

+				//vm.addVnfm.vimVisiable = false;

+				vm.addVnfm.vendor = "";

+				vm.addVnfm.version = "";

+				vm.addVnfm.description = "";

+				vm.addVnfm.certificateUrl = "";

+				vm.addVnfm.url = "";

+				vm.addVnfm.userName = "";

+				vm.addVnfm.password = "";

+				vm.addVnfm.saveType = "add";

+				vm.server_rtn.warning_block=false;

+				vm.server_rtn.info_block=false;

+				//vm.$initMoc();

+				vm.$initVim();

+				//vm.$mocChange();

+				

+				$(".form-group").each(function () {

+					$(this).removeClass('has-success');

+					$(this).removeClass('has-error');

+					$(this).find(".help-block[id]").remove();

+				});

+				$("#addVnfmDlg").modal("show");

+			},			

+			// $getMocName : function(mocId) {

+	  //       	var items = vm.mocSelectItems;

+	  //           for(var i=0;i<items.length;i++) {

+		 //    		if(items[i].id == mocId) {

+		 //    			return items[i].name;

+		 //    		}

+		 //    	}

+		 //    	return "";

+			// },

+			$saveVnfm : function() {

+				var form = $('#vnfm_form');

+				if (form.valid() == false) {

+					return false;

+				}				

+			    vm.server_rtn.info_block=true;

+                vm.server_rtn.warning_block=false;                  

+				vm.addVnfm.status=vm.$Status.success;

+

+				var param = {

+					name : vm.addVnfm.name,										

+					//status : vm.addVnfm.status,

+					//moc : $("#moc").val(),

+					//vimId : vm.$getVimId($("#moc").val()),

+					vimId : $("#vimId").val(),

+					vendor : vm.addVnfm.vendor,

+					version : vm.addVnfm.version,

+					type : vm.addVnfm.type,

+					description : vm.addVnfm.description,

+					certificateUrl : vm.addVnfm.certificateUrl,

+					url : vm.addVnfm.url,

+					userName : vm.addVnfm.userName,

+					password : vm.addVnfm.password 

+				}

+				//save VIM info

+				if(vm.addVnfm.saveType == "add") {

+					$.ajax({

+						type : "POST",

+						url : vm.$restUrl.addVnfmInfoUrl,

+						data : JSON.stringify(param),

+						dataType : "json",

+						contentType : "application/json",

+						success : function(data) {

+							vm.server_rtn.info_block=false;

+							vm.server_rtn.warning_block=false;

+							if (data) {

+								vm.vnfmInfo = [];

+								vm.$initTable();

+

+								$('#addVnfmDlg').modal('hide');							

+								commonUtil.showMessage(vm.$htmlText.saveSuccess, "success");

+							} else {

+								vm.server_rtn.warning_block=true;

+								vm.server_rtn.rtn_info=vm.$htmlText.saveFail;

+								commonUtil.showMessage(vm.$htmlText.saveFail, "failed");

+							}

+						},

+					    error: function(XMLHttpRequest, textStatus, errorThrown) {

+					      	vm.server_rtn.warning_block=true;

+					      	vm.server_rtn.rtn_info=textStatus+":"+errorThrown;

+                          	vm.server_rtn.info_block=false;

+                        }

+					});

+				} else {

+					$.ajax({

+						type : "PUT",

+						url : vm.$restUrl.updateVnfmInfoUrl+vm.addVnfm.vnfmId,

+						data : JSON.stringify(param),

+						dataType : "json",

+						contentType : "application/json",

+						success : function(data) {

+							vm.server_rtn.info_block=false;

+							vm.server_rtn.warning_block=false;

+							if (data) {

+								for(var i=0;i<vm.vnfmInfo.length;i++){

+			                        if(vm.vnfmInfo[i].vnfmId == vm.addVnfm.vnfmId) {

+			                            vm.vnfmInfo[i].name = vm.addVnfm.name;			                            

+			                            vm.vnfmInfo[i].vimId = $("#vimId").val();

+			                            vm.vnfmInfo[i].vendor = vm.addVnfm.vendor;

+			                            vm.vnfmInfo[i].version = vm.addVnfm.version;

+			                            vm.vnfmInfo[i].certificateUrl = vm.addVnfm.certificateUrl;

+			                            vm.vnfmInfo[i].description = vm.addVnfm.description;

+			                            vm.vnfmInfo[i].url = vm.addVnfm.url;

+			                            vm.vnfmInfo[i].userName = vm.addVnfm.userName;

+			                            vm.vnfmInfo[i].password = vm.addVnfm.password;			                            

+			                        }

+				                }

+								$('#addVnfmDlg').modal('hide');										

+							 	commonUtil.showMessage(vm.$htmlText.updateSuccess,"success");											

+							} else {

+								vm.server_rtn.warning_block=true;

+								vm.server_rtn.rtn_info=vm.$htmlText.updateFail;

+								commonUtil.showMessage(vm.$htmlText.updateFail, "failed");

+							} 

+						},

+					    error: function(XMLHttpRequest, textStatus, errorThrown) {

+					      	vm.server_rtn.warning_block=true;	

+					      	vm.server_rtn.rtn_info=textStatus+":"+errorThrown;                       

+	                      	vm.server_rtn.info_block=false;                                              

+                       	}

+					});

+				}					

+	   		},

+	  //  		mocRendered : function(action) {

+			// 	if(vm.addVnfm.saveType === "update" && vm.addVnfm.moc) {

+			// 		var items = vm.mocSelectItems;

+			// 		for(var i=0;i<items.length;i++) {

+			//     		if(items[i].id == vm.addVnfm.moc) {

+			//     			$("#moc")[0].selectedIndex = i;

+			//     			vm.$mocChange();

+			//     			break;

+			//     		}

+			//     	}

+			// 	} else {

+			// 		$("#moc")[0].selectedIndex = 0;

+			// 	}

+			// },

+			vimRendered : function(action) {

+                var items = vm.vimSelectItems;

+				if(vm.addVnfm.saveType === "update") {	

+					for(var i=0;i<items.length;i++) {

+			    		if(items[i].vimId == vm.addVnfm.vimId) {

+			    			$("#vimId")[0].selectedIndex = i;

+			    			break;

+			    		}

+			    	}

+				} else {

+					$("#vimId")[0].selectedIndex = items.length-1;

+				}

+			},

+			// $mocChange : function() {

+			// 	var mocId = $('#moc').val();

+			// 	if(mocId == "nfv.vnfm.tacker") {

+			// 		vm.addVnfm.vimVisiable = true;

+			// 	} else {

+			// 		vm.addVnfm.vimVisiable = false;

+			// 	}

+			// },

+			// $getVimId : function(mocId) {

+			// 	if(vm.addVnfm.vimVisiable) {

+			// 		return $("#vimId").val();

+			// 	} else {

+			// 		return "";

+			// 	}

+			// }

+    	});

+avalon.scan();

+vm.$initTable();

+//vm.$initMoc();
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/vnfmUtil.js b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/vnfmUtil.js
new file mode 100644
index 0000000..fc3fe17
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/js/vnfmUtil.js
@@ -0,0 +1,77 @@
+/*

+ * Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *         http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+var vnfmUtil = {};

+

+vnfmUtil.delVnfm = function(vnfmId) {

+	bootbox.confirm($.i18n.prop("nfv-vnfm-iui-message-delete-confirm"), function(result){

+		if(result){

+			$.ajax({

+				type : "DELETE",

+				url : vm.$restUrl.delVnfmInfoUrl + vnfmId,

+				dataType : "json",

+				success : function(data,statusText,jqXHR) {

+					if(jqXHR.status=="204") {

+					   	for(var i=0;i<vm.vnfmInfo.length;i++){

+	                        if(vnfmId == vm.vnfmInfo[i].vnfmId){

+	                        	//delete the vnfm object from vnfm array

+	                            vm.vnfmInfo.splice(i, 1);

+	                            break;

+	                        }

+	                    }

+	                    commonUtil.showMessage($.i18n.prop("nfv-vnfm-iui-message-delete-success"), "success");

+					} else {

+						commonUtil.showMessage($.i18n.prop("nfv-vnfm-iui-message-delete-fail"), "warning");

+					}

+				}, 

+				error : function() {

+					commonUtil.showMessage($.i18n.prop("nfv-vnfm-iui-message-delete-fail"), "warning");

+				}

+			});

+	    }

+	});

+}

+

+vnfmUtil.updateVnfm = function(data) {

+	vm.addVnfm.vnfmId = data.vnfmId;

+	vm.addVnfm.name = data.name;

+	//vm.addVnfm.moc = data.moc;

+	//vm.addVnfm.mocDisabled = true;

+	vm.addVnfm.vendor = data.vendor;

+	vm.addVnfm.version = data.version;

+	vm.addVnfm.description = data.description;

+	vm.addVnfm.type = data.type;

+	vm.addVnfm.vimId = data.vimId;

+	vm.addVnfm.url = data.url;

+	vm.addVnfm.userName = data.userName;

+	vm.addVnfm.password = data.password;

+	vm.addVnfm.saveType = "update";

+	vm.addVnfm.title = $.i18n.prop("nfv-vnfm-iui-test-update");

+	vm.server_rtn.info_block=false;

+	vm.server_rtn.warning_block=false;

+	//vm.$initMoc();

+	vm.$initVim();

+

+	$(".form-group").each(function () {

+		$(this).removeClass('has-success');

+		$(this).removeClass('has-error');

+		$(this).find(".help-block[id]").remove();

+	});

+	$("#addVnfmDlg").modal("show");

+}

+

+vnfmUtil.tooltipVnfmStatus = function() {

+ 	$("[data-toggle='tooltip']").tooltip();

+}
\ No newline at end of file
diff --git a/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/vnfmView.html b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/vnfmView.html
new file mode 100644
index 0000000..75bb025
--- /dev/null
+++ b/openo-portal/portal-extsys/src/main/webapp/extsys/vnfm/vnfmView.html
@@ -0,0 +1,222 @@
+<!--

+

+    Copyright (C) 2015 ZTE, Inc. and others. All rights reserved. (ZTE)

+

+    Licensed under the Apache License, Version 2.0 (the "License");

+    you may not use this file except in compliance with the License.

+    You may obtain a copy of the License at

+

+            http://www.apache.org/licenses/LICENSE-2.0

+

+    Unless required by applicable law or agreed to in writing, software

+    distributed under the License is distributed on an "AS IS" BASIS,

+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+    See the License for the specific language governing permissions and

+    limitations under the License.

+

+-->

+<!DOCTYPE html>

+<html>

+<head lang="en">

+<meta charset="UTF-8">

+<title></title>

+<link href="../component/thirdparty/font-awesome/css/font-awesome.min.css" rel="stylesheet" />

+<link href="../component/thirdparty/bootstrap/css/bootstrap.min.css" rel="stylesheet" />

+<link href="../component/thirdparty/uniform/css/uniform.default.min.css" rel="stylesheet" />

+<link href="../component/css/ZteIctIcons/style.css" rel="stylesheet"/>

+<link href="../framework/css/ngict-component.css" rel="stylesheet"/>

+<link href="css/animate.min.css" rel="stylesheet"/>

+<link href="css/vnfm.css" rel="stylesheet" />

+<style>

+.ms-controller {

+	visibility: hidden

+}

+</style>

+

+</head>

+<body>

+	<div ms-controller="vnfmController" class="container-fluid ms-controller">

+	<div id="addVnfmDlg" class="modal  fade" tabindex="-1" role="dialog"

+		aria-labelledby="myModalLabel" aria-hidden="true" >

+		<div class="modal-dialog">

+			<div class="modal-content Changepasswd">

+				<div class="content">

+					<div class="modal-header">

+						<button type="button" class="close" data-dismiss="modal"

+							aria-hidden="true">×</button>

+						<h4 id="myModalLabel">{{addVnfm.title}}</h4>

+					</div>

+					<div class="modal-body">				

+					<form class="form-horizontal" id="vnfm_form" role="form">

+						<input type="hidden" ms-duplex="addVnfm.vnfmId"  name="vnfmId" class="form-control" />

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="nfv-vnfm-iui-text-name" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+								<span class="required" aria-required="true">*</span>

+							</label>

+						 	<div class="col-sm-7">

+								<input type="text" ms-duplex="addVnfm.name"  name="name" class="form-control"/>

+								<span class="help-block"></span>

+							</div>							

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="nfv-vnfm-iui-text-type" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+								<span class="required" aria-required="true">*</span>

+							</label>

+							<div class="col-sm-7">

+								<input type="text" ms-duplex="addVnfm.type"  name="type" class="form-control"/>

+								<span class="help-block"></span>

+							</div>							

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="nfv-vnfm-iui-text-vendor" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+								<span class="required" aria-required="true">*</span>

+							</label>

+							<div class="col-sm-7">

+								<input type="text" ms-duplex="addVnfm.vendor" name="vendor" class="form-control" /> 

+								<span class="help-block"></span>			

+							</div>

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="nfv-vnfm-iui-text-version" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+								<span class="required" aria-required="true">*</span>

+							</label>

+							<div class="col-sm-7">

+								<input type="text" ms-duplex="addVnfm.version" name="version" class="form-control" /> 

+								<span class="help-block"></span>			

+							</div>

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span>URL</span>

+								<span class="required" aria-required="true">*</span>

+							</label>

+							<div class="col-sm-7">

+								<input type="text" ms-duplex="addVnfm.url" name="url" class="form-control" 

+									ms-attr-placeholder="addVnfm.urlTip"/> 

+								<span class="help-block"></span>			

+							</div>

+						</div>

+						<div class="form-group" >

+							<label class="col-sm-3 control-label">VIM

+								<span></span>

+							</label>

+						 	<div class="col-sm-7">

+								<select class="form-control" id="vimId" name="vimId">

+									<option ms-repeat-vim="vimSelectItems" ms-attr-value="vim.vimId" data-repeat-rendered="vimRendered">{{vim.name}}</option>

+								</select>

+							</div>

+						</div>						

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="nfv-vnfm-iui-text-certificateUrl" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+							</label>

+							<div class="col-sm-7">

+								<input type="text" ms-duplex="addVnfm.certificateUrl" name="certificateUrl" class="form-control" /> 

+								<span class="help-block"></span>			

+							</div>

+						</div>						

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="nfv-vnfm-iui-text-userName" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+							</label>

+							<div class="col-sm-7">

+								<input type="text" ms-duplex="addVnfm.userName" name="userName" class="form-control" /> 

+								<span class="help-block"></span>			

+							</div>

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="nfv-vnfm-iui-text-password" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+							</label>

+							<div class="col-sm-7">

+								<input type="password" ms-duplex="addVnfm.password" name="password" class="form-control" /> 

+								<span class="help-block"></span>			

+							</div>

+						</div>

+						<div class="form-group">

+							<label class="control-label col-sm-3">

+								<span id="nfv-vnfm-iui-text_description" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+								<span class="" aria-required="" style="visibility: hidden;">*</span>

+								</label>

+							 <div class="col-sm-7">

+								<textarea class="form-control" rows="3"  ms-duplex="addVnfm.description"  name="description"></textarea>

+								<span class="help-block"></span>			

+							</div>							

+						</div>

+					</form>

+

+					</div>

+					<div class="modal-footer">

+						<button class="btn" data-dismiss="modal" aria-hidden="true" id="nfv-vnfm-iui-text-cancelBtn" name_i18n="com_zte_nfv_nsoc_i18n"></button>

+						<button class="btn btn-primary" type="submit" ms-click="$saveVnfm" id="nfv-vnfm-iui-text-saveBtn" name_i18n="com_zte_nfv_nsoc_i18n"></button>

+					</div>

+				</div>

+			</div>

+		</div>

+	</div>

+	<div class="row-fluid" data-name="cond_zone">

+		<div class="col-md-12">				

+			<button class="btn white radius_l" id="app-new-btn" ms-click="$showVnfmTable" >

+		        <i class="ict-new"></i> <span id="nfv-vnfm-iui-text-registerBtn" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+		    </button>

+		</div>

+	</div>

+

+	<div class="col-sm-12 vnfm-padding" ms-each-el="vnfmInfo">

+		<div class="col-sm-4 animated-panel zoomIn" style="-webkit-animation-delay: 0.1s;">

+            <div class="hpanel stats" >

+                <div class="panel-body h-200"  ms-hover="hpanel_show" >

+                    <div class="pull-left">

+                        <span class="label label-success" ms-if="el.status === $Status.success" id="nfv-vnfm-iui-text-status-normal" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+                        <span class="label label-danger" ms-attr-title="el.errorInfo"   data-toggle="tooltip"   ms-if="el.status === $Status.failed" id="nfv-vnfm-iui-text-status-fail" name_i18n="com_zte_nfv_nsoc_i18n"></span>

+                    </div>

+                    <div class="stats-icon pull-right">

+                        <i class="fa fa-server  fa-5x color_cloud"></i>

+                    </div>

+                    <div class="m-t-xl">

+                        <h3 ms-text="el.name"></h3>   

+                        <div><span id="nfv-vnfm-iui-text-type" name_i18n="com_zte_nfv_nsoc_i18n"></span>:<span ms-text="el.type"></span></div>

+                        <div>URL:<span ms-text="el.url"></span></div>

+                    </div>

+                </div>

+                <div class="panel-footer">

+                    <div  class="pull-right">

+                     	<a class="btn btn-default btn-sm" ms-click="vnfmUtil.updateVnfm(el.$model)"><i class="fa fa-pencil-square-o fa-lg"></i></a>

+                    	<a class="btn btn-default btn-sm" ms-click="vnfmUtil.delVnfm(el.vnfmId)"><i class="fa fa-trash-o fa-lg"> </i></a>

+                    </div>

+                </div>

+            </div>

+        </div>       

+    </div>

+    <div class="col-sm-12">

+        <div class="pull-left text-muted">

+        	<small><span id="nfv-vnfm-iui-text-total" name_i18n="com_zte_nfv_nsoc_i18n"></span> <span class="blue-font" ms-text="vnfmInfo.size()"></span> <span id="nfv-vnfm-iui-text-total-vnfm" name_i18n="com_zte_nfv_nsoc_i18n"></span></small>

+        </div>  

+	</div>

+	</div>

+	<script type="text/javascript" src="../component/thirdparty/jquery/jquery-1.10.2.min.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/jquery.i18n/jquery.i18n.properties-1.0.9.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/bootstrap/js/bootstrap.min.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/bootbox/bootbox.min.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/jquery-validation/js/jquery.validate.min.js"></script>

+	<script type="text/javascript" src="../component/thirdparty/jquery-validation/js/additional-methods.min.js"></script>

+	

+	<script type="text/javascript" src="../vendor/bootstrap-growl/bootstrap-growl.min.js"></script>

+	<script type="text/javascript" src="../vendor/cometd/cometd.js"></script>

+	<script type="text/javascript" src="../vendor/cometd/jquery.cometd.js"></script>

+	<script type="text/javascript" src="../vendor/avalon/avalon.js"></script>

+

+	<script type="text/javascript" src="../framework/js/tools.js"></script>

+	

+	<script type="text/javascript" src="js/commonUtil.js"></script>

+	<script type="text/javascript" src="js/loadi18n_nsoc.js"></script>

+	

+	<script type="text/javascript" src="js/vnfm-validate.js"></script>

+	<script type="text/javascript" src="js/vnfmUtil.js"></script>

+	<script type="text/javascript" src="js/vnfmController.js"></script>

+</body>

+</html>
\ No newline at end of file