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 : " Notice: ",
+ message : message + " "
+ }, {
+ type : type
+ });
+}
+
+sdnUtil.showMessage = function(message, type) {
+ $.growl({
+ icon: "fa fa-envelope-o fa-lg",
+ title: " " + $.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: " " + $.i18n.prop('com_zte_ums_eco_roc_vim_title_notice'),
+ message: message+" "
+ },{
+ 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: " Notice: ",
+ message: message+" "
+ },{
+ 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: " " + $.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