Version Notes
first release
Download this release
Release Info
Developer | Rui Wang |
Extension | 16f83d637da64be29b0de1c4868deef2 |
Version | 1.1.1 |
Comparing to | |
See all releases |
Version 1.1.1
- app/code/community/SecureAccounts/ManageAccounts/Block/Customer/Grid.php +87 -0
- app/code/community/SecureAccounts/ManageAccounts/Block/Render/Compromise.php +132 -0
- app/code/community/SecureAccounts/ManageAccounts/Block/Secure.php +39 -0
- app/code/community/SecureAccounts/ManageAccounts/Helper/Data.php +368 -0
- app/code/community/SecureAccounts/ManageAccounts/Model/Compromisedusers.php +42 -0
- app/code/community/SecureAccounts/ManageAccounts/Model/Observer.php +61 -0
- app/code/community/SecureAccounts/ManageAccounts/Model/Resource/Compromisedusers.php +42 -0
- app/code/community/SecureAccounts/ManageAccounts/Model/Resource/Compromisedusers/Collection.php +42 -0
- app/code/community/SecureAccounts/ManageAccounts/controllers/AjaxController.php +139 -0
- app/code/community/SecureAccounts/ManageAccounts/controllers/PasswordController.php +173 -0
- app/code/community/SecureAccounts/ManageAccounts/etc/adminhtml.xml +58 -0
- app/code/community/SecureAccounts/ManageAccounts/etc/config.xml +140 -0
- app/code/community/SecureAccounts/ManageAccounts/etc/system.xml +107 -0
- app/code/community/SecureAccounts/ManageAccounts/sql/secureaccounts_manageaccounts_setup/install-1.0.0.php +68 -0
- app/design/frontend/base/default/layout/secureaccounts/manageaccounts/manageaccounts.xml +46 -0
- app/design/frontend/base/default/template/secureaccounts/manageaccounts/login_url.phtml +36 -0
- app/design/frontend/base/default/template/secureaccounts/manageaccounts/resetpassword.phtml +78 -0
- app/etc/modules/SecureAccounts_ManageAccounts.xml +40 -0
- app/locale/en_US/template/email/secureaccounts/manageaccounts/password_compromise_reset_template.html +156 -0
- js/secureaccounts/manageaccounts/jquery.validate.js +1365 -0
- js/secureaccounts/manageaccounts/login.js +16 -0
- js/secureaccounts/manageaccounts/resetpassword.js +33 -0
- package.xml +18 -0
- skin/frontend/base/default/secureaccounts/manageaccounts/css/bootstrap.min.css +5 -0
- skin/frontend/base/default/secureaccounts/manageaccounts/css/custom_styles.css +14 -0
app/code/community/SecureAccounts/ManageAccounts/Block/Customer/Grid.php
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Class For Adding Column To Customer Grid In Admin Section
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
class SecureAccounts_ManageAccounts_Block_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid {
|
37 |
+
|
38 |
+
public function setCollection($collection) {
|
39 |
+
|
40 |
+
$customers = Mage::getModel("customer/customer")->getCollection()->getData();
|
41 |
+
foreach ($customers as $customer):
|
42 |
+
$customerId = $customer['entity_id'];
|
43 |
+
$email = $customer['email'];
|
44 |
+
$loadcustomer = Mage::getModel('customer/customer')->load($customerId);
|
45 |
+
$temp = explode(':', $loadcustomer->getData("password_hash"));
|
46 |
+
$hash = $temp[0];
|
47 |
+
Mage::helper('manageaccounts')->checkdeletecustomer($customerId, $hash);
|
48 |
+
$isexists = Mage::helper('manageaccounts')->getIfCustomer($customerId);
|
49 |
+
if (!$isexists):
|
50 |
+
$getallcompromised[] = $customerId;
|
51 |
+
endif;
|
52 |
+
|
53 |
+
endforeach;
|
54 |
+
|
55 |
+
|
56 |
+
// $getallcompromised = Mage::helper('manageaccounts')->getallcompromised();
|
57 |
+
|
58 |
+
Mage::getSingleton('core/session')->setAllCompromised($getallcompromised);
|
59 |
+
$collection->addAttributeToSelect('compromise');
|
60 |
+
parent::setCollection($collection);
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* @category Preksh
|
65 |
+
* @package SecureAccounts_ManageAccounts
|
66 |
+
* @function For Adding Compromised Column In Customer Grid
|
67 |
+
* @author Priyanka <priyanka@preksh.com>
|
68 |
+
* @date 4th April, 2016
|
69 |
+
*/
|
70 |
+
protected function _prepareColumns() {
|
71 |
+
|
72 |
+
parent::_prepareColumns();
|
73 |
+
|
74 |
+
if (Mage::helper('manageaccounts')->ismoduleenabled()):
|
75 |
+
$this->addColumn('compromise', array(
|
76 |
+
'header' => Mage::helper('customer')->__('Compromised'),
|
77 |
+
'index' => 'compromise',
|
78 |
+
'type' => 'text',
|
79 |
+
'width' => '100px',
|
80 |
+
'renderer' => 'SecureAccounts_ManageAccounts_Block_Render_Compromise',
|
81 |
+
));
|
82 |
+
endif;
|
83 |
+
|
84 |
+
return parent::_prepareColumns();
|
85 |
+
}
|
86 |
+
|
87 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/Block/Render/Compromise.php
ADDED
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Class For Encrypting Customer's Passwords
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Block For Checking Compromised Customers
|
38 |
+
*
|
39 |
+
* @category Preksh
|
40 |
+
* @package SecureAccounts_ManageAccounts
|
41 |
+
* @author Priyanka <priyanka@preksh.com>
|
42 |
+
* @date 4th April, 2016
|
43 |
+
*/
|
44 |
+
class SecureAccounts_ManageAccounts_Block_Render_Compromise extends
|
45 |
+
Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract {
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @category Preksh
|
49 |
+
* @package SecureAccounts_ManageAccounts
|
50 |
+
* @function For Rendering Compromised Column In Customer Grid
|
51 |
+
* @author Priyanka <priyanka@preksh.com>
|
52 |
+
* @date 4th April, 2016
|
53 |
+
*/
|
54 |
+
public function render(Varien_Object $row) {
|
55 |
+
$callapiflag = 0;
|
56 |
+
$email = $row->getData("email");
|
57 |
+
$customerId = $row->getData("entity_id");
|
58 |
+
$customer = Mage::getModel('customer/customer')->load($customerId);
|
59 |
+
$temp = explode(':', $customer->getData("password_hash"));
|
60 |
+
$hash = $temp[0];
|
61 |
+
$salt = $temp[1];
|
62 |
+
$token = Mage::getStoreConfig('manageaccounts/general/tokenkey');
|
63 |
+
$noofcustomers = Mage::getStoreConfig('manageaccounts/general/noofcustomers');
|
64 |
+
$getapi = array_slice(Mage::getSingleton('core/session')->getAllCompromised(), 0, $noofcustomers);
|
65 |
+
if (in_array($customerId, $getapi)):
|
66 |
+
$data = $this->private_preserving_compromise_detection($customerId, $email, $hash, $salt, $token);
|
67 |
+
else:
|
68 |
+
$data = Mage::helper('manageaccounts')->checkemailstatus($email);
|
69 |
+
endif;
|
70 |
+
return $data;
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* @category Preksh
|
75 |
+
* @package SecureAccounts_ManageAccounts
|
76 |
+
* @function For Detecting Compromised Customers
|
77 |
+
* @author Priyanka <priyanka@preksh.com>
|
78 |
+
* @date 4th April, 2016
|
79 |
+
*/
|
80 |
+
public function private_preserving_compromise_detection($customerId, $email, $password_hash, $salt, $token) {
|
81 |
+
//Get API base url from store configuration
|
82 |
+
$API_BASE_URL = Mage::getStoreConfig('manageaccounts/general/appbaseurl');
|
83 |
+
|
84 |
+
//Create anonymized email for sending to API
|
85 |
+
$anonymized_email = $email;
|
86 |
+
$anonymized_email[0] = '_';
|
87 |
+
$anonymized_email[1] = '_';
|
88 |
+
|
89 |
+
//Call to API
|
90 |
+
$url_req = $API_BASE_URL . 'token=' . $token . '&mode=privacy_preserving_account_query_salt&email=' . $anonymized_email . '&salt=' . $salt; //to test server
|
91 |
+
$ch = curl_init();
|
92 |
+
$timeout = 600;
|
93 |
+
curl_setopt($ch, CURLOPT_URL, $url_req);
|
94 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
95 |
+
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
|
96 |
+
$json_str = curl_exec($ch);
|
97 |
+
curl_close($ch);
|
98 |
+
|
99 |
+
$result = json_decode($json_str, true);
|
100 |
+
if ($result['result'] != 'succeeded') {
|
101 |
+
return "unknown";
|
102 |
+
}
|
103 |
+
|
104 |
+
//Checking for compromised status
|
105 |
+
$records = $result['records'];
|
106 |
+
foreach ($records as $row) {
|
107 |
+
|
108 |
+
if ($email == $row['email']) {
|
109 |
+
$hash_algorithm = $row['hash_algorithm'];
|
110 |
+
if ($hash_algorithm['ca_hash'] == 'bcrypt') {
|
111 |
+
if (!isset($bcrypt))
|
112 |
+
// $bcrypt = new Bcrypt();
|
113 |
+
$hash = Mage::helper('manageaccounts')->hash($password_hash, $hash_algorithm['ca_salt']);
|
114 |
+
if ($hash == $row['password_hash']) {
|
115 |
+
$compromised_status = 1;
|
116 |
+
//Save customer in compromised table
|
117 |
+
// Mage::helper('manageaccounts')->compromised($row['email'], $password_hash);
|
118 |
+
//Check email is sent or not
|
119 |
+
// return Mage::helper('manageaccounts')->checkemailstatus($row['email']);
|
120 |
+
} else {
|
121 |
+
$compromised_status = 0;
|
122 |
+
}
|
123 |
+
}
|
124 |
+
}
|
125 |
+
}
|
126 |
+
|
127 |
+
Mage::helper('manageaccounts')->compromised($email, $password_hash, $compromised_status);
|
128 |
+
return Mage::helper('manageaccounts')->checkemailstatus($email);
|
129 |
+
|
130 |
+
}
|
131 |
+
|
132 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/Block/Secure.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Block For ManageAccounts
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
class SecureAccounts_ManageAccounts_Block_Secure extends Mage_Core_Block_Template {
|
37 |
+
|
38 |
+
|
39 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/Helper/Data.php
ADDED
@@ -0,0 +1,368 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Helper For SecureAccounts_ManageAccounts
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
class SecureAccounts_ManageAccounts_Helper_Data extends Mage_Core_Helper_Abstract {
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Helper Function To Insert Row In Compromised Table
|
40 |
+
*
|
41 |
+
* @category Preksh
|
42 |
+
* @package SecureAccounts_ManageAccounts
|
43 |
+
* @author Priyanka <priyanka@preksh.com>
|
44 |
+
* @date 4th April, 2016
|
45 |
+
*/
|
46 |
+
public function compromised($email, $hashpassword, $compromised_status) {
|
47 |
+
date_default_timezone_set(Mage::getStoreConfig('general/locale/timezone'));
|
48 |
+
$today = date("Y-m-d H:i:s");
|
49 |
+
$customer = Mage::getModel("customer/customer");
|
50 |
+
$customer->setWebsiteId(1)
|
51 |
+
->loadByEmail($email);
|
52 |
+
$model = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
|
53 |
+
->addFieldToFilter('customer_id', $customer->getId())
|
54 |
+
->getData();
|
55 |
+
if (count($model) == 0):
|
56 |
+
$compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers");
|
57 |
+
//Insert row if it is not already present in table
|
58 |
+
|
59 |
+
$compromisedcollection->setCustomerId($customer->getId())
|
60 |
+
->setCompromised($compromised_status)
|
61 |
+
->setPasswordHash($hashpassword)
|
62 |
+
->setUpdatedDate($today)
|
63 |
+
->setCheckedDate($today);
|
64 |
+
try {
|
65 |
+
$compromisedcollection->save();
|
66 |
+
return true;
|
67 |
+
} catch (Exception $ex) {
|
68 |
+
return false;
|
69 |
+
}
|
70 |
+
endif;
|
71 |
+
}
|
72 |
+
|
73 |
+
public function getallcompromised() {
|
74 |
+
$customerstocallapi = array();
|
75 |
+
$customers = Mage::getModel("customer/customer")->getCollection()->getData();
|
76 |
+
|
77 |
+
$model = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
|
78 |
+
->addFieldToFilter('compromised', array(1, 2))
|
79 |
+
->addFieldToSelect('customer_id')
|
80 |
+
->getData();
|
81 |
+
foreach ($model as $key => $val):
|
82 |
+
$customerids[] = $val['customer_id'];
|
83 |
+
endforeach;
|
84 |
+
|
85 |
+
|
86 |
+
foreach ($customers as $customer):
|
87 |
+
if (!in_array($customer['entity_id'], $customerids)):
|
88 |
+
$customerstocallapi[] = $customer['entity_id'];
|
89 |
+
endif;
|
90 |
+
endforeach;
|
91 |
+
|
92 |
+
|
93 |
+
|
94 |
+
return $customerstocallapi;
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Helper Function To Delete Compromised Customer From Table
|
99 |
+
*
|
100 |
+
* @category Preksh
|
101 |
+
* @package SecureAccounts_ManageAccounts
|
102 |
+
* @author Priyanka <priyanka@preksh.com>
|
103 |
+
* @date 4th April, 2016
|
104 |
+
*/
|
105 |
+
public function checkdeletecustomer($customerId, $hash) {
|
106 |
+
//check more than predefined days
|
107 |
+
$model = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")
|
108 |
+
->getCollection()
|
109 |
+
->addFieldToFilter('customer_id', $customerId)
|
110 |
+
->getFirstItem();
|
111 |
+
date_default_timezone_set(Mage::getStoreConfig('general/locale/timezone'));
|
112 |
+
$today = date("Y-m-d");
|
113 |
+
$day15 = date('Y-m-d', strtotime($model->getCheckedDate() . ' + ' . Mage::getStoreConfig('manageaccounts/general/noofdays') . ' days'));
|
114 |
+
|
115 |
+
//check if customer has reset his password
|
116 |
+
|
117 |
+
try {
|
118 |
+
if (($today > $day15) || ($hash != $model->getPasswordHash())):
|
119 |
+
$model->setId($model->getId())->delete();
|
120 |
+
endif;
|
121 |
+
return true;
|
122 |
+
} catch (Exception $ex) {
|
123 |
+
return false;
|
124 |
+
}
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Helper Function To Delete Compromised Customer From Table After Resetting The Password
|
129 |
+
*
|
130 |
+
* @category Preksh
|
131 |
+
* @package SecureAccounts_ManageAccounts
|
132 |
+
* @author Priyanka <priyanka@preksh.com>
|
133 |
+
* @date 4th April, 2016
|
134 |
+
*/
|
135 |
+
public function deletecompromised($customerid) {
|
136 |
+
$model = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
|
137 |
+
->addFieldToFilter('customer_id', $customerid)->getFirstItem();
|
138 |
+
try {
|
139 |
+
//Delete cusomer details from compromised table
|
140 |
+
$model->setId($model->getId())->delete();
|
141 |
+
return true;
|
142 |
+
} catch (Exception $ex) {
|
143 |
+
return false;
|
144 |
+
}
|
145 |
+
}
|
146 |
+
|
147 |
+
/**
|
148 |
+
* Helper Function To Check Customer Is Compromised Or Not
|
149 |
+
*
|
150 |
+
* @category Preksh
|
151 |
+
* @package SecureAccounts_ManageAccounts
|
152 |
+
* @author Priyanka <priyanka@preksh.com>
|
153 |
+
* @date 4th April, 2016
|
154 |
+
*/
|
155 |
+
public function getIfCustomer($customerid) {
|
156 |
+
$compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
|
157 |
+
->addFieldToFilter('customer_id', $customerid)
|
158 |
+
->getData();
|
159 |
+
|
160 |
+
return count($compromisedcollection);
|
161 |
+
}
|
162 |
+
|
163 |
+
public function getIfCompromisedCustomer($customerid) {
|
164 |
+
$compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
|
165 |
+
->addFieldToFilter('customer_id', $customerid)
|
166 |
+
->addFieldToFilter('compromised', 2)
|
167 |
+
->getData();
|
168 |
+
|
169 |
+
return count($compromisedcollection);
|
170 |
+
}
|
171 |
+
|
172 |
+
/**
|
173 |
+
* Helper Function To Check Module Is Enabled Or Not
|
174 |
+
*
|
175 |
+
* @category Preksh
|
176 |
+
* @package SecureAccounts_ManageAccounts
|
177 |
+
* @author Priyanka <priyanka@preksh.com>
|
178 |
+
* @date 4th April, 2016
|
179 |
+
*/
|
180 |
+
public function ismoduleenabled() {
|
181 |
+
return Mage::getStoreConfig('manageaccounts/general/active');
|
182 |
+
}
|
183 |
+
|
184 |
+
/**
|
185 |
+
* Helper Function To Return Url To Check Customer Is Compromised Or Not
|
186 |
+
*
|
187 |
+
* @category Preksh
|
188 |
+
* @package SecureAccounts_ManageAccounts
|
189 |
+
* @author Priyanka <priyanka@preksh.com>
|
190 |
+
* @date 4th April, 2016
|
191 |
+
*/
|
192 |
+
public function getloginurl() {
|
193 |
+
return Mage::getBaseUrl() . 'manageaccounts/ajax/login';
|
194 |
+
}
|
195 |
+
|
196 |
+
/**
|
197 |
+
* Helper Function To Check Email Is Sent Or Not
|
198 |
+
*
|
199 |
+
* @category Preksh
|
200 |
+
* @package SecureAccounts_ManageAccounts
|
201 |
+
* @author Priyanka <priyanka@preksh.com>
|
202 |
+
* @date 4th April, 2016
|
203 |
+
*/
|
204 |
+
public function checkemailstatus($email) {
|
205 |
+
date_default_timezone_set(Mage::getStoreConfig('general/locale/timezone'));
|
206 |
+
$today = date("Y-m-d H:i:s");
|
207 |
+
$customer = Mage::getModel("customer/customer");
|
208 |
+
$customer->setWebsiteId(1)
|
209 |
+
->loadByEmail($email);
|
210 |
+
$compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
|
211 |
+
->addFieldToFilter('customer_id', $customer->getId())
|
212 |
+
->getFirstItem();
|
213 |
+
//If 1=> Not Sent , 2=> Sent
|
214 |
+
if ($compromisedcollection->getCompromised() == 2):
|
215 |
+
$send_date = date_format(date_create($compromisedcollection->getUpdatedDate()), "M d,Y g:i A");
|
216 |
+
return "Mail Sent On " . $send_date;
|
217 |
+
elseif ($compromisedcollection->getCompromised() == 1):
|
218 |
+
$url = Mage::helper("adminhtml")->getUrl('manageaccount/password/reset/customer_id/' . $customer->getId());
|
219 |
+
return '<a href="' . Mage::helper("adminhtml")->getUrl('manageaccounts/password/reset/customer_id/' . $customer->getId()) . '">Reset password</a>';
|
220 |
+
else:
|
221 |
+
return 'No';
|
222 |
+
endif;
|
223 |
+
}
|
224 |
+
|
225 |
+
/**
|
226 |
+
* Helper Function To Change Compromised Status After Sending Mail
|
227 |
+
*
|
228 |
+
* @category Preksh
|
229 |
+
* @package SecureAccounts_ManageAccounts
|
230 |
+
* @author Priyanka <priyanka@preksh.com>
|
231 |
+
* @date 4th April, 2016
|
232 |
+
*/
|
233 |
+
public function changeemailstatus($customerid) {
|
234 |
+
date_default_timezone_set(Mage::getStoreConfig('general/locale/timezone'));
|
235 |
+
$today = date("Y-m-d H:i:s");
|
236 |
+
|
237 |
+
$compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
|
238 |
+
->addFieldToFilter('customer_id', $customerid)
|
239 |
+
->getFirstItem();
|
240 |
+
if (count($compromisedcollection) > 0):
|
241 |
+
//Change compromised status to 2
|
242 |
+
$compromised = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->load($compromisedcollection->getId());
|
243 |
+
$compromised->setCompromised(2)
|
244 |
+
->setUpdatedDate($today);
|
245 |
+
try {
|
246 |
+
$compromised->save();
|
247 |
+
return true;
|
248 |
+
} catch (Exception $ex) {
|
249 |
+
return false;
|
250 |
+
}
|
251 |
+
endif;
|
252 |
+
}
|
253 |
+
|
254 |
+
/**
|
255 |
+
* Helper Function For Encryption
|
256 |
+
*
|
257 |
+
* @category Preksh
|
258 |
+
* @package SecureAccounts_ManageAccounts
|
259 |
+
* @author Priyanka <priyanka@preksh.com>
|
260 |
+
* @date 4th April, 2016
|
261 |
+
*/
|
262 |
+
private $rounds;
|
263 |
+
|
264 |
+
public function __construct($rounds = 12) {
|
265 |
+
if (CRYPT_BLOWFISH != 1) {
|
266 |
+
throw new Exception("bcrypt not supported in this installation. See http://php.net/crypt");
|
267 |
+
}
|
268 |
+
|
269 |
+
$this->rounds = $rounds;
|
270 |
+
}
|
271 |
+
|
272 |
+
public function hash($input, $salt) {
|
273 |
+
$hash = crypt($input, $salt);
|
274 |
+
|
275 |
+
if (strlen($hash) > 13)
|
276 |
+
return $hash;
|
277 |
+
|
278 |
+
return false;
|
279 |
+
}
|
280 |
+
|
281 |
+
public function verify($input, $existingHash) {
|
282 |
+
$hash = crypt($input, $existingHash);
|
283 |
+
|
284 |
+
return $hash === $existingHash;
|
285 |
+
}
|
286 |
+
|
287 |
+
private function getSalt() {
|
288 |
+
$salt = sprintf('$2a$%02d$', $this->rounds);
|
289 |
+
|
290 |
+
$bytes = $this->getRandomBytes(16);
|
291 |
+
|
292 |
+
$salt .= $this->encodeBytes($bytes);
|
293 |
+
|
294 |
+
return $salt;
|
295 |
+
}
|
296 |
+
|
297 |
+
private $randomState;
|
298 |
+
|
299 |
+
private function getRandomBytes($count) {
|
300 |
+
$bytes = '';
|
301 |
+
|
302 |
+
if (function_exists('openssl_random_pseudo_bytes') &&
|
303 |
+
(strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) { // OpenSSL is slow on Windows
|
304 |
+
$bytes = openssl_random_pseudo_bytes($count);
|
305 |
+
}
|
306 |
+
|
307 |
+
if ($bytes === '' && is_readable('/dev/urandom') &&
|
308 |
+
($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) {
|
309 |
+
$bytes = fread($hRand, $count);
|
310 |
+
fclose($hRand);
|
311 |
+
}
|
312 |
+
|
313 |
+
if (strlen($bytes) < $count) {
|
314 |
+
$bytes = '';
|
315 |
+
|
316 |
+
if ($this->randomState === null) {
|
317 |
+
$this->randomState = microtime();
|
318 |
+
if (function_exists('getmypid')) {
|
319 |
+
$this->randomState .= getmypid();
|
320 |
+
}
|
321 |
+
}
|
322 |
+
|
323 |
+
for ($i = 0; $i < $count; $i += 16) {
|
324 |
+
$this->randomState = md5(microtime() . $this->randomState);
|
325 |
+
|
326 |
+
if (PHP_VERSION >= '5') {
|
327 |
+
$bytes .= md5($this->randomState, true);
|
328 |
+
} else {
|
329 |
+
$bytes .= pack('H*', md5($this->randomState));
|
330 |
+
}
|
331 |
+
}
|
332 |
+
|
333 |
+
$bytes = substr($bytes, 0, $count);
|
334 |
+
}
|
335 |
+
|
336 |
+
return $bytes;
|
337 |
+
}
|
338 |
+
|
339 |
+
private function encodeBytes($input) {
|
340 |
+
// The following is code from the PHP Password Hashing Framework
|
341 |
+
$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
342 |
+
|
343 |
+
$output = '';
|
344 |
+
$i = 0;
|
345 |
+
do {
|
346 |
+
$c1 = ord($input[$i++]);
|
347 |
+
$output .= $itoa64[$c1 >> 2];
|
348 |
+
$c1 = ($c1 & 0x03) << 4;
|
349 |
+
if ($i >= 16) {
|
350 |
+
$output .= $itoa64[$c1];
|
351 |
+
break;
|
352 |
+
}
|
353 |
+
|
354 |
+
$c2 = ord($input[$i++]);
|
355 |
+
$c1 |= $c2 >> 4;
|
356 |
+
$output .= $itoa64[$c1];
|
357 |
+
$c1 = ($c2 & 0x0f) << 2;
|
358 |
+
|
359 |
+
$c2 = ord($input[$i++]);
|
360 |
+
$c1 |= $c2 >> 6;
|
361 |
+
$output .= $itoa64[$c1];
|
362 |
+
$output .= $itoa64[$c2 & 0x3f];
|
363 |
+
} while (1);
|
364 |
+
|
365 |
+
return $output;
|
366 |
+
}
|
367 |
+
|
368 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/Model/Compromisedusers.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Model For SecureAccounts_ManageAccounts
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
class SecureAccounts_ManageAccounts_Model_Compromisedusers extends Mage_Core_Model_Abstract {
|
37 |
+
|
38 |
+
protected function _construct() {
|
39 |
+
$this->_init('secureaccounts_manageaccounts/compromisedusers');
|
40 |
+
}
|
41 |
+
|
42 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/Model/Observer.php
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Observer For Adding Button To Customer Grid
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
class SecureAccounts_ManageAccounts_Model_Observer {
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Function To Add Bulk Reset Button In Customer Grid
|
40 |
+
*
|
41 |
+
* @category Preksh
|
42 |
+
* @package SecureAccounts_ManageAccounts
|
43 |
+
* @author Priyanka <priyanka@preksh.com>
|
44 |
+
* @date 4th April, 2016
|
45 |
+
*/
|
46 |
+
public function addButtonTest($observer) {
|
47 |
+
if (Mage::helper('manageaccounts')->ismoduleenabled()):
|
48 |
+
$container = $observer->getBlock();
|
49 |
+
if (null !== $container && $container->getType() == 'adminhtml/customer') {
|
50 |
+
$data = array(
|
51 |
+
'label' => 'Bulk Reset',
|
52 |
+
'class' => 'some-class',
|
53 |
+
'onclick' => 'setLocation(\'' . Mage::helper("adminhtml")->getUrl('manageaccount/password/bulkreset/') . '\')',
|
54 |
+
);
|
55 |
+
$container->addButton('button_identifier', $data);
|
56 |
+
}
|
57 |
+
return $this;
|
58 |
+
endif;
|
59 |
+
}
|
60 |
+
|
61 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/Model/Resource/Compromisedusers.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Model For SecureAccounts_ManageAccounts
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
class SecureAccounts_ManageAccounts_Model_Resource_Compromisedusers extends Mage_Core_Model_Resource_Db_Abstract {
|
37 |
+
|
38 |
+
protected function _construct() {
|
39 |
+
$this->_init('secureaccounts_manageaccounts/compromisedusers', 'id');
|
40 |
+
}
|
41 |
+
|
42 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/Model/Resource/Compromisedusers/Collection.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Model Collection For SecureAccounts_ManageAccounts
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
class SecureAccounts_ManageAccounts_Model_Resource_Compromisedusers_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract {
|
37 |
+
|
38 |
+
public function _construct() {
|
39 |
+
$this->_init('secureaccounts_manageaccounts/compromisedusers');
|
40 |
+
}
|
41 |
+
|
42 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/controllers/AjaxController.php
ADDED
@@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Class For Encrypting Customer's Passwords
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
class SecureAccounts_ManageAccounts_AjaxController extends Mage_Core_Controller_Front_Action {
|
36 |
+
|
37 |
+
public function indexAction() {
|
38 |
+
$this->loadLayout();
|
39 |
+
$this->renderLayout();
|
40 |
+
}
|
41 |
+
|
42 |
+
public function resetpasswordpageAction() {
|
43 |
+
$this->loadLayout();
|
44 |
+
$this->renderLayout();
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @category Preksh
|
49 |
+
* @package SecureAccounts_ManageAccounts
|
50 |
+
* @function Function To Reset Customer Password
|
51 |
+
* @author Priyanka <priyanka@preksh.com>
|
52 |
+
* @date 4th April, 2016
|
53 |
+
*/
|
54 |
+
public function resetpasswordAction() {
|
55 |
+
$result = array('success' => false);
|
56 |
+
$newpassword = $this->getRequest()->getPost('newpassword');
|
57 |
+
$custpwdtoken = $this->getRequest()->getPost('token');
|
58 |
+
$customer = Mage::getModel('customer/customer')
|
59 |
+
->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
|
60 |
+
->load($this->getRequest()->getPost('custid'));
|
61 |
+
if ($customer->getId()):
|
62 |
+
try {
|
63 |
+
$customer->setPassword($newpassword)->save();
|
64 |
+
Mage::helper('manageaccounts')->deletecompromised($customer->getId());
|
65 |
+
$result['message'] = 'Please login to your account';
|
66 |
+
$result['redirect'] = Mage::getUrl('customer/account/login');
|
67 |
+
} catch (Exception $ex) {
|
68 |
+
$result['message'] = $ex->getMessage();
|
69 |
+
}
|
70 |
+
else:
|
71 |
+
$result['message'] = 'you are account is not there our database please register';
|
72 |
+
endif;
|
73 |
+
return $this->getResponse()->setBody(json_encode($result));
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* @category Preksh
|
78 |
+
* @package SecureAccounts_ManageAccounts
|
79 |
+
* @function Function To Check Customer Is Compromised Or Not
|
80 |
+
* @author Priyanka <priyanka@preksh.com>
|
81 |
+
* @date 4th April, 2016
|
82 |
+
*/
|
83 |
+
public function loginAction() {
|
84 |
+
$postVal = $this->getRequest()->getPost('login');
|
85 |
+
$email = $postVal['username'];
|
86 |
+
$password = $postVal['password'];
|
87 |
+
$temp = explode(':', Mage::helper('core')->getHash($password, Mage_Admin_Model_User::HASH_SALT_LENGTH));
|
88 |
+
$password_hash = $temp[0];
|
89 |
+
$salt = $temp[1];
|
90 |
+
$token = Mage::getStoreConfig('manageaccounts/general/tokenkey');
|
91 |
+
|
92 |
+
$anonymized_email = $email;
|
93 |
+
$anonymized_email[0] = '_';
|
94 |
+
$anonymized_email[1] = '_';
|
95 |
+
//Get API base url from store configuration
|
96 |
+
$API_BASE_URL = Mage::getStoreConfig('manageaccounts/general/appbaseurl');
|
97 |
+
//Call to API
|
98 |
+
$url_req = $API_BASE_URL . 'token=' . $token . '&mode=privacy_preserving_account_query_salt&email=' . $anonymized_email . '&salt=' . $salt; //to test server
|
99 |
+
$ch = curl_init();
|
100 |
+
$timeout = 600;
|
101 |
+
curl_setopt($ch, CURLOPT_URL, $url_req);
|
102 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
103 |
+
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
|
104 |
+
$json_str = curl_exec($ch);
|
105 |
+
curl_close($ch);
|
106 |
+
|
107 |
+
$result = json_decode($json_str, true);
|
108 |
+
if ($result['result'] != 'succeeded') {
|
109 |
+
return "unknown";
|
110 |
+
}
|
111 |
+
//Checking for compromised status
|
112 |
+
$records = $result['records'];
|
113 |
+
foreach ($records as $row) {
|
114 |
+
if ($email == $row['email']) {
|
115 |
+
$hash_algorithm = $row['hash_algorithm'];
|
116 |
+
if ($hash_algorithm['ca_hash'] == 'bcrypt') {
|
117 |
+
if (!isset($bcrypt))
|
118 |
+
// $bcrypt = new Bcrypt();
|
119 |
+
$hash = Mage::helper('manageaccounts')->hash($password_hash, $hash_algorithm['ca_salt']);
|
120 |
+
if ($hash == $row['password_hash']) {
|
121 |
+
//Save customer id in compromised table
|
122 |
+
|
123 |
+
$customer = Mage::getModel('customer/customer')->setWebsiteId(1)->loadByEmail($email);
|
124 |
+
if ($customer):
|
125 |
+
$temp = explode(':', $customer->getData("password_hash"));
|
126 |
+
$phash = $temp[0];
|
127 |
+
endif;
|
128 |
+
Mage::helper('manageaccounts')->compromised($row['email'], $phash, 1);
|
129 |
+
return 'Yes';
|
130 |
+
} else {
|
131 |
+
return 'No';
|
132 |
+
}
|
133 |
+
}
|
134 |
+
}
|
135 |
+
}
|
136 |
+
return "No";
|
137 |
+
}
|
138 |
+
|
139 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/controllers/PasswordController.php
ADDED
@@ -0,0 +1,173 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Class For Mail Sending For Resetting Compromised Customer's Password
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
class SecureAccounts_ManageAccounts_PasswordController extends Mage_Adminhtml_Controller_Action {
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @category Preksh
|
40 |
+
* @package SecureAccounts_ManageAccounts
|
41 |
+
* @function Function To Send Mail For Individual Reset Password Action
|
42 |
+
* @author Priyanka <priyanka@preksh.com>
|
43 |
+
* @date 4th April, 2016
|
44 |
+
*/
|
45 |
+
public function resetAction() {
|
46 |
+
|
47 |
+
$customerId = $this->getRequest()->getParam('customer_id');
|
48 |
+
$customer = Mage::getModel('customer/customer')->load($customerId);
|
49 |
+
$email = $customer->getData("email");
|
50 |
+
$customer_name = $customer->getFirstname() . ' ' . $customer->getLastname();
|
51 |
+
$storeId = Mage::app()->getStore()->getId();
|
52 |
+
if ($customer->getId()) {
|
53 |
+
try {
|
54 |
+
$newResetPasswordLinkToken = Mage::helper('customer')->generateResetPasswordLinkToken();
|
55 |
+
$customer->changeResetPasswordLinkToken($newResetPasswordLinkToken);
|
56 |
+
$template_id = 'password_compromise_reset_template';
|
57 |
+
// Load template by template_id
|
58 |
+
$email_template = Mage::getModel('core/email_template')->loadDefault($template_id);
|
59 |
+
$makeforgoturl = Mage::getBaseUrl() . 'manageaccounts/ajax/resetpasswordpage/' . 'token/' . $newResetPasswordLinkToken . '/customer/' . $customer->getId();
|
60 |
+
$email_template_variables = array();
|
61 |
+
$email_template_variables['customertoken'] = $newResetPasswordLinkToken;
|
62 |
+
$email_template_variables['custid'] = $customer->getId();
|
63 |
+
$email_template_variables['forgoturl'] = $makeforgoturl;
|
64 |
+
$email_template_variables['customername'] = $customer->getFirstname();
|
65 |
+
$email_template_variables['storeurl'] = Mage::getBaseUrl();
|
66 |
+
$processed_template = $email_template->getProcessedTemplate($email_template_variables);
|
67 |
+
|
68 |
+
// Get sender name and email from store configuration
|
69 |
+
$sender_name = Mage::getStoreConfig('trans_email/ident_support/name');
|
70 |
+
$sender_email = Mage::getStoreConfig('trans_email/ident_support/email');
|
71 |
+
$email_template->setSenderName($sender_name);
|
72 |
+
$email_template->setSenderEmail($sender_email);
|
73 |
+
|
74 |
+
$mail = Mage::getModel('core/email')
|
75 |
+
->setToName($customer_name)
|
76 |
+
->setToEmail($email)
|
77 |
+
->setBody($processed_template)
|
78 |
+
->setSubject('Subject :Reset Password')
|
79 |
+
->setFromEmail($sender_email)
|
80 |
+
->setFromName($sender_name)
|
81 |
+
->setType('html');
|
82 |
+
$mail->send();
|
83 |
+
|
84 |
+
//Change status to mail sent
|
85 |
+
Mage::helper('manageaccounts')->changeemailstatus($customer->getId());
|
86 |
+
|
87 |
+
$result['message'] = "Password reset email sent: " . $email;
|
88 |
+
} catch (Exception $exception) {
|
89 |
+
Mage::log($exception);
|
90 |
+
$result['message'] = $exception;
|
91 |
+
}
|
92 |
+
} else {
|
93 |
+
$result['message'] = "Failed to find customer Id";
|
94 |
+
}
|
95 |
+
Mage::getSingleton('adminhtml/session')->addSuccess($result['message']);
|
96 |
+
$this->_redirectUrl(Mage::helper('adminhtml')->getUrl('adminhtml/customer/index/'));
|
97 |
+
}
|
98 |
+
|
99 |
+
/**
|
100 |
+
* @category Preksh
|
101 |
+
* @package SecureAccounts_ManageAccounts
|
102 |
+
* @function Function To Send Mail For Bulk Reset Password Action
|
103 |
+
* @author Priyanka <priyanka@preksh.com>
|
104 |
+
* @date 4th April, 2016
|
105 |
+
*/
|
106 |
+
public function bulkresetAction() {
|
107 |
+
$result = array();
|
108 |
+
//Get all compromised customers
|
109 |
+
$compromisemodel = Mage::getModel('secureaccounts_manageaccounts/compromisedusers')
|
110 |
+
->getCollection()
|
111 |
+
->addFieldToFilter('compromised', 1)
|
112 |
+
->addFieldToSelect('*');
|
113 |
+
if (count($compromisemodel->getData()) > 0):
|
114 |
+
|
115 |
+
foreach ($compromisemodel->getData() as $key => $compromise):
|
116 |
+
|
117 |
+
$customer = Mage::getModel('customer/customer')->load($compromise['customer_id']);
|
118 |
+
$email = $customer->getData("email");
|
119 |
+
$customer_name = $customer->getFirstname() . ' ' . $customer->getLastname();
|
120 |
+
$storeId = Mage::app()->getStore()->getId();
|
121 |
+
if ($customer->getId()) {
|
122 |
+
try {
|
123 |
+
$newResetPasswordLinkToken = Mage::helper('customer')->generateResetPasswordLinkToken();
|
124 |
+
$customer->changeResetPasswordLinkToken($newResetPasswordLinkToken);
|
125 |
+
$template_id = 'password_compromise_reset_template';
|
126 |
+
// Load template by template_id
|
127 |
+
$email_template = Mage::getModel('core/email_template')->loadDefault($template_id);
|
128 |
+
$makeforgoturl = Mage::getBaseUrl() . 'manageaccounts/ajax/resetpasswordpage/' . 'token/' . $newResetPasswordLinkToken . '/customer/' . $customer->getId();
|
129 |
+
$email_template_variables = array();
|
130 |
+
$email_template_variables['customertoken'] = $newResetPasswordLinkToken;
|
131 |
+
$email_template_variables['custid'] = $customer->getId();
|
132 |
+
$email_template_variables['forgoturl'] = $makeforgoturl;
|
133 |
+
$email_template_variables['customername'] = $customer->getFirstname();
|
134 |
+
$email_template_variables['storeurl'] = Mage::getBaseUrl();
|
135 |
+
$processed_template = $email_template->getProcessedTemplate($email_template_variables);
|
136 |
+
|
137 |
+
// Get sender name and email from store configuration
|
138 |
+
$sender_name = Mage::getStoreConfig('trans_email/ident_support/name');
|
139 |
+
$sender_email = Mage::getStoreConfig('trans_email/ident_support/email');
|
140 |
+
$email_template->setSenderName($sender_name);
|
141 |
+
$email_template->setSenderEmail($sender_email);
|
142 |
+
|
143 |
+
$mail = Mage::getModel('core/email')
|
144 |
+
->setToName($customer_name)
|
145 |
+
->setToEmail($email)
|
146 |
+
->setBody($processed_template)
|
147 |
+
->setSubject('Subject :Reset Password')
|
148 |
+
->setFromEmail($sender_email)
|
149 |
+
->setFromName($sender_name)
|
150 |
+
->setType('html');
|
151 |
+
$mail->send();
|
152 |
+
|
153 |
+
//Change status to mail sent
|
154 |
+
Mage::helper('manageaccounts')->changeemailstatus($customer->getId());
|
155 |
+
|
156 |
+
|
157 |
+
$result[$key]['message'] .= "Password reset email sent: " . $email;
|
158 |
+
} catch (Exception $exception) {
|
159 |
+
Mage::log($exception);
|
160 |
+
$result[$key]['message'] .= $exception;
|
161 |
+
}
|
162 |
+
} else {
|
163 |
+
$result[$key]['message'] .= "Failed to find customer Id";
|
164 |
+
}
|
165 |
+
endforeach;
|
166 |
+
else:
|
167 |
+
$result[$key]['message'] .= "There are no compromised customer";
|
168 |
+
endif;
|
169 |
+
Mage::getSingleton('adminhtml/session')->addSuccess($result[$key]['message']);
|
170 |
+
$this->_redirectUrl(Mage::helper('adminhtml')->getUrl('adminhtml/customer/index/'));
|
171 |
+
}
|
172 |
+
|
173 |
+
}
|
app/code/community/SecureAccounts/ManageAccounts/etc/adminhtml.xml
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<!--
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
*
|
27 |
+
* @category Preksh
|
28 |
+
* @package SecureAccounts_ManageAccounts
|
29 |
+
* @author Priyanka <priyanka@preksh.com>
|
30 |
+
* @date 4th April, 2016
|
31 |
+
*/
|
32 |
+
-->
|
33 |
+
<config>
|
34 |
+
|
35 |
+
<acl>
|
36 |
+
<resources>
|
37 |
+
<all>
|
38 |
+
<title>Allow Everything</title>
|
39 |
+
</all>
|
40 |
+
<admin>
|
41 |
+
<children>
|
42 |
+
<system>
|
43 |
+
<children>
|
44 |
+
<config>
|
45 |
+
<children>
|
46 |
+
<manageaccounts translate="title" module="manageaccounts">
|
47 |
+
<title>Secure Login</title>
|
48 |
+
</manageaccounts>
|
49 |
+
</children>
|
50 |
+
</config>
|
51 |
+
</children>
|
52 |
+
</system>
|
53 |
+
|
54 |
+
</children>
|
55 |
+
</admin>
|
56 |
+
</resources>
|
57 |
+
</acl>
|
58 |
+
</config>
|
app/code/community/SecureAccounts/ManageAccounts/etc/config.xml
ADDED
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<!--
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
*
|
27 |
+
* @category Preksh
|
28 |
+
* @package SecureAccounts_ManageAccounts
|
29 |
+
* @author Priyanka <priyanka@preksh.com>
|
30 |
+
* @date 4th April, 2016
|
31 |
+
*/
|
32 |
+
-->
|
33 |
+
<config>
|
34 |
+
<modules>
|
35 |
+
<SecureAccounts_ManageAccounts>
|
36 |
+
<version>1.0.0</version>
|
37 |
+
</SecureAccounts_ManageAccounts>
|
38 |
+
</modules>
|
39 |
+
<frontend>
|
40 |
+
<routers>
|
41 |
+
<manageaccounts>
|
42 |
+
<use>standard</use>
|
43 |
+
<args>
|
44 |
+
<module>SecureAccounts_ManageAccounts</module>
|
45 |
+
<frontName>manageaccounts</frontName>
|
46 |
+
</args>
|
47 |
+
</manageaccounts>
|
48 |
+
</routers>
|
49 |
+
<layout>
|
50 |
+
<updates>
|
51 |
+
<manageaccounts>
|
52 |
+
<file>secureaccounts/manageaccounts/manageaccounts.xml</file>
|
53 |
+
</manageaccounts>
|
54 |
+
</updates>
|
55 |
+
</layout>
|
56 |
+
</frontend>
|
57 |
+
<global>
|
58 |
+
<events>
|
59 |
+
|
60 |
+
<adminhtml_widget_container_html_before>
|
61 |
+
<observers>
|
62 |
+
<add_button_test>
|
63 |
+
<class>SecureAccounts_ManageAccounts_Model_Observer</class>
|
64 |
+
<method>addButtonTest</method>
|
65 |
+
</add_button_test>
|
66 |
+
</observers>
|
67 |
+
</adminhtml_widget_container_html_before>
|
68 |
+
|
69 |
+
</events>
|
70 |
+
<blocks>
|
71 |
+
<manageaccounts>
|
72 |
+
<class>SecureAccounts_ManageAccounts_Block</class>
|
73 |
+
</manageaccounts>
|
74 |
+
|
75 |
+
<adminhtml>
|
76 |
+
<rewrite>
|
77 |
+
<customer_grid>SecureAccounts_ManageAccounts_Block_Customer_Grid</customer_grid>
|
78 |
+
</rewrite>
|
79 |
+
</adminhtml>
|
80 |
+
</blocks>
|
81 |
+
<resources>
|
82 |
+
<secureaccounts_manageaccounts_setup>
|
83 |
+
<setup>
|
84 |
+
<module>SecureAccounts_ManageAccounts</module>
|
85 |
+
</setup>
|
86 |
+
</secureaccounts_manageaccounts_setup>
|
87 |
+
</resources>
|
88 |
+
<models>
|
89 |
+
<secureaccounts_manageaccounts>
|
90 |
+
<class>SecureAccounts_ManageAccounts_Model</class>
|
91 |
+
<resourceModel>secureaccounts_manageaccounts_resource</resourceModel>
|
92 |
+
</secureaccounts_manageaccounts>
|
93 |
+
<secureaccounts_manageaccounts_resource>
|
94 |
+
<class>SecureAccounts_ManageAccounts_Model_Resource</class>
|
95 |
+
<entities>
|
96 |
+
<compromisedusers>
|
97 |
+
<table>secureaccounts_compromisedusers</table>
|
98 |
+
</compromisedusers>
|
99 |
+
</entities>
|
100 |
+
</secureaccounts_manageaccounts_resource>
|
101 |
+
</models>
|
102 |
+
<helpers>
|
103 |
+
<manageaccounts>
|
104 |
+
<class>SecureAccounts_ManageAccounts_Helper</class>
|
105 |
+
</manageaccounts>
|
106 |
+
</helpers>
|
107 |
+
|
108 |
+
<template>
|
109 |
+
<email>
|
110 |
+
<!--Give the template a uniqiue name, you'll need to refer to this later when sending the email-->
|
111 |
+
<password_compromise_reset_template>
|
112 |
+
<label>Password Reset</label>
|
113 |
+
<file>secureaccounts/manageaccounts/password_compromise_reset_template.html</file>
|
114 |
+
<type>html</type>
|
115 |
+
</password_compromise_reset_template>
|
116 |
+
</email>
|
117 |
+
</template>
|
118 |
+
</global>
|
119 |
+
<admin>
|
120 |
+
<routers>
|
121 |
+
<manageaccounts>
|
122 |
+
<use>admin</use>
|
123 |
+
<args>
|
124 |
+
<module>SecureAccounts_ManageAccounts</module>
|
125 |
+
<frontName>manageaccount</frontName>
|
126 |
+
</args>
|
127 |
+
</manageaccounts>
|
128 |
+
</routers>
|
129 |
+
</admin>
|
130 |
+
<default>
|
131 |
+
<manageaccounts>
|
132 |
+
<general>
|
133 |
+
<appbaseurl>https://www.vericlouds.com/private_search/api.php?</appbaseurl>
|
134 |
+
<noofcustomers>100</noofcustomers>
|
135 |
+
<noofdays>15</noofdays>
|
136 |
+
</general>
|
137 |
+
|
138 |
+
</manageaccounts>
|
139 |
+
</default>
|
140 |
+
</config>
|
app/code/community/SecureAccounts/ManageAccounts/etc/system.xml
ADDED
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<!--
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
*
|
27 |
+
* @category Preksh
|
28 |
+
* @package SecureAccounts_ManageAccounts
|
29 |
+
* @author Priyanka <priyanka@preksh.com>
|
30 |
+
* @date 4th April, 2016
|
31 |
+
*/
|
32 |
+
-->
|
33 |
+
<config>
|
34 |
+
<tabs>
|
35 |
+
<Secureaccounts_Extensions translate="label" module="manageaccounts">
|
36 |
+
<label>Secure Account</label>
|
37 |
+
<sort_order>100</sort_order>
|
38 |
+
</Secureaccounts_Extensions>
|
39 |
+
</tabs>
|
40 |
+
<sections>
|
41 |
+
<manageaccounts translate="label" module="manageaccounts">
|
42 |
+
<label>Secure Login Settings</label>
|
43 |
+
<tab>Secureaccounts_Extensions</tab>
|
44 |
+
<sort_order>10</sort_order>
|
45 |
+
<show_in_default>1</show_in_default>
|
46 |
+
<show_in_website>1</show_in_website>
|
47 |
+
<show_in_store>1</show_in_store>
|
48 |
+
<groups>
|
49 |
+
<general translate="label">
|
50 |
+
<label>Secure Login Configuration</label>
|
51 |
+
<frontend_type>text</frontend_type>
|
52 |
+
<sort_order>0</sort_order>
|
53 |
+
<show_in_default>1</show_in_default>
|
54 |
+
<show_in_website>1</show_in_website>
|
55 |
+
<show_in_store>1</show_in_store>
|
56 |
+
<fields>
|
57 |
+
<active translate="label">
|
58 |
+
<label>Enable Module</label>
|
59 |
+
<frontend_type>select</frontend_type>
|
60 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
61 |
+
<sort_order>1</sort_order>
|
62 |
+
<show_in_default>1</show_in_default>
|
63 |
+
<show_in_website>1</show_in_website>
|
64 |
+
<show_in_store>1</show_in_store>
|
65 |
+
</active>
|
66 |
+
<appbaseurl translate="label">
|
67 |
+
<label>App Base Url</label>
|
68 |
+
<frontend_type>textarea</frontend_type>
|
69 |
+
<comment></comment>
|
70 |
+
<sort_order>2</sort_order>
|
71 |
+
<show_in_default>1</show_in_default>
|
72 |
+
<show_in_website>1</show_in_website>
|
73 |
+
<show_in_store>1</show_in_store>
|
74 |
+
</appbaseurl>
|
75 |
+
<tokenkey translate="label">
|
76 |
+
<label>Token Key</label>
|
77 |
+
<frontend_type>textarea</frontend_type>
|
78 |
+
<comment></comment>
|
79 |
+
<sort_order>3</sort_order>
|
80 |
+
<show_in_default>1</show_in_default>
|
81 |
+
<show_in_website>1</show_in_website>
|
82 |
+
<show_in_store>1</show_in_store>
|
83 |
+
</tokenkey>
|
84 |
+
<noofcustomers translate="label">
|
85 |
+
<label>Number of customers</label>
|
86 |
+
<frontend_type>text</frontend_type>
|
87 |
+
<comment></comment>
|
88 |
+
<sort_order>4</sort_order>
|
89 |
+
<show_in_default>1</show_in_default>
|
90 |
+
<show_in_website>1</show_in_website>
|
91 |
+
<show_in_store>1</show_in_store>
|
92 |
+
</noofcustomers>
|
93 |
+
<noofdays translate="label">
|
94 |
+
<label>Number of days</label>
|
95 |
+
<frontend_type>text</frontend_type>
|
96 |
+
<comment></comment>
|
97 |
+
<sort_order>4</sort_order>
|
98 |
+
<show_in_default>1</show_in_default>
|
99 |
+
<show_in_website>1</show_in_website>
|
100 |
+
<show_in_store>1</show_in_store>
|
101 |
+
</noofdays>
|
102 |
+
</fields>
|
103 |
+
</general>
|
104 |
+
</groups>
|
105 |
+
</manageaccounts>
|
106 |
+
</sections>
|
107 |
+
</config>
|
app/code/community/SecureAccounts/ManageAccounts/sql/secureaccounts_manageaccounts_setup/install-1.0.0.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Installer For Sql Tables
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<?php
|
35 |
+
|
36 |
+
$installer = $this;
|
37 |
+
$installer->startSetup();
|
38 |
+
$table = $installer->getConnection()
|
39 |
+
->newTable($installer->getTable('secureaccounts_manageaccounts/compromisedusers'))
|
40 |
+
->addColumn('id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
|
41 |
+
'identity' => true,
|
42 |
+
'unsigned' => false,
|
43 |
+
'nullable' => false,
|
44 |
+
'primary' => true,
|
45 |
+
), 'Id')
|
46 |
+
->addColumn('customer_id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
|
47 |
+
'nullable' => false,
|
48 |
+
'comment' => 'customer id',
|
49 |
+
), 'Customer Id')
|
50 |
+
->addColumn('compromised', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
|
51 |
+
'nullable' => false,
|
52 |
+
'comment' => 'compromised',
|
53 |
+
), 'Compromised')
|
54 |
+
->addColumn('password_hash', Varien_Db_Ddl_Table::TYPE_VARCHAR, null, array(
|
55 |
+
'nullable' => true,
|
56 |
+
'comment' => 'hash password',
|
57 |
+
), 'Hash Password')
|
58 |
+
->addColumn('updated_date', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
|
59 |
+
'nullable' => true,
|
60 |
+
'default' => Varien_Db_Ddl_Table::TIMESTAMP_INIT,
|
61 |
+
'comment' => 'updated date',
|
62 |
+
), 'Date Updated')
|
63 |
+
->addColumn('checked_date', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
|
64 |
+
'nullable' => true,
|
65 |
+
'comment' => 'checked date',
|
66 |
+
), 'Date Checked');
|
67 |
+
$installer->getConnection()->createTable($table);
|
68 |
+
$installer->endSetup();
|
app/design/frontend/base/default/layout/secureaccounts/manageaccounts/manageaccounts.xml
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
|
3 |
+
<layout version="0.1.0">
|
4 |
+
<manageaccounts_ajax_resetpasswordpage>
|
5 |
+
<reference name="head">
|
6 |
+
<action method="addJs" ifconfig="manageaccounts/general/active">
|
7 |
+
<script>secureaccounts/manageaccounts/resetpassword.js</script>
|
8 |
+
</action>
|
9 |
+
<action method="addJs" ifconfig="manageaccounts/general/active">
|
10 |
+
<script>secureaccounts/manageaccounts/jquery.validate.js</script>
|
11 |
+
</action>
|
12 |
+
<action method="addCss" ifconfig="manageaccounts/general/active">
|
13 |
+
<name>secureaccounts/manageaccounts/css/custom_styles.css</name>
|
14 |
+
</action>
|
15 |
+
<action method="addCss" ifconfig="manageaccounts/general/active">
|
16 |
+
<name>secureaccounts/manageaccounts/css/bootstrap.min.css</name>
|
17 |
+
</action>
|
18 |
+
</reference>
|
19 |
+
<reference name="content">
|
20 |
+
<remove name="right.poll"/>
|
21 |
+
<remove name="left.newsletter"/>
|
22 |
+
<remove name="right.permanent.callout"/>
|
23 |
+
<block type="core/template" as="resetpwdemail" name="resetpwdemail">
|
24 |
+
<action method="setTemplate" ifconfig="manageaccounts/general/active">
|
25 |
+
<template>secureaccounts/manageaccounts/resetpassword.phtml</template>
|
26 |
+
</action>
|
27 |
+
</block>
|
28 |
+
</reference>
|
29 |
+
</manageaccounts_ajax_resetpasswordpage>
|
30 |
+
|
31 |
+
<customer_account_login>
|
32 |
+
<reference name="head">
|
33 |
+
<action method="addJs" ifconfig="manageaccounts/general/active">
|
34 |
+
<script>secureaccounts/manageaccounts/login.js</script>
|
35 |
+
</action>
|
36 |
+
|
37 |
+
</reference>
|
38 |
+
<reference name="content">
|
39 |
+
<block type="core/template" as="login-url" name="login-url">
|
40 |
+
<action method="setTemplate" after="customer_form_login" ifconfig="manageaccounts/general/active">
|
41 |
+
<template>secureaccounts/manageaccounts/login_url.phtml</template>
|
42 |
+
</action>
|
43 |
+
</block>
|
44 |
+
</reference>
|
45 |
+
</customer_account_login>
|
46 |
+
</layout>
|
app/design/frontend/base/default/template/secureaccounts/manageaccounts/login_url.phtml
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Template For Getting Url To Check Compromised Customers
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
<span id="secureaccount-api-url" style="display:none;">
|
35 |
+
<?php echo Mage::helper('manageaccounts')->getloginurl();?>
|
36 |
+
</span>
|
app/design/frontend/base/default/template/secureaccounts/manageaccounts/resetpassword.phtml
ADDED
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
* Template For Resetting Password
|
27 |
+
*
|
28 |
+
* @category Preksh
|
29 |
+
* @package SecureAccounts_ManageAccounts
|
30 |
+
* @author Priyanka <priyanka@preksh.com>
|
31 |
+
* @date 4th April, 2016
|
32 |
+
*/
|
33 |
+
?>
|
34 |
+
|
35 |
+
<?php
|
36 |
+
$currentUrl = Mage::helper('core/url')->getCurrentUrl();
|
37 |
+
$getcustId = explode("/customer/", $currentUrl);
|
38 |
+
$gettoken = explode("/token/", $getcustId[0]);
|
39 |
+
?>
|
40 |
+
|
41 |
+
<?php
|
42 |
+
//Check if customer is compromised
|
43 |
+
$if_compromised_customers = Mage::helper('manageaccounts')->getIfCompromisedCustomer($getcustId[1]);
|
44 |
+
if ($if_compromised_customers > 0):
|
45 |
+
?>
|
46 |
+
<form action="<?php echo Mage::getBaseUrl() . 'manageaccounts/ajax/resetpassword'; ?>" id="customer-reset-password" method="post">
|
47 |
+
<input type="hidden" name="custid" value="<?php echo $getcustId[1]; ?>">
|
48 |
+
<input type="hidden" name="token" value="<?php echo $gettoken[1]; ?>">
|
49 |
+
<div class="">
|
50 |
+
<div class="pmp_login">
|
51 |
+
|
52 |
+
<div class="row pmp_row-sm-offset-3">
|
53 |
+
<div class="col-xs-12 col-sm-10">
|
54 |
+
<h2 class="text-center"><?php echo $this->__('Reset Password') ?></h2>
|
55 |
+
<div class="form-group">
|
56 |
+
|
57 |
+
<input type="password" class="form-control" id="newpassword" name="newpassword" placeholder="New Password">
|
58 |
+
</div>
|
59 |
+
<span class="help-block"></span>
|
60 |
+
<div class="form-group">
|
61 |
+
|
62 |
+
<input type="password" class="form-control" name="confrmpassword" placeholder="Confirm Password">
|
63 |
+
</div>
|
64 |
+
<span class="help-block"></span>
|
65 |
+
<input class="btn btn-md btn-primary btn-block" type="submit" name="submit" value="Reset Password">
|
66 |
+
</div>
|
67 |
+
</div>
|
68 |
+
<div class="row">
|
69 |
+
</div>
|
70 |
+
</div>
|
71 |
+
</div>
|
72 |
+
</form>
|
73 |
+
<?php else: ?>
|
74 |
+
<div class="alert alert-danger fade in text-center">
|
75 |
+
<strong>This reset password link is expired!</strong>
|
76 |
+
</div>
|
77 |
+
<?php endif; ?>
|
78 |
+
|
app/etc/modules/SecureAccounts_ManageAccounts.xml
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<!--
|
3 |
+
/**
|
4 |
+
* Preksh
|
5 |
+
*
|
6 |
+
* NOTICE OF LICENSE
|
7 |
+
*
|
8 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
9 |
+
* It is available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
18 |
+
* versions in the future.
|
19 |
+
*
|
20 |
+
* @category Preksh
|
21 |
+
* @package SecureAccounts_ManageAccounts
|
22 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
23 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
24 |
+
*/
|
25 |
+
/**
|
26 |
+
*
|
27 |
+
* @category Preksh
|
28 |
+
* @package SecureAccounts_ManageAccounts
|
29 |
+
* @author Priyanka <priyanka@preksh.com>
|
30 |
+
* @date 4th April, 2016
|
31 |
+
*/
|
32 |
+
-->
|
33 |
+
<config>
|
34 |
+
<modules>
|
35 |
+
<SecureAccounts_ManageAccounts>
|
36 |
+
<active>true</active>
|
37 |
+
<codePool>community</codePool>
|
38 |
+
</SecureAccounts_ManageAccounts>
|
39 |
+
</modules>
|
40 |
+
</config>
|
app/locale/en_US/template/email/secureaccounts/manageaccounts/password_compromise_reset_template.html
ADDED
@@ -0,0 +1,156 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!--
|
2 |
+
/**
|
3 |
+
* Preksh
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* It is available through the world-wide-web at this URL:
|
9 |
+
* http://opensource.org/licenses/osl-3.0.php
|
10 |
+
* If you did not receive a copy of the license and are unable to
|
11 |
+
* obtain it through the world-wide-web, please send an email
|
12 |
+
* to akash@preksh.com so we can send you a copy immediately.
|
13 |
+
*
|
14 |
+
* DISCLAIMER
|
15 |
+
*
|
16 |
+
* Do not edit or add to this file if you wish to upgrade this module to newer
|
17 |
+
* versions in the future.
|
18 |
+
*
|
19 |
+
* @category Preksh
|
20 |
+
* @package SecureAccounts_ManageAccounts
|
21 |
+
* @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
|
22 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
23 |
+
*/
|
24 |
+
/**
|
25 |
+
*Email Template For Reset Password Email
|
26 |
+
* @category Preksh
|
27 |
+
* @package SecureAccounts_ManageAccounts
|
28 |
+
* @author Priyanka <priyanka@preksh.com>
|
29 |
+
* @date 4th April, 2016
|
30 |
+
*/
|
31 |
+
-->
|
32 |
+
|
33 |
+
|
34 |
+
<html>
|
35 |
+
<head>
|
36 |
+
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;" >
|
37 |
+
<title>title</title>
|
38 |
+
</head>
|
39 |
+
<body style="width: 100%;background-color: #ffffff;margin: 0;padding: 0;-webkit-font-smoothing: antialiased;mso-margin-top-alt: 0px;mso-margin-bottom-alt: 0px;mso-padding-alt: 0px 0px 0px 0px;">
|
40 |
+
<table width="100%" class="Bg_Color" bgcolor="#fefefe" cellpadding="0" cellspacing="0" align="center">
|
41 |
+
<tbody>
|
42 |
+
|
43 |
+
<!-- ********************************************************************************************************* -->
|
44 |
+
<!-- Begin Module: PreHeader -->
|
45 |
+
|
46 |
+
<!-- End Module: PreHeader -->
|
47 |
+
|
48 |
+
<!-- Begin Module: Background Image -->
|
49 |
+
<tr>
|
50 |
+
<td class="BgImageAltColor" bgcolor="#ffffff" style="-webkit-text-size-adjust: none;">
|
51 |
+
<table width="100%" border="0" cellpadding="0" cellspacing="0" align="center" style="clear:both; background: #ebebeb;">
|
52 |
+
<tbody>
|
53 |
+
<tr>
|
54 |
+
<td style="-webkit-text-size-adjust: none;">
|
55 |
+
<table width="100%" align="center" cellpadding="0" cellspacing="0">
|
56 |
+
<tbody>
|
57 |
+
<!-- Begin Module: Header_Text -->
|
58 |
+
<tr>
|
59 |
+
<td valign="top" style="-webkit-text-size-adjust: none;">
|
60 |
+
<table class="BoxWrap" width="600" align="center" cellpadding="0" cellspacing="0" style="background: #ffffff; margin-top: 30px; padding: 10px;">
|
61 |
+
<tbody>
|
62 |
+
<tr>
|
63 |
+
<td valign="top" class="Preheader_Color" bgcolor="#ffffff" style="-webkit-text-size-adjust: none;">
|
64 |
+
<table cellpadding="0" cellspacing="0" border="0" class="logo-container">
|
65 |
+
<tr>
|
66 |
+
<td class="logo">
|
67 |
+
<a href="{{var storeurl}}" style="color:#1E7EC8;"><img src="{{skin url="images/logo_email.gif" _area='frontend'}}" alt="Magento" border="0"/></a>
|
68 |
+
</td>
|
69 |
+
</tr>
|
70 |
+
</table>
|
71 |
+
</td>
|
72 |
+
</tr>
|
73 |
+
<tr>
|
74 |
+
<td width="100%" height="2" style="-webkit-text-size-adjust: none;"></td>
|
75 |
+
</tr>
|
76 |
+
<!-- Spacer -->
|
77 |
+
<tr>
|
78 |
+
<td style="-webkit-text-size-adjust: none;">
|
79 |
+
<!-- ************************** -->
|
80 |
+
<!-- Paragraph -->
|
81 |
+
<table class="BoxWrap" width="100%" cellpadding="2" cellspacing="0" style="border: 1px solid rgb(242, 100, 34); border-bottom:0;">
|
82 |
+
<tbody>
|
83 |
+
<tr>
|
84 |
+
<td width="40%" style="-webkit-text-size-adjust: none;"><hr style="height: 3px; border: 1px solid #b5b5b5;"></td>
|
85 |
+
<td style="-webkit-text-size-adjust: none;">
|
86 |
+
<h2 style="text-align: center;color: #393939;font-size: 22px;margin: 10px 0 10px 0;font-weight: normal;line-height: 22px;text-decoration: none;text-transform: uppercase;font-family: Helvetica, Arial, sans-serif; text-transform:none;">Hi {{var customername}}</h2>
|
87 |
+
</td>
|
88 |
+
<td width="40%" style="-webkit-text-size-adjust: none;"><hr style="height: 3px; border: 1px solid #b5b5b5;"></td>
|
89 |
+
</tr>
|
90 |
+
</tbody>
|
91 |
+
</table>
|
92 |
+
<table class="BoxWrap" width="100%" cellpadding="2" cellspacing="0" style="border: 1px solid rgb(242, 100, 34);">
|
93 |
+
<tr>
|
94 |
+
<td class="action-content">
|
95 |
+
<table class="BoxWrap" width="100%" cellpadding="2" cellspacing="0">
|
96 |
+
<tbody>
|
97 |
+
<tr>
|
98 |
+
<td style="-webkit-text-size-adjust: none;">
|
99 |
+
<h1 style="font-family: Helvetica,Arial,sans-serif; font-weight: normal; font-style: normal; color: rgb(98, 98, 98); padding: 5px 18px; text-transform: none; font-size: 14px; line-height: 20px; text-align: justify;">
|
100 |
+
We have recently discovered that the password for your account has been exposed on the Internet. It is critical that you reset your password as soon as possible to protect your account. If you also use the password in other websites or apps, you should also reset password there.
|
101 |
+
</h1>
|
102 |
+
</td>
|
103 |
+
</tr>
|
104 |
+
|
105 |
+
</tbody>
|
106 |
+
</table>
|
107 |
+
<table width="35%" align="center" class="Color02_B" bgcolor="#f26422 " cellpadding="3" cellspacing="0">
|
108 |
+
<tbody>
|
109 |
+
<tr>
|
110 |
+
<td style="-webkit-text-size-adjust: none;">
|
111 |
+
<h1 style="text-align: center;text-transform: uppercase;font-size: 13px;margin: 0;font-family: Helvetica, Arial, sans-serif;font-weight: normal;font-style: normal;color: #353535;line-height: 40px;"><a href="{{var forgoturl}}" style="text-transform: uppercase;text-decoration: none;color: #ffffff;-webkit-text-size-adjust: none;line-height: 30px;">Reset Password</a></h1></td>
|
112 |
+
</tr>
|
113 |
+
</tbody>
|
114 |
+
</table>
|
115 |
+
<table class="BoxWrap" width="100%" cellpadding="2" cellspacing="0">
|
116 |
+
<tbody>
|
117 |
+
<tr>
|
118 |
+
<td style="-webkit-text-size-adjust: none;">
|
119 |
+
<h1 style="font-family: Helvetica,Arial,sans-serif; font-weight: normal; font-style: normal; color: rgb(98, 98, 98); padding: 5px 18px; text-transform: none; font-size: 14px; line-height: 20px; text-align: justify;">
|
120 |
+
</h1>
|
121 |
+
</td>
|
122 |
+
</tr>
|
123 |
+
|
124 |
+
</tbody>
|
125 |
+
</table>
|
126 |
+
|
127 |
+
</td>
|
128 |
+
</tr>
|
129 |
+
</table>
|
130 |
+
</td>
|
131 |
+
</tr>
|
132 |
+
</tbody>
|
133 |
+
</table>
|
134 |
+
</td>
|
135 |
+
</tr>
|
136 |
+
<tr>
|
137 |
+
<td valign="top" height="40" style="-webkit-text-size-adjust: none;">
|
138 |
+
</td>
|
139 |
+
</tr>
|
140 |
+
</tbody>
|
141 |
+
</table>
|
142 |
+
</td>
|
143 |
+
</tr>
|
144 |
+
</tbody>
|
145 |
+
</table>
|
146 |
+
</td>
|
147 |
+
</tr>
|
148 |
+
</tbody>
|
149 |
+
</table>
|
150 |
+
</body>
|
151 |
+
</html>
|
152 |
+
|
153 |
+
|
154 |
+
|
155 |
+
|
156 |
+
|
js/secureaccounts/manageaccounts/jquery.validate.js
ADDED
@@ -0,0 +1,1365 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* jQuery Validation Plugin v1.13.1
|
3 |
+
*
|
4 |
+
* http://jqueryvalidation.org/
|
5 |
+
*
|
6 |
+
* Copyright (c) 2014 Jörn Zaefferer
|
7 |
+
* Released under the MIT license
|
8 |
+
*/
|
9 |
+
(function( factory ) {
|
10 |
+
if ( typeof define === "function" && define.amd ) {
|
11 |
+
define( ["jquery"], factory );
|
12 |
+
} else {
|
13 |
+
factory( jQuery );
|
14 |
+
}
|
15 |
+
}(function( $ ) {
|
16 |
+
|
17 |
+
$.extend($.fn, {
|
18 |
+
// http://jqueryvalidation.org/validate/
|
19 |
+
validate: function( options ) {
|
20 |
+
|
21 |
+
// if nothing is selected, return nothing; can't chain anyway
|
22 |
+
if ( !this.length ) {
|
23 |
+
if ( options && options.debug && window.console ) {
|
24 |
+
console.warn( "Nothing selected, can't validate, returning nothing." );
|
25 |
+
}
|
26 |
+
return;
|
27 |
+
}
|
28 |
+
|
29 |
+
// check if a validator for this form was already created
|
30 |
+
var validator = $.data( this[ 0 ], "validator" );
|
31 |
+
if ( validator ) {
|
32 |
+
return validator;
|
33 |
+
}
|
34 |
+
|
35 |
+
// Add novalidate tag if HTML5.
|
36 |
+
this.attr( "novalidate", "novalidate" );
|
37 |
+
|
38 |
+
validator = new $.validator( options, this[ 0 ] );
|
39 |
+
$.data( this[ 0 ], "validator", validator );
|
40 |
+
|
41 |
+
if ( validator.settings.onsubmit ) {
|
42 |
+
|
43 |
+
this.validateDelegate( ":submit", "click", function( event ) {
|
44 |
+
if ( validator.settings.submitHandler ) {
|
45 |
+
validator.submitButton = event.target;
|
46 |
+
}
|
47 |
+
// allow suppressing validation by adding a cancel class to the submit button
|
48 |
+
if ( $( event.target ).hasClass( "cancel" ) ) {
|
49 |
+
validator.cancelSubmit = true;
|
50 |
+
}
|
51 |
+
|
52 |
+
// allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
|
53 |
+
if ( $( event.target ).attr( "formnovalidate" ) !== undefined ) {
|
54 |
+
validator.cancelSubmit = true;
|
55 |
+
}
|
56 |
+
});
|
57 |
+
|
58 |
+
// validate the form on submit
|
59 |
+
this.submit( function( event ) {
|
60 |
+
if ( validator.settings.debug ) {
|
61 |
+
// prevent form submit to be able to see console output
|
62 |
+
event.preventDefault();
|
63 |
+
}
|
64 |
+
function handle() {
|
65 |
+
var hidden, result;
|
66 |
+
if ( validator.settings.submitHandler ) {
|
67 |
+
if ( validator.submitButton ) {
|
68 |
+
// insert a hidden input as a replacement for the missing submit button
|
69 |
+
hidden = $( "<input type='hidden'/>" )
|
70 |
+
.attr( "name", validator.submitButton.name )
|
71 |
+
.val( $( validator.submitButton ).val() )
|
72 |
+
.appendTo( validator.currentForm );
|
73 |
+
}
|
74 |
+
result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
|
75 |
+
if ( validator.submitButton ) {
|
76 |
+
// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
|
77 |
+
hidden.remove();
|
78 |
+
}
|
79 |
+
if ( result !== undefined ) {
|
80 |
+
return result;
|
81 |
+
}
|
82 |
+
return false;
|
83 |
+
}
|
84 |
+
return true;
|
85 |
+
}
|
86 |
+
|
87 |
+
// prevent submit for invalid forms or custom submit handlers
|
88 |
+
if ( validator.cancelSubmit ) {
|
89 |
+
validator.cancelSubmit = false;
|
90 |
+
return handle();
|
91 |
+
}
|
92 |
+
if ( validator.form() ) {
|
93 |
+
if ( validator.pendingRequest ) {
|
94 |
+
validator.formSubmitted = true;
|
95 |
+
return false;
|
96 |
+
}
|
97 |
+
return handle();
|
98 |
+
} else {
|
99 |
+
validator.focusInvalid();
|
100 |
+
return false;
|
101 |
+
}
|
102 |
+
});
|
103 |
+
}
|
104 |
+
|
105 |
+
return validator;
|
106 |
+
},
|
107 |
+
// http://jqueryvalidation.org/valid/
|
108 |
+
valid: function() {
|
109 |
+
var valid, validator;
|
110 |
+
|
111 |
+
if ( $( this[ 0 ] ).is( "form" ) ) {
|
112 |
+
valid = this.validate().form();
|
113 |
+
} else {
|
114 |
+
valid = true;
|
115 |
+
validator = $( this[ 0 ].form ).validate();
|
116 |
+
this.each( function() {
|
117 |
+
valid = validator.element( this ) && valid;
|
118 |
+
});
|
119 |
+
}
|
120 |
+
return valid;
|
121 |
+
},
|
122 |
+
// attributes: space separated list of attributes to retrieve and remove
|
123 |
+
removeAttrs: function( attributes ) {
|
124 |
+
var result = {},
|
125 |
+
$element = this;
|
126 |
+
$.each( attributes.split( /\s/ ), function( index, value ) {
|
127 |
+
result[ value ] = $element.attr( value );
|
128 |
+
$element.removeAttr( value );
|
129 |
+
});
|
130 |
+
return result;
|
131 |
+
},
|
132 |
+
// http://jqueryvalidation.org/rules/
|
133 |
+
rules: function( command, argument ) {
|
134 |
+
var element = this[ 0 ],
|
135 |
+
settings, staticRules, existingRules, data, param, filtered;
|
136 |
+
|
137 |
+
if ( command ) {
|
138 |
+
settings = $.data( element.form, "validator" ).settings;
|
139 |
+
staticRules = settings.rules;
|
140 |
+
existingRules = $.validator.staticRules( element );
|
141 |
+
switch ( command ) {
|
142 |
+
case "add":
|
143 |
+
$.extend( existingRules, $.validator.normalizeRule( argument ) );
|
144 |
+
// remove messages from rules, but allow them to be set separately
|
145 |
+
delete existingRules.messages;
|
146 |
+
staticRules[ element.name ] = existingRules;
|
147 |
+
if ( argument.messages ) {
|
148 |
+
settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
|
149 |
+
}
|
150 |
+
break;
|
151 |
+
case "remove":
|
152 |
+
if ( !argument ) {
|
153 |
+
delete staticRules[ element.name ];
|
154 |
+
return existingRules;
|
155 |
+
}
|
156 |
+
filtered = {};
|
157 |
+
$.each( argument.split( /\s/ ), function( index, method ) {
|
158 |
+
filtered[ method ] = existingRules[ method ];
|
159 |
+
delete existingRules[ method ];
|
160 |
+
if ( method === "required" ) {
|
161 |
+
$( element ).removeAttr( "aria-required" );
|
162 |
+
}
|
163 |
+
});
|
164 |
+
return filtered;
|
165 |
+
}
|
166 |
+
}
|
167 |
+
|
168 |
+
data = $.validator.normalizeRules(
|
169 |
+
$.extend(
|
170 |
+
{},
|
171 |
+
$.validator.classRules( element ),
|
172 |
+
$.validator.attributeRules( element ),
|
173 |
+
$.validator.dataRules( element ),
|
174 |
+
$.validator.staticRules( element )
|
175 |
+
), element );
|
176 |
+
|
177 |
+
// make sure required is at front
|
178 |
+
if ( data.required ) {
|
179 |
+
param = data.required;
|
180 |
+
delete data.required;
|
181 |
+
data = $.extend( { required: param }, data );
|
182 |
+
$( element ).attr( "aria-required", "true" );
|
183 |
+
}
|
184 |
+
|
185 |
+
// make sure remote is at back
|
186 |
+
if ( data.remote ) {
|
187 |
+
param = data.remote;
|
188 |
+
delete data.remote;
|
189 |
+
data = $.extend( data, { remote: param });
|
190 |
+
}
|
191 |
+
|
192 |
+
return data;
|
193 |
+
}
|
194 |
+
});
|
195 |
+
|
196 |
+
// Custom selectors
|
197 |
+
$.extend( $.expr[ ":" ], {
|
198 |
+
// http://jqueryvalidation.org/blank-selector/
|
199 |
+
blank: function( a ) {
|
200 |
+
return !$.trim( "" + $( a ).val() );
|
201 |
+
},
|
202 |
+
// http://jqueryvalidation.org/filled-selector/
|
203 |
+
filled: function( a ) {
|
204 |
+
return !!$.trim( "" + $( a ).val() );
|
205 |
+
},
|
206 |
+
// http://jqueryvalidation.org/unchecked-selector/
|
207 |
+
unchecked: function( a ) {
|
208 |
+
return !$( a ).prop( "checked" );
|
209 |
+
}
|
210 |
+
});
|
211 |
+
|
212 |
+
// constructor for validator
|
213 |
+
$.validator = function( options, form ) {
|
214 |
+
this.settings = $.extend( true, {}, $.validator.defaults, options );
|
215 |
+
this.currentForm = form;
|
216 |
+
this.init();
|
217 |
+
};
|
218 |
+
|
219 |
+
// http://jqueryvalidation.org/jQuery.validator.format/
|
220 |
+
$.validator.format = function( source, params ) {
|
221 |
+
if ( arguments.length === 1 ) {
|
222 |
+
return function() {
|
223 |
+
var args = $.makeArray( arguments );
|
224 |
+
args.unshift( source );
|
225 |
+
return $.validator.format.apply( this, args );
|
226 |
+
};
|
227 |
+
}
|
228 |
+
if ( arguments.length > 2 && params.constructor !== Array ) {
|
229 |
+
params = $.makeArray( arguments ).slice( 1 );
|
230 |
+
}
|
231 |
+
if ( params.constructor !== Array ) {
|
232 |
+
params = [ params ];
|
233 |
+
}
|
234 |
+
$.each( params, function( i, n ) {
|
235 |
+
source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
|
236 |
+
return n;
|
237 |
+
});
|
238 |
+
});
|
239 |
+
return source;
|
240 |
+
};
|
241 |
+
|
242 |
+
$.extend( $.validator, {
|
243 |
+
|
244 |
+
defaults: {
|
245 |
+
messages: {},
|
246 |
+
groups: {},
|
247 |
+
rules: {},
|
248 |
+
errorClass: "error",
|
249 |
+
validClass: "valid",
|
250 |
+
errorElement: "label",
|
251 |
+
focusCleanup: false,
|
252 |
+
focusInvalid: true,
|
253 |
+
errorContainer: $( [] ),
|
254 |
+
errorLabelContainer: $( [] ),
|
255 |
+
onsubmit: true,
|
256 |
+
ignore: ":hidden",
|
257 |
+
ignoreTitle: false,
|
258 |
+
onfocusin: function( element ) {
|
259 |
+
this.lastActive = element;
|
260 |
+
|
261 |
+
// Hide error label and remove error class on focus if enabled
|
262 |
+
if ( this.settings.focusCleanup ) {
|
263 |
+
if ( this.settings.unhighlight ) {
|
264 |
+
this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
|
265 |
+
}
|
266 |
+
this.hideThese( this.errorsFor( element ) );
|
267 |
+
}
|
268 |
+
},
|
269 |
+
onfocusout: function( element ) {
|
270 |
+
if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
|
271 |
+
this.element( element );
|
272 |
+
}
|
273 |
+
},
|
274 |
+
onkeyup: function( element, event ) {
|
275 |
+
if ( event.which === 9 && this.elementValue( element ) === "" ) {
|
276 |
+
return;
|
277 |
+
} else if ( element.name in this.submitted || element === this.lastElement ) {
|
278 |
+
this.element( element );
|
279 |
+
}
|
280 |
+
},
|
281 |
+
onclick: function( element ) {
|
282 |
+
// click on selects, radiobuttons and checkboxes
|
283 |
+
if ( element.name in this.submitted ) {
|
284 |
+
this.element( element );
|
285 |
+
|
286 |
+
// or option elements, check parent select in that case
|
287 |
+
} else if ( element.parentNode.name in this.submitted ) {
|
288 |
+
this.element( element.parentNode );
|
289 |
+
}
|
290 |
+
},
|
291 |
+
highlight: function( element, errorClass, validClass ) {
|
292 |
+
if ( element.type === "radio" ) {
|
293 |
+
this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
|
294 |
+
} else {
|
295 |
+
$( element ).addClass( errorClass ).removeClass( validClass );
|
296 |
+
}
|
297 |
+
},
|
298 |
+
unhighlight: function( element, errorClass, validClass ) {
|
299 |
+
if ( element.type === "radio" ) {
|
300 |
+
this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
|
301 |
+
} else {
|
302 |
+
$( element ).removeClass( errorClass ).addClass( validClass );
|
303 |
+
}
|
304 |
+
}
|
305 |
+
},
|
306 |
+
|
307 |
+
// http://jqueryvalidation.org/jQuery.validator.setDefaults/
|
308 |
+
setDefaults: function( settings ) {
|
309 |
+
$.extend( $.validator.defaults, settings );
|
310 |
+
},
|
311 |
+
|
312 |
+
messages: {
|
313 |
+
required: "This field is required.",
|
314 |
+
remote: "Please fix this field.",
|
315 |
+
email: "Please enter a valid email address.",
|
316 |
+
url: "Please enter a valid URL.",
|
317 |
+
date: "Please enter a valid date.",
|
318 |
+
dateISO: "Please enter a valid date ( ISO ).",
|
319 |
+
number: "Please enter a valid number.",
|
320 |
+
digits: "Please enter only digits.",
|
321 |
+
creditcard: "Please enter a valid credit card number.",
|
322 |
+
equalTo: "Please enter the same value again.",
|
323 |
+
maxlength: $.validator.format( "Please enter no more than {0} characters." ),
|
324 |
+
minlength: $.validator.format( "Please enter at least {0} characters." ),
|
325 |
+
rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
|
326 |
+
range: $.validator.format( "Please enter a value between {0} and {1}." ),
|
327 |
+
max: $.validator.format( "Please enter a value less than or equal to {0}." ),
|
328 |
+
min: $.validator.format( "Please enter a value greater than or equal to {0}." )
|
329 |
+
},
|
330 |
+
|
331 |
+
autoCreateRanges: false,
|
332 |
+
|
333 |
+
prototype: {
|
334 |
+
|
335 |
+
init: function() {
|
336 |
+
this.labelContainer = $( this.settings.errorLabelContainer );
|
337 |
+
this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
|
338 |
+
this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
|
339 |
+
this.submitted = {};
|
340 |
+
this.valueCache = {};
|
341 |
+
this.pendingRequest = 0;
|
342 |
+
this.pending = {};
|
343 |
+
this.invalid = {};
|
344 |
+
this.reset();
|
345 |
+
|
346 |
+
var groups = ( this.groups = {} ),
|
347 |
+
rules;
|
348 |
+
$.each( this.settings.groups, function( key, value ) {
|
349 |
+
if ( typeof value === "string" ) {
|
350 |
+
value = value.split( /\s/ );
|
351 |
+
}
|
352 |
+
$.each( value, function( index, name ) {
|
353 |
+
groups[ name ] = key;
|
354 |
+
});
|
355 |
+
});
|
356 |
+
rules = this.settings.rules;
|
357 |
+
$.each( rules, function( key, value ) {
|
358 |
+
rules[ key ] = $.validator.normalizeRule( value );
|
359 |
+
});
|
360 |
+
|
361 |
+
function delegate( event ) {
|
362 |
+
var validator = $.data( this[ 0 ].form, "validator" ),
|
363 |
+
eventType = "on" + event.type.replace( /^validate/, "" ),
|
364 |
+
settings = validator.settings;
|
365 |
+
if ( settings[ eventType ] && !this.is( settings.ignore ) ) {
|
366 |
+
settings[ eventType ].call( validator, this[ 0 ], event );
|
367 |
+
}
|
368 |
+
}
|
369 |
+
$( this.currentForm )
|
370 |
+
.validateDelegate( ":text, [type='password'], [type='file'], select, textarea, " +
|
371 |
+
"[type='number'], [type='search'] ,[type='tel'], [type='url'], " +
|
372 |
+
"[type='email'], [type='datetime'], [type='date'], [type='month'], " +
|
373 |
+
"[type='week'], [type='time'], [type='datetime-local'], " +
|
374 |
+
"[type='range'], [type='color'], [type='radio'], [type='checkbox']",
|
375 |
+
"focusin focusout keyup", delegate)
|
376 |
+
// Support: Chrome, oldIE
|
377 |
+
// "select" is provided as event.target when clicking a option
|
378 |
+
.validateDelegate("select, option, [type='radio'], [type='checkbox']", "click", delegate);
|
379 |
+
|
380 |
+
if ( this.settings.invalidHandler ) {
|
381 |
+
$( this.currentForm ).bind( "invalid-form.validate", this.settings.invalidHandler );
|
382 |
+
}
|
383 |
+
|
384 |
+
// Add aria-required to any Static/Data/Class required fields before first validation
|
385 |
+
// Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
|
386 |
+
$( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" );
|
387 |
+
},
|
388 |
+
|
389 |
+
// http://jqueryvalidation.org/Validator.form/
|
390 |
+
form: function() {
|
391 |
+
this.checkForm();
|
392 |
+
$.extend( this.submitted, this.errorMap );
|
393 |
+
this.invalid = $.extend({}, this.errorMap );
|
394 |
+
if ( !this.valid() ) {
|
395 |
+
$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
|
396 |
+
}
|
397 |
+
this.showErrors();
|
398 |
+
return this.valid();
|
399 |
+
},
|
400 |
+
|
401 |
+
checkForm: function() {
|
402 |
+
this.prepareForm();
|
403 |
+
for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
|
404 |
+
this.check( elements[ i ] );
|
405 |
+
}
|
406 |
+
return this.valid();
|
407 |
+
},
|
408 |
+
|
409 |
+
// http://jqueryvalidation.org/Validator.element/
|
410 |
+
element: function( element ) {
|
411 |
+
var cleanElement = this.clean( element ),
|
412 |
+
checkElement = this.validationTargetFor( cleanElement ),
|
413 |
+
result = true;
|
414 |
+
|
415 |
+
this.lastElement = checkElement;
|
416 |
+
|
417 |
+
if ( checkElement === undefined ) {
|
418 |
+
delete this.invalid[ cleanElement.name ];
|
419 |
+
} else {
|
420 |
+
this.prepareElement( checkElement );
|
421 |
+
this.currentElements = $( checkElement );
|
422 |
+
|
423 |
+
result = this.check( checkElement ) !== false;
|
424 |
+
if ( result ) {
|
425 |
+
delete this.invalid[ checkElement.name ];
|
426 |
+
} else {
|
427 |
+
this.invalid[ checkElement.name ] = true;
|
428 |
+
}
|
429 |
+
}
|
430 |
+
// Add aria-invalid status for screen readers
|
431 |
+
$( element ).attr( "aria-invalid", !result );
|
432 |
+
|
433 |
+
if ( !this.numberOfInvalids() ) {
|
434 |
+
// Hide error containers on last error
|
435 |
+
this.toHide = this.toHide.add( this.containers );
|
436 |
+
}
|
437 |
+
this.showErrors();
|
438 |
+
return result;
|
439 |
+
},
|
440 |
+
|
441 |
+
// http://jqueryvalidation.org/Validator.showErrors/
|
442 |
+
showErrors: function( errors ) {
|
443 |
+
if ( errors ) {
|
444 |
+
// add items to error list and map
|
445 |
+
$.extend( this.errorMap, errors );
|
446 |
+
this.errorList = [];
|
447 |
+
for ( var name in errors ) {
|
448 |
+
this.errorList.push({
|
449 |
+
message: errors[ name ],
|
450 |
+
element: this.findByName( name )[ 0 ]
|
451 |
+
});
|
452 |
+
}
|
453 |
+
// remove items from success list
|
454 |
+
this.successList = $.grep( this.successList, function( element ) {
|
455 |
+
return !( element.name in errors );
|
456 |
+
});
|
457 |
+
}
|
458 |
+
if ( this.settings.showErrors ) {
|
459 |
+
this.settings.showErrors.call( this, this.errorMap, this.errorList );
|
460 |
+
} else {
|
461 |
+
this.defaultShowErrors();
|
462 |
+
}
|
463 |
+
},
|
464 |
+
|
465 |
+
// http://jqueryvalidation.org/Validator.resetForm/
|
466 |
+
resetForm: function() {
|
467 |
+
if ( $.fn.resetForm ) {
|
468 |
+
$( this.currentForm ).resetForm();
|
469 |
+
}
|
470 |
+
this.submitted = {};
|
471 |
+
this.lastElement = null;
|
472 |
+
this.prepareForm();
|
473 |
+
this.hideErrors();
|
474 |
+
this.elements()
|
475 |
+
.removeClass( this.settings.errorClass )
|
476 |
+
.removeData( "previousValue" )
|
477 |
+
.removeAttr( "aria-invalid" );
|
478 |
+
},
|
479 |
+
|
480 |
+
numberOfInvalids: function() {
|
481 |
+
return this.objectLength( this.invalid );
|
482 |
+
},
|
483 |
+
|
484 |
+
objectLength: function( obj ) {
|
485 |
+
/* jshint unused: false */
|
486 |
+
var count = 0,
|
487 |
+
i;
|
488 |
+
for ( i in obj ) {
|
489 |
+
count++;
|
490 |
+
}
|
491 |
+
return count;
|
492 |
+
},
|
493 |
+
|
494 |
+
hideErrors: function() {
|
495 |
+
this.hideThese( this.toHide );
|
496 |
+
},
|
497 |
+
|
498 |
+
hideThese: function( errors ) {
|
499 |
+
errors.not( this.containers ).text( "" );
|
500 |
+
this.addWrapper( errors ).hide();
|
501 |
+
},
|
502 |
+
|
503 |
+
valid: function() {
|
504 |
+
return this.size() === 0;
|
505 |
+
},
|
506 |
+
|
507 |
+
size: function() {
|
508 |
+
return this.errorList.length;
|
509 |
+
},
|
510 |
+
|
511 |
+
focusInvalid: function() {
|
512 |
+
if ( this.settings.focusInvalid ) {
|
513 |
+
try {
|
514 |
+
$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
|
515 |
+
.filter( ":visible" )
|
516 |
+
.focus()
|
517 |
+
// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
|
518 |
+
.trigger( "focusin" );
|
519 |
+
} catch ( e ) {
|
520 |
+
// ignore IE throwing errors when focusing hidden elements
|
521 |
+
}
|
522 |
+
}
|
523 |
+
},
|
524 |
+
|
525 |
+
findLastActive: function() {
|
526 |
+
var lastActive = this.lastActive;
|
527 |
+
return lastActive && $.grep( this.errorList, function( n ) {
|
528 |
+
return n.element.name === lastActive.name;
|
529 |
+
}).length === 1 && lastActive;
|
530 |
+
},
|
531 |
+
|
532 |
+
elements: function() {
|
533 |
+
var validator = this,
|
534 |
+
rulesCache = {};
|
535 |
+
|
536 |
+
// select all valid inputs inside the form (no submit or reset buttons)
|
537 |
+
return $( this.currentForm )
|
538 |
+
.find( "input, select, textarea" )
|
539 |
+
.not( ":submit, :reset, :image, [disabled], [readonly]" )
|
540 |
+
.not( this.settings.ignore )
|
541 |
+
.filter( function() {
|
542 |
+
if ( !this.name && validator.settings.debug && window.console ) {
|
543 |
+
console.error( "%o has no name assigned", this );
|
544 |
+
}
|
545 |
+
|
546 |
+
// select only the first element for each name, and only those with rules specified
|
547 |
+
if ( this.name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
|
548 |
+
return false;
|
549 |
+
}
|
550 |
+
|
551 |
+
rulesCache[ this.name ] = true;
|
552 |
+
return true;
|
553 |
+
});
|
554 |
+
},
|
555 |
+
|
556 |
+
clean: function( selector ) {
|
557 |
+
return $( selector )[ 0 ];
|
558 |
+
},
|
559 |
+
|
560 |
+
errors: function() {
|
561 |
+
var errorClass = this.settings.errorClass.split( " " ).join( "." );
|
562 |
+
return $( this.settings.errorElement + "." + errorClass, this.errorContext );
|
563 |
+
},
|
564 |
+
|
565 |
+
reset: function() {
|
566 |
+
this.successList = [];
|
567 |
+
this.errorList = [];
|
568 |
+
this.errorMap = {};
|
569 |
+
this.toShow = $( [] );
|
570 |
+
this.toHide = $( [] );
|
571 |
+
this.currentElements = $( [] );
|
572 |
+
},
|
573 |
+
|
574 |
+
prepareForm: function() {
|
575 |
+
this.reset();
|
576 |
+
this.toHide = this.errors().add( this.containers );
|
577 |
+
},
|
578 |
+
|
579 |
+
prepareElement: function( element ) {
|
580 |
+
this.reset();
|
581 |
+
this.toHide = this.errorsFor( element );
|
582 |
+
},
|
583 |
+
|
584 |
+
elementValue: function( element ) {
|
585 |
+
var val,
|
586 |
+
$element = $( element ),
|
587 |
+
type = element.type;
|
588 |
+
|
589 |
+
if ( type === "radio" || type === "checkbox" ) {
|
590 |
+
return $( "input[name='" + element.name + "']:checked" ).val();
|
591 |
+
} else if ( type === "number" && typeof element.validity !== "undefined" ) {
|
592 |
+
return element.validity.badInput ? false : $element.val();
|
593 |
+
}
|
594 |
+
|
595 |
+
val = $element.val();
|
596 |
+
if ( typeof val === "string" ) {
|
597 |
+
return val.replace(/\r/g, "" );
|
598 |
+
}
|
599 |
+
return val;
|
600 |
+
},
|
601 |
+
|
602 |
+
check: function( element ) {
|
603 |
+
element = this.validationTargetFor( this.clean( element ) );
|
604 |
+
|
605 |
+
var rules = $( element ).rules(),
|
606 |
+
rulesCount = $.map( rules, function( n, i ) {
|
607 |
+
return i;
|
608 |
+
}).length,
|
609 |
+
dependencyMismatch = false,
|
610 |
+
val = this.elementValue( element ),
|
611 |
+
result, method, rule;
|
612 |
+
|
613 |
+
for ( method in rules ) {
|
614 |
+
rule = { method: method, parameters: rules[ method ] };
|
615 |
+
try {
|
616 |
+
|
617 |
+
result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
|
618 |
+
|
619 |
+
// if a method indicates that the field is optional and therefore valid,
|
620 |
+
// don't mark it as valid when there are no other rules
|
621 |
+
if ( result === "dependency-mismatch" && rulesCount === 1 ) {
|
622 |
+
dependencyMismatch = true;
|
623 |
+
continue;
|
624 |
+
}
|
625 |
+
dependencyMismatch = false;
|
626 |
+
|
627 |
+
if ( result === "pending" ) {
|
628 |
+
this.toHide = this.toHide.not( this.errorsFor( element ) );
|
629 |
+
return;
|
630 |
+
}
|
631 |
+
|
632 |
+
if ( !result ) {
|
633 |
+
this.formatAndAdd( element, rule );
|
634 |
+
return false;
|
635 |
+
}
|
636 |
+
} catch ( e ) {
|
637 |
+
if ( this.settings.debug && window.console ) {
|
638 |
+
console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
|
639 |
+
}
|
640 |
+
throw e;
|
641 |
+
}
|
642 |
+
}
|
643 |
+
if ( dependencyMismatch ) {
|
644 |
+
return;
|
645 |
+
}
|
646 |
+
if ( this.objectLength( rules ) ) {
|
647 |
+
this.successList.push( element );
|
648 |
+
}
|
649 |
+
return true;
|
650 |
+
},
|
651 |
+
|
652 |
+
// return the custom message for the given element and validation method
|
653 |
+
// specified in the element's HTML5 data attribute
|
654 |
+
// return the generic message if present and no method specific message is present
|
655 |
+
customDataMessage: function( element, method ) {
|
656 |
+
return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
|
657 |
+
method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
|
658 |
+
},
|
659 |
+
|
660 |
+
// return the custom message for the given element name and validation method
|
661 |
+
customMessage: function( name, method ) {
|
662 |
+
var m = this.settings.messages[ name ];
|
663 |
+
return m && ( m.constructor === String ? m : m[ method ]);
|
664 |
+
},
|
665 |
+
|
666 |
+
// return the first defined argument, allowing empty strings
|
667 |
+
findDefined: function() {
|
668 |
+
for ( var i = 0; i < arguments.length; i++) {
|
669 |
+
if ( arguments[ i ] !== undefined ) {
|
670 |
+
return arguments[ i ];
|
671 |
+
}
|
672 |
+
}
|
673 |
+
return undefined;
|
674 |
+
},
|
675 |
+
|
676 |
+
defaultMessage: function( element, method ) {
|
677 |
+
return this.findDefined(
|
678 |
+
this.customMessage( element.name, method ),
|
679 |
+
this.customDataMessage( element, method ),
|
680 |
+
// title is never undefined, so handle empty string as undefined
|
681 |
+
!this.settings.ignoreTitle && element.title || undefined,
|
682 |
+
$.validator.messages[ method ],
|
683 |
+
"<strong>Warning: No message defined for " + element.name + "</strong>"
|
684 |
+
);
|
685 |
+
},
|
686 |
+
|
687 |
+
formatAndAdd: function( element, rule ) {
|
688 |
+
var message = this.defaultMessage( element, rule.method ),
|
689 |
+
theregex = /\$?\{(\d+)\}/g;
|
690 |
+
if ( typeof message === "function" ) {
|
691 |
+
message = message.call( this, rule.parameters, element );
|
692 |
+
} else if ( theregex.test( message ) ) {
|
693 |
+
message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
|
694 |
+
}
|
695 |
+
this.errorList.push({
|
696 |
+
message: message,
|
697 |
+
element: element,
|
698 |
+
method: rule.method
|
699 |
+
});
|
700 |
+
|
701 |
+
this.errorMap[ element.name ] = message;
|
702 |
+
this.submitted[ element.name ] = message;
|
703 |
+
},
|
704 |
+
|
705 |
+
addWrapper: function( toToggle ) {
|
706 |
+
if ( this.settings.wrapper ) {
|
707 |
+
toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
|
708 |
+
}
|
709 |
+
return toToggle;
|
710 |
+
},
|
711 |
+
|
712 |
+
defaultShowErrors: function() {
|
713 |
+
var i, elements, error;
|
714 |
+
for ( i = 0; this.errorList[ i ]; i++ ) {
|
715 |
+
error = this.errorList[ i ];
|
716 |
+
if ( this.settings.highlight ) {
|
717 |
+
this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
|
718 |
+
}
|
719 |
+
this.showLabel( error.element, error.message );
|
720 |
+
}
|
721 |
+
if ( this.errorList.length ) {
|
722 |
+
this.toShow = this.toShow.add( this.containers );
|
723 |
+
}
|
724 |
+
if ( this.settings.success ) {
|
725 |
+
for ( i = 0; this.successList[ i ]; i++ ) {
|
726 |
+
this.showLabel( this.successList[ i ] );
|
727 |
+
}
|
728 |
+
}
|
729 |
+
if ( this.settings.unhighlight ) {
|
730 |
+
for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
|
731 |
+
this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
|
732 |
+
}
|
733 |
+
}
|
734 |
+
this.toHide = this.toHide.not( this.toShow );
|
735 |
+
this.hideErrors();
|
736 |
+
this.addWrapper( this.toShow ).show();
|
737 |
+
},
|
738 |
+
|
739 |
+
validElements: function() {
|
740 |
+
return this.currentElements.not( this.invalidElements() );
|
741 |
+
},
|
742 |
+
|
743 |
+
invalidElements: function() {
|
744 |
+
return $( this.errorList ).map(function() {
|
745 |
+
return this.element;
|
746 |
+
});
|
747 |
+
},
|
748 |
+
|
749 |
+
showLabel: function( element, message ) {
|
750 |
+
var place, group, errorID,
|
751 |
+
error = this.errorsFor( element ),
|
752 |
+
elementID = this.idOrName( element ),
|
753 |
+
describedBy = $( element ).attr( "aria-describedby" );
|
754 |
+
if ( error.length ) {
|
755 |
+
// refresh error/success class
|
756 |
+
error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
|
757 |
+
// replace message on existing label
|
758 |
+
error.html( message );
|
759 |
+
} else {
|
760 |
+
// create error element
|
761 |
+
error = $( "<" + this.settings.errorElement + ">" )
|
762 |
+
.attr( "id", elementID + "-error" )
|
763 |
+
.addClass( this.settings.errorClass )
|
764 |
+
.html( message || "" );
|
765 |
+
|
766 |
+
// Maintain reference to the element to be placed into the DOM
|
767 |
+
place = error;
|
768 |
+
if ( this.settings.wrapper ) {
|
769 |
+
// make sure the element is visible, even in IE
|
770 |
+
// actually showing the wrapped element is handled elsewhere
|
771 |
+
place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
|
772 |
+
}
|
773 |
+
if ( this.labelContainer.length ) {
|
774 |
+
this.labelContainer.append( place );
|
775 |
+
} else if ( this.settings.errorPlacement ) {
|
776 |
+
this.settings.errorPlacement( place, $( element ) );
|
777 |
+
} else {
|
778 |
+
place.insertAfter( element );
|
779 |
+
}
|
780 |
+
|
781 |
+
// Link error back to the element
|
782 |
+
if ( error.is( "label" ) ) {
|
783 |
+
// If the error is a label, then associate using 'for'
|
784 |
+
error.attr( "for", elementID );
|
785 |
+
} else if ( error.parents( "label[for='" + elementID + "']" ).length === 0 ) {
|
786 |
+
// If the element is not a child of an associated label, then it's necessary
|
787 |
+
// to explicitly apply aria-describedby
|
788 |
+
|
789 |
+
errorID = error.attr( "id" ).replace( /(:|\.|\[|\])/g, "\\$1");
|
790 |
+
// Respect existing non-error aria-describedby
|
791 |
+
if ( !describedBy ) {
|
792 |
+
describedBy = errorID;
|
793 |
+
} else if ( !describedBy.match( new RegExp( "\\b" + errorID + "\\b" ) ) ) {
|
794 |
+
// Add to end of list if not already present
|
795 |
+
describedBy += " " + errorID;
|
796 |
+
}
|
797 |
+
$( element ).attr( "aria-describedby", describedBy );
|
798 |
+
|
799 |
+
// If this element is grouped, then assign to all elements in the same group
|
800 |
+
group = this.groups[ element.name ];
|
801 |
+
if ( group ) {
|
802 |
+
$.each( this.groups, function( name, testgroup ) {
|
803 |
+
if ( testgroup === group ) {
|
804 |
+
$( "[name='" + name + "']", this.currentForm )
|
805 |
+
.attr( "aria-describedby", error.attr( "id" ) );
|
806 |
+
}
|
807 |
+
});
|
808 |
+
}
|
809 |
+
}
|
810 |
+
}
|
811 |
+
if ( !message && this.settings.success ) {
|
812 |
+
error.text( "" );
|
813 |
+
if ( typeof this.settings.success === "string" ) {
|
814 |
+
error.addClass( this.settings.success );
|
815 |
+
} else {
|
816 |
+
this.settings.success( error, element );
|
817 |
+
}
|
818 |
+
}
|
819 |
+
this.toShow = this.toShow.add( error );
|
820 |
+
},
|
821 |
+
|
822 |
+
errorsFor: function( element ) {
|
823 |
+
var name = this.idOrName( element ),
|
824 |
+
describer = $( element ).attr( "aria-describedby" ),
|
825 |
+
selector = "label[for='" + name + "'], label[for='" + name + "'] *";
|
826 |
+
|
827 |
+
// aria-describedby should directly reference the error element
|
828 |
+
if ( describer ) {
|
829 |
+
selector = selector + ", #" + describer.replace( /\s+/g, ", #" );
|
830 |
+
}
|
831 |
+
return this
|
832 |
+
.errors()
|
833 |
+
.filter( selector );
|
834 |
+
},
|
835 |
+
|
836 |
+
idOrName: function( element ) {
|
837 |
+
return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
|
838 |
+
},
|
839 |
+
|
840 |
+
validationTargetFor: function( element ) {
|
841 |
+
|
842 |
+
// If radio/checkbox, validate first element in group instead
|
843 |
+
if ( this.checkable( element ) ) {
|
844 |
+
element = this.findByName( element.name );
|
845 |
+
}
|
846 |
+
|
847 |
+
// Always apply ignore filter
|
848 |
+
return $( element ).not( this.settings.ignore )[ 0 ];
|
849 |
+
},
|
850 |
+
|
851 |
+
checkable: function( element ) {
|
852 |
+
return ( /radio|checkbox/i ).test( element.type );
|
853 |
+
},
|
854 |
+
|
855 |
+
findByName: function( name ) {
|
856 |
+
return $( this.currentForm ).find( "[name='" + name + "']" );
|
857 |
+
},
|
858 |
+
|
859 |
+
getLength: function( value, element ) {
|
860 |
+
switch ( element.nodeName.toLowerCase() ) {
|
861 |
+
case "select":
|
862 |
+
return $( "option:selected", element ).length;
|
863 |
+
case "input":
|
864 |
+
if ( this.checkable( element ) ) {
|
865 |
+
return this.findByName( element.name ).filter( ":checked" ).length;
|
866 |
+
}
|
867 |
+
}
|
868 |
+
return value.length;
|
869 |
+
},
|
870 |
+
|
871 |
+
depend: function( param, element ) {
|
872 |
+
return this.dependTypes[typeof param] ? this.dependTypes[typeof param]( param, element ) : true;
|
873 |
+
},
|
874 |
+
|
875 |
+
dependTypes: {
|
876 |
+
"boolean": function( param ) {
|
877 |
+
return param;
|
878 |
+
},
|
879 |
+
"string": function( param, element ) {
|
880 |
+
return !!$( param, element.form ).length;
|
881 |
+
},
|
882 |
+
"function": function( param, element ) {
|
883 |
+
return param( element );
|
884 |
+
}
|
885 |
+
},
|
886 |
+
|
887 |
+
optional: function( element ) {
|
888 |
+
var val = this.elementValue( element );
|
889 |
+
return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
|
890 |
+
},
|
891 |
+
|
892 |
+
startRequest: function( element ) {
|
893 |
+
if ( !this.pending[ element.name ] ) {
|
894 |
+
this.pendingRequest++;
|
895 |
+
this.pending[ element.name ] = true;
|
896 |
+
}
|
897 |
+
},
|
898 |
+
|
899 |
+
stopRequest: function( element, valid ) {
|
900 |
+
this.pendingRequest--;
|
901 |
+
// sometimes synchronization fails, make sure pendingRequest is never < 0
|
902 |
+
if ( this.pendingRequest < 0 ) {
|
903 |
+
this.pendingRequest = 0;
|
904 |
+
}
|
905 |
+
delete this.pending[ element.name ];
|
906 |
+
if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
|
907 |
+
$( this.currentForm ).submit();
|
908 |
+
this.formSubmitted = false;
|
909 |
+
} else if (!valid && this.pendingRequest === 0 && this.formSubmitted ) {
|
910 |
+
$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
|
911 |
+
this.formSubmitted = false;
|
912 |
+
}
|
913 |
+
},
|
914 |
+
|
915 |
+
previousValue: function( element ) {
|
916 |
+
return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
|
917 |
+
old: null,
|
918 |
+
valid: true,
|
919 |
+
message: this.defaultMessage( element, "remote" )
|
920 |
+
});
|
921 |
+
}
|
922 |
+
|
923 |
+
},
|
924 |
+
|
925 |
+
classRuleSettings: {
|
926 |
+
required: { required: true },
|
927 |
+
email: { email: true },
|
928 |
+
url: { url: true },
|
929 |
+
date: { date: true },
|
930 |
+
dateISO: { dateISO: true },
|
931 |
+
number: { number: true },
|
932 |
+
digits: { digits: true },
|
933 |
+
creditcard: { creditcard: true }
|
934 |
+
},
|
935 |
+
|
936 |
+
addClassRules: function( className, rules ) {
|
937 |
+
if ( className.constructor === String ) {
|
938 |
+
this.classRuleSettings[ className ] = rules;
|
939 |
+
} else {
|
940 |
+
$.extend( this.classRuleSettings, className );
|
941 |
+
}
|
942 |
+
},
|
943 |
+
|
944 |
+
classRules: function( element ) {
|
945 |
+
var rules = {},
|
946 |
+
classes = $( element ).attr( "class" );
|
947 |
+
|
948 |
+
if ( classes ) {
|
949 |
+
$.each( classes.split( " " ), function() {
|
950 |
+
if ( this in $.validator.classRuleSettings ) {
|
951 |
+
$.extend( rules, $.validator.classRuleSettings[ this ]);
|
952 |
+
}
|
953 |
+
});
|
954 |
+
}
|
955 |
+
return rules;
|
956 |
+
},
|
957 |
+
|
958 |
+
attributeRules: function( element ) {
|
959 |
+
var rules = {},
|
960 |
+
$element = $( element ),
|
961 |
+
type = element.getAttribute( "type" ),
|
962 |
+
method, value;
|
963 |
+
|
964 |
+
for ( method in $.validator.methods ) {
|
965 |
+
|
966 |
+
// support for <input required> in both html5 and older browsers
|
967 |
+
if ( method === "required" ) {
|
968 |
+
value = element.getAttribute( method );
|
969 |
+
// Some browsers return an empty string for the required attribute
|
970 |
+
// and non-HTML5 browsers might have required="" markup
|
971 |
+
if ( value === "" ) {
|
972 |
+
value = true;
|
973 |
+
}
|
974 |
+
// force non-HTML5 browsers to return bool
|
975 |
+
value = !!value;
|
976 |
+
} else {
|
977 |
+
value = $element.attr( method );
|
978 |
+
}
|
979 |
+
|
980 |
+
// convert the value to a number for number inputs, and for text for backwards compability
|
981 |
+
// allows type="date" and others to be compared as strings
|
982 |
+
if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
|
983 |
+
value = Number( value );
|
984 |
+
}
|
985 |
+
|
986 |
+
if ( value || value === 0 ) {
|
987 |
+
rules[ method ] = value;
|
988 |
+
} else if ( type === method && type !== "range" ) {
|
989 |
+
// exception: the jquery validate 'range' method
|
990 |
+
// does not test for the html5 'range' type
|
991 |
+
rules[ method ] = true;
|
992 |
+
}
|
993 |
+
}
|
994 |
+
|
995 |
+
// maxlength may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
|
996 |
+
if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
|
997 |
+
delete rules.maxlength;
|
998 |
+
}
|
999 |
+
|
1000 |
+
return rules;
|
1001 |
+
},
|
1002 |
+
|
1003 |
+
dataRules: function( element ) {
|
1004 |
+
var method, value,
|
1005 |
+
rules = {}, $element = $( element );
|
1006 |
+
for ( method in $.validator.methods ) {
|
1007 |
+
value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
|
1008 |
+
if ( value !== undefined ) {
|
1009 |
+
rules[ method ] = value;
|
1010 |
+
}
|
1011 |
+
}
|
1012 |
+
return rules;
|
1013 |
+
},
|
1014 |
+
|
1015 |
+
staticRules: function( element ) {
|
1016 |
+
var rules = {},
|
1017 |
+
validator = $.data( element.form, "validator" );
|
1018 |
+
|
1019 |
+
if ( validator.settings.rules ) {
|
1020 |
+
rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
|
1021 |
+
}
|
1022 |
+
return rules;
|
1023 |
+
},
|
1024 |
+
|
1025 |
+
normalizeRules: function( rules, element ) {
|
1026 |
+
// handle dependency check
|
1027 |
+
$.each( rules, function( prop, val ) {
|
1028 |
+
// ignore rule when param is explicitly false, eg. required:false
|
1029 |
+
if ( val === false ) {
|
1030 |
+
delete rules[ prop ];
|
1031 |
+
return;
|
1032 |
+
}
|
1033 |
+
if ( val.param || val.depends ) {
|
1034 |
+
var keepRule = true;
|
1035 |
+
switch ( typeof val.depends ) {
|
1036 |
+
case "string":
|
1037 |
+
keepRule = !!$( val.depends, element.form ).length;
|
1038 |
+
break;
|
1039 |
+
case "function":
|
1040 |
+
keepRule = val.depends.call( element, element );
|
1041 |
+
break;
|
1042 |
+
}
|
1043 |
+
if ( keepRule ) {
|
1044 |
+
rules[ prop ] = val.param !== undefined ? val.param : true;
|
1045 |
+
} else {
|
1046 |
+
delete rules[ prop ];
|
1047 |
+
}
|
1048 |
+
}
|
1049 |
+
});
|
1050 |
+
|
1051 |
+
// evaluate parameters
|
1052 |
+
$.each( rules, function( rule, parameter ) {
|
1053 |
+
rules[ rule ] = $.isFunction( parameter ) ? parameter( element ) : parameter;
|
1054 |
+
});
|
1055 |
+
|
1056 |
+
// clean number parameters
|
1057 |
+
$.each([ "minlength", "maxlength" ], function() {
|
1058 |
+
if ( rules[ this ] ) {
|
1059 |
+
rules[ this ] = Number( rules[ this ] );
|
1060 |
+
}
|
1061 |
+
});
|
1062 |
+
$.each([ "rangelength", "range" ], function() {
|
1063 |
+
var parts;
|
1064 |
+
if ( rules[ this ] ) {
|
1065 |
+
if ( $.isArray( rules[ this ] ) ) {
|
1066 |
+
rules[ this ] = [ Number( rules[ this ][ 0 ]), Number( rules[ this ][ 1 ] ) ];
|
1067 |
+
} else if ( typeof rules[ this ] === "string" ) {
|
1068 |
+
parts = rules[ this ].replace(/[\[\]]/g, "" ).split( /[\s,]+/ );
|
1069 |
+
rules[ this ] = [ Number( parts[ 0 ]), Number( parts[ 1 ] ) ];
|
1070 |
+
}
|
1071 |
+
}
|
1072 |
+
});
|
1073 |
+
|
1074 |
+
if ( $.validator.autoCreateRanges ) {
|
1075 |
+
// auto-create ranges
|
1076 |
+
if ( rules.min != null && rules.max != null ) {
|
1077 |
+
rules.range = [ rules.min, rules.max ];
|
1078 |
+
delete rules.min;
|
1079 |
+
delete rules.max;
|
1080 |
+
}
|
1081 |
+
if ( rules.minlength != null && rules.maxlength != null ) {
|
1082 |
+
rules.rangelength = [ rules.minlength, rules.maxlength ];
|
1083 |
+
delete rules.minlength;
|
1084 |
+
delete rules.maxlength;
|
1085 |
+
}
|
1086 |
+
}
|
1087 |
+
|
1088 |
+
return rules;
|
1089 |
+
},
|
1090 |
+
|
1091 |
+
// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
|
1092 |
+
normalizeRule: function( data ) {
|
1093 |
+
if ( typeof data === "string" ) {
|
1094 |
+
var transformed = {};
|
1095 |
+
$.each( data.split( /\s/ ), function() {
|
1096 |
+
transformed[ this ] = true;
|
1097 |
+
});
|
1098 |
+
data = transformed;
|
1099 |
+
}
|
1100 |
+
return data;
|
1101 |
+
},
|
1102 |
+
|
1103 |
+
// http://jqueryvalidation.org/jQuery.validator.addMethod/
|
1104 |
+
addMethod: function( name, method, message ) {
|
1105 |
+
$.validator.methods[ name ] = method;
|
1106 |
+
$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
|
1107 |
+
if ( method.length < 3 ) {
|
1108 |
+
$.validator.addClassRules( name, $.validator.normalizeRule( name ) );
|
1109 |
+
}
|
1110 |
+
},
|
1111 |
+
|
1112 |
+
methods: {
|
1113 |
+
|
1114 |
+
// http://jqueryvalidation.org/required-method/
|
1115 |
+
required: function( value, element, param ) {
|
1116 |
+
// check if dependency is met
|
1117 |
+
if ( !this.depend( param, element ) ) {
|
1118 |
+
return "dependency-mismatch";
|
1119 |
+
}
|
1120 |
+
if ( element.nodeName.toLowerCase() === "select" ) {
|
1121 |
+
// could be an array for select-multiple or a string, both are fine this way
|
1122 |
+
var val = $( element ).val();
|
1123 |
+
return val && val.length > 0;
|
1124 |
+
}
|
1125 |
+
if ( this.checkable( element ) ) {
|
1126 |
+
return this.getLength( value, element ) > 0;
|
1127 |
+
}
|
1128 |
+
return $.trim( value ).length > 0;
|
1129 |
+
},
|
1130 |
+
|
1131 |
+
// http://jqueryvalidation.org/email-method/
|
1132 |
+
email: function( value, element ) {
|
1133 |
+
// From http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29
|
1134 |
+
// Retrieved 2014-01-14
|
1135 |
+
// If you have a problem with this implementation, report a bug against the above spec
|
1136 |
+
// Or use custom methods to implement your own email validation
|
1137 |
+
return this.optional( element ) || /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test( value );
|
1138 |
+
},
|
1139 |
+
|
1140 |
+
// http://jqueryvalidation.org/url-method/
|
1141 |
+
url: function( value, element ) {
|
1142 |
+
// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
|
1143 |
+
return this.optional( element ) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
|
1144 |
+
},
|
1145 |
+
|
1146 |
+
// http://jqueryvalidation.org/date-method/
|
1147 |
+
date: function( value, element ) {
|
1148 |
+
return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
|
1149 |
+
},
|
1150 |
+
|
1151 |
+
// http://jqueryvalidation.org/dateISO-method/
|
1152 |
+
dateISO: function( value, element ) {
|
1153 |
+
return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
|
1154 |
+
},
|
1155 |
+
|
1156 |
+
// http://jqueryvalidation.org/number-method/
|
1157 |
+
number: function( value, element ) {
|
1158 |
+
return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
|
1159 |
+
},
|
1160 |
+
|
1161 |
+
// http://jqueryvalidation.org/digits-method/
|
1162 |
+
digits: function( value, element ) {
|
1163 |
+
return this.optional( element ) || /^\d+$/.test( value );
|
1164 |
+
},
|
1165 |
+
|
1166 |
+
// http://jqueryvalidation.org/creditcard-method/
|
1167 |
+
// based on http://en.wikipedia.org/wiki/Luhn/
|
1168 |
+
creditcard: function( value, element ) {
|
1169 |
+
if ( this.optional( element ) ) {
|
1170 |
+
return "dependency-mismatch";
|
1171 |
+
}
|
1172 |
+
// accept only spaces, digits and dashes
|
1173 |
+
if ( /[^0-9 \-]+/.test( value ) ) {
|
1174 |
+
return false;
|
1175 |
+
}
|
1176 |
+
var nCheck = 0,
|
1177 |
+
nDigit = 0,
|
1178 |
+
bEven = false,
|
1179 |
+
n, cDigit;
|
1180 |
+
|
1181 |
+
value = value.replace( /\D/g, "" );
|
1182 |
+
|
1183 |
+
// Basing min and max length on
|
1184 |
+
// http://developer.ean.com/general_info/Valid_Credit_Card_Types
|
1185 |
+
if ( value.length < 13 || value.length > 19 ) {
|
1186 |
+
return false;
|
1187 |
+
}
|
1188 |
+
|
1189 |
+
for ( n = value.length - 1; n >= 0; n--) {
|
1190 |
+
cDigit = value.charAt( n );
|
1191 |
+
nDigit = parseInt( cDigit, 10 );
|
1192 |
+
if ( bEven ) {
|
1193 |
+
if ( ( nDigit *= 2 ) > 9 ) {
|
1194 |
+
nDigit -= 9;
|
1195 |
+
}
|
1196 |
+
}
|
1197 |
+
nCheck += nDigit;
|
1198 |
+
bEven = !bEven;
|
1199 |
+
}
|
1200 |
+
|
1201 |
+
return ( nCheck % 10 ) === 0;
|
1202 |
+
},
|
1203 |
+
|
1204 |
+
// http://jqueryvalidation.org/minlength-method/
|
1205 |
+
minlength: function( value, element, param ) {
|
1206 |
+
var length = $.isArray( value ) ? value.length : this.getLength( value, element );
|
1207 |
+
return this.optional( element ) || length >= param;
|
1208 |
+
},
|
1209 |
+
|
1210 |
+
// http://jqueryvalidation.org/maxlength-method/
|
1211 |
+
maxlength: function( value, element, param ) {
|
1212 |
+
var length = $.isArray( value ) ? value.length : this.getLength( value, element );
|
1213 |
+
return this.optional( element ) || length <= param;
|
1214 |
+
},
|
1215 |
+
|
1216 |
+
// http://jqueryvalidation.org/rangelength-method/
|
1217 |
+
rangelength: function( value, element, param ) {
|
1218 |
+
var length = $.isArray( value ) ? value.length : this.getLength( value, element );
|
1219 |
+
return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
|
1220 |
+
},
|
1221 |
+
|
1222 |
+
// http://jqueryvalidation.org/min-method/
|
1223 |
+
min: function( value, element, param ) {
|
1224 |
+
return this.optional( element ) || value >= param;
|
1225 |
+
},
|
1226 |
+
|
1227 |
+
// http://jqueryvalidation.org/max-method/
|
1228 |
+
max: function( value, element, param ) {
|
1229 |
+
return this.optional( element ) || value <= param;
|
1230 |
+
},
|
1231 |
+
|
1232 |
+
// http://jqueryvalidation.org/range-method/
|
1233 |
+
range: function( value, element, param ) {
|
1234 |
+
return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
|
1235 |
+
},
|
1236 |
+
|
1237 |
+
// http://jqueryvalidation.org/equalTo-method/
|
1238 |
+
equalTo: function( value, element, param ) {
|
1239 |
+
// bind to the blur event of the target in order to revalidate whenever the target field is updated
|
1240 |
+
// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
|
1241 |
+
var target = $( param );
|
1242 |
+
if ( this.settings.onfocusout ) {
|
1243 |
+
target.unbind( ".validate-equalTo" ).bind( "blur.validate-equalTo", function() {
|
1244 |
+
$( element ).valid();
|
1245 |
+
});
|
1246 |
+
}
|
1247 |
+
return value === target.val();
|
1248 |
+
},
|
1249 |
+
|
1250 |
+
// http://jqueryvalidation.org/remote-method/
|
1251 |
+
remote: function( value, element, param ) {
|
1252 |
+
if ( this.optional( element ) ) {
|
1253 |
+
return "dependency-mismatch";
|
1254 |
+
}
|
1255 |
+
|
1256 |
+
var previous = this.previousValue( element ),
|
1257 |
+
validator, data;
|
1258 |
+
|
1259 |
+
if (!this.settings.messages[ element.name ] ) {
|
1260 |
+
this.settings.messages[ element.name ] = {};
|
1261 |
+
}
|
1262 |
+
previous.originalMessage = this.settings.messages[ element.name ].remote;
|
1263 |
+
this.settings.messages[ element.name ].remote = previous.message;
|
1264 |
+
|
1265 |
+
param = typeof param === "string" && { url: param } || param;
|
1266 |
+
|
1267 |
+
if ( previous.old === value ) {
|
1268 |
+
return previous.valid;
|
1269 |
+
}
|
1270 |
+
|
1271 |
+
previous.old = value;
|
1272 |
+
validator = this;
|
1273 |
+
this.startRequest( element );
|
1274 |
+
data = {};
|
1275 |
+
data[ element.name ] = value;
|
1276 |
+
$.ajax( $.extend( true, {
|
1277 |
+
url: param,
|
1278 |
+
mode: "abort",
|
1279 |
+
port: "validate" + element.name,
|
1280 |
+
dataType: "json",
|
1281 |
+
data: data,
|
1282 |
+
context: validator.currentForm,
|
1283 |
+
success: function( response ) {
|
1284 |
+
var valid = response === true || response === "true",
|
1285 |
+
errors, message, submitted;
|
1286 |
+
|
1287 |
+
validator.settings.messages[ element.name ].remote = previous.originalMessage;
|
1288 |
+
if ( valid ) {
|
1289 |
+
submitted = validator.formSubmitted;
|
1290 |
+
validator.prepareElement( element );
|
1291 |
+
validator.formSubmitted = submitted;
|
1292 |
+
validator.successList.push( element );
|
1293 |
+
delete validator.invalid[ element.name ];
|
1294 |
+
validator.showErrors();
|
1295 |
+
} else {
|
1296 |
+
errors = {};
|
1297 |
+
message = response || validator.defaultMessage( element, "remote" );
|
1298 |
+
errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message;
|
1299 |
+
validator.invalid[ element.name ] = true;
|
1300 |
+
validator.showErrors( errors );
|
1301 |
+
}
|
1302 |
+
previous.valid = valid;
|
1303 |
+
validator.stopRequest( element, valid );
|
1304 |
+
}
|
1305 |
+
}, param ) );
|
1306 |
+
return "pending";
|
1307 |
+
}
|
1308 |
+
|
1309 |
+
}
|
1310 |
+
|
1311 |
+
});
|
1312 |
+
|
1313 |
+
$.format = function deprecated() {
|
1314 |
+
throw "$.format has been deprecated. Please use $.validator.format instead.";
|
1315 |
+
};
|
1316 |
+
|
1317 |
+
// ajax mode: abort
|
1318 |
+
// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
|
1319 |
+
// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
|
1320 |
+
|
1321 |
+
var pendingRequests = {},
|
1322 |
+
ajax;
|
1323 |
+
// Use a prefilter if available (1.5+)
|
1324 |
+
if ( $.ajaxPrefilter ) {
|
1325 |
+
$.ajaxPrefilter(function( settings, _, xhr ) {
|
1326 |
+
var port = settings.port;
|
1327 |
+
if ( settings.mode === "abort" ) {
|
1328 |
+
if ( pendingRequests[port] ) {
|
1329 |
+
pendingRequests[port].abort();
|
1330 |
+
}
|
1331 |
+
pendingRequests[port] = xhr;
|
1332 |
+
}
|
1333 |
+
});
|
1334 |
+
} else {
|
1335 |
+
// Proxy ajax
|
1336 |
+
ajax = $.ajax;
|
1337 |
+
$.ajax = function( settings ) {
|
1338 |
+
var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
|
1339 |
+
port = ( "port" in settings ? settings : $.ajaxSettings ).port;
|
1340 |
+
if ( mode === "abort" ) {
|
1341 |
+
if ( pendingRequests[port] ) {
|
1342 |
+
pendingRequests[port].abort();
|
1343 |
+
}
|
1344 |
+
pendingRequests[port] = ajax.apply(this, arguments);
|
1345 |
+
return pendingRequests[port];
|
1346 |
+
}
|
1347 |
+
return ajax.apply(this, arguments);
|
1348 |
+
};
|
1349 |
+
}
|
1350 |
+
|
1351 |
+
// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
|
1352 |
+
// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
|
1353 |
+
|
1354 |
+
$.extend($.fn, {
|
1355 |
+
validateDelegate: function( delegate, type, handler ) {
|
1356 |
+
return this.bind(type, function( event ) {
|
1357 |
+
var target = $(event.target);
|
1358 |
+
if ( target.is(delegate) ) {
|
1359 |
+
return handler.apply(target, arguments);
|
1360 |
+
}
|
1361 |
+
});
|
1362 |
+
}
|
1363 |
+
});
|
1364 |
+
|
1365 |
+
}));
|
js/secureaccounts/manageaccounts/login.js
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// check customer is compromised while login
|
2 |
+
jQuery(function () {
|
3 |
+
|
4 |
+
jQuery("#login-form").submit(function( event ) {
|
5 |
+
event.preventDefault();
|
6 |
+
var self = this;
|
7 |
+
jQuery.ajax({
|
8 |
+
type: "POST",
|
9 |
+
url: jQuery('#secureaccount-api-url').html(),
|
10 |
+
data: jQuery("#login-form").serialize(),
|
11 |
+
success: function (response) {
|
12 |
+
self.submit();
|
13 |
+
}
|
14 |
+
});
|
15 |
+
});
|
16 |
+
});
|
js/secureaccounts/manageaccounts/resetpassword.js
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
// customer reset password
|
3 |
+
jQuery(function () {
|
4 |
+
jQuery('#customer-reset-password').validate({
|
5 |
+
rules: {
|
6 |
+
newpassword: "required",
|
7 |
+
confrmpassword: {
|
8 |
+
equalTo: "#newpassword"
|
9 |
+
}
|
10 |
+
},
|
11 |
+
submitHandler: function (form) {
|
12 |
+
jQuery.ajax({
|
13 |
+
type: "POST",
|
14 |
+
url: jQuery("#customer-reset-password").attr('action'),
|
15 |
+
data: jQuery("#customer-reset-password").serialize(),
|
16 |
+
cache: false,
|
17 |
+
success: function (response) {
|
18 |
+
var obj = jQuery.parseJSON(response);
|
19 |
+
window.location.href = obj.redirect;
|
20 |
+
}
|
21 |
+
});
|
22 |
+
},
|
23 |
+
messages: {
|
24 |
+
newpassword: {
|
25 |
+
required: 'This is a required field',
|
26 |
+
},
|
27 |
+
confrmpassword: {
|
28 |
+
required: 'This is a required field',
|
29 |
+
}
|
30 |
+
}
|
31 |
+
});
|
32 |
+
|
33 |
+
});
|
package.xml
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<package>
|
3 |
+
<name>SecureAccounts_ManageAccounts</name>
|
4 |
+
<version>1.1.1</version>
|
5 |
+
<stability>beta</stability>
|
6 |
+
<license>GPL</license>
|
7 |
+
<channel>community</channel>
|
8 |
+
<extends/>
|
9 |
+
<summary>An account management extension which tells admin to reset password for those accounts with compromised passwords</summary>
|
10 |
+
<description>The extension adds one column to the Manage Customer section in admin portal. From there the admin can see which account has been compromised. By clicking on reset password link for that account, a password reset email is sent to the user.</description>
|
11 |
+
<notes>first release</notes>
|
12 |
+
<authors><author><name>Rui Wang</name><user>rui</user><email>ruiw@vericlouds.com</email></author></authors>
|
13 |
+
<date>2016-05-23</date>
|
14 |
+
<time>17:48:12</time>
|
15 |
+
<contents><target name="magecommunity"><dir name="SecureAccounts"><dir name="ManageAccounts"><dir name="Block"><dir name="Customer"><file name="Grid.php" hash="41efe77100a07455e1a78d0ebebe2b10"/></dir><dir name="Render"><file name="Compromise.php" hash="a2eb476f1713d2e1d013dbcf830c8d10"/></dir><file name="Secure.php" hash="f08ab99b7557edeec4624aa65e53b8c3"/></dir><dir name="Helper"><file name="Data.php" hash="4cd2a4678ba405acddaa256d0a5a32b2"/></dir><dir name="Model"><file name="Compromisedusers.php" hash="9b8fb993be95e4a55d22eee581378d95"/><file name="Observer.php" hash="51b424e81ed4bd02801455328342a878"/><dir name="Resource"><dir name="Compromisedusers"><file name="Collection.php" hash="5c2a3db88de8ecd2b9437a315506833b"/></dir><file name="Compromisedusers.php" hash="a4b8e2ef8a8891b08abf3f8781a562c6"/></dir></dir><dir name="controllers"><file name="AjaxController.php" hash="690591ee166cc64b124a7db6b38eaa0f"/><file name="PasswordController.php" hash="bf36353b5cb070ef3c9ea9be84b9f8a1"/></dir><dir name="etc"><file name="adminhtml.xml" hash="881c450e4ef7454a7eacf9187851824e"/><file name="config.xml" hash="583ad98add0287d6928b8a95fb01f038"/><file name="system.xml" hash="133e5aa7a78bc5617bae93fc13f24108"/></dir><dir name="sql"><dir name="secureaccounts_manageaccounts_setup"><file name="install-1.0.0.php" hash="7a31fa6208e8433e0f3c66bff2187f72"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="SecureAccounts_ManageAccounts.xml" hash="cec0f45694f542e239ba44abfe0547ce"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="secureaccounts"><dir name="manageaccounts"><file name="manageaccounts.xml" hash="b8c028ec2bfdac4ebafa83c8735d00ae"/></dir></dir></dir><dir name="template"><dir name="secureaccounts"><dir name="manageaccounts"><file name="login_url.phtml" hash="6394adab5e858ef910e01c79dc24fc8f"/><file name="resetpassword.phtml" hash="62b9bd023f2f0fd201cdf37c3703618b"/></dir></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><dir name="template"><dir name="email"><dir name="secureaccounts"><dir name="manageaccounts"><file name="password_compromise_reset_template.html" hash="8424a33885b3f96c6e78cf0822f96326"/></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="secureaccounts"><dir name="manageaccounts"><dir name="css"><file name="bootstrap.min.css" hash="d961ea9501b06d339a4beec9d95138c4"/><file name="custom_styles.css" hash="51bd715e00fd96adf2560161b11d273e"/></dir></dir></dir></dir></dir></dir></target><target name="mage"><dir name="js"><dir name="secureaccounts"><dir name="manageaccounts"><file name="jquery.validate.js" hash="b55ee47b6bfa9e90625c274e93130239"/><file name="login.js" hash="aaff1f49fb2446ff713466243b7c86f5"/><file name="resetpassword.js" hash="45570e7b8c22012c6821ec9ae126b284"/></dir></dir></dir></target></contents>
|
16 |
+
<compatible/>
|
17 |
+
<dependencies><required><php><min>5.0.0</min><max>6.0.0</max></php></required></dependencies>
|
18 |
+
</package>
|
skin/frontend/base/default/secureaccounts/manageaccounts/css/bootstrap.min.css
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Bootstrap v3.3.5 (http://getbootstrap.com)
|
3 |
+
* Copyright 2011-2015 Twitter, Inc.
|
4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
+
*//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;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,-webkit-box-shadow ease-in-out .15s;-o-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}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label_c{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
|
skin/frontend/base/default/secureaccounts/manageaccounts/css/custom_styles.css
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
To change this license header, choose License Headers in Project Properties.
|
3 |
+
To change this template file, choose Tools | Templates
|
4 |
+
and open the template in the editor.
|
5 |
+
*/
|
6 |
+
/*
|
7 |
+
Created on : 30 Mar, 2016, 10:24:32 AM
|
8 |
+
Author : priyanka
|
9 |
+
*/
|
10 |
+
|
11 |
+
input[type="email"], input[type="search"], input[type="number"], input[type="password"], input[type="tel"], input[type="text"] {
|
12 |
+
max-width: 100%;
|
13 |
+
width: 100% !important;
|
14 |
+
}
|