From: Chuck Scott
Date: Mon, 18 May 2015 18:22:24 +0000 (-0400)
Subject: initial commit
X-Git-Url: http://cvs2.gaslightmedia.com/gitweb/index.cgi?a=commitdiff_plain;h=869dd53bf8f31b4c54d907e5c3e40fe67d681add;p=WP-Plugins%2Fsimple-membership.git
initial commit
---
869dd53bf8f31b4c54d907e5c3e40fe67d681add
diff --git a/classes/class.bAccessControl.php b/classes/class.bAccessControl.php
new file mode 100644
index 0000000..92c3c8f
--- /dev/null
+++ b/classes/class.bAccessControl.php
@@ -0,0 +1,109 @@
+lastError = '';
+ $this->moretags = array();
+ }
+ public static function get_instance(){
+ self::$_this = empty(self::$_this)? new BAccessControl():self::$_this;
+ return self::$_this;
+ }
+
+ public function can_i_read_post($id){
+ $this->lastError = '';
+ global $post;
+ $auth = BAuth::get_instance();
+ $protect_everything = BSettings::get_instance()->get_value('protect-everything');
+ if(!empty($protect_everything)){
+ $error_msg = BUtils::_( 'You need to login to view this content. ' ) . BSettings::get_instance()->get_login_link();
+ $this->lastError = apply_filters('swpm_not_logged_in_post_msg', $error_msg);
+ return false;
+ }
+ $protected = BProtection::get_instance();
+ if (!$protected->is_protected($id)){ return true;}
+ if(!$auth->is_logged_in()){
+ $error_msg = BUtils::_( 'You need to login to view this content. ' ) . BSettings::get_instance()->get_login_link();
+ $this->lastError = apply_filters('swpm_not_logged_in_post_msg', $error_msg);
+ return false;
+ }
+
+ if ($auth->is_expired_account()){
+ $error_msg = ''.BUtils::_('Your account has expired. Please renew your account to gain access to this content.').'
';
+ $this->lastError = apply_filters('swpm_account_expired_msg', $error_msg);
+ return false;
+ }
+ $protect_older_posts = apply_filters('swpm_should_protect_older_post', false, $id);
+ if ($protect_older_posts){
+ $this->lastError = apply_filters ('swpm_restricted_post_msg_older_post',
+ BUtils::_('This content can only be viewed by members who joined on or before ' . date(get_option( 'date_format' ), strtotime($post->post_date)))) ;
+ return false;
+ }
+ $perms = BPermission::get_instance($auth->get('membership_level'));
+ if($perms->is_permitted($id)) {return true;}
+ $this->lastError = apply_filters ('swpm_restricted_post_msg', ''.BUtils::_('This content is not permitted for your membership level.').'
') ;
+ return false;
+ }
+ public function can_i_read_comment($id){
+ $this->lastError = '';
+ $protected = BProtection::get_instance();
+ if (!$protected->is_protected_comment($id)){ return true;}
+ $auth = BAuth::get_instance();
+ if(!$auth->is_logged_in()){
+ $this->lastError = apply_filters('swpm_not_logged_in_comment_msg', BUtils::_("You need to login to view this content. ")
+ . BSettings::get_instance()->get_login_link());
+ return false;
+ }
+ if ($auth->is_expired_account()){
+ $error_msg = ''.BUtils::_('Your account has expired. Please renew your account to gain access to this content.').'
';
+ $this->lastError = apply_filters('swpm_account_expired_msg', $error_msg);
+ return false;
+ }
+ $perms = BPermission::get_instance($auth->get('membership_level'));
+ if($perms->is_permitted_comment($id)) {return true; }
+ $this->lastError = apply_filters ('swpm_restricted_comment_msg', ''.BUtils::_("This content is not permitted for your membership level.").'
' );
+ return false;
+ }
+ public function why(){
+ return $this->lastError;
+ }
+ public function filter_post($id,$content){
+ if(in_array($id, $this->moretags)) {return $content; }
+ if($this->can_i_read_post($id)) {return $content; }
+ $moretag = BSettings::get_instance()->get_value('enable-moretag');
+ if (empty($moretag)){
+ return $this->lastError;
+ }
+ $post = get_post($id);
+ $post_segments = explode( '', $post->post_content);
+
+ if (count($post_segments) >= 2){
+ if (BAuth::get_instance()->is_logged_in()){
+ $error_msg = '' . BUtils::_(" The rest of the content is not permitted for your membership level.") . '
';
+ $this->lastError = apply_filters ('swpm_restricted_more_tag_msg', $error_msg);
+ }
+ else {
+ $error_msg = '' . BUtils::_("You need to login to view the rest of the content. ") . BSettings::get_instance()->get_login_link() . '
';
+ $this->lastError = apply_filters('swpm_not_logged_in_more_tag_msg', $error_msg);
+ }
+
+ return do_shortcode($post_segments[0]) . $this->lastError;
+ }
+
+ return $this->lastError;
+ }
+ public function filter_comment($id,$content){
+ if($this->can_i_read_comment($id)) { return $content; }
+ return $this->lastError;
+ }
+ public function filter_post_with_moretag($id, $more_link, $more_link_text){
+ $this->moretags[] = $id;
+ if($this->can_i_read_post($id)) {
+ return $more_link;
+ }
+ $msg = BUtils::_("You need to login to view the rest of the content. ") . BSettings::get_instance()->get_login_link();
+ return apply_filters('swpm_not_logged_in_more_tag_msg', $msg);
+ }
+}
diff --git a/classes/class.bAdminRegistration.php b/classes/class.bAdminRegistration.php
new file mode 100644
index 0000000..84f5881
--- /dev/null
+++ b/classes/class.bAdminRegistration.php
@@ -0,0 +1,92 @@
+is_valid()) {
+ $member_info = $form->get_sanitized();
+ $account_status = BSettings::get_instance()->get_value('default-account-status', 'active');
+ $member_info['account_state'] = $account_status;
+ $plain_password = $member_info['plain_password'];
+ unset($member_info['plain_password']);
+ $wpdb->insert($wpdb->prefix . "swpm_members_tbl", $member_info);
+ /* * ******************** register to wordpress ********** */
+ $query = $wpdb->prepare("SELECT role FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id = %d", $member_info['membership_level']) ;
+ $wp_user_info = array();
+ $wp_user_info['user_nicename'] = implode('-', explode(' ', $member_info['user_name']));
+ $wp_user_info['display_name'] = $member_info['user_name'];
+ $wp_user_info['user_email'] = $member_info['email'];
+ $wp_user_info['nickname'] = $member_info['user_name'];
+ if (isset($member_info['first_name'])){$wp_user_info['first_name'] = $member_info['first_name']; }
+ if (isset($member_info['last_name'])){$wp_user_info['last_name'] = $member_info['last_name'];}
+ $wp_user_info['user_login'] = $member_info['user_name'];
+ $wp_user_info['password'] = $plain_password;
+ $wp_user_info['role'] = $wpdb->get_var($query);
+ $wp_user_info['user_registered'] = date('Y-m-d H:i:s');
+ BUtils::create_wp_user($wp_user_info);
+ /* * ******************** register to wordpress ********** */
+ $send_notification = BSettings::get_instance()->get_value('enable-notification-after-manual-user-add');
+ $member_info['plain_password'] = $plain_password;
+ $this->member_info = $member_info;
+ if (!empty($send_notification)){
+ $this->send_reg_email();
+ }
+ $message = array('succeeded' => true, 'message' => BUtils::_('Registration Successful.'));
+ BTransfer::get_instance()->set('status', $message);
+ wp_redirect('admin.php?page=simple_wp_membership');
+ return;
+ }
+ $message = array('succeeded' => false, 'message' => BUtils::_('Please correct the following:'), 'extra' => $form->get_errors());
+ BTransfer::get_instance()->set('status', $message);
+ }
+ public function edit($id){
+ global $wpdb;
+ $query = $wpdb->prepare("SELECT * FROM " . $wpdb->prefix . "swpm_members_tbl WHERE member_id = %d", $id);
+ $member = $wpdb->get_row($query, ARRAY_A);
+ $email_address = $member['email'];
+ $user_name = $member['user_name'];
+ unset($member['member_id']);
+ unset($member['user_name']);
+ $form = new BForm($member);
+ if ($form->is_valid()) {
+ $member = $form->get_sanitized();
+ BUtils::update_wp_user($user_name, $member);
+ unset($member['plain_password']);
+ $wpdb->update($wpdb->prefix . "swpm_members_tbl", $member, array('member_id' => $id));
+ $message = array('succeeded' => true, 'message' => 'Updated Successfully.');
+ do_action('swpm_admin_edit_custom_fields', $member + array('member_id'=>$id));
+ BTransfer::get_instance()->set('status', $message);
+ $send_notification = filter_input(INPUT_POST, 'account_status_change');
+ if (!empty($send_notification)){
+ $settings = BSettings::get_instance();
+ $from_address = $settings->get_value('email-from');
+ $headers = 'From: ' . $from_address . "\r\n";
+ $subject = filter_input(INPUT_POST,'notificationmailhead');
+ $body = filter_input(INPUT_POST, 'notificationmailbody');
+ $settings->set_value('account-change-email-body', $body)->set_value('account-change-email-subject', $subject)->save();
+ $member['login_link'] = $settings->get_value('login-page-url');
+ $values = array_values($member);
+ $keys = array_map('swpm_enclose_var', array_keys($member));
+ $body = str_replace($keys, $values, $body);
+ wp_mail($email_address, $subject, $body, $headers);
+ }
+ wp_redirect('admin.php?page=simple_wp_membership');
+ }
+ $message = array('succeeded' => false, 'message' => BUtils::_('Please correct the following:'), 'extra' => $form->get_errors());
+ BTransfer::get_instance()->set('status', $message);
+ }
+}
diff --git a/classes/class.bAjax.php b/classes/class.bAjax.php
new file mode 100644
index 0000000..7a48d9e
--- /dev/null
+++ b/classes/class.bAjax.php
@@ -0,0 +1,36 @@
+prefix . "swpm_members_tbl";
+ $query = $wpdb->prepare("SELECT member_id FROM $table WHERE email = %s", $field_value);
+ $db_id = $wpdb->get_var($query) ;
+ $exists = ($db_id > 0) && $db_id != $member_id;
+ echo '[ "' . $field_id . (($exists) ? '",false, "χ '.BUtils::_('Aready taken').'"]' : '",true, "√ Available"]');
+ exit;
+ }
+
+ public static function validate_user_name_ajax() {
+ global $wpdb;
+ $field_value = filter_input(INPUT_GET, 'fieldValue');
+ $field_id = filter_input(INPUT_GET, 'fieldId');
+ $table = $wpdb->prefix . "swpm_members_tbl";
+ $query = $wpdb->prepare("SELECT COUNT(*) FROM $table WHERE user_name = %s", $field_value);
+ $exists = $wpdb->get_var($query) > 0;
+ echo '[ "' . $field_id . (($exists) ? '",false,"χ '. BUtils::_('Aready taken'). '"]' :
+ '",true,"√ '.BUtils::_('Available'). '"]');
+ exit;
+ }
+}
diff --git a/classes/class.bAuth.php b/classes/class.bAuth.php
new file mode 100644
index 0000000..1b4eaf0
--- /dev/null
+++ b/classes/class.bAuth.php
@@ -0,0 +1,291 @@
+isLoggedIn = false;
+ $this->userData = null;
+ $this->protected = BProtection::get_instance();
+ }
+ private function init(){
+ $valid = $this->validate();
+ //Blog::log_simple_debug("init:". ($valid? "valid": "invalid"), true);
+ if (!$valid){
+ $this->authenticate();
+ }
+ }
+ public static function get_instance() {
+ if (empty(self::$_this)){
+ self::$_this = new BAuth();
+ self::$_this->init();
+ }
+ return self::$_this;
+ }
+
+ private function authenticate($user = null, $pass = null) {
+ global $wpdb;
+ $swpm_password = empty($pass)?filter_input(INPUT_POST, 'swpm_password') : $pass;
+ $swpm_user_name = empty($user)? apply_filters('swpm_user_name', filter_input(INPUT_POST, 'swpm_user_name')) : $user;
+ //Blog::log_simple_debug("Authenticate:" . $swpm_user_name, true);
+ if (!empty($swpm_user_name) && !empty($swpm_password)) {
+ $user = sanitize_user($swpm_user_name);
+ $pass = trim($swpm_password);
+ $query = "SELECT * FROM " . $wpdb->prefix . "swpm_members_tbl WHERE user_name = %s";
+ $userData = $wpdb->get_row($wpdb->prepare($query, $user));
+ $this->userData = $userData;
+ if (!$userData) {
+ $this->isLoggedIn = false;
+ $this->userData = null;
+ $this->lastStatusMsg = BUtils::_("User Not Found.");
+ return false;
+ }
+ $check = $this->check_password($pass, $userData->password);
+ if (!$check) {
+ $this->isLoggedIn = false;
+ $this->userData = null;
+ $this->lastStatusMsg = BUtils::_("Password Empty or Invalid.");
+ return false;
+ }
+ if ($this->check_constraints()) {
+ $rememberme = filter_input(INPUT_POST, 'rememberme');
+ $remember = empty($rememberme) ? false : true;
+ $this->set_cookie($remember);
+ $this->isLoggedIn = true;
+ $this->lastStatusMsg = "Logged In.";
+ Blog::log_simple_debug("swpm_login action.", true);
+ do_action('swpm_login', $user, $pass, $remember);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private function check_constraints() {
+ if (empty($this->userData)){
+ return false;
+ }
+ $enable_expired_login = BSettings::get_instance()->get_value('enable-expired-account-login', '');
+
+ $can_login = true;
+ if( $this->userData->account_state == 'inactive'){
+ $this->lastStatusMsg = BUtils::_('Account is inactive.');
+ $can_login = false;
+ }
+ else if( $this->userData->account_state == 'pending'){
+ $this->lastStatusMsg = BUtils::_('Account is pending.');
+ $can_login = false;
+ }
+ else if( ($this->userData->account_state == 'expired') && empty($enable_expired_login) ){
+ $this->lastStatusMsg = BUtils::_('Account has expired.');
+ $can_login = false;
+ }
+
+ if(!$can_login){
+ $this->isLoggedIn = false;
+ $this->userData = null;
+ return false;
+ }
+
+ if (BUtils::is_subscription_expired($this->userData)){
+ if ($this->userData->account_state == 'active'){
+ global $wpdb;
+ $wpdb->update(
+ $wpdb->prefix . 'swpm_members_tbl',
+ array( 'account_state' => 'expired'),
+ array( 'member_id' => $this->userData->member_id ),
+ array( '%s'),
+ array( '%d' )
+ );
+ }
+ if (empty($enable_expired_login)){
+ $this->lastStatusMsg = BUtils::_('Account has expired.');
+ $this->isLoggedIn = false;
+ $this->userData = null;
+ return false;
+ }
+ }
+
+ $this->permitted = BPermission::get_instance($this->userData->membership_level);
+ $this->lastStatusMsg = BUtils::_("You are logged in as:") . $this->userData->user_name;
+ $this->isLoggedIn = true;
+ return true;
+ }
+
+ private function check_password($password, $hash) {
+ global $wp_hasher;
+ if (empty($password)){
+ return false;
+ }
+ if (empty($wp_hasher)) {
+ require_once( ABSPATH . 'wp-includes/class-phpass.php');
+ $wp_hasher = new PasswordHash(8, TRUE);
+ }
+ return $wp_hasher->CheckPassword($password, $hash);
+ }
+ public function match_password($password){
+ if (!$this->is_logged_in()) {return false;}
+ return $this->check_password($password, $this->get('password'));
+ }
+ public function login($user, $pass, $remember = '', $secure = '') {
+ Blog::log_simple_debug("login",true);
+ if ($this->isLoggedIn){
+ return;
+ }
+ if ($this->authenticate($user, $pass) && $this->validate()) {
+ $this->set_cookie($remember, $secure);
+ } else {
+ $this->isLoggedIn = false;
+ $this->userData = null;
+ }
+ return $this->lastStatusMsg;
+ }
+
+ public function logout() {
+ if (!$this->isLoggedIn){
+ return;
+ }
+ setcookie(SIMPLE_WP_MEMBERSHIP_AUTH, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
+ setcookie(SIMPLE_WP_MEMBERSHIP_SEC_AUTH, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
+ $this->userData = null;
+ $this->isLoggedIn = false;
+ $this->lastStatusMsg = BUtils::_("Logged Out Successfully.");
+ do_action('swpm_logout');
+ }
+
+ private function set_cookie($remember = '', $secure = '') {
+ if ($remember){
+ $expiration = time() + 1209600; // 14 days
+ $expire = $expiration + 43200; // 12 hours grace period
+ }
+ else{
+ $expiration = time() + 172800; // 2 days.
+ $expire = $expiration;//The minimum cookie expiration should be at least couple of days.
+ }
+
+ $expiration_timestamp = BUtils::get_expiration_timestamp($this->userData);
+ $enable_expired_login = BSettings::get_instance()->get_value('enable-expired-account-login', '');
+ // make sure cookie doesn't live beyond account expiration date.
+ // but if expired account login is enabled then ignore if account is expired
+ $expiration = empty($enable_expired_login)? min ($expiration,$expiration_timestamp) : $expiration;
+ $pass_frag = substr($this->userData->password, 8, 4);
+ $scheme = 'auth';
+ if (!$secure){
+ $secure = is_ssl();
+ }
+ $key = BAuth::b_hash($this->userData->user_name . $pass_frag . '|' . $expiration, $scheme);
+ $hash = hash_hmac('md5', $this->userData->user_name . '|' . $expiration, $key);
+ $auth_cookie = $this->userData->user_name . '|' . $expiration . '|' . $hash;
+ $auth_cookie_name = $secure ? SIMPLE_WP_MEMBERSHIP_SEC_AUTH : SIMPLE_WP_MEMBERSHIP_AUTH;
+ //setcookie($auth_cookie_name, $auth_cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, $secure, true);
+ setcookie($auth_cookie_name, $auth_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure, true);
+ }
+
+ private function validate() {
+ $auth_cookie_name = is_ssl() ? SIMPLE_WP_MEMBERSHIP_SEC_AUTH : SIMPLE_WP_MEMBERSHIP_AUTH;
+ if (!isset($_COOKIE[$auth_cookie_name]) || empty($_COOKIE[$auth_cookie_name])){
+ return false;
+ }
+ $cookie_elements = explode('|', $_COOKIE[$auth_cookie_name]);
+ if (count($cookie_elements) != 3){
+ return false;
+ }
+ Blog::log_simple_debug("validate:" . $_COOKIE[$auth_cookie_name],true);
+ list($username, $expiration, $hmac) = $cookie_elements;
+ $expired = $expiration;
+ // Allow a grace period for POST and AJAX requests
+ if (defined('DOING_AJAX') || 'POST' == $_SERVER['REQUEST_METHOD']){
+ $expired += HOUR_IN_SECONDS;
+ }
+ // Quick check to see if an honest cookie has expired
+ if ($expired < time()) {
+ $this->lastStatusMsg = BUtils::_("Session Expired."); //do_action('auth_cookie_expired', $cookie_elements);
+ return false;
+ }
+ Blog::log_simple_debug("validate:Session Expired",true);
+ global $wpdb;
+ $query = " SELECT * FROM " . $wpdb->prefix . "swpm_members_tbl WHERE user_name = %s";
+ $user = $wpdb->get_row($wpdb->prepare($query, $username));
+ if (empty($user)) {
+ $this->lastStatusMsg = BUtils::_("Invalid User Name");
+ return false;
+ }
+ Blog::log_simple_debug("validate:Invalid User Name:" . serialize($user),true);
+ $pass_frag = substr($user->password, 8, 4);
+ $key = BAuth::b_hash($username . $pass_frag . '|' . $expiration);
+ $hash = hash_hmac('md5', $username . '|' . $expiration, $key);
+ if ($hmac != $hash) {
+ $this->lastStatusMsg = BUtils::_("Sorry! Something went wrong");
+ return false;
+ }
+ Blog::log_simple_debug("validate:bad hash",true);
+ if ($expiration < time()){
+ $GLOBALS['login_grace_period'] = 1;
+ }
+ $this->userData = $user;
+ return $this->check_constraints();
+ }
+
+ public static function b_hash($data, $scheme = 'auth') {
+ $salt = wp_salt($scheme) . 'j4H!B3TA,J4nIn4.';
+ return hash_hmac('md5', $data, $salt);
+ }
+
+ public function is_logged_in() {
+ return $this->isLoggedIn;
+ }
+
+ public function get($key, $default = "") {
+ if (isset($this->userData->$key)){
+ return $this->userData->$key;
+ }
+ if (isset($this->permitted->$key)){
+ return $this->permitted->$key;
+ }
+ if (!empty($this->permitted)){
+ return $this->permitted->get($key, $default);
+ }
+ return $default;
+ }
+
+ public function get_message() {
+ return $this->lastStatusMsg;
+ }
+ public function get_expire_date(){
+ if ($this->isLoggedIn){
+ return BUtils::get_expire_date(
+ $this->get('subscription_starts'),
+ $this->get('subscription_period'),
+ $this->get('subscription_duration_type'));
+ }
+ return "";
+ }
+ public function delete(){
+ if (!$this->is_logged_in()) {return ;}
+ $user_name = $this->get('user_name');
+ $user_id = $this->get('member_id');
+ wp_clear_auth_cookie();
+ $this->logout();
+ BMembers::delete_swpm_user_by_id($user_id);
+ BMembers::delete_wp_user($user_name);
+ }
+
+ public function reload_user_data(){
+ if (!$this->is_logged_in()) {return ;}
+ global $wpdb;
+ $query = "SELECT * FROM " . $wpdb->prefix . "swpm_members_tbl WHERE member_id = %d";
+ $this->userData = $wpdb->get_row($wpdb->prepare($query, $this->userData->member_id));
+
+ }
+ public function is_expired_account(){
+ // should be called after logging in.
+ if (!$this->is_logged_in()) {return null;}
+ return $this->get('account_state') === 'expired';
+ }
+}
diff --git a/classes/class.bAuthPermissionCollection.php b/classes/class.bAuthPermissionCollection.php
new file mode 100644
index 0000000..803c1a4
--- /dev/null
+++ b/classes/class.bAuthPermissionCollection.php
@@ -0,0 +1,9 @@
+ BUtils::_('Membership Level'),
+ 'plural' => BUtils::_('Membership Levels'),
+ 'ajax' => false
+ ));
+ $this->category = array();
+ $selected = filter_input(INPUT_POST, 'membership_level_id');
+ $this->selected_level_id = empty($selected) ? 1 : $selected;
+ $this->category = ($this->selected_level_id == 1) ?
+ BProtection::get_instance() :
+ BPermission::get_instance($this->selected_level_id);
+ }
+
+ function get_columns() {
+ return array(
+ 'cb' => ' '
+ , 'term_id' => BUtils::_('ID')
+ , 'name' => BUtils::_('Name')
+ , 'description' => BUtils::_('Description')
+ , 'count' => BUtils::_('Count')
+ );
+ }
+
+ function get_sortable_columns() {
+ return array(
+ 'name' => array('name', true)
+ );
+ }
+
+ function column_default($item, $column_name) {
+ return stripslashes($item->$column_name);
+ }
+
+ function column_term_id($item) {
+ return $item->term_id;
+ }
+
+ function column_cb($item) {
+ return sprintf(
+ ' ', $this->category->in_categories($item->term_id) ? "checked" : "", $item->term_id
+ );
+ }
+
+ function prepare_items() {
+ $submitted = filter_input(INPUT_POST, 'update_category_list');
+ if (!empty($submitted)) {
+ $args = array('ids' => array(
+ 'filter' => FILTER_VALIDATE_INT,
+ 'flags' => FILTER_REQUIRE_ARRAY,
+ ));
+ $filtered = filter_input_array(INPUT_POST, $args);
+ $ids = $filtered['ids'];
+ $this->category->apply($ids, 'category')->save();
+ $message = array('succeeded' => true, 'message' => BUtils::_('Updated! '));
+ BTransfer::get_instance()->set('status', $message);
+ }
+ $all_categories = array();
+ $all_cat_ids = get_categories(array('hide_empty' => '0'));
+ $totalitems = count($all_cat_ids);
+ $perpage = 100;
+ $paged = !empty($_GET["paged"]) ? mysql_real_escape_string($_GET["paged"]) : '';
+ if (empty($paged) || !is_numeric($paged) || $paged <= 0) {
+ $paged = 1;
+ }
+ $totalpages = ceil($totalitems / $perpage);
+ $offset = 0;
+ if (!empty($paged) && !empty($perpage)) {
+ $offset = ($paged - 1) * $perpage;
+ }
+ for ($i = $offset; $i < ((int) $offset + (int) $perpage) && !empty($all_cat_ids[$i]); $i++) {
+ $all_categories[] = $all_cat_ids[$i];
+ }
+ $this->set_pagination_args(array(
+ "total_items" => $totalitems,
+ "total_pages" => $totalpages,
+ "per_page" => $perpage,
+ ));
+
+ $columns = $this->get_columns();
+ $hidden = array();
+ $sortable = $this->get_sortable_columns();
+
+ $this->_column_headers = array($columns, $hidden, $sortable);
+ $this->items = $all_categories;
+ }
+
+ function no_items() {
+ BUtils::e('No category found.');
+ }
+
+}
diff --git a/classes/class.bCronJob.php b/classes/class.bCronJob.php
new file mode 100644
index 0000000..7495996
--- /dev/null
+++ b/classes/class.bCronJob.php
@@ -0,0 +1,60 @@
+prepare("SELECT member_id, membership_level, subscription_starts, account_state
+ FROM {$wpdb->prefix}swpm_members_tbl LIMIT %d, 100", $counter);
+ $results = $wpdb->get_results($query);
+ if (empty($results)) {break;}
+ $expired = array();
+ foreach($results as $result){
+ $timestamp = BUtils::get_expiration_timestamp($result);
+ if ($timestamp < time() && $result->account_state == 'active'){
+ $expired[] = $result->member_id;
+ }
+ }
+ if (count($expired)>0){
+ $query = "UPDATE {$wpdb->prefix}swpm_members_tbl
+ SET account_state='expired' WHERE member_id IN (" . implode(',', $expired) . ")";
+ $wpdb->query($query);
+ }
+ }
+ }
+
+ public function delete_pending_account(){
+ global $wpdb;
+ $interval = BSettings::get_instance()->get_value('delete-pending-account');
+ if (empty($interval)) {return;}
+ for($counter = 0;; $counter += 100){
+ $query = $wpdb->prepare("SELECT member_id
+ FROM
+ {$wpdb->prefix}swpm_members_tbl
+ WHERE account_state='pending'
+ AND subscription_starts < DATE_SUB(NOW(), INTERVAL %d MONTH) LIMIT %d, 100",
+ $interval, $counter);
+ $results = $wpdb->get_results($query);
+ if (empty($results)) {break;}
+ $to_delete = array();
+ foreach($results as $result){
+ $to_delete[] = $result->member_id;
+ }
+ if (count($to_delete)>0){
+ Blog::log_simple_debug("Auto deleting pending account.", true);
+ $query = "DELETE FROM {$wpdb->prefix}swpm_members_tbl
+ WHERE member_id IN (" . implode(',', $to_delete) . ")";
+ $wpdb->query($query);
+ }
+ }
+ }
+}
diff --git a/classes/class.bForm.php b/classes/class.bForm.php
new file mode 100644
index 0000000..031eeec
--- /dev/null
+++ b/classes/class.bForm.php
@@ -0,0 +1,308 @@
+fields = $fields;
+ $this->sanitized = array();
+ $this->validate_wp_user_email();
+ if ($this->is_valid()){
+ foreach ($fields as $key => $value){
+ $this->$key();
+ }
+ }
+ }
+ protected function validate_wp_user_email(){
+ $user_name = filter_input(INPUT_POST, 'user_name',FILTER_SANITIZE_STRING);
+ $email = filter_input(INPUT_POST, 'email', FILTER_UNSAFE_RAW);
+ if (empty($user_name)) {return;}
+ $user = get_user_by('login', $user_name);
+ if ($user && ($user->email != $email)){
+ $this->errors['wp_email'] = BUtils::_('Wordpress account exists with given user name. But given email doesn\'t match.');
+ return;
+ }
+ $user = get_user_by('email', $email);
+ if($user && ($user_name != $user->login)){
+ $this->errors['wp_user'] = BUtils::_('Wordpress account exists with given email. But given user name doesn\'t match.');
+
+ }
+ }
+ protected function user_name() {
+ global $wpdb;
+ if (!empty($this->fields['user_name'])){return;}
+ $user_name = filter_input(INPUT_POST, 'user_name',FILTER_SANITIZE_STRING);
+ if (empty($user_name)) {
+ $this->errors['user_name'] = BUtils::_('User name is required');
+ return;
+ }
+ if (preg_match("/^[a-zA-Z0-9!@#$%&*+\/=?^_`{|}~\.-]+$/", $user_name) === 0) {
+ $this->errors['user_name'] = BUtils::_('User name contains invalid character');
+ return;
+ }
+ $saned = sanitize_text_field($user_name);
+ $query = "SELECT count(member_id) FROM {$wpdb->prefix}swpm_members_tbl WHERE user_name= %s";
+ $result = $wpdb->get_var($wpdb->prepare($query, strip_tags($saned)));
+ if ($result > 0) {
+ if ($saned != $this->fields['user_name']) {
+ $this->errors['user_name'] = BUtils::_('User name already exists.');
+ return;
+ }
+ }
+ $this->sanitized['user_name'] = $saned;
+ }
+
+ protected function first_name() {
+ $first_name = filter_input(INPUT_POST, 'first_name', FILTER_SANITIZE_STRING);
+ if (empty($first_name)) {return;}
+ $this->sanitized['first_name'] = sanitize_text_field($first_name);
+ }
+
+ protected function last_name() {
+ $last_name = filter_input(INPUT_POST, 'last_name', FILTER_SANITIZE_STRING);
+ if (empty($last_name)) {return;}
+ $this->sanitized['last_name'] = sanitize_text_field($last_name);
+ }
+
+ protected function password() {
+ $password = filter_input(INPUT_POST, 'password',FILTER_UNSAFE_RAW);
+ $password_re = filter_input(INPUT_POST, 'password_re',FILTER_UNSAFE_RAW);
+ if (empty($this->fields['password']) && empty($password)) {
+ $this->errors['password'] = BUtils::_('Password is required');
+ return;
+ }
+ if (!empty($password)) {
+ $saned = sanitize_text_field($password);
+ $saned_re = sanitize_text_field($password_re);
+ if ($saned != $saned_re){
+ $this->errors['password'] = BUtils::_('Password mismatch');
+ }
+ $this->sanitized['plain_password'] = $password;
+ $this->sanitized['password'] = BUtils::encrypt_password(trim($password)); //should use $saned??;
+ }
+ }
+
+ protected function email() {
+ global $wpdb;
+ $email = filter_input(INPUT_POST, 'email', FILTER_UNSAFE_RAW);
+ if (empty($email)) {
+ $this->errors['email'] = BUtils::_('Email is required');
+ return;
+ }
+ if (!is_email($email)) {
+ $this->errors['email'] = BUtils::_('Email is invalid');
+ return;
+ }
+ $saned = sanitize_email($email);
+ $query = "SELECT count(member_id) FROM {$wpdb->prefix}swpm_members_tbl WHERE email= %s";
+ $member_id = filter_input(INPUT_GET, 'member_id', FILTER_SANITIZE_NUMBER_INT);
+ if (!empty($member_id)) {
+ $query .= ' AND member_id !=%d';
+ $result = $wpdb->get_var($wpdb->prepare($query, strip_tags($saned), $member_id));
+ }
+ else{
+ $result = $wpdb->get_var($wpdb->prepare($query, strip_tags($saned)));
+ }
+
+ if ($result > 0) {
+ if ($saned != $this->fields['email']) {
+ $this->errors['email'] = BUtils::_('Email is already used.');
+ return;
+ }
+ }
+ $this->sanitized['email'] = $saned;
+ }
+
+ protected function phone() {
+ $phone = filter_input(INPUT_POST, 'phone', FILTER_UNSAFE_RAW);
+ if (empty($phone)) {return;}
+ $saned = wp_kses($phone, array());
+ $this->sanitized['phone'] = $saned;
+ return;
+ //Not doing phone number validation
+
+// $saned = wp_kses($phone, array());
+// $this->sanitized['phone'] = $saned;
+// if (strlen($saned) > 9 && preg_match('/^((\+)?[1-9]{1,2})?([-\s\.])?((\(\d{1,4}\))|\d{1,4})(([-\s\.])?[0-9]{1,12}){1,2}$/', $saned)){
+// $this->sanitized['phone'] = $saned;
+// }
+// else{
+// $this->errors['phone'] = BUtils::_('Phone number is invalid');
+// }
+ }
+
+ protected function address_street() {
+ $address_street = filter_input(INPUT_POST, 'address_street', FILTER_SANITIZE_STRING);
+ if (empty($address_street)) { return;}
+ $this->sanitized['address_street'] = wp_kses($address_street, array());
+ }
+
+ protected function address_city() {
+ $address_city = filter_input(INPUT_POST, 'address_city', FILTER_SANITIZE_STRING);
+ if (empty($address_city)){ return; }
+ $this->sanitized['address_city'] = wp_kses($address_city, array());
+ }
+
+ protected function address_state() {
+ $address_state = filter_input(INPUT_POST, 'address_state', FILTER_SANITIZE_STRING);
+ if (empty($address_state)) {return;}
+ $this->sanitized['address_state'] = wp_kses($address_state, array());
+ }
+
+ protected function address_zipcode() {
+ $address_zipcode = filter_input(INPUT_POST, 'address_zipcode', FILTER_UNSAFE_RAW);
+ if (empty($address_zipcode)){ return;}
+ $this->sanitized['address_zipcode'] = wp_kses($address_zipcode, array());
+ }
+
+ protected function country() {
+ $country = filter_input(INPUT_POST, 'country', FILTER_SANITIZE_STRING);
+ if (empty($country)){ return;}
+ $this->sanitized['country'] = wp_kses($country, array());
+ }
+
+ protected function company_name() {
+ $company_name = filter_input(INPUT_POST, 'company_name', FILTER_SANITIZE_STRING);
+ $this->sanitized['company_name'] = $company_name;
+ }
+
+ protected function member_since() {
+ $member_since = filter_input(INPUT_POST, 'member_since', FILTER_UNSAFE_RAW);
+ if (empty($member_since)) {return;}
+ if (preg_match('/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/', $member_since)){
+ $this->sanitized['member_since'] = sanitize_text_field($member_since);
+ return;
+ }
+ $this->errors['member_since'] = BUtils::_('Member since field is invalid');
+
+ }
+
+ protected function subscription_starts() {
+ $subscription_starts = filter_input(INPUT_POST, 'subscription_starts', FILTER_SANITIZE_STRING);
+ if(empty($subscription_starts)) {return ;}
+ if (preg_match('/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/', $subscription_starts)){
+ $this->sanitized['subscription_starts'] = sanitize_text_field($subscription_starts);
+ return;
+ }
+ $this->errors['subscription_starts'] = BUtils::_('Access starts field is invalid');
+ }
+
+ protected function gender() {
+ $gender = filter_input(INPUT_POST, 'gender', FILTER_SANITIZE_STRING);
+ if(empty($gender)) {return;}
+ if (in_array($gender, array('male', 'female', 'not specified'))){
+ $this->sanitized['gender'] = $gender;
+ }
+ else{
+ $this->errors['gender'] = BUtils::_('Gender field is invalid');
+ }
+ }
+
+ protected function account_state() {
+ $account_state = filter_input(INPUT_POST, 'account_state', FILTER_SANITIZE_STRING);
+ if(empty($account_state)) {return;}
+ if (in_array($account_state, array('active', 'pending', 'inactive', 'expired'))){
+ $this->sanitized['account_state'] = $account_state;
+ }
+ else{
+ $this->errors['account_state'] = BUtils::_('Account state field is invalid');
+ }
+ }
+
+ protected function membership_level() {
+ $membership_level = filter_input(INPUT_POST, 'membership_level', FILTER_SANITIZE_NUMBER_INT);
+ if ($membership_level == 1){
+ $this->errors['membership_level'] = BUtils::_('Invalid membership level');
+ return;
+ }
+
+ if (empty($membership_level)) {return;}
+ $this->sanitized['membership_level'] = $membership_level;
+ }
+
+ protected function password_re() {
+
+ }
+
+ protected function last_accessed() {
+
+ }
+
+ protected function last_accessed_from_ip() {
+
+ }
+
+ protected function referrer() {
+
+ }
+
+ protected function extra_info() {
+
+ }
+
+ protected function reg_code() {
+
+ }
+
+ protected function txn_id() {
+
+ }
+
+ protected function subscr_id() {
+ $subscr_id = filter_input(INPUT_POST, 'subscr_id', FILTER_SANITIZE_STRING);
+ $this->sanitized['subscr_id'] = $subscr_id;
+ }
+
+ protected function flags() {
+
+ }
+
+ protected function more_membership_levels() {
+
+ }
+
+ protected function initial_membership_level() {
+
+ }
+
+ protected function home_page() {
+
+ }
+
+ protected function notes() {
+
+ }
+
+ protected function profile_image() {
+
+ }
+
+ protected function expiry_1st() {
+
+ }
+
+ protected function expiry_2nd() {
+
+ }
+
+ protected function member_id() {
+
+ }
+
+ public function is_valid() {
+ return count($this->errors) < 1;
+ }
+
+ public function get_sanitized() {
+ return $this->sanitized;
+ }
+
+ public function get_errors() {
+ return $this->errors;
+ }
+
+}
diff --git a/classes/class.bFrontForm.php b/classes/class.bFrontForm.php
new file mode 100644
index 0000000..92adc82
--- /dev/null
+++ b/classes/class.bFrontForm.php
@@ -0,0 +1,7 @@
+get_value('join-us-page-url');
+ $membership_level = '';
+ $member_id = filter_input(INPUT_GET, 'member_id', FILTER_SANITIZE_NUMBER_INT);
+ $code = filter_input(INPUT_GET, 'code', FILTER_SANITIZE_STRING);
+
+ global $wpdb;
+ if (BUtils::is_paid_registration()){
+ $member = $member = BUtils::get_paid_member_info();
+ if (empty($member)){
+ BUtils::e('Error! Invalid Request. Could not find a match for the given security code and the user ID.');
+ }
+ $membership_level = $member->membership_level;
+ }
+ else if (!empty($level)) {
+ $member = BTransfer::$default_fields;
+ $membership_level = absint($level);
+ }
+ if (empty($membership_level)) {
+ $joinuspage_link = 'Join us ';
+ BUtils::e('Free membership is disabled on this site. Please make a payment from the ' . $joinuspage_link . ' page to pay for a premium membership.');
+ return;
+ }
+ $form = apply_filters('swpm_registration_form_override', '', $membership_level);
+ if (!empty($form)) {return $form;}
+
+ $mebership_info = BPermission::get_instance($membership_level);
+ $membership_level = $mebership_info->get('id');
+ if (empty($membership_level)) {
+ return "Membership Level Not Found.";
+ }
+ $level_identifier = md5($membership_level);
+ $membership_level_alias = $mebership_info->get('alias');
+ $swpm_registration_submit = filter_input(INPUT_POST, 'swpm_registration_submit');
+ if (!empty($swpm_registration_submit)){
+ $member = $_POST;
+ }
+ ob_start();
+ extract((array)$member, EXTR_SKIP);
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/add.php');
+ return ob_get_clean();
+ }
+ public function register() {
+ if($this->create_swpm_user()&&$this->create_wp_user()&&$this->send_reg_email()){
+ do_action('swpm_front_end_registration_complete');
+
+ $login_page_url = BSettings::get_instance()->get_value('login-page-url');
+ $after_rego_msg = ''. BUtils::_('Registration Successful. '). BUtils::_('Please').' '.BUtils::_('Login').'
';
+ $message = array('succeeded' => true, 'message' => $after_rego_msg);
+ BTransfer::get_instance()->set('status', $message);
+ return;
+ }
+ }
+ private function create_swpm_user(){
+ global $wpdb;
+ $member = BTransfer::$default_fields;
+ $form = new BFrontForm($member);
+ if (!$form->is_valid()) {
+ $message = array('succeeded' => false, 'message' => BUtils::_('Please correct the following'),
+ 'extra' => $form->get_errors());
+ BTransfer::get_instance()->set('status', $message);
+ return false;
+ }
+
+
+ $member_info = $form->get_sanitized();
+ $free_level = BUtils::get_free_level();
+ $account_status = BSettings::get_instance()->get_value('default-account-status', 'active');
+ $member_info['last_accessed_from_ip'] = BTransfer::get_real_ip_addr();
+ $member_info['member_since'] = date("Y-m-d");
+ $member_info['subscription_starts'] = date("Y-m-d");
+ $member_info['account_state'] = $account_status;
+ $plain_password = $member_info['plain_password'];
+ unset($member_info['plain_password']);
+
+ if (BUtils::is_paid_registration()){
+ $member_info['reg_code'] = '';
+ $member_id = filter_input(INPUT_GET, 'member_id', FILTER_SANITIZE_NUMBER_INT);
+ $code = filter_input(INPUT_GET, 'code', FILTER_SANITIZE_STRING);
+ $wpdb->update($wpdb->prefix . "swpm_members_tbl", $member_info,
+ array('member_id' => $member_id,'reg_code'=>$code));
+
+ $query = $wpdb->prepare('SELECT membership_level FROM ' . $wpdb->prefix . 'swpm_members_tbl WHERE member_id=%d', $member_id);
+ $member_info['membership_level'] = $wpdb->get_var( $query );
+ $last_insert_id = $member_id;
+ }
+ else if (!empty($free_level)){
+ $member_info['membership_level'] = $free_level;
+ $wpdb->insert($wpdb->prefix . "swpm_members_tbl", $member_info);
+ $last_insert_id = $wpdb->insert_id;
+ }
+ else{
+ $message = array('succeeded' => false, 'message' => BUtils::_('Membership Level Couldn\'t be found.'));
+ BTransfer::get_instance()->set('status', $message);
+ return false;
+ }
+ $member_info['plain_password'] = $plain_password;
+ $this->member_info = $member_info;
+ return true;
+ }
+ private function create_wp_user(){
+ global $wpdb;
+ $member_info = $this->member_info;
+ $query = $wpdb->prepare("SELECT role FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id = %d", $member_info['membership_level']) ;
+ $wp_user_info = array();
+ $wp_user_info['user_nicename'] = implode('-', explode(' ', $member_info['user_name']));
+ $wp_user_info['display_name'] = $member_info['user_name'];
+ $wp_user_info['user_email'] = $member_info['email'];
+ $wp_user_info['nickname'] = $member_info['user_name'];
+ $wp_user_info['first_name'] = $member_info['first_name'];
+ $wp_user_info['last_name'] = $member_info['last_name'];
+ $wp_user_info['user_login'] = $member_info['user_name'];
+ $wp_user_info['password'] = $member_info['plain_password'];
+ $wp_user_info['role'] = $wpdb->get_var($query);
+ $wp_user_info['user_registered'] = date('Y-m-d H:i:s');
+ BUtils::create_wp_user($wp_user_info);
+ return true;
+ }
+ public function edit() {
+ global $wpdb;
+ $auth = BAuth::get_instance();
+ if (!$auth->is_logged_in()) {
+ return;
+ }
+ $user_data = (array) $auth->userData;
+ unset($user_data['permitted']);
+ $form = new BForm($user_data);
+ if ($form->is_valid()) {
+ global $wpdb;
+ $member_info = $form->get_sanitized();
+ // update corresponding wp user.
+ BUtils::update_wp_user($auth->get('user_name'),$member_info);
+ if (isset($member_info['plain_password'])) {
+ unset($member_info['plain_password']);
+ }
+
+ $wpdb->update(
+ $wpdb->prefix . "swpm_members_tbl", $member_info, array('member_id' => $auth->get('member_id')));
+ $auth->reload_user_data();
+ $message = array('succeeded' => true, 'message' => 'Profile Updated.');
+ BTransfer::get_instance()->set('status', $message);
+ } else {
+ $message = array('succeeded' => false, 'message' => BUtils::_('Please correct the following'),
+ 'extra' => $form->get_errors());
+ BTransfer::get_instance()->set('status', $message);
+ return;
+ }
+ }
+
+ public function reset_password($email) {
+ $email = sanitize_email($email);
+ if (!is_email($email)) {
+ $message = '' . BUtils::_("Email address not valid.") . '
';
+ $message = array('succeeded' => false, 'message' => $message);
+ BTransfer::get_instance()->set('status', $message);
+ return;
+ }
+ global $wpdb;
+ $query = 'SELECT member_id,user_name,first_name, last_name FROM ' .
+ $wpdb->prefix . 'swpm_members_tbl ' .
+ ' WHERE email = %s';
+ $user = $wpdb->get_row($wpdb->prepare($query, $email));
+ if (empty($user)) {
+ $message = '' . BUtils::_("No user not found with that email address.") .'
';
+ $message .= '' . BUtils::_("Email Address: ") . $email .'
';
+ $message = array('succeeded' => false, 'message' => $message);
+ BTransfer::get_instance()->set('status', $message);
+ return;
+ }
+ $settings = BSettings::get_instance();
+ $password = wp_generate_password();
+
+ $password_hash = BUtils::encrypt_password(trim($password)); //should use $saned??;
+ $wpdb->update($wpdb->prefix . "swpm_members_tbl", array('password' => $password_hash), array('member_id' => $user->member_id));
+
+ // update wp user pass.
+ BUtils::update_wp_user($user->user_name, array('plain_password'=>$password));
+
+ $body = $settings->get_value('reset-mail-body');
+ $subject = $settings->get_value('reset-mail-subject');
+ $search = array('{user_name}', '{first_name}', '{last_name}', '{password}');
+ $replace = array($user->user_name, $user->first_name, $user->last_name, $password);
+ $body = str_replace($search, $replace, $body);
+ $from = $settings->get_value('email-from');
+ $headers = "From: " . $from . "\r\n";
+ wp_mail($email, $subject, $body, $headers);
+ $message = '' . BUtils::_("New password has been sent to your email address.") .'
';
+ $message .= '' . BUtils::_("Email Address: ") . $email .'
';
+
+ $message = array('succeeded' => false, 'message' => $message);
+ BTransfer::get_instance()->set('status', $message);
+ }
+}
diff --git a/classes/class.bInstallation.php b/classes/class.bInstallation.php
new file mode 100644
index 0000000..8adb4d7
--- /dev/null
+++ b/classes/class.bInstallation.php
@@ -0,0 +1,243 @@
+blogid;
+ // Get all blog ids
+ $blogids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs");
+ foreach ($blogids as $blog_id) {
+ switch_to_blog($blog_id);
+ BInstallation::installer();
+ BInstallation::initdb();
+ }
+ switch_to_blog($old_blog);
+ return;
+ }
+ }
+
+ //Do this if single site standard install
+ BInstallation::installer();
+ BInstallation::initdb();
+ }
+
+ public static function installer() {
+ global $wpdb;
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
+
+ $charset_collate = '';
+ if (!empty($wpdb->charset)){
+ $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
+ }else{
+ $charset_collate = "DEFAULT CHARSET=utf8";
+ }
+ if (!empty($wpdb->collate)){
+ $charset_collate .= " COLLATE $wpdb->collate";
+ }
+
+ $sql = "CREATE TABLE " . $wpdb->prefix . "swpm_members_tbl (
+ member_id int(12) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ user_name varchar(32) NOT NULL,
+ first_name varchar(32) DEFAULT '',
+ last_name varchar(32) DEFAULT '',
+ password varchar(64) NOT NULL,
+ member_since date NOT NULL DEFAULT '0000-00-00',
+ membership_level smallint(6) NOT NULL,
+ more_membership_levels VARCHAR(100) DEFAULT NULL,
+ account_state enum('active','inactive','expired','pending','unsubscribed') DEFAULT 'pending',
+ last_accessed datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ last_accessed_from_ip varchar(64) NOT NULL,
+ email varchar(64) DEFAULT NULL,
+ phone varchar(64) DEFAULT NULL,
+ address_street varchar(255) DEFAULT NULL,
+ address_city varchar(255) DEFAULT NULL,
+ address_state varchar(255) DEFAULT NULL,
+ address_zipcode varchar(255) DEFAULT NULL,
+ home_page varchar(255) DEFAULT NULL,
+ country varchar(255) DEFAULT NULL,
+ gender enum('male','female','not specified') DEFAULT 'not specified',
+ referrer varchar(255) DEFAULT NULL,
+ extra_info text,
+ reg_code varchar(255) DEFAULT NULL,
+ subscription_starts date DEFAULT NULL,
+ initial_membership_level smallint(6) DEFAULT NULL,
+ txn_id varchar(64) DEFAULT '',
+ subscr_id varchar(32) DEFAULT '',
+ company_name varchar(100) DEFAULT '',
+ notes text DEFAULT NULL,
+ flags int(11) DEFAULT '0',
+ profile_image varchar(255) DEFAULT ''
+ )" . $charset_collate . ";";
+ dbDelta($sql);
+
+ $sql = "CREATE TABLE " . $wpdb->prefix . "swpm_membership_tbl (
+ id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ alias varchar(127) NOT NULL,
+ role varchar(255) NOT NULL DEFAULT 'subscriber',
+ permissions tinyint(4) NOT NULL DEFAULT '0',
+ subscription_period varchar(11) NOT NULL DEFAULT '-1',
+ subscription_duration_type tinyint NOT NULL default 0,
+ subscription_unit VARCHAR(20) NULL,
+ loginredirect_page text NULL,
+ category_list longtext,
+ page_list longtext,
+ post_list longtext,
+ comment_list longtext,
+ attachment_list longtext,
+ custom_post_list longtext,
+ disable_bookmark_list longtext,
+ options longtext,
+ protect_older_posts tinyint(1) NOT NULL DEFAULT '0',
+ campaign_name varchar(60) NOT NULL DEFAULT ''
+ )" . $charset_collate . " AUTO_INCREMENT=1 ;";
+ dbDelta($sql);
+ $sql = "SELECT * FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id = 1";
+ $results = $wpdb->get_row($sql);
+ if (is_null($results)) {
+ $sql = "INSERT INTO " . $wpdb->prefix . "swpm_membership_tbl (
+ id ,
+ alias ,
+ role ,
+ permissions ,
+ subscription_period ,
+ subscription_unit,
+ loginredirect_page,
+ category_list ,
+ page_list ,
+ post_list ,
+ comment_list,
+ disable_bookmark_list,
+ options,
+ campaign_name
+ )VALUES (1 , 'Content Protection', 'administrator', '15', '0',NULL,NULL, NULL , NULL , NULL , NULL,NULL,NULL,'');";
+ $wpdb->query($sql);
+ }
+ $sql = "UPDATE " . $wpdb->prefix . "swpm_membership_tbl SET subscription_duration_type = 1 WHERE subscription_unit='days' AND subscription_duration_type = 0";
+ $wpdb->query($sql);
+
+ $sql = "UPDATE " . $wpdb->prefix . "swpm_membership_tbl SET subscription_duration_type = 2 WHERE subscription_unit='weeks' AND subscription_duration_type = 0";
+ $wpdb->query($sql);
+
+ $sql = "UPDATE " . $wpdb->prefix . "swpm_membership_tbl SET subscription_duration_type = 3 WHERE subscription_unit='months' AND subscription_duration_type = 0";
+ $wpdb->query($sql);
+
+ $sql = "UPDATE " . $wpdb->prefix . "swpm_membership_tbl SET subscription_duration_type = 4 WHERE subscription_unit='years' AND subscription_duration_type = 0";
+ $wpdb->query($sql);
+ $sql = "CREATE TABLE " . $wpdb->prefix . "swpm_membership_meta_tbl (
+ id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ level_id int(11) NOT NULL,
+ meta_key varchar(255) NOT NULL,
+ meta_label varchar(255) NULL,
+ meta_value text,
+ meta_type varchar(255) NOT NULL DEFAULT 'text',
+ meta_default text,
+ meta_context varchar(255) NOT NULL DEFAULT 'default',
+ KEY level_id (level_id),
+ UNIQUE KEY meta_key_id (level_id,meta_key)
+ )" . $charset_collate . " AUTO_INCREMENT=1 ;";
+ dbDelta($sql);
+
+ $sql = "CREATE TABLE " . $wpdb->prefix . "swpm_payments_tbl (
+ id int(12) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ email varchar(64) DEFAULT NULL,
+ first_name varchar(32) DEFAULT '',
+ last_name varchar(32) DEFAULT '',
+ member_id varchar(16) DEFAULT '',
+ membership_level varchar(16) DEFAULT '',
+ txn_date date NOT NULL default '0000-00-00',
+ txn_id varchar(128) NOT NULL default '',
+ subscr_id varchar(128) NOT NULL default '',
+ reference varchar(128) NOT NULL default '',
+ payment_amount varchar(32) NOT NULL default '',
+ gateway varchar(16) DEFAULT '',
+ status varchar(16) DEFAULT '',
+ ip_address varchar(64) default ''
+ )" . $charset_collate . ";";
+ dbDelta($sql);
+
+ //Save the current DB version
+ update_option("swpm_db_version", SIMPLE_WP_MEMBERSHIP_DB_VER);
+ }
+
+ public static function initdb() {
+ $settings = BSettings::get_instance();
+
+ $installed_version = $settings->get_value('swpm-active-version');
+
+ //Set other default settings values
+ $reg_prompt_email_subject = "Complete your registration";
+ $reg_prompt_email_body = "Dear {first_name} {last_name}" .
+ "\n\nThank you for joining us!" .
+ "\n\nPlease complete your registration by visiting the following link:" .
+ "\n\n{reg_link}" .
+ "\n\nThank You";
+ $reg_email_subject = "Your registration is complete";
+ $reg_email_body = "Dear {first_name} {last_name}\n\n" .
+ "Your registration is now complete!\n\n" .
+ "Registration details:\n" .
+ "Username: {user_name}\n" .
+ "Password: {password}\n\n" .
+ "Please login to the member area at the following URL:\n\n" .
+ "{login_link}\n\n" .
+ "Thank You";
+
+ $upgrade_email_subject = "Subject for email sent after account upgrade";
+ $upgrade_email_body = "Dear {first_name} {last_name}" .
+ "\n\nYour Account Has Been Upgraded." .
+ "\n\nThank You";
+ $reset_email_subject = get_bloginfo('name') . ": New Password";
+ $reset_email_body = "Dear {first_name} {last_name}" .
+ "\n\nHere is your new password" .
+ "\n\nUser name: {user_name}" .
+ "\n\nPassword: {password}" .
+ "\n\nThank You";
+
+ $status_change_email_subject = "Account Updated!";
+ $status_change_email_body = "Dear {first_name} {last_name}," .
+ "\n\n Your account status has been updated!" .
+ " Please login to the member area at the following URL:" .
+ "\n\n {login_link}" .
+ "\n\nThank You";
+
+ if (empty($installed_version)) {
+ //Do fresh install tasks
+
+ /* * * Create the mandatory pages (if they are not there) ** */
+ miscUtils::create_mandatory_wp_pages();
+ /* * * End of page creation ** */
+ $settings->set_value('reg-complete-mail-subject', stripslashes($reg_email_subject))
+ ->set_value('reg-complete-mail-body', stripslashes($reg_email_body))
+ ->set_value('reg-prompt-complete-mail-subject', stripslashes($reg_prompt_email_subject))
+ ->set_value('reg-prompt-complete-mail-body', stripslashes($reg_prompt_email_body))
+ ->set_value('upgrade-complete-mail-subject', stripslashes($upgrade_email_subject))
+ ->set_value('upgrade-complete-mail-body', stripslashes($upgrade_email_body))
+ ->set_value('reset-mail-subject', stripslashes($reset_email_subject))
+ ->set_value('reset-mail-body', stripslashes($reset_email_body))
+ ->set_value('account-change-email-subject', stripslashes($status_change_email_subject))
+ ->set_value('account-change-email-body', stripslashes($status_change_email_body))
+ ->set_value('email-from', trim(get_option('admin_email')));
+ }
+ if (version_compare($installed_version, SIMPLE_WP_MEMBERSHIP_VER) == -1) {
+ //Do upgrade tasks
+ }
+
+ $settings->set_value('swpm-active-version', SIMPLE_WP_MEMBERSHIP_VER)->save(); //save everything.
+ }
+}
diff --git a/classes/class.bLevelForm.php b/classes/class.bLevelForm.php
new file mode 100644
index 0000000..709046c
--- /dev/null
+++ b/classes/class.bLevelForm.php
@@ -0,0 +1,126 @@
+fields = $fields;
+ $this->sanitized = array();
+ foreach ($fields as $key => $value)
+ $this->$key();
+ }
+
+ protected function id() {
+
+ }
+
+ protected function alias() {
+ $alias = filter_input(INPUT_POST, 'alias');
+ $this->sanitized['alias'] = sanitize_text_field($alias);
+ }
+
+ protected function role() {
+ $role = filter_input(INPUT_POST, 'role');
+ $this->sanitized['role'] = sanitize_text_field($role);
+ }
+
+ protected function permissions() {
+ $this->sanitized['permissions'] = 63;
+ }
+
+ protected function subscription_period() {
+ $subscript_duration_type = filter_input(INPUT_POST, 'subscription_duration_type');
+
+ if ($subscript_duration_type == BMembershipLevel::NO_EXPIRY) {
+ $this->sanitized['subscription_period'] = "";
+ return;
+ }
+
+ $subscription_period = filter_input(INPUT_POST, 'subscription_period_'. $subscript_duration_type);
+ if (($subscript_duration_type == BMembershipLevel::FIXED_DATE)){
+ $dateinfo = date_parse($subscription_period);
+ if ($dateinfo['warning_count']|| $dateinfo['error_count']){
+ $this->errors['subscription_period'] = BUtils::_("Date format is not valid.");
+ return;
+ }
+ $this->sanitized['subscription_period'] = sanitize_text_field($subscription_period);
+ return;
+ }
+
+ if (!is_numeric($subscription_period)) {
+ $this->errors['subscription_period'] = BUtils::_("Access duration must be > 0.");
+ return;
+ }
+ $this->sanitized['subscription_period'] = sanitize_text_field($subscription_period);
+ }
+
+ protected function subscription_duration_type(){
+ $subscription_duration_type = filter_input(INPUT_POST, 'subscription_duration_type');
+ $this->sanitized['subscription_duration_type'] = $subscription_duration_type;
+ return;
+ }
+ protected function subscription_unit(){
+
+ }
+ protected function loginredirect_page() {
+
+ }
+
+ protected function category_list() {
+
+ }
+
+ protected function page_list() {
+
+ }
+
+ protected function post_list() {
+
+ }
+
+ protected function comment_list() {
+
+ }
+
+ protected function attachment_list() {
+
+ }
+
+ protected function custom_post_list() {
+
+ }
+
+ protected function disable_bookmark_list() {
+
+ }
+
+ protected function options() {
+
+ }
+
+ protected function campaign_name() {
+
+ }
+
+ protected function protect_older_posts() {
+ $checked = filter_input(INPUT_POST, 'protect_older_posts');
+ $this->sanitized['protect_older_posts'] = empty($checked) ? 0 : 1;
+ }
+
+ public function is_valid() {
+ return count($this->errors) < 1;
+ }
+
+ public function get_sanitized() {
+ return $this->sanitized;
+ }
+
+ public function get_errors() {
+ return $this->errors;
+ }
+
+}
diff --git a/classes/class.bLog.php b/classes/class.bLog.php
new file mode 100644
index 0000000..3f81e88
--- /dev/null
+++ b/classes/class.bLog.php
@@ -0,0 +1,77 @@
+error = array();
+ $this->warn = array();
+ $this->notice = array();
+ }
+ public static function get_logger($context = ''){
+ $context = empty($context)? 'default': $context;
+ if (!isset(self::$intance[$context])){
+ self::$intance[$context] = new BLog();
+ }
+ return self::$intance[$context];
+ }
+ public function error($msg){
+ $this->error[] = $msg;
+ }
+ public function warn($msg){
+ $this->warn[] = $msg;
+ }
+ public function debug($msg){
+ $this->notice[] = $msg;
+ }
+ public function get($to_screen = false){
+ $msg = '';
+ foreach ($this->error as $error ){
+ $msg .= 'ERROR: ' . $error . ($to_screen?" ":"\n");
+ }
+ foreach($this->warn as $warn){
+ $msg .= 'WARN: ' . $warn . ($to_screen?" ":"\n");
+ }
+ foreach ($this->notice as $notice){
+ $msg = 'NOTICE: ' . $notice . ($to_screen?" ":"\n");
+ }
+ return $msg;
+ }
+ public static function writeall($path = ''){
+ if (empty($path)) {$path = SIMPLE_WP_MEMBERSHIP_PATH . 'log.txt';}
+ $fp = fopen($path, 'a');
+ $date = date("Y-m-d H:i:s");
+ fwrite($fp, strtoupper($date) . ":\n");
+ fwrite($fp, str_repeat('-=', (strlen($date)+1.0)/2.0) . "\n");
+ foreach (self::$intance as $context=>$intance){
+ fwrite($fp, strtoupper($context) . ":\n");
+ fwrite($fp, str_repeat('=', strlen($context)+1) . "\n");
+ fwrite($fp, $intance->get());
+ }
+ fclose($fp);
+ }
+
+ public static function log_simple_debug($message, $success, $end = false) {
+ $settings = BSettings::get_instance();
+ $debug_enabled = $settings->get_value('enable-debug');
+ if (empty($debug_enabled)) {//Debug is not enabled
+ return;
+ }
+
+ //Lets write to the log file
+ $debug_log_file_name = SIMPLE_WP_MEMBERSHIP_PATH . 'log.txt';
+
+ // Timestamp
+ $text = '[' . date('m/d/Y g:i A') . '] - ' . (($success) ? 'SUCCESS :' : 'FAILURE :') . $message . "\n";
+ if ($end) {
+ $text .= "\n------------------------------------------------------------------\n\n";
+ }
+ // Write to log
+ $fp = fopen($debug_log_file_name, 'a');
+ fwrite($fp, $text);
+ fclose($fp); // close file
+ }
+
+}
diff --git a/classes/class.bMemberUtils.php b/classes/class.bMemberUtils.php
new file mode 100644
index 0000000..60ce8fe
--- /dev/null
+++ b/classes/class.bMemberUtils.php
@@ -0,0 +1,35 @@
+is_logged_in()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public static function get_logged_in_members_id() {
+ $auth = BAuth::get_instance();
+ if (!$auth->is_logged_in()) {
+ return bUtils::_("User is not logged in.");
+ }
+ return $auth->userData->member_id;
+ }
+
+ public static function get_logged_in_members_level() {
+ $auth = BAuth::get_instance();
+ if (!$auth->is_logged_in()) {
+ return bUtils::_("User is not logged in.");
+ }
+ return $auth->userData->membership_level;
+ }
+
+}
diff --git a/classes/class.bMembers.php b/classes/class.bMembers.php
new file mode 100644
index 0000000..7311dd0
--- /dev/null
+++ b/classes/class.bMembers.php
@@ -0,0 +1,198 @@
+ BUtils::_('Member'),
+ 'plural' => BUtils::_('Members'),
+ 'ajax' => false
+ ));
+ }
+
+ function get_columns() {
+ return array(
+ 'cb' => ' '
+ , 'member_id' => BUtils::_('ID')
+ , 'user_name' => BUtils::_('User Name')
+ , 'first_name' => BUtils::_('First Name')
+ , 'last_name' => BUtils::_('Last Name')
+ , 'email' => BUtils::_('Email')
+ , 'alias' => BUtils::_('Membership Level')
+ , 'subscription_starts' => BUtils::_('Access Starts')
+ , 'account_state' => BUtils::_('Account State')
+ );
+ }
+
+ function get_sortable_columns() {
+ return array(
+ 'member_id' => array('member_id', true),
+ 'user_name' => array('user_name', true)
+ );
+ }
+
+ function get_bulk_actions() {
+ $actions = array(
+ 'bulk_delete' => BUtils::_('Delete')
+ );
+ return $actions;
+ }
+
+ function column_default($item, $column_name) {
+ return $item[$column_name];
+ }
+
+ function column_member_id($item) {
+ $actions = array(
+ 'edit' => sprintf('Edit ', $_REQUEST['page'], $item['member_id']),
+ 'delete' => sprintf('Delete ', $_REQUEST['page'], $item['member_id']),
+ );
+ return $item['member_id'] . $this->row_actions($actions);
+ }
+
+ function column_cb($item) {
+ return sprintf(
+ ' ', $item['member_id']
+ );
+ }
+
+ function prepare_items() {
+ global $wpdb;
+ $query = "SELECT * FROM " . $wpdb->prefix . "swpm_members_tbl";
+ $query .= " LEFT JOIN " . $wpdb->prefix . "swpm_membership_tbl";
+ $query .= " ON ( membership_level = id ) ";
+ $s = filter_input(INPUT_POST, 's');
+ if (!empty($s)){
+ $query .= " WHERE user_name LIKE '%" . strip_tags($s) . "%' "
+ . " OR first_name LIKE '%" . strip_tags($s) . "%' "
+ . " OR last_name LIKE '%" . strip_tags($s) . "%' ";
+ }
+ $orderby = filter_input(INPUT_GET, 'orderby');
+ $orderby = empty($orderby) ? 'user_name' : $orderby ;
+ $order = filter_input(INPUT_GET, 'order');
+ $order = empty($order) ? 'DESC' : $order;
+
+ $sortable_columns = $this->get_sortable_columns();
+ $orderby = BUtils::sanitize_value_by_array($orderby, $sortable_columns);
+ $order = BUtils::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1'));
+
+ $query.=' ORDER BY ' . $orderby . ' ' . $order;
+ $totalitems = $wpdb->query($query); //return the total number of affected rows
+ $perpage = 20;
+ $paged = filter_input(INPUT_GET, 'paged');
+ if (empty($paged) || !is_numeric($paged) || $paged <= 0) {
+ $paged = 1;
+ }
+ $totalpages = ceil($totalitems / $perpage);
+ if (!empty($paged) && !empty($perpage)) {
+ $offset = ($paged - 1) * $perpage;
+ $query.=' LIMIT ' . (int) $offset . ',' . (int) $perpage;
+ }
+ $this->set_pagination_args(array(
+ "total_items" => $totalitems,
+ "total_pages" => $totalpages,
+ "per_page" => $perpage,
+ ));
+
+ $columns = $this->get_columns();
+ $hidden = array();
+ $sortable = $this->get_sortable_columns();
+
+ $this->_column_headers = array($columns, $hidden, $sortable);
+ $this->items = $wpdb->get_results($query, ARRAY_A);
+ }
+
+ function no_items() {
+ _e('No Member found.');
+ }
+
+ function process_form_request() {
+ if (isset($_REQUEST['member_id']))
+ return $this->edit(absint($_REQUEST['member_id']));
+ return $this->add();
+ }
+
+ function add() {
+ $form = apply_filters('swpm_admin_registration_form_override', '');
+ if (!empty($form)) {echo $form;return;}
+ global $wpdb;
+ $member = BTransfer::$default_fields;
+ $member['member_since'] = date('Y-m-d');
+ $member['subscription_starts'] = date('Y-m-d');
+ if (isset($_POST['createswpmuser'])) {
+ $member = $_POST;
+ }
+ extract($member, EXTR_SKIP);
+ $query = "SELECT * FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id !=1 ";
+ $levels = $wpdb->get_results($query, ARRAY_A);
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_add.php');
+ return false;
+ }
+
+ function edit($id) {
+ global $wpdb;
+ $id = absint($id);
+ $query = "SELECT * FROM {$wpdb->prefix}swpm_members_tbl WHERE member_id = $id";
+ $member = $wpdb->get_row($query, ARRAY_A);
+ if (isset($_POST["editswpmuser"])) {
+ $_POST['user_name'] = $member['user_name'];
+ $_POST['email'] = $member['email'];
+ $member = $_POST;
+ }
+ extract($member, EXTR_SKIP);
+ $query = "SELECT * FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id !=1 ";
+ $levels = $wpdb->get_results($query, ARRAY_A);
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_edit.php');
+ return false;
+ }
+
+ function delete() {
+ global $wpdb;
+ if (isset($_REQUEST['members'])) {
+ $members = $_REQUEST['members'];
+ if (!empty($members)) {
+ $members = array_map('absint', $members);
+ foreach ($members as $swpm_id) {
+ $user_name = BUtils::get_user_by_id(absint($swpm_id));
+ BMembers::delete_wp_user($user_name);
+ }
+ $query = "DELETE FROM " . $wpdb->prefix . "swpm_members_tbl WHERE member_id IN (" . implode(',', $members) . ")";
+ $wpdb->query($query);
+ }
+ }
+ else if (isset($_REQUEST['member_id'])) {
+ $id = absint($_REQUEST['member_id']);
+ BMembers::delete_user_by_id($id);
+ }
+ }
+ public static function delete_user_by_id($id){
+ $user_name = BUtils::get_user_by_id($id);
+ BMembers::delete_wp_user($user_name);
+ BMembers::delete_swpm_user_by_id($id);
+ }
+
+ public static function delete_swpm_user_by_id($id){
+ global $wpdb;
+ $query = "DELETE FROM " . $wpdb->prefix . "swpm_members_tbl WHERE member_id = $id";
+ $wpdb->query($query);
+ }
+ function show() {
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_members.php');
+ }
+
+ public static function delete_wp_user($user_name) {
+ $wp_user_id = username_exists($user_name);
+ $ud = get_userdata($wp_user_id);
+ if (!empty($ud) && (isset($ud->wp_capabilities['administrator']) || $ud->wp_user_level == 10)) {
+ BTransfer::get_instance()->set('status', 'For consistency, we do not allow deleting any associated wordpress account with administrator role. '
+ . 'Please delete from Users menu.');
+ return;
+ }
+ if ($wp_user_id) {
+ include_once(ABSPATH . 'wp-admin/includes/user.php');
+ wp_delete_user($wp_user_id, 1); //assigns all related to this user to admin.
+ }
+ }
+
+}
diff --git a/classes/class.bMembershipLevel.php b/classes/class.bMembershipLevel.php
new file mode 100644
index 0000000..747c1d0
--- /dev/null
+++ b/classes/class.bMembershipLevel.php
@@ -0,0 +1,70 @@
+is_valid()) {
+ $level_info = $form->get_sanitized();
+ $wpdb->insert($wpdb->prefix . "swpm_membership_tbl", $level_info);
+ $id = $wpdb->insert_id;
+ $custom = apply_filters('swpm_admin_add_membership_level', array());
+ $this->save_custom_fields($id, $custom);
+ $message = array('succeeded' => true, 'message' => BUtils::_('Membership Level Creation Successful.'));
+ BTransfer::get_instance()->set('status', $message);
+ wp_redirect('admin.php?page=simple_wp_membership_levels');
+ return;
+ }
+ $message = array('succeeded' => false, 'message' => BUtils::_('Please correct the following:'), 'extra' => $form->get_errors());
+ BTransfer::get_instance()->set('status', $message);
+ }
+
+ public function edit($id) {
+ global $wpdb;
+ $query = $wpdb->prepare("SELECT * FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id = %d", $id);
+ $level = $wpdb->get_row($query, ARRAY_A);
+ $form = new BLevelForm($level);
+ if ($form->is_valid()) {
+ $wpdb->update($wpdb->prefix . "swpm_membership_tbl", $form->get_sanitized(), array('id' => $id));
+ //@todo meta table and collect all relevant info and pass as argument
+ $custom = apply_filters('swpm_admin_edit_membership_level', array(), $id);
+ $this->save_custom_fields($id, $custom);
+ $message = array('succeeded' => true, 'message' => BUtils::_('Updated Successfully.'));
+ BTransfer::get_instance()->set('status', $message);
+ wp_redirect('admin.php?page=simple_wp_membership_levels');
+ return;
+ }
+ $message = array('succeeded' => false, 'message' => BUtils::_('Please correct the following:'), 'extra' => $form->get_errors());
+ BTransfer::get_instance()->set('status', $message);
+ }
+ private function save_custom_fields($level_id, $data){
+ $custom_obj = BMembershipLevelCustom::get_instance_by_id($level_id);
+ foreach ($data as $item){
+ $custom_obj->set($item);
+ }
+ }
+}
diff --git a/classes/class.bMembershipLevelCustom.php b/classes/class.bMembershipLevelCustom.php
new file mode 100644
index 0000000..5ac7952
--- /dev/null
+++ b/classes/class.bMembershipLevelCustom.php
@@ -0,0 +1,93 @@
+fields = array();
+ }
+ public static function get_instance_by_id($level_id){
+ if (!isset(self::$instances[$level_id])){
+ self::$instances[$level_id] = new BMembershipLevelCustom();
+ self::$instances[$level_id]->level_id = $level_id;
+ self::$instances[$level_id]->load_by_id($level_id);
+ }
+ return self::$instances[$level_id];
+ }
+ public function load_by_id($level_id){
+ global $wpdb;
+ $query = 'SELECT * FROM ' . $wpdb->prefix . 'swpm_membership_meta_tbl WHERE level_id=%d';
+ $results = $wpdb->get_results($wpdb->prepare($query, $level_id), ARRAY_A);
+ foreach($results as $result){
+ $this->fields[$result['meta_key']] = $result;
+ }
+ }
+ public function set($item){
+ $meta_key = preg_replace('|[^A-Z0-9_]|i', '', $item['meta_key']);
+ $new = array(
+ 'meta_key'=>$meta_key,
+ 'level_id'=>$this->level_id,
+ 'meta_label'=> isset($item['meta_label'])?$item['meta_label']:'',
+ 'meta_value'=>$item['meta_value'],
+ 'meta_type'=> isset($item['meta_type'])?$item['meta_type']:'text',
+ 'meta_default'=> isset($item['meta_default'])?$item['meta_default']:'',
+ 'meta_context'=> $item['meta_context'],
+ );
+ if (isset($this->fields[$meta_key])){
+ $new['id'] = $this->fields[$meta_key]['id'];
+ $this->fields[$meta_key] = $new;
+ }
+ else{
+ $this->fields[$meta_key] = $new;
+ }
+ $this->save($this->fields[$meta_key]);
+ return $this;
+ }
+ public function get($meta_key, $default=''){
+ $meta_key = preg_replace('|[^A-Z0-9_]|i', '', $meta_key);
+ if (isset($this->fields[$meta_key])){
+ return maybe_unserialize($this->fields[$meta_key]['meta_value']);
+
+ }
+ return $default;
+ }
+ public function get_by_context($context){
+ $result = array();
+ foreach ($this->fields as $key=>$field){
+ if ($field['meta_context'] == $context){
+ $result[$key] = $field;
+ }
+ }
+ return $result;
+ }
+ private function save($field){
+ global $wpdb;
+ if (!isset($field['meta_key'])){retern;} // cannot continue without key field.
+ $meta_key = preg_replace('|[^A-Z0-9_]|i', '', $field['meta_key']);
+ $query = $wpdb->prepare(
+ 'REPLACE INTO ' . $wpdb->prefix. 'swpm_membership_meta_tbl
+ (level_id, meta_key, meta_label, meta_value, meta_type, meta_default, meta_context)
+ VALUES(%d, %s, %s, %s, %s, %s, %s); ',
+ $this->level_id,
+ $meta_key,
+ isset($field['meta_label'])? sanitize_text_field($field['meta_label']): '',
+ isset($field['meta_value'])? sanitize_text_field($field['meta_value']): '',
+ 'text', // at the moment we have only one type
+ '',
+ isset($field['meta_context'])? sanitize_text_field($field['meta_context']): 'default'
+ );
+
+ $wpdb->query($query);
+ }
+ public static function get_value_by_key($level_id, $key, $default= ''){
+ return BMembershipLevelCustom::get_instance_by_id($level_id)->get($key, $default);
+ }
+ public static function get_value_by_context($level_id, $context){
+ return BMembershipLevelCustom::get_instance_by_id($level_id)->get_by_context($context);
+ }
+}
diff --git a/classes/class.bMembershipLevelUtils.php b/classes/class.bMembershipLevelUtils.php
new file mode 100644
index 0000000..0a81afb
--- /dev/null
+++ b/classes/class.bMembershipLevelUtils.php
@@ -0,0 +1,10 @@
+BUtils::_('Membership Level'),
+ 'plural' => BUtils::_('Membership Levels'),
+ 'ajax' => false
+ ));
+ }
+ function get_columns(){
+ return array(
+ 'cb' => ' '
+ ,'id'=>BUtils::_('ID')
+ ,'alias'=>BUtils::_('Membership Level')
+ ,'role'=>BUtils::_('Role')
+ ,'valid_for'=>BUtils::_('Access Valid For/Until')
+ );
+ }
+ function get_sortable_columns(){
+ return array(
+ 'id' => array('id',true),
+ 'alias' => array('alias',true)
+ );
+ }
+ function get_bulk_actions() {
+ $actions = array(
+ 'bulk_delete' => BUtils::_('Delete')
+ );
+ return $actions;
+ }
+ function column_default($item, $column_name){
+ if($column_name == 'valid_for'){
+ if($item['subscription_duration_type'] == BMembershipLevel::NO_EXPIRY) {return 'No Expiry';}
+ if($item['subscription_duration_type'] == BMembershipLevel::FIXED_DATE) {return date(get_option('date_format'), strtotime($item['subscription_period']));}
+ if($item['subscription_duration_type'] == BMembershipLevel::DAYS) {return $item['subscription_period'] ." Day(s)";}
+ if($item['subscription_duration_type'] == BMembershipLevel::WEEKS) {return $item['subscription_period'] ." Week(s)";}
+ if($item['subscription_duration_type'] == BMembershipLevel::MONTHS) {return $item['subscription_period'] ." Month(s)";}
+ if($item['subscription_duration_type'] == BMembershipLevel::YEARS) {return $item['subscription_period'] ." Year(s)";}
+ }
+ if($column_name == 'role') {return ucfirst($item['role']);}
+ return stripslashes($item[$column_name]);
+ }
+ function column_id($item){
+ $actions = array(
+ 'edit' => sprintf('Edit ',
+ $_REQUEST['page'],$item['id']),
+ 'delete' => sprintf('Delete ',
+ $_REQUEST['page'],$item['id']),
+ );
+ return $item['id'] . $this->row_actions($actions);
+ }
+ function column_cb($item) {
+ return sprintf(
+ ' ', $item['id']
+ );
+ }
+ function prepare_items() {
+ global $wpdb;
+ $query = "SELECT * FROM " .$wpdb->prefix . "swpm_membership_tbl WHERE id !=1 ";
+ if(isset($_POST['s'])) $query .= " AND alias LIKE '%" . strip_tags($_POST['s']). "%' ";
+ $orderby = !empty($_GET["orderby"]) ? mysql_real_escape_string($_GET["orderby"]) : 'id';
+ $order = !empty($_GET["order"]) ? mysql_real_escape_string($_GET["order"]) : 'DESC';
+
+ $sortable_columns = $this->get_sortable_columns();
+ $orderby = BUtils::sanitize_value_by_array($orderby, $sortable_columns);
+ $order = BUtils::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1'));
+
+ if(!empty($orderby) && !empty($order)){ $query.=' ORDER BY '.$orderby.' '.$order; }
+
+ $totalitems = $wpdb->query($query); //return the total number of affected rows
+ $perpage = 20;
+ $paged = !empty($_GET["paged"]) ? mysql_real_escape_string($_GET["paged"]) : '';
+ if(empty($paged) || !is_numeric($paged) || $paged<=0 ){ $paged=1; }
+ $totalpages = ceil($totalitems/$perpage);
+ if(!empty($paged) && !empty($perpage)){
+ $offset=($paged-1)*$perpage;
+ $query.=' LIMIT '.(int)$offset.','.(int)$perpage;
+ }
+ $this->set_pagination_args( array(
+ "total_items" => $totalitems,
+ "total_pages" => $totalpages,
+ "per_page" => $perpage,
+ ) );
+
+ $columns = $this->get_columns();
+ $hidden = array();
+ $sortable = $this->get_sortable_columns();
+
+ $this->_column_headers = array($columns, $hidden, $sortable);
+ $this->items = $wpdb->get_results($query, ARRAY_A);
+ }
+ function no_items() {
+ BUtils::e( 'No membership levels found.' );
+ }
+ function process_form_request(){
+ if(isset($_REQUEST['id'])){
+ return $this->edit($_REQUEST['id']);
+ }
+ return $this->add();
+
+ }
+ function add(){
+ global $wpdb;
+ $member = BTransfer::$default_fields;
+ if(isset($_POST['createswpmlevel'])){
+ $member = $_POST;
+ }
+ extract($member, EXTR_SKIP);
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH.'views/admin_add_level.php');
+ return false;
+ }
+ function edit($id){
+ global $wpdb;
+ $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}swpm_membership_tbl WHERE id = %d", absint($id));
+ $membership = $wpdb->get_row($query, ARRAY_A);
+ extract($membership, EXTR_SKIP);
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH.'views/admin_edit_level.php');
+ return false;
+ }
+ function delete(){
+ global $wpdb;
+ if (isset($_REQUEST['ids'])){
+ $members = $_REQUEST['ids'];
+ if(!empty($members)){
+ $members = array_map('absint', $members);
+ $members = implode(',', $members);
+ $query = "DELETE FROM " .$wpdb->prefix . "swpm_membership_tbl WHERE id IN (" . $members . ")";
+ $wpdb->query($query);
+ }
+ }
+ else if(isset($_REQUEST['id'])){
+ $id = absint($_REQUEST['id']);
+ $query = $wpdb->prepare("DELETE FROM " .$wpdb->prefix . "swpm_membership_tbl WHERE id = %d", $id);
+ $wpdb->query($query);
+ }
+ }
+ function show(){
+ $selected = 1;
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH.'views/admin_membership_levels.php');
+ }
+ function manage(){
+ $selected = 2;
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH.'views/admin_membership_manage.php');
+ }
+ function manage_categroy(){
+ $selected = 3;
+ include_once('class.bCategoryList.php');
+ $category_list = new BCategoryList();
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH.'views/admin_category_list.php');
+ }
+}
+
diff --git a/classes/class.bMessages.php b/classes/class.bMessages.php
new file mode 100644
index 0000000..9bfac9f
--- /dev/null
+++ b/classes/class.bMessages.php
@@ -0,0 +1,23 @@
+messages = array();
+ }
+ public function get($key){
+ if(isset($this->messages[$key])){
+ $m = $this->messages[$key];
+ $this->messages[$key] ='';
+ return $m;
+ }
+ return '';
+ }
+ public function set($key, $value){
+ $this->messages[$key] = $value;
+ }
+}
diff --git a/classes/class.bPermission.php b/classes/class.bPermission.php
new file mode 100644
index 0000000..d1c8642
--- /dev/null
+++ b/classes/class.bPermission.php
@@ -0,0 +1,60 @@
+init($level_id);
+ }
+
+ public static function get_instance($level_id) {
+ if ($level_id ==1 || $level_id == md5(1)){
+ wp_die('Invalid Membership level!');
+ }
+ $key = is_numeric($level_id)? md5($level_id): $level_id;
+ if (!isset(self::$_this[$key])){
+ self::$_this[$key] = new BPermission($level_id);
+ }
+
+ return self::$_this[$key];
+ }
+
+ public function is_permitted($id) {
+ return $this->post_in_parent_categories($id) || $this->post_in_categories($id) || $this->in_posts($id) || $this->in_pages($id) || $this->in_attachments($id) || $this->in_custom_posts($id);
+ }
+
+ public function is_permitted_attachment($id) {
+ return (($this->bitmap & 16) === 16) && $this->in_attachments($id);
+ }
+
+ public function is_permitted_custom_post($id) {
+ return (($this->bitmap & 32) === 32) && $this->in_custom_posts($id);
+ }
+
+ public function is_permitted_category($id) {
+ return (($this->bitmap & 1) === 1) && $this->in_categories($id);
+ }
+
+ public function is_post_in_permitted_category($post_id) {
+ return (($this->bitmap & 1) === 1) && $this->post_in_categories($post_id);
+ }
+
+ public function is_permitted_post($id) {
+ return (($this->bitmap & 4) === 4) && $this->in_posts($id);
+ }
+
+ public function is_permitted_page($id) {
+ return (($this->bitmap & 8) === 8) && $this->in_pages($id);
+ }
+
+ public function is_permitted_comment($id) {
+ return (($this->bitmap & 2) === 2) && $this->in_comments($id);
+ }
+
+ public function is_post_in_permitted_parent_category($post_id) {
+ return (($this->bitmap & 1) === 1) && $this->post_in_parent_categories($post_id);
+ }
+
+ public function is_permitted_parent_category($id) {
+ return (($this->bitmap & 1) === 1) && $this->in_parent_categories($id);
+ }
+}
diff --git a/classes/class.bPermissionCollection.php b/classes/class.bPermissionCollection.php
new file mode 100644
index 0000000..d0c1366
--- /dev/null
+++ b/classes/class.bPermissionCollection.php
@@ -0,0 +1,49 @@
+permissions = array();
+ }
+
+ public static function get_instance(){
+ self::$_this = empty(self::$_this)? new BPermissionCollection():self::$_this;
+ return self::$_this;
+ }
+
+ public function load($level_ids = array()){
+ if (empty($level_ids)){
+ global $wpdb;
+ $level_ids = $wpdb->get_col("SELECT id FROM {$wpdb->prefix}swpm_membership_tbl WHERE id != 1");
+ }
+
+ foreach($level_ids as $id){
+ $this->permissions[] = BPermission::get_instance($id);
+ }
+ }
+
+ public function get_permitted_levels($post_id){
+ $levels = array();
+
+ foreach($this->permissions as $permission){
+ if ($permission->is_permitted($post_id)){
+ $levels[$permission->get($id)] = $permission->get('alias');
+ }
+ }
+
+ return $levels;
+ }
+}
diff --git a/classes/class.bProtection.php b/classes/class.bProtection.php
new file mode 100644
index 0000000..be1f8b2
--- /dev/null
+++ b/classes/class.bProtection.php
@@ -0,0 +1,66 @@
+msg = "";
+ $this->init(1);
+ }
+
+ public static function get_instance() {
+ self::$_this = empty(self::$_this) ? (new BProtection()) : self::$_this;
+ return self::$_this;
+ }
+
+ public function is_protected($id) {
+ if ($this->post_in_parent_categories($id) || $this->post_in_categories($id)) {
+ $this->msg = '
+ The category or parent category of this post is protected. You can change the category protection settings from the manage content protection menu.
+
';
+ return true;
+ }
+ return $this->in_posts($id) || $this->in_pages($id) || $this->in_attachments($id) || $this->in_custom_posts($id);
+ }
+
+ public function get_last_message() {
+ return $this->msg;
+ }
+
+ public function is_protected_post($id) {
+ return /* (($this->bitmap&4) != 4) && */ $this->in_posts($id);
+ }
+
+ public function is_protected_page($id) {
+ return /* (($this->bitmap&4) != 4) && */ $this->in_pages($id);
+ }
+
+ public function is_protected_attachment($id) {
+ return /* (($this->bitmap&16)!=16) && */ $this->in_attachments($id);
+ }
+
+ public function is_protected_custom_post($id) {
+ return /* (($this->bitmap&32)!=32) && */ $this->in_custom_posts($id);
+ }
+
+ public function is_protected_comment($id) {
+ return /* (($this->bitmap&2)!=2) && */ $this->in_comments($id);
+ }
+
+ public function is_post_in_protected_category($post_id) {
+ return /* (($this->bitmap&1)!=1) && */ $this->post_in_categories($post_id);
+ }
+
+ public function is_post_in_protected_parent_category($post_id) {
+ return /* (($this->bitmap&1)!=1) && */ $this->post_in_parent_categories($post_id);
+ }
+
+ public function is_protected_category($id) {
+ return /* (($this->bitmap&1)!=1) && */ $this->in_categories($id);
+ }
+
+ public function is_protected_parent_category($id) {
+ return /* (($this->bitmap&1)!=1) && */ $this->in_parent_categories($id);
+ }
+}
diff --git a/classes/class.bProtectionBase.php b/classes/class.bProtectionBase.php
new file mode 100644
index 0000000..065de48
--- /dev/null
+++ b/classes/class.bProtectionBase.php
@@ -0,0 +1,296 @@
+owning_level_id = $level_id;
+ $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}swpm_membership_tbl WHERE "
+ . (is_numeric($level_id) ? 'id = %d' : 'md5(id) = %s' ), $level_id);
+ $result = $wpdb->get_row($query);
+
+ $this->bitmap = isset($result->permissions) ? $result->permissions : 0;
+ $this->posts = isset($result->post_list) ? (array) unserialize($result->post_list) : array();
+ $this->pages = isset($result->page_list) ? (array) unserialize($result->page_list) : array();
+ $this->comments = isset($result->comment_list) ? (array) unserialize($result->comment_list) : array();
+ $this->categories = isset($result->category_list) ? (array) unserialize($result->category_list) : array();
+ $this->attachments = isset($result->attachment_list) ? (array) unserialize($result->attachment_list) : array();
+ $this->custom_posts = isset($result->custom_post_list) ? (array) unserialize($result->custom_post_list) : array();
+ $this->options = isset($result->options) ? (array) unserialize($result->options) : array();
+ $this->disable_bookmark = isset($result->disable_bookmark_list) ? (array) unserialize($result->disable_bookmark_list) : array();
+ $this->details = (array) $result;
+ }
+
+ public function apply($ids, $type) {
+ $post_types = get_post_types(array('public' => true, '_builtin' => false));
+ if (in_array($type, $post_types)) {
+ $type = 'custom_post';
+ }
+ return $this->update_perms($ids, true, $type);
+ }
+
+ public function remove($ids, $type) {
+ $post_types = get_post_types(array('public' => true, '_builtin' => false));
+ if (in_array($type, $post_types)) {
+ $type = 'custom_post';
+ }
+ return $this->update_perms($ids, false, $type);
+ }
+
+ public function get_options() {
+ return $this->options;
+ }
+
+ public function get_posts() {
+ return $this->posts;
+ }
+
+ public function get_pages() {
+ return $this->pages;
+ }
+
+ public function get_comments() {
+ return $this->comments;
+ }
+
+ public function get_categories() {
+ return $this->categories;
+ }
+
+ public function get_attachments() {
+ return $this->attachments;
+ }
+
+ public function get_custom_posts() {
+ return $this->custom_posts;
+ }
+
+ public function is_bookmark_disabled($id) {
+ $posts = isset($this->disable_bookmark['posts']) ?
+ (array) $this->disable_bookmark['posts'] : array();
+ $pages = isset($this->disable_bookmark['pages']) ?
+ (array) $this->disable_bookmark['pages'] : array();
+ return in_array($id, $pages) || in_array($id, $posts);
+ }
+
+ public function in_posts($id) {
+ return (/* ($this->bitmap&4)===4) && */in_array($id, (array) $this->posts));
+ }
+
+ public function in_pages($id) {
+ return (/* ($this->bitmap&8)===8) && */ in_array($id, (array) $this->pages));
+ }
+
+ public function in_attachments($id) {
+ return (/* ($this->bitmap&16)===16) && */in_array($id, (array) $this->attachments));
+ }
+
+ public function in_custom_posts($id) {
+ return (/* ($this->bitmap&32)===32) && */ in_array($id, (array) $this->custom_posts));
+ }
+
+ public function in_comments($id) {
+ return (/* ($this->bitmap&2)===2) && */ in_array($id, (array) $this->comments));
+ }
+
+ public function in_categories($id) {
+ if (empty($this->categories))
+ return false;
+ return (/* ($this->bitmap&1)===1) && */ in_array($id, (array) $this->categories));
+ }
+
+ public function post_in_categories($post_id) {
+ if (empty($this->categories))
+ return false;
+ return (/* ($this->bitmap&1)===1) && */ in_category((array) $this->categories, $post_id));
+ }
+
+ public function in_parent_categories($id) {
+ if (empty($this->categories))
+ return false;
+ $parents = explode(',', get_category_parents($id, false, ','));
+ $parents = array_unique($parents);
+ foreach ($parents as $parent) {
+ if (empty($parent))
+ continue;
+ if (/* (($this->bitmap&1)===1) && */(in_array($parent, (array) $this->categories)))
+ return true;
+ }
+ return false;
+ }
+
+ public function post_in_parent_categories($post_id) {
+ if (empty($this->categories))
+ return false;
+ $cats = get_the_category($post_id);
+ $parents = array();
+ foreach ($cats as $key => $cat) {
+ $parents = array_merge($parents, explode(',', get_category_parents($cat->cat_ID, false, ',')));
+ }
+ $parents = array_unique($parents);
+ foreach ($parents as $parent) {
+ if (empty($parent))
+ continue;
+ if (/* (($this->bitmap&1)===1) && */(in_array(get_cat_ID($parent), (array) $this->categories)))
+ return true;
+ }
+ return false;
+ }
+
+ public function add_posts($ids) {
+ return $this->update_perms($ids, true, 'post');
+ }
+
+ public function add_pages($ids) {
+ return $this->update_perms($ids, true, 'page');
+ }
+
+ public function add_attachments($ids) {
+ return $this->update_perms($ids, true, 'attachment');
+ }
+
+ public function add_comments($ids) {
+ return $this->update_perms($ids, true, 'comment');
+ }
+
+ public function add_categories($ids) {
+ return $this->update_perms($ids, true, 'category');
+ }
+
+ public function add_custom_posts($ids) {
+ return $this->update_perms($ids, true, 'custom_post');
+ }
+
+ public function remove_posts($ids) {
+ return $this->update_perms($ids, false, 'post');
+ }
+
+ public function remove_pages($ids) {
+ return $this->update_perms($ids, false, 'page');
+ }
+
+ public function remove_attachments($ids) {
+ return $this->update_perms($ids, false, 'attachment');
+ }
+
+ public function remove_comments($ids) {
+ return $this->update_perms($ids, false, 'comment');
+ }
+
+ public function remove_categories($ids) {
+ return $this->update_perms($ids, false, 'category');
+ }
+
+ public function remove_custom_posts($ids) {
+ return $this->update_perms($ids, false, 'custom_post');
+ }
+
+ private function update_perms($ids, $set, $type) {
+ $list = null;
+ $index = '';
+ if (empty($ids)) {
+ return $this;
+ }
+ $ids = (array) $ids;
+ switch ($type) {
+ case 'page':
+ $list = $this->pages;
+ $index = 'page_list';
+ break;
+ case 'post':
+ $list = $this->posts;
+ $index = 'post_list';
+ break;
+ case 'attachment':
+ $list = $this->attachments;
+ $index = 'attachment_list';
+ break;
+ case 'comment':
+ $list = $this->comments;
+ $index = 'comment_list';
+ break;
+ case 'category':
+ $list = $this->categories;
+ $index = 'category_list';
+ break;
+ case 'custom_post':
+ $list = $this->custom_posts;
+ $index = 'custom_post_list';
+ break;
+ default:
+ break;
+ }
+
+ if (!empty($index)) {
+ if ($set) {
+ $list = array_merge($list, $ids);
+ $list = array_unique($list);
+ } else {
+ $list = array_diff($list, $ids);
+ }
+ switch ($type) {
+ case 'page':
+ $this->pages = $list;
+ break;
+ case 'post':
+ $this->posts = $list;
+ break;
+ case 'attachment':
+ $this->attachments = $list;
+ break;
+ case 'comment':
+ $this->comments = $list;
+ break;
+ case 'category':
+ $this->categories = $list;
+ break;
+ case 'custom_post':
+ $this->custom_posts = $list;
+ break;
+ default:
+ break;
+ }
+ $this->details[$index] = $list;
+ }
+ return $this;
+ }
+
+ public function save() {
+ global $wpdb;
+ $data = array();
+
+ $list_type = array('page_list', 'post_list', 'attachment_list',
+ 'custom_post_list', 'comment_list', 'category_list');
+ foreach ($this->details as $key => $value) {
+ if ($key == 'id')
+ continue;
+ if (is_serialized($value) || !in_array($key, $list_type))
+ $data[$key] = $value;
+ else
+ $data[$key] = serialize($value);
+ }
+ $wpdb->update($wpdb->prefix . "swpm_membership_tbl", $data, array('id' => $this->owning_level_id));
+ }
+
+ public function get($key, $default = '') {
+ if (isset($this->details[$key])) {
+ return $this->details[$key];
+ }
+ return $default;
+ }
+
+}
diff --git a/classes/class.bRegistration.php b/classes/class.bRegistration.php
new file mode 100644
index 0000000..ecb3aaa
--- /dev/null
+++ b/classes/class.bRegistration.php
@@ -0,0 +1,42 @@
+member_info)) {return false;}
+ $member_info = $this->member_info;
+ $settings = BSettings::get_instance();
+ $subject = $settings->get_value('reg-complete-mail-subject');
+ $body = $settings->get_value('reg-complete-mail-body');
+ $from_address = $settings->get_value('email-from');
+ $login_link = $settings->get_value('login-page-url');
+ $headers = 'From: ' . $from_address . "\r\n";
+ $member_info['membership_level_name'] = BPermission::get_instance($member_info['membership_level'])->get('alias');
+ $member_info['password'] = $member_info['plain_password'];
+ $member_info['login_link'] = $login_link;
+ $values = array_values($member_info);
+ $keys = array_map('swpm_enclose_var', array_keys($member_info));
+ $body = str_replace($keys, $values, $body);
+ $email = sanitize_email(filter_input(INPUT_POST, 'email', FILTER_UNSAFE_RAW));
+ wp_mail(trim($email), $subject, $body, $headers);
+ if ($settings->get_value('enable-admin-notification-after-reg')) {
+ $subject = "Notification of New Member Registration";
+ $body = "A new member has registered. The following email was sent to the member." .
+ "\n\n-------Member Email----------\n" . $body .
+ "\n\n------End------\n";
+ wp_mail($from_address, $subject, $body, $headers);
+ }
+ return true;
+ }
+}
+function swpm_enclose_var($n){
+ return '{'.$n .'}';
+}
diff --git a/classes/class.bSession.php b/classes/class.bSession.php
new file mode 100644
index 0000000..e69de29
diff --git a/classes/class.bSettings.php b/classes/class.bSettings.php
new file mode 100644
index 0000000..be49a41
--- /dev/null
+++ b/classes/class.bSettings.php
@@ -0,0 +1,395 @@
+settings = (array) get_option('swpm-settings');
+ }
+ public function init_config_hooks(){
+ $page = filter_input(INPUT_GET, 'page');
+// if($page == 'simple_wp_membership_settings'){
+ if(is_admin()){ // for frontend just load settings but dont try to render settings page.
+ $tab = filter_input(INPUT_GET, 'tab');
+ $tab = empty($tab)?filter_input(INPUT_POST, 'tab'):$tab;
+ $this->current_tab = empty($tab) ? 1 : $tab;
+ $this->tabs = array(1=> 'General Settings', 2=> 'Payment Settings',
+ 3=> 'Email Settings', 4=> 'Tools', 5=>'Advanced Settings', 6=> 'Addons Settings');
+ add_action('swpm-draw-tab', array(&$this, 'draw_tabs'));
+ $method = 'tab_' . $this->current_tab;
+ if (method_exists($this, $method)){
+ $this->$method();
+ }
+ }
+ }
+ private function tab_1() {
+
+ register_setting('swpm-settings-tab-1', 'swpm-settings', array(&$this, 'sanitize_tab_1'));
+
+ //This settings section has no heading
+ add_settings_section('swpm-general-post-submission-check', '',
+ array(&$this, 'swpm_general_post_submit_check_callback'), 'simple_wp_membership_settings');
+
+ add_settings_section('swpm-documentation', BUtils::_('Plugin Documentation'),
+ array(&$this, 'swpm_documentation_callback'), 'simple_wp_membership_settings');
+ add_settings_section('general-settings', BUtils::_('General Settings'),
+ array(&$this, 'general_settings_callback'), 'simple_wp_membership_settings');
+ add_settings_field('enable-free-membership', BUtils::_('Enable Free Membership'),
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'general-settings',
+ array('item' => 'enable-free-membership',
+ 'message'=> BUtils::_('Enable/disable registration for free membership level. When you enable this option, make sure to specify a free membership level ID in the field below.')));
+ add_settings_field('free-membership-id', BUtils::_('Free Membership Level ID'),
+ array(&$this, 'textfield_small_callback'), 'simple_wp_membership_settings', 'general-settings',
+ array('item' => 'free-membership-id',
+ 'message'=> BUtils::_('Assign free membership level ID')));
+ add_settings_field('enable-moretag', BUtils::_('Enable More Tag Protection'),
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'general-settings',
+ array('item' => 'enable-moretag',
+ 'message'=> BUtils::_('Enables or disables "more" tag protection in the posts and pages. Anything after the More tag is protected. Anything before the more tag is teaser content.')));
+ add_settings_field('hide-adminbar', BUtils::_('Hide Adminbar'),
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'general-settings',
+ array('item' => 'hide-adminbar',
+ 'message'=>BUtils::_('WordPress shows an admin toolbar to the logged in users of the site. Check this box if you want to hide that admin toolbar in the fronend of your site.')));
+
+ add_settings_field('default-account-status', BUtils::_('Default Account Status'),
+ array(&$this, 'selectbox_callback'), 'simple_wp_membership_settings', 'general-settings',
+ array('item' => 'default-account-status',
+ 'options'=> BUtils::get_account_state_options(),
+ 'default'=>'active',
+ 'message'=>BUtils::_('Select the default account status for newly registered users. If you want to manually approve the members then you can set the status to "Pending".')));
+ add_settings_field('allow-account-deletion', BUtils::_('Allow Account Deletion'),
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'general-settings',
+ array('item' => 'allow-account-deletion',
+ 'options'=> BUtils::get_account_state_options(),
+ 'message'=>BUtils::_('Allow users to delete their accounts.')));
+ add_settings_field('delete-pending-account', BUtils::_('Auto Delete Pending Account'),
+ array(&$this, 'selectbox_callback'), 'simple_wp_membership_settings', 'general-settings',
+ array('item' => 'delete-pending-account',
+ 'options'=> array(0 => 'Do not delete', 1=>'Older than 1 month', 2=> 'Older than 2 months'),
+ 'default'=>'0',
+ 'message'=>BUtils::_('Select how long you want to keep "pending" account.')));
+ /*add_settings_field('protect-everything', BUtils::_('Protect Everything'),
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'general-settings',
+ array('item' => 'protect-everything',
+ 'message'=>BUtils::_('Check this box if you want to protect all posts/pages by default.')));*/
+
+ add_settings_section('pages-settings', BUtils::_('Pages Settings'),
+ array(&$this, 'pages_settings_callback'), 'simple_wp_membership_settings');
+ add_settings_field('login-page-url', BUtils::_('Login Page URL'),
+ array(&$this, 'textfield_long_callback'), 'simple_wp_membership_settings', 'pages-settings',
+ array('item' => 'login-page-url',
+ 'message'=>''));
+ add_settings_field('registration-page-url', BUtils::_('Registration Page URL'),
+ array(&$this, 'textfield_long_callback'), 'simple_wp_membership_settings', 'pages-settings',
+ array('item' => 'registration-page-url',
+ 'message'=>''));
+ add_settings_field('join-us-page-url', BUtils::_('Join Us Page URL'),
+ array(&$this, 'textfield_long_callback'), 'simple_wp_membership_settings', 'pages-settings',
+ array('item' => 'join-us-page-url',
+ 'message'=>''));
+ add_settings_field('profile-page-url', BUtils::_('Edit Profile Page URL'),
+ array(&$this, 'textfield_long_callback'), 'simple_wp_membership_settings', 'pages-settings',
+ array('item' => 'profile-page-url',
+ 'message'=>''));
+ add_settings_field('reset-page-url', BUtils::_('Password Reset Page URL'),
+ array(&$this, 'textfield_long_callback'), 'simple_wp_membership_settings', 'pages-settings',
+ array('item' => 'reset-page-url',
+ 'message'=>''));
+
+ add_settings_section('debug-settings', BUtils::_('Test & Debug Settings'),
+ array(&$this, 'testndebug_settings_callback'), 'simple_wp_membership_settings');
+
+ $debug_field_help_text = BUtils::_('Check this option to enable debug logging.');
+ $debug_field_help_text .= ' - View debug log file by clicking here .';
+ $debug_field_help_text .= ' - Reset debug log file by clicking here .';
+ add_settings_field('enable-debug', 'Enable Debug',
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'debug-settings',
+ array('item' => 'enable-debug',
+ 'message'=> $debug_field_help_text));
+ add_settings_field('enable-sandbox-testing', BUtils::_('Enable Sandbox Testing'),
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'debug-settings',
+ array('item' => 'enable-sandbox-testing',
+ 'message'=>BUtils::_('Enable this option if you want to do sandbox payment testing.')));
+
+ }
+
+ private function tab_2() {
+ }
+
+ private function tab_3() {
+ register_setting('swpm-settings-tab-3', 'swpm-settings', array(&$this, 'sanitize_tab_3'));
+
+ add_settings_section('email-misc-settings', BUtils::_('Email Misc. Settings'),
+ array(&$this, 'email_misc_settings_callback'), 'simple_wp_membership_settings');
+ add_settings_field('email-misc-from', BUtils::_('From Email Address'),
+ array(&$this, 'textfield_callback'), 'simple_wp_membership_settings', 'email-misc-settings',
+ array('item' => 'email-from',
+ 'message'=>''));
+
+ add_settings_section('reg-prompt-email-settings', BUtils::_('Email Settings (Prompt to Complete Registration )'),
+ array(&$this, 'reg_prompt_email_settings_callback'), 'simple_wp_membership_settings');
+ add_settings_field('reg-prompt-complete-mail-subject', BUtils::_('Email Subject'),
+ array(&$this, 'textfield_callback'), 'simple_wp_membership_settings', 'reg-prompt-email-settings',
+ array('item' => 'reg-prompt-complete-mail-subject',
+ 'message'=>''));
+ add_settings_field('reg-prompt-complete-mail-body', BUtils::_('Email Body'),
+ array(&$this, 'textarea_callback'), 'simple_wp_membership_settings', 'reg-prompt-email-settings',
+ array('item' => 'reg-prompt-complete-mail-body',
+ 'message'=>''));
+
+ add_settings_section('reg-email-settings', BUtils::_('Email Settings (Registration Complete)'),
+ array(&$this, 'reg_email_settings_callback'), 'simple_wp_membership_settings');
+ add_settings_field('reg-complete-mail-subject', BUtils::_('Email Subject'),
+ array(&$this, 'textfield_callback'), 'simple_wp_membership_settings', 'reg-email-settings',
+ array('item' => 'reg-complete-mail-subject',
+ 'message'=>''));
+ add_settings_field('reg-complete-mail-body', BUtils::_('Email Body'),
+ array(&$this, 'textarea_callback'), 'simple_wp_membership_settings', 'reg-email-settings',
+ array('item' => 'reg-complete-mail-body',
+ 'message'=>''));
+ add_settings_field('enable-admin-notification-after-reg', BUtils::_('Send Notification To Admin'),
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'reg-email-settings',
+ array('item' => 'enable-admin-notification-after-reg',
+ 'message'=>''));
+ add_settings_field('enable-notification-after-manual-user-add', BUtils::_('Send Email to Member When Added via Admin Dashboard'),
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'reg-email-settings',
+ array('item' => 'enable-notification-after-manual-user-add',
+ 'message'=>''));
+
+ add_settings_section('upgrade-email-settings', BUtils::_(' Email Settings (Account Upgrade Notification)'),
+ array(&$this, 'upgrade_email_settings_callback'), 'simple_wp_membership_settings');
+ add_settings_field('upgrade-complete-mail-subject', BUtils::_('Email Subject'),
+ array(&$this, 'textfield_callback'), 'simple_wp_membership_settings', 'upgrade-email-settings',
+ array('item' => 'upgrade-complete-mail-subject',
+ 'message'=>''));
+ add_settings_field('upgrade-complete-mail-body', BUtils::_('Email Body'),
+ array(&$this, 'textarea_callback'), 'simple_wp_membership_settings', 'upgrade-email-settings',
+ array('item' => 'upgrade-complete-mail-body',
+ 'message'=>''));
+ }
+
+ private function tab_4(){
+ }
+
+ private function tab_5(){
+ register_setting('swpm-settings-tab-5', 'swpm-settings', array(&$this, 'sanitize_tab_5'));
+
+ add_settings_section('advanced-settings', BUtils::_('Advanced Settings'),
+ array(&$this, 'advanced_settings_callback'), 'simple_wp_membership_settings');
+
+ add_settings_field('enable-expired-account-login', BUtils::_('Enable Expired Account Login'),
+ array(&$this, 'checkbox_callback'), 'simple_wp_membership_settings', 'advanced-settings',
+ array('item' => 'enable-expired-account-login',
+ 'message'=>BUtils::_("When enabled, expired members will be able to log into the system but won't be able to view any protected content. This allows them to easily renew their account by making another payment.")));
+ }
+
+ private function tab_6(){
+ }
+
+ public static function get_instance() {
+ self::$_this = empty(self::$_this) ? new BSettings() : self::$_this;
+ return self::$_this;
+ }
+ public function selectbox_callback($args){
+ $item = $args['item'];
+ $options = $args['options'];
+ $default = $args['default'];
+ $msg = isset($args['message'])?$args['message']: '';
+ $selected = esc_attr($this->get_value($item), $default);
+ echo "";
+ foreach($options as $key => $value){
+ $is_selected = ($key == $selected)? 'selected="selected"': '';
+ echo '' . esc_attr($value) . ' ';
+ }
+ echo ' ';
+ echo ''.$msg.' ';
+ }
+ public function checkbox_callback($args) {
+ $item = $args['item'];
+ $msg = isset($args['message'])?$args['message']: '';
+ $is = esc_attr($this->get_value($item));
+ echo " ";
+ echo ''.$msg.' ';
+ }
+
+ public function textarea_callback($args) {
+ $item = $args['item'];
+ $msg = isset($args['message'])?$args['message']: '';
+ $text = esc_attr($this->get_value($item));
+ echo "";
+ echo ''.$msg.' ';
+ }
+
+ public function textfield_small_callback($args) {
+ $item = $args['item'];
+ $msg = isset($args['message'])?$args['message']: '';
+ $text = esc_attr($this->get_value($item));
+ echo " ";
+ echo ''.$msg.' ';
+ }
+
+ public function textfield_callback($args) {
+ $item = $args['item'];
+ $msg = isset($args['message'])?$args['message']: '';
+ $text = esc_attr($this->get_value($item));
+ echo " ";
+ echo ''.$msg.' ';
+ }
+
+ public function textfield_long_callback($args) {
+ $item = $args['item'];
+ $msg = isset($args['message'])?$args['message']: '';
+ $text = esc_attr($this->get_value($item));
+ echo " ";
+ echo ''.$msg.' ';
+ }
+
+ public function swpm_documentation_callback() {
+ ?>
+
+ Debug log files have been reset!
';
+ }
+ else{
+ echo 'Debug log files could not be reset!
';
+ }
+ }
+
+ //Show settings updated message
+ if(isset($_REQUEST['settings-updated'])){
+ echo '' . BUtils::_('Settings updated!') . '
';
+ }
+ }
+
+ public function general_settings_callback() {
+ BUtils::e('General Plugin Settings.');
+ }
+
+ public function pages_settings_callback() {
+ BUtils::e('Page Setup and URL Related settings.');
+ }
+ public function testndebug_settings_callback(){
+ BUtils::e('Testing and Debug Related Settings.');
+ }
+ public function reg_email_settings_callback() {
+ BUtils::e('This email will be sent to your users when they complete the registration and become a member.');
+ }
+ public function email_misc_settings_callback(){
+ BUtils::e('Settings in this section apply to all emails.');
+ }
+ public function upgrade_email_settings_callback() {
+ BUtils::e('This email will be sent to your users after account upgrade.');
+ }
+ public function reg_prompt_email_settings_callback() {
+ BUtils::e('This email will be sent to prompt user to complete registration.');
+ }
+ public function advanced_settings_callback(){
+ BUtils::e('This page allows you to configure some advanced features of the plugin.');
+ }
+
+ public function sanitize_tab_1($input) {
+ if (empty($this->settings)){
+ $this->settings = (array) get_option('swpm-settings');
+ }
+ $output = $this->settings;
+ //general settings block
+
+ $output['hide-adminbar'] = isset($input['hide-adminbar'])? esc_attr($input['hide-adminbar']) : "";
+ $output['protect-everything'] = isset($input['protect-everything'])? esc_attr($input['protect-everything']) : "";
+ $output['enable-free-membership'] = isset($input['enable-free-membership'])? esc_attr($input['enable-free-membership']) : "";
+ $output['enable-moretag'] = isset($input['enable-moretag'])? esc_attr($input['enable-moretag']) : "";
+ $output['enable-debug'] = isset($input['enable-debug'])? esc_attr($input['enable-debug']) : "";
+ $output['enable-sandbox-testing'] = isset($input['enable-sandbox-testing'])? esc_attr($input['enable-sandbox-testing']) : "";
+ $output['allow-account-deletion'] = isset($input['allow-account-deletion'])? esc_attr($input['allow-account-deletion']) : "";
+
+ $output['free-membership-id'] = ($input['free-membership-id'] != 1) ? absint($input['free-membership-id']) : '';
+ $output['login-page-url'] = esc_url($input['login-page-url']);
+ $output['registration-page-url'] = esc_url($input['registration-page-url']);
+ $output['profile-page-url'] = esc_url($input['profile-page-url']);
+ $output['reset-page-url'] = esc_url($input['reset-page-url']);
+ $output['join-us-page-url'] = esc_url($input['join-us-page-url']);
+ $output['default-account-status'] = esc_attr($input['default-account-status']);
+ return $output;
+ }
+
+ public function sanitize_tab_3($input) {
+ if (empty($this->settings)){
+ $this->settings = (array) get_option('swpm-settings');
+ }
+ $output = $this->settings;
+ $output['reg-complete-mail-subject'] = sanitize_text_field($input['reg-complete-mail-subject']);
+ $output['reg-complete-mail-body'] = wp_kses_data(force_balance_tags($input['reg-complete-mail-body']));
+
+ $output['upgrade-complete-mail-subject'] = sanitize_text_field($input['upgrade-complete-mail-subject']);
+ $output['upgrade-complete-mail-body'] = wp_kses_data(force_balance_tags($input['upgrade-complete-mail-body']));
+
+ $output['reg-prompt-complete-mail-subject'] = sanitize_text_field($input['reg-prompt-complete-mail-subject']);
+ $output['reg-prompt-complete-mail-body'] = wp_kses_data(force_balance_tags($input['reg-prompt-complete-mail-body']));
+ $output['email-from'] = trim($input['email-from']);
+ $output['enable-admin-notification-after-reg'] = isset($input['enable-admin-notification-after-reg'])? esc_attr($input['enable-admin-notification-after-reg']) : "";
+ $output['enable-notification-after-manual-user-add'] = isset($input['enable-notification-after-manual-user-add'])? esc_attr($input['enable-notification-after-manual-user-add']) : "";
+
+ return $output;
+ }
+
+ public function sanitize_tab_5($input){
+ if (empty($this->settings)){
+ $this->settings = (array) get_option('swpm-settings');
+ }
+ $output = $this->settings;
+ $output['enable-expired-account-login'] = isset($input['enable-expired-account-login'])? esc_attr($input['enable-expired-account-login']) : "";
+
+ return $output;
+ }
+ public function get_value($key, $default = "") {
+ if (isset($this->settings[$key])){
+ return $this->settings[$key];
+ }
+ return $default;
+ }
+
+ public function set_value($key, $value) {
+ $this->settings[$key] = $value;
+ return $this;
+ }
+
+ public function save() {
+ update_option('swpm-settings', $this->settings);
+ }
+
+ public function draw_tabs() {
+ $current = $this->current_tab;
+ ?>
+
+ tabs as $id=>$label):?>
+
+
+
+ get_value('login-page-url');
+ $joinus = $this->get_value('join-us-page-url');
+ if (empty ($login) || empty($joinus)){
+ return 'Simple Membership is not configured correctly.'
+ . 'Please contact Admin ';
+ }
+ return BUtils::_('Please'). ' ' . BUtils::_('Login') . ' . '. BUtils::_('Not a Member?').' '.BUtils::_('Join Us').' ';
+ }
+
+}
diff --git a/classes/class.bTransactions.php b/classes/class.bTransactions.php
new file mode 100644
index 0000000..1336de9
--- /dev/null
+++ b/classes/class.bTransactions.php
@@ -0,0 +1,55 @@
+insert($wpdb->prefix . "swpm_payments_tbl", $txn_data);
+
+ }
+
+ static function parse_custom_var($custom) {
+ $delimiter = "&";
+ $customvariables = array();
+
+ $namevaluecombos = explode($delimiter, $custom);
+ foreach ($namevaluecombos as $keyval_unparsed) {
+ $equalsignposition = strpos($keyval_unparsed, '=');
+ if ($equalsignposition === false) {
+ $customvariables[$keyval_unparsed] = '';
+ continue;
+ }
+ $key = substr($keyval_unparsed, 0, $equalsignposition);
+ $value = substr($keyval_unparsed, $equalsignposition + 1);
+ $customvariables[$key] = $value;
+ }
+
+ return $customvariables;
+ }
+
+}
\ No newline at end of file
diff --git a/classes/class.bTransfer.php b/classes/class.bTransfer.php
new file mode 100644
index 0000000..e77722b
--- /dev/null
+++ b/classes/class.bTransfer.php
@@ -0,0 +1,65 @@
+ '', 'last_name' => '',
+ 'user_name' => '', 'email' => '',
+ 'password' => '',
+ 'phone' => '', 'account_state' => '',
+ 'member_since' => '', 'subscription_starts' => '',
+ 'address_street' => '', 'address_city' => '',
+ 'address_state' => '', 'address_zipcode' => '',
+ 'company_name' => '', 'country' => '',
+ 'gender' => 'not specified',
+ 'membership_level' => '2');
+ public static $default_level_fields = array(
+ 'alias' => '', 'role' => '',
+ 'subscription_period' => '', 'subscription_duration_type' => BMembershipLevel::NO_EXPIRY);
+ public static $admin_messages = array();
+ private static $_this;
+ private $message;
+
+ private function __contruct() {
+ $this->message = get_option('swpm-messages');
+ }
+
+ public static function get_instance() {
+ self::$_this = empty(self::$_this) ? new BTransfer() : self::$_this;
+ self::$_this->message = get_option('swpm-messages');
+ return self::$_this;
+ }
+
+ public function get($key) {
+ $sesion_key = $_COOKIE['swpm_session'];
+ $m = '';
+ if (isset($this->message[$sesion_key])){
+ $m = $this->message[$sesion_key]->get($key);
+ }
+ update_option('swpm-messages', $this->message);
+ return $m;
+ }
+
+ public function set($key, $value) {
+ $sesion_key = $_COOKIE['swpm_session'];
+ if (!isset($this->message[$sesion_key])){
+ $this->message[$sesion_key] = new BMessages();
+ }
+ $this->message[$sesion_key]->set($key,$value);
+ update_option('swpm-messages', $this->message);
+ }
+
+ public static function get_real_ip_addr() {
+ if (!empty($_SERVER['HTTP_CLIENT_IP'])){
+ $ip = $_SERVER['HTTP_CLIENT_IP'];
+ }
+ else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
+ $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
+ }
+ else{
+ $ip = $_SERVER['REMOTE_ADDR'];
+ }
+ return $ip;
+ }
+
+}
diff --git a/classes/class.bUtils.php b/classes/class.bUtils.php
new file mode 100644
index 0000000..bfcd0ec
--- /dev/null
+++ b/classes/class.bUtils.php
@@ -0,0 +1,385 @@
+No Expiry' .
+ 'Day(s) ' .
+ 'Week(s) ' .
+ 'Month(s) ' .
+ 'Year(s) ' .
+ 'Fixed Date ';
+ }
+
+ // $subscript_period must be integer.
+ public static function calculate_subscription_period_days($subcript_period, $subscription_duration_type) {
+ if ($subscription_duration_type == BMembershipLevel::NO_EXPIRY) {
+ return 'noexpire';
+ }
+ if (!is_numeric($subcript_period)) {
+ throw new Exception(" subcript_period parameter must be integer in BUtils::calculate_subscription_period_days method");
+ }
+ switch (strtolower($subscription_duration_type)) {
+ case BMembershipLevel::DAYS:
+ break;
+ case BMembershipLevel::WEEKS:
+ $subcript_period = $subcript_period * 7;
+ break;
+ case BMembershipLevel::MONTHS:
+ $subcript_period = $subcript_period * 30;
+ break;
+ case BMembershipLevel::YEARS:
+ $subcript_period = $subcript_period * 365;
+ break;
+ }
+ return $subcript_period;
+ }
+
+ public static function get_expiration_timestamp($user) {
+ $permission = BPermission::get_instance($user->membership_level);
+ if (BMembershipLevel::FIXED_DATE == $permission->get('subscription_duration_type')) {
+ return strtotime($permission->get('subscription_period'));
+ }
+ $days = self::calculate_subscription_period_days(
+ $permission->get('subscription_period'), $permission->get('subscription_duration_type'));
+ if ($days == 'noexpire') {
+ return PHP_INT_MAX; // which is equivalent to
+ }
+ return strtotime($user->subscription_starts . ' ' . $days . ' days');
+ }
+
+ public static function is_subscription_expired($user) {
+ $expiration_timestamp = BUtils::get_expiration_timestamp($user);
+ return $expiration_timestamp < time();
+ }
+
+ public static function gender_dropdown($selected = 'not specified') {
+ return 'Male ' .
+ 'Female ' .
+ 'Not Specified ';
+ }
+
+ public static function get_account_state_options() {
+ return array('active' => BUtils::_('Active'),
+ 'inactive' => BUtils::_('Inactive'),
+ 'pending' => BUtils::_('Pending'),
+ 'expired' => BUtils::_('Expired'),);
+ }
+
+ public static function account_state_dropdown($selected = 'active') {
+ $options = self::get_account_state_options();
+ $html = '';
+ foreach ($options as $key => $value) {
+ $html .= ' ' . $value . ' ';
+ }
+ return $html;
+ }
+
+ public static function membership_level_dropdown($selected = 0) {
+ $options = '';
+ global $wpdb;
+ $query = "SELECT alias, id FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id != 1";
+ $levels = $wpdb->get_results($query);
+ foreach ($levels as $level) {
+ $options .= 'id ? 'selected="selected"' : '') . ' value="' . $level->id . '" >' . $level->alias . ' ';
+ }
+ return $options;
+ }
+
+ public static function get_all_membership_level_ids() {
+ global $wpdb;
+ $query = "SELECT id FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id != 1";
+ return $wpdb->get_col($query);
+ }
+
+ public static function get_user_by_id($swpm_id) {
+ global $wpdb;
+ $query = $wpdb->prepare("SELECT user_name FROM {$wpdb->prefix}swpm_members_tbl WHERE member_id = %d", $swpm_id);
+ return $wpdb->get_var($query);
+ }
+
+ public static function get_user_by_user_name($swpm_user_name) {
+ global $wpdb;
+ $query = $wpdb->prepare("SELECT member_id FROM {$wpdb->prefix}swpm_members_tbl WHERE user_name = %s", $swpm_user_name);
+ return $wpdb->get_var($query);
+ }
+
+ public static function get_registration_link($for = 'all', $send_email = false, $member_id = '') {
+ $members = array();
+ global $wpdb;
+ switch ($for) {
+ case 'one':
+ if (empty($member_id)) {
+ return array();
+ }
+ $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}swpm_members_tbl WHERE member_id = %d", $member_id);
+ $members = $wpdb->get_results($query);
+ break;
+ case 'all':
+ $query = "SELECT * FROM {$wpdb->prefix}swpm_members_tbl WHERE reg_code != '' ";
+ $members = $wpdb->get_results($query);
+ break;
+ }
+ $settings = BSettings::get_instance();
+ $separator = '?';
+ $url = $settings->get_value('registration-page-url');
+ if (strpos($url, '?') !== false) {
+ $separator = '&';
+ }
+ $subject = $settings->get_value('reg-complete-mail-subject');
+ if (empty($subject)) {
+ $subject = "Please complete your registration";
+ }
+ $body = $settings->get_value('reg-complete-mail-body');
+ if (empty($body)) {
+ $body = "Please use the following link to complete your registration. \n {reg_link}";
+ }
+ $from_address = $settings->get_value('email-from');
+ $links = array();
+ foreach ($members as $member) {
+ $reg_url = $url . $separator . 'member_id=' . $member->member_id . '&code=' . $member->reg_code;
+ if (!empty($send_email) && empty($member->user_name)) {
+ $tags = array("{first_name}", "{last_name}", "{reg_link}");
+ $vals = array($member->first_name, $member->last_name, $reg_url);
+ $email_body = str_replace($tags, $vals, $body);
+ $headers = 'From: ' . $from_address . "\r\n";
+ wp_mail($member->email, $subject, $email_body, $headers);
+ }
+ $links[] = $reg_url;
+ }
+ return $links;
+ }
+
+ public static function update_wp_user_Role($wp_user_id, $role) {
+ $preserve_role = 'yes';
+ if ($preserve_role) {
+ return;
+ }
+ if (self::is_multisite_install()) {//MS install
+ return; //TODO - don't do this for MS install
+ }
+ $caps = get_user_meta($wp_user_id, 'wp_capabilities', true);
+ if (in_array('administrator', array_keys((array) $caps))) {
+ return;
+ }
+ do_action('set_user_role', $wp_user_id, $role); //Fire the action for other plugin(s)
+ wp_update_user(array('ID' => $wp_user_id, 'role' => $role));
+ $roles = new WP_Roles();
+ $level = $roles->roles[$role]['capabilities'];
+ if (isset($level['level_10']) && $level['level_10']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 10);
+ return;
+ }
+ if (isset($level['level_9']) && $level['level_9']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 9);
+ return;
+ }
+ if (isset($level['level_8']) && $level['level_8']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 8);
+ return;
+ }
+ if (isset($level['level_7']) && $level['level_7']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 7);
+ return;
+ }
+ if (isset($level['level_6']) && $level['level_6']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 6);
+ return;
+ }
+ if (isset($level['level_5']) && $level['level_5']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 5);
+ return;
+ }
+ if (isset($level['level_4']) && $level['level_4']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 4);
+ return;
+ }
+ if (isset($level['level_3']) && $level['level_3']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 3);
+ return;
+ }
+ if (isset($level['level_2']) && $level['level_2']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 2);
+ return;
+ }
+ if (isset($level['level_1']) && $level['level_1']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 1);
+ return;
+ }
+ if (isset($level['level_0']) && $level['level_0']) {
+ update_user_meta($wp_user_id, 'wp_user_level', 0);
+ return;
+ }
+ }
+
+ public static function update_wp_user($wp_user_name, $swpm_data) {
+ $wp_user_info = array();
+ if (isset($swpm_data['email'])) {
+ $wp_user_info['user_email'] = $swpm_data['email'];
+ }
+ if (isset($swpm_data['first_name'])) {
+ $wp_user_info['first_name'] = $swpm_data['first_name'];
+ }
+ if (isset($swpm_data['last_name'])) {
+ $wp_user_info['last_name'] = $swpm_data['last_name'];
+ }
+ if (isset($swpm_data['plain_password'])) {
+ $wp_user_info['user_pass'] = $swpm_data['plain_password'];
+ }
+
+ $wp_user = get_user_by('login', $wp_user_name);
+
+ if ($wp_user) {
+ $wp_user_info['ID'] = $wp_user->ID;
+ return wp_update_user($wp_user_info);
+ }
+ return false;
+ }
+
+ public static function create_wp_user($wp_user_data) {
+ if (self::is_multisite_install()) {//MS install
+ global $blog_id;
+ if ($wp_user_id = email_exists($wp_user_data['user_email'])) {// if user exists then just add him to current blog.
+ add_existing_user_to_blog(array('user_id' => $wp_user_id, 'role' => 'subscriber'));
+ return $wp_user_id;
+ }
+ $wp_user_id = wpmu_create_user($wp_user_data['user_login'], $wp_user_data['password'], $wp_user_data['user_email']);
+ $role = 'subscriber'; //TODO - add user as a subscriber first. The subsequent update user role function to update the role to the correct one
+ add_user_to_blog($blog_id, $wp_user_id, $role);
+ } else {//Single site install
+ $wp_user_id = email_exists($wp_user_data['user_email']);
+ if ($wp_user_id) {
+ return $wp_user_id;
+ }
+ $wp_user_id = wp_create_user($wp_user_data['user_login'], $wp_user_data['password'], $wp_user_data['user_email']);
+ }
+ $wp_user_data['ID'] = $wp_user_id;
+ wp_update_user($wp_user_data);
+ $user_info = get_userdata($wp_user_id);
+ $user_cap = (isset($user_info->wp_capabilities) && is_array($user_info->wp_capabilities)) ? array_keys($user_info->wp_capabilities) : array();
+ if (!in_array('administrator', $user_cap)) {
+ BUtils::update_wp_user_Role($wp_user_id, $wp_user_data['role']);
+ }
+ return $wp_user_id;
+ }
+
+ public static function is_multisite_install() {
+ if (function_exists('is_multisite') && is_multisite()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public static function _($msg) {
+ return __($msg, 'swpm');
+ }
+
+ public static function e($msg) {
+ _e($msg, 'swpm');
+ }
+
+ public static function is_admin() {
+ return current_user_can('manage_options');
+ }
+
+ public static function get_expire_date($start_date, $subscription_duration, $subscription_duration_type) {
+ if ($subscription_duration_type == BMembershipLevel::FIXED_DATE) { //will expire after a fixed date.
+ return date(get_option('date_format'), strtotime($subscription_duration));
+ }
+ $expires = self::calculate_subscription_period_days($subscription_duration, $subscription_duration_type);
+ if ($expires == 'noexpire') {// its set to no expiry until cancelled
+ return BUtils::_('Never');
+ }
+
+ return date(get_option('date_format'), strtotime($start_date . ' ' . $expires . ' days'));
+ }
+
+ public static function swpm_username_exists($user_name) {
+ global $wpdb;
+ $member_table = $wpdb->prefix . 'swpm_members_tbl';
+ $query = $wpdb->prepare('SELECT member_id FROM ' . $member_table . ' WHERE user_name=%s', sanitize_user($user_name));
+ return $wpdb->get_var($query);
+ }
+
+ public static function get_free_level() {
+ $encrypted = filter_input(INPUT_POST, 'level_identifier');
+ global $wpdb;
+ if (!empty($encrypted)) {
+ return BPermission::get_instance($encrypted)->get('id');
+ }
+
+ $is_free = BSettings::get_instance()->get_value('enable-free-membership');
+ $free_level = absint(BSettings::get_instance()->get_value('free-membership-id'));
+
+ return ($is_free) ? $free_level : null;
+ }
+
+ public static function is_paid_registration() {
+ $member_id = filter_input(INPUT_GET, 'member_id', FILTER_SANITIZE_NUMBER_INT);
+ $code = filter_input(INPUT_GET, 'code', FILTER_SANITIZE_STRING);
+ return !empty($member_id) && !empty($code);
+ }
+
+ public static function get_paid_member_info() {
+ $member_id = filter_input(INPUT_GET, 'member_id', FILTER_SANITIZE_NUMBER_INT);
+ $code = filter_input(INPUT_GET, 'code', FILTER_SANITIZE_STRING);
+ global $wpdb;
+ if (!empty($member_id) && !empty($code)) {
+ $query = 'SELECT * FROM ' . $wpdb->prefix . 'swpm_members_tbl WHERE member_id= %d AND reg_code=%s';
+ $query = $wpdb->prepare($query, $member_id, $code);
+ return $wpdb->get_row($query);
+ }
+ return null;
+ }
+
+ public static function account_delete_confirmation_ui($msg = "") {
+ ob_start();
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/account_delete_warning.php');
+ ob_get_flush();
+ wp_die("", "", array('back_link' => true));
+ }
+
+ public static function delete_account_button() {
+ $allow_account_deletion = BSettings::get_instance()->get_value('allow-account-deletion');
+ if (empty($allow_account_deletion)) {
+ return "";
+ }
+
+ return '' . BUtils::_("Delete Account") . '
';
+ }
+
+ public static function encrypt_password($plain_password) {
+ include_once(ABSPATH . WPINC . '/class-phpass.php');
+ $wp_hasher = new PasswordHash(8, TRUE);
+ $password_hash = $wp_hasher->HashPassword(trim($plain_password));
+ return $password_hash;
+ }
+
+ public static function get_restricted_image_url() {
+ return SIMPLE_WP_MEMBERSHIP_URL . '/images/restricted-icon.png';
+ }
+
+ /*
+ * Checks if the string exists in the array key value of the provided array. If it doesn't exist, it returns the first key element from the valid values.
+ */
+
+ public static function sanitize_value_by_array($val_to_check, $valid_values) {
+ $keys = array_keys($valid_values);
+ $keys = array_map('strtolower', $keys);
+ if (in_array($val_to_check, $keys)) {
+ return $val_to_check;
+ }
+ return reset($keys); //Return he first element from the valid values
+ }
+
+}
diff --git a/classes/class.miscUtils.php b/classes/class.miscUtils.php
new file mode 100644
index 0000000..de16ab7
--- /dev/null
+++ b/classes/class.miscUtils.php
@@ -0,0 +1,167 @@
+This page and the content has been automatically generated for you to give you a basic idea of how a "Join Us" page should look like. You can customize this page however you like it by editing this page from your WordPress page editor.
';
+ $swpm_join_page_content .= 'If you end up changing the URL of this page then make sure to update the URL value in the settings menu of the plugin.
';
+ $swpm_join_page_content .= '
+ Free Membership
+
+ You get unlimited access to free membership content
+
+ Price: Free!
+ Link the following image to go to the Registration Page if you want your visitors to be able to create a free membership account
+
+
';
+ $swpm_join_page_content .= 'You can register for a Free Membership or pay for one of the following membership options
';
+ $swpm_join_page_content .= '
+ [ ==> Insert Payment Button For Your Paid Membership Levels Here <== ]
+
';
+
+ $swpm_join_page = array(
+ 'post_title' => 'Join Us',
+ 'post_name' => 'membership-join',
+ 'post_content' => $swpm_join_page_content,
+ 'post_parent' => 0,
+ 'post_status' => 'publish',
+ 'post_type' => 'page',
+ 'comment_status' => 'closed',
+ 'ping_status' => 'closed'
+ );
+
+ $join_page_obj = get_page_by_path('membership-join');
+ if (!$join_page_obj) {
+ $join_page_id = wp_insert_post($swpm_join_page);
+ } else {
+ $join_page_id = $join_page_obj->ID;
+ if ($join_page_obj->post_status == 'trash') { //For cases where page may be in trash, bring it out of trash
+ wp_update_post(array('ID' => $join_page_obj->ID, 'post_status' => 'publish'));
+ }
+ }
+ $swpm_join_page_permalink = get_permalink($join_page_id);
+ $settings->set_value('join-us-page-url', $swpm_join_page_permalink);
+
+ //Create registration page
+ $swpm_rego_page = array(
+ 'post_title' => BUtils::_('Registration'),
+ 'post_name' => 'membership-registration',
+ 'post_content' => '[swpm_registration_form]',
+ 'post_parent' => $join_page_id,
+ 'post_status' => 'publish',
+ 'post_type' => 'page',
+ 'comment_status' => 'closed',
+ 'ping_status' => 'closed'
+ );
+ $rego_page_obj = get_page_by_path('membership-registration');
+ if (!$rego_page_obj) {
+ $rego_page_id = wp_insert_post($swpm_rego_page);
+ } else {
+ $rego_page_id = $rego_page_obj->ID;
+ if ($rego_page_obj->post_status == 'trash') { //For cases where page may be in trash, bring it out of trash
+ wp_update_post(array('ID' => $rego_page_obj->ID, 'post_status' => 'publish'));
+ }
+ }
+ $swpm_rego_page_permalink = get_permalink($rego_page_id);
+ $settings->set_value('registration-page-url', $swpm_rego_page_permalink);
+
+ //Create login page
+ $swpm_login_page = array(
+ 'post_title' => BUtils::_('Member Login'),
+ 'post_name' => 'membership-login',
+ 'post_content' => '[swpm_login_form]',
+ 'post_parent' => 0,
+ 'post_status' => 'publish',
+ 'post_type' => 'page',
+ 'comment_status' => 'closed',
+ 'ping_status' => 'closed'
+ );
+ $login_page_obj = get_page_by_path('membership-login');
+ if (!$login_page_obj) {
+ $login_page_id = wp_insert_post($swpm_login_page);
+ } else {
+ $login_page_id = $login_page_obj->ID;
+ if ($login_page_obj->post_status == 'trash') { //For cases where page may be in trash, bring it out of trash
+ wp_update_post(array('ID' => $login_page_obj->ID, 'post_status' => 'publish'));
+ }
+ }
+ $swpm_login_page_permalink = get_permalink($login_page_id);
+ $settings->set_value('login-page-url', $swpm_login_page_permalink);
+
+ //Create profile page
+ $swpm_profile_page = array(
+ 'post_title' => BUtils::_('Profile'),
+ 'post_name' => 'membership-profile',
+ 'post_content' => '[swpm_profile_form]',
+ 'post_parent' => $login_page_id,
+ 'post_status' => 'publish',
+ 'post_type' => 'page',
+ 'comment_status' => 'closed',
+ 'ping_status' => 'closed'
+ );
+ $profile_page_obj = get_page_by_path('membership-profile');
+ if (!$profile_page_obj) {
+ $profile_page_id = wp_insert_post($swpm_profile_page);
+ } else {
+ $profile_page_id = $profile_page_obj->ID;
+ if ($profile_page_obj->post_status == 'trash') { //For cases where page may be in trash, bring it out of trash
+ wp_update_post(array('ID' => $profile_page_obj->ID, 'post_status' => 'publish'));
+ }
+ }
+ $swpm_profile_page_permalink = get_permalink($profile_page_id);
+ $settings->set_value('profile-page-url', $swpm_profile_page_permalink);
+
+ //Create reset page
+ $swpm_reset_page = array(
+ 'post_title' => BUtils::_('Password Reset'),
+ 'post_name' => 'password-reset',
+ 'post_content' => '[swpm_reset_form]',
+ 'post_parent' => $login_page_id,
+ 'post_status' => 'publish',
+ 'post_type' => 'page',
+ 'comment_status' => 'closed',
+ 'ping_status' => 'closed'
+ );
+ $reset_page_obj = get_page_by_path('password-reset');
+ if (!$profile_page_obj) {
+ $reset_page_id = wp_insert_post($swpm_reset_page);
+ } else {
+ $reset_page_id = $reset_page_obj->ID;
+ if ($reset_page_obj->post_status == 'trash') { //For cases where page may be in trash, bring it out of trash
+ wp_update_post(array('ID' => $reset_page_obj->ID, 'post_status' => 'publish'));
+ }
+ }
+ $swpm_reset_page_permalink = get_permalink($reset_page_id);
+ $settings->set_value('reset-page-url', $swpm_reset_page_permalink);
+
+ $settings->save(); //Save all settings object changes
+ }
+
+ public static function reset_swmp_log_files() {
+ $log_reset = true;
+ $logfile_list = array(
+ SIMPLE_WP_MEMBERSHIP_PATH.'/log.txt',
+ );
+
+ foreach ($logfile_list as $logfile) {
+ if (empty($logfile)) {
+ continue;
+ }
+
+ $text = '[' . date('m/d/Y g:i A') . '] - SUCCESS : Log file reset';
+ $text .= "\n------------------------------------------------------------------\n\n";
+ $fp = fopen($logfile, 'w');
+ if ($fp != FALSE) {
+ @fwrite($fp, $text);
+ @fclose($fp);
+ } else {
+ $log_reset = false;
+ }
+ }
+ return $log_reset;
+ }
+
+}
\ No newline at end of file
diff --git a/classes/class.simple-wp-membership.php b/classes/class.simple-wp-membership.php
new file mode 100644
index 0000000..879c887
--- /dev/null
+++ b/classes/class.simple-wp-membership.php
@@ -0,0 +1,687 @@
+user_login);
+ if (!empty($swpm_id)){
+ $password_hash = BUtils::encrypt_password($pass);
+ global $wpdb;
+ $wpdb->update($wpdb->prefix . "swpm_members_tbl", array('password' => $password_hash), array('member_id' => $swpm_id));
+ }
+ }
+
+ public function save_attachment_extra($post, $attachment) {
+ $this->save_postdata($post['ID']);
+ return $post;
+ }
+ public function filter_attachment($content, $post_id){
+ if(is_admin()){//No need to filter on the admin side
+ return $content;
+ }
+
+ $acl = BAccessControl::get_instance();
+ if (has_post_thumbnail($post_id)){ return $content;}
+ if ($acl->can_i_read_post($post_id)) {return $content;}
+
+
+ if (isset($content['file'])){
+ $content['file'] = 'restricted-icon.png';
+ $content['width'] = '400';
+ $content['height'] = '400';
+ }
+
+ if (isset($content['sizes'])){
+ if ($content['sizes']['thumbnail']){
+ $content['sizes']['thumbnail']['file'] = 'restricted-icon.png';
+ $content['sizes']['thumbnail']['mime-type'] = 'image/png';
+ }
+ if ($content['sizes']['medium']){
+ $content['sizes']['medium']['file'] = 'restricted-icon.png';
+ $content['sizes']['medium']['mime-type'] = 'image/png';
+ }
+ if ($content['sizes']['post-thumbnail']){
+ $content['sizes']['post-thumbnail']['file'] = 'restricted-icon.png';
+ $content['sizes']['post-thumbnail']['mime-type'] = 'image/png';
+ }
+ }
+ return $content;
+ }
+
+ public function filter_attachment_url($content, $post_id){
+ if(is_admin()){//No need to filter on the admin side
+ return $content;
+ }
+ $acl = BAccessControl::get_instance();
+ if (has_post_thumbnail($post_id)){return $content;}
+
+ if ($acl->can_i_read_post($post_id)){return $content;}
+
+ return BUtils::get_restricted_image_url();
+ }
+
+ public function admin_init_hook(){
+ BSettings::get_instance()->init_config_hooks();
+ $addon_saved = filter_input(INPUT_POST, 'swpm-addon-settings');
+ if(!empty($addon_saved)){
+ do_action('swpm_addon_settings_save');
+ }
+ }
+
+ public function hide_adminbar(){
+ if (!is_user_logged_in()){//Never show admin bar if the user is not even logged in
+ return false;
+ }
+ $hide = BSettings::get_instance()->get_value('hide-adminbar');
+ return $hide? FALSE: TRUE;
+ }
+ public function shutdown(){
+ BLog::writeall();
+ }
+ public static function swpm_login($user, $pass, $rememberme = true) {
+ if (is_user_logged_in()) {
+ $current_user = wp_get_current_user();
+ if ($current_user->user_login == $user){
+ return;
+ }
+ }
+ $user = wp_signon(array('user_login' => $user, 'user_password' => $pass, 'remember' => $rememberme), is_ssl());
+ if ( is_a( $user, 'WP_User' ) ) {
+ wp_set_current_user( $user->ID, $user->user_login );
+ }
+ do_action('swpm_after_login');
+ if (!BUtils::is_ajax()) {
+ wp_redirect(site_url());
+ }
+ }
+
+ public function swpm_logout() {
+ if (is_user_logged_in()) {
+ wp_logout();
+ wp_set_current_user(0);
+ }
+ }
+
+ public function wp_login($username, $password) {
+ $auth = BAuth::get_instance();
+ if (($auth->is_logged_in() &&($auth->userData->user_name == $username))) {
+ return;
+ }
+ if(!empty($username)) {$auth->login($username, $password, true);}
+ }
+
+ public function wp_logout() {
+ $auth = BAuth::get_instance();
+ if ($auth->is_logged_in()){
+ $auth->logout();
+ }
+ }
+
+ public function sync_with_wp_profile($wp_user_id) {
+ global $wpdb;
+ $wp_user_data = get_userdata($wp_user_id);
+ $query = $wpdb->prepare("SELECT * FROM " . $wpdb->prefix . "swpm_members_tbl WHERE " . ' user_name=%s', $wp_user_data->user_login);
+ $profile = $wpdb->get_row($query, ARRAY_A);
+ $profile = (array) $profile;
+ if (empty($profile)){
+ return;
+ }
+ $profile['user_name'] = $wp_user_data->user_login;
+ $profile['email'] = $wp_user_data->user_email;
+ $profile['password'] = $wp_user_data->user_pass;
+ $profile['first_name'] = $wp_user_data->user_firstname;
+ $profile['last_name'] = $wp_user_data->user_lastname;
+ $wpdb->update($wpdb->prefix . "swpm_members_tbl", $profile, array('member_id' => $profile['member_id']));
+ }
+
+ public function login() {
+ ob_start();
+ $auth = BAuth::get_instance();
+ if ($auth->is_logged_in()){
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/loggedin.php');
+ }
+ else {
+ $setting = BSettings::get_instance();
+ $password_reset_url = $setting->get_value('reset-page-url');
+ $join_url = $setting->get_value('join-us-page-url');
+
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/login.php');
+
+ }
+ return ob_get_clean();
+ }
+
+ public function reset() {
+ $succeeded = $this->notices();
+ if($succeeded){
+ return '';
+ }
+ ob_start();
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/forgot_password.php');
+ return ob_get_clean();
+ }
+ public function profile_form() {
+ $auth = BAuth::get_instance();
+ $this->notices();
+ if ($auth->is_logged_in()) {
+ $out = apply_filters('swpm_profile_form_override', '');
+ if (!empty($out)){return $out;}
+ $user_data = (array) $auth->userData;
+ $user_data['membership_level_alias'] = $auth->get('alias');
+ ob_start();
+ extract($user_data, EXTR_SKIP);
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/edit.php');
+ return ob_get_clean();
+ }
+ return BUtils::_( 'You are not logged in.');
+ }
+
+ public function notices() {
+ $message = BTransfer::get_instance()->get('status');
+ $succeeded = false;
+ if (empty($message)) { return false;}
+ if ($message['succeeded']) {
+ echo "";
+ $succeeded = true;
+ } else{
+ echo "
";
+ }
+ echo $message['message'];
+ $extra = isset($message['extra']) ? $message['extra'] : array();
+ if (is_string($extra)){
+ echo $extra;
+ }
+ else if (is_array($extra)) {
+ echo '
';
+ foreach ($extra as $key => $value){
+ echo '' . $value . ' ';
+ }
+ echo ' ';
+ }
+ echo "
";
+ return $succeeded;
+ }
+
+ public function meta_box() {
+ if (function_exists('add_meta_box')) {
+ $post_types = get_post_types();
+ foreach ($post_types as $post_type => $post_type){
+ add_meta_box('swpm_sectionid',
+ __('Simple WP Membership Protection', 'swpm'),
+ array(&$this, 'inner_custom_box'), $post_type, 'advanced');
+ }
+ } else {//older version doesn't have custom post type so modification isn't needed.
+ add_action('dbx_post_advanced', array(&$this, 'show_old_custom_box'));
+ add_action('dbx_page_advanced', array(&$this, 'show_old_custom_box'));
+ }
+ }
+
+ public function show_old_custom_box() {
+ echo '
' . "\n";
+ echo '
' . "\n";
+ echo '
' .
+ __('Simple Membership Protection options', 'swpm') . " ";
+ echo '';
+ // output editing form
+ $this->inner_custom_box();
+ // end wrapper
+ echo "
\n";
+ }
+
+ public function inner_custom_box() {
+ global $post, $wpdb;
+ $id = $post->ID;
+ // Use nonce for verification
+ $is_protected = BProtection::get_instance()->is_protected($id);
+ echo '
';
+ // The actual fields for data entry
+ echo '
' . __("Do you want to protect this content?", 'swpm') . ' ';
+ echo '
No, Do not protect this content.
';
+ echo '
Yes, Protect this content.
';
+ echo '
' . __("Select the membership level that can access this content:", 'swpm') . " ";
+ $query = "SELECT * FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id !=1 ";
+ $levels = $wpdb->get_results($query, ARRAY_A);
+ foreach ($levels as $level) {
+ echo '
is_permitted($id) ? "checked='checked'" : "") .
+ ' name="swpm_protection_level[' . $level['id'] . ']" value="' . $level['id'] . '" /> ' . $level['alias'] . "
";
+ }
+ }
+
+ public function save_postdata($post_id) {
+ global $wpdb;
+ $post_type = filter_input(INPUT_POST,'post_type');
+ $swpm_protect_post = filter_input(INPUT_POST,'swpm_protect_post');
+ $swpm_noncename = filter_input(INPUT_POST, 'swpm_noncename');
+ if (wp_is_post_revision($post_id)){
+ return;
+ }
+ if (!wp_verify_nonce($swpm_noncename, plugin_basename(__FILE__))){
+ return $post_id;
+ }
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){
+ return $post_id;
+ }
+ if ('page' == $post_type ) {
+ if (!current_user_can('edit_page', $post_id)){
+ return $post_id;
+ }
+ } else {
+ if (!current_user_can('edit_post', $post_id)){
+ return $post_id;
+ }
+ }
+ if (empty($swpm_protect_post)){
+ return;
+ }
+ // OK, we're authenticated: we need to find and save the data
+ $isprotected = ($swpm_protect_post == 2);
+ $args = array('swpm_protection_level'=>array(
+ 'filter' => FILTER_VALIDATE_INT,
+ 'flags' => FILTER_REQUIRE_ARRAY,
+ ));
+ $swpm_protection_level = filter_input_array(INPUT_POST, $args);
+ $swpm_protection_level = $swpm_protection_level['swpm_protection_level'];
+ if (!empty($post_type)) {
+ if($isprotected){
+ BProtection::get_instance()->apply(array($post_id),$post_type);
+ }
+ else{
+ BProtection::get_instance()->remove(array($post_id),$post_type);
+ }
+ BProtection::get_instance()->save();
+ $query = "SELECT id FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id !=1 ";
+ $level_ids = $wpdb->get_col($query);
+ foreach ($level_ids as $level){
+ if(isset($swpm_protection_level[$level])){
+ BPermission::get_instance($level)->apply(array($post_id), $post_type)->save();
+ }
+ else{
+ BPermission::get_instance($level)->remove(array($post_id), $post_type)->save();
+ }
+ }
+ }
+ $enable_protection = array();
+ $enable_protection['protect'] = $swpm_protect_post;
+ $enable_protection['level'] = $swpm_protection_level;
+ return $enable_protection;
+ }
+
+ public function filter_comment($content) {
+ $acl = BAccessControl::get_instance();
+ global $comment;
+ return $acl->filter_post($comment->comment_post_ID, $content);
+ }
+
+ public function filter_content($content) {
+ if (is_preview()) {return $content;}
+ $acl = BAccessControl::get_instance();
+ global $post;
+ return $acl->filter_post($post->ID, $content);
+ }
+
+ public function filter_moretag($more_link, $more_link_text = "More") {
+ $moretag = BSettings::get_instance()->get_value('enable-moretag');
+ if (empty($moretag)) {return $more_link;}
+ $acl = BAccessControl::get_instance();
+ global $post;
+ return $acl->filter_post_with_moretag($post->ID, $more_link, $more_link_text);
+ }
+
+ public function admin_init() {
+ $createswpmuser = filter_input(INPUT_POST, 'createswpmuser');
+ if (!empty($createswpmuser)) {
+ BAdminRegistration::get_instance()->register();
+ }
+ $editswpmuser = filter_input(INPUT_POST, 'editswpmuser');
+ if (!empty($editswpmuser)) {
+ $id = filter_input(INPUT_GET, 'member_id', FILTER_VALIDATE_INT);
+ BAdminRegistration::get_instance()->edit($id);
+ }
+ $createswpmlevel = filter_input(INPUT_POST, 'createswpmlevel');
+ if (!empty($createswpmlevel)) {
+ BMembershipLevel::get_instance()->create();
+ }
+ $editswpmlevel = filter_input(INPUT_POST, 'editswpmlevel');
+ if (!empty($editswpmlevel)) {
+ $id = filter_input(INPUT_GET, 'id');
+ BMembershipLevel::get_instance()->edit($id);
+ }
+ }
+
+ public function init() {
+
+ //Set up localisation. First loaded ones will override strings present in later loaded file.
+ //Allows users to have a customized language in a different folder.
+ $locale = apply_filters( 'plugin_locale', get_locale(), 'swpm' );
+ load_textdomain( 'swpm', WP_LANG_DIR . "/swpm-$locale.mo" );
+ load_plugin_textdomain('swpm', false, SIMPLE_WP_MEMBERSHIP_DIRNAME. '/languages/');
+
+ if (!isset($_COOKIE['swpm_session'])) { // give a unique ID to current session.
+ $uid = md5(microtime());
+ $_COOKIE['swpm_session'] = $uid; // fake it for current session/
+ setcookie('swpm_session', $uid, 0, '/');
+ }
+
+ if(current_user_can('edit_pages')){ // admin stuff
+ $this->admin_init();
+ }
+ if (!is_admin()){ //frontend stuff
+ BAuth::get_instance();
+ $this->verify_and_delete_account();
+ $swpm_logout = filter_input(INPUT_GET, 'swpm-logout');
+ if (!empty($swpm_logout)) {
+ BAuth::get_instance()->logout();
+ wp_redirect(home_url());
+ }
+ $this->process_password_reset();
+ $this->register_member();
+ $this->edit_profile();
+ }
+ $this->swpm_ipn_listener();
+ }
+
+ public function swpm_ipn_listener() {
+ $swpm_process_ipn = filter_input(INPUT_GET, 'swpm_process_ipn');
+ if ($swpm_process_ipn == '1') {
+ include(SIMPLE_WP_MEMBERSHIP_PATH.'ipn/swpm_handle_pp_ipn.php');
+ exit;
+ }
+ }
+
+ public function process_password_reset() {
+ $message = "";
+ $swpm_reset = filter_input(INPUT_POST, 'swpm-reset');
+ $swpm_reset_email = filter_input(INPUT_POST, 'swpm_reset_email', FILTER_UNSAFE_RAW);
+ if (!empty($swpm_reset)) {
+ BFrontRegistration::get_instance()->reset_password($swpm_reset_email);
+ }
+ }
+
+ private function edit_profile() {
+ $swpm_editprofile_submit = filter_input(INPUT_POST, 'swpm_editprofile_submit');
+ if (!empty($swpm_editprofile_submit)) {
+ BFrontRegistration::get_instance()->edit();
+ //todo: do a redirect
+ }
+ }
+
+ public function admin_library() {
+ $this->common_library();
+ wp_enqueue_script('password-strength-meter');
+ wp_enqueue_script('swpm.password-meter', SIMPLE_WP_MEMBERSHIP_URL . '/js/swpm.password-meter.js');
+ wp_enqueue_style('jquery.tools.dateinput', SIMPLE_WP_MEMBERSHIP_URL . '/css/jquery.tools.dateinput.css');
+ wp_enqueue_script('jquery.tools', SIMPLE_WP_MEMBERSHIP_URL . '/js/jquery.tools18.min.js');
+ $settings = array('statusChangeEmailHead'=> BSettings::get_instance()->get_value('account-change-email-subject'),
+ 'statusChangeEmailBody'=> BSettings::get_instance()->get_value('account-change-email-body'));
+ wp_localize_script( 'swpm.password-meter', 'SwpmSettings', $settings );
+ }
+
+ public function front_library() {
+ $this->common_library();
+ }
+
+ private function common_library() {
+ wp_enqueue_script('jquery');
+ wp_enqueue_style('swpm.common', SIMPLE_WP_MEMBERSHIP_URL . '/css/swpm.common.css');
+ wp_enqueue_style('validationEngine.jquery', SIMPLE_WP_MEMBERSHIP_URL . '/css/validationEngine.jquery.css');
+ wp_enqueue_script('jquery.validationEngine-en', SIMPLE_WP_MEMBERSHIP_URL . '/js/jquery.validationEngine-en.js');
+ wp_enqueue_script('jquery.validationEngine', SIMPLE_WP_MEMBERSHIP_URL . '/js/jquery.validationEngine.js');
+ }
+
+ public function registration_form($atts) {
+ $succeeded = $this->notices();
+ if($succeeded){
+ return;
+ }
+ $is_free = BSettings::get_instance()->get_value('enable-free-membership');
+ $free_level = absint(BSettings::get_instance()->get_value('free-membership-id'));
+ $level = isset($atts['level'])? absint($atts['level']): ($is_free? $free_level: null);
+ return BFrontRegistration::get_instance()->regigstration_ui($level);
+ }
+
+ private function register_member() {
+ $registration = filter_input(INPUT_POST, 'swpm_registration_submit');
+ if (!empty($registration)) {
+ BFrontRegistration::get_instance()->register();
+ }
+ }
+
+ public function menu() {
+ $menu_parent_slug = 'simple_wp_membership';
+
+ add_menu_page(__("WP Membership", 'swpm'), __("WP Membership", 'swpm')
+ , 'edit_pages', $menu_parent_slug, array(&$this, "admin_members")
+ , SIMPLE_WP_MEMBERSHIP_URL . '/images/logo.png');
+ add_submenu_page($menu_parent_slug, __("Members", 'swpm'), __('Members', 'swpm'),
+ 'edit_pages', 'simple_wp_membership', array(&$this, "admin_members"));
+ add_submenu_page($menu_parent_slug, __("Membership Levels", 'swpm'), __("Membership Levels", 'swpm'),
+ 'manage_options', 'simple_wp_membership_levels', array(&$this, "admin_membership_levels"));
+ add_submenu_page($menu_parent_slug, __("Settings", 'swpm'), __("Settings", 'swpm'),
+ 'manage_options', 'simple_wp_membership_settings', array(&$this, "admin_settings"));
+ add_submenu_page($menu_parent_slug, __("Payments", 'swpm'), __("Payments", 'swpm'),
+ 'manage_options', 'simple_wp_membership_payments', array(&$this, "payments_menu"));
+ add_submenu_page($menu_parent_slug, __("Add-ons", 'swpm'), __("Add-ons", 'swpm'),
+ 'manage_options', 'simple_wp_membership_addons', array(&$this, "add_ons_menu"));
+
+ do_action('swpm_after_main_admin_menu', $menu_parent_slug);
+
+ $this->meta_box();
+ }
+
+ public function admin_membership_levels() {
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'classes/class.bMembershipLevels.php');
+ $levels = new BMembershipLevels();
+ $level_action = filter_input(INPUT_GET, 'level_action');
+ $action2 = filter_input(INPUT_GET, 'action2');
+ $action = $level_action ? $level_action : ($action2 ? $action2 : "");
+ switch ($action) {
+ case 'add':
+ case 'edit':
+ $levels->process_form_request();
+ break;
+ case 'manage':
+ $levels->manage();
+ break;
+ case 'category_list':
+ $levels->manage_categroy();
+ break;
+ case 'delete':
+ case 'bulk_delete':
+ $levels->delete();
+ default:
+ $levels->show();
+ break;
+ }
+ }
+
+ public function admin_members() {
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'classes/class.bMembers.php');
+ $members = new BMembers();
+ $action = filter_input(INPUT_GET, 'member_action');
+ $action = empty($action)? filter_input(INPUT_POST, 'action') : $action;
+ switch ($action) {
+ case 'add':
+ case 'edit':
+ $members->process_form_request();
+ break;
+ case 'delete':
+ case 'bulk_delete':
+ $members->delete();
+ default:
+ $members->show();
+ break;
+ }
+ }
+
+ public function admin_settings() {
+ $current_tab = BSettings::get_instance()->current_tab;
+ switch ($current_tab) {
+ case 6:
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_addon_settings.php');
+ break;
+ case 4:
+ $link_for = filter_input(INPUT_POST, 'swpm_link_for',FILTER_SANITIZE_STRING);
+ $member_id = filter_input(INPUT_POST, 'member_id',FILTER_SANITIZE_NUMBER_INT);
+ $send_email = filter_input(INPUT_POST, 'swpm_reminder_email',FILTER_SANITIZE_NUMBER_INT);
+ $links = BUtils::get_registration_link($link_for, $send_email, $member_id);
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_tools_settings.php');
+ break;
+ case 2:
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_payment_settings.php');
+ break;
+ default:
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_settings.php');
+ break;
+ }
+ }
+
+ public function payments_menu(){
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_payments_page.php');
+ }
+
+ public function add_ons_menu(){
+ include(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_add_ons_page.php');
+ }
+
+ public function plugins_loaded(){
+ //Runs when plugins_loaded action gets fired
+ if(is_admin()){
+ //Check and run DB upgrade operation (if needed)
+ if (get_option('swpm_db_version') != SIMPLE_WP_MEMBERSHIP_DB_VER) {
+ include_once('class.bInstallation.php');
+ BInstallation::run_safe_installer();
+ }
+ }
+ }
+
+ public static function activate() {
+ wp_schedule_event(time(), 'daily', 'swpm_account_status_event');
+ wp_schedule_event(time(), 'daily', 'swpm_delete_pending_account_event');
+ include_once('class.bInstallation.php');
+ BInstallation::run_safe_installer();
+ }
+
+ public function deactivate() {
+ wp_clear_scheduled_hook('swpm_account_status_event');
+ wp_clear_scheduled_hook('swpm_delete_pending_account_event');
+ }
+ private function verify_and_delete_account(){
+ include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'classes/class.bMembers.php');
+ $delete_account = filter_input(INPUT_GET, 'delete_account');
+ if (empty($delete_account)) {return; }
+ $password = filter_input(INPUT_POST, 'account_delete_confirm_pass',FILTER_UNSAFE_RAW);
+
+ $auth = BAuth::get_instance();
+ if (!$auth->is_logged_in()){return;}
+ if (empty($password)){
+ BUtils::account_delete_confirmation_ui();
+ }
+
+ $nonce_field = filter_input(INPUT_POST, 'account_delete_confirm_nonce');
+ if (empty($nonce_field) || !wp_verify_nonce($nonce_field, 'swpm_account_delete_confirm')){
+ BUtils::account_delete_confirmation_ui(BUtils::_("Sorry, Nonce verification failed."));
+ }
+ if ($auth->match_password($password)){
+ $auth->delete();
+ wp_redirect(home_url());
+ }
+ else{
+ BUtils::account_delete_confirmation_ui(BUtils::_("Sorry, Password didn't match."));
+ }
+ }
+
+ public function list_members() {
+
+ $currentThemeDirectory = get_template_directory();
+ if (file_exists($currentThemeDirectory.'/simple-wp-membership/methods.php')) {
+
+ $auth = BAuth::get_instance();
+ $this->notices();
+ if ($auth->is_logged_in()) {
+
+ ob_start();
+
+ if ($themeExtDir !== false) {
+ include_once($currentThemeDirectory.'/simple-wp-membership/methods.php');
+ }
+
+ return ob_get_clean();
+ }
+ return BUtils::_( 'You are not logged in.');
+ }
+ }
+
+
+
+
+}
diff --git a/classes/index.html b/classes/index.html
new file mode 100644
index 0000000..e69de29
diff --git a/css/index.html b/css/index.html
new file mode 100644
index 0000000..e69de29
diff --git a/css/jquery.tools.dateinput.css b/css/jquery.tools.dateinput.css
new file mode 100644
index 0000000..49a0e27
--- /dev/null
+++ b/css/jquery.tools.dateinput.css
@@ -0,0 +1,159 @@
+/* get rid of those system borders being generated for A tags */
+a:active {
+ outline:none;
+}
+
+:focus {
+ -moz-outline-style:none;
+}
+/* For the details, see: http://flowplayer.org/tools/dateinput/index.html#skinning */
+
+/* the input field */
+.date {
+ border:1px solid #ccc;
+ font-size:13px;
+ padding:4px;
+ text-align:center;
+ width:178px;
+
+ -moz-box-shadow:0 0 10px #eee inset;
+ -webkit-box-shadow:0 0 10px #eee inset;
+}
+
+/* calendar root element */
+#calroot {
+ /* place on top of other elements. set a higher value if nessessary */
+ z-index:10000;
+
+ margin-top:-1px;
+ width:198px;
+ padding:2px;
+ background-color:#fff;
+ font-size:11px;
+ border:1px solid #ccc;
+
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+
+ -moz-box-shadow: 0 0 15px #666;
+ -webkit-box-shadow: 0 0 15px #666;
+}
+
+/* head. contains title, prev/next month controls and possible month/year selectors */
+#calhead {
+ padding:2px 0;
+ height:22px;
+}
+
+#caltitle {
+ font-size:14px;
+ color:#0150D1;
+ float:left;
+ text-align:center;
+ width:155px;
+ line-height:20px;
+ text-shadow:0 1px 0 #ddd;
+}
+
+#calnext, #calprev {
+ display:block;
+ width:20px;
+ height:20px;
+ background:transparent url(../images/prev.gif) no-repeat scroll center center;
+ float:left;
+ cursor:pointer;
+}
+
+#calnext {
+ background-image:url(../images/next.gif);
+ float:right;
+}
+
+#calprev.caldisabled, #calnext.caldisabled {
+ visibility:hidden;
+}
+
+/* year/month selector */
+#caltitle select {
+ font-size:10px;
+}
+
+/* names of the days */
+#caldays {
+ height:14px;
+ border-bottom:1px solid #ddd;
+}
+
+#caldays span {
+ display:block;
+ float:left;
+ width:28px;
+ text-align:center;
+}
+
+/* container for weeks */
+#calweeks {
+ background-color:#fff;
+ margin-top:4px;
+}
+
+/* single week */
+.calweek {
+ clear:left;
+ height:22px;
+}
+
+/* single day */
+.calweek a {
+ display:block;
+ float:left;
+ width:27px;
+ height:20px;
+ text-decoration:none;
+ font-size:11px;
+ margin-left:1px;
+ text-align:center;
+ line-height:20px;
+ color:#666;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+}
+
+/* different states */
+.calweek a:hover, .calfocus {
+ background-color:#ddd;
+}
+
+/* sunday */
+a.calsun {
+ color:red;
+}
+
+/* offmonth day */
+a.caloff {
+ color:#ccc;
+}
+
+a.caloff:hover {
+ background-color:rgb(245, 245, 250);
+}
+
+
+/* unselecteble day */
+a.caldisabled {
+ background-color:#efefef !important;
+ color:#ccc !important;
+ cursor:default;
+}
+
+/* current day */
+#calcurrent {
+ background-color:#498CE2;
+ color:#fff;
+}
+
+/* today */
+#caltoday {
+ background-color:#333;
+ color:#fff;
+}
diff --git a/css/swpm.addons.listing.css b/css/swpm.addons.listing.css
new file mode 100644
index 0000000..04d84f2
--- /dev/null
+++ b/css/swpm.addons.listing.css
@@ -0,0 +1,34 @@
+.swpm_addon_item_canvas{
+ background-color:#fff;
+ font-family:sans-serif,arial;
+ font-size:12px;
+ border:1px solid #ccc;
+ display:block;
+ float:left;
+ margin:3px 12px 12px 0;
+ padding:10px 0px 10px 10px;
+ position:relative;
+ width:222px;
+ height:340px;
+}
+.swpm_addon_item_canvas:hover{border-color:#999;}
+.swpm_addon_item_thumb img {height: 150px; width: 200px; padding: 5px; border: 1px solid #ccc;}
+.swpm_addon_item_thumb a img {border: 1px solid #ccc;}
+.swpm_addon_item_body{line-height:22px;height:170px;overflow:hidden;}
+.swpm_addon_item_name{font-size:16px;font-weight:bold;text-align: center;margin:10px 10px 10px 0px;}
+.swpm_addon_item_description{margin:10px 10px 5px 0px;text-align:justify;overflow:hidden;height:70px;}
+.swpm_addon_clear{clear:both;}
+.swpm_addon_item_details_link{
+ text-align: center;
+}
+.swpm_addon_item_details_link a{
+ border: 3px solid #2d3140;
+ color: #2d3140;
+ display: inline-block;
+ padding: 5px 15px;
+ text-decoration: none !important;
+}
+.swpm_addon_item_details_link a:hover{
+ background-color: #2d3140;
+ color: #FFF;
+}
diff --git a/css/swpm.common.css b/css/swpm.common.css
new file mode 100644
index 0000000..eb33179
--- /dev/null
+++ b/css/swpm.common.css
@@ -0,0 +1,101 @@
+/* General CSS */
+.swpm-margin-10{
+ margin: 10px;
+}
+.swpm-margin-top-10{
+ margin-top: 10px;
+}
+.swpm-margin-bottom-10{
+ margin-bottom: 10px;
+}
+
+.swpm-yellow-box{
+ margin: 10px 0 15px;
+ padding: 10px;
+ background-color: #FFFFE0;
+ border-color: #E6DB55;
+ border-radius: 3px 3px 3px 3px;
+ border-style: solid;
+ border-width: 1px;
+}
+
+.swpm-grey-box{
+ margin: 10px 0 15px;
+ padding: 10px;
+ background-color: #DDDDDD;
+ border-color: #CCCCCC;
+ border-radius: 3px 3px 3px 3px;
+ border-style: solid;
+ border-width: 1px;
+}
+.swpm-green-box {
+ margin: 10px 0 15px;
+ padding: 10px;
+ background-color: #CCF4D6;
+ border-color: #059B53;
+ color: #043B14;
+ border-radius: 3px 3px 3px 3px;
+ border-style: solid;
+ border-width: 1px;
+}
+
+.swpm-red-box {
+ margin: 10px 0 15px;
+ padding: 10px;
+ background-color: #FFEBE8;
+ border-color: #CC0000;
+ color: #333333;
+ border-radius: 3px 3px 3px 3px;
+ border-style: solid;
+ border-width: 1px;
+}
+
+/* Login form CSS */
+.swpm-login-widget-form input,.swpm-login-widget-form checkbox{
+ width: auto;
+}
+.swpm-username-input, .swpm-password-input{
+ margin-bottom: 10px;
+}
+.swpm-login-submit{
+ margin-bottom: 10px;
+}
+.swpm-login-widget-action-msg{
+ font-weight: bold;
+}
+.swpm-logged-label{
+ font-weight: bold;
+}
+
+/* Password reset form CSS */
+.swpm-password-reset-widget-form table{
+ border: none;
+}
+swpm-password-reset-widget-form tr{
+ border: none;
+}
+.swpm-password-reset-widget-form td{
+ border: none;
+}
+
+/* Registration form CSS */
+.swpm-registration-widget-form td{
+ min-width: 100px;
+}
+
+.swpm-restricted{
+ font-weight: bold;
+ color:red;
+}
+.swpm-select-box-left{
+ margin: 0;
+ padding-bottom: 5px;
+}
+
+/* Edit profile form CSS */
+.swpm-account-delete-button{
+ text-align: center;
+}
+.swpm-account-delete-button a{
+ color: red !important;
+}
\ No newline at end of file
diff --git a/css/validationEngine.jquery.css b/css/validationEngine.jquery.css
new file mode 100644
index 0000000..51a3e4b
--- /dev/null
+++ b/css/validationEngine.jquery.css
@@ -0,0 +1,143 @@
+.inputContainer {
+ position: relative;
+ float: left;
+}
+
+.formError {
+ position: absolute;
+ top: 300px;
+ left: 300px;
+ display: block;
+ z-index: 5000;
+ cursor: pointer;
+}
+
+.ajaxSubmit {
+ padding: 20px;
+ background: #55ea55;
+ border: 1px solid #999;
+ display: none
+}
+
+.formError .formErrorContent {
+ width: 100%;
+ background: #ee0101;
+ position:relative;
+ z-index:5001;
+ color: #fff;
+ font-weight: bolder;
+ width: 150px;
+ font-family: tahoma;
+ font-size: 11px;
+ border: 2px solid #ddd;
+ box-shadow: 0 0 6px #000;
+ -moz-box-shadow: 0 0 6px #000;
+ -webkit-box-shadow: 0 0 6px #000;
+ padding: 4px 10px 4px 10px;
+ border-radius: 6px;
+ -moz-border-radius: 6px;
+ -webkit-border-radius: 6px;
+}
+
+.greenPopup .formErrorContent {
+ background: #33be40;
+}
+
+.blackPopup .formErrorContent {
+ background: #393939;
+ color: #FFF;
+}
+
+.formError .formErrorArrow {
+ width: 15px;
+ margin: -2px 0 0 13px;
+ position:relative;
+ z-index: 5006;
+}
+
+.formError .formErrorArrowBottom {
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ margin: 0px 0 0 12px;
+ top:2px;
+}
+
+.formError .formErrorArrow div {
+ border-left: 2px solid #ddd;
+ border-right: 2px solid #ddd;
+ box-shadow: 0 2px 3px #444;
+ -moz-box-shadow: 0 2px 3px #444;
+ -webkit-box-shadow: 0 2px 3px #444;
+ font-size: 0px;
+ height: 1px;
+ background: #ee0101;
+ margin: 0 auto;
+ line-height: 0;
+ font-size: 0;
+ display: block;
+}
+
+.formError .formErrorArrowBottom div {
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+}
+
+.greenPopup .formErrorArrow div {
+ background: #33be40;
+}
+
+.blackPopup .formErrorArrow div {
+ background: #393939;
+ color: #FFF;
+}
+
+.formError .formErrorArrow .line10 {
+ width: 15px;
+ border: none;
+}
+
+.formError .formErrorArrow .line9 {
+ width: 13px;
+ border: none;
+}
+
+.formError .formErrorArrow .line8 {
+ width: 11px;
+}
+
+.formError .formErrorArrow .line7 {
+ width: 9px;
+}
+
+.formError .formErrorArrow .line6 {
+ width: 7px;
+}
+
+.formError .formErrorArrow .line5 {
+ width: 5px;
+}
+
+.formError .formErrorArrow .line4 {
+ width: 3px;
+}
+
+.formError .formErrorArrow .line3 {
+ width: 1px;
+ border-left: 2px solid #ddd;
+ border-right: 2px solid #ddd;
+ border-bottom: 0 solid #ddd;
+}
+
+.formError .formErrorArrow .line2 {
+ width: 3px;
+ border: none;
+ background: #ddd;
+}
+
+.formError .formErrorArrow .line1 {
+ width: 1px;
+ border: none;
+ background: #ddd;
+}
\ No newline at end of file
diff --git a/images/addons/form-shortcode-generator.png b/images/addons/form-shortcode-generator.png
new file mode 100644
index 0000000..086e958
Binary files /dev/null and b/images/addons/form-shortcode-generator.png differ
diff --git a/images/addons/mailchimp-integration.png b/images/addons/mailchimp-integration.png
new file mode 100644
index 0000000..267278a
Binary files /dev/null and b/images/addons/mailchimp-integration.png differ
diff --git a/images/addons/swpm-custom-messages.png b/images/addons/swpm-custom-messages.png
new file mode 100644
index 0000000..cf2828f
Binary files /dev/null and b/images/addons/swpm-custom-messages.png differ
diff --git a/images/addons/swpm-form-builder.png b/images/addons/swpm-form-builder.png
new file mode 100644
index 0000000..fa28181
Binary files /dev/null and b/images/addons/swpm-form-builder.png differ
diff --git a/images/addons/swpm-login-redirection.png b/images/addons/swpm-login-redirection.png
new file mode 100644
index 0000000..69b535b
Binary files /dev/null and b/images/addons/swpm-login-redirection.png differ
diff --git a/images/addons/swpm-older-posts-protection.png b/images/addons/swpm-older-posts-protection.png
new file mode 100644
index 0000000..f694467
Binary files /dev/null and b/images/addons/swpm-older-posts-protection.png differ
diff --git a/images/addons/wp-user-import.png b/images/addons/wp-user-import.png
new file mode 100644
index 0000000..9a78550
Binary files /dev/null and b/images/addons/wp-user-import.png differ
diff --git a/images/index.html b/images/index.html
new file mode 100644
index 0000000..e69de29
diff --git a/images/join-now-button-image.gif b/images/join-now-button-image.gif
new file mode 100644
index 0000000..6ef5bb8
Binary files /dev/null and b/images/join-now-button-image.gif differ
diff --git a/images/logo.png b/images/logo.png
new file mode 100644
index 0000000..6b3875c
Binary files /dev/null and b/images/logo.png differ
diff --git a/images/logo2.png b/images/logo2.png
new file mode 100644
index 0000000..eb9243d
Binary files /dev/null and b/images/logo2.png differ
diff --git a/images/next.gif b/images/next.gif
new file mode 100644
index 0000000..730fc3e
Binary files /dev/null and b/images/next.gif differ
diff --git a/images/prev.gif b/images/prev.gif
new file mode 100644
index 0000000..7ec2d6c
Binary files /dev/null and b/images/prev.gif differ
diff --git a/images/restricted-icon.png b/images/restricted-icon.png
new file mode 100644
index 0000000..fc0c6d1
Binary files /dev/null and b/images/restricted-icon.png differ
diff --git a/images/simple-membership-content-protection-usage.png b/images/simple-membership-content-protection-usage.png
new file mode 100644
index 0000000..f1822a2
Binary files /dev/null and b/images/simple-membership-content-protection-usage.png differ
diff --git a/includes/class-swpm-list-table.php b/includes/class-swpm-list-table.php
new file mode 100644
index 0000000..38a8142
--- /dev/null
+++ b/includes/class-swpm-list-table.php
@@ -0,0 +1,1138 @@
+get_column_info()
+ *
+ * @var array
+ */
+ protected $_column_headers;
+
+ protected $compat_fields = array( '_args', '_pagination_args', 'screen', '_actions', '_pagination' );
+
+ protected $compat_methods = array( 'set_pagination_args', 'get_views', 'get_bulk_actions', 'bulk_actions',
+ 'row_actions', 'months_dropdown', 'view_switcher', 'comments_bubble', 'get_items_per_page', 'pagination',
+ 'get_sortable_columns', 'get_column_info', 'get_table_classes', 'display_tablenav', 'extra_tablenav',
+ 'single_row_columns' );
+
+ /**
+ * Constructor.
+ *
+ * The child class should call this constructor from its own constructor to override
+ * the default $args.
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @param array|string $args {
+ * Array or string of arguments.
+ *
+ * @type string $plural Plural value used for labels and the objects being listed.
+ * This affects things such as CSS class-names and nonces used
+ * in the list table, e.g. 'posts'. Default empty.
+ * @type string $singular Singular label for an object being listed, e.g. 'post'.
+ * Default empty
+ * @type bool $ajax Whether the list table supports AJAX. This includes loading
+ * and sorting data, for example. If true, the class will call
+ * the {@see _js_vars()} method in the footer to provide variables
+ * to any scripts handling AJAX events. Default false.
+ * @type string $screen String containing the hook name used to determine the current
+ * screen. If left null, the current screen will be automatically set.
+ * Default null.
+ * }
+ */
+ public function __construct( $args = array() ) {
+ $args = wp_parse_args( $args, array(
+ 'plural' => '',
+ 'singular' => '',
+ 'ajax' => false,
+ 'screen' => null,
+ ) );
+
+ $this->screen = convert_to_screen( $args['screen'] );
+
+ add_filter( "manage_{$this->screen->id}_columns", array( $this, 'get_columns' ), 0 );
+
+ if ( !$args['plural'] )
+ $args['plural'] = $this->screen->base;
+
+ $args['plural'] = sanitize_key( $args['plural'] );
+ $args['singular'] = sanitize_key( $args['singular'] );
+
+ $this->_args = $args;
+
+ if ( $args['ajax'] ) {
+ // wp_enqueue_script( 'list-table' );
+ add_action( 'admin_footer', array( $this, '_js_vars' ) );
+ }
+
+ if ( empty( $this->modes ) ) {
+ $this->modes = array(
+ 'list' => __( 'List View' ),
+ 'excerpt' => __( 'Excerpt View' )
+ );
+ }
+ }
+
+ /**
+ * Make private properties readable for backwards compatibility.
+ *
+ * @since 4.0.0
+ * @access public
+ *
+ * @param string $name Property to get.
+ * @return mixed Property.
+ */
+ public function __get( $name ) {
+ if ( in_array( $name, $this->compat_fields ) ) {
+ return $this->$name;
+ }
+ }
+
+ /**
+ * Make private properties settable for backwards compatibility.
+ *
+ * @since 4.0.0
+ * @access public
+ *
+ * @param string $name Property to check if set.
+ * @param mixed $value Property value.
+ * @return mixed Newly-set property.
+ */
+ public function __set( $name, $value ) {
+ if ( in_array( $name, $this->compat_fields ) ) {
+ return $this->$name = $value;
+ }
+ }
+
+ /**
+ * Make private properties checkable for backwards compatibility.
+ *
+ * @since 4.0.0
+ * @access public
+ *
+ * @param string $name Property to check if set.
+ * @return bool Whether the property is set.
+ */
+ public function __isset( $name ) {
+ if ( in_array( $name, $this->compat_fields ) ) {
+ return isset( $this->$name );
+ }
+ }
+
+ /**
+ * Make private properties un-settable for backwards compatibility.
+ *
+ * @since 4.0.0
+ * @access public
+ *
+ * @param string $name Property to unset.
+ */
+ public function __unset( $name ) {
+ if ( in_array( $name, $this->compat_fields ) ) {
+ unset( $this->$name );
+ }
+ }
+
+ /**
+ * Make private/protected methods readable for backwards compatibility.
+ *
+ * @since 4.0.0
+ * @access public
+ *
+ * @param callable $name Method to call.
+ * @param array $arguments Arguments to pass when calling.
+ * @return mixed|bool Return value of the callback, false otherwise.
+ */
+ public function __call( $name, $arguments ) {
+ if ( in_array( $name, $this->compat_methods ) ) {
+ return call_user_func_array( array( $this, $name ), $arguments );
+ }
+ return false;
+ }
+
+ /**
+ * Checks the current user's permissions
+ *
+ * @since 3.1.0
+ * @access public
+ * @abstract
+ */
+ public function ajax_user_can() {
+ die( 'function WP_List_Table::ajax_user_can() must be over-ridden in a sub-class.' );
+ }
+
+ /**
+ * Prepares the list of items for displaying.
+ * @uses WP_List_Table::set_pagination_args()
+ *
+ * @since 3.1.0
+ * @access public
+ * @abstract
+ */
+ public function prepare_items() {
+ die( 'function WP_List_Table::prepare_items() must be over-ridden in a sub-class.' );
+ }
+
+ /**
+ * An internal method that sets all the necessary pagination arguments
+ *
+ * @param array $args An associative array with information about the pagination
+ * @access protected
+ */
+ protected function set_pagination_args( $args ) {
+ $args = wp_parse_args( $args, array(
+ 'total_items' => 0,
+ 'total_pages' => 0,
+ 'per_page' => 0,
+ ) );
+
+ if ( !$args['total_pages'] && $args['per_page'] > 0 )
+ $args['total_pages'] = ceil( $args['total_items'] / $args['per_page'] );
+
+ // Redirect if page number is invalid and headers are not already sent.
+ if ( ! headers_sent() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages'] ) {
+ wp_redirect( add_query_arg( 'paged', $args['total_pages'] ) );
+ exit;
+ }
+
+ $this->_pagination_args = $args;
+ }
+
+ /**
+ * Access the pagination args.
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @param string $key Pagination argument to retrieve. Common values include 'total_items',
+ * 'total_pages', 'per_page', or 'infinite_scroll'.
+ * @return int Number of items that correspond to the given pagination argument.
+ */
+ public function get_pagination_arg( $key ) {
+ if ( 'page' == $key )
+ return $this->get_pagenum();
+
+ if ( isset( $this->_pagination_args[$key] ) )
+ return $this->_pagination_args[$key];
+ }
+
+ /**
+ * Whether the table has items to display or not
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @return bool
+ */
+ public function has_items() {
+ return !empty( $this->items );
+ }
+
+ /**
+ * Message to be displayed when there are no items
+ *
+ * @since 3.1.0
+ * @access public
+ */
+ public function no_items() {
+ _e( 'No items found.' );
+ }
+
+ /**
+ * Display the search box.
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @param string $text The search button text
+ * @param string $input_id The search input id
+ */
+ public function search_box( $text, $input_id ) {
+ if ( empty( $_REQUEST['s'] ) && !$this->has_items() )
+ return;
+
+ $input_id = $input_id . '-search-input';
+
+ if ( ! empty( $_REQUEST['orderby'] ) )
+ echo '
';
+ if ( ! empty( $_REQUEST['order'] ) )
+ echo '
';
+ if ( ! empty( $_REQUEST['post_mime_type'] ) )
+ echo '
';
+ if ( ! empty( $_REQUEST['detached'] ) )
+ echo '
';
+?>
+
+ :
+
+ 'search-submit') ); ?>
+
+ link ) with the list
+ * of views available on this table.
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @return array
+ */
+ protected function get_views() {
+ return array();
+ }
+
+ /**
+ * Display the list of views available on this table.
+ *
+ * @since 3.1.0
+ * @access public
+ */
+ public function views() {
+ $views = $this->get_views();
+ /**
+ * Filter the list of available list table views.
+ *
+ * The dynamic portion of the hook name, `$this->screen->id`, refers
+ * to the ID of the current screen, usually a string.
+ *
+ * @since 3.5.0
+ *
+ * @param array $views An array of available list table views.
+ */
+ $views = apply_filters( "views_{$this->screen->id}", $views );
+
+ if ( empty( $views ) )
+ return;
+
+ echo "
\n";
+ foreach ( $views as $class => $view ) {
+ $views[ $class ] = "\t$view";
+ }
+ echo implode( " | \n", $views ) . "\n";
+ echo " ";
+ }
+
+ /**
+ * Get an associative array ( option_name => option_title ) with the list
+ * of bulk actions available on this table.
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @return array
+ */
+ protected function get_bulk_actions() {
+ return array();
+ }
+
+ /**
+ * Display the bulk actions dropdown.
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @param string $which The location of the bulk actions: 'top' or 'bottom'.
+ * This is designated as optional for backwards-compatibility.
+ */
+ protected function bulk_actions( $which = '' ) {
+ if ( is_null( $this->_actions ) ) {
+ $no_new_actions = $this->_actions = $this->get_bulk_actions();
+ /**
+ * Filter the list table Bulk Actions drop-down.
+ *
+ * The dynamic portion of the hook name, `$this->screen->id`, refers
+ * to the ID of the current screen, usually a string.
+ *
+ * This filter can currently only be used to remove bulk actions.
+ *
+ * @since 3.5.0
+ *
+ * @param array $actions An array of the available bulk actions.
+ */
+ $this->_actions = apply_filters( "bulk_actions-{$this->screen->id}", $this->_actions );
+ $this->_actions = array_intersect_assoc( $this->_actions, $no_new_actions );
+ $two = '';
+ } else {
+ $two = '2';
+ }
+
+ if ( empty( $this->_actions ) )
+ return;
+
+ echo "
" . __( 'Select bulk action' ) . " ";
+ echo "
\n";
+ echo "" . __( 'Bulk Actions' ) . " \n";
+
+ foreach ( $this->_actions as $name => $title ) {
+ $class = 'edit' == $name ? ' class="hide-if-no-js"' : '';
+
+ echo "\t$title \n";
+ }
+
+ echo " \n";
+
+ submit_button( __( 'Apply' ), 'action', '', false, array( 'id' => "doaction$two" ) );
+ echo "\n";
+ }
+
+ /**
+ * Get the current action selected from the bulk actions dropdown.
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @return string|bool The action name or False if no action was selected
+ */
+ public function current_action() {
+ if ( isset( $_REQUEST['filter_action'] ) && ! empty( $_REQUEST['filter_action'] ) )
+ return false;
+
+ if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] )
+ return $_REQUEST['action'];
+
+ if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] )
+ return $_REQUEST['action2'];
+
+ return false;
+ }
+
+ /**
+ * Generate row actions div
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @param array $actions The list of actions
+ * @param bool $always_visible Whether the actions should be always visible
+ * @return string
+ */
+ protected function row_actions( $actions, $always_visible = false ) {
+ $action_count = count( $actions );
+ $i = 0;
+
+ if ( !$action_count )
+ return '';
+
+ $out = '
';
+ foreach ( $actions as $action => $link ) {
+ ++$i;
+ ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
+ $out .= "$link$sep ";
+ }
+ $out .= '
';
+
+ return $out;
+ }
+
+ /**
+ * Display a monthly dropdown for filtering items
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @param string $post_type
+ */
+ protected function months_dropdown( $post_type ) {
+ global $wpdb, $wp_locale;
+
+ /**
+ * Filter whether to remove the 'Months' drop-down from the post list table.
+ *
+ * @since 4.2.0
+ *
+ * @param bool $disable Whether to disable the drop-down. Default false.
+ * @param string $post_type The post type.
+ */
+ if ( apply_filters( 'disable_months_dropdown', false, $post_type ) ) {
+ return;
+ }
+
+ $months = $wpdb->get_results( $wpdb->prepare( "
+ SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
+ FROM $wpdb->posts
+ WHERE post_type = %s
+ ORDER BY post_date DESC
+ ", $post_type ) );
+
+ /**
+ * Filter the 'Months' drop-down results.
+ *
+ * @since 3.7.0
+ *
+ * @param object $months The months drop-down query results.
+ * @param string $post_type The post type.
+ */
+ $months = apply_filters( 'months_dropdown_results', $months, $post_type );
+
+ $month_count = count( $months );
+
+ if ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) )
+ return;
+
+ $m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0;
+?>
+
+
+ value="0">
+year )
+ continue;
+
+ $month = zeroise( $arc_row->month, 2 );
+ $year = $arc_row->year;
+
+ printf( "%s \n",
+ selected( $m, $year . $month, false ),
+ esc_attr( $arc_row->year . $month ),
+ /* translators: 1: month name, 2: 4-digit year */
+ sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
+ );
+ }
+?>
+
+
+
+
+modes as $mode => $title ) {
+ $classes = array( 'view-' . $mode );
+ if ( $current_mode == $mode )
+ $classes[] = 'current';
+ printf(
+ "
%s \n",
+ esc_url( add_query_arg( 'mode', $mode ) ),
+ implode( ' ', $classes ),
+ $title
+ );
+ }
+ ?>
+
+';
+
+ echo "
";
+
+ if ( $pending_comments )
+ echo '';
+ }
+
+ /**
+ * Get the current page number
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @return int
+ */
+ public function get_pagenum() {
+ $pagenum = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 0;
+
+ if( isset( $this->_pagination_args['total_pages'] ) && $pagenum > $this->_pagination_args['total_pages'] )
+ $pagenum = $this->_pagination_args['total_pages'];
+
+ return max( 1, $pagenum );
+ }
+
+ /**
+ * Get number of items to display on a single page
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @param string $option
+ * @param int $default
+ * @return int
+ */
+ protected function get_items_per_page( $option, $default = 20 ) {
+ $per_page = (int) get_user_option( $option );
+ if ( empty( $per_page ) || $per_page < 1 )
+ $per_page = $default;
+
+ /**
+ * Filter the number of items to be displayed on each page of the list table.
+ *
+ * The dynamic hook name, $option, refers to the `per_page` option depending
+ * on the type of list table in use. Possible values include: 'edit_comments_per_page',
+ * 'sites_network_per_page', 'site_themes_network_per_page', 'themes_network_per_page',
+ * 'users_network_per_page', 'edit_post_per_page', 'edit_page_per_page',
+ * 'edit_{$post_type}_per_page', etc.
+ *
+ * @since 2.9.0
+ *
+ * @param int $per_page Number of items to be displayed. Default 20.
+ */
+ return (int) apply_filters( $option, $per_page );
+ }
+
+ /**
+ * Display the pagination.
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @param string $which
+ */
+ protected function pagination( $which ) {
+ if ( empty( $this->_pagination_args ) ) {
+ return;
+ }
+
+ $total_items = $this->_pagination_args['total_items'];
+ $total_pages = $this->_pagination_args['total_pages'];
+ $infinite_scroll = false;
+ if ( isset( $this->_pagination_args['infinite_scroll'] ) ) {
+ $infinite_scroll = $this->_pagination_args['infinite_scroll'];
+ }
+
+ $output = '
' . sprintf( _n( '1 item', '%s items', $total_items ), number_format_i18n( $total_items ) ) . ' ';
+
+ $current = $this->get_pagenum();
+
+ $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
+
+ $current_url = remove_query_arg( array( 'hotkeys_highlight_last', 'hotkeys_highlight_first' ), $current_url );
+
+ $page_links = array();
+
+ $disable_first = $disable_last = '';
+ if ( $current == 1 ) {
+ $disable_first = ' disabled';
+ }
+ if ( $current == $total_pages ) {
+ $disable_last = ' disabled';
+ }
+ $page_links[] = sprintf( "
%s ",
+ 'first-page' . $disable_first,
+ esc_attr__( 'Go to the first page' ),
+ esc_url( remove_query_arg( 'paged', $current_url ) ),
+ '«'
+ );
+
+ $page_links[] = sprintf( "
%s ",
+ 'prev-page' . $disable_first,
+ esc_attr__( 'Go to the previous page' ),
+ esc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ),
+ '‹'
+ );
+
+ if ( 'bottom' == $which ) {
+ $html_current_page = $current;
+ } else {
+ $html_current_page = sprintf( "%s
",
+ '
' . __( 'Select Page' ) . ' ',
+ esc_attr__( 'Current page' ),
+ $current,
+ strlen( $total_pages )
+ );
+ }
+ $html_total_pages = sprintf( "
%s ", number_format_i18n( $total_pages ) );
+ $page_links[] = '
' . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . ' ';
+
+ $page_links[] = sprintf( "
%s ",
+ 'next-page' . $disable_last,
+ esc_attr__( 'Go to the next page' ),
+ esc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ),
+ '›'
+ );
+
+ $page_links[] = sprintf( "
%s ",
+ 'last-page' . $disable_last,
+ esc_attr__( 'Go to the last page' ),
+ esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),
+ '»'
+ );
+
+ $pagination_links_class = 'pagination-links';
+ if ( ! empty( $infinite_scroll ) ) {
+ $pagination_links_class = ' hide-if-js';
+ }
+ $output .= "\n';
+
+ if ( $total_pages ) {
+ $page_class = $total_pages < 2 ? ' one-page' : '';
+ } else {
+ $page_class = ' no-pages';
+ }
+ $this->_pagination = "
$output
";
+
+ echo $this->_pagination;
+ }
+
+ /**
+ * Get a list of columns. The format is:
+ * 'internal-name' => 'Title'
+ *
+ * @since 3.1.0
+ * @access public
+ * @abstract
+ *
+ * @return array
+ */
+ public function get_columns() {
+ die( 'function WP_List_Table::get_columns() must be over-ridden in a sub-class.' );
+ }
+
+ /**
+ * Get a list of sortable columns. The format is:
+ * 'internal-name' => 'orderby'
+ * or
+ * 'internal-name' => array( 'orderby', true )
+ *
+ * The second format will make the initial sorting order be descending
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @return array
+ */
+ protected function get_sortable_columns() {
+ return array();
+ }
+
+ /**
+ * Get a list of all, hidden and sortable columns, with filter applied
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @return array
+ */
+ protected function get_column_info() {
+ if ( isset( $this->_column_headers ) )
+ return $this->_column_headers;
+
+ $columns = get_column_headers( $this->screen );
+ $hidden = get_hidden_columns( $this->screen );
+
+ $sortable_columns = $this->get_sortable_columns();
+ /**
+ * Filter the list table sortable columns for a specific screen.
+ *
+ * The dynamic portion of the hook name, `$this->screen->id`, refers
+ * to the ID of the current screen, usually a string.
+ *
+ * @since 3.5.0
+ *
+ * @param array $sortable_columns An array of sortable columns.
+ */
+ $_sortable = apply_filters( "manage_{$this->screen->id}_sortable_columns", $sortable_columns );
+
+ $sortable = array();
+ foreach ( $_sortable as $id => $data ) {
+ if ( empty( $data ) )
+ continue;
+
+ $data = (array) $data;
+ if ( !isset( $data[1] ) )
+ $data[1] = false;
+
+ $sortable[$id] = $data;
+ }
+
+ $this->_column_headers = array( $columns, $hidden, $sortable );
+
+ return $this->_column_headers;
+ }
+
+ /**
+ * Return number of visible columns
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @return int
+ */
+ public function get_column_count() {
+ list ( $columns, $hidden ) = $this->get_column_info();
+ $hidden = array_intersect( array_keys( $columns ), array_filter( $hidden ) );
+ return count( $columns ) - count( $hidden );
+ }
+
+ /**
+ * Print column headers, accounting for hidden and sortable columns.
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @param bool $with_id Whether to set the id attribute or not
+ */
+ public function print_column_headers( $with_id = true ) {
+ list( $columns, $hidden, $sortable ) = $this->get_column_info();
+
+ $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
+ $current_url = remove_query_arg( 'paged', $current_url );
+
+ if ( isset( $_GET['orderby'] ) )
+ $current_orderby = $_GET['orderby'];
+ else
+ $current_orderby = '';
+
+ if ( isset( $_GET['order'] ) && 'desc' == $_GET['order'] )
+ $current_order = 'desc';
+ else
+ $current_order = 'asc';
+
+ if ( ! empty( $columns['cb'] ) ) {
+ static $cb_counter = 1;
+ $columns['cb'] = '
' . __( 'Select All' ) . ' '
+ . '
';
+ $cb_counter++;
+ }
+
+ foreach ( $columns as $column_key => $column_display_name ) {
+ $class = array( 'manage-column', "column-$column_key" );
+
+ $style = '';
+ if ( in_array( $column_key, $hidden ) )
+ $style = 'display:none;';
+
+ $style = ' style="' . $style . '"';
+
+ if ( 'cb' == $column_key )
+ $class[] = 'check-column';
+ elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) )
+ $class[] = 'num';
+
+ if ( isset( $sortable[$column_key] ) ) {
+ list( $orderby, $desc_first ) = $sortable[$column_key];
+
+ if ( $current_orderby == $orderby ) {
+ $order = 'asc' == $current_order ? 'desc' : 'asc';
+ $class[] = 'sorted';
+ $class[] = $current_order;
+ } else {
+ $order = $desc_first ? 'desc' : 'asc';
+ $class[] = 'sortable';
+ $class[] = $desc_first ? 'asc' : 'desc';
+ }
+
+ $column_display_name = '
' . $column_display_name . ' ';
+ }
+
+ $id = $with_id ? "id='$column_key'" : '';
+
+ if ( !empty( $class ) )
+ $class = "class='" . join( ' ', $class ) . "'";
+
+ echo "
$column_display_name ";
+ }
+ }
+
+ /**
+ * Display the table
+ *
+ * @since 3.1.0
+ * @access public
+ */
+ public function display() {
+ $singular = $this->_args['singular'];
+
+ $this->display_tablenav( 'top' );
+
+?>
+
+
+
+ print_column_headers(); ?>
+
+
+
+ >
+ display_rows_or_placeholder(); ?>
+
+
+
+
+ print_column_headers( false ); ?>
+
+
+
+
+display_tablenav( 'bottom' );
+ }
+
+ /**
+ * Get a list of CSS classes for the list table table tag.
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @return array List of CSS classes for the table tag.
+ */
+ protected function get_table_classes() {
+ return array( 'widefat', 'fixed', 'striped', $this->_args['plural'] );
+ }
+
+ /**
+ * Generate the table navigation above or below the table
+ *
+ * @since 3.1.0
+ * @access protected
+ * @param string $which
+ */
+ protected function display_tablenav( $which ) {
+ if ( 'top' == $which )
+ wp_nonce_field( 'bulk-' . $this->_args['plural'] );
+?>
+
+
+
+ bulk_actions( $which ); ?>
+
+extra_tablenav( $which );
+ $this->pagination( $which );
+?>
+
+
+
+has_items() ) {
+ $this->display_rows();
+ } else {
+ echo '
';
+ $this->no_items();
+ echo ' ';
+ }
+ }
+
+ /**
+ * Generate the table rows
+ *
+ * @since 3.1.0
+ * @access public
+ */
+ public function display_rows() {
+ foreach ( $this->items as $item )
+ $this->single_row( $item );
+ }
+
+ /**
+ * Generates content for a single row of the table
+ *
+ * @since 3.1.0
+ * @access public
+ *
+ * @param object $item The current item
+ */
+ public function single_row( $item ) {
+ echo '
';
+ $this->single_row_columns( $item );
+ echo ' ';
+ }
+
+ protected function column_default( $item, $column_name ) {}
+
+ protected function column_cb( $item ) {}
+
+ /**
+ * Generates the columns for a single row of the table
+ *
+ * @since 3.1.0
+ * @access protected
+ *
+ * @param object $item The current item
+ */
+ protected function single_row_columns( $item ) {
+ list( $columns, $hidden ) = $this->get_column_info();
+
+ foreach ( $columns as $column_name => $column_display_name ) {
+ $class = "class='$column_name column-$column_name'";
+
+ $style = '';
+ if ( in_array( $column_name, $hidden ) )
+ $style = ' style="display:none;"';
+
+ $attributes = "$class$style";
+
+ if ( 'cb' == $column_name ) {
+ echo '
';
+ echo $this->column_cb( $item );
+ echo ' ';
+ }
+ elseif ( method_exists( $this, 'column_' . $column_name ) ) {
+ echo "
";
+ echo call_user_func( array( $this, 'column_' . $column_name ), $item );
+ echo " ";
+ }
+ else {
+ echo "
";
+ echo $this->column_default( $item, $column_name );
+ echo " ";
+ }
+ }
+ }
+
+ /**
+ * Handle an incoming ajax request (called from admin-ajax.php)
+ *
+ * @since 3.1.0
+ * @access public
+ */
+ public function ajax_response() {
+ $this->prepare_items();
+
+ ob_start();
+ if ( ! empty( $_REQUEST['no_placeholder'] ) ) {
+ $this->display_rows();
+ } else {
+ $this->display_rows_or_placeholder();
+ }
+
+ $rows = ob_get_clean();
+
+ $response = array( 'rows' => $rows );
+
+ if ( isset( $this->_pagination_args['total_items'] ) ) {
+ $response['total_items_i18n'] = sprintf(
+ _n( '1 item', '%s items', $this->_pagination_args['total_items'] ),
+ number_format_i18n( $this->_pagination_args['total_items'] )
+ );
+ }
+ if ( isset( $this->_pagination_args['total_pages'] ) ) {
+ $response['total_pages'] = $this->_pagination_args['total_pages'];
+ $response['total_pages_i18n'] = number_format_i18n( $this->_pagination_args['total_pages'] );
+ }
+
+ die( wp_json_encode( $response ) );
+ }
+
+ /**
+ * Send required variables to JavaScript land
+ *
+ * @access public
+ */
+ public function _js_vars() {
+ $args = array(
+ 'class' => get_class( $this ),
+ 'screen' => array(
+ 'id' => $this->screen->id,
+ 'base' => $this->screen->base,
+ )
+ );
+
+ printf( "\n", wp_json_encode( $args ) );
+ }
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..e69de29
diff --git a/ipn/index.html b/ipn/index.html
new file mode 100644
index 0000000..e69de29
diff --git a/ipn/swpm_handle_pp_ipn.php b/ipn/swpm_handle_pp_ipn.php
new file mode 100644
index 0000000..b54d73d
--- /dev/null
+++ b/ipn/swpm_handle_pp_ipn.php
@@ -0,0 +1,354 @@
+paypal_url = 'https://www.paypal.com/cgi-bin/webscr';
+ $this->last_error = '';
+ $this->ipn_log_file = 'ipn_handle_debug_swpm.log';
+ $this->ipn_response = '';
+ }
+
+ function swpm_validate_and_create_membership()
+ {
+ // Check Product Name , Price , Currency , Receivers email ,
+ $error_msg = "";
+
+ // Read the IPN and validate
+ $gross_total = $this->ipn_data['mc_gross'];
+ $transaction_type = $this->ipn_data['txn_type'];
+ $txn_id = $this->ipn_data['txn_id'];
+ $payment_status = $this->ipn_data['payment_status'];
+
+ //Check payment status
+ if (!empty($payment_status))
+ {
+ if ($payment_status == "Denied") {
+ $this->debug_log("Payment status for this transaction is DENIED. You denied the transaction... most likely a cancellation of an eCheque. Nothing to do here.", false);
+ return false;
+ }
+ if ($payment_status == "Canceled_Reversal") {
+ $this->debug_log("This is a dispute closed notification in your favour. The plugin will not do anyting.", false);
+ return true;
+ }
+ if ($payment_status != "Completed" && $payment_status != "Processed" && $payment_status != "Refunded" && $payment_status != "Reversed")
+ {
+ $error_msg .= 'Funds have not been cleared yet. Transaction will be processed when the funds clear!';
+ $this->debug_log($error_msg,false);
+ return false;
+ }
+ }
+
+ //Check txn type
+ if ($transaction_type == "new_case") {
+ $this->debug_log('This is a dispute case. Nothing to do here.', true);
+ return true;
+ }
+
+ $custom = $this->ipn_data['custom'];
+ $delimiter = "&";
+ $customvariables = array();
+
+ $namevaluecombos = explode($delimiter, $custom);
+ foreach ($namevaluecombos as $keyval_unparsed)
+ {
+ $equalsignposition = strpos($keyval_unparsed, '=');
+ if ($equalsignposition === false)
+ {
+ $customvariables[$keyval_unparsed] = '';
+ continue;
+ }
+ $key = substr($keyval_unparsed, 0, $equalsignposition);
+ $value = substr($keyval_unparsed, $equalsignposition + 1);
+ $customvariables[$key] = $value;
+ }
+
+ //Handle refunds
+ if ($gross_total < 0)
+ {
+ // This is a refund or reversal
+ $this->debug_log('This is a refund notification. Refund amount: '.$gross_total,true);
+ swpm_handle_subsc_cancel_stand_alone($this->ipn_data,true);
+ return true;
+ }
+ if (isset($this->ipn_data['reason_code']) && $this->ipn_data['reason_code'] == 'refund'){
+ $this->debug_log('This is a refund notification. Refund amount: '.$gross_total,true);
+ swpm_handle_subsc_cancel_stand_alone($this->ipn_data,true);
+ return true;
+ }
+
+ if (($transaction_type == "subscr_signup"))
+ {
+ $this->debug_log('Subscription signup IPN received... nothing to do here(handled by the subscription IPN handler)',true);
+ // Code to handle the signup IPN for subscription
+ $subsc_ref = $customvariables['subsc_ref'];
+
+ if (!empty($subsc_ref))
+ {
+ $this->debug_log('swpm integration is being used... creating member account... see the "subscription_handle_debug.log" file for details',true);
+ $swpm_id = $customvariables['swpm_id'];
+ swpm_handle_subsc_signup_stand_alone($this->ipn_data,$subsc_ref,$this->ipn_data['subscr_id'],$swpm_id);
+ //Handle customized subscription signup
+ }
+ return true;
+ }
+ else if (($transaction_type == "subscr_cancel") || ($transaction_type == "subscr_eot") || ($transaction_type == "subscr_failed"))
+ {
+ // Code to handle the IPN for subscription cancellation
+ swpm_handle_subsc_cancel_stand_alone($this->ipn_data);
+ $this->debug_log('Subscription cancellation IPN received... nothing to do here(handled by the subscription IPN handler)',true);
+ return true;
+ }
+ else
+ {
+ $cart_items = array();
+ $this->debug_log('Transaction Type: Buy Now/Subscribe',true);
+ $item_number = $this->ipn_data['item_number'];
+ $item_name = $this->ipn_data['item_name'];
+ $quantity = $this->ipn_data['quantity'];
+ $mc_gross = $this->ipn_data['mc_gross'];
+ $mc_currency = $this->ipn_data['mc_currency'];
+
+ $current_item = array(
+ 'item_number' => $item_number,
+ 'item_name' => $item_name,
+ 'quantity' => $quantity,
+ 'mc_gross' => $mc_gross,
+ 'mc_currency' => $mc_currency,
+ );
+
+ array_push($cart_items, $current_item);
+ }
+
+ $counter = 0;
+ foreach ($cart_items as $current_cart_item)
+ {
+ $cart_item_data_num = $current_cart_item['item_number'];
+ $cart_item_data_name = trim($current_cart_item['item_name']);
+ $cart_item_data_quantity = $current_cart_item['quantity'];
+ $cart_item_data_total = $current_cart_item['mc_gross'];
+ $cart_item_data_currency = $current_cart_item['mc_currency'];
+ if(empty($cart_item_data_quantity))
+ {
+ $cart_item_data_quantity = 1;
+ }
+ $this->debug_log('Item Number: '.$cart_item_data_num,true);
+ $this->debug_log('Item Name: '.$cart_item_data_name,true);
+ $this->debug_log('Item Quantity: '.$cart_item_data_quantity,true);
+ $this->debug_log('Item Total: '.$cart_item_data_total,true);
+ $this->debug_log('Item Currency: '.$cart_item_data_currency,true);
+
+
+ //*** Handle Membership Payment ***
+ //--------------------------------------------------------------------------------------
+ // ========= Need to find the (level ID) in the custom variable ============
+ $subsc_ref = $customvariables['subsc_ref'];//Membership level ID
+ $this->debug_log('Membership payment paid for membership level ID: '.$subsc_ref,true);
+ if (!empty($subsc_ref))
+ {
+ $swpm_id = "";
+ if(isset($customvariables['swpm_id'])){
+ $swpm_id = $customvariables['swpm_id'];
+ }
+ if ($transaction_type == "web_accept")
+ {
+ $this->debug_log('swpm integration is being used... creating member account... see the "subscription_handle_debug.log" file for details',true);
+ swpm_handle_subsc_signup_stand_alone($this->ipn_data,$subsc_ref,$this->ipn_data['txn_id'],$swpm_id);
+ }
+ else if($transaction_type == "subscr_payment"){
+ //swpm_update_member_subscription_start_date_if_applicable($this->ipn_data);
+ }
+ }
+ else
+ {
+ $this->debug_log('Membership level ID is missing in the payment notification! Cannot process this notification.',false);
+ }
+ //== End of Membership payment handling ==
+ $counter++;
+ }
+
+ /*** Do Post payment operation and cleanup ***/
+ //Save the transaction data
+ $this->debug_log('Saving transaction data to the database table.', true);
+ $this->ipn_data['gateway'] = 'paypal';
+ $this->ipn_data['status'] = $this->ipn_data['payment_status'];
+ BTransactions::save_txn_record($this->ipn_data, $cart_items);
+ $this->debug_log('Transaction data saved.', true);
+
+
+ //WP Affiliate Plugin integration
+ if (function_exists('wp_aff_platform_install'))
+ {
+ $this->debug_log('WP Affiliate Platform is installed, checking if custom field has affiliate data...',true);
+ //It expects the value of the custom field to be like the following:
+ //
+
+ $custom_field_val = $this->ipn_data['custom'];
+ $this->debug_log('Custom field value: '.$custom_field_val,true);
+ $findme = 'ap_id';
+ $pos = strpos($custom_field_val, $findme);
+ if($pos !== false){
+ parse_str($custom_field_val);
+ $referrer = $ap_id;
+ }else{
+ $this->debug_log('Could not find affiliate ID (ap_id) data in the custom field',true);
+ }
+
+ if(!empty($referrer))
+ {
+ $total_tax = $this->ipn_data['tax'];
+ if(empty($total_tax)){$total_tax = 0;}
+ $total_shipping = 0;
+ if(!empty($this->ipn_data['shipping'])){
+ $total_shipping = $this->ipn_data['shipping'];
+ }else if (!empty($this->ipn_data['mc_shipping'])){
+ $total_shipping = $this->ipn_data['mc_shipping'];
+ }
+ $gross_sale_amt = $this->ipn_data['mc_gross'];
+ $this->debug_log('Gross sale amount: '.$gross_sale_amt.' Tax: '.$total_tax.' Shipping: '.$total_shipping,true);
+ $sale_amount = $gross_sale_amt - $total_shipping - $total_tax;
+
+ $txn_id = $this->ipn_data['txn_id'];
+ $item_id = $this->ipn_data['item_number'];
+ $buyer_email = $this->ipn_data['payer_email'];
+ $buyer_name = $this->ipn_data['first_name'] . " " .$this->ipn_data['last_name'];
+ wp_aff_award_commission_unique($referrer,$sale_amount,$txn_id,$item_id,$buyer_email,'','',$buyer_name);
+ $aff_details_debug = "Referrer: ".$referrer." Sale Amt: ".$sale_amount." Buyer Email: ".$buyer_email." Txn ID: ".$txn_id;
+ $this->debug_log('Affiliate Commission Details => '.$aff_details_debug,true);
+ }
+ else
+ {
+ $this->debug_log("Referrer value is empty! No commission will be awarded for this sale",true);
+ }
+
+ do_action('swpm_paypal_ipn_processed', $this->ipn_data);
+ }
+ return true;
+ }
+
+ function swpm_validate_ipn()
+ {
+ // parse the paypal URL
+ $url_parsed=parse_url($this->paypal_url);
+
+ // generate the post string from the _POST vars aswell as load the _POST vars into an arry
+ $post_string = '';
+ foreach ($_POST as $field=>$value) {
+ $this->ipn_data["$field"] = $value;
+ $post_string .= $field.'='.urlencode(stripslashes($value)).'&';
+ }
+
+ $this->post_string = $post_string;
+ $this->debug_log('Post string : '. $this->post_string,true);
+
+ $post_string.="cmd=_notify-validate"; // append ipn command
+
+ // open the connection to paypal
+ if($this->sandbox_mode){//connect to PayPal sandbox
+ $uri = 'ssl://'.$url_parsed['host'];
+ $port = '443';
+ $fp = fsockopen($uri,$port,$err_num,$err_str,30);
+ }
+ else{//connect to live PayPal site using standard approach
+ $fp = fsockopen($url_parsed['host'],"80",$err_num,$err_str,30);
+ }
+
+ if(!$fp)
+ {
+ // could not open the connection. If loggin is on, the error message
+ // will be in the log.
+ $this->debug_log('Connection to '.$url_parsed['host']." failed.fsockopen error no. $errnum: $errstr",false);
+ return false;
+
+ }
+ else
+ {
+ // Post the data back to paypal
+ fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n");
+ fputs($fp, "Host: $url_parsed[host]\r\n");
+ fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
+ fputs($fp, "Content-length: ".strlen($post_string)."\r\n");
+ fputs($fp, "Connection: close\r\n\r\n");
+ fputs($fp, $post_string . "\r\n\r\n");
+
+ // loop through the response from the server and append to variable
+ while(!feof($fp)) {
+ $this->ipn_response .= fgets($fp, 1024);
+ }
+
+ fclose($fp); // close connection
+
+ $this->debug_log('Connection to '.$url_parsed['host'].' successfuly completed.',true);
+ }
+
+ //if (eregi("VERIFIED",$this->ipn_response))
+ if (strpos($this->ipn_response, "VERIFIED") !== false)
+ {
+ // Valid IPN transaction.
+ $this->debug_log('IPN successfully verified.',true);
+ return true;
+
+ }
+ else
+ {
+ // Invalid IPN transaction. Check the log for details.
+ $this->debug_log('IPN validation failed.',false);
+ return false;
+ }
+ }
+
+ function debug_log($message,$success,$end=false)
+ {
+ BLog::log_simple_debug($message, $success, $end);
+ }
+}
+
+// Start of IPN handling (script execution)
+
+$ipn_handler_instance = new swpm_paypal_ipn_handler();
+
+$settings = BSettings::get_instance();
+$debug_enabled = $settings->get_value('enable-debug');
+if(!empty($debug_enabled))//debug is enabled in the system
+{
+ $debug_log = "log.txt"; // Debug log file name
+ echo 'Debug logging is enabled. Check the '.$debug_log.' file for debug output.';
+ $ipn_handler_instance->ipn_log = true;
+ $ipn_handler_instance->ipn_log_file = $debug_log;
+ if(empty($_POST))
+ {
+ $ipn_handler_instance->debug_log('This debug line was generated because you entered the URL of the ipn handling script in the browser.',true,true);
+ exit;
+ }
+}
+
+$sandbox_enabled = $settings->get_value('enable-sandbox-testing');
+if(!empty($sandbox_enabled)) // Sandbox testing enabled
+{
+ $ipn_handler_instance->paypal_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
+ $ipn_handler_instance->sandbox_mode = true;
+}
+
+$ipn_handler_instance->debug_log('Paypal Class Initiated by '.$_SERVER['REMOTE_ADDR'],true);
+
+// Validate the IPN
+if ($ipn_handler_instance->swpm_validate_ipn())
+{
+ $ipn_handler_instance->debug_log('Creating product Information to send.',true);
+
+ if(!$ipn_handler_instance->swpm_validate_and_create_membership()){
+ $ipn_handler_instance->debug_log('IPN product validation failed.',false);
+ }
+}
+$ipn_handler_instance->debug_log('Paypal class finished.',true,true);
diff --git a/ipn/swpm_handle_subsc_ipn.php b/ipn/swpm_handle_subsc_ipn.php
new file mode 100644
index 0000000..45b9a5d
--- /dev/null
+++ b/ipn/swpm_handle_subsc_ipn.php
@@ -0,0 +1,222 @@
+prefix . "swpm_members_tbl";
+ $membership_level_table = $wpdb->prefix . "swpm_membership_tbl";
+ $membership_level = $subsc_ref;
+
+ if(empty($swpm_id))
+ {
+ //Lets try to find an existing user profile for this payment
+ $email = $ipn_data['payer_email'];
+ $query_db = $wpdb->get_row($wpdb->prepare("SELECT * FROM $members_table_name WHERE email = %s", $email), OBJECT);
+ if(!$query_db){//try to retrieve the member details based on the unique_ref
+ swpm_debug_log_subsc("Could not find any record using the given email address (".$email."). Attempting to query database using the unique reference: ".$unique_ref,true);
+ if(!empty($unique_ref)){
+ $query_db = $wpdb->get_row($wpdb->prepare("SELECT * FROM $members_table_name WHERE subscr_id = %s", $unique_ref), OBJECT);
+ $swpm_id = $query_db->member_id;
+ }
+ else{
+ swpm_debug_log_subsc("Unique reference is missing in the notification so we have to assume that this is not a payment for an existing member.",true);
+ }
+ }
+ else
+ {
+ $swpm_id = $query_db->member_id;
+ swpm_debug_log_subsc("Found a match in the member database. Member ID: ".$swpm_id,true);
+ }
+ }
+
+ if (!empty($swpm_id))
+ {
+ //This is payment from an existing member/user. Update the existing member account
+ swpm_debug_log_subsc("Modifying the existing membership profile... Member ID: ".$swpm_id,true);
+
+ //Upgrade the member account
+ $account_state = 'active';//This is renewal or upgrade of a previously active account. So the status should be set to active
+ $subscription_starts = (date ("Y-m-d"));
+ $subscr_id = $unique_ref;
+
+ $resultset = $wpdb->get_row($wpdb->prepare("SELECT * FROM $members_table_name where member_id=%d", $swpm_id), OBJECT);
+ if(!$resultset){
+ swpm_debug_log_subsc("ERROR! Could not find a member account record for the given Member ID: ".$swpm_id,false);
+ return;
+ }
+ $old_membership_level = $resultset->membership_level;
+
+ swpm_debug_log_subsc("Not using secondary membership level feature... upgrading the current membership level.",true);
+ $updatedb = $wpdb->prepare("UPDATE $members_table_name SET account_state=%s, membership_level=%d,subscription_starts=%s,subscr_id=%s WHERE member_id=%d", $account_state, $membership_level, $subscription_starts, $subscr_id, $swpm_id);
+ $results = $wpdb->query($updatedb);
+ do_action('swpm_membership_changed', array('member_id'=>$swpm_id, 'from_level'=>$old_membership_level, 'to_level'=>$membership_level));
+
+ //Set Email details for the account upgrade notification
+ $email = $ipn_data['payer_email'];
+ $subject = $settings->get_value('upgrade-complete-mail-subject');
+ if (empty($subject)){
+ $subject = "Member Account Upgraded";
+ }
+ $body = $settings->get_value('upgrade-complete-mail-body');
+ if (empty($body)){
+ $body = "Your account has been upgraded successfully";
+ }
+ $from_address = get_option('admin_email');
+ $login_link = $settings->get_value('login-page-url');
+
+ $tags1 = array("{first_name}","{last_name}","{user_name}","{login_link}");
+ $vals1 = array($resultset->first_name,$resultset->last_name,$resultset->user_name,$login_link);
+ $email_body = str_replace($tags1,$vals1,$body);
+ $headers = 'From: '.$from_address . "\r\n";
+ }// End of existing user account upgrade
+ else
+ {
+ $default_account_status = $settings->get_value('default-account-status', 'active');
+ // create new member account
+ $data = array();
+ $data['user_name'] ='';
+ $data['password'] = '';
+
+ $data['first_name'] = $ipn_data['first_name'];
+ $data['last_name'] = $ipn_data['last_name'];
+ $data['email'] = $ipn_data['payer_email'];
+ $data['membership_level'] = $membership_level;
+ $data['subscr_id'] = $unique_ref;
+ $data['gender'] = 'not specified';
+
+ swpm_debug_log_subsc("Creating new member account. Membership level ID: ".$membership_level,true);
+
+ $data['address_street'] = $ipn_data['address_street'];
+ $data['address_city'] = $ipn_data['address_city'];
+ $data['address_state'] = $ipn_data['address_state'];
+ $data['address_zipcode'] = $ipn_data['address_zip'];
+ $data['country'] = $ipn_data['address_country'];
+ $data['member_since'] = $data['subscription_starts'] = $data['last_accessed'] = date ("Y-m-d");
+ $data['account_state'] = $default_account_status;
+ $reg_code = uniqid();//rand(10, 1000);
+ $md5_code = md5($reg_code);
+ $data['reg_code'] = $md5_code;
+ $data['referrer'] = $data['extra_info'] = $data['txn_id'] = '';
+ $data['subscr_id']= $subscr_id;
+
+ $wpdb->insert($members_table_name, $data);//Create the member record
+ $results = $wpdb->get_row($wpdb->prepare("SELECT * FROM $members_table_name where subscr_id=%s and reg_code=%s",$subscr_id, $md5_code), OBJECT);
+ $id = $results->member_id; //Alternatively use $wpdb->insert_id;
+ if(empty($id)){
+ swpm_debug_log_subsc("Error! Failed to insert a new member record. This request will fail.",false);
+ return;
+ }
+
+ $separator='?';
+ $url = $settings->get_value('registration-page-url');
+ if(strpos($url,'?')!==false){$separator='&';}
+
+ $reg_url = $url.$separator.'member_id='.$id.'&code='.$md5_code;
+ swpm_debug_log_subsc("Member signup URL: ".$reg_url,true);
+
+ $subject = $settings->get_value('reg-prompt-complete-mail-subject');
+ if (empty($subject)){
+ $subject = "Please complete your registration";
+ }
+ $body = $settings->get_value('reg-prompt-complete-mail-body');
+ if (empty($body)){
+ $body = "Please use the following link to complete your registration. \n {reg_link}";
+ }
+ $from_address = $settings->get_value('email-from');
+
+ $tags = array("{first_name}","{last_name}","{reg_link}");
+ $vals = array($data['first_name'],$data['last_name'],$reg_url);
+ $email_body = str_replace($tags,$vals,$body);
+ $headers = 'From: '.$from_address . "\r\n";
+ }
+
+ wp_mail($email,$subject,$email_body,$headers);
+ swpm_debug_log_subsc("Member signup/upgrade completion email successfully sent to: ".$email,true);
+}
+
+function swpm_handle_subsc_cancel_stand_alone($ipn_data,$refund=false)
+{
+ if($refund)
+ {
+ $subscr_id = $ipn_data['parent_txn_id'];
+ swpm_debug_log_subsc("Refund notification check - check if a member account needs to be deactivated... parent_txn_id: ".$ipn_data['parent_txn_id'],true);
+ }
+ else
+ {
+ $subscr_id = $ipn_data['subscr_id'];
+ }
+
+ if(empty($subscr_id)){
+ swpm_debug_log_subsc("No subscr_id associated with this transaction. Nothing to do here.",true);
+ return;
+ }
+
+ global $wpdb;
+ $members_table_name = $wpdb->prefix . "swpm_members_tbl";
+
+ swpm_debug_log_subsc("Retrieving member account from the database. Subscr_id: ".$subscr_id, true);
+ $resultset = $wpdb->get_row($wpdb->prepare("SELECT * FROM $members_table_name where subscr_id=%s", $subscr_id), OBJECT);
+ if($resultset)
+ {
+ //Deactivate this account as it is a refund or cancellation
+ $member_id = $resultset->member_id;
+ $account_state = 'inactive';
+ $updatedb = $wpdb->prepare("UPDATE $members_table_name SET account_state=%s WHERE member_id=%s", $account_state, $member_id);
+ $resultset = $wpdb->query($updatedb);
+ swpm_debug_log_subsc("Subscription cancellation received! Member account deactivated. Member ID: ".$member_id, true);
+ }
+ else
+ {
+ swpm_debug_log_subsc("No member found for the given subscriber ID: ".$subscr_id,false);
+ return;
+ }
+}
+
+function swpm_update_member_subscription_start_date_if_applicable($ipn_data)
+{
+ global $wpdb;
+ $members_table_name = $wpdb->prefix . "swpm_members_tbl";
+ $membership_level_table = $wpdb->prefix . "swpm_membership_tbl";
+ $email = $ipn_data['payer_email'];
+ $subscr_id = $ipn_data['subscr_id'];
+ $account_state = BSettings::get_instance()->get_value('default-account-status', 'active');
+ swpm_debug_log_subsc("Updating subscription start date if applicable for this subscription payment. Subscriber ID: ".$subscr_id." Email: ".$email,true);
+
+ //We can also query using the email address
+ $query_db = $wpdb->get_row($wpdb->prepare("SELECT * FROM $members_table_name WHERE subscr_id = %s", $subscr_id), OBJECT);
+ if($query_db){
+ $swpm_id = $query_db->member_id;
+ $current_primary_level = $query_db->membership_level;
+ swpm_debug_log_subsc("Found a record in the member table. The Member ID of the account to check is: ".$swpm_id." Membership Level: ".$current_primary_level,true);
+
+ $subscription_starts = (date ("Y-m-d"));
+
+ $updatedb = $wpdb->prepare("UPDATE $members_table_name SET account_state=%s,subscription_starts=%s WHERE member_id=%d", $account_state, $subscription_starts, $swpm_id);
+ $resultset = $wpdb->query($updatedb);
+ swpm_debug_log_subsc("Updated the member profile with current date as the subscription start date.",true);
+ }else{
+ swpm_debug_log_subsc("Did not find a record in the members table for subscriber ID: ".$subscr_id,true);
+ }
+}
+
+function swpm_debug_log_subsc($message,$success,$end=false)
+{
+ $settings = BSettings::get_instance();
+ $debug_enabled = $settings->get_value('enable-debug');
+ if (empty($debug_enabled)) {//Debug is not enabled
+ return;
+ }
+
+ $debug_log_file_name = SIMPLE_WP_MEMBERSHIP_PATH . 'log.txt';
+
+ // Timestamp
+ $text = '['.date('m/d/Y g:i A').'] - '.(($success)?'SUCCESS :':'FAILURE :').$message. "\n";
+ if ($end) {
+ $text .= "\n------------------------------------------------------------------\n\n";
+ }
+ // Write to log
+ $fp=fopen($debug_log_file_name,'a');
+ fwrite($fp, $text );
+ fclose($fp); // close file
+}
diff --git a/js/index.html b/js/index.html
new file mode 100644
index 0000000..e69de29
diff --git a/js/jquery.tools18.min.js b/js/jquery.tools18.min.js
new file mode 100644
index 0000000..5a50446
--- /dev/null
+++ b/js/jquery.tools18.min.js
@@ -0,0 +1,51 @@
+/*!
+ * jQuery Tools v1.2.5 - The missing UI library for the Web
+ *
+ * dateinput/dateinput.js
+ * overlay/overlay.js
+ * overlay/overlay.apple.js
+ * rangeinput/rangeinput.js
+ * scrollable/scrollable.js
+ * scrollable/scrollable.autoscroll.js
+ * scrollable/scrollable.navigator.js
+ * tabs/tabs.js
+ * tabs/tabs.slideshow.js
+ * toolbox/toolbox.expose.js
+ * toolbox/toolbox.flashembed.js
+ * toolbox/toolbox.history.js
+ * toolbox/toolbox.mousewheel.js
+ * tooltip/tooltip.js
+ * tooltip/tooltip.dynamic.js
+ * tooltip/tooltip.slide.js
+ * validator/validator.js
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/
+ *
+ * jquery.event.wheel.js - rev 1
+ * Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
+ * Liscensed under the MIT License (MIT-LICENSE.txt)
+ * http://www.opensource.org/licenses/mit-license.php
+ * Created: 2008-07-01 | Updated: 2008-07-14
+ *
+ * -----
+ *
+ */
+(function(a){a.tools=a.tools||{version:"v1.2.5"};var b=[],c,d=[75,76,38,39,74,72,40,37],e={};c=a.tools.dateinput={conf:{format:"mm/dd/yy",selectors:!1,yearRange:[-5,5],lang:"en",offset:[0,0],speed:0,firstDay:0,min:undefined,max:undefined,trigger:!1,css:{prefix:"cal",input:"date",root:0,head:0,title:0,prev:0,next:0,month:0,year:0,days:0,body:0,weeks:0,today:0,current:0,week:0,off:0,sunday:0,focus:0,disabled:0,trigger:0}},localize:function(b,c){a.each(c,function(a,b){c[a]=b.split(",")}),e[b]=c}},c.localize("en",{months:"January,February,March,April,May,June,July,August,September,October,November,December",shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",days:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",shortDays:"Sun,Mon,Tue,Wed,Thu,Fri,Sat"});function f(a,b){return 32-(new Date(a,b,32)).getDate()}function g(a,b){a=""+a,b=b||2;while(a.length
");function j(a,b,c){var d=a.getDate(),f=a.getDay(),j=a.getMonth(),k=a.getFullYear(),l={d:d,dd:g(d),ddd:e[c].shortDays[f],dddd:e[c].days[f],m:j+1,mm:g(j+1),mmm:e[c].shortMonths[j],mmmm:e[c].months[j],yy:String(k).slice(2),yyyy:k},m=b.replace(h,function(a){return a in l?l[a]:a.slice(1,a.length-1)});return i.html(m).html()}function k(a){return parseInt(a,10)}function l(a,b){return a.getFullYear()===b.getFullYear()&&a.getMonth()==b.getMonth()&&a.getDate()==b.getDate()}function m(a){if(a){if(a.constructor==Date)return a;if(typeof a=="string"){var b=a.split("-");if(b.length==3)return new Date(k(b[0]),k(b[1])-1,k(b[2]));if(!/^-?\d+$/.test(a))return;a=k(a)}var c=new Date;c.setDate(c.getDate()+a);return c}}function n(c,g){var h=this,i=new Date,n=g.css,o=e[g.lang],p=a("#"+n.root),q=p.find("#"+n.title),r,s,t,u,v,w,x=c.attr("data-value")||g.value||c.val(),y=c.attr("min")||g.min,z=c.attr("max")||g.max,A;y===0&&(y="0"),x=m(x)||i,y=m(y||g.yearRange[0]*365),z=m(z||g.yearRange[1]*365);if(!o)throw"Dateinput: invalid language: "+g.lang;if(c.attr("type")=="date"){var B=a(" ");a.each("class,disabled,id,maxlength,name,readonly,required,size,style,tabindex,title,value".split(","),function(a,b){B.attr(b,c.attr(b))}),c.replaceWith(B),c=B}c.addClass(n.input);var C=c.add(h);if(!p.length){p=a("").hide().css({position:"absolute"}).attr("id",n.root),p.children().eq(0).attr("id",n.head).end().eq(1).attr("id",n.body).children().eq(0).attr("id",n.days).end().eq(1).attr("id",n.weeks).end().end().end().find("a").eq(0).attr("id",n.prev).end().eq(1).attr("id",n.next),q=p.find("#"+n.head).find("div").attr("id",n.title);if(g.selectors){var D=a(" ").attr("id",n.month),E=a(" ").attr("id",n.year);q.html(D.add(E))}var F=p.find("#"+n.days);for(var G=0;G<7;G++)F.append(a(" ").text(o.shortDays[(G+g.firstDay)%7]));a("body").append(p)}g.trigger&&(r=a(" ").attr("href","#").addClass(n.trigger).click(function(a){h.show();return a.preventDefault()}).insertAfter(c));var H=p.find("#"+n.weeks);E=p.find("#"+n.year),D=p.find("#"+n.month);function I(b,d,e){x=b,u=b.getFullYear(),v=b.getMonth(),w=b.getDate(),e=e||a.Event("api"),e.type="change",C.trigger(e,[b]);e.isDefaultPrevented()||(c.val(j(b,d.format,d.lang)),c.data("date",b),h.hide(e))}function J(b){b.type="onShow",C.trigger(b),a(document).bind("keydown.d",function(b){if(b.ctrlKey)return!0;var e=b.keyCode;if(e==8){c.val("");return h.hide(b)}if(e==27)return h.hide(b);if(a(d).index(e)>=0){if(!A){h.show(b);return b.preventDefault()}var f=a("#"+n.weeks+" a"),g=a("."+n.focus),i=f.index(g);g.removeClass(n.focus);if(e==74||e==40)i+=7;else if(e==75||e==38)i-=7;else if(e==76||e==39)i+=1;else if(e==72||e==37)i-=1;i>41?(h.addMonth(),g=a("#"+n.weeks+" a:eq("+(i-42)+")")):i<0?(h.addMonth(-1),g=a("#"+n.weeks+" a:eq("+(i+42)+")")):g=f.eq(i),g.addClass(n.focus);return b.preventDefault()}if(e==34)return h.addMonth();if(e==33)return h.addMonth(-1);if(e==36)return h.today();e==13&&(a(b.target).is("select")||a("."+n.focus).click());return a([16,17,18,9]).index(e)>=0}),a(document).bind("click.d",function(b){var d=b.target;!a(d).parents("#"+n.root).length&&d!=c[0]&&(!r||d!=r[0])&&(d!=document)&&h.hide(b)})}a.extend(h,{show:function(d){if(!(c.attr("readonly")||c.attr("disabled")||A)){d=d||a.Event(),d.type="onBeforeShow",C.trigger(d);if(d.isDefaultPrevented())return;a.each(b,function(){this.hide()}),A=!0,D.unbind("change").change(function(){h.setValue(E.val(),a(this).val())}),E.unbind("change").change(function(){h.setValue(a(this).val(),D.val())}),s=p.find("#"+n.prev).unbind("click").click(function(a){s.hasClass(n.disabled)||h.addMonth(-1);return!1}),t=p.find("#"+n.next).unbind("click").click(function(a){t.hasClass(n.disabled)||h.addMonth();return!1}),h.setValue(x);var e=c.offset();/iPad/i.test(navigator.userAgent)&&(e.top-=a(window).scrollTop()),p.css({top:e.top+c.outerHeight(true)+g.offset[0],left:e.left+g.offset[1]}),g.speed?p.show(g.speed,function(){J(d)}):(p.show(),J(d));return h}},setValue:function(b,c,d){var e=k(c)>=-1?new Date(k(b),k(c),k(d||1)):b||x;ez&&(e=z),b=e.getFullYear(),c=e.getMonth(),d=e.getDate(),c==-1?(c=11,b--):c==12&&(c=0,b++);if(!A){I(e,g);return h}v=c,u=b;var j=new Date(b,c,1-g.firstDay),m=j.getDay(),p=f(b,c),r=f(b,c-1),w;if(g.selectors){D.empty(),a.each(o.months,function(c,d){ynew Date(b,c,0)&&D.append(a(" ").html(d).attr("value",c))}),E.empty();var B=i.getFullYear();for(var C=B+g.yearRange[0];Cnew Date(C,0,0)&&E.append(a(" ").text(C));D.val(c),E.val(b)}else q.html(o.months[c]+" "+b);H.empty(),s.add(t).removeClass(n.disabled);for(var F=m?0:-7,G,J;F<(m?42:35);F++)G=a(" "),F%7===0&&(w=a("
").addClass(n.week),H.append(w)),Fz&&G.add(t).addClass(n.disabled),G.attr("href","#"+J).text(J).data("date",e),w.append(G);H.find("a").click(function(b){var c=a(this);c.hasClass(n.disabled)||(a("#"+n.current).removeAttr("id"),c.attr("id",n.current),I(c.data("date"),g,b));return!1}),n.sunday&&H.find(n.week).each(function(){var b=g.firstDay?7-g.firstDay:0;a(this).children().slice(b,b+1).addClass(n.sunday)});return h},setMin:function(a,b){y=m(a),b&&xz&&h.setValue(z);return h},today:function(){return h.setValue(i)},addDay:function(a){return this.setValue(u,v,w+(a||1))},addMonth:function(a){return this.setValue(u,v+(a||1),w)},addYear:function(a){return this.setValue(u+(a||1),v,w)},hide:function(b){if(A){b=a.Event(),b.type="onHide",C.trigger(b),a(document).unbind("click.d").unbind("keydown.d");if(b.isDefaultPrevented())return;p.hide(),A=!1}return h},getConf:function(){return g},getInput:function(){return c},getCalendar:function(){return p},getValue:function(a){return a?j(x,a,g.lang):x},isOpen:function(){return A}}),a.each(["onBeforeShow","onShow","change","onHide"],function(b,c){a.isFunction(g[c])&&a(h).bind(c,g[c]),h[c]=function(b){b&&a(h).bind(c,b);return h}}),c.bind("focus click",h.show).keydown(function(b){var c=b.keyCode;if(!A&&a(d).index(c)>=0){h.show(b);return b.preventDefault()}return b.shiftKey||b.ctrlKey||b.altKey||c==9?!0:b.preventDefault()}),m(c.val())&&I(x,g)}a.expr[":"].date=function(b){var c=b.getAttribute("type");return c&&c=="date"||a(b).data("dateinput")},a.fn.dateinput=function(d){if(this.data("dateinput"))return this;d=a.extend(!0,{},c.conf,d),a.each(d.css,function(a,b){!b&&a!="prefix"&&(d.css[a]=(d.css.prefix||"")+(b||a))});var e;this.each(function(){var c=new n(a(this),d);b.push(c);var f=c.getInput().data("dateinput",c);e=e?e.add(f):f});return e?e:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.5"},a.tools.overlay={addEffect:function(a,b,d){c[a]=[b,d]},conf:{close:null,closeOnClick:!0,closeOnEsc:!0,closeSpeed:"fast",effect:"default",fixed:!a.browser.msie||a.browser.version>6,left:"center",load:!1,mask:null,oneInstance:!0,speed:"normal",target:null,top:"10%"}};var b=[],c={};a.tools.overlay.addEffect("default",function(b,c){var d=this.getConf(),e=a(window);d.fixed||(b.top+=e.scrollTop(),b.left+=e.scrollLeft()),b.position=d.fixed?"fixed":"absolute",this.getOverlay().css(b).fadeIn(d.speed,c)},function(a){this.getOverlay().fadeOut(this.getConf().closeSpeed,a)});function d(d,e){var f=this,g=d.add(f),h=a(window),i,j,k,l=a.tools.expose&&(e.mask||e.expose),m=Math.random().toString().slice(10);l&&(typeof l=="string"&&(l={color:l}),l.closeOnClick=l.closeOnEsc=!1);var n=e.target||d.attr("rel");j=n?a(n):null||d;if(!j.length)throw"Could not find Overlay: "+n;d&&d.index(j)==-1&&d.click(function(a){f.load(a);return a.preventDefault()}),a.extend(f,{load:function(d){if(f.isOpened())return f;var i=c[e.effect];if(!i)throw"Overlay: cannot find effect : \""+e.effect+"\"";e.oneInstance&&a.each(b,function(){this.close(d)}),d=d||a.Event(),d.type="onBeforeLoad",g.trigger(d);if(d.isDefaultPrevented())return f;k=!0,l&&a(j).expose(l);var n=e.top,o=e.left,p=j.outerWidth(true),q=j.outerHeight(true);typeof n=="string"&&(n=n=="center"?Math.max((h.height()-q)/2,0):parseInt(n,10)/100*h.height()),o=="center"&&(o=Math.max((h.width()-p)/2,0)),i[0].call(f,{top:n,left:o},function(){k&&(d.type="onLoad",g.trigger(d))}),l&&e.closeOnClick&&a.mask.getMask().one("click",f.close),e.closeOnClick&&a(document).bind("click."+m,function(b){a(b.target).parents(j).length||f.close(b)}),e.closeOnEsc&&a(document).bind("keydown."+m,function(a){a.keyCode==27&&f.close(a)});return f},close:function(b){if(!f.isOpened())return f;b=b||a.Event(),b.type="onBeforeClose",g.trigger(b);if(!b.isDefaultPrevented()){k=!1,c[e.effect][1].call(f,function(){b.type="onClose",g.trigger(b)}),a(document).unbind("click."+m).unbind("keydown."+m),l&&a.mask.close();return f}},getOverlay:function(){return j},getTrigger:function(){return d},getClosers:function(){return i},isOpened:function(){return k},getConf:function(){return e}}),a.each("onBeforeLoad,onStart,onLoad,onBeforeClose,onClose".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}}),i=j.find(e.close||".close"),!i.length&&!e.close&&(i=a(" "),j.prepend(i)),i.click(function(a){f.close(a)}),e.load&&f.load()}a.fn.overlay=function(c){var e=this.data("overlay");if(e)return e;a.isFunction(c)&&(c={onBeforeLoad:c}),c=a.extend(!0,{},a.tools.overlay.conf,c),this.each(function(){e=new d(a(this),c),b.push(e),a(this).data("overlay",e)});return c.api?e:this}})(jQuery);
+(function(a){var b=a.tools.overlay,c=a(window);a.extend(b.conf,{start:{top:null,left:null},fadeInSpeed:"fast",zIndex:9999});function d(a){var b=a.offset();return{top:b.top+a.height()/2,left:b.left+a.width()/2}}var e=function(b,e){var f=this.getOverlay(),g=this.getConf(),h=this.getTrigger(),i=this,j=f.outerWidth(true),k=f.data("img"),l=g.fixed?"fixed":"absolute";if(!k){var m=f.css("backgroundImage");if(!m)throw"background-image CSS property not set for overlay";m=m.slice(m.indexOf("(")+1,m.indexOf(")")).replace(/\"/g,""),f.css("backgroundImage","none"),k=a(" "),k.css({border:0,display:"none"}).width(j),a("body").append(k),f.data("img",k)}var n=g.start.top||Math.round(c.height()/2),o=g.start.left||Math.round(c.width()/2);if(h){var p=d(h);n=p.top,o=p.left}g.fixed?(n-=c.scrollTop(),o-=c.scrollLeft()):(b.top+=c.scrollTop(),b.left+=c.scrollLeft()),k.css({position:"absolute",top:n,left:o,width:0,zIndex:g.zIndex}).show(),b.position=l,f.css(b),k.animate({top:f.css("top"),left:f.css("left"),width:j},g.speed,function(){f.css("zIndex",g.zIndex+1).fadeIn(g.fadeInSpeed,function(){i.isOpened()&&!a(this).index(f)?e.call():f.hide()})}).css("position",l)},f=function(b){var e=this.getOverlay().hide(),f=this.getConf(),g=this.getTrigger(),h=e.data("img"),i={top:f.start.top,left:f.start.left,width:0};g&&a.extend(i,d(g)),f.fixed&&h.css({position:"absolute"}).animate({top:"+="+c.scrollTop(),left:"+="+c.scrollLeft()},0),h.animate(i,f.closeSpeed,b)};b.addEffect("apple",e,f)})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.5"};var b;b=a.tools.rangeinput={conf:{min:0,max:100,step:"any",steps:0,value:0,precision:undefined,vertical:0,keyboard:!0,progress:!1,speed:100,css:{input:"range",slider:"slider",progress:"progress",handle:"handle"}}};var c,d;a.fn.drag=function(b){document.ondragstart=function(){return!1},b=a.extend({x:!0,y:!0,drag:!0},b),c=c||a(document).bind("mousedown mouseup",function(e){var f=a(e.target);if(e.type=="mousedown"&&f.data("drag")){var g=f.position(),h=e.pageX-g.left,i=e.pageY-g.top,j=!0;c.bind("mousemove.drag",function(a){var c=a.pageX-h,e=a.pageY-i,g={};b.x&&(g.left=c),b.y&&(g.top=e),j&&(f.trigger("dragStart"),j=!1),b.drag&&f.css(g),f.trigger("drag",[e,c]),d=f}),e.preventDefault()}else try{d&&d.trigger("dragEnd")}finally{c.unbind("mousemove.drag"),d=null}});return this.data("drag",!0)};function e(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c}function f(a,b){var c=parseInt(a.css(b),10);if(c)return c;var d=a[0].currentStyle;return d&&d.width&&parseInt(d.width,10)}function g(a){var b=a.data("events");return b&&b.onSlide}function h(b,c){var d=this,h=c.css,i=a("").data("rangeinput",d),j,k,l,m,n;b.before(i);var o=i.addClass(h.slider).find("a").addClass(h.handle),p=i.find("div").addClass(h.progress);a.each("min,max,step,value".split(","),function(a,d){var e=b.attr(d);parseFloat(e)&&(c[d]=parseFloat(e,10))});var q=c.max-c.min,r=c.step=="any"?0:c.step,s=c.precision;if(s===undefined)try{s=r.toString().split(".")[1].length}catch(t){s=0}if(b.attr("type")=="range"){var u=a(" ");a.each("class,disabled,id,maxlength,name,readonly,required,size,style,tabindex,title,value".split(","),function(a,c){u.attr(c,b.attr(c))}),u.val(c.value),b.replaceWith(u),b=u}b.addClass(h.input);var v=a(d).add(b),w=!0;function x(a,f,g,h){g===undefined?g=f/m*q:h&&(g-=c.min),r&&(g=Math.round(g/r)*r);if(f===undefined||r)f=g*m/q;if(isNaN(g))return d;f=Math.max(0,Math.min(f,m)),g=f/m*q;if(h||!j)g+=c.min;j&&(h?f=m-f:g=c.max-g),g=e(g,s);var i=a.type=="click";if(w&&k!==undefined&&!i){a.type="onSlide",v.trigger(a,[g,f]);if(a.isDefaultPrevented())return d}var l=i?c.speed:0,t=i?function(){a.type="change",v.trigger(a,[g])}:null;j?(o.animate({top:f},l,t),c.progress&&p.animate({height:m-f+o.width()/2},l)):(o.animate({left:f},l,t),c.progress&&p.animate({width:f+o.width()/2},l)),k=g,n=f,b.val(g);return d}a.extend(d,{getValue:function(){return k},setValue:function(b,c){y();return x(c||a.Event("api"),undefined,b,!0)},getConf:function(){return c},getProgress:function(){return p},getHandle:function(){return o},getInput:function(){return b},step:function(b,e){e=e||a.Event();var f=c.step=="any"?1:c.step;d.setValue(k+f*(b||1),e)},stepUp:function(a){return d.step(a||1)},stepDown:function(a){return d.step(-a||-1)}}),a.each("onSlide,change".split(","),function(b,e){a.isFunction(c[e])&&a(d).bind(e,c[e]),d[e]=function(b){b&&a(d).bind(e,b);return d}}),o.drag({drag:!1}).bind("dragStart",function(){y(),w=g(a(d))||g(b)}).bind("drag",function(a,c,d){if(b.is(":disabled"))return!1;x(a,j?c:d)}).bind("dragEnd",function(a){a.isDefaultPrevented()||(a.type="change",v.trigger(a,[k]))}).click(function(a){return a.preventDefault()}),i.click(function(a){if(b.is(":disabled")||a.target==o[0])return a.preventDefault();y();var c=o.width()/2;x(a,j?m-l-c+a.pageY:a.pageX-l-c)}),c.keyboard&&b.keydown(function(c){if(!b.attr("readonly")){var e=c.keyCode,f=a([75,76,38,33,39]).index(e)!=-1,g=a([74,72,40,34,37]).index(e)!=-1;if((f||g)&&!(c.shiftKey||c.altKey||c.ctrlKey)){f?d.step(e==33?10:1,c):g&&d.step(e==34?-10:-1,c);return c.preventDefault()}}}),b.blur(function(b){var c=a(this).val();c!==k&&d.setValue(c,b)}),a.extend(b[0],{stepUp:d.stepUp,stepDown:d.stepDown});function y(){j=c.vertical||f(i,"height")>f(i,"width"),j?(m=f(i,"height")-f(o,"height"),l=i.offset().top+m):(m=f(i,"width")-f(o,"width"),l=i.offset().left)}function z(){y(),d.setValue(c.value!==undefined?c.value:c.min)}z(),m||a(window).load(z)}a.expr[":"].range=function(b){var c=b.getAttribute("type");return c&&c=="range"||a(b).filter("input").data("rangeinput")},a.fn.rangeinput=function(c){if(this.data("rangeinput"))return this;c=a.extend(!0,{},b.conf,c);var d;this.each(function(){var b=new h(a(this),a.extend(!0,{},c)),e=b.getInput().data("rangeinput",b);d=d?d.add(e):e});return d?d:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.5"},a.tools.scrollable={conf:{activeClass:"active",circular:!1,clonedClass:"cloned",disabledClass:"disabled",easing:"swing",initialIndex:0,item:null,items:".items",keyboard:!0,mousewheel:!1,next:".next",prev:".prev",speed:400,vertical:!1,touch:!0,wheelSpeed:0}};function b(a,b){var c=parseInt(a.css(b),10);if(c)return c;var d=a[0].currentStyle;return d&&d.width&&parseInt(d.width,10)}function c(b,c){var d=a(c);return d.length<2?d:b.parent().find(c)}var d;function e(b,e){var f=this,g=b.add(f),h=b.children(),i=0,j=e.vertical;d||(d=f),h.length>1&&(h=a(e.items,b)),a.extend(f,{getConf:function(){return e},getIndex:function(){return i},getSize:function(){return f.getItems().size()},getNaviButtons:function(){return m.add(n)},getRoot:function(){return b},getItemWrap:function(){return h},getItems:function(){return h.children(e.item).not("."+e.clonedClass)},move:function(a,b){return f.seekTo(i+a,b)},next:function(a){return f.move(1,a)},prev:function(a){return f.move(-1,a)},begin:function(a){return f.seekTo(0,a)},end:function(a){return f.seekTo(f.getSize()-1,a)},focus:function(){d=f;return f},addItem:function(b){b=a(b),e.circular?(h.children("."+e.clonedClass+":last").before(b),h.children("."+e.clonedClass+":first").replaceWith(b.clone().addClass(e.clonedClass))):h.append(b),g.trigger("onAddItem",[b]);return f},seekTo:function(b,c,k){b.jquery||(b*=1);if(e.circular&&b===0&&i==-1&&c!==0)return f;if(!e.circular&&b<0||b>f.getSize()||b<-1)return f;var l=b;b.jquery?b=f.getItems().index(b):l=f.getItems().eq(b);var m=a.Event("onBeforeSeek");if(!k){g.trigger(m,[b,c]);if(m.isDefaultPrevented()||!l.length)return f}var n=j?{top:-l.position().top}:{left:-l.position().left};i=b,d=f,c===undefined&&(c=e.speed),h.animate(n,c,e.easing,k||function(){g.trigger("onSeek",[b])});return f}}),a.each(["onBeforeSeek","onSeek","onAddItem"],function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}});if(e.circular){var k=f.getItems().slice(-1).clone().prependTo(h),l=f.getItems().eq(1).clone().appendTo(h);k.add(l).addClass(e.clonedClass),f.onBeforeSeek(function(a,b,c){if(!a.isDefaultPrevented()){if(b==-1){f.seekTo(k,c,function(){f.end(0)});return a.preventDefault()}b==f.getSize()&&f.seekTo(l,c,function(){f.begin(0)})}}),f.seekTo(0,0,function(){})}var m=c(b,e.prev).click(function(){f.prev()}),n=c(b,e.next).click(function(){f.next()});!e.circular&&f.getSize()>1&&(f.onBeforeSeek(function(a,b){setTimeout(function(){a.isDefaultPrevented()||(m.toggleClass(e.disabledClass,b<=0),n.toggleClass(e.disabledClass,b>=f.getSize()-1))},1)}),e.initialIndex||m.addClass(e.disabledClass)),e.mousewheel&&a.fn.mousewheel&&b.mousewheel(function(a,b){if(e.mousewheel){f.move(b<0?1:-1,e.wheelSpeed||50);return!1}});if(e.touch){var o={};h[0].ontouchstart=function(a){var b=a.touches[0];o.x=b.clientX,o.y=b.clientY},h[0].ontouchmove=function(a){if(a.touches.length==1&&!h.is(":animated")){var b=a.touches[0],c=o.x-b.clientX,d=o.y-b.clientY;f[j&&d>0||!j&&c>0?"next":"prev"](),a.preventDefault()}}}e.keyboard&&a(document).bind("keydown.scrollable",function(b){if(e.keyboard&&!b.altKey&&!b.ctrlKey&&!a(b.target).is(":input")){if(e.keyboard!="static"&&d!=f)return;var c=b.keyCode;if(j&&(c==38||c==40)){f.move(c==38?-1:1);return b.preventDefault()}if(!j&&(c==37||c==39)){f.move(c==37?-1:1);return b.preventDefault()}}}),e.initialIndex&&f.seekTo(e.initialIndex,0,function(){})}a.fn.scrollable=function(b){var c=this.data("scrollable");if(c)return c;b=a.extend({},a.tools.scrollable.conf,b),this.each(function(){c=new e(a(this),b),a(this).data("scrollable",c)});return b.api?c:this}})(jQuery);
+(function(a){var b=a.tools.scrollable;b.autoscroll={conf:{autoplay:!0,interval:3e3,autopause:!0}},a.fn.autoscroll=function(c){typeof c=="number"&&(c={interval:c});var d=a.extend({},b.autoscroll.conf,c),e;this.each(function(){var b=a(this).data("scrollable");b&&(e=b);var c,f=!0;b.play=function(){c||(f=!1,c=setInterval(function(){b.next()},d.interval))},b.pause=function(){c=clearInterval(c)},b.stop=function(){b.pause(),f=!0},d.autopause&&b.getRoot().add(b.getNaviButtons()).hover(b.pause,b.play),d.autoplay&&b.play()});return d.api?e:this}})(jQuery);
+(function(a){var b=a.tools.scrollable;b.navigator={conf:{navi:".navi",naviItem:null,activeClass:"active",indexed:!1,idPrefix:null,history:!1}};function c(b,c){var d=a(c);return d.length<2?d:b.parent().find(c)}a.fn.navigator=function(d){typeof d=="string"&&(d={navi:d}),d=a.extend({},b.navigator.conf,d);var e;this.each(function(){var b=a(this).data("scrollable"),f=d.navi.jquery?d.navi:c(b.getRoot(),d.navi),g=b.getNaviButtons(),h=d.activeClass,i=d.history&&a.fn.history;b&&(e=b),b.getNaviButtons=function(){return g.add(f)};function j(a,c,d){b.seekTo(c);if(i)location.hash&&(location.hash=a.attr("href").replace("#",""));else return d.preventDefault()}function k(){return f.find(d.naviItem||"> *")}function l(b){var c=a("<"+(d.naviItem||"a")+"/>").click(function(c){j(a(this),b,c)}).attr("href","#"+b);b===0&&c.addClass(h),d.indexed&&c.text(b+1),d.idPrefix&&c.attr("id",d.idPrefix+b);return c.appendTo(f)}k().length?k().each(function(b){a(this).click(function(c){j(a(this),b,c)})}):a.each(b.getItems(),function(a){l(a)}),b.onBeforeSeek(function(a,b){setTimeout(function(){if(!a.isDefaultPrevented()){var c=k().eq(b);!a.isDefaultPrevented()&&c.length&&k().removeClass(h).eq(b).addClass(h)}},1)});function m(a,b){var c=k().eq(b.replace("#",""));c.length||(c=k().filter("[href="+b+"]")),c.click()}b.onAddItem(function(a,c){c=l(b.getItems().index(c)),i&&c.history(m)}),i&&k().history(m)});return d.api?e:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.5"},a.tools.tabs={conf:{tabs:"a",current:"current",onBeforeClick:null,onClick:null,effect:"default",initialIndex:0,event:"click",rotate:!1,history:!1},addEffect:function(a,c){b[a]=c}};var b={"default":function(a,b){this.getPanes().hide().eq(a).show(),b.call()},fade:function(a,b){var c=this.getConf(),d=c.fadeOutSpeed,e=this.getPanes();d?e.fadeOut(d):e.hide(),e.eq(a).fadeIn(c.fadeInSpeed,b)},slide:function(a,b){this.getPanes().slideUp(200),this.getPanes().eq(a).slideDown(400,b)},ajax:function(a,b){this.getPanes().eq(0).load(this.getTabs().eq(a).attr("href"),b)}},c;a.tools.tabs.addEffect("horizontal",function(b,d){c||(c=this.getPanes().eq(0).width()),this.getCurrentPane().animate({width:0},function(){a(this).hide()}),this.getPanes().eq(b).animate({width:c},function(){a(this).show(),d.call()})});function d(c,d,e){var f=this,g=c.add(this),h=c.find(e.tabs),i=d.jquery?d:c.children(d),j;h.length||(h=c.children()),i.length||(i=c.parent().find(d)),i.length||(i=a(d)),a.extend(this,{click:function(c,d){var i=h.eq(c);typeof c=="string"&&c.replace("#","")&&(i=h.filter("[href*="+c.replace("#","")+"]"),c=Math.max(h.index(i),0));if(e.rotate){var k=h.length-1;if(c<0)return f.click(k,d);if(c>k)return f.click(0,d)}if(!i.length){if(j>=0)return f;c=e.initialIndex,i=h.eq(c)}if(c===j)return f;d=d||a.Event(),d.type="onBeforeClick",g.trigger(d,[c]);if(!d.isDefaultPrevented()){b[e.effect].call(f,c,function(){d.type="onClick",g.trigger(d,[c])}),j=c,h.removeClass(e.current),i.addClass(e.current);return f}},getConf:function(){return e},getTabs:function(){return h},getPanes:function(){return i},getCurrentPane:function(){return i.eq(j)},getCurrentTab:function(){return h.eq(j)},getIndex:function(){return j},next:function(){return f.click(j+1)},prev:function(){return f.click(j-1)},destroy:function(){h.unbind(e.event).removeClass(e.current),i.find("a[href^=#]").unbind("click.T");return f}}),a.each("onBeforeClick,onClick".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}}),e.history&&a.fn.history&&(a.tools.history.init(h),e.event="history"),h.each(function(b){a(this).bind(e.event,function(a){f.click(b,a);return a.preventDefault()})}),i.find("a[href^=#]").bind("click.T",function(b){f.click(a(this).attr("href"),b)}),location.hash&&e.tabs=="a"&&c.find("[href="+location.hash+"]").length?f.click(location.hash):(e.initialIndex===0||e.initialIndex>0)&&f.click(e.initialIndex)}a.fn.tabs=function(b,c){var e=this.data("tabs");e&&(e.destroy(),this.removeData("tabs")),a.isFunction(c)&&(c={onBeforeClick:c}),c=a.extend({},a.tools.tabs.conf,c),this.each(function(){e=new d(a(this),b,c),a(this).data("tabs",e)});return c.api?e:this}})(jQuery);
+(function(a){var b;b=a.tools.tabs.slideshow={conf:{next:".forward",prev:".backward",disabledClass:"disabled",autoplay:!1,autopause:!0,interval:3e3,clickable:!0,api:!1}};function c(b,c){var d=this,e=b.add(this),f=b.data("tabs"),g,h=!0;function i(c){var d=a(c);return d.length<2?d:b.parent().find(c)}var j=i(c.next).click(function(){f.next()}),k=i(c.prev).click(function(){f.prev()});a.extend(d,{getTabs:function(){return f},getConf:function(){return c},play:function(){if(g)return d;var b=a.Event("onBeforePlay");e.trigger(b);if(b.isDefaultPrevented())return d;g=setInterval(f.next,c.interval),h=!1,e.trigger("onPlay");return d},pause:function(){if(!g)return d;var b=a.Event("onBeforePause");e.trigger(b);if(b.isDefaultPrevented())return d;g=clearInterval(g),e.trigger("onPause");return d},stop:function(){d.pause(),h=!0}}),a.each("onBeforePlay,onPlay,onBeforePause,onPause".split(","),function(b,e){a.isFunction(c[e])&&a(d).bind(e,c[e]),d[e]=function(b){return a(d).bind(e,b)}}),c.autopause&&f.getTabs().add(j).add(k).add(f.getPanes()).hover(d.pause,function(){h||d.play()}),c.autoplay&&d.play(),c.clickable&&f.getPanes().click(function(){f.next()});if(!f.getConf().rotate){var l=c.disabledClass;f.getIndex()||k.addClass(l),f.onBeforeClick(function(a,b){k.toggleClass(l,!b),j.toggleClass(l,b==f.getTabs().length-1)})}}a.fn.slideshow=function(d){var e=this.data("slideshow");if(e)return e;d=a.extend({},b.conf,d),this.each(function(){e=new c(a(this),d),a(this).data("slideshow",e)});return d.api?e:this}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.5"};var b;b=a.tools.expose={conf:{maskId:"exposeMask",loadSpeed:"slow",closeSpeed:"fast",closeOnClick:!0,closeOnEsc:!0,zIndex:9998,opacity:.8,startOpacity:0,color:"#fff",onLoad:null,onClose:null}};function c(){if(a.browser.msie){var b=a(document).height(),c=a(window).height();return[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,b-c<20?c:b]}return[a(document).width(),a(document).height()]}function d(b){if(b)return b.call(a.mask)}var e,f,g,h,i;a.mask={load:function(j,k){if(g)return this;typeof j=="string"&&(j={color:j}),j=j||h,h=j=a.extend(a.extend({},b.conf),j),e=a("#"+j.maskId),e.length||(e=a("
").attr("id",j.maskId),a("body").append(e));var l=c();e.css({position:"absolute",top:0,left:0,width:l[0],height:l[1],display:"none",opacity:j.startOpacity,zIndex:j.zIndex}),j.color&&e.css("backgroundColor",j.color);if(d(j.onBeforeLoad)===!1)return this;j.closeOnEsc&&a(document).bind("keydown.mask",function(b){b.keyCode==27&&a.mask.close(b)}),j.closeOnClick&&e.bind("click.mask",function(b){a.mask.close(b)}),a(window).bind("resize.mask",function(){a.mask.fit()}),k&&k.length&&(i=k.eq(0).css("zIndex"),a.each(k,function(){var b=a(this);/relative|absolute|fixed/i.test(b.css("position"))||b.css("position","relative")}),f=k.css({zIndex:Math.max(j.zIndex+1,i=="auto"?0:i)})),e.css({display:"block"}).fadeTo(j.loadSpeed,j.opacity,function(){a.mask.fit(),d(j.onLoad),g="full"}),g=!0;return this},close:function(){if(g){if(d(h.onBeforeClose)===!1)return this;e.fadeOut(h.closeSpeed,function(){d(h.onClose),f&&f.css({zIndex:i}),g=!1}),a(document).unbind("keydown.mask"),e.unbind("click.mask"),a(window).unbind("resize.mask")}return this},fit:function(){if(g){var a=c();e.css({width:a[0],height:a[1]})}},getMask:function(){return e},isLoaded:function(a){return a?g=="full":g},getConf:function(){return h},getExposed:function(){return f}},a.fn.mask=function(b){a.mask.load(b);return this},a.fn.expose=function(b){a.mask.load(b,this);return this}})(jQuery);
+(function(){var a=document.all,b="http://www.adobe.com/go/getflashplayer",c=typeof jQuery=="function",d=/(\d+)[^\d]+(\d+)[^\d]*(\d*)/,e={width:"100%",height:"100%",id:"_"+(""+Math.random()).slice(9),allowfullscreen:!0,allowscriptaccess:"always",quality:"high",version:[3,0],onFail:null,expressInstall:null,w3c:!1,cachebusting:!1};window.attachEvent&&window.attachEvent("onbeforeunload",function(){__flash_unloadHandler=function(){},__flash_savedUnloadHandler=function(){}});function f(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function g(a,b){var c=[];for(var d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d]));return c}window.flashembed=function(a,b,c){typeof a=="string"&&(a=document.getElementById(a.replace("#","")));if(a){typeof b=="string"&&(b={src:b});return new j(a,f(f({},e),b),c)}};var h=f(window.flashembed,{conf:e,getVersion:function(){var a,b;try{b=navigator.plugins["Shockwave Flash"].description.slice(16)}catch(c){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"),b=a&&a.GetVariable("$version")}catch(e){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),b=a&&a.GetVariable("$version")}catch(f){}}}b=d.exec(b);return b?[b[1],b[3]]:[0,0]},asString:function(a){if(a===null||a===undefined)return null;var b=typeof a;b=="object"&&a.push&&(b="array");switch(b){case"string":a=a.replace(new RegExp("([\"\\\\])","g"),"\\$1"),a=a.replace(/^\s?(\d+\.?\d+)%/,"$1pct");return"\""+a+"\"";case"array":return"["+g(a,function(a){return h.asString(a)}).join(",")+"]";case"function":return"\"function()\"";case"object":var c=[];for(var d in a)a.hasOwnProperty(d)&&c.push("\""+d+"\":"+h.asString(a[d]));return"{"+c.join(",")+"}"}return String(a).replace(/\s/g," ").replace(/\'/g,"\"")},getHTML:function(b,c){b=f({},b);var d="";if(b.w3c||a)d+=" ";b.width=b.height=b.id=b.w3c=b.src=null,b.onFail=b.version=b.expressInstall=null;for(var e in b)b[e]&&(d+=" ");var g="";if(c){for(var i in c)if(c[i]){var j=c[i];g+=i+"="+(/function|object/.test(typeof j)?h.asString(j):j)+"&"}g=g.slice(0,-1),d+=" "}d+=" ";return d},isSupported:function(a){return i[0]>a[0]||i[0]==a[0]&&i[1]>=a[1]}}),i=h.getVersion();function j(c,d,e){if(h.isSupported(d.version))c.innerHTML=h.getHTML(d,e);else if(d.expressInstall&&h.isSupported([6,65]))c.innerHTML=h.getHTML(f(d,{src:d.expressInstall}),{MMredirectURL:location.href,MMplayerType:"PlugIn",MMdoctitle:document.title});else{c.innerHTML.replace(/\s/g,"")||(c.innerHTML="Flash version "+d.version+" or greater is required "+(i[0]>0?"Your version is "+i:"You have no flash plugin installed")+" "+(c.tagName=="A"?"Click here to download latest version
":"Download latest version from here
"),c.tagName=="A"&&(c.onclick=function(){location.href=b}));if(d.onFail){var g=d.onFail.call(this);typeof g=="string"&&(c.innerHTML=g)}}a&&(window[d.id]=document.getElementById(d.id)),f(this,{getRoot:function(){return c},getOptions:function(){return d},getConf:function(){return e},getApi:function(){return c.firstChild}})}c&&(jQuery.tools=jQuery.tools||{version:"v1.2.5"},jQuery.tools.flashembed={conf:e},jQuery.fn.flashembed=function(a,b){return this.each(function(){$(this).data("flashembed",flashembed(this,a,b))})})})();
+(function(a){var b,c,d,e;a.tools=a.tools||{version:"v1.2.5"},a.tools.history={init:function(g){e||(a.browser.msie&&a.browser.version<"8"?c||(c=a("").attr("src","javascript:false;").hide().get(0),a("body").append(c),setInterval(function(){var d=c.contentWindow.document,e=d.location.hash;b!==e&&a.event.trigger("hash",e)},100),f(location.hash||"#")):setInterval(function(){var c=location.hash;c!==b&&a.event.trigger("hash",c)},100),d=d?d.add(g):g,g.click(function(b){var d=a(this).attr("href");c&&f(d);if(d.slice(0,1)!="#"){location.href="#"+d;return b.preventDefault()}}),e=!0)}};function f(a){if(a){var b=c.contentWindow.document;b.open().close(),b.location.hash=a}}a(window).bind("hash",function(c,e){e?d.filter(function(){var b=a(this).attr("href");return b==e||b==e.replace("#","")}).trigger("history",[e]):d.eq(0).trigger("history",[e]),b=e}),a.fn.history=function(b){a.tools.history.init(this);return this.bind("history",b)}})(jQuery);
+(function(a){a.fn.mousewheel=function(a){return this[a?"bind":"trigger"]("wheel",a)},a.event.special.wheel={setup:function(){a.event.add(this,b,c,{})},teardown:function(){a.event.remove(this,b,c)}};var b=a.browser.mozilla?"DOMMouseScroll"+(a.browser.version<"1.9"?" mousemove":""):"mousewheel";function c(b){switch(b.type){case"mousemove":return a.extend(b.data,{clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY});case"DOMMouseScroll":a.extend(b,b.data),b.delta=-b.detail/3;break;case"mousewheel":b.delta=b.wheelDelta/120}b.type="wheel";return a.event.handle.call(this,b,b.delta)}})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.5"},a.tools.tooltip={conf:{effect:"toggle",fadeOutSpeed:"fast",predelay:0,delay:30,opacity:1,tip:0,position:["top","center"],offset:[0,0],relative:!1,cancelDefault:!0,events:{def:"mouseenter,mouseleave",input:"focus,blur",widget:"focus mouseenter,blur mouseleave",tooltip:"mouseenter,mouseleave"},layout:"
",tipClass:"tooltip"},addEffect:function(a,c,d){b[a]=[c,d]}};var b={toggle:[function(a){var b=this.getConf(),c=this.getTip(),d=b.opacity;d<1&&c.css({opacity:d}),c.show(),a.call()},function(a){this.getTip().hide(),a.call()}],fade:[function(a){var b=this.getConf();this.getTip().fadeTo(b.fadeInSpeed,b.opacity,a)},function(a){this.getTip().fadeOut(this.getConf().fadeOutSpeed,a)}]};function c(b,c,d){var e=d.relative?b.position().top:b.offset().top,f=d.relative?b.position().left:b.offset().left,g=d.position[0];e-=c.outerHeight()-d.offset[0],f+=b.outerWidth()+d.offset[1],/iPad/i.test(navigator.userAgent)&&(e-=a(window).scrollTop());var h=c.outerHeight()+b.outerHeight();g=="center"&&(e+=h/2),g=="bottom"&&(e+=h),g=d.position[1];var i=c.outerWidth()+b.outerWidth();g=="center"&&(f-=i/2),g=="left"&&(f-=i);return{top:e,left:f}}function d(d,e){var f=this,g=d.add(f),h,i=0,j=0,k=d.attr("title"),l=d.attr("data-tooltip"),m=b[e.effect],n,o=d.is(":input"),p=o&&d.is(":checkbox, :radio, select, :button, :submit"),q=d.attr("type"),r=e.events[q]||e.events[o?p?"widget":"input":"def"];if(!m)throw"Nonexistent effect \""+e.effect+"\"";r=r.split(/,\s*/);if(r.length!=2)throw"Tooltip: bad events configuration for "+q;d.bind(r[0],function(a){clearTimeout(i),e.predelay?j=setTimeout(function(){f.show(a)},e.predelay):f.show(a)}).bind(r[1],function(a){clearTimeout(j),e.delay?i=setTimeout(function(){f.hide(a)},e.delay):f.hide(a)}),k&&e.cancelDefault&&(d.removeAttr("title"),d.data("title",k)),a.extend(f,{show:function(b){if(!h){l?h=a(l):e.tip?h=a(e.tip).eq(0):k?h=a(e.layout).addClass(e.tipClass).appendTo(document.body).hide().append(k):(h=d.next(),h.length||(h=d.parent().next()));if(!h.length)throw"Cannot find tooltip for "+d}if(f.isShown())return f;h.stop(!0,!0);var o=c(d,h,e);e.tip&&h.html(d.data("title")),b=b||a.Event(),b.type="onBeforeShow",g.trigger(b,[o]);if(b.isDefaultPrevented())return f;o=c(d,h,e),h.css({position:"absolute",top:o.top,left:o.left}),n=!0,m[0].call(f,function(){b.type="onShow",n="full",g.trigger(b)});var p=e.events.tooltip.split(/,\s*/);h.data("__set")||(h.bind(p[0],function(){clearTimeout(i),clearTimeout(j)}),p[1]&&!d.is("input:not(:checkbox, :radio), textarea")&&h.bind(p[1],function(a){a.relatedTarget!=d[0]&&d.trigger(r[1].split(" ")[0])}),h.data("__set",!0));return f},hide:function(c){if(!h||!f.isShown())return f;c=c||a.Event(),c.type="onBeforeHide",g.trigger(c);if(!c.isDefaultPrevented()){n=!1,b[e.effect][1].call(f,function(){c.type="onHide",g.trigger(c)});return f}},isShown:function(a){return a?n=="full":n},getConf:function(){return e},getTip:function(){return h},getTrigger:function(){return d}}),a.each("onHide,onBeforeShow,onShow,onBeforeHide".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}})}a.fn.tooltip=function(b){var c=this.data("tooltip");if(c)return c;b=a.extend(!0,{},a.tools.tooltip.conf,b),typeof b.position=="string"&&(b.position=b.position.split(/,?\s/)),this.each(function(){c=new d(a(this),b),a(this).data("tooltip",c)});return b.api?c:this}})(jQuery);
+(function(a){var b=a.tools.tooltip;b.dynamic={conf:{classNames:"top right bottom left"}};function c(b){var c=a(window),d=c.width()+c.scrollLeft(),e=c.height()+c.scrollTop();return[b.offset().top<=c.scrollTop(),d<=b.offset().left+b.width(),e<=b.offset().top+b.height(),c.scrollLeft()>=b.offset().left]}function d(a){var b=a.length;while(b--)if(a[b])return!1;return!0}a.fn.dynamic=function(e){typeof e=="number"&&(e={speed:e}),e=a.extend({},b.dynamic.conf,e);var f=e.classNames.split(/\s/),g;this.each(function(){var b=a(this).tooltip().onBeforeShow(function(b,h){var i=this.getTip(),j=this.getConf();g||(g=[j.position[0],j.position[1],j.offset[0],j.offset[1],a.extend({},j)]),a.extend(j,g[4]),j.position=[g[0],g[1]],j.offset=[g[2],g[3]],i.css({visibility:"hidden",position:"absolute",top:h.top,left:h.left}).show();var k=c(i);if(!d(k)){k[2]&&(a.extend(j,e.top),j.position[0]="top",i.addClass(f[0])),k[3]&&(a.extend(j,e.right),j.position[1]="right",i.addClass(f[1])),k[0]&&(a.extend(j,e.bottom),j.position[0]="bottom",i.addClass(f[2])),k[1]&&(a.extend(j,e.left),j.position[1]="left",i.addClass(f[3]));if(k[0]||k[2])j.offset[0]*=-1;if(k[1]||k[3])j.offset[1]*=-1}i.css({visibility:"visible"}).hide()});b.onBeforeShow(function(){var a=this.getConf(),b=this.getTip();setTimeout(function(){a.position=[g[0],g[1]],a.offset=[g[2],g[3]]},0)}),b.onHide(function(){var a=this.getTip();a.removeClass(e.classNames)}),ret=b});return e.api?ret:this}})(jQuery);
+(function(a){var b=a.tools.tooltip;a.extend(b.conf,{direction:"up",bounce:!1,slideOffset:10,slideInSpeed:200,slideOutSpeed:200,slideFade:!a.browser.msie});var c={up:["-","top"],down:["+","top"],left:["-","left"],right:["+","left"]};b.addEffect("slide",function(a){var b=this.getConf(),d=this.getTip(),e=b.slideFade?{opacity:b.opacity}:{},f=c[b.direction]||c.up;e[f[1]]=f[0]+"="+b.slideOffset,b.slideFade&&d.css({opacity:0}),d.show().animate(e,b.slideInSpeed,a)},function(b){var d=this.getConf(),e=d.slideOffset,f=d.slideFade?{opacity:0}:{},g=c[d.direction]||c.up,h=""+g[0];d.bounce&&(h=h=="+"?"-":"+"),f[g[1]]=h+"="+e,this.getTip().animate(f,d.slideOutSpeed,function(){a(this).hide(),b.call()})})})(jQuery);
+(function(a){a.tools=a.tools||{version:"v1.2.5"};var b=/\[type=([a-z]+)\]/,c=/^-?[0-9]*(\.[0-9]+)?$/,d=a.tools.dateinput,e=/^([a-z0-9_\.\-\+]+)@([\da-z\.\-]+)\.([a-z\.]{2,6})$/i,f=/^(https?:\/\/)?[\da-z\.\-]+\.[a-z\.]{2,6}[#&+_\?\/\w \.\-=]*$/i,g;g=a.tools.validator={conf:{grouped:!1,effect:"default",errorClass:"invalid",inputEvent:null,errorInputEvent:"keyup",formEvent:"submit",lang:"en",message:"
",messageAttr:"data-message",messageClass:"error",offset:[0,0],position:"center right",singleError:!1,speed:"normal"},messages:{"*":{en:"Please correct this value"}},localize:function(b,c){a.each(c,function(a,c){g.messages[a]=g.messages[a]||{},g.messages[a][b]=c})},localizeFn:function(b,c){g.messages[b]=g.messages[b]||{},a.extend(g.messages[b],c)},fn:function(c,d,e){a.isFunction(d)?e=d:(typeof d=="string"&&(d={en:d}),this.messages[c.key||c]=d);var f=b.exec(c);f&&(c=i(f[1])),j.push([c,e])},addEffect:function(a,b,c){k[a]=[b,c]}};function h(b,c,d){var e=b.offset().top,f=b.offset().left,g=d.position.split(/,?\s+/),h=g[0],i=g[1];e-=c.outerHeight()-d.offset[0],f+=b.outerWidth()+d.offset[1],/iPad/i.test(navigator.userAgent)&&(e-=a(window).scrollTop());var j=c.outerHeight()+b.outerHeight();h=="center"&&(e+=j/2),h=="bottom"&&(e+=j);var k=b.outerWidth();i=="center"&&(f-=(k+c.outerWidth())/2),i=="left"&&(f-=k);return{top:e,left:f}}function i(a){function b(){return this.getAttribute("type")==a}b.key="[type="+a+"]";return b}var j=[],k={"default":[function(b){var c=this.getConf();a.each(b,function(b,d){var e=d.input;e.addClass(c.errorClass);var f=e.data("msg.el");f||(f=a(c.message).addClass(c.messageClass).appendTo(document.body),e.data("msg.el",f)),f.css({visibility:"hidden"}).find("p").remove(),a.each(d.messages,function(b,c){a("
").html(c).appendTo(f)}),f.outerWidth()==f.parent().width()&&f.add(f.find("p")).css({display:"inline"});var g=h(e,f,c);f.css({visibility:"visible",position:"absolute",top:g.top,left:g.left}).fadeIn(c.speed)})},function(b){var c=this.getConf();b.removeClass(c.errorClass).each(function(){var b=a(this).data("msg.el");b&&b.css({visibility:"hidden"})})}]};a.each("email,url,number".split(","),function(b,c){a.expr[":"][c]=function(a){return a.getAttribute("type")===c}}),a.fn.oninvalid=function(a){return this[a?"bind":"trigger"]("OI",a)},g.fn(":email","Please enter a valid email address",function(a,b){return!b||e.test(b)}),g.fn(":url","Please enter a valid URL",function(a,b){return!b||f.test(b)}),g.fn(":number","Please enter a numeric value.",function(a,b){return c.test(b)}),g.fn("[max]","Please enter a value smaller than $1",function(a,b){if(b===""||d&&a.is(":date"))return!0;var c=a.attr("max");return parseFloat(b)<=parseFloat(c)?!0:[c]}),g.fn("[min]","Please enter a value larger than $1",function(a,b){if(b===""||d&&a.is(":date"))return!0;var c=a.attr("min");return parseFloat(b)>=parseFloat(c)?!0:[c]}),g.fn("[required]","Please complete this mandatory field.",function(a,b){if(a.is(":checkbox"))return a.is(":checked");return b}),g.fn("[pattern]",function(a){var b=new RegExp("^"+a.attr("pattern")+"$");return b.test(a.val())});function l(b,c,e){var f=this,i=c.add(f);b=b.not(":button, :image, :reset, :submit");function l(b,c,d){if(e.grouped||!b.length){var f;if(d===!1||a.isArray(d)){f=g.messages[c.key||c]||g.messages["*"],f=f[e.lang]||g.messages["*"].en;var h=f.match(/\$\d/g);h&&a.isArray(d)&&a.each(h,function(a){f=f.replace(this,d[a])})}else f=d[e.lang]||d;b.push(f)}}a.extend(f,{getConf:function(){return e},getForm:function(){return c},getInputs:function(){return b},reflow:function(){b.each(function(){var b=a(this),c=b.data("msg.el");if(c){var d=h(b,c,e);c.css({top:d.top,left:d.left})}});return f},invalidate:function(c,d){if(!d){var g=[];a.each(c,function(a,c){var d=b.filter("[name='"+a+"']");d.length&&(d.trigger("OI",[c]),g.push({input:d,messages:[c]}))}),c=g,d=a.Event()}d.type="onFail",i.trigger(d,[c]),d.isDefaultPrevented()||k[e.effect][0].call(f,c,d);return f},reset:function(c){c=c||b,c.removeClass(e.errorClass).each(function(){var b=a(this).data("msg.el");b&&(b.remove(),a(this).data("msg.el",null))}).unbind(e.errorInputEvent||"");return f},destroy:function(){c.unbind(e.formEvent+".V").unbind("reset.V"),b.unbind(e.inputEvent+".V").unbind("change.V");return f.reset()},checkValidity:function(c,g){c=c||b,c=c.not(":disabled");if(!c.length)return!0;g=g||a.Event(),g.type="onBeforeValidate",i.trigger(g,[c]);if(g.isDefaultPrevented())return g.result;var h=[];c.not(":radio:not(:checked)").each(function(){var b=[],c=a(this).data("messages",b),k=d&&c.is(":date")?"onHide.v":e.errorInputEvent+".v";c.unbind(k),a.each(j,function(){var a=this,d=a[0];if(c.filter(d).length){var h=a[1].call(f,c,c.val());if(h!==!0){g.type="onBeforeFail",i.trigger(g,[c,d]);if(g.isDefaultPrevented())return!1;var j=c.attr(e.messageAttr);if(j){b=[j];return!1}l(b,d,h)}}}),b.length&&(h.push({input:c,messages:b}),c.trigger("OI",[b]),e.errorInputEvent&&c.bind(k,function(a){f.checkValidity(c,a)}));if(e.singleError&&h.length)return!1});var m=k[e.effect];if(!m)throw"Validator: cannot find effect \""+e.effect+"\"";if(h.length){f.invalidate(h,g);return!1}m[1].call(f,c,g),g.type="onSuccess",i.trigger(g,[c]),c.unbind(e.errorInputEvent+".v");return!0}}),a.each("onBeforeValidate,onBeforeFail,onFail,onSuccess".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}}),e.formEvent&&c.bind(e.formEvent+".V",function(a){if(!f.checkValidity(null,a))return a.preventDefault()}),c.bind("reset.V",function(){f.reset()}),b[0]&&b[0].validity&&b.each(function(){this.oninvalid=function(){return!1}}),c[0]&&(c[0].checkValidity=f.checkValidity),e.inputEvent&&b.bind(e.inputEvent+".V",function(b){f.checkValidity(a(this),b)}),b.filter(":checkbox, select").filter("[required]").bind("change.V",function(b){var c=a(this);(this.checked||c.is("select")&&a(this).val())&&k[e.effect][1].call(f,c,b)});var m=b.filter(":radio").change(function(a){f.checkValidity(m,a)});a(window).resize(function(){f.reflow()})}a.fn.validator=function(b){var c=this.data("validator");c&&(c.destroy(),this.removeData("validator")),b=a.extend(!0,{},g.conf,b);if(this.is("form"))return this.each(function(){var d=a(this);c=new l(d.find(":input"),d,b),d.data("validator",c)});c=new l(this,this.eq(0).closest("form"),b);return this.data("validator",c)}})(jQuery);
diff --git a/js/jquery.validationEngine-en.js b/js/jquery.validationEngine-en.js
new file mode 100644
index 0000000..7fd6587
--- /dev/null
+++ b/js/jquery.validationEngine-en.js
@@ -0,0 +1,213 @@
+(function($){
+ $.fn.validationEngineLanguage = function(){
+ };
+ $.validationEngineLanguage = {
+ newLang: function(){
+ $.validationEngineLanguage.allRules = {
+ "required": { // Add your regex rules here, you can take telephone as an example
+ "regex": "none",
+ "alertText": "* This field is required",
+ "alertTextCheckboxMultiple": "* Please select an option",
+ "alertTextCheckboxe": "* This checkbox is required",
+ "alertTextDateRange": "* Both date range fields are required"
+ },
+ "requiredInFunction": {
+ "func": function(field, rules, i, options){
+ return (field.val() == "test") ? true : false;
+ },
+ "alertText": "* Field must equal test"
+ },
+ "dateRange": {
+ "regex": "none",
+ "alertText": "* Invalid ",
+ "alertText2": "Date Range"
+ },
+ "dateTimeRange": {
+ "regex": "none",
+ "alertText": "* Invalid ",
+ "alertText2": "Date Time Range"
+ },
+ "minSize": {
+ "regex": "none",
+ "alertText": "* Minimum ",
+ "alertText2": " characters required"
+ },
+ "maxSize": {
+ "regex": "none",
+ "alertText": "* Maximum ",
+ "alertText2": " characters allowed"
+ },
+ "groupRequired": {
+ "regex": "none",
+ "alertText": "* You must fill one of the following fields"
+ },
+ "min": {
+ "regex": "none",
+ "alertText": "* Minimum value is "
+ },
+ "max": {
+ "regex": "none",
+ "alertText": "* Maximum value is "
+ },
+ "past": {
+ "regex": "none",
+ "alertText": "* Date prior to "
+ },
+ "future": {
+ "regex": "none",
+ "alertText": "* Date past "
+ },
+ "maxCheckbox": {
+ "regex": "none",
+ "alertText": "* Maximum ",
+ "alertText2": " options allowed"
+ },
+ "minCheckbox": {
+ "regex": "none",
+ "alertText": "* Please select ",
+ "alertText2": " options"
+ },
+ "equals": {
+ "regex": "none",
+ "alertText": "* Fields do not match"
+ },
+ "creditCard": {
+ "regex": "none",
+ "alertText": "* Invalid credit card number"
+ },
+ "phone": {
+ // credit: jquery.h5validate.js / orefalo
+ "regex": /^([\+][0-9]{1,3}[\ \.\-])?([\(]{1}[0-9]{2,6}[\)])?([0-9\ \.\-\/]{3,20})((x|ext|extension)[\ ]?[0-9]{1,4})?$/,
+ "alertText": "* Invalid phone number"
+ },
+ "email": {
+ // HTML5 compatible email regex ( http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html# e-mail-state-%28type=email%29 )
+ "regex": /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
+ "alertText": "* Invalid email address"
+ },
+ "SWPMUserName": {
+ "regex": /^[a-zA-Z0-9!@#$%&\'*+\/=?^_`{|}~\.-]+$/,
+ "alertText": "* Invalid User Name"
+ },
+ "integer": {
+ "regex": /^[\-\+]?\d+$/,
+ "alertText": "* Not a valid integer"
+ },
+ "number": {
+ // Number, including positive, negative, and floating decimal. credit: orefalo
+ "regex": /^[\-\+]?((([0-9]{1,3})([,][0-9]{3})*)|([0-9]+))?([\.]([0-9]+))?$/,
+ "alertText": "* Invalid floating decimal number"
+ },
+ "date": {
+ // Check if date is valid by leap year
+ "func": function (field) {
+ var pattern = new RegExp(/^(\d{4})[\/\-\.](0?[1-9]|1[012])[\/\-\.](0?[1-9]|[12][0-9]|3[01])$/);
+ var match = pattern.exec(field.val());
+ if (match == null)
+ return false;
+
+ var year = match[1];
+ var month = match[2]*1;
+ var day = match[3]*1;
+ var date = new Date(year, month - 1, day); // because months starts from 0.
+
+ return (date.getFullYear() == year && date.getMonth() == (month - 1) && date.getDate() == day);
+ },
+ "alertText": "* Invalid date, must be in YYYY-MM-DD format"
+ },
+ "ipv4": {
+ "regex": /^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/,
+ "alertText": "* Invalid IP address"
+ },
+ "url": {
+ "regex": /^(https?|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,
+ "alertText": "* Invalid URL"
+ },
+ "onlyNumberSp": {
+ "regex": /^[0-9\ ]+$/,
+ "alertText": "* Numbers only"
+ },
+ "onlyLetterSp": {
+ "regex": /^[a-zA-Z\ \']+$/,
+ "alertText": "* Letters only"
+ },
+ "onlyLetterNumber": {
+ "regex": /^[0-9a-zA-Z]+$/,
+ "alertText": "* No special characters allowed"
+ },
+ "onlyLetterNumberUnderscore": {
+ "regex": /^[0-9a-zA-Z_]+$/,
+ "alertText": "* Only number, character and underscore allowed"
+ },
+ "noapostrophe": {
+ "regex": /^[^\']+$/,
+ "alertText": "* Apostrophe character is not allowed."
+ },
+ // --- CUSTOM RULES -- Those are specific to the demos, they can be removed or changed to your likings
+ "ajaxUserCall": {
+ "url": "ajaxurl",
+ // you may want to pass extra data on the ajax call
+ "extraData": "&action=swpm_validate_user_name",
+ "alertTextOk": "* This username is available",
+ "alertText": "* This user is already taken",
+ "alertTextLoad": "* Validating, please wait"
+ },
+ "ajaxEmailCall": {
+ "url": "ajaxurl",
+ // you may want to pass extra data on the ajax call
+ "extraData": "&action=swpm_validate_email",
+ "alertText": "* This email is already taken",
+ "alertTextOk": "* This email is available",
+ "alertTextLoad": "* Validating, please wait"
+ },
+ "ajaxUserCallPhp": {
+ "url": "phpajax/ajaxValidateFieldUser.php",
+ // you may want to pass extra data on the ajax call
+ "extraData": "name=eric",
+ // if you provide an "alertTextOk", it will show as a green prompt when the field validates
+ "alertTextOk": "* This username is available",
+ "alertText": "* This user is already taken",
+ "alertTextLoad": "* Validating, please wait"
+ },
+ "ajaxNameCall": {
+ // remote json service location
+ "url": "ajaxValidateFieldName",
+ // error
+ "alertText": "* This name is already taken",
+ // if you provide an "alertTextOk", it will show as a green prompt when the field validates
+ "alertTextOk": "* This name is available",
+ // speaks by itself
+ "alertTextLoad": "* Validating, please wait"
+ },
+ "ajaxNameCallPhp": {
+ // remote json service location
+ "url": "phpajax/ajaxValidateFieldName.php",
+ // error
+ "alertText": "* This name is already taken",
+ // speaks by itself
+ "alertTextLoad": "* Validating, please wait"
+ },
+ "validate2fields": {
+ "alertText": "* Please input HELLO"
+ },
+ //tls warning:homegrown not fielded
+ "dateFormat":{
+ "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/,
+ "alertText": "* Invalid Date"
+ },
+ //tls warning:homegrown not fielded
+ "dateTimeFormat": {
+ "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/,
+ "alertText": "* Invalid Date or Date Format",
+ "alertText2": "Expected Format: ",
+ "alertText3": "mm/dd/yyyy hh:mm:ss AM|PM or ",
+ "alertText4": "yyyy-mm-dd hh:mm:ss AM|PM"
+ }
+ };
+
+ }
+ };
+
+ $.validationEngineLanguage.newLang();
+
+})(jQuery);
\ No newline at end of file
diff --git a/js/jquery.validationEngine.js b/js/jquery.validationEngine.js
new file mode 100644
index 0000000..6e9938d
--- /dev/null
+++ b/js/jquery.validationEngine.js
@@ -0,0 +1,1194 @@
+/*
+ * Inline Form Validation Engine 2.1, jQuery plugin
+ *
+ * Copyright(c) 2010, Cedric Dugas
+ * http://www.position-absolute.com
+ *
+ * 2.0 Rewrite by Olivier Refalo
+ * http://www.crionics.com
+ *
+ * Form validation engine allowing custom regex rules to be added.
+ * Licensed under the MIT License
+ */
+(function($) {
+
+ var methods = {
+
+ /**
+ * Kind of the constructor, called before any action
+ * @param {Map} user options
+ */
+ init: function(options) {
+ var form = this;
+ if (!form.data('jqv') || form.data('jqv') == null ) {
+ methods._saveOptions(form, options);
+
+ // bind all formError elements to close on click
+ $(".formError").live("click", function() {
+ $(this).fadeOut(150, function() {
+
+ // remove prompt once invisible
+ $(this).remove();
+ });
+ });
+ }
+ },
+ /**
+ * Attachs jQuery.validationEngine to form.submit and field.blur events
+ * Takes an optional params: a list of options
+ * ie. jQuery("#formID1").validationEngine('attach', {promptPosition : "centerRight"});
+ */
+ attach: function(userOptions) {
+ var form = this;
+ var options;
+
+ if(userOptions)
+ options = methods._saveOptions(form, userOptions);
+ else
+ options = form.data('jqv');
+
+ if (!options.binded) {
+ if (options.bindMethod == "bind"){
+ // bind fields
+ form.find("[class*=validate]:not([type=checkbox])").bind(options.validationEventTrigger, methods._onFieldEvent);
+ form.find("[class*=validate][type=checkbox]").bind("click", methods._onFieldEvent);
+
+ // bind form.submit
+ form.bind("submit", methods._onSubmitEvent);
+ } else if (options.bindMethod == "live") {
+ // bind fields with LIVE (for persistant state)
+ form.find("[class*=validate]:not([type=checkbox])").live(options.validationEventTrigger, methods._onFieldEvent);
+ form.find("[class*=validate][type=checkbox]").live("click", methods._onFieldEvent);
+
+ // bind form.submit
+ form.live("submit", methods._onSubmitEvent);
+ }
+
+ options.binded = true;
+ }
+
+ },
+ /**
+ * Unregisters any bindings that may point to jQuery.validaitonEngine
+ */
+ detach: function() {
+ var form = this;
+ var options = form.data('jqv');
+ if (options.binded) {
+
+ // unbind fields
+ form.find("[class*=validate]").not("[type=checkbox]").unbind(options.validationEventTrigger, methods._onFieldEvent);
+ form.find("[class*=validate][type=checkbox]").unbind("click", methods._onFieldEvent);
+ // unbind form.submit
+ form.unbind("submit", methods.onAjaxFormComplete);
+
+
+ // unbind live fields (kill)
+ form.find("[class*=validate]").not("[type=checkbox]").die(options.validationEventTrigger, methods._onFieldEvent);
+ form.find("[class*=validate][type=checkbox]").die("click", methods._onFieldEvent);
+ // unbind form.submit
+ form.die("submit", methods.onAjaxFormComplete);
+
+ form.removeData('jqv');
+ }
+ },
+ /**
+ * Validates the form fields, shows prompts accordingly.
+ * Note: There is no ajax form validation with this method, only field ajax validation are evaluated
+ *
+ * @return true if the form validates, false if it fails
+ */
+ validate: function() {
+ return methods._validateFields(this);
+ },
+ /**
+ * Validates one field, shows prompt accordingly.
+ * Note: There is no ajax form validation with this method, only field ajax validation are evaluated
+ *
+ * @return true if the form validates, false if it fails
+ */
+ validateField: function(el) {
+ var options = $(this).data('jqv');
+ return methods._validateField($(el), options);
+ },
+ /**
+ * Validates the form fields, shows prompts accordingly.
+ * Note: this methods performs fields and form ajax validations(if setup)
+ *
+ * @return true if the form validates, false if it fails, undefined if ajax is used for form validation
+ */
+ validateform: function() {
+ return methods._onSubmitEvent.call(this);
+ },
+ /**
+ * Displays a prompt on a element.
+ * Note that the element needs an id!
+ *
+ * @param {String} promptText html text to display type
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
+ * @param {String} possible values topLeft, topRight, bottomLeft, centerRight, bottomRight
+ */
+ showPrompt: function(promptText, type, promptPosition, showArrow) {
+
+ var form = this.closest('form');
+ var options = form.data('jqv');
+ // No option, take default one
+ if(!options) options = methods._saveOptions(this, options);
+ if(promptPosition)
+ options.promptPosition=promptPosition;
+ options.showArrow = showArrow==true;
+
+ methods._showPrompt(this, promptText, type, false, options);
+ },
+ /**
+ * Closes all error prompts on the page
+ */
+ hidePrompt: function() {
+ var promptClass = "."+ methods._getClassName($(this).attr("id")) + "formError"
+ $(promptClass).fadeTo("fast", 0.3, function() {
+ $(this).remove();
+ });
+ },
+ /**
+ * Closes form error prompts, CAN be invidual
+ */
+ hide: function() {
+ if($(this).is("form")){
+ var closingtag = "parentForm"+$(this).attr('id');
+ }else{
+
+ var closingtag = $(this).attr('id') +"formError"
+ }
+ $('.'+closingtag).fadeTo("fast", 0.3, function() {
+ $(this).remove();
+ });
+ },
+ /**
+ * Closes all error prompts on the page
+ */
+ hideAll: function() {
+ $('.formError').fadeTo("fast", 0.3, function() {
+ $(this).remove();
+ });
+ },
+ /**
+ * Typically called when user exists a field using tab or a mouse click, triggers a field
+ * validation
+ */
+ _onFieldEvent: function() {
+ var field = $(this);
+ var form = field.closest('form');
+ var options = form.data('jqv');
+ // validate the current field
+ methods._validateField(field, options);
+ },
+ /**
+ * Called when the form is submited, shows prompts accordingly
+ *
+ * @param {jqObject}
+ * form
+ * @return false if form submission needs to be cancelled
+ */
+ _onSubmitEvent: function() {
+ var form = $(this);
+ var options = form.data('jqv');
+
+ // validate each field (- skip field ajax validation, no necessary since we will perform an ajax form validation)
+ var r=methods._validateFields(form, true);
+
+ if (r && options.ajaxFormValidation) {
+ methods._validateFormWithAjax(form, options);
+ return false;
+ }
+
+ if(options.onValidationComplete) {
+ options.onValidationComplete(form, r);
+ return false;
+ }
+ return r;
+ },
+
+ /**
+ * Return true if the ajax field validations passed so far
+ * @param {Object} options
+ * @return true, is all ajax validation passed so far (remember ajax is async)
+ */
+ _checkAjaxStatus: function(options) {
+ var status = true;
+ $.each(options.ajaxValidCache, function(key, value) {
+ if (!value) {
+ status = false;
+ // break the each
+ return false;
+ }
+ });
+ return status;
+ },
+ /**
+ * Validates form fields, shows prompts accordingly
+ *
+ * @param {jqObject}
+ * form
+ * @param {skipAjaxFieldValidation}
+ * boolean - when set to true, ajax field validation is skipped, typically used when the submit button is clicked
+ *
+ * @return true if form is valid, false if not, undefined if ajax form validation is done
+ */
+ _validateFields: function(form, skipAjaxValidation) {
+ var options = form.data('jqv');
+
+ // this variable is set to true if an error is found
+ var errorFound = false;
+
+ // Trigger hook, start validation
+ form.trigger("jqv.form.validating")
+ // first, evaluate status of non ajax fields
+ form.find('[class*=validate]').not(':hidden').each( function() {
+ var field = $(this);
+ errorFound |= methods._validateField(field, options, skipAjaxValidation);
+ });
+ // second, check to see if all ajax calls completed ok
+ // errorFound |= !methods._checkAjaxStatus(options);
+
+ // thrird, check status and scroll the container accordingly
+ form.trigger("jqv.form.result", [errorFound])
+
+ if (errorFound) {
+
+ if (options.scroll) {
+
+ // get the position of the first error, there should be at least one, no need to check this
+ //var destination = form.find(".formError:not('.greenPopup'):first").offset().top;
+
+ // look for the visually top prompt
+ var destination = Number.MAX_VALUE;
+
+ var lst = $(".formError:not('.greenPopup')");
+ for (var i = 0; i < lst.length; i++) {
+ var d = $(lst[i]).offset().top;
+ if (d < destination)
+ destination = d;
+ }
+
+ if (!options.isOverflown)
+ $("html:not(:animated),body:not(:animated)").animate({
+ scrollTop: destination
+ }, 1100);
+ else {
+ var overflowDIV = $(options.overflownDIV);
+ var scrollContainerScroll = overflowDIV.scrollTop();
+ var scrollContainerPos = -parseInt(overflowDIV.offset().top);
+
+ destination += scrollContainerScroll + scrollContainerPos - 5;
+ var scrollContainer = $(options.overflownDIV + ":not(:animated)");
+
+ scrollContainer.animate({
+ scrollTop: destination
+ }, 1100);
+ }
+ }
+ return false;
+ }
+ return true;
+ },
+ /**
+ * This method is called to perform an ajax form validation.
+ * During this process all the (field, value) pairs are sent to the server which returns a list of invalid fields or true
+ *
+ * @param {jqObject} form
+ * @param {Map} options
+ */
+ _validateFormWithAjax: function(form, options) {
+
+ var data = form.serialize();
+ var url = (options.ajaxFormValidationURL) ? options.ajaxFormValidationURL : form.attr("action");
+ $.ajax({
+ type: "GET",
+ url: url,
+ cache: false,
+ dataType: "json",
+ data: data,
+ form: form,
+ methods: methods,
+ options: options,
+ beforeSend: function() {
+ return options.onBeforeAjaxFormValidation(form, options);
+ },
+ error: function(data, transport) {
+ methods._ajaxError(data, transport);
+ },
+ success: function(json) {
+
+ if (json !== true) {
+
+ // getting to this case doesn't necessary means that the form is invalid
+ // the server may return green or closing prompt actions
+ // this flag helps figuring it out
+ var errorInForm=false;
+ for (var i = 0; i < json.length; i++) {
+ var value = json[i];
+
+ var errorFieldId = value[0];
+ var errorField = $($("#" + errorFieldId)[0]);
+
+ // make sure we found the element
+ if (errorField.length == 1) {
+
+ // promptText or selector
+ var msg = value[2];
+ // if the field is valid
+ if (value[1] == true) {
+
+ if (msg == "" || !msg){
+ // if for some reason, status==true and error="", just close the prompt
+ methods._closePrompt(errorField);
+ } else {
+ // the field is valid, but we are displaying a green prompt
+ if (options.allrules[msg]) {
+ var txt = options.allrules[msg].alertTextOk;
+ if (txt)
+ msg = txt;
+ }
+ methods._showPrompt(errorField, msg, "pass", false, options, true);
+ }
+
+ } else {
+ // the field is invalid, show the red error prompt
+ errorInForm|=true;
+ if (options.allrules[msg]) {
+ var txt = options.allrules[msg].alertText;
+ if (txt)
+ msg = txt;
+ }
+ methods._showPrompt(errorField, msg, "", false, options, true);
+ }
+ }
+ }
+ options.onAjaxFormComplete(!errorInForm, form, json, options);
+ } else
+ options.onAjaxFormComplete(true, form, "", options);
+ }
+ });
+
+ },
+ /**
+ * Validates field, shows prompts accordingly
+ *
+ * @param {jqObject}
+ * field
+ * @param {Array[String]}
+ * field's validation rules
+ * @param {Map}
+ * user options
+ * @return true if field is valid
+ */
+ _validateField: function(field, options, skipAjaxValidation) {
+ if (!field.attr("id"))
+ $.error("jQueryValidate: an ID attribute is required for this field: " + field.attr("name") + " class:" +
+ field.attr("class"));
+
+ var rulesParsing = field.attr('class');
+ var getRules = /validate\[(.*)\]/.exec(rulesParsing);
+ if (!getRules)
+ return false;
+ var str = getRules[1];
+ var rules = str.split(/\[|,|\]/);
+
+ // true if we ran the ajax validation, tells the logic to stop messing with prompts
+ var isAjaxValidator = false;
+ var fieldName = field.attr("name");
+ var promptText = "";
+ var required = false;
+ var equals = true;
+ options.isError = false;
+ options.showArrow = true;
+ optional = false;
+
+ for (var i = 0; i < rules.length; i++) {
+
+ var errorMsg = undefined;
+ switch (rules[i]) {
+
+ case "optional":
+ optional = true;
+ break;
+ case "required":
+ required = true;
+ errorMsg = methods._required(field, rules, i, options);
+ break;
+ case "custom":
+ errorMsg = methods._customRegex(field, rules, i, options);
+ break;
+ case "ajax":
+ // ajax has its own prompts handling technique
+ if(!skipAjaxValidation){
+ methods._ajax(field, rules, i, options);
+ isAjaxValidator = true;
+ }
+ break;
+ case "minSize":
+ errorMsg = methods._minSize(field, rules, i, options);
+ break;
+ case "maxSize":
+ errorMsg = methods._maxSize(field, rules, i, options);
+ break;
+ case "min":
+ errorMsg = methods._min(field, rules, i, options);
+ break;
+ case "max":
+ errorMsg = methods._max(field, rules, i, options);
+ break;
+ case "past":
+ errorMsg = methods._past(field, rules, i, options);
+ break;
+ case "future":
+ errorMsg = methods._future(field, rules, i, options);
+ break;
+ case "maxCheckbox":
+ errorMsg = methods._maxCheckbox(field, rules, i, options);
+ field = $($("input[name='" + fieldName + "']"));
+ break;
+ case "minCheckbox":
+ errorMsg = methods._minCheckbox(field, rules, i, options);
+ field = $($("input[name='" + fieldName + "']"));
+ break;
+ case "equals":
+ errorMsg = methods._equals(field, rules, i, options);
+ if (errorMsg !== undefined) equals = false;
+ break;
+ case "funcCall":
+ errorMsg = methods._funcCall(field, rules, i, options);
+ break;
+
+ default:
+ //$.error("jQueryValidator rule not found"+rules[i]);
+ }
+
+ if (errorMsg !== undefined) {
+ promptText += errorMsg + " ";
+ options.isError = true;
+
+ }
+
+ }
+ // If the rules required is not added, an empty field is not validated
+ if(!required){
+ if(field.val() == "") options.isError = false;
+ }
+ // Hack for radio/checkbox group button, the validation go into the
+ // first radio/checkbox of the group
+ var fieldType = field.attr("type");
+
+ if ((fieldType == "radio" || fieldType == "checkbox") && $("input[name='" + fieldName + "']").size() > 1) {
+ field = $($("input[name='" + fieldName + "'][type!=hidden]:first"));
+ options.showArrow = false;
+ }
+
+ if (options.isError || !equals){
+
+ methods._showPrompt(field, promptText, "", false, options);
+ }else{
+ if (!isAjaxValidator) methods._closePrompt(field);
+ }
+ field.closest('form').trigger("jqv.field.error", [field, options.isError, promptText])
+ return options.isError || (!equals);
+ },
+ /**
+ * Required validation
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _required: function(field, rules, i, options) {
+ switch (field.attr("type")) {
+ case "text":
+ case "password":
+ case "textarea":
+ case "file":
+ default:
+ if (!field.val())
+ return options.allrules[rules[i]].alertText;
+ break;
+ case "radio":
+ case "checkbox":
+ var name = field.attr("name");
+ if ($("input[name='" + name + "']:checked").size() == 0) {
+
+ if ($("input[name='" + name + "']").size() == 1)
+ return options.allrules[rules[i]].alertTextCheckboxe;
+ else
+ return options.allrules[rules[i]].alertTextCheckboxMultiple;
+ }
+ break;
+ // required for
+ case "select-one":
+ // added by paul@kinetek.net for select boxes, Thank you
+ if (!field.val())
+ return options.allrules[rules[i]].alertText;
+ break;
+ case "select-multiple":
+ // added by paul@kinetek.net for select boxes, Thank you
+ if (!field.find("option:selected").val())
+ return options.allrules[rules[i]].alertText;
+ break;
+ }
+ },
+ /**
+ * Validate Regex rules
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _customRegex: function(field, rules, i, options) {
+ var customRule = rules[i + 1];
+ var rule = options.allrules[customRule];
+ if(!rule) {
+ alert("jqv:custom rule not found "+customRule);
+ return;
+ }
+
+ var ex=rule.regex;
+ if(!ex) {
+ alert("jqv:custom regex not found "+customRule);
+ return;
+ }
+ var pattern = new RegExp(ex);
+
+ if (!pattern.test(field.attr('value')))
+ return options.allrules[customRule].alertText;
+ },
+ /**
+ * Validate custom function outside of the engine scope
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _funcCall: function(field, rules, i, options) {
+ var functionName = rules[i + 1];
+ var fn = window[functionName];
+ if (typeof(fn) == 'function')
+ return fn(field, rules, i, options);
+
+ },
+ /**
+ * Field match
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _equals: function(field, rules, i, options) {
+ var equalsField = rules[i + 1];
+
+ if (field.attr('value') != $("#" + equalsField).attr('value')){
+ field.css('border','1px solid red');
+ $("#" + equalsField).css('border', '1px solid red');
+ return options.allrules.equals.alertText;
+ }
+ else{
+ field.css('border','');
+ $("#" + equalsField).css('border', '');
+ }
+
+ },
+ /**
+ * Check the maximum size (in characters)
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _maxSize: function(field, rules, i, options) {
+ var max = rules[i + 1];
+ var len = field.attr('value').length;
+
+ if (len > max) {
+ var rule = options.allrules.maxSize;
+ return rule.alertText + max + rule.alertText2;
+ }
+ },
+ /**
+ * Check the minimum size (in characters)
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _minSize: function(field, rules, i, options) {
+ var min = rules[i + 1];
+ var len = field.attr('value').length;
+
+ if (len < min) {
+ var rule = options.allrules.minSize;
+ return rule.alertText + min + rule.alertText2;
+ }
+ },
+ /**
+ * Check number minimum value
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _min: function(field, rules, i, options) {
+ var min = parseFloat(rules[i + 1]);
+ var len = parseFloat(field.attr('value'));
+
+ if (len < min) {
+ var rule = options.allrules.min;
+ if (rule.alertText2) return rule.alertText + min + rule.alertText2;
+ return rule.alertText + min;
+ }
+ },
+ /**
+ * Check number maximum value
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _max: function(field, rules, i, options) {
+ var max = parseFloat(rules[i + 1]);
+ var len = parseFloat(field.attr('value'));
+
+ if (len >max ) {
+ var rule = options.allrules.max;
+ if (rule.alertText2) return rule.alertText + max + rule.alertText2;
+ //orefalo: to review, also do the translations
+ return rule.alertText + max;
+ }
+ },
+ /**
+ * Checks date is in the past
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _past: function(field, rules, i, options) {
+
+ var p=rules[i + 1];
+ var pdate = (p.toLowerCase() == "now")? new Date():methods._parseDate(p);
+ var vdate = methods._parseDate(field.attr('value'));
+
+ if (vdate > pdate ) {
+ var rule = options.allrules.past;
+ if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
+ return rule.alertText + methods._dateToString(pdate);
+ }
+ },
+ /**
+ * Checks date is in the past
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _future: function(field, rules, i, options) {
+
+ var p=rules[i + 1];
+ var pdate = (p.toLowerCase() == "now")? new Date():methods._parseDate(p);
+ var vdate = methods._parseDate(field.attr('value'));
+
+ if (vdate < pdate ) {
+ var rule = options.allrules.future;
+ if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
+ return rule.alertText + methods._dateToString(pdate);
+ }
+ },
+ /**
+ * Max number of checkbox selected
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _maxCheckbox: function(field, rules, i, options) {
+
+ var nbCheck = rules[i + 1];
+ var groupname = field.attr("name");
+ var groupSize = $("input[name='" + groupname + "']:checked").size();
+ if (groupSize > nbCheck) {
+ options.showArrow = false;
+ return options.allrules.maxCheckbox.alertText;
+ }
+ },
+ /**
+ * Min number of checkbox selected
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return an error string if validation failed
+ */
+ _minCheckbox: function(field, rules, i, options) {
+
+ var nbCheck = rules[i + 1];
+ var groupname = field.attr("name");
+ var groupSize = $("input[name='" + groupname + "']:checked").size();
+ if (groupSize < nbCheck) {
+ options.showArrow = false;
+ return options.allrules.minCheckbox.alertText + " " + nbCheck + " " +
+ options.allrules.minCheckbox.alertText2;
+ }
+ },
+ /**
+ * Ajax field validation
+ *
+ * @param {jqObject} field
+ * @param {Array[String]} rules
+ * @param {int} i rules index
+ * @param {Map}
+ * user options
+ * @return nothing! the ajax validator handles the prompts itself
+ */
+ _ajax: function(field, rules, i, options) {
+
+
+ var errorSelector = rules[i + 1];
+ var rule = options.allrules[errorSelector];
+ var extraData = rule.extraData;
+
+ if (!extraData)
+ extraData = "";
+
+ if (!options.isError) {
+ $.ajax({
+ type: "GET",
+ url: rule.url,
+ cache: false,
+ dataType: "json",
+ data: "fieldId=" + field.attr("id") + "&fieldValue=" + field.attr("value") + "&extraData=" + extraData,
+ field: field,
+ rule: rule,
+ methods: methods,
+ options: options,
+ beforeSend: function() {
+ // build the loading prompt
+ var loadingText = rule.alertTextLoad;
+ if (loadingText)
+ methods._showPrompt(field, loadingText, "load", true, options);
+ },
+ error: function(data, transport) {
+ methods._ajaxError(data, transport);
+ },
+ success: function(json) {
+
+ // asynchronously called on success, data is the json answer from the server
+ var errorFieldId = json[0];
+ var errorField = $($("#" + errorFieldId)[0]);
+ // make sure we found the element
+ if (errorField.length == 1) {
+ var status = json[1];
+ if (!status) {
+ // Houston we got a problem
+ options.ajaxValidCache[errorFieldId] = false;
+ options.isError = true;
+ var promptText = rule.alertText;
+ methods._showPrompt(errorField, promptText, "", true, options);
+ } else {
+ if (options.ajaxValidCache[errorFieldId] !== undefined)
+ options.ajaxValidCache[errorFieldId] = true;
+
+ // see if we should display a green prompt
+ var alertTextOk = rule.alertTextOk;
+ if (alertTextOk)
+ methods._showPrompt(errorField, alertTextOk, "pass", true, options);
+ else
+ methods._closePrompt(errorField);
+ }
+ }
+ }
+ });
+ }
+ },
+ /**
+ * Common method to handle ajax errors
+ *
+ * @param {Object} data
+ * @param {Object} transport
+ */
+ _ajaxError: function(data, transport) {
+ if(data.status == 0 && transport == null)
+ alert("The page is not served from a server! ajax call failed");
+ else if(typeof console != "undefined")
+ console.log("Ajax error: " + data.status + " " + transport);
+ },
+ /**
+ * date -> string
+ *
+ * @param {Object} date
+ */
+ _dateToString: function(date) {
+
+ return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
+ },
+ /**
+ * Parses an ISO date
+ * @param {String} d
+ */
+ _parseDate: function(d) {
+
+ var dateParts = d.split("-");
+ if(dateParts!==d)
+ dateParts = d.split("/");
+ return new Date(dateParts[0], (dateParts[1] - 1) ,dateParts[2]);
+ },
+ /**
+ * Builds or updates a prompt with the given information
+ *
+ * @param {jqObject} field
+ * @param {String} promptText html text to display type
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
+ * @param {boolean} ajaxed - use to mark fields than being validated with ajax
+ * @param {Map} options user options
+ */
+ _showPrompt: function(field, promptText, type, ajaxed, options, ajaxform) {
+ var prompt = methods._getPrompt(field);
+ // The ajax submit errors are not see has an error in the form,
+ // When the form errors are returned, the engine see 2 bubbles, but those are ebing closed by the engine at the same time
+ // Because no error was found befor submitting
+ if(ajaxform) prompt = false;
+ if (prompt)
+ methods._updatePrompt(field, prompt, promptText, type, ajaxed, options);
+ else
+ methods._buildPrompt(field, promptText, type, ajaxed, options);
+ },
+ /**
+ * Builds and shades a prompt for the given field.
+ *
+ * @param {jqObject} field
+ * @param {String} promptText html text to display type
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
+ * @param {boolean} ajaxed - use to mark fields than being validated with ajax
+ * @param {Map} options user options
+ */
+ _buildPrompt: function(field, promptText, type, ajaxed, options) {
+
+ // create the prompt
+ var prompt = $('');
+ prompt.addClass(methods._getClassName(field.attr("id")) + "formError");
+ // add a class name to identify the parent form of the prompt
+ if(field.is(":input")) prompt.addClass("parentForm"+methods._getClassName(field.parents('form').attr("id")));
+ prompt.addClass("formError");
+
+ switch (type) {
+ case "pass":
+ prompt.addClass("greenPopup");
+ break;
+ case "load":
+ prompt.addClass("blackPopup");
+ }
+ if (ajaxed)
+ prompt.addClass("ajaxed");
+
+ // create the prompt content
+ var promptContent = $('
').addClass("formErrorContent").html(promptText).appendTo(prompt);
+ // create the css arrow pointing at the field
+ // note that there is no triangle on max-checkbox and radio
+ if (options.showArrow) {
+ var arrow = $('
').addClass("formErrorArrow");
+
+ switch (options.promptPosition) {
+ case "bottomLeft":
+ case "bottomRight":
+ prompt.find(".formErrorContent").before(arrow);
+ arrow.addClass("formErrorArrowBottom").html('
');
+ break;
+ case "topLeft":
+ case "topRight":
+ arrow.html('
');
+ prompt.append(arrow);
+ break;
+ }
+ }
+
+ //Cedric: Needed if a container is in position:relative
+ // insert prompt in the form or in the overflown container?
+ if (options.isOverflown)
+ field.before(prompt);
+ else
+ $("body").append(prompt);
+
+ var pos = methods._calculatePosition(field, prompt, options);
+ prompt.css({
+ "top": pos.callerTopPosition,
+ "left": pos.callerleftPosition,
+ "marginTop": pos.marginTopSize,
+ "opacity": 0
+ });
+
+ return prompt.animate({
+ "opacity": 0.87
+ });
+
+ },
+ /**
+ * Updates the prompt text field - the field for which the prompt
+ * @param {jqObject} field
+ * @param {String} promptText html text to display type
+ * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
+ * @param {boolean} ajaxed - use to mark fields than being validated with ajax
+ * @param {Map} options user options
+ */
+ _updatePrompt: function(field, prompt, promptText, type, ajaxed, options) {
+
+ if (prompt) {
+ if (type == "pass")
+ prompt.addClass("greenPopup");
+ else
+ prompt.removeClass("greenPopup");
+
+ if (type == "load")
+ prompt.addClass("blackPopup");
+ else
+ prompt.removeClass("blackPopup");
+
+ if (ajaxed)
+ prompt.addClass("ajaxed");
+ else
+ prompt.removeClass("ajaxed");
+
+ prompt.find(".formErrorContent").html(promptText);
+
+ var pos = methods._calculatePosition(field, prompt, options);
+ prompt.animate({
+ "top": pos.callerTopPosition,
+ "marginTop": pos.marginTopSize
+ });
+ }
+ },
+ /**
+ * Closes the prompt associated with the given field
+ *
+ * @param {jqObject}
+ * field
+ */
+ _closePrompt: function(field) {
+
+ var prompt = methods._getPrompt(field);
+ if (prompt)
+ prompt.fadeTo("fast", 0, function() {
+ prompt.remove();
+ });
+ },
+ closePrompt: function(field) {
+ return methods._closePrompt(field);
+ },
+ /**
+ * Returns the error prompt matching the field if any
+ *
+ * @param {jqObject}
+ * field
+ * @return undefined or the error prompt (jqObject)
+ */
+ _getPrompt: function(field) {
+
+ var className = "." + methods._getClassName(field.attr("id")) + "formError";
+ var match = $(className)[0];
+ if (match)
+ return $(match);
+ },
+ /**
+ * Calculates prompt position
+ *
+ * @param {jqObject}
+ * field
+ * @param {jqObject}
+ * the prompt
+ * @param {Map}
+ * options
+ * @return positions
+ */
+ _calculatePosition: function(field, promptElmt, options) {
+
+ var promptTopPosition, promptleftPosition, marginTopSize;
+ var fieldWidth = field.width();
+ var promptHeight = promptElmt.height();
+
+ var overflow = options.isOverflown;
+ if (overflow) {
+ // is the form contained in an overflown container?
+ promptTopPosition = promptleftPosition = 0;
+ // compensation for the arrow
+ marginTopSize = -promptHeight;
+ } else {
+ var offset = field.offset();
+ promptTopPosition = offset.top;
+ promptleftPosition = offset.left;
+ marginTopSize = 0;
+ }
+
+ switch (options.promptPosition) {
+
+ default:
+ case "topRight":
+ if (overflow)
+ // Is the form contained in an overflown container?
+ promptleftPosition += fieldWidth - 30;
+ else {
+ promptleftPosition += fieldWidth - 30;
+ promptTopPosition += -promptHeight;
+ }
+ break;
+ case "topLeft":
+ promptTopPosition += -promptHeight - 10;
+ break;
+ case "centerRight":
+ promptleftPosition += fieldWidth + 13;
+ break;
+ case "bottomLeft":
+ promptTopPosition = promptTopPosition + field.height() + 15;
+ break;
+ case "bottomRight":
+ promptleftPosition += fieldWidth - 30;
+ promptTopPosition += field.height() + 5;
+ }
+
+ return {
+ "callerTopPosition": promptTopPosition + "px",
+ "callerleftPosition": promptleftPosition + "px",
+ "marginTopSize": marginTopSize + "px"
+ };
+ },
+ /**
+ * Saves the user options and variables in the form.data
+ *
+ * @param {jqObject}
+ * form - the form where the user option should be saved
+ * @param {Map}
+ * options - the user options
+ * @return the user options (extended from the defaults)
+ */
+ _saveOptions: function(form, options) {
+
+ // is there a language localisation ?
+ if ($.validationEngineLanguage)
+ var allRules = $.validationEngineLanguage.allRules;
+ else
+ $.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page");
+
+ var userOptions = $.extend({
+
+ // Name of the event triggering field validation
+ validationEventTrigger: "blur",
+ // Automatically scroll viewport to the first error
+ scroll: true,
+ // Opening box position, possible locations are: topLeft,
+ // topRight, bottomLeft, centerRight, bottomRight
+ promptPosition: "topRight",
+ bindMethod:"bind",
+ // internal, automatically set to true when it parse a _ajax rule
+ inlineAjax: false,
+ // if set to true, the form data is sent asynchronously via ajax to the form.action url (get)
+ ajaxFormValidation: false,
+ // Ajax form validation callback method: boolean onComplete(form, status, errors, options)
+ // retuns false if the form.submit event needs to be canceled.
+ ajaxFormValidationURL: false,
+ // The url to send the submit ajax validation (default to action)
+ onAjaxFormComplete: $.noop,
+ // called right before the ajax call, may return false to cancel
+ onBeforeAjaxFormValidation: $.noop,
+ // Stops form from submitting and execute function assiciated with it
+ onValidationComplete: false,
+
+ // Used when the form is displayed within a scrolling DIV
+ isOverflown: false,
+ overflownDIV: "",
+
+ // --- Internals DO NOT TOUCH or OVERLOAD ---
+ // validation rules and i18
+ allrules: allRules,
+ // true when form and fields are binded
+ binded: false,
+ // set to true, when the prompt arrow needs to be displayed
+ showArrow: true,
+ // did one of the validation fail ? kept global to stop further ajax validations
+ isError: false,
+ // Caches field validation status, typically only bad status are created.
+ // the array is used during ajax form validation to detect issues early and prevent an expensive submit
+ ajaxValidCache: {}
+
+ }, options);
+
+ form.data('jqv', userOptions);
+ return userOptions;
+ },
+
+ /**
+ * Removes forbidden characters from class name
+ * @param {String} className
+ */
+ _getClassName: function(className) {
+ return className.replace(":","_").replace(".","_");
+ }
+ };
+
+ /**
+ * Plugin entry point.
+ * You may pass an action as a parameter or a list of options.
+ * if none, the init and attach methods are being called.
+ * Remember: if you pass options, the attached method is NOT called automatically
+ *
+ * @param {String}
+ * method (optional) action
+ */
+ $.fn.validationEngine = function(method) {
+
+ var form = $(this);
+ if(!form[0]) return false; // stop here if the form does not exist
+
+ if (typeof(method) == 'string' && method.charAt(0) != '_' && methods[method]) {
+
+ // make sure init is called once
+ if(method != "showPrompt" && method != "hidePrompt" && method != "hide" && method != "hideAll")
+ methods.init.apply(form);
+
+ return methods[method].apply(form, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method == 'object' || !method) {
+ // default constructor with or without arguments
+ methods.init.apply(form, arguments);
+ return methods.attach.apply(form);
+ } else {
+ $.error('Method ' + method + ' does not exist in jQuery.validationEngine');
+ }
+ };
+})(jQuery);
\ No newline at end of file
diff --git a/js/swpm.password-meter.js b/js/swpm.password-meter.js
new file mode 100644
index 0000000..1e53aba
--- /dev/null
+++ b/js/swpm.password-meter.js
@@ -0,0 +1,41 @@
+(function($){
+ function check_pass_strength() {
+ var type = $('#swpm-profile-page').attr('type'), pass1 = $('#pass1').val(), pass2 = $('#pass2').val(), strength;
+ if (type === 'edit' && pass1.length === 0 && pass2.length === 0){
+ $('#pass1').closest('tr').removeClass('form-required');
+ }
+ else{
+ $('#pass1').closest('tr').addClass('form-required');
+ }
+ $('#pass-strength-result').removeClass('short bad good strong');
+ if ( ! pass1 ) {
+ $('#pass-strength-result').html( pwsL10n.empty );
+ return;
+ }
+
+ strength = wp.passwordStrength.meter( pass1, wp.passwordStrength.userInputBlacklist(), pass2 );
+ switch ( strength ) {
+ case 2:
+ $('#pass-strength-result').addClass('bad').html( pwsL10n['bad'] );
+ break;
+ case 3:
+ $('#pass-strength-result').addClass('good').html( pwsL10n['good'] );
+ break;
+ case 4:
+ $('#pass-strength-result').addClass('strong').html( pwsL10n['strong'] );
+ break;
+ case 5:
+ $('#pass-strength-result').addClass('short').html( pwsL10n['mismatch'] );
+ break;
+ default:
+ $('#pass-strength-result').addClass('short').html( pwsL10n['short'] );
+ }
+ }
+
+ $(document).ready( function() {
+ $('#pass1').val('').keyup( check_pass_strength );
+ $('#pass2').val('').keyup( check_pass_strength );
+ $('#pass-strength-result').show();
+ });
+
+})(jQuery);
diff --git a/languages/swpm-da_DA.mo b/languages/swpm-da_DA.mo
new file mode 100644
index 0000000..5b3198c
Binary files /dev/null and b/languages/swpm-da_DA.mo differ
diff --git a/languages/swpm-da_DA.po b/languages/swpm-da_DA.po
new file mode 100644
index 0000000..667b54c
--- /dev/null
+++ b/languages/swpm-da_DA.po
@@ -0,0 +1,934 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Simple Membership\n"
+"POT-Creation-Date: 2015-01-27 14:50+1000\n"
+"PO-Revision-Date: 2015-02-07 20:18+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.7.4\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: da_DK\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: simple-membership/classes/class.bAccessControl.php:21
+#: simple-membership/classes/class.bAccessControl.php:28
+#: simple-membership/classes/class.bAccessControl.php:48
+msgid "You need to login to view this content. "
+msgstr "Du skal logge ind for at se dette indhold."
+
+#: simple-membership/classes/class.bAccessControl.php:35
+#: simple-membership/classes/class.bAccessControl.php:39
+#: simple-membership/classes/class.bAccessControl.php:54
+msgid "You are not allowed to view this content"
+msgstr "Du har ikke tilladelse til at se dette indhold."
+
+#: simple-membership/classes/class.bAccessControl.php:72
+msgid "You do no have permission to view rest of the content"
+msgstr "Du har ikke tilladelse til at se resten af indholdet."
+
+#: simple-membership/classes/class.bAccessControl.php:76
+#: simple-membership/classes/class.bAccessControl.php:94
+msgid "You need to login to view the rest of the content. "
+msgstr "Du skal logge ind for at se resten af indholdet."
+
+#: simple-membership/classes/class.bAdminRegistration.php:49
+msgid "Registration Successful."
+msgstr "Du er nu registreret."
+
+#: simple-membership/classes/class.bAdminRegistration.php:54
+#: simple-membership/classes/class.bAdminRegistration.php:89
+#: simple-membership/classes/class.bMembershipLevel.php:42
+#: simple-membership/classes/class.bMembershipLevel.php:60
+msgid "Please correct the following:"
+msgstr "Korriger venligst følgende:"
+
+#: simple-membership/classes/class.bAjax.php:17
+#: simple-membership/classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "Anvendes allerede af en anden."
+
+#: simple-membership/classes/class.bAjax.php:29
+msgid "Available"
+msgstr "Ledig"
+
+#: simple-membership/classes/class.bAuth.php:46
+#: simple-membership/classes/class.bFrontRegistration.php:173
+msgid "User Not Found."
+msgstr "Bruger ikke fundet."
+
+#: simple-membership/classes/class.bAuth.php:53
+msgid "Password Empty or Invalid."
+msgstr "Kodeord er tomt eller ugyldigt."
+
+#: simple-membership/classes/class.bAuth.php:76
+msgid "Account is inactive."
+msgstr "Kontoen er inaktiv."
+
+#: simple-membership/classes/class.bAuth.php:93
+msgid "Account has expired."
+msgstr "Kontoen er udløbet."
+
+#: simple-membership/classes/class.bAuth.php:100
+msgid "You are logged in as:"
+msgstr "Du er logget ind som:"
+
+#: simple-membership/classes/class.bAuth.php:139
+msgid "Logged Out Successfully."
+msgstr "Du er nu logget ud."
+
+#: simple-membership/classes/class.bAuth.php:186
+msgid "Session Expired."
+msgstr "Session udløbet."
+
+#: simple-membership/classes/class.bAuth.php:194
+msgid "Invalid User Name"
+msgstr "Ugyldigt brugernavn"
+
+#: simple-membership/classes/class.bAuth.php:202
+msgid "Sorry! Something went wrong"
+msgstr "Beklager. Noget gik galt."
+
+#: simple-membership/classes/class.bCategoryList.php:15
+#: simple-membership/classes/class.bMembers.php:21
+#: simple-membership/classes/class.bMembershipLevels.php:8
+#: simple-membership/classes/class.bMembershipLevels.php:17
+#: simple-membership/views/add.php:30
+#: simple-membership/views/admin_member_form_common_part.php:2
+#: simple-membership/views/edit.php:52
+msgid "Membership Level"
+msgstr "Medlemskatergori"
+
+#: simple-membership/classes/class.bCategoryList.php:16
+#: simple-membership/classes/class.bMembershipLevels.php:9
+#: simple-membership/classes/class.simple-wp-membership.php:464
+msgid "Membership Levels"
+msgstr "Medlemskategorier"
+
+#: simple-membership/classes/class.bCategoryList.php:29
+#: simple-membership/classes/class.bMembers.php:16
+#: simple-membership/classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: simple-membership/classes/class.bCategoryList.php:30
+msgid "Name"
+msgstr "Navn"
+
+#: simple-membership/classes/class.bCategoryList.php:31
+msgid "Description"
+msgstr "Beskrivelse"
+
+#: simple-membership/classes/class.bCategoryList.php:32
+msgid "Count"
+msgstr "Antal"
+
+#: simple-membership/classes/class.bCategoryList.php:63
+msgid "Updated! "
+msgstr "Opdateret."
+
+#: simple-membership/classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr "Wordpress kontoen er oprettet, men email adressen matcher ikke."
+
+#: simple-membership/classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr "Email adressen matcher en Wordpress konto, men ikke denne."
+
+#: simple-membership/classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "Brugernavn er påkrævet"
+
+#: simple-membership/classes/class.bForm.php:44
+msgid "User name contains invalid character"
+msgstr "Brugernavn indeholder ugyldige karakterer."
+
+#: simple-membership/classes/class.bForm.php:52
+msgid "User name already exists."
+msgstr "Brugernavnet eksisterer allerede."
+
+#: simple-membership/classes/class.bForm.php:75
+msgid "Password is required"
+msgstr "Kodeord er påkrævet."
+
+#: simple-membership/classes/class.bForm.php:82
+msgid "Password mismatch"
+msgstr "Kodeordene matcher ikke."
+
+#: simple-membership/classes/class.bForm.php:98
+msgid "Email is required"
+msgstr "Email er påkrævet."
+
+#: simple-membership/classes/class.bForm.php:102
+msgid "Email is invalid"
+msgstr "Ugyldig email."
+
+#: simple-membership/classes/class.bForm.php:118
+msgid "Email is already used."
+msgstr "Email er allerede i brug."
+
+#: simple-membership/classes/class.bForm.php:184
+msgid "Member since field is invalid"
+msgstr "Medlem siden feltet er ugyldigt."
+
+#: simple-membership/classes/class.bForm.php:195
+msgid "Access starts field is invalid"
+msgstr "Adgangsfeltet er ugyldigt."
+
+#: simple-membership/classes/class.bForm.php:205
+msgid "Gender field is invalid"
+msgstr "Kønsfeltet er ugyldigt."
+
+#: simple-membership/classes/class.bForm.php:216
+msgid "Account state field is invalid"
+msgstr "Kontostatus feltet er ugyldigt."
+
+#: simple-membership/classes/class.bForm.php:223
+msgid "Invalid membership level"
+msgstr "Ugyldigt medlemskategori."
+
+#: simple-membership/classes/class.bFrontRegistration.php:61
+msgid "Registration Successful. "
+msgstr "Registrering fuldendt."
+
+#: simple-membership/classes/class.bFrontRegistration.php:61
+#: simple-membership/classes/class.bSettings.php:367
+msgid "Please"
+msgstr "Venligst"
+
+#: simple-membership/classes/class.bFrontRegistration.php:61
+#: simple-membership/classes/class.bSettings.php:367
+#: simple-membership/views/login.php:21
+msgid "Login"
+msgstr "Login"
+
+#: simple-membership/classes/class.bFrontRegistration.php:72
+#: simple-membership/classes/class.bFrontRegistration.php:152
+msgid "Please correct the following"
+msgstr "Ret venligst følgende:"
+
+#: simple-membership/classes/class.bFrontRegistration.php:106
+msgid "Membership Level Couldn't be found."
+msgstr "Medlemskategorien findes ikke."
+
+#: simple-membership/classes/class.bFrontRegistration.php:162
+msgid "Email Address Not Valid."
+msgstr "Email adressen er ugyldig."
+
+#: simple-membership/classes/class.bFrontRegistration.php:193
+msgid "New password has been sent to your email address."
+msgstr "Et nyt kodeord er blevet sendt til din email adresse."
+
+#: simple-membership/classes/class.bLevelForm.php:47
+msgid "Date format is not valid."
+msgstr "Datoformatet er ugyldigt."
+
+#: simple-membership/classes/class.bLevelForm.php:54
+msgid "Access duration must be > 0."
+msgstr "Tidsbegrænsningen skal være større end 0."
+
+#: simple-membership/classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Medlem"
+
+#: simple-membership/classes/class.bMembers.php:8
+#: simple-membership/classes/class.simple-wp-membership.php:462
+msgid "Members"
+msgstr "Medlemmer"
+
+#: simple-membership/classes/class.bMembers.php:17
+#: simple-membership/views/add.php:6 simple-membership/views/edit.php:4
+msgid "User Name"
+msgstr "Brugernavn"
+
+#: simple-membership/classes/class.bMembers.php:18
+#: simple-membership/views/add.php:22
+#: simple-membership/views/admin_member_form_common_part.php:15
+#: simple-membership/views/edit.php:20
+msgid "First Name"
+msgstr "Fornavn"
+
+#: simple-membership/classes/class.bMembers.php:19
+#: simple-membership/views/add.php:26
+#: simple-membership/views/admin_member_form_common_part.php:19
+#: simple-membership/views/edit.php:24
+msgid "Last Name"
+msgstr "Efternavn"
+
+#: simple-membership/classes/class.bMembers.php:20
+#: simple-membership/views/add.php:10 simple-membership/views/edit.php:8
+msgid "Email"
+msgstr "Email"
+
+#: simple-membership/classes/class.bMembers.php:22
+#: simple-membership/views/admin_member_form_common_part.php:11
+msgid "Access Starts"
+msgstr "Adgang starter"
+
+#: simple-membership/classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Konto status"
+
+#: simple-membership/classes/class.bMembers.php:35
+#: simple-membership/classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Slet"
+
+#: simple-membership/classes/class.bMembers.php:101
+msgid "No Member found."
+msgstr "Ingen medlemmer fundet."
+
+#: simple-membership/classes/class.bMembershipLevel.php:37
+msgid "Membership Level Creation Successful."
+msgstr "Oprettelsen af medlem er fuldendt."
+
+#: simple-membership/classes/class.bMembershipLevel.php:56
+msgid "Updated Successfully."
+msgstr "Opdatering er fuldendt."
+
+#: simple-membership/classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Rolle"
+
+#: simple-membership/classes/class.bMembershipLevels.php:19
+msgid "Access Valid For/Until"
+msgstr "Adgang gyldig i / indtil"
+
+#: simple-membership/classes/class.bSettings.php:30
+msgid "Plugin Documentation"
+msgstr "Plugin dokumentation"
+
+#: simple-membership/classes/class.bSettings.php:32
+msgid "General Settings"
+msgstr "Generel opsætning"
+
+#: simple-membership/classes/class.bSettings.php:34
+msgid "Enable Free Membership"
+msgstr "Tillad gratis medlemskab."
+
+#: simple-membership/classes/class.bSettings.php:37
+msgid "Enable/disable registration for free membership level"
+msgstr "Tillad / stop registrering af gratismedlemskaber."
+
+#: simple-membership/classes/class.bSettings.php:38
+msgid "Free Membership Level ID"
+msgstr "Gratis medlemskab niveau"
+
+#: simple-membership/classes/class.bSettings.php:41
+msgid "Assign free membership level ID"
+msgstr "Tildel gratis medlemskab niveau"
+
+#: simple-membership/classes/class.bSettings.php:42
+msgid "Enable More Tag Protection"
+msgstr "Tillad beskyttelse af flere tags."
+
+#: simple-membership/classes/class.bSettings.php:45
+msgid ""
+"Enables or disables \"more\" tag protection in the posts and pages. Anything "
+"after the More tag is protected. Anything before the more tag is teaser "
+"content."
+msgstr ""
+"Tillad eller stop \"more\" tag beskyttelse in indlæg og sider. Alt efter "
+"'mere' tag vil være beskyttet. Alt før 'mere' tag kan ses."
+
+#: simple-membership/classes/class.bSettings.php:46
+msgid "Hide Adminbar"
+msgstr "Skjul administrationsværktøjslinie"
+
+#: simple-membership/classes/class.bSettings.php:49
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"WordPress viser en administrationsværktøjslinie til brugere der er logget på "
+"på denne side. Marker hvis du ønsker at skjule administrationsværktøjslinien."
+
+#: simple-membership/classes/class.bSettings.php:51
+msgid "Default Account Status"
+msgstr "Normalt konto status"
+
+#: simple-membership/classes/class.bSettings.php:56
+msgid ""
+"Select the default account status for newly registered users. If you want to "
+"manually approve the members then you can set the status to \"Pending\"."
+msgstr ""
+"Vælg den normale konto status for nyregistrerede brugere. Hvis du ønsker at "
+"godkende medlemmerne manuelt, kan du sætte status som \"Afventer\"."
+
+#: simple-membership/classes/class.bSettings.php:62
+msgid "Pages Settings"
+msgstr "Sideopsætning"
+
+#: simple-membership/classes/class.bSettings.php:64
+msgid "Login Page URL"
+msgstr "Login side URL"
+
+#: simple-membership/classes/class.bSettings.php:68
+msgid "Registration Page URL"
+msgstr "Registreringsside URL"
+
+#: simple-membership/classes/class.bSettings.php:72
+msgid "Join Us Page URL"
+msgstr "Bliv medlem side URL"
+
+#: simple-membership/classes/class.bSettings.php:76
+msgid "Edit Profile Page URL"
+msgstr "Skift profilside URL"
+
+#: simple-membership/classes/class.bSettings.php:80
+msgid "Password Reset Page URL"
+msgstr "Kodeord reset side URL"
+
+#: simple-membership/classes/class.bSettings.php:85
+msgid "Test & Debug Settings"
+msgstr "Test & fejlrettelser indstillinger"
+
+#: simple-membership/classes/class.bSettings.php:91
+msgid "Enable Sandbox Testing"
+msgstr "Tillad sandbox test"
+
+#: simple-membership/classes/class.bSettings.php:94
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Tillad denne hvis du vil teste i sandbox."
+
+#: simple-membership/classes/class.bSettings.php:104
+msgid "Email Misc. Settings"
+msgstr "Diverse email indstillinger"
+
+#: simple-membership/classes/class.bSettings.php:106
+msgid "From Email Address"
+msgstr "Afsender email adresse"
+
+#: simple-membership/classes/class.bSettings.php:111
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "Email indstillinger (spørg for at færdiggøre registrering)"
+
+#: simple-membership/classes/class.bSettings.php:113
+#: simple-membership/classes/class.bSettings.php:124
+#: simple-membership/classes/class.bSettings.php:143
+msgid "Email Subject"
+msgstr "Email emne"
+
+#: simple-membership/classes/class.bSettings.php:117
+#: simple-membership/classes/class.bSettings.php:128
+#: simple-membership/classes/class.bSettings.php:147
+msgid "Email Body"
+msgstr "Email tekst"
+
+#: simple-membership/classes/class.bSettings.php:122
+msgid "Email Settings (Registration Complete)"
+msgstr "Email indstillinger (fuldendt registrering)"
+
+#: simple-membership/classes/class.bSettings.php:132
+msgid "Send Notification To Admin"
+msgstr "Send besked til administrator"
+
+#: simple-membership/classes/class.bSettings.php:136
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "Send email til medlem som tilføjes via administrationskontrolpanelet."
+
+#: simple-membership/classes/class.bSettings.php:141
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "Email indstillinger (besked om kontoopgradering)"
+
+#: simple-membership/classes/class.bSettings.php:367
+msgid "Not a Member?"
+msgstr "Ikke medlem?"
+
+#: simple-membership/classes/class.bSettings.php:367
+#: simple-membership/views/login.php:27
+msgid "Join Us"
+msgstr "Meld dig ind"
+
+#: simple-membership/classes/class.bUtils.php:63
+msgid "Active"
+msgstr "Aktiv"
+
+#: simple-membership/classes/class.bUtils.php:64
+msgid "Inactive"
+msgstr "Inaktiv"
+
+#: simple-membership/classes/class.bUtils.php:65
+msgid "Pending"
+msgstr "Afventer"
+
+#: simple-membership/classes/class.bUtils.php:66
+msgid "Expired"
+msgstr "Udløbet"
+
+#: simple-membership/classes/class.bUtils.php:251
+msgid "Never"
+msgstr "Aldrig"
+
+#: simple-membership/classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Registrering"
+
+#: simple-membership/classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Medlemslogin"
+
+#: simple-membership/classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Profil"
+
+#: simple-membership/classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "Kodeord reset"
+
+#: simple-membership/classes/class.simple-wp-membership.php:184
+msgid "You are not logged in."
+msgstr "Du er ikke logget ind."
+
+#: simple-membership/classes/class.simple-wp-membership.php:215
+msgid "Simple WP Membership Protection"
+msgstr "Simple WP Membership beskyttelse"
+
+#: simple-membership/classes/class.simple-wp-membership.php:228
+msgid "Simple Membership Protection options"
+msgstr "Simple Membership Protection valgmuligheder"
+
+#: simple-membership/classes/class.simple-wp-membership.php:244
+msgid "Do you want to protect this content?"
+msgstr "Vil du beskytte dette indhold?"
+
+#: simple-membership/classes/class.simple-wp-membership.php:249
+msgid "Select the membership level that can access this content:"
+msgstr "Vælg medlemskategori der kan tilgå dette indhold:"
+
+#: simple-membership/classes/class.simple-wp-membership.php:459
+msgid "WP Membership"
+msgstr "WP medlemskab"
+
+#: simple-membership/classes/class.simple-wp-membership.php:466
+msgid "Settings"
+msgstr "Indstillinger"
+
+#: simple-membership/classes/class.simple-wp-membership.php:468
+msgid "Add-ons"
+msgstr "Plugin"
+
+#: simple-membership/views/add.php:14 simple-membership/views/admin_add.php:19
+#: simple-membership/views/admin_edit.php:17
+#: simple-membership/views/edit.php:12 simple-membership/views/login.php:11
+msgid "Password"
+msgstr "Kodeord"
+
+#: simple-membership/views/add.php:18 simple-membership/views/edit.php:16
+msgid "Repeat Password"
+msgstr "Gentag kodeord"
+
+#: simple-membership/views/add.php:37
+msgid "Register"
+msgstr "Registrer"
+
+#: simple-membership/views/admin_add.php:6
+msgid "Add Member"
+msgstr "Tilmeld medlem"
+
+#: simple-membership/views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "Tilmeld helt ny bruger til denne hjemmeside."
+
+#: simple-membership/views/admin_add.php:11
+msgid "User name"
+msgstr "Brugernavn"
+
+#: simple-membership/views/admin_add.php:11
+#: simple-membership/views/admin_add.php:15
+#: simple-membership/views/admin_add_level.php:11
+#: simple-membership/views/admin_add_level.php:15
+#: simple-membership/views/admin_add_level.php:19
+#: simple-membership/views/admin_edit.php:9
+#: simple-membership/views/admin_edit.php:13
+#: simple-membership/views/admin_edit_level.php:10
+#: simple-membership/views/admin_edit_level.php:14
+#: simple-membership/views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(påkrævet)"
+
+#: simple-membership/views/admin_add.php:15
+#: simple-membership/views/admin_edit.php:13
+msgid "E-mail"
+msgstr "Email"
+
+#: simple-membership/views/admin_add.php:19
+msgid "(twice, required)"
+msgstr "(to gange, påkrævet)"
+
+#: simple-membership/views/admin_add.php:24
+#: simple-membership/views/admin_edit.php:21
+msgid "Strength indicator"
+msgstr "Styrkeindikator"
+
+#: simple-membership/views/admin_add.php:25
+#: simple-membership/views/admin_edit.php:22
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"Råd: Kodeordet skal være mindst syv karakterer langt. For at gøre det "
+"stærkere, brug store og små bogstaver, tal og symboler som ! \" ? $ % ^ "
+"& )."
+
+#: simple-membership/views/admin_add.php:29
+#: simple-membership/views/admin_edit.php:26
+#: simple-membership/views/loggedin.php:7
+msgid "Account Status"
+msgstr "Kontostatus"
+
+#: simple-membership/views/admin_add.php:36
+msgid "Add New Member "
+msgstr "Tilmeld nyt medlem"
+
+#: simple-membership/views/admin_addon_settings.php:2
+#: simple-membership/views/admin_payment_settings.php:2
+#: simple-membership/views/admin_settings.php:2
+#: simple-membership/views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Simple WP Membership indstillinger"
+
+#: simple-membership/views/admin_addon_settings.php:7
+msgid ""
+"Some of the simple membership plugin's addon settings and options will be "
+"displayed here (if you have them)"
+msgstr ""
+"Nogle af de Simple Membership plugin indstillinger vil blive vist her (hvis "
+"du har dem)."
+
+#: simple-membership/views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Opret ny medlemskategori."
+
+#: simple-membership/views/admin_add_level.php:11
+#: simple-membership/views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Medlemskategori navn"
+
+#: simple-membership/views/admin_add_level.php:15
+#: simple-membership/views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "Standard WordPress rolle"
+
+#: simple-membership/views/admin_add_level.php:19
+#: simple-membership/views/admin_edit_level.php:18
+msgid "Access Duration"
+msgstr "Adgangsvarighed"
+
+#: simple-membership/views/admin_add_level.php:22
+msgid "No Expiry (Access for this level will not expire until cancelled"
+msgstr ""
+"Intet udløb (adgang til denne medlemskategori vil ikke udløbe med mindre den "
+"slettes)."
+
+#: simple-membership/views/admin_add_level.php:23
+#: simple-membership/views/admin_add_level.php:25
+#: simple-membership/views/admin_add_level.php:27
+#: simple-membership/views/admin_add_level.php:29
+#: simple-membership/views/admin_edit_level.php:22
+#: simple-membership/views/admin_edit_level.php:25
+#: simple-membership/views/admin_edit_level.php:28
+#: simple-membership/views/admin_edit_level.php:31
+msgid "Expire After"
+msgstr "Udløber efter"
+
+#: simple-membership/views/admin_add_level.php:24
+#: simple-membership/views/admin_edit_level.php:23
+msgid "Days (Access expires after given number of days)"
+msgstr "Dage (adgang udløber efter et givent antal dage)"
+
+#: simple-membership/views/admin_add_level.php:26
+msgid "Weeks (Access expires after given number of weeks"
+msgstr "Uger (adgang udløber efter et givent antal uger)"
+
+#: simple-membership/views/admin_add_level.php:28
+#: simple-membership/views/admin_edit_level.php:29
+msgid "Months (Access expires after given number of months)"
+msgstr "Måneder (adgang udløber efter et givent antal måneder)"
+
+#: simple-membership/views/admin_add_level.php:30
+#: simple-membership/views/admin_edit_level.php:32
+msgid "Years (Access expires after given number of years)"
+msgstr "Ã
r (adgang udløber efter et givent antal år)"
+
+#: simple-membership/views/admin_add_level.php:31
+#: simple-membership/views/admin_edit_level.php:34
+msgid "Fixed Date Expiry"
+msgstr "Fast udløbsdato"
+
+#: simple-membership/views/admin_add_level.php:32
+#: simple-membership/views/admin_edit_level.php:35
+msgid "(Access expires on a fixed date)"
+msgstr "(Adgang udløber på en bestemt dato)"
+
+#: simple-membership/views/admin_add_level.php:36
+msgid "Access to older posts."
+msgstr "Adgang til ældre indlæg."
+
+#: simple-membership/views/admin_add_level.php:39
+msgid "Only allow access to posts published after the user's join date."
+msgstr "Tillad kun adgang til indlæg udgivet efter brugerens indmeldelsesdato."
+
+#: simple-membership/views/admin_add_level.php:45
+msgid "Add New Membership Level "
+msgstr "Opret ny medlemskategori."
+
+#: simple-membership/views/admin_add_ons_page.php:6
+msgid "Simple WP Membership::Add-ons"
+msgstr "Simple WP Membership :: Plugin"
+
+#: simple-membership/views/admin_category_list.php:2
+msgid "Simple WP Membership::Categories"
+msgstr "Simple WP Membership :: Kategorier"
+
+#: simple-membership/views/admin_category_list.php:7
+msgid ""
+"First of all, globally protect the category on your site by selecting "
+"\"General Protection\" from the drop-down box below and then select the "
+"categories that should be protected from non-logged in users."
+msgstr ""
+"Vælg ført global beskyttelse af kategorien på din internetside ved at vælge "
+"\"General Protection\" fra dropdown boksen nedenfor, og vælg så de "
+"kategorier som skal beskyttes mod brugere, der ikke er logget ind."
+
+#: simple-membership/views/admin_category_list.php:10
+msgid ""
+"Next, select an existing membership level from the drop-down box below and "
+"then select the categories you want to grant access to (for that particular "
+"membership level)."
+msgstr ""
+"Vælg derefter en eksistererende medlemskategori fra dropdown boksen "
+"herunder, og vælg så de kategorier du ønsker at give medlemskategorien "
+"adgang til."
+
+#: simple-membership/views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Ret medlem"
+
+#: simple-membership/views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Ret eksisterende medlemsindstillinger."
+
+#: simple-membership/views/admin_edit.php:9
+#: simple-membership/views/login.php:5
+msgid "Username"
+msgstr "Brugernavn"
+
+#: simple-membership/views/admin_edit.php:17
+msgid "(twice, leave empty to retain old password)"
+msgstr "(to gange, efterlad tomt for at bevare nuværende kodeord)"
+
+#: simple-membership/views/admin_edit.php:33
+msgid "Notify User"
+msgstr "Send besked til bruger"
+
+#: simple-membership/views/admin_edit.php:40
+msgid "Edit User "
+msgstr "Ret bruger"
+
+#: simple-membership/views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Ret medlemskategori"
+
+#: simple-membership/views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Ret medlemskategori."
+
+#: simple-membership/views/admin_edit_level.php:21
+msgid "No Expiry (Access for this level will not expire until cancelled)"
+msgstr ""
+"Intet udløb (adgang til denne kategori udløber ikke med mindre kategorien "
+"slettes)."
+
+#: simple-membership/views/admin_edit_level.php:26
+msgid "Weeks (Access expires after given number of weeks)"
+msgstr "Uger (adgang udløber efter et givent antal uger)"
+
+#: simple-membership/views/admin_edit_level.php:40
+msgid "Protect Older Posts (optional)"
+msgstr "Beskyt ældre indlæg (valgfrit)"
+
+#: simple-membership/views/admin_edit_level.php:43
+msgid ""
+"Only allow access to protected posts published after the members's join date."
+msgstr ""
+"Beskyt kun adgang til beskyttede indlæg udgivet efter medlemmets "
+"indmeldelsesdato."
+
+#: simple-membership/views/admin_edit_level.php:51
+msgid "Edit Membership Level "
+msgstr "Ret medlemskategori"
+
+#: simple-membership/views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Simple WP Membership :: Medlemmer"
+
+#: simple-membership/views/admin_members.php:3
+#: simple-membership/views/admin_members.php:19
+#: simple-membership/views/admin_membership_levels.php:20
+msgid "Add New"
+msgstr "Opret ny"
+
+#: simple-membership/views/admin_members.php:9
+#: simple-membership/views/admin_membership_levels.php:10
+msgid "search"
+msgstr "søg"
+
+#: simple-membership/views/admin_membership_levels.php:2
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Simple WP Membership :: Medlemskategori"
+
+#: simple-membership/views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "Medlemskategori"
+
+#: simple-membership/views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "HÃ¥ndter indholdsproduktion"
+
+#: simple-membership/views/admin_membership_level_menu.php:4
+msgid "Category Protection"
+msgstr "Kategoribeskyttelse"
+
+#: simple-membership/views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "Eksempel på indstillinger af indholdsbeskyttelse"
+
+#: simple-membership/views/admin_member_form_common_part.php:23
+msgid "Gender"
+msgstr "Køn"
+
+#: simple-membership/views/admin_member_form_common_part.php:30
+#: simple-membership/views/edit.php:28
+msgid "Phone"
+msgstr "Telefon"
+
+#: simple-membership/views/admin_member_form_common_part.php:34
+#: simple-membership/views/edit.php:32
+msgid "Street"
+msgstr "Gade"
+
+#: simple-membership/views/admin_member_form_common_part.php:38
+#: simple-membership/views/edit.php:36
+msgid "City"
+msgstr "By"
+
+#: simple-membership/views/admin_member_form_common_part.php:42
+#: simple-membership/views/edit.php:40
+msgid "State"
+msgstr "Stat"
+
+#: simple-membership/views/admin_member_form_common_part.php:46
+#: simple-membership/views/edit.php:44
+msgid "Zipcode"
+msgstr "Postnummer"
+
+#: simple-membership/views/admin_member_form_common_part.php:50
+#: simple-membership/views/edit.php:48
+msgid "Country"
+msgstr "Land"
+
+#: simple-membership/views/admin_member_form_common_part.php:54
+msgid "Company"
+msgstr "Virksomhed"
+
+#: simple-membership/views/admin_member_form_common_part.php:58
+msgid "Member Since"
+msgstr "Medlem siden"
+
+#: simple-membership/views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "PayPal integrationsindstillinger"
+
+#: simple-membership/views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "Generer \"avancerede muligheder\" kode til din PayPal knap"
+
+#: simple-membership/views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Indtast medlemskategori ID"
+
+#: simple-membership/views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "Generer kode"
+
+#: simple-membership/views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Generer et registrering komplet link"
+
+#: simple-membership/views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Du kan generere et registrering komplet link manuelt her og give det til dit "
+"medlem, hvis medlemmet ikke har emailen, som blev sendt automatisk "
+"umiddelbart efter betaling."
+
+#: simple-membership/views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "Generer registrering komplet link"
+
+#: simple-membership/views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "ELLER"
+
+#: simple-membership/views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "For alle afventende registreringer"
+
+#: simple-membership/views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Registrering komplet links vil fremgå herunder:"
+
+#: simple-membership/views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "Send også email med registreringspåmindelse"
+
+#: simple-membership/views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "Send"
+
+#: simple-membership/views/edit.php:58
+msgid "Update"
+msgstr "Opdater"
+
+#: simple-membership/views/forgot_password.php:5
+msgid "Email Address"
+msgstr "Email adresse"
+
+#: simple-membership/views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "Opdater kodeord"
+
+#: simple-membership/views/loggedin.php:3
+msgid "Logged in as"
+msgstr "Logged ind som"
+
+#: simple-membership/views/loggedin.php:11
+msgid "Membership"
+msgstr "Medlemskab"
+
+#: simple-membership/views/loggedin.php:15
+msgid "Account Expiry"
+msgstr "Kontoudløb"
+
+#: simple-membership/views/loggedin.php:19
+msgid "Logout"
+msgstr "Log ud"
+
+#: simple-membership/views/login.php:18
+msgid "Remember Me"
+msgstr "PÃ¥mind mig"
+
+#: simple-membership/views/login.php:24
+msgid "Forgot Password"
+msgstr "Glemt kodeord"
diff --git a/languages/swpm-de_DE.mo b/languages/swpm-de_DE.mo
new file mode 100644
index 0000000..6b2e65f
Binary files /dev/null and b/languages/swpm-de_DE.mo differ
diff --git a/languages/swpm-de_DE.po b/languages/swpm-de_DE.po
new file mode 100644
index 0000000..d700414
--- /dev/null
+++ b/languages/swpm-de_DE.po
@@ -0,0 +1,710 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: simple membership plugin depal\n"
+"POT-Creation-Date: 2014-08-28 19:28+1000\n"
+"PO-Revision-Date: 2014-10-10 09:44+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.9\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: en_US\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAccessControl.php:23 classes/class.bAccessControl.php:40
+msgid "You are not allowed to view this content"
+msgstr "Sie haben keine Berechtigung diesen Inhalt zu sehen."
+
+#: classes/class.bAccessControl.php:26 classes/class.bAccessControl.php:43
+msgid "You need to login to view this content. "
+msgstr "Sie müssen Sich einloggen um den Inhalt lesen zu können."
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:64
+msgid "Registration Successful."
+msgstr "Registrierung erfolgreich"
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:73
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "Bitte korrigieren Sie folgendes:"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "bereits verwendet"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "verfügbar"
+
+#: classes/class.bAuth.php:48 classes/class.bFrontRegistration.php:179
+msgid "User Not Found."
+msgstr "Benutzer unbekannt"
+
+#: classes/class.bAuth.php:55
+msgid "Password Empty or Invalid."
+msgstr "kein oder ungültiges Passwort"
+
+#: classes/class.bAuth.php:79
+msgid "Account is inactive."
+msgstr "Account in inaktiv"
+
+#: classes/class.bAuth.php:89
+msgid "You are logged in as:"
+msgstr "eingeloggt als:"
+
+#: classes/class.bAuth.php:128
+msgid "Logged Out Successfully."
+msgstr "Sie haben Sich erfolgreich ausgeloggt"
+
+#: classes/class.bAuth.php:170
+msgid "Session Expired."
+msgstr "Sitzung abgelaufen"
+
+#: classes/class.bAuth.php:179
+msgid "Invalid User Name"
+msgstr "Ungültiger Benutzername"
+
+#: classes/class.bAuth.php:187
+msgid "Bad Cookie Hash"
+msgstr "Bad Cookie Hash"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"Es existiert bereits ein Account mit den angegebenen Benutzernamen. Die E-"
+"Mail Adresse passt nicht zum Benutznamen"
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"Es existiert bereits ein Account mit der angegebenen E-Mail Adresse. Der "
+"Benutzername passt nicht zur E-Mail Adresse"
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "Benutzername erforderlich"
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "Benutzername wird bereits verwendet"
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "Passwort erforderlich"
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "Passwörter stimmen nicht überein"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "E-Mail Adresse erforderlich"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "ungültige E-Mail Adresse"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "E-Mail Adresse wird bereits verwendet"
+
+#: classes/class.bForm.php:178
+msgid "Member since field is invalid"
+msgstr "\"Mitglied seit\" Feld ist inkorrekt"
+
+#: classes/class.bForm.php:189
+msgid "Subscription starts field is invalid"
+msgstr "\"Mitgliedschaft beginnt am\" Feld ist inkorrekt"
+
+#: classes/class.bForm.php:199
+msgid "Gender field is invalid"
+msgstr "Feld \"Geschlecht\" ist inkorrekt"
+
+#: classes/class.bForm.php:210
+msgid "Account state field is invalid"
+msgstr "Accountstatus Feld ist ungültig"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+msgid "Please"
+msgstr "Bitte"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+#: views/login.php:21
+msgid "Login"
+msgstr "Login"
+
+#: classes/class.bFrontRegistration.php:79
+#: classes/class.bFrontRegistration.php:158
+msgid "Please correct the following"
+msgstr "Bitte korrigieren Sie folgendes"
+
+#: classes/class.bFrontRegistration.php:92
+msgid "Membership Level Couldn't be found."
+msgstr "Mitgliedschaftslevel konnte nicht gefunden werden"
+
+#: classes/class.bFrontRegistration.php:168
+msgid "Email Address Not Valid."
+msgstr "Ungültige E-Mail Adresse"
+
+#: classes/class.bFrontRegistration.php:199
+msgid "New password has been sent to your email address."
+msgstr "Ein neues Passwort wurde an Ihre E-Mail Adresse versandt"
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "Mitgliedschaft muss länger als 0 sein"
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Mitglied"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:467
+msgid "Members"
+msgstr "Mitglieder"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "Benutzername"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "Vorname"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "Nachname"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "E-Mail Adresse"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "Mitgliedschaft"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "Mitgliedschaft beginnt"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Account Status"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Löschen"
+
+#: classes/class.bMembers.php:100
+msgid "No Member found."
+msgstr "Kein Benutzer gefunden."
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "Mitgliedschaftslevel erfolgreich hergestellt"
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "Update erfolgreich"
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:469
+msgid "Membership Levels"
+msgstr "Migliedschaftslevels"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Rolle"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "Mitgliedschaft gültig für"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "Plugin Dokumentation"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "Allgemeine Einstellungen"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "Kostenlose Mitgliedschaft freischalten"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "Registrieren für kostenlose Mitgliedschaft aktivieren/deaktivieren"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "Kostenlose Mitgliedschaft "
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "Kostenlose Mitgliedschafts-ID zuweisen"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "Adminbar verstecken"
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"Füe eingeloggte User ist in WordPress die Admin Toolbar standardmäÃig "
+"sichtbar. Setzen Sie ein Häkchen um die Admin Toolbar auszublenden"
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "Seiteneinstellungen"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "Login Seite URL"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "Registrierungsseite URL"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "Mit"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "Profilseite URL"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "Passwort zurücksetzen URL"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "Test & Debug Einstellungen"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "Sandkasten Tests aktivieren"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Aktivieren Sie diese Option um die Sandkasten-Bezahlmethode zu testen"
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "Diverse E-Mail Einstellungen"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "\"von\" E-Mail Adresse"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "E-Mail Einstellungen (vor vollständiger Registrierung)"
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "E-Mail Betreff"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "E-Mail Text"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "E-Mail Einstellungen (Registrierung abgeschlossen)"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "Administrator benachrichtigen"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr ""
+"Mitglied mit E-Mail benachrichtigen wenn er vom Administrator hinzugefügt "
+"wird"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "E-Mail Einstellungen (Account Upgrade Benachrichtigung)"
+
+#: classes/class.bSettings.php:326
+msgid "Not a Member?"
+msgstr "Kein Zugang?"
+
+#: classes/class.bSettings.php:326 views/login.php:30
+msgid "Join Us"
+msgstr "Mitgliedschaftsseite URL"
+
+#: classes/class.bUtils.php:32 views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "Aktiv"
+
+#: classes/class.bUtils.php:33 views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "Inaktiv"
+
+#: classes/class.bUtils.php:34 views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "ausstehend"
+
+#: classes/class.bUtils.php:35 views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "abgelaufen"
+
+#: classes/class.bUtils.php:225
+msgid "Never"
+msgstr "nie"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Registrierung"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Mitglieder Login"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Profil"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "Passwort zurücksetzen"
+
+#: classes/class.simple-wp-membership.php:178
+msgid "You are not logged in."
+msgstr "Sie sind nicht eingeloggt"
+
+#: classes/class.simple-wp-membership.php:209
+msgid "Simple WP Membership Protection"
+msgstr "Einfacher WP Mitgliedschaftsschutz"
+
+#: classes/class.simple-wp-membership.php:222
+msgid "Simple Membership Protection options"
+msgstr "Schutz-Einstellungen für Simple Membership"
+
+#: classes/class.simple-wp-membership.php:238
+msgid "Do you want to protect this content?"
+msgstr "Möchten Sie diesen Inhalt schützen?"
+
+#: classes/class.simple-wp-membership.php:243
+msgid "Select the membership level that can access this content:"
+msgstr "Migliedschaftslevel auswählen mit Zugang zu diesem Inhalt:"
+
+#: classes/class.simple-wp-membership.php:375
+msgid "Display SWPM Login."
+msgstr "Zeige SWPM Login"
+
+#: classes/class.simple-wp-membership.php:377
+msgid "SWPM Login"
+msgstr "SWPM Login"
+
+#: classes/class.simple-wp-membership.php:464
+msgid "WP Membership"
+msgstr "WP Mitgliedschaft"
+
+#: classes/class.simple-wp-membership.php:471
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "Passwort"
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "Passwort wiederholen"
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "Geschlecht"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "Telefon"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "StraÃe"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "Stadt"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "Bundesland"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "PLZ"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "Land"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "Firma"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "Registrieren"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "Mitglied hinzufügen"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "Einen neuen Benutzer erstellen und ihn zu dieser Seite hinzufügen"
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "Benutzername"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(Pflichtfeld)"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "E-Mail"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "Einen neuen Mitglied hinzufügen"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Neues Mitgliedschaftslevel erstellen"
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Name des Mitgliedschaftslevels"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "Standard WordPress Rolle"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "Dauer der Mitgliedschaft"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "Kein Ablauf"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "Neues Mitgliedschaftslevel hinzufügen"
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Mitglied ändern"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Benutzer Details ändern"
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "Benutzername"
+
+#: views/admin_edit.php:18
+msgid "Edit User "
+msgstr "Benutzer ändern"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Mitgliedschaftslevel ändern"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Mitgliedschaftslevel ändern."
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "Mitgliedschaftslevel ändern"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Simple WP Membership::Members"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "Neu"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "suchen"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Simple WP Membership::Mitgliedschaftslevels"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "Mitgliedschaftslevel"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "Content Herstellung steuern"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "Beispiel Inhaltsschutz Einstellungen"
+
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(zweimal, erforderlich)"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "Stärke"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"Hinweis: Das Passwort muss mindestens 7 Zeichen lang sein. Abwechselnde GroÃ-"
+"und Kleinschreibung, Nummern und Symbole erhöhen die Sicherheit"
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "Account Status"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "Mitglied seit"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Simple WP Membership Einstellungen"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "Paypal Integrationseinstellungen"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr ""
+"Generiere den \"fortgeschrittene Variablen\" Code für den Paypal Button"
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Mitgliedschaftslevel ID eingeben"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "Code generieren"
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Einen \"Registrierung abgeschlossen\" Link generieren"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Sie können hier manuell einen \"Registrierung abgeschlossen\" Link "
+"generieren falls Ihr Kunde die automatische E-Mail verlegt hat."
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "\"Registrierung Abgeschlossen\" Link generieren"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "ODER"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "Für alle ausstehenden Registrierungen"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Registrierung Abgeschlossen Links werden auftauen unter:"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "Registrierungserinnerung per E-Mail verschicken"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "abschicken"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "E-Mail Adresse"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "Passwort zurücksetzen"
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "Eingeloggt als"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "Mitgliedschaft"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:12
+msgid "Account Expiry"
+msgstr "Account verfällt am"
+
+#: views/loggedin.php:19 views/login_widget_logged.php:16
+msgid "Logout"
+msgstr "ausloggen"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "Anmeldedaten speichern"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "Passwort vergessen"
diff --git a/languages/swpm-es_ES.mo b/languages/swpm-es_ES.mo
new file mode 100644
index 0000000..03aedfb
Binary files /dev/null and b/languages/swpm-es_ES.mo differ
diff --git a/languages/swpm-es_ES.po b/languages/swpm-es_ES.po
new file mode 100644
index 0000000..50dae07
--- /dev/null
+++ b/languages/swpm-es_ES.po
@@ -0,0 +1,971 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Simple Membership\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-27 14:50+1000\n"
+"PO-Revision-Date: 2015-02-02 16:38-0400\n"
+"Last-Translator: e-rgonomy.com
\n"
+"Language-Team: e-rgonomy.com \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Generator: Poedit 1.7.4\n"
+"X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;"
+"__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
+"_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;"
+"esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;"
+"esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n"
+"X-Poedit-Basepath: .\n"
+"X-Loco-Target-Locale: es_ES\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: simple-membership/classes/class.bAccessControl.php:21
+#: simple-membership/classes/class.bAccessControl.php:28
+#: simple-membership/classes/class.bAccessControl.php:48
+msgid "You need to login to view this content. "
+msgstr "Necesita identificarse para ver este contenido"
+
+#: simple-membership/classes/class.bAccessControl.php:35
+#: simple-membership/classes/class.bAccessControl.php:39
+#: simple-membership/classes/class.bAccessControl.php:54
+msgid "You are not allowed to view this content"
+msgstr "Usted no tiene permiso para ver este contenido"
+
+#: simple-membership/classes/class.bAccessControl.php:72
+msgid "You do no have permission to view rest of the content"
+msgstr "No dispone de los permisos para ver el resto del contenido."
+
+#: simple-membership/classes/class.bAccessControl.php:76
+#: simple-membership/classes/class.bAccessControl.php:94
+msgid "You need to login to view the rest of the content. "
+msgstr "Necesita identificarse antes de ver el resto del contenido."
+
+#: simple-membership/classes/class.bAdminRegistration.php:49
+msgid "Registration Successful."
+msgstr "Registro completado"
+
+#: simple-membership/classes/class.bAdminRegistration.php:54
+#: simple-membership/classes/class.bAdminRegistration.php:89
+#: simple-membership/classes/class.bMembershipLevel.php:42
+#: simple-membership/classes/class.bMembershipLevel.php:60
+msgid "Please correct the following:"
+msgstr "Por favor, corrija lo siguiente:"
+
+#: simple-membership/classes/class.bAjax.php:17
+#: simple-membership/classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "No disponible"
+
+#: simple-membership/classes/class.bAjax.php:29
+msgid "Available"
+msgstr "Disponible"
+
+#: simple-membership/classes/class.bAuth.php:46
+#: simple-membership/classes/class.bFrontRegistration.php:173
+msgid "User Not Found."
+msgstr "Usuario no encontrado."
+
+#: simple-membership/classes/class.bAuth.php:53
+msgid "Password Empty or Invalid."
+msgstr "Contraseña vacÃa o no válida."
+
+#: simple-membership/classes/class.bAuth.php:76
+msgid "Account is inactive."
+msgstr "Esta cuenta está inactiva."
+
+#: simple-membership/classes/class.bAuth.php:93
+msgid "Account has expired."
+msgstr "Su cuenta ha expirado."
+
+#: simple-membership/classes/class.bAuth.php:100
+msgid "You are logged in as:"
+msgstr "Identificado como:"
+
+#: simple-membership/classes/class.bAuth.php:139
+msgid "Logged Out Successfully."
+msgstr "Se ha cerrado la sesión correctamente."
+
+#: simple-membership/classes/class.bAuth.php:186
+msgid "Session Expired."
+msgstr "Sesión finalizada."
+
+#: simple-membership/classes/class.bAuth.php:194
+msgid "Invalid User Name"
+msgstr "Nombre de usuario no válido"
+
+#: simple-membership/classes/class.bAuth.php:202
+msgid "Sorry! Something went wrong"
+msgstr "Algo va mal."
+
+#: simple-membership/classes/class.bCategoryList.php:15
+#: simple-membership/classes/class.bMembers.php:21
+#: simple-membership/classes/class.bMembershipLevels.php:8
+#: simple-membership/classes/class.bMembershipLevels.php:17
+#: simple-membership/views/add.php:30
+#: simple-membership/views/admin_member_form_common_part.php:2
+#: simple-membership/views/edit.php:52
+msgid "Membership Level"
+msgstr "Nivel de membresÃa"
+
+#: simple-membership/classes/class.bCategoryList.php:16
+#: simple-membership/classes/class.bMembershipLevels.php:9
+#: simple-membership/classes/class.simple-wp-membership.php:464
+msgid "Membership Levels"
+msgstr "Niveles de membresÃa."
+
+#: simple-membership/classes/class.bCategoryList.php:29
+#: simple-membership/classes/class.bMembers.php:16
+#: simple-membership/classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: simple-membership/classes/class.bCategoryList.php:30
+msgid "Name"
+msgstr "Nombre"
+
+#: simple-membership/classes/class.bCategoryList.php:31
+msgid "Description"
+msgstr "Descripción"
+
+#: simple-membership/classes/class.bCategoryList.php:32
+msgid "Count"
+msgstr "Contador"
+
+#: simple-membership/classes/class.bCategoryList.php:63
+msgid "Updated! "
+msgstr "¡Actualizado!"
+
+#: simple-membership/classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"Ya existe una cuenta con este nombre de usuario, pero el correo electrónico "
+"proporcionado no coincide."
+
+#: simple-membership/classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"Existe una cuenta con el mail proporcionado, pero el nombre usuario no "
+"coincide."
+
+#: simple-membership/classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "Debe de escribir un nombre de usuario."
+
+#: simple-membership/classes/class.bForm.php:44
+msgid "User name contains invalid character"
+msgstr "El nombre de usuario contiene carácteres no válidos"
+
+#: simple-membership/classes/class.bForm.php:52
+msgid "User name already exists."
+msgstr "El nombre de usuario ya está en uso."
+
+#: simple-membership/classes/class.bForm.php:75
+msgid "Password is required"
+msgstr "Debe escribir una contraseña."
+
+#: simple-membership/classes/class.bForm.php:82
+msgid "Password mismatch"
+msgstr "Contraseña incorrecta"
+
+#: simple-membership/classes/class.bForm.php:98
+msgid "Email is required"
+msgstr "Debe de proporcionar un email o correo electrónico"
+
+#: simple-membership/classes/class.bForm.php:102
+msgid "Email is invalid"
+msgstr "El correo electrónico proporcionado no es válido"
+
+#: simple-membership/classes/class.bForm.php:118
+msgid "Email is already used."
+msgstr "El mail o correo electrónico proporcionado ya está en uso."
+
+#: simple-membership/classes/class.bForm.php:184
+msgid "Member since field is invalid"
+msgstr "La fecha introducida en \"Miembro desde\" no es válida (dd/mm/aaaa)"
+
+#: simple-membership/classes/class.bForm.php:195
+msgid "Access starts field is invalid"
+msgstr "La fecha de comienzo no es válida"
+
+#: simple-membership/classes/class.bForm.php:205
+msgid "Gender field is invalid"
+msgstr "El valor introducido en el campo \"Genero\" no es válido"
+
+#: simple-membership/classes/class.bForm.php:216
+msgid "Account state field is invalid"
+msgstr "El valor introducido en el campo \"Estado de la cuenta\" no es válido"
+
+#: simple-membership/classes/class.bForm.php:223
+msgid "Invalid membership level"
+msgstr "Nivel de membresÃa no válido."
+
+#: simple-membership/classes/class.bFrontRegistration.php:61
+msgid "Registration Successful. "
+msgstr "Registro correcto."
+
+#: simple-membership/classes/class.bFrontRegistration.php:61
+#: simple-membership/classes/class.bSettings.php:367
+msgid "Please"
+msgstr "Por favor"
+
+#: simple-membership/classes/class.bFrontRegistration.php:61
+#: simple-membership/classes/class.bSettings.php:367
+#: simple-membership/views/login.php:21
+msgid "Login"
+msgstr "Identificarse"
+
+#: simple-membership/classes/class.bFrontRegistration.php:72
+#: simple-membership/classes/class.bFrontRegistration.php:152
+msgid "Please correct the following"
+msgstr "Por favor, corrija lo siguiente"
+
+#: simple-membership/classes/class.bFrontRegistration.php:106
+msgid "Membership Level Couldn't be found."
+msgstr "El nivel de membresÃa no ha sido encontrado."
+
+#: simple-membership/classes/class.bFrontRegistration.php:162
+msgid "Email Address Not Valid."
+msgstr "El email o correo electrónico proporcionado no es válido."
+
+#: simple-membership/classes/class.bFrontRegistration.php:193
+msgid "New password has been sent to your email address."
+msgstr "La nueva contraseña ha sido enviada a su email o correo electrónico."
+
+#: simple-membership/classes/class.bLevelForm.php:47
+msgid "Date format is not valid."
+msgstr "El formato de fecha no es válido."
+
+#: simple-membership/classes/class.bLevelForm.php:54
+msgid "Access duration must be > 0."
+msgstr "La duración del acceso debe ser mayor a 0."
+
+#: simple-membership/classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Miembro"
+
+#: simple-membership/classes/class.bMembers.php:8
+#: simple-membership/classes/class.simple-wp-membership.php:462
+msgid "Members"
+msgstr "Miembros"
+
+#: simple-membership/classes/class.bMembers.php:17
+#: simple-membership/views/add.php:6 simple-membership/views/edit.php:4
+msgid "User Name"
+msgstr "Nombre de usuario"
+
+#: simple-membership/classes/class.bMembers.php:18
+#: simple-membership/views/add.php:22
+#: simple-membership/views/admin_member_form_common_part.php:15
+#: simple-membership/views/edit.php:20
+msgid "First Name"
+msgstr "Nombre"
+
+#: simple-membership/classes/class.bMembers.php:19
+#: simple-membership/views/add.php:26
+#: simple-membership/views/admin_member_form_common_part.php:19
+#: simple-membership/views/edit.php:24
+msgid "Last Name"
+msgstr "Apellidos"
+
+#: simple-membership/classes/class.bMembers.php:20
+#: simple-membership/views/add.php:10 simple-membership/views/edit.php:8
+msgid "Email"
+msgstr "Email"
+
+#: simple-membership/classes/class.bMembers.php:22
+#: simple-membership/views/admin_member_form_common_part.php:11
+msgid "Access Starts"
+msgstr "El acceso comienza"
+
+#: simple-membership/classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Estado de la cuenta"
+
+#: simple-membership/classes/class.bMembers.php:35
+#: simple-membership/classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Eliminar"
+
+#: simple-membership/classes/class.bMembers.php:101
+msgid "No Member found."
+msgstr "No se han encontrado miembros."
+
+#: simple-membership/classes/class.bMembershipLevel.php:37
+msgid "Membership Level Creation Successful."
+msgstr "Tipo de miembros creado con éxito."
+
+#: simple-membership/classes/class.bMembershipLevel.php:56
+msgid "Updated Successfully."
+msgstr "Actualizado con éxito."
+
+#: simple-membership/classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Rol"
+
+#: simple-membership/classes/class.bMembershipLevels.php:19
+msgid "Access Valid For/Until"
+msgstr "Acceso válido para/hasta"
+
+#: simple-membership/classes/class.bSettings.php:30
+msgid "Plugin Documentation"
+msgstr "Documentación del Plugin"
+
+#: simple-membership/classes/class.bSettings.php:32
+msgid "General Settings"
+msgstr "Ajustes Generales"
+
+#: simple-membership/classes/class.bSettings.php:34
+msgid "Enable Free Membership"
+msgstr "Habilitar nivel gratuito"
+
+#: simple-membership/classes/class.bSettings.php:37
+msgid "Enable/disable registration for free membership level"
+msgstr "Permitir/Denegar registro para el nivel de miembros gratuitos"
+
+#: simple-membership/classes/class.bSettings.php:38
+msgid "Free Membership Level ID"
+msgstr "ID CategorÃa de miembros gratuitos"
+
+#: simple-membership/classes/class.bSettings.php:41
+msgid "Assign free membership level ID"
+msgstr "Asignar nivel ID a los miembros gratuitos"
+
+#: simple-membership/classes/class.bSettings.php:42
+msgid "Enable More Tag Protection"
+msgstr "Activar más protección de etiquetas"
+
+#: simple-membership/classes/class.bSettings.php:45
+msgid ""
+"Enables or disables \"more\" tag protection in the posts and pages. Anything "
+"after the More tag is protected. Anything before the more tag is teaser "
+"content."
+msgstr ""
+"Activar o desactivar más protección en las entradas y páginas. Todo lo que "
+"se incluya bajo el tag \"MÃS\" es restringido, el resto es accesible a todos."
+
+#: simple-membership/classes/class.bSettings.php:46
+msgid "Hide Adminbar"
+msgstr "Esconder Barra superior de inicio de sesión"
+
+#: simple-membership/classes/class.bSettings.php:49
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"WordPress muestra la barra de herramientas para iniciado sesión. Marcar esta "
+"casilla si desea ocultar esta barra."
+
+#: simple-membership/classes/class.bSettings.php:51
+msgid "Default Account Status"
+msgstr "Estado de lal cuenta por defecto"
+
+#: simple-membership/classes/class.bSettings.php:56
+msgid ""
+"Select the default account status for newly registered users. If you want to "
+"manually approve the members then you can set the status to \"Pending\"."
+msgstr ""
+"Seleccionar una cuenta por defecto para nuevos registros. Si desea aprobar "
+"manualmente los miembros, establezca el estado a \"Pendiente\"."
+
+#: simple-membership/classes/class.bSettings.php:62
+msgid "Pages Settings"
+msgstr "Ajustes de las páguinas"
+
+#: simple-membership/classes/class.bSettings.php:64
+msgid "Login Page URL"
+msgstr "URL Página de Inicio de sesión"
+
+#: simple-membership/classes/class.bSettings.php:68
+msgid "Registration Page URL"
+msgstr "URL Página de registro"
+
+#: simple-membership/classes/class.bSettings.php:72
+msgid "Join Us Page URL"
+msgstr "URL Página de \"Unete a nosotros\""
+
+#: simple-membership/classes/class.bSettings.php:76
+msgid "Edit Profile Page URL"
+msgstr "URL Página de Editar Perfil"
+
+#: simple-membership/classes/class.bSettings.php:80
+msgid "Password Reset Page URL"
+msgstr "URL Página de Restablecer contraseña"
+
+#: simple-membership/classes/class.bSettings.php:85
+msgid "Test & Debug Settings"
+msgstr "Ajustes de Test & Debug"
+
+#: simple-membership/classes/class.bSettings.php:91
+msgid "Enable Sandbox Testing"
+msgstr "Permitir Test Sandbox"
+
+#: simple-membership/classes/class.bSettings.php:94
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Permitir esta opción si quiere testear pagos Sandbox"
+
+#: simple-membership/classes/class.bSettings.php:104
+msgid "Email Misc. Settings"
+msgstr "Ajustes Email Misc."
+
+#: simple-membership/classes/class.bSettings.php:106
+msgid "From Email Address"
+msgstr "Correo electrónico del remitente"
+
+#: simple-membership/classes/class.bSettings.php:111
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "Ajustes de Mail (solicitud para completar el registro)"
+
+#: simple-membership/classes/class.bSettings.php:113
+#: simple-membership/classes/class.bSettings.php:124
+#: simple-membership/classes/class.bSettings.php:143
+msgid "Email Subject"
+msgstr "Asunto del mensaje"
+
+#: simple-membership/classes/class.bSettings.php:117
+#: simple-membership/classes/class.bSettings.php:128
+#: simple-membership/classes/class.bSettings.php:147
+msgid "Email Body"
+msgstr "Cuerpo del mensaje"
+
+#: simple-membership/classes/class.bSettings.php:122
+msgid "Email Settings (Registration Complete)"
+msgstr "Ajustes Mail (Registro Completado)"
+
+#: simple-membership/classes/class.bSettings.php:132
+msgid "Send Notification To Admin"
+msgstr "Enviar notificación al Administrador"
+
+#: simple-membership/classes/class.bSettings.php:136
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "Enviar mail al miembro cuando ha sido añadido por el administrador"
+
+#: simple-membership/classes/class.bSettings.php:141
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "Ajustes Mail (Notificación de actualización de la cuenta)"
+
+#: simple-membership/classes/class.bSettings.php:367
+msgid "Not a Member?"
+msgstr "¿No estas registrado?"
+
+#: simple-membership/classes/class.bSettings.php:367
+#: simple-membership/views/login.php:27
+msgid "Join Us"
+msgstr "Ãnete a nosotros"
+
+#: simple-membership/classes/class.bUtils.php:63
+msgid "Active"
+msgstr "Activo"
+
+#: simple-membership/classes/class.bUtils.php:64
+msgid "Inactive"
+msgstr "Inactivo"
+
+#: simple-membership/classes/class.bUtils.php:65
+msgid "Pending"
+msgstr "Pendiente"
+
+#: simple-membership/classes/class.bUtils.php:66
+msgid "Expired"
+msgstr "Caducado"
+
+#: simple-membership/classes/class.bUtils.php:251
+msgid "Never"
+msgstr "Nunca"
+
+#: simple-membership/classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Registro"
+
+#: simple-membership/classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Iniciar sesión"
+
+#: simple-membership/classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Perfil de usuario"
+
+#: simple-membership/classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "Restablecer la contraseña"
+
+#: simple-membership/classes/class.simple-wp-membership.php:184
+msgid "You are not logged in."
+msgstr "Usted no ha iniciado sesión."
+
+#: simple-membership/classes/class.simple-wp-membership.php:215
+msgid "Simple WP Membership Protection"
+msgstr "Protección de Simple WP Membership"
+
+#: simple-membership/classes/class.simple-wp-membership.php:228
+msgid "Simple Membership Protection options"
+msgstr "Opciones de protección de Simple Membership"
+
+#: simple-membership/classes/class.simple-wp-membership.php:244
+msgid "Do you want to protect this content?"
+msgstr "Quieres proteger este contenido?"
+
+#: simple-membership/classes/class.simple-wp-membership.php:249
+msgid "Select the membership level that can access this content:"
+msgstr "Selecciona los tipos de usuarios que pueden acceder a este contenido:"
+
+#: simple-membership/classes/class.simple-wp-membership.php:459
+msgid "WP Membership"
+msgstr "WP Membership"
+
+#: simple-membership/classes/class.simple-wp-membership.php:466
+msgid "Settings"
+msgstr "Ajustes"
+
+#: simple-membership/classes/class.simple-wp-membership.php:468
+msgid "Add-ons"
+msgstr "Extensiones"
+
+#: simple-membership/views/add.php:14 simple-membership/views/admin_add.php:19
+#: simple-membership/views/admin_edit.php:17
+#: simple-membership/views/edit.php:12 simple-membership/views/login.php:11
+msgid "Password"
+msgstr "Contraseña"
+
+#: simple-membership/views/add.php:18 simple-membership/views/edit.php:16
+msgid "Repeat Password"
+msgstr "Repetir contraseña"
+
+#: simple-membership/views/add.php:37
+msgid "Register"
+msgstr "Registrarse"
+
+#: simple-membership/views/admin_add.php:6
+msgid "Add Member"
+msgstr "Añadir Miembro"
+
+#: simple-membership/views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "Crear un nuevo usuario y agregarlo a esta web."
+
+#: simple-membership/views/admin_add.php:11
+msgid "User name"
+msgstr "Nombre de usuario"
+
+#: simple-membership/views/admin_add.php:11
+#: simple-membership/views/admin_add.php:15
+#: simple-membership/views/admin_add_level.php:11
+#: simple-membership/views/admin_add_level.php:15
+#: simple-membership/views/admin_add_level.php:19
+#: simple-membership/views/admin_edit.php:9
+#: simple-membership/views/admin_edit.php:13
+#: simple-membership/views/admin_edit_level.php:10
+#: simple-membership/views/admin_edit_level.php:14
+#: simple-membership/views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(obligatorio)"
+
+#: simple-membership/views/admin_add.php:15
+#: simple-membership/views/admin_edit.php:13
+msgid "E-mail"
+msgstr "Email"
+
+#: simple-membership/views/admin_add.php:19
+msgid "(twice, required)"
+msgstr "(escrÃbalo dos veces, Obligatorio)"
+
+#: simple-membership/views/admin_add.php:24
+#: simple-membership/views/admin_edit.php:21
+msgid "Strength indicator"
+msgstr "Indicador de seguridad"
+
+#: simple-membership/views/admin_add.php:25
+#: simple-membership/views/admin_edit.php:22
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"Sugerencia: La contraseña debe tener al menos siete caracteres. Para hacerlo "
+"más seguro, utilizar letras mayúsculas y minúsculas, números y sÃmbolos "
+"como! ? \"$% ^ & amp; )."
+
+#: simple-membership/views/admin_add.php:29
+#: simple-membership/views/admin_edit.php:26
+#: simple-membership/views/loggedin.php:7
+msgid "Account Status"
+msgstr "Estado de la cuenta"
+
+#: simple-membership/views/admin_add.php:36
+msgid "Add New Member "
+msgstr "Añadir nuevo miembro"
+
+#: simple-membership/views/admin_addon_settings.php:2
+#: simple-membership/views/admin_payment_settings.php:2
+#: simple-membership/views/admin_settings.php:2
+#: simple-membership/views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Simple WP Membership::Ajustes"
+
+#: simple-membership/views/admin_addon_settings.php:7
+msgid ""
+"Some of the simple membership plugin's addon settings and options will be "
+"displayed here (if you have them)"
+msgstr ""
+"Algunas de las extensiones de este plugin y sus opciones se muestran aquà "
+"(si estuvieran instalados)"
+
+#: simple-membership/views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Crear nueva categorÃa de usuario"
+
+#: simple-membership/views/admin_add_level.php:11
+#: simple-membership/views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Nombre de la categorÃa de usuario"
+
+#: simple-membership/views/admin_add_level.php:15
+#: simple-membership/views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "Rol en Wordpress por defecto"
+
+#: simple-membership/views/admin_add_level.php:19
+#: simple-membership/views/admin_edit_level.php:18
+msgid "Access Duration"
+msgstr "Duración del acceso"
+
+#: simple-membership/views/admin_add_level.php:22
+msgid "No Expiry (Access for this level will not expire until cancelled"
+msgstr "Sin expiración (el acceso a este nivel no expirará hasta que se anule)"
+
+#: simple-membership/views/admin_add_level.php:23
+#: simple-membership/views/admin_add_level.php:25
+#: simple-membership/views/admin_add_level.php:27
+#: simple-membership/views/admin_add_level.php:29
+#: simple-membership/views/admin_edit_level.php:22
+#: simple-membership/views/admin_edit_level.php:25
+#: simple-membership/views/admin_edit_level.php:28
+#: simple-membership/views/admin_edit_level.php:31
+msgid "Expire After"
+msgstr "Expira después"
+
+#: simple-membership/views/admin_add_level.php:24
+#: simple-membership/views/admin_edit_level.php:23
+msgid "Days (Access expires after given number of days)"
+msgstr "DÃas (el acceso expirará después del número establecido de dÃas)"
+
+#: simple-membership/views/admin_add_level.php:26
+msgid "Weeks (Access expires after given number of weeks"
+msgstr "Semanas (el acceso expirará después del número establecido de semanas)"
+
+#: simple-membership/views/admin_add_level.php:28
+#: simple-membership/views/admin_edit_level.php:29
+msgid "Months (Access expires after given number of months)"
+msgstr "Meses (el acceso expirará después del número establecido de meses)"
+
+#: simple-membership/views/admin_add_level.php:30
+#: simple-membership/views/admin_edit_level.php:32
+msgid "Years (Access expires after given number of years)"
+msgstr "Años (el acceso expirará después del número establecido de años)"
+
+#: simple-membership/views/admin_add_level.php:31
+#: simple-membership/views/admin_edit_level.php:34
+msgid "Fixed Date Expiry"
+msgstr "Fecha de expiración"
+
+#: simple-membership/views/admin_add_level.php:32
+#: simple-membership/views/admin_edit_level.php:35
+msgid "(Access expires on a fixed date)"
+msgstr "(El acceso expira a una fecha establecida)"
+
+#: simple-membership/views/admin_add_level.php:36
+msgid "Access to older posts."
+msgstr "Acceso a entradas antiguas."
+
+#: simple-membership/views/admin_add_level.php:39
+msgid "Only allow access to posts published after the user's join date."
+msgstr ""
+"Solo permite acceso a las entradas publicadas después de la fecha de alta "
+"del miembro."
+
+#: simple-membership/views/admin_add_level.php:45
+msgid "Add New Membership Level "
+msgstr "Añadir nueva categoriza de usuario"
+
+#: simple-membership/views/admin_add_ons_page.php:6
+msgid "Simple WP Membership::Add-ons"
+msgstr "Simple WP Membership::Extensiones"
+
+#: simple-membership/views/admin_category_list.php:2
+msgid "Simple WP Membership::Categories"
+msgstr "Simple WP Membership::CategorÃas"
+
+#: simple-membership/views/admin_category_list.php:7
+msgid ""
+"First of all, globally protect the category on your site by selecting "
+"\"General Protection\" from the drop-down box below and then select the "
+"categories that should be protected from non-logged in users."
+msgstr ""
+"Primero, proteja las categorÃas en su wen seleccionando \"General Protection"
+"\" desde la siguiente casilla desplegable y marque las categorÃas que desea "
+"proteger de los usuarios no registrados."
+
+#: simple-membership/views/admin_category_list.php:10
+msgid ""
+"Next, select an existing membership level from the drop-down box below and "
+"then select the categories you want to grant access to (for that particular "
+"membership level)."
+msgstr ""
+"Segundo, seleccione un nivel de membresÃa existente de la casilla "
+"desplegable y seleccione las categorÃas a las cuales permitir acceso (para "
+"ese nivel en concreto)."
+
+#: simple-membership/views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Editar usuario"
+
+#: simple-membership/views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Editar detalles de usuario existente"
+
+#: simple-membership/views/admin_edit.php:9
+#: simple-membership/views/login.php:5
+msgid "Username"
+msgstr "Nombre de usuario"
+
+#: simple-membership/views/admin_edit.php:17
+msgid "(twice, leave empty to retain old password)"
+msgstr "(dos veces, dejar en blanco pra conservar la actual contraseña)"
+
+#: simple-membership/views/admin_edit.php:33
+msgid "Notify User"
+msgstr "Notificar usuario"
+
+#: simple-membership/views/admin_edit.php:40
+msgid "Edit User "
+msgstr "Editar usuario"
+
+#: simple-membership/views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Editar categorÃa de usuario"
+
+#: simple-membership/views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Editar categorÃa de usuario"
+
+#: simple-membership/views/admin_edit_level.php:21
+msgid "No Expiry (Access for this level will not expire until cancelled)"
+msgstr "Sin expiración (el acceso a este nivel no expirará hasta que se anule)"
+
+#: simple-membership/views/admin_edit_level.php:26
+msgid "Weeks (Access expires after given number of weeks)"
+msgstr "Semanas (el acceso expirará después del número establecido de semanas)"
+
+#: simple-membership/views/admin_edit_level.php:40
+msgid "Protect Older Posts (optional)"
+msgstr "Protejer entradas antiguas (opcional)"
+
+#: simple-membership/views/admin_edit_level.php:43
+msgid ""
+"Only allow access to protected posts published after the members's join date."
+msgstr ""
+"Solo permite acceso a entradas protegidas a partir de la fecha de alta del "
+"miembro."
+
+#: simple-membership/views/admin_edit_level.php:51
+msgid "Edit Membership Level "
+msgstr "Editar categorÃa de usuario"
+
+#: simple-membership/views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Simple WP Membership::Usuarios"
+
+#: simple-membership/views/admin_members.php:3
+#: simple-membership/views/admin_members.php:19
+#: simple-membership/views/admin_membership_levels.php:20
+msgid "Add New"
+msgstr "Añadir nuevo"
+
+#: simple-membership/views/admin_members.php:9
+#: simple-membership/views/admin_membership_levels.php:10
+msgid "search"
+msgstr "Buscar"
+
+#: simple-membership/views/admin_membership_levels.php:2
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Simple WP Membership::CategorÃas de usuario"
+
+#: simple-membership/views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "CategorÃa de usuario"
+
+#: simple-membership/views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "Gestionar la producción de contenido"
+
+#: simple-membership/views/admin_membership_level_menu.php:4
+msgid "Category Protection"
+msgstr "Protección de categorÃa"
+
+#: simple-membership/views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "Ejemplo de Ajustes de contenido protegido"
+
+#: simple-membership/views/admin_member_form_common_part.php:23
+msgid "Gender"
+msgstr "Sexo"
+
+#: simple-membership/views/admin_member_form_common_part.php:30
+#: simple-membership/views/edit.php:28
+msgid "Phone"
+msgstr "Teléfono"
+
+#: simple-membership/views/admin_member_form_common_part.php:34
+#: simple-membership/views/edit.php:32
+msgid "Street"
+msgstr "Calle"
+
+#: simple-membership/views/admin_member_form_common_part.php:38
+#: simple-membership/views/edit.php:36
+msgid "City"
+msgstr "Ciudad"
+
+#: simple-membership/views/admin_member_form_common_part.php:42
+#: simple-membership/views/edit.php:40
+msgid "State"
+msgstr "Provincia"
+
+#: simple-membership/views/admin_member_form_common_part.php:46
+#: simple-membership/views/edit.php:44
+msgid "Zipcode"
+msgstr "Código Postal"
+
+#: simple-membership/views/admin_member_form_common_part.php:50
+#: simple-membership/views/edit.php:48
+msgid "Country"
+msgstr "PaÃs"
+
+#: simple-membership/views/admin_member_form_common_part.php:54
+msgid "Company"
+msgstr "Empresa o Institución"
+
+#: simple-membership/views/admin_member_form_common_part.php:58
+msgid "Member Since"
+msgstr "Miembro desde"
+
+#: simple-membership/views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "Ajustes de integración con Paypal"
+
+#: simple-membership/views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "Generar código de \"variables avanzadas\" para su botón de Paypal"
+
+#: simple-membership/views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Introduzca el ID de la categorÃa de usuario"
+
+#: simple-membership/views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "General el código"
+
+#: simple-membership/views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Generar link para completar registro"
+
+#: simple-membership/views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Puede generar manualmente un link para completar el registro aquà y enviarlo "
+"al usuario si ha perdido el correo electrónico que se envÃa automáticamente "
+"a ellos después del pago."
+
+#: simple-membership/views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "Generar link para completar registro"
+
+#: simple-membership/views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "o"
+
+#: simple-membership/views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "Para todos los registros pendientes"
+
+#: simple-membership/views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Los enlaces para completar el registro aparecerán bajo:"
+
+#: simple-membership/views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "Enviar también recordatorio del mail de registro"
+
+#: simple-membership/views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "Enviar"
+
+#: simple-membership/views/edit.php:58
+msgid "Update"
+msgstr "Actualizar"
+
+#: simple-membership/views/forgot_password.php:5
+msgid "Email Address"
+msgstr "Email"
+
+#: simple-membership/views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "Restablecer Contraseña"
+
+#: simple-membership/views/loggedin.php:3
+msgid "Logged in as"
+msgstr "Sesión iniciada como"
+
+#: simple-membership/views/loggedin.php:11
+msgid "Membership"
+msgstr "MembresÃa"
+
+#: simple-membership/views/loggedin.php:15
+msgid "Account Expiry"
+msgstr "Valido hasta"
+
+#: simple-membership/views/loggedin.php:19
+msgid "Logout"
+msgstr "Cerrar sesión"
+
+#: simple-membership/views/login.php:18
+msgid "Remember Me"
+msgstr "Recordarme"
+
+#: simple-membership/views/login.php:24
+msgid "Forgot Password"
+msgstr "Contraseña Perdida?"
+
+#~ msgid "Bad Cookie Hash"
+#~ msgstr "Bad Cookie Hash"
+
+#~ msgid "Display SWPM Login."
+#~ msgstr "Display SWPM login."
+
+#~ msgid "SWPM Login"
+#~ msgstr "SWPM login"
+
+#~ msgid "Subscription Duration"
+#~ msgstr "Duración de la subscripción"
+
+#~ msgid "No Expiry"
+#~ msgstr "No caduca"
+
+#~ msgid "Subscription starts field is invalid"
+#~ msgstr ""
+#~ "La fecha introducida en \"Subscripción desde\" no es válida (dd/mm/aaaa)\n"
+
+#~ msgid "Subscriptoin duration must be > 0."
+#~ msgstr "El tiempo de subscripción ha de ser mayor que 0."
+
+#~ msgid "Subscription Starts"
+#~ msgstr "Inició de subscripción"
+
+#~ msgid "Subscription Valid For"
+#~ msgstr "Subscripción valida por"
diff --git a/languages/swpm-fr_FR.mo b/languages/swpm-fr_FR.mo
new file mode 100644
index 0000000..b8e3bcd
Binary files /dev/null and b/languages/swpm-fr_FR.mo differ
diff --git a/languages/swpm-fr_FR.po b/languages/swpm-fr_FR.po
new file mode 100644
index 0000000..aaab9ae
--- /dev/null
+++ b/languages/swpm-fr_FR.po
@@ -0,0 +1,895 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: swpm\n"
+"POT-Creation-Date: 2014-07-08 14:22+1000\n"
+"PO-Revision-Date: 2014-07-18 20:10+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.6\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: fr_FR\n"
+"X-Poedit-SearchPath-0: E:\\Portal\\Project Material\\NetBeans Workspace"
+"\\simple-membership\\simple-membership\n"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAdminRegistration.php:45
+#: Workspace\simple-membership\simple-membership/classes/class.bFrontRegistration.php:58
+msgid "Registration Successful."
+msgstr "Enregistrement Réussi."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAdminRegistration.php:50
+#: Workspace\simple-membership\simple-membership/classes/class.bAdminRegistration.php:69
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevel.php:36
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "S'il vous plait, veuillez corriger ce qui suit :"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAjax.php:16
+#: Workspace\simple-membership\simple-membership/classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "Déjà pris"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAjax.php:29
+msgid "Available"
+msgstr "Disponible"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAuth.php:47
+#: Workspace\simple-membership\simple-membership/classes/class.bFrontRegistration.php:173
+msgid "User Not Found."
+msgstr "Utilisateur Introuvable"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAuth.php:54
+msgid "Password Empty or Invalid."
+msgstr "Mot de passe Vide ou Invalide"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAuth.php:78
+msgid "Account is inactive."
+msgstr "Le Compte est Inactif."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAuth.php:88
+msgid "You are logged in as:"
+msgstr "Vous êtes connecté en tant que :"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAuth.php:127
+msgid "Logged Out Successfully."
+msgstr "Déconnexion réussie"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAuth.php:169
+msgid "Session Expired."
+msgstr "Session expirée"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAuth.php:178
+msgid "Invalid User Name"
+msgstr "Nom d'Utilisateur Invalide"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bAuth.php:186
+msgid "Bad Cookie Hash"
+msgstr "Mauvais Hash Cookie"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"Le compte WordPress existe avec ce prénom utilisateur. Mais l'email ne "
+"correspond pas."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"Le compte WordPress existe avec cet email utilisateur. Mais le nom ne "
+"correspond pas."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "Un nom d'utilisateur est requis"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "Le nom d'utilisateur existe déjà ."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "Le mot de passe est demandé"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "Le mot de passe ne correspond pas"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "L'email est demandé"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "L'email est invalide"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "L'email est déjà utilisé."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:128
+msgid "Phone number is invalid"
+msgstr "Le numéro de téléphone est invalide"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:174
+msgid "Member since field is invalid"
+msgstr "Le champ \"Membre depuis\" est invalide"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:185
+msgid "Subscription starts field is invalid"
+msgstr "Le champ \"Inscription commence\" est invalide"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:195
+msgid "Gender field is invalid"
+msgstr "Le champ \"Genre\" est invalide"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bForm.php:206
+msgid "Account state field is invalid"
+msgstr "Le champ \"Etat de l'abonné\" est invalide"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bFrontRegistration.php:58
+msgid "Please"
+msgstr "S'il vous plait,"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bFrontRegistration.php:58
+#: Workspace\simple-membership\simple-membership/views/login.php:21
+msgid "Login"
+msgstr "Connexion"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bFrontRegistration.php:73
+#: Workspace\simple-membership\simple-membership/classes/class.bFrontRegistration.php:152
+msgid "Please correct the following"
+msgstr "Veuillez corriger ce qui suit"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bFrontRegistration.php:86
+msgid "Membership Level Couldn't be found."
+msgstr "Le niveau d'abonnement est introuvable"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bFrontRegistration.php:162
+msgid "Email Address Not Valid."
+msgstr "Adresse Mail Invalide"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bFrontRegistration.php:193
+msgid "New password has been sent to your email address."
+msgstr "Le nouveau mot de passe été envoyé à votre adresse mail"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "La durée de d'abonnement doit être > 0."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Membre"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:8
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:437
+msgid "Members"
+msgstr "Membres"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:16
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "Identifiant"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:17
+#: Workspace\simple-membership\simple-membership/views/add.php:5
+#: Workspace\simple-membership\simple-membership/views/edit.php:4
+#: Workspace\simple-membership\simple-membership/views/login.php:5
+msgid "User Name"
+msgstr "Nom d'Utilisateur"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:18
+#: Workspace\simple-membership\simple-membership/views/add.php:21
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:2
+#: Workspace\simple-membership\simple-membership/views/edit.php:20
+msgid "First Name"
+msgstr "Prénom"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:19
+#: Workspace\simple-membership\simple-membership/views/add.php:25
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:6
+#: Workspace\simple-membership\simple-membership/views/edit.php:24
+msgid "Last Name"
+msgstr "Nom"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:20
+#: Workspace\simple-membership\simple-membership/views/add.php:9
+#: Workspace\simple-membership\simple-membership/views/edit.php:8
+msgid "Email"
+msgstr "Email"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:21
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevels.php:8
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevels.php:17
+#: Workspace\simple-membership\simple-membership/views/add.php:64
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:55
+#: Workspace\simple-membership\simple-membership/views/edit.php:52
+msgid "Membership Level"
+msgstr "Niveau d'Abonnement"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:22
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "Inscription à partir de"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Etat de l'abonné"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:35
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Supprimer"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembers.php:98
+msgid "No Member found."
+msgstr "Aucun Membre trouvé."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "Création du Niveau d'Abonnement réussie"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "Mise à jour Réussie"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevels.php:9
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:439
+msgid "Membership Levels"
+msgstr "Niveaux d'Abonnement"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Rôle"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "Inscription Valide pour"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "Plugin Documentation"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "Paramétrages"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "Activer l'Accès Gratuit"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "Activer/Désactiver l'enregistrement pour l'accès gratuit"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "ID du Niveau Accès Gratuit"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "Attibuer un ID pour le Niveau Accès Gratuit"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "Cacher la barre d'Admin"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"WordPress montre une barre d'admin pour les utilisateurs connectés du site. "
+"Cochez cette case si vous souhaitez masquer cette barre d'admin dans le "
+"frontend de votre site."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "Page des paramétres"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "URL de connexion"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "URL d'Enregistrement"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "URL \"Nous Rejoindre\""
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "URL Edition du profil"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "URL Modifier Mot de Passe"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "Tests et Débugs"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "Activer la SandBox"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Activer cette option si vous voulez tester le paiement par la SandBox"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "Paramètres Email"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "De :"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "Paramètres Email (Indique une Inscription Complète)"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:99
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:110
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "Sujet "
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:103
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:114
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "Corps"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "Paramètres Email (Inscription Complète)"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "Envoie une Notification à l'Admin"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "Envoie un Mail au Membre quand il est ajouté par le Tableau de Bord"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "Paramètres Email (Notification de mise à jour de Compte)"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Inscription"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Nom du Membre Utilisateur"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Profil"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "RAZ Mot de Passe"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:181
+msgid "Simple WP Membership Protection"
+msgstr "Simple WP Membership Protection"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:194
+msgid "Simple Membership Protection options"
+msgstr "Simple WP Membership Protection"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:210
+msgid "Do you want to protect this content?"
+msgstr "Voulez-vous protéger ce contenu ?"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:215
+msgid "Select the membership level that can access this content:"
+msgstr "Sélectionnez le niveau d'adhésion qui peut accéder à ce contenu :"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:347
+msgid "Display SWPM Login."
+msgstr "Display SWPM Login."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:349
+msgid "SWPM Login"
+msgstr "SWPM Login"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:434
+msgid "WP Membership"
+msgstr "Abonné WP"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/classes/class.simple-wp-membership.php:441
+msgid "Settings"
+msgstr "Paramètres"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:13
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:45
+#: Workspace\simple-membership\simple-membership/views/edit.php:12
+#: Workspace\simple-membership\simple-membership/views/login.php:11
+msgid "Password"
+msgstr "Mot de Passe"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:17
+#: Workspace\simple-membership\simple-membership/views/edit.php:16
+msgid "Repeat Password"
+msgstr "Répétez le Mot de Passe"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:29
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "Genre"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:36
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:17
+#: Workspace\simple-membership\simple-membership/views/edit.php:28
+msgid "Phone"
+msgstr "Téléphone"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:40
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:21
+#: Workspace\simple-membership\simple-membership/views/edit.php:32
+msgid "Street"
+msgstr "Rue"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:44
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:25
+#: Workspace\simple-membership\simple-membership/views/edit.php:36
+msgid "City"
+msgstr "Ville"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:48
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:29
+#: Workspace\simple-membership\simple-membership/views/edit.php:40
+msgid "State"
+msgstr "Etat"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:52
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:33
+#: Workspace\simple-membership\simple-membership/views/edit.php:44
+msgid "Zipcode"
+msgstr "Code postal"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:56
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:37
+#: Workspace\simple-membership\simple-membership/views/edit.php:48
+msgid "Country"
+msgstr "Pays"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:60
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "Entreprise"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/add.php:71
+msgid "Register"
+msgstr "Enregistrer"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add.php:6
+msgid "Add Member"
+msgstr "Ajouter un Membre"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "Créer un nouveau utilisateur et l'ajouter à ce site."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add.php:11
+msgid "User name"
+msgstr "Nom d'Utilisateur"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add.php:11
+#: Workspace\simple-membership\simple-membership/views/admin_add.php:15
+#: Workspace\simple-membership\simple-membership/views/admin_add_level.php:11
+#: Workspace\simple-membership\simple-membership/views/admin_add_level.php:15
+#: Workspace\simple-membership\simple-membership/views/admin_add_level.php:19
+#: Workspace\simple-membership\simple-membership/views/admin_edit.php:9
+#: Workspace\simple-membership\simple-membership/views/admin_edit.php:13
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:10
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:14
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(requis)"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add.php:15
+#: Workspace\simple-membership\simple-membership/views/admin_edit.php:13
+msgid "E-mail"
+msgstr "Email"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add.php:19
+msgid "Add New Member "
+msgstr "Ajouter un Nouveau Membre"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Créer un nouveau niveau d'adhésion."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add_level.php:11
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Nom du Niveau d'Adhésion."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add_level.php:15
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "Rôle WordPress par défaut"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add_level.php:19
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "Durée d'Inscription"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add_level.php:26
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "Pas d'Expiration"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "Ajouter le Nouveau Niveau d'Adhésion"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Editer le Membre"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Editer les détails du membre existant."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_edit.php:9
+msgid "Username"
+msgstr "Nom d'Utilisateur"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_edit.php:17
+msgid "Edit User "
+msgstr "Editer l'Utilisateur"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Editer le Niveau d'Adhésion"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Editer le Niveau d'Adhésion."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "Editer le Niveau d'Adhésion"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Simple WP Membership::Members"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_members.php:3
+#: Workspace\simple-membership\simple-membership/views/admin_members.php:19
+#: Workspace\simple-membership\simple-membership/views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "Ajouter Nouveau"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_members.php:9
+#: Workspace\simple-membership\simple-membership/views/admin_membership_levels.php:11
+msgid "search"
+msgstr "recherche"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Simple WP Membership::Membership Levels"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "Niveau d'Adhésion"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "Contrôler le Contenu"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "Exemple de Paramètres de Protection"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(requis, deux fois)"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "Indicateur de sûreté"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"Remarque : Le mot de passe doit comporter au moins sept caractères. Pour le "
+"rendre plus fort, utiliser des majuscules et des minuscules, des chiffres et "
+"des symboles comme ! \" ? $ % ^)."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:64
+#: Workspace\simple-membership\simple-membership/views/loggedin.php:7
+#: Workspace\simple-membership\simple-membership/views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "Statut du Compte"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "Actif"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "Inanctif"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "En attente"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "Expiré"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "Membre Depuis "
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_payment_settings.php:2
+#: Workspace\simple-membership\simple-membership/views/admin_settings.php:2
+#: Workspace\simple-membership\simple-membership/views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Simple WP Membership::Settings"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "PayPal Intégration"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "Générer le \"Advanced Variables\" Code pour votre bouton PayPal"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Entrez l'ID de niveau d'adhésion"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "Générer le Code"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Générer un lien d'achèvement d'enregistrement"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Vous pouvez manuellement générer un lien d'achèvement d'inscription ici et "
+"le donner à vos clients si ils ont raté l'email qui leur est automatiquement "
+"envoyé après le paiement."
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "Générer le lien de fin d'inscription"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "OU"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "Pour Toutes Les Inscriptions en Attente"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Les Liens d'Achèvement d'Enregistrement apparaissent ci-dessous :"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "Envoyer l'E-mail de rappel d'enregistrement aussi"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "Soumettre"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/edit.php:58
+msgid "Update"
+msgstr "Mise à jour"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/forgot_password.php:5
+msgid "Email Address"
+msgstr "Adresse Email"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "RAZ Mot de Passe"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/loggedin.php:3
+#: Workspace\simple-membership\simple-membership/views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "Connecté en tant que "
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/loggedin.php:11
+#: Workspace\simple-membership\simple-membership/views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "Adhésion"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/loggedin.php:15
+#: Workspace\simple-membership\simple-membership/views/login_widget_logged.php:13
+msgid "Logout"
+msgstr "Déconnecter"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/login.php:17
+msgid "Remember Me"
+msgstr "Se Souvenir de Moi"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/login.php:26
+msgid "Forgot Password"
+msgstr "Mot de Passe Oublié"
+
+#: E:\Portal\Project Material\NetBeans
+#: Workspace\simple-membership\simple-membership/views/login.php:30
+msgid "Join Us"
+msgstr "Nous Rejoindre"
diff --git a/languages/swpm-lt_LT.mo b/languages/swpm-lt_LT.mo
new file mode 100644
index 0000000..da191b7
Binary files /dev/null and b/languages/swpm-lt_LT.mo differ
diff --git a/languages/swpm-lt_LT.po b/languages/swpm-lt_LT.po
new file mode 100644
index 0000000..01cdfe6
--- /dev/null
+++ b/languages/swpm-lt_LT.po
@@ -0,0 +1,519 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Simple WordPress Membership\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-07-30 17:30+0800\n"
+"PO-Revision-Date: Wed Apr 29 2015 08:34:54 GMT+0100 (GMT Daylight Time)\n"
+"Last-Translator: Elurija \n"
+"Language-Team: \n"
+"Language: Lithuanian\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10 >= 2 "
+"&&(n%100<10||n%100 >= 20)? 1 : 2)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Generator: Loco - https://localise.biz/\n"
+"X-Poedit-Basepath: .\n"
+"X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;"
+"__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
+"_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;"
+"esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;"
+"esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n"
+"X-Poedit-SearchPath-0: .\n"
+"X-Loco-Target-Locale: lt_LT"
+
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "El. pašto nustatymai"
+
+msgid "(required)"
+msgstr "(būtina)"
+
+msgid "(twice, required)"
+msgstr "(du kartus, būtina)"
+
+msgid "Account State"
+msgstr "Paskyros būsena"
+
+msgid "Account Status"
+msgstr "Paskyros statusas"
+
+msgid "Account is inactive."
+msgstr "Paskyra neaktyvi"
+
+msgid "Account state field is invalid"
+msgstr "Paskyros būsena neteisinga"
+
+msgid "Active"
+msgstr "Aktyvi (-us)"
+
+msgid "Add Member"
+msgstr "PridÄti narį"
+
+msgid "Add New"
+msgstr "PridÄjti naujÄ
"
+
+msgid "Add New Member "
+msgstr "PridÄti naujÄ
narį"
+
+msgid "Add New Membership Level "
+msgstr "PridÄti naujÄ
narystÄs lygį"
+
+msgid "Aready taken"
+msgstr "Jau naudojamas kito nario"
+
+msgid "Assign free membership level ID"
+msgstr "PridÄkite nemomamos narystÄs ID"
+
+msgid "Available"
+msgstr "Laisvas"
+
+msgid "Bad Cookie Hash"
+msgstr "Blogas sausainiuko hash"
+
+msgid "City"
+msgstr "Miestas"
+
+msgid "Company"
+msgstr "Ä®monÄ"
+
+msgid "Country"
+msgstr "Å alos"
+
+msgid "Create a brand new user and add it to this site."
+msgstr "Sukurkite naujÄ
vartotojÄ
ir pridÄkite jį prie svetainÄs"
+
+msgid "Create new membership level."
+msgstr "Sukurkite naujÄ
narystÄs lygį"
+
+msgid "Default WordPress Role"
+msgstr "Numatyta Wordpress rolÄ"
+
+msgid "Delete"
+msgstr "Trinti"
+
+msgid "Display SWPM Login."
+msgstr "Rodyti SWPM prisijungimÄ
"
+
+msgid "Do you want to protect this content?"
+msgstr "Ar norite apsaugoti Å¡iÄ
informacijÄ
?"
+
+msgid "E-mail"
+msgstr "El. paštas"
+
+msgid "Edit Member"
+msgstr "Redaguokite narį"
+
+msgid "Edit Membership Level "
+msgstr "Redaguokite narystÄs lygį"
+
+msgid "Edit Profile Page URL"
+msgstr "Profilio redagavimo puslapio URL"
+
+msgid "Edit User "
+msgstr "Redaguoti vartotojÄ
"
+
+msgid "Edit existing member details."
+msgstr "Redaguoti nario duomenis"
+
+msgid "Edit membership level"
+msgstr "Redaguoti narystÄs lygį\n"
+
+msgid "Edit membership level."
+msgstr "Redaguoti narystÄs lygį"
+
+msgid "Email"
+msgstr "El. paštas"
+
+msgid "Email Address"
+msgstr "El. paštas"
+
+msgid "Email Address Not Valid."
+msgstr "El. paštas neteisingas"
+
+msgid "Email Body"
+msgstr "El. paštas tekstas"
+
+msgid "Email Misc. Settings"
+msgstr "El. paštas kiti nustatymai"
+
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "El. paÅ¡to nustatymai (skatina užbaigti registracijÄ
)"
+
+msgid "Email Settings (Registration Complete)"
+msgstr "El. pašto nustatymai (registracija pavyko)"
+
+msgid "Email Subject"
+msgstr "El. pašto tema"
+
+msgid "Email is already used."
+msgstr "El. paštas jau naudojamas"
+
+msgid "Email is invalid"
+msgstr "El. pašto neteisingas"
+
+msgid "Email is required"
+msgstr "El. paštas - būtina"
+
+msgid "Enable Free Membership"
+msgstr "Aktyvuoti nemokamÄ
narystÄ"
+
+msgid "Enable Sandbox Testing"
+msgstr "Aktyvuoti testavimÄ
"
+
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Aktyvuokite, jei norite testuoti mokÄjimus."
+
+msgid "Enable/disable registration for free membership level"
+msgstr "Aktyvuokite / IÅ¡junkite registracijÄ
nemokamai narystei"
+
+msgid "Enter the Membership Level ID"
+msgstr "Ä®veskite narystÄs lygio ID"
+
+msgid "Example Content Protection Settings"
+msgstr "Pavyzdyniai turinio apsaugojimo nustatymai"
+
+msgid "Expired"
+msgstr "Nebegalioja"
+
+msgid "First Name"
+msgstr "Vardas"
+
+msgid "For All Pending Registrations"
+msgstr "Visos nepatvirtintoms registracijoms"
+
+msgid "Forgot Password"
+msgstr "Pamiršau slaptažodį"
+
+msgid "Free Membership Level ID"
+msgstr "Nemokamos narystÄs lygio ID"
+
+msgid "From Email Address"
+msgstr "Nuo el. pašto adresas"
+
+msgid "Gender"
+msgstr "Lytis"
+
+msgid "Gender field is invalid"
+msgstr "Lyties laukelio užpildytas neteisingai"
+
+msgid "General Settings"
+msgstr "Pagrindiniai nustatymai"
+
+msgid "Generate Code"
+msgstr "Generuoti kodÄ
"
+
+msgid "Generate Registration Completion Link"
+msgstr "Generuoti registracijos baigimo nuorodÄ
"
+
+msgid "Generate a Registration Completion link"
+msgstr "Generuoti registracijos baigimo nuorodÄ
"
+
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr ""
+"Generuoti \n"
+"\"Advanced Variables\" \n"
+"kodÄ
Paypal mygtukui"
+
+msgid "Hide Adminbar"
+msgstr "SlÄpti Adminbar"
+
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? $ "
+"% ^ & )."
+msgstr ""
+"! Slaptažodis turÄtų bÅ«ti bent iÅ¡ 7 ženklų. Naudokite didžiÄ
sias ir mažasias "
+"raides, skaiÄius bei simbolius tokius kaip \n"
+" ! \" ? $ % ^ & "
+
+msgid "ID"
+msgstr "ID"
+
+msgid "Inactive"
+msgstr "Neaktyvus"
+
+msgid "Invalid User Name"
+msgstr "Vartotojo vardas neteisingas"
+
+msgid "Join Us"
+msgstr "Prisijunkite"
+
+msgid "Join Us Page URL"
+msgstr "Prisijungimo URL"
+
+msgid "Last Name"
+msgstr "PavardÄ"
+
+msgctxt "Level"
+msgid "Add New"
+msgstr "PridÄti naujÄ
(lygį)"
+
+msgid "Logged Out Successfully."
+msgstr "SÄkmingai atsijungÄte"
+
+msgid "Logged in as"
+msgstr "PrisjungÄs kaip"
+
+msgid "Login"
+msgstr "Prisijungti"
+
+msgid "Login Page URL"
+msgstr "Prisijungimo URL"
+
+msgid "Logout"
+msgstr "Atsijungti"
+
+msgid "Manage Content Production"
+msgstr "Valdykite turinio produkcijÄ
"
+
+msgid "Member"
+msgstr "Narys"
+
+msgid "Member Login"
+msgstr "Narių prisijungimas"
+
+msgid "Member Since"
+msgstr "Narys nuo"
+
+msgid "Member since field is invalid"
+msgstr "Narys nuo laukelis neteisingas"
+
+msgid "Members"
+msgstr "Nariai"
+
+msgid "Membership"
+msgstr "NarystÄ"
+
+msgid "Membership Level"
+msgstr "NarystÄs lygis"
+
+msgid "Membership Level Couldn't be found."
+msgstr "NarystÄs lygis nerastas"
+
+msgid "Membership Level Creation Successful."
+msgstr "NarystÄs lygis sÄkmingai sukurtas."
+
+msgid "Membership Level Name"
+msgstr "NarystÄs lygio pavadinimas"
+
+msgid "Membership Levels"
+msgstr "NarystÄs lygiai."
+
+msgid "Membership level"
+msgstr "NarystÄs lygis"
+
+msgid "New password has been sent to your email address."
+msgstr "Naujas slaptaždis iÅ¡siųstas į JÅ«sų el. paÅ¡tÄ
."
+
+msgid "No Expiry"
+msgstr "NÄra galiojimo"
+
+msgid "No Member found."
+msgstr "Toks narys nerastas"
+
+msgid "OR"
+msgstr "arba"
+
+msgid "Pages Settings"
+msgstr "Puslapio nustatymai"
+
+msgid "Password"
+msgstr "Slaptažodis"
+
+msgid "Password Empty or Invalid."
+msgstr "Slaptažodžio laukelis tuÅ¡Äias arba neteisingas"
+
+msgid "Password Reset"
+msgstr "Keisti slaptažodį"
+
+msgid "Password Reset Page URL"
+msgstr "Slaptažodžio keitimo nuoroda"
+
+msgid "Password is required"
+msgstr "Slaptažodis būtinas"
+
+msgid "Password mismatch"
+msgstr "Slaptažodžiai skirtingi"
+
+msgid "PayPal Integration Settings"
+msgstr "Paypal integravimo nustatymai"
+
+msgid "Pending"
+msgstr "Nepatvirtinta"
+
+msgid "Phone"
+msgstr "Tel numeris"
+
+msgid "Phone number is invalid"
+msgstr "Neteisingas tel numeris"
+
+msgid "Please"
+msgstr "Prašome"
+
+msgid "Please correct the following"
+msgstr "Ištaisykite "
+
+msgid "Please correct the following:"
+msgstr "Ištaisykite "
+
+msgid "Plugin Documentation"
+msgstr "Įskiepio dokumentai"
+
+msgid "Profile"
+msgstr "Profilis"
+
+msgid "Register"
+msgstr "RegistruokitÄs"
+
+msgid "Registration"
+msgstr "Registracija"
+
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Registracijos baigimo nuoroda atsiras žemiau:"
+
+msgid "Registration Page URL"
+msgstr "Regsitracijos puslapio URL"
+
+msgid "Registration Successful."
+msgstr "Registracija sÄkminga"
+
+msgid "Remember Me"
+msgstr "Prisiminti mane"
+
+msgid "Repeat Password"
+msgstr "Pakartoti slaptažodį"
+
+msgid "Reset Password"
+msgstr "Atkurti slaptaždį"
+
+msgid "Role"
+msgstr "RolÄ"
+
+msgid "SWPM Login"
+msgstr "SWPM prisijungimas"
+
+msgid "Select the membership level that can access this content:"
+msgstr "Pasirinkite narystÄs lygį, kuris turÄs prieigÄ
prie šio turinio:"
+
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr ""
+"Siųskite el. laiška nariui, kai jis yra pridedamas per administracijos "
+"valdymo pultÄ
"
+
+msgid "Send Notification To Admin"
+msgstr "Siųsti praneÅ¡imÄ
administratoriui"
+
+msgid "Send Registration Reminder Email too"
+msgstr "Siųsti registracijos priminimÄ
"
+
+msgid "Session Expired."
+msgstr "Sesija baigÄsi"
+
+msgid "Settings"
+msgstr "Nustatymai"
+
+msgid "Simple Membership Protection options"
+msgstr "Simple Membership Protection nustatymai"
+
+msgid "Simple WP Membership Protection"
+msgstr "SWPM apsauga"
+
+msgid "Simple WP Membership::Members"
+msgstr "SWPMï¼Nariai"
+
+msgid "Simple WP Membership::Membership Levels"
+msgstr "SWPMï¼NarystÄs lygiai"
+
+msgid "Simple WP Membership::Settings"
+msgstr "SWPMï¼Nustatymai"
+
+msgid "State"
+msgstr "SavivaldybÄ"
+
+msgid "Street"
+msgstr "GatvÄ"
+
+msgid "Strength indicator"
+msgstr "SudÄtingumo indikatorius"
+
+msgid "Submit"
+msgstr "Pateikti"
+
+msgid "Subscription Duration"
+msgstr "Prenumeratos trukmÄ"
+
+msgid "Subscription Starts"
+msgstr "Prenumerata prasideda"
+
+msgid "Subscription Valid For"
+msgstr "Prenumerata galioja"
+
+msgid "Subscription starts field is invalid"
+msgstr "Prenumeratos pradžios laukelis neteisingas"
+
+msgid "Subscriptoin duration must be > 0."
+msgstr "Prenumeratos trukmÄ turi bÅ«ti daugiau > 0."
+
+msgid "Test & Debug Settings"
+msgstr "Testavimo ir Debug nustatymai"
+
+msgid "Update"
+msgstr "Atnaujinti"
+
+msgid "Updated Successfully."
+msgstr "SÄkmingai atnaujinta."
+
+msgid "User Name"
+msgstr "Vartotojo vardas"
+
+msgid "User Not Found."
+msgstr "NÄra tokio vartotojo."
+
+msgid "User name"
+msgstr "Vartotojo vardas"
+
+msgid "User name already exists."
+msgstr "Toks vartotojo vardas jau yra"
+
+msgid "User name is required"
+msgstr "Vartotojo vardas yra privalomas"
+
+msgid "Username"
+msgstr "Vartotojo vardas"
+
+msgid "WP Membership"
+msgstr "WP NarystÄ"
+
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"WordPress rodo administracijos panelÄ prisijungusiems nariams. UždÄkite "
+"varnelÄ, jei nenorite, kad ji bÅ«tų rodoma."
+
+msgid "Wordpress account exists with given email. But given user name doesn't match."
+msgstr "Paskyra su tokiu el. paÅ¡tu egzistuoja, taÄiau nesutampa vartotojo vardai."
+
+msgid "Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"Toks vartotojo vardas jau yra užregistruotas. TaÄiau nesutampa el. paÅ¡to "
+"adresai."
+
+msgid "You are logged in as:"
+msgstr "Esate prisijungÄs kaip:"
+
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Äia galite rankiniu bÅ«du generuoti registracijos užbaigimo nuorodÄ
ir duoti "
+"jÄ
pirkÄjams, jei jie negavo/iÅ¡trynÄ el. laiÅ¡kÄ
, kuris buvo siųstas po "
+"apmokÄjimo, su registracijos nuoroda."
+
+msgid "Zipcode"
+msgstr "Pašto kodas"
+
+msgid "search"
+msgstr "ieškoti"
diff --git a/languages/swpm-mk_MK.mo b/languages/swpm-mk_MK.mo
new file mode 100644
index 0000000..4afc643
Binary files /dev/null and b/languages/swpm-mk_MK.mo differ
diff --git a/languages/swpm-mk_MK.po b/languages/swpm-mk_MK.po
new file mode 100644
index 0000000..5dcf328
--- /dev/null
+++ b/languages/swpm-mk_MK.po
@@ -0,0 +1,713 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: simple membership\n"
+"POT-Creation-Date: 2014-08-28 19:28+1000\n"
+"PO-Revision-Date: 2014-11-26 16:05+0100\n"
+"Last-Translator: Ivo Ivanov \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.9\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
+"Language: mk_MK\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAccessControl.php:23 classes/class.bAccessControl.php:40
+msgid "You are not allowed to view this content"
+msgstr "Ðе е дозволено да Ñа видиÑе ÑодÑжинаÑа"
+
+#: classes/class.bAccessControl.php:26 classes/class.bAccessControl.php:43
+msgid "You need to login to view this content. "
+msgstr "ÐоÑÑебно е да Ñе наÑавиÑе за да Ñа видиÑе ÑодÑжинаÑа."
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:64
+msgid "Registration Successful."
+msgstr "РегиÑÑÑаÑиÑаÑа е ÑÑпеÑна."
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:73
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "Ðе молам попÑавеÑе го Ñледново:"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "ÐеÑе поÑÑои"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "ÐоÑÑапни"
+
+#: classes/class.bAuth.php:48 classes/class.bFrontRegistration.php:179
+msgid "User Not Found."
+msgstr "ÐоÑиÑÐ½Ð¸ÐºÐ¾Ñ Ð½Ðµ е наÑден."
+
+#: classes/class.bAuth.php:55
+msgid "Password Empty or Invalid."
+msgstr "ÐозинкаÑа е пÑазна или неважеÑка"
+
+#: classes/class.bAuth.php:79
+msgid "Account is inactive."
+msgstr "СмеÑкаÑа не е акÑивна."
+
+#: classes/class.bAuth.php:89
+msgid "You are logged in as:"
+msgstr "ÐаÑавени ÑÑе како:"
+
+#: classes/class.bAuth.php:128
+msgid "Logged Out Successfully."
+msgstr "УÑпеÑно Ñе одÑавивÑе."
+
+#: classes/class.bAuth.php:170
+msgid "Session Expired."
+msgstr "СеÑиÑаÑа е иÑÑеÑена."
+
+#: classes/class.bAuth.php:179
+msgid "Invalid User Name"
+msgstr "ÐепоÑÑоеÑко коÑиÑниÑко име"
+
+#: classes/class.bAuth.php:187
+msgid "Bad Cookie Hash"
+msgstr "ÐÐ¾Ñ Ð¥Ð°Ñ Ð½Ð° колаÑеÑо"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"ÐеÑе поÑÑои Wordpress ÑмеÑка Ñо даденоÑо коÑиÑниÑко име. Ðо даденаÑа email "
+"адÑеÑа не Ñе ÑовпаÑа."
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"ÐеÑе поÑÑои Wordpress ÑмеÑка Ñо даденаÑа email адÑеÑа. Ðо даденоÑо коÑиÑнико "
+"име не Ñе ÑовпаÑа."
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "ÐоÑиÑниÑкоÑо име е поÑÑебно"
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "ÐоÑиÑниÑкоÑо име веÑе поÑÑои"
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "ÐоÑÑебна е лозинкаÑа"
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "ÐозинкаÑа не одговаÑа"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "ÐоÑÑебна е email адÑеÑа"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "Email адÑеÑаÑа не Ñе ÑовпаÑа"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "Email адÑеÑаÑа веÑе Ñе коÑиÑÑи."
+
+#: classes/class.bForm.php:178
+msgid "Member since field is invalid"
+msgstr "Член од - полеÑо е невалидно"
+
+#: classes/class.bForm.php:189
+msgid "Subscription starts field is invalid"
+msgstr "ÐолеÑо за ÑÑаÑÑ Ð½Ð° пÑеÑплаÑаÑа е невалидно"
+
+#: classes/class.bForm.php:199
+msgid "Gender field is invalid"
+msgstr "ÐолеÑо за пол е невалидно"
+
+#: classes/class.bForm.php:210
+msgid "Account state field is invalid"
+msgstr "СÑаÑÑÑÐ¾Ñ Ð½Ð° ÑмеÑкаÑа е невалиден"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+msgid "Please"
+msgstr "Ðе молиме"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+#: views/login.php:21
+msgid "Login"
+msgstr "ÐаÑави Ñе"
+
+#: classes/class.bFrontRegistration.php:79
+#: classes/class.bFrontRegistration.php:158
+msgid "Please correct the following"
+msgstr "Ðе молиме извÑÑеÑе попÑавка на Ñледново"
+
+#: classes/class.bFrontRegistration.php:92
+msgid "Membership Level Couldn't be found."
+msgstr "ÐоÑиÑниÑкоÑо ниво не е пÑонаÑдено."
+
+#: classes/class.bFrontRegistration.php:168
+msgid "Email Address Not Valid."
+msgstr "Email адÑеÑаÑа е невалидна"
+
+#: classes/class.bFrontRegistration.php:199
+msgid "New password has been sent to your email address."
+msgstr "Ðова лозинка е пÑаÑена на ÐаÑаÑа email адÑеÑа."
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "ÐÑемеÑÑаеÑеÑо на пÑеÑплаÑаÑа моÑа да биде > 0. "
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Член"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:467
+msgid "Members"
+msgstr "Членови"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "ÐоÑиÑниÑко име"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "Ðме"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "ÐÑезиме"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "Email"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "Ðиво на ÑленÑÑво"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "ÐÑеÑплаÑаÑа поÑнÑва"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "СоÑÑоÑба на ÑмеÑкаÑа"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "ÐзбÑиÑи"
+
+#: classes/class.bMembers.php:100
+msgid "No Member found."
+msgstr "Ð§Ð»ÐµÐ½Ð¾Ñ Ð½Ðµ е пÑонаÑден."
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "СоздаваÑеÑо на коÑиÑниÑкоÑо ниво е ÑÑпеÑно."
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "ÐжÑÑиÑаÑеÑо е ÑÑпеÑно."
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:469
+msgid "Membership Levels"
+msgstr "Ðивоа на ÑленÑÑво"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Улога"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "ÐÑеплаÑаÑа е важеÑка до"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "ÐокÑменÑаÑиÑа за пÑиклÑÑоÑиÑе"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "ÐпÑÑи поÑÑавки"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "ÐклÑÑи го ÐеÑплаÑноÑо ЧленÑÑво"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "ÐклÑÑи/иÑклÑÑи Ñа ÑегиÑÑÑаÑиÑаÑа за пÑиклÑÑÐ¾ÐºÐ¾Ñ Ð·Ð° беÑплаÑно ÑленÑÑво"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "ÐРна ниво за ÐеÑплаÑно ЧленÑÑво"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "ÐоделеÑе ID на нивоÑо за Ñлободно ÑленÑÑво"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "СкÑиÑÑе го ÐдминиÑÑÑаÑоÑÑÐºÐ¸Ð¾Ñ Ð°Ð»Ð°Ñник"
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"WordPress пÑикажÑва админиÑÑÑаÑоÑÑки алаÑник на наÑавениÑе коÑиÑниÑи на "
+"ÑÑÑаниÑаÑа. СелекÑиÑаÑÑе Ñа оваа Ñамка ако закаÑе да го ÑкÑиеÑе "
+"админиÑÑÑаÑоÑÑÐºÐ¸Ð¾Ñ Ð°Ð»Ð°Ñник на инÑеÑÑеÑÑÐ¾Ñ Ð½Ð° ваÑаÑа ÑÑÑаниÑа."
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "ÐодеÑÑваÑа на СÑÑаниÑиÑе"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "URL за СÑÑаниÑаÑа за ÐаÑавÑваÑе"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "URL за СÑÑаниÑаÑа за РегиÑÑÑаÑиÑа"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "URL за ÐÑиклÑÑи Ñе ÑÑÑаниÑаÑа"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "URL за СÑÑаниÑаÑа за УÑедÑваÑе на ÐÑоÑилоÑ"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "URL за СÑÑаниÑаÑа за РеÑеÑиÑаÑе на ÐозинкаÑа"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "ÐодеÑÑваÑа за ÑеÑÑиÑаÑе на Sandbox"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "Ðвозможи Sandbox ТеÑÑиÑаÑе"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr ""
+"СелекÑиÑаÑÑе Ñа оваа опÑиÑа ако ÑакаÑе да Ñа ÑеÑÑиÑаÑе sandbox опÑиÑаÑа за "
+"плаÑаÑе"
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "Email Разновидни ÐодеÑÑваÑа"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "Ðд Email ÐдÑеÑа"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "Email ÐоÑÑавÑваÑа (ÐзвеÑÑÑваÑе за ÐомплеÑиÑаÑе на РегиÑÑÑаÑиÑаÑа)"
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "Тема на Email"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "Тело на Email"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "Email ÐодеÑÑваÑа (РегиÑÑÑаÑиÑаÑа е ÐомплеÑиÑана)"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "ÐÑаÑи ÐзвеÑÑÑваÑе Ðо ÐдминиÑÑÑаÑоÑоÑ"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr ""
+"ÐÑаÑи Email поÑака на Ð§Ð»ÐµÐ½Ð¾Ñ ÐºÐ¾Ñ Ðµ додаден пÑÐµÐºÑ ÐдминиÑÑÑаÑоÑÑкаÑа Ñабла"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "Email ÐодеÑÑваÑа (ÐзвеÑÑÑваÑе за ÐадгÑадба на СмеÑкаÑа)"
+
+#: classes/class.bSettings.php:326
+msgid "Not a Member?"
+msgstr "Ðе ÑÑе Ñлен?"
+
+#: classes/class.bSettings.php:326 views/login.php:30
+msgid "Join Us"
+msgstr "ÐÑидÑÑжеÑе ни Ñе"
+
+#: classes/class.bUtils.php:32 views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "ÐкÑивен"
+
+#: classes/class.bUtils.php:33 views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "ÐеакÑивен"
+
+#: classes/class.bUtils.php:34 views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "Ðо Ñек"
+
+#: classes/class.bUtils.php:35 views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "ÐÑÑеÑена"
+
+#: classes/class.bUtils.php:225
+msgid "Never"
+msgstr "ÐикогаÑ"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "РегиÑÑÑаÑиÑа"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "ÐаÑавÑваÑе на ÑленовиÑе"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "ÐÑоÑил"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "РеÑеÑиÑаÑе на лозинкаÑа"
+
+#: classes/class.simple-wp-membership.php:178
+msgid "You are not logged in."
+msgstr "Ðе ÑÑе наÑавени."
+
+#: classes/class.simple-wp-membership.php:209
+msgid "Simple WP Membership Protection"
+msgstr "ÐдноÑÑавна WP ÐаÑÑиÑа за ЧленÑÑвоÑо"
+
+#: classes/class.simple-wp-membership.php:222
+msgid "Simple Membership Protection options"
+msgstr "ÐодеÑÑваÑа за ÐаÑÑиÑаÑа за Слободно ЧленÑÑво"
+
+#: classes/class.simple-wp-membership.php:238
+msgid "Do you want to protect this content?"
+msgstr "Ðали ÑакаÑе да Ñа заÑÑиÑиÑе оваа ÑодÑжина?"
+
+#: classes/class.simple-wp-membership.php:243
+msgid "Select the membership level that can access this content:"
+msgstr "ÐзбеÑеÑе го нивоÑо на ÑленÑÑво ÑÑо има пÑиÑÑап до оваа ÑодÑжина"
+
+#: classes/class.simple-wp-membership.php:375
+msgid "Display SWPM Login."
+msgstr "ÐÑикажи го SWPM наÑавÑваÑеÑо."
+
+#: classes/class.simple-wp-membership.php:377
+msgid "SWPM Login"
+msgstr "SWPM ÐаÑавÑваÑе"
+
+#: classes/class.simple-wp-membership.php:464
+msgid "WP Membership"
+msgstr "WP ЧленÑÑво"
+
+#: classes/class.simple-wp-membership.php:471
+msgid "Settings"
+msgstr "ÐодеÑÑваÑа"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "Ðозинка"
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "ÐовÑоÑеÑе Ñа лозинкаÑа"
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "Ðол"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "ТелеÑон"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "УлиÑа"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "ÐÑад"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "ÐÑжава"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "ÐоÑÑенÑки код"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "ÐÑжава"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "ÐомпаниÑа"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "РегиÑÑÑиÑаÑ"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "Ðодади Член"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "ÐÑеиÑÐ°Ñ ÑоÑема нов коÑиÑник и додади го на оваа ÑÑÑаниÑа."
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "ÐоÑиÑниÑко име"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(поÑÑебно)"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "E-mail адÑеÑа"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "Ðодади Ðов Член"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "ÐÑеиÑÐ°Ñ Ðово Ðиво на ЧленÑÑво."
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Ðма на ÐивоÑо на ЧленÑÑво"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "СÑандÑадна WordPress Улога"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "ÐÑемеÑÑаеÑе на ÐÑеÑплаÑаÑа"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "Ðе ÐавÑÑÑва."
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "Ðодади Ðово Ðиво на ЧленÑÑво."
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "УÑеди го ЧленоÑ"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "УÑеди ги деÑаÑиÑе за поÑÑоеÑки Ñлен"
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "ÐоÑиÑниÑко Ðме"
+
+#: views/admin_edit.php:18
+msgid "Edit User "
+msgstr "УÑеди го ÐоÑиÑникоÑ"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "УÑеди го ÐивоÑо на ЧленÑÑво"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "УÑеди го ÐивоÑо на ЧленÑÑво."
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "УÑеди го ÐивоÑо на ЧленÑÑво"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "ÐдноÑÑавно WP ЧленÑÑво::Членови"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "Ðодади нов"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "баÑаÑ"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "ÐдноÑÑавно WP ЧленÑÑво::Ðивоа на ЧленÑÑво"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "Ðиво на ЧленÑÑво"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "УпÑавÑÐ²Ð°Ñ Ñо ÐÑоизводÑÑвоÑо на СодÑжина"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "ÐÑÐ¸Ð¼ÐµÑ Ð·Ð° ÐаÑамеÑÑи за ÐаÑÑиÑа на СодÑжинаÑа"
+
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(двапаÑи, поÑÑебно)"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "ÐндикаÑÐ¾Ñ Ð½Ð° ÐаÑина"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"СовеÑ: ÐозинкаÑа ÑÑеба да биде наÑÐ¼Ð°Ð»ÐºÑ ÑедÑм каÑакÑеÑи долга. Ðа да Ñа "
+"напÑавиÑе поÑака, коÑиÑÑеÑе големи и мали бÑкви, бÑоеви и Ñимболи како ! "
+"\" ? $ % ^ & )."
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "СÑаÑÑÑ Ð½Ð° СмеÑкаÑа"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "Член Ðд"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "ÐдноÑÑавно WP ЧленÑÑво::ÐодеÑÑваÑа"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "ÐодеÑÑваÑа за ÐнÑегÑаÑиÑа Ñо PayPal"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "ÐенеÑиÑÐ°Ñ Ð³Ð¾ \"ÐапÑедни ÐÑоменливи\" ÐÐ¾Ð´Ð¾Ñ Ð·Ð° ÑвоеÑо PayPal копÑе"
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "ÐнеÑи го ID за ÐивоÑо на ЧленÑÑво"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "ÐенеÑиÑÐ°Ñ Ðод"
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "ÐенеÑиÑÐ°Ñ Ð»Ð¸Ð½Ðº за ÐомплеÑиÑаÑе на ÑегиÑÑÑаÑиÑаÑа"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Ти Ð¼Ð¾Ð¶ÐµÑ ÑаÑно да генеÑиÑÐ°Ñ Ð»Ð¸Ð½Ðº за комплеÑиÑаÑе на ÑегиÑÑÑаÑиÑаÑа и да го "
+"Ð´Ð°Ð´ÐµÑ Ð½Ð° ÑвоиÑе коÑиÑниÑи ако Ñие го пÑопÑÑÑиле emailÐ¾Ñ ÑÑо им бил пÑаÑен "
+"Ð²ÐµÐ´Ð½Ð°Ñ Ð¿Ð¾ плаÑаÑеÑо."
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "ÐенеÑиÑÐ°Ñ Ð»Ð¸Ð½Ðº за комплеÑиÑаÑе на ÑегиÑÑÑаÑиÑаÑа"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "ÐÐÐ"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "Ðа СиÑе РегиÑÑÑаÑии ÑÑо Ñе во Ñек"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "ÐинковиÑе за ÐомплеÑиÑаÑе на РегиÑÑÑаÑиÑаÑа Ñе Ñе поÑÐ°Ð²Ð°Ñ Ð¿Ð¾Ð´Ð¾Ð»Ñ"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "ÐÑаÑи Email ÐоÑÑеÑник за РегиÑÑÑаÑиÑа иÑÑо Ñака"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "ÐнеÑи"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "ÐадгÑади"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "Email адÑеÑа"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "РеÑеÑиÑÐ°Ñ Ñа ÐозинкаÑа"
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "ÐаÑавени ÑÑе како"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "ЧленÑÑво"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:12
+msgid "Account Expiry"
+msgstr "СмеÑкаÑа ÐÑÑекÑва"
+
+#: views/loggedin.php:19 views/login_widget_logged.php:16
+msgid "Logout"
+msgstr "ÐдÑави Ñе"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "Ðапомни Ðе"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "Ðа забоÑавивÑе лозинкаÑа"
diff --git a/languages/swpm-nl_NL.mo b/languages/swpm-nl_NL.mo
new file mode 100644
index 0000000..4c680d9
Binary files /dev/null and b/languages/swpm-nl_NL.mo differ
diff --git a/languages/swpm-nl_NL.po b/languages/swpm-nl_NL.po
new file mode 100644
index 0000000..04e6c83
--- /dev/null
+++ b/languages/swpm-nl_NL.po
@@ -0,0 +1,709 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: simple membership\n"
+"POT-Creation-Date: 2014-08-28 19:28+1000\n"
+"PO-Revision-Date: 2015-01-13 22:29+0100\n"
+"Last-Translator: \n"
+"Language-Team: Henk Rostohar \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.7.3\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: nl_NL\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAccessControl.php:23 classes/class.bAccessControl.php:40
+msgid "You are not allowed to view this content"
+msgstr "U bent niet gemachtigd deze inhoud te bekijken."
+
+#: classes/class.bAccessControl.php:26 classes/class.bAccessControl.php:43
+msgid "You need to login to view this content. "
+msgstr "U moet inloggen om deze inhoud te kunnen bekijken."
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:64
+msgid "Registration Successful."
+msgstr "Registratie is gelukt."
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:73
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "Corrigeer het volgende:"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "Reeds uitgevoerd"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "Beschikbaar"
+
+#: classes/class.bAuth.php:48 classes/class.bFrontRegistration.php:179
+msgid "User Not Found."
+msgstr "Gebruiker onbekend."
+
+#: classes/class.bAuth.php:55
+msgid "Password Empty or Invalid."
+msgstr "Password is niet ingevuld of ongeldig."
+
+#: classes/class.bAuth.php:79
+msgid "Account is inactive."
+msgstr "Dit account is niet actief."
+
+#: classes/class.bAuth.php:89
+msgid "You are logged in as:"
+msgstr "U bent ingelogd als:"
+
+#: classes/class.bAuth.php:128
+msgid "Logged Out Successfully."
+msgstr "U bent met succes uitgelogd."
+
+#: classes/class.bAuth.php:170
+msgid "Session Expired."
+msgstr "Uw sessie is verlopen."
+
+#: classes/class.bAuth.php:179
+msgid "Invalid User Name"
+msgstr "Ongeldige gebruikersnaam"
+
+#: classes/class.bAuth.php:187
+msgid "Bad Cookie Hash"
+msgstr "Verkeerde Cookie hash"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"Het Wordpress account met deze gebruikersnaam bestaat. Maar het email adres "
+"klopt niet. "
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"Dit Wordpress account met dit email adres bestaat maar de gebruikersnaam "
+"klopt niet."
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "De gebruikersnaam is vereist."
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "Deze gebruikersnaam bestaat reeds."
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "Password is vereist"
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "Password klopt niet"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "Email adres is vereist"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "Email adres is niet geldig"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "Email adres is al in gebruik."
+
+#: classes/class.bForm.php:178
+msgid "Member since field is invalid"
+msgstr "Lid sinds veld is ongeldig"
+
+#: classes/class.bForm.php:189
+msgid "Subscription starts field is invalid"
+msgstr "Inschrijving start veld is ongeldig"
+
+#: classes/class.bForm.php:199
+msgid "Gender field is invalid"
+msgstr "Geslacht veld is ongeldig"
+
+#: classes/class.bForm.php:210
+msgid "Account state field is invalid"
+msgstr "Account status veld is ongeldig"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+msgid "Please"
+msgstr "Alstublieft"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+#: views/login.php:21
+msgid "Login"
+msgstr "Login"
+
+#: classes/class.bFrontRegistration.php:79
+#: classes/class.bFrontRegistration.php:158
+msgid "Please correct the following"
+msgstr "Corrigeer het volgende"
+
+#: classes/class.bFrontRegistration.php:92
+msgid "Membership Level Couldn't be found."
+msgstr "Lidmaatschap niveau kon niet worden gevonden."
+
+#: classes/class.bFrontRegistration.php:168
+msgid "Email Address Not Valid."
+msgstr "Email adres is ongeldig."
+
+#: classes/class.bFrontRegistration.php:199
+msgid "New password has been sent to your email address."
+msgstr "Een nieuw password is naar uw email adres verzonden."
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "Duur van lidmaatschap moet groter zijn dan 0."
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Lid"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:467
+msgid "Members"
+msgstr "Leden"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "Gebruikersnaam"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "Voornaam"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "Achternaam"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "Email adres"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "Lidmaatschap niveau"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "Inschrijving start"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Account status"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Verwijder"
+
+#: classes/class.bMembers.php:100
+msgid "No Member found."
+msgstr "Geen lid gevonden"
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "Lidmaatschap niveau met succes aangemaakt."
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "Succesvolle Update"
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:469
+msgid "Membership Levels"
+msgstr "Lidmaatschap niveaus"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Rol"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "Inschrijving geldig voor"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "Plugin Documentatie"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "Algemene instellingen"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "Inschakelen gratis Lidmaatschap"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "Inschakelen/uitschakelen van registratie voor gratis Lidmaatschap"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "Gratis Lidmaatschap Niveau ID"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "Toewijzen gratis Lidmaatschap Niveau ID"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "Verberg de adminbalk"
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"Wordpress toont aan de ingelogde gebruikers een adminbalk. Vink dit hokje "
+"aan als je de adminbalk in het frontend van je website wilt verbergen."
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "Pagina instellingen"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "Login pagina URL"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "Registratie pagina URL"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "Join Us pagina URL"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "Wijzig Profiel pagina URL"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "Password Reset pagina URL"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "Test & Debug instellingen"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "Sandbox Testen inschakelen"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Schakel deze optie in als je sandbox testbetalingen wilt uitvoeren."
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "Diverse email instellingen"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "Van Email Adres"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "Email instellingen (Invullen om de registratie te voltooien)"
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "Email onderwerp"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "Email Body"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "Email instellingen (Registratie voltooid)"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "Stuur een bericht naar de beheerder"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "Stuur een email naar het aangemelde lid via het beheerders dashboard"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "Email instellingen (Bericht van Account Upgrade)"
+
+#: classes/class.bSettings.php:326
+msgid "Not a Member?"
+msgstr "Geen lid?"
+
+#: classes/class.bSettings.php:326 views/login.php:30
+msgid "Join Us"
+msgstr "Join Us"
+
+#: classes/class.bUtils.php:32 views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "Actief"
+
+#: classes/class.bUtils.php:33 views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "Niet actief"
+
+#: classes/class.bUtils.php:34 views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "In afwachting"
+
+#: classes/class.bUtils.php:35 views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "Verlopen"
+
+#: classes/class.bUtils.php:225
+msgid "Never"
+msgstr "Nooit"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Registratie"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Leden login"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Profiel"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "Password resetten"
+
+#: classes/class.simple-wp-membership.php:178
+msgid "You are not logged in."
+msgstr "U bent niet ingelogd."
+
+#: classes/class.simple-wp-membership.php:209
+msgid "Simple WP Membership Protection"
+msgstr "Simple WP Membership afscherming"
+
+#: classes/class.simple-wp-membership.php:222
+msgid "Simple Membership Protection options"
+msgstr "Simple Membership Afscherm opties"
+
+#: classes/class.simple-wp-membership.php:238
+msgid "Do you want to protect this content?"
+msgstr "Wil je deze inhoud verbergen?"
+
+#: classes/class.simple-wp-membership.php:243
+msgid "Select the membership level that can access this content:"
+msgstr "Selecteer de Lidmaatschap niveaus die toegang hebben tot deze inhoud:"
+
+#: classes/class.simple-wp-membership.php:375
+msgid "Display SWPM Login."
+msgstr "Toon SWPM login"
+
+#: classes/class.simple-wp-membership.php:377
+msgid "SWPM Login"
+msgstr "SWPM Login"
+
+#: classes/class.simple-wp-membership.php:464
+msgid "WP Membership"
+msgstr "WP Lidmaatschap"
+
+#: classes/class.simple-wp-membership.php:471
+msgid "Settings"
+msgstr "Instellingen"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "Password"
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "Herhaal password"
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "Geslacht"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "Telefoon"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "Straat"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "Plaats"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "Provincie"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "Postcode"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "Land"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "Bedrijf"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "Registreer"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "Voeg een lid toe"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "Maak een nieuwe gebruiker en voeg deze toe aan deze webste."
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "Gebruikersnaam"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(vereist)"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "E-mail"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "Voeg een nieuw lid toe"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Maak een nieuw Lidmaatschap niveau"
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Lidmaatschap Niveau Naam"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "Default WordPress Role"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "Inschrijftermijn"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "Verloopt niet"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "Voeg een nieuw lidmaatschap niveau toe"
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Wijzig lid"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Wijzig gegevens bestaand lid."
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: views/admin_edit.php:18
+msgid "Edit User "
+msgstr "Wijzig gebruiker"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Wijzig lidmaatschap niveau"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Wijzig lidmaatschap niveau."
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "Wijzig lidmaatschap niveau"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Simple WP Membership::Leden"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "Voeg nieuw toe"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "zoeken"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Simple WP Membership::Lidmaatschap niveaus"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "Lidmaatschap niveau"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "Beheer de inhouds productie"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "Voorbeeld inhoud afscherm instellingen"
+
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(tweemaal, vereist)"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "Sterkte indicator"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"Hint: Het password moet minstens zeven karakters bevatten. Om het sterker te "
+"maken gebruikt u hoofdletters en kleine letters, nummers en symbolen "
+"zoals ! ? / $ % ^ & ; ) \""
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "Account Status"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "Lid sinds"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Simple WP Membership::Instellingen"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "PayPal Integratie Instellingen"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "Genereer de \"Geavanceerde Variabelen\" Code voor je PayPal knop"
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Voer het Lidmaatschap niveau ID in"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "Genereer de code"
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Genereer een Registratie Voltooid link"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Je kunt hier zelf een Registratie Compleet link genereren en aan je klant "
+"geven als zij de automatische email die hen was toegezonden na betaling "
+"hebben gemist."
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "Genereer Registratie Voltooid link"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "OF"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "Voor alle wachtende registraties"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "De Registratie Voltooid link zal hieronder verschijnen:"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "Stuur ook een Registratie herinnering "
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "Verstuur"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "Update"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "Email Adres"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "Reset Password"
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "Ingelogd als"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "Lidmaatschap"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:12
+msgid "Account Expiry"
+msgstr "Account verloopt"
+
+#: views/loggedin.php:19 views/login_widget_logged.php:16
+msgid "Logout"
+msgstr "Logout"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "Herinner mij"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "Password vergeten"
diff --git a/languages/swpm-pl_PL.mo b/languages/swpm-pl_PL.mo
new file mode 100644
index 0000000..2a63bab
Binary files /dev/null and b/languages/swpm-pl_PL.mo differ
diff --git a/languages/swpm-pl_PL.po b/languages/swpm-pl_PL.po
new file mode 100644
index 0000000..a2b530c
--- /dev/null
+++ b/languages/swpm-pl_PL.po
@@ -0,0 +1,708 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: simple membership\n"
+"POT-Creation-Date: 2014-08-28 19:28+1000\n"
+"PO-Revision-Date: 2014-12-09 14:05+0100\n"
+"Last-Translator: PrzemysÅaw Maj \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.7.1\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"Language: pl\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAccessControl.php:23 classes/class.bAccessControl.php:40
+msgid "You are not allowed to view this content"
+msgstr "Nie masz uprawnieÅ, aby zobaczyÄ treÅÄ posta."
+
+#: classes/class.bAccessControl.php:26 classes/class.bAccessControl.php:43
+msgid "You need to login to view this content. "
+msgstr "Musisz siÄ zalogowaÄ aby zobaczyÄ treÅÄ posta."
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:64
+msgid "Registration Successful."
+msgstr "Instalacja zakoÅczona powodzeniem"
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:73
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "Popraw nastÄpujÄ
ce:"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "ZajÄte"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "DostÄpny"
+
+#: classes/class.bAuth.php:48 classes/class.bFrontRegistration.php:179
+msgid "User Not Found."
+msgstr "Nie znaleziono użytkownika"
+
+#: classes/class.bAuth.php:55
+msgid "Password Empty or Invalid."
+msgstr "Zle wpisane hasÅo"
+
+#: classes/class.bAuth.php:79
+msgid "Account is inactive."
+msgstr "Konto jest nieaktywne."
+
+#: classes/class.bAuth.php:89
+msgid "You are logged in as:"
+msgstr "JesteÅ zalogowany jako:"
+
+#: classes/class.bAuth.php:128
+msgid "Logged Out Successfully."
+msgstr "Wylogowano poprawnie"
+
+#: classes/class.bAuth.php:170
+msgid "Session Expired."
+msgstr "Sesja wygasÅa"
+
+#: classes/class.bAuth.php:179
+msgid "Invalid User Name"
+msgstr "ZÅa nazwa użytkownika"
+
+#: classes/class.bAuth.php:187
+msgid "Bad Cookie Hash"
+msgstr "ZÅe ciasteczko :/"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr "Użytkownik o takiej nazwie istnieje, ale ma inny adres email"
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"Użytkownik o takim adresie email istnieje, ale ma innÄ
nazwÄ użytkownika"
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "Nazwa użytkownika wymagana"
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "Podaj innÄ
nazwÄ użytkownika (ta jest zajÄta)"
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "Wymagane hasÅo"
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "Podano różne hasÅa!"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "Wymagany email"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "BÅÄdny email"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "Taki adres email jest już użyty"
+
+#: classes/class.bForm.php:178
+msgid "Member since field is invalid"
+msgstr "Pole \"użytkownik\" jest nieprawidÅowe"
+
+#: classes/class.bForm.php:189
+msgid "Subscription starts field is invalid"
+msgstr "Pole \"subskrybcja od\" jest nierawidÅowe"
+
+#: classes/class.bForm.php:199
+msgid "Gender field is invalid"
+msgstr "Pole \"pÅeÄ\" jest nieprawidÅowa"
+
+#: classes/class.bForm.php:210
+msgid "Account state field is invalid"
+msgstr "Pole \"Account State\" jest nieprawidÅowe"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+msgid "Please"
+msgstr "ProszÄ"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+#: views/login.php:21
+msgid "Login"
+msgstr "Login"
+
+#: classes/class.bFrontRegistration.php:79
+#: classes/class.bFrontRegistration.php:158
+msgid "Please correct the following"
+msgstr "ProszÄ poprawiÄ nastÄpujÄ
ce"
+
+#: classes/class.bFrontRegistration.php:92
+msgid "Membership Level Couldn't be found."
+msgstr "Pozim czÅonkowstwa nie znaleziony"
+
+#: classes/class.bFrontRegistration.php:168
+msgid "Email Address Not Valid."
+msgstr "Adres email jest nieważny"
+
+#: classes/class.bFrontRegistration.php:199
+msgid "New password has been sent to your email address."
+msgstr "Nowe hasÅo zostaÅo wysÅane na podany adres email"
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "Czas trwania subskrybcji musi byÄ wiÄkszy od 0"
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "CzÅonek"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:467
+msgid "Members"
+msgstr "CzÅonkowie"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "Nazwa użytkownika"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "ImiÄ"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "Nazwisko"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "email"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "Poziom dostÄpu"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "Subskrybcja od"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Account State"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Skasuj"
+
+#: classes/class.bMembers.php:100
+msgid "No Member found."
+msgstr "Niue ma takiego użytkownika"
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "Dodano nowy poziom czÅonkowstwa"
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "Aktualizacja pomyÅlna"
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:469
+msgid "Membership Levels"
+msgstr "Poziom czÅonkowstwa"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Uprawnienia"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "Subskrybcja ważna przez"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "Plugin Documentation"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "GÅówne ustawienia"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "Pozwól na darmowe czÅonkostwo"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "WÅÄ
cz / wyÅÄ
cz rejestracjÄ dla darmowyego czÅonkowstwa"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "Level ID darmowego czÅonkowstwa"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "Przyciel Level ID do darmowego czÅonkowstwa"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "Showaj Adminibar"
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"WordPress pokazuje pasek narzÄdzi administratora dla zalogowanych "
+"użytkowników witryny . Zaznacz to pole, jeÅli chcesz ukryÄ ten pasek na "
+"swojej stronie"
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "Ustawienia strony"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "Strona logowania"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "Strona rejestracji"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "Strona doÅÄ
cz do nas"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "Strona edycji profilu"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "Strona zmiany hasÅa"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "Ustawienia testów i debugowania"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "WÅÄ
cz testy sandbox "
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "WÅÄ
cz tÄ opcjÄ, jeÅli chcesz zrobiÄ testy pÅatnoÅci (sandbox)"
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "Różne ustawienia email"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "z adresu email"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "Ustawienia poczty e-mail (Podpowiedź do zakoÅczenia rejestracji )"
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "Temat email"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "TreÅÄ email"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "Ustawienia email (rejestracja zakoÅczona)"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "WyÅlij powiadomienie do administratora"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "WyÅlij email to dodanego użytkownika przez panel administratora"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr ""
+
+#: classes/class.bSettings.php:326
+msgid "Not a Member?"
+msgstr "Nie masz konta?"
+
+#: classes/class.bSettings.php:326 views/login.php:30
+msgid "Join Us"
+msgstr "DoÅÄ
cz do nas."
+
+#: classes/class.bUtils.php:32 views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "Aktywuj"
+
+#: classes/class.bUtils.php:33 views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "Nieaktywny"
+
+#: classes/class.bUtils.php:34 views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "Oczekuje"
+
+#: classes/class.bUtils.php:35 views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "WygasÅo"
+
+#: classes/class.bUtils.php:225
+msgid "Never"
+msgstr "Nigdy"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Rejestracja"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Strona logowania"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Twój profil"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "Reset hasÅa"
+
+#: classes/class.simple-wp-membership.php:178
+msgid "You are not logged in."
+msgstr "Nie jesteÅ zalogowany"
+
+#: classes/class.simple-wp-membership.php:209
+msgid "Simple WP Membership Protection"
+msgstr "Simple WP Membership Protection"
+
+#: classes/class.simple-wp-membership.php:222
+msgid "Simple Membership Protection options"
+msgstr "Simple Membership Protection options"
+
+#: classes/class.simple-wp-membership.php:238
+msgid "Do you want to protect this content?"
+msgstr "Czy chcesz "
+
+#: classes/class.simple-wp-membership.php:243
+msgid "Select the membership level that can access this content:"
+msgstr "Wybierz poziom dostÄpu do tej zawartoÅci"
+
+#: classes/class.simple-wp-membership.php:375
+msgid "Display SWPM Login."
+msgstr "WyÅwietl SWPM Login"
+
+#: classes/class.simple-wp-membership.php:377
+msgid "SWPM Login"
+msgstr "SWPM Login"
+
+#: classes/class.simple-wp-membership.php:464
+msgid "WP Membership"
+msgstr "WP Membership"
+
+#: classes/class.simple-wp-membership.php:471
+msgid "Settings"
+msgstr "Ustawienia"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "HasÅo"
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "Powtórz hasÅo"
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "PÅeÄ"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "Nr telefonu"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "Ulica"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "Miasto"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "Województwo"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "Kod pocztowy"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "Kraj"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "Firma"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "Rejestruj"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "Dodaj użytkownika"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "Dodaj nowego użytkownika do tej strony"
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "Nazwa użytkownika"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(wymagane)"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "E-mail"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "Dodaj nowego czÅonka"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Stwórz nowy poziom dostÄpu"
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Nazwa poziomu dostÄpu"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "DomyÅlna uprawnienia WordPress"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "Czas trwania subskrybcji"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "Nie wygasÅo"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "Dodaj nowy pozim dostÄpu"
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Edycja użytkownika"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Edytuj istniejÄ
cego użytkownika"
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "Użytkownik"
+
+#: views/admin_edit.php:18
+msgid "Edit User "
+msgstr "Edycja użytkownika"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Edycja poziomu dostÄpu"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Edycja poziomu dostÄpu"
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "Edycja poziomu dostÄpu"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Simple WP Membership::Użytkownicy"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "Dodaj nowy"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "Szukaj"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Simple WP Membership::Poziom czÅonkowstwa"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "Poziom dostÄpu"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "ZarzÄ
dzanie ustawieniami ochrony zawartoÅci"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "PrzykÅad ustawienia ochrony zawartoÅci"
+
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(dwukrotnie, wymagane)"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "Wskaźnik siÅy"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"Podpowiedź: HasÅo powinno mieÄ conajmniej 7 znaków. Aby byÅo silniejsze "
+"można używaÄ dużych i maÅych liter, znaków, symboli takich jak ! \" ? $ % ^ "
+"& )"
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "Status konta"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "Użytkownik od"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Simple WP Membership::Ustawienia"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "PayPal Ustawienia integracyjne"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "Genrowany \"Advanced Variables\" kod dla twojego przycisku PayPal"
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Wpisz ID poziomu "
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "Wygeneruj kod"
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Generowanie linku zakoÅczenia rejestracji"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Tutaj można rÄcznie wygenerowaÄ link zakoÅczenia rejestracji i wysÅaÄ go do "
+"klienta , jeÅli nie zostaÅ pominiÄty e-mail , który zostaÅ automatycznie "
+"wysÅany po dokonaniu pÅatnoÅci ."
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "Generowanie linku zakoÅczenia rejestracji"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "lub"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "Dla wszystkich oczekujÄ
cych rejestracji"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Link zakoÅczenia rejestracji pojawi siÄ poniżej :"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "WyÅlij przypomnienie o rejestracji na email"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "WyÅlij"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "Aktualizacja"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "adres email"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "Reset hasÅa"
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "JesteÅ zalogowany jako"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "CzÅonkostwo"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:12
+msgid "Account Expiry"
+msgstr "Konto straciÅo ważnoÅÄ"
+
+#: views/loggedin.php:19 views/login_widget_logged.php:16
+msgid "Logout"
+msgstr "Wyloguj"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "PamiÄtaj mnie"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "ZapomniaÅeÅ hasÅa"
diff --git a/languages/swpm-pt_BR.mo b/languages/swpm-pt_BR.mo
new file mode 100644
index 0000000..5f393d5
Binary files /dev/null and b/languages/swpm-pt_BR.mo differ
diff --git a/languages/swpm-pt_BR.po b/languages/swpm-pt_BR.po
new file mode 100644
index 0000000..1fe2549
--- /dev/null
+++ b/languages/swpm-pt_BR.po
@@ -0,0 +1,711 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: simple membership\n"
+"POT-Creation-Date: 2014-08-28 19:28+1000\n"
+"PO-Revision-Date: 2015-04-11 11:19-0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.7.5\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Language: pt_BR\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAccessControl.php:23 classes/class.bAccessControl.php:40
+msgid "You are not allowed to view this content"
+msgstr "Você não tem permissão para visualizar este conteúdo"
+
+#: classes/class.bAccessControl.php:26 classes/class.bAccessControl.php:43
+msgid "You need to login to view this content. "
+msgstr "Você precisa fazer o login para visualizar este conteúdo. "
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:64
+msgid "Registration Successful."
+msgstr "Registo bem sucedido."
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:73
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "Corrija o seguinte:"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "Já em uso"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "DisponÃvel"
+
+#: classes/class.bAuth.php:48 classes/class.bFrontRegistration.php:179
+msgid "User Not Found."
+msgstr "Usuário não encontrado."
+
+#: classes/class.bAuth.php:55
+msgid "Password Empty or Invalid."
+msgstr "Senha vazia ou inválida."
+
+#: classes/class.bAuth.php:79
+msgid "Account is inactive."
+msgstr "A conta está inativa."
+
+#: classes/class.bAuth.php:89
+msgid "You are logged in as:"
+msgstr "Você está logado como:"
+
+#: classes/class.bAuth.php:128
+msgid "Logged Out Successfully."
+msgstr "Desconectado com sucesso."
+
+#: classes/class.bAuth.php:170
+msgid "Session Expired."
+msgstr "Sessão expirada."
+
+#: classes/class.bAuth.php:179
+msgid "Invalid User Name"
+msgstr "Nome de Usuário Inválido"
+
+#: classes/class.bAuth.php:187
+msgid "Bad Cookie Hash"
+msgstr "Bad Cookie Hash"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"Já existe conta Wordpress com o nome de usuário fornecido. Mas o e-mail dado "
+"não corresponde."
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"Já existe conta Wordpress com o e-mail fornecido. Mas o nome de usuário dado "
+"não corresponde."
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "O nome de usuário é obrigatório"
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "Nome do usuário já existe."
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "A senha é requerida"
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "Senha incompatÃvel"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "O e-mail é obrigatório"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "O e-mail é inválido"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "O e-mail já está sendo usado."
+
+#: classes/class.bForm.php:178
+msgid "Member since field is invalid"
+msgstr "Campo Membro desde é inválido"
+
+#: classes/class.bForm.php:189
+msgid "Subscription starts field is invalid"
+msgstr "Campo InÃcio de Assinatura é inválido"
+
+#: classes/class.bForm.php:199
+msgid "Gender field is invalid"
+msgstr "Campo Sexo é inválido"
+
+#: classes/class.bForm.php:210
+msgid "Account state field is invalid"
+msgstr "Campo de Status da Conta é inválido"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+msgid "Please"
+msgstr "Por favor"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+#: views/login.php:21
+msgid "Login"
+msgstr "Entrar"
+
+#: classes/class.bFrontRegistration.php:79
+#: classes/class.bFrontRegistration.php:158
+msgid "Please correct the following"
+msgstr "Corrija o seguinte"
+
+#: classes/class.bFrontRegistration.php:92
+msgid "Membership Level Couldn't be found."
+msgstr "NÃvel de Associação não pôde ser encontrado."
+
+#: classes/class.bFrontRegistration.php:168
+msgid "Email Address Not Valid."
+msgstr "O endereço de e-mail não é válido."
+
+#: classes/class.bFrontRegistration.php:199
+msgid "New password has been sent to your email address."
+msgstr "Nova senha foi enviada para o seu endereço de e-mail."
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "Duração da assinatura deve ser > 0 ."
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Usuário"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:467
+msgid "Members"
+msgstr "Usuários"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr ""
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "Nome de Usuário"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "Primeiro Nome"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "Sobrenome"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "E-mail"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "NÃvel de Associação"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "InÃcio da Assinatura"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Status da Conta"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Excluir"
+
+#: classes/class.bMembers.php:100
+msgid "No Member found."
+msgstr "Nenhum membro encontrado."
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "NÃvel de Associação criado com sucesso,"
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "Atualizado com sucesso."
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:469
+msgid "Membership Levels"
+msgstr "NÃveis de Associação"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "A função"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "Assinatura válida para"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "Plugin Documentation"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "Configurações Gerais"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "Habilite associação grátis"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "Ativar / desativar o registro para o nÃvel de adesão gratuita"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "Associação Livre NÃvel ID"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "Atribuir livre adesão nÃvel ID"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "Esconder Admin Bar"
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"WordPress mostra uma barra de ferramentas de administração para o site para "
+"os usuários do site. Marque esta caixa se você quer esconder essa barra de "
+"ferramentas admin no front-end do seu site."
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "Configurações de Páginas"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "URL da página de Entrar"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "URL da página Registro"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "URL da página Junte-se a Nós"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "URL da página Editar Perfil"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "URL da Página Reset de Senha"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "Configurações de teste e depuração"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "Permitir testes Sandbox"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Ative essa opção se você quiser fazer o teste de pagamento sandbox."
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "Configurações E-mail Misc. "
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "De Endereço de Email"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr ""
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "Assunto do E-mail"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "Corpo do E-mail"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "Configurações de e-mail ( Registro Completo)"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "Enviar uma notificação ao Administrador"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr ""
+"Enviar e-mail para membros quando adicionada via Painel de Administração"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "Configurações de e-mail ( Conta de Notificação de atualização )"
+
+#: classes/class.bSettings.php:326
+msgid "Not a Member?"
+msgstr "Não é um membro?"
+
+#: classes/class.bSettings.php:326 views/login.php:30
+msgid "Join Us"
+msgstr "Junte-se a nós"
+
+#: classes/class.bUtils.php:32 views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "Ativa"
+
+#: classes/class.bUtils.php:33 views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "Inativo"
+
+#: classes/class.bUtils.php:34 views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "Pendendo"
+
+#: classes/class.bUtils.php:35 views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "Expirado"
+
+#: classes/class.bUtils.php:225
+msgid "Never"
+msgstr "Nunca"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Inscrição"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Login de usuário"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Perfil"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr ""
+
+#: classes/class.simple-wp-membership.php:178
+msgid "You are not logged in."
+msgstr "Você não está logado."
+
+#: classes/class.simple-wp-membership.php:209
+msgid "Simple WP Membership Protection"
+msgstr ""
+
+#: classes/class.simple-wp-membership.php:222
+msgid "Simple Membership Protection options"
+msgstr "Opções de proteção Simple Membership"
+
+#: classes/class.simple-wp-membership.php:238
+msgid "Do you want to protect this content?"
+msgstr "Você quer proteger este conteúdo?"
+
+#: classes/class.simple-wp-membership.php:243
+msgid "Select the membership level that can access this content:"
+msgstr "Selecione o nÃvel de associação que pode acessar este conteúdo:"
+
+#: classes/class.simple-wp-membership.php:375
+msgid "Display SWPM Login."
+msgstr ""
+
+#: classes/class.simple-wp-membership.php:377
+msgid "SWPM Login"
+msgstr ""
+
+#: classes/class.simple-wp-membership.php:464
+msgid "WP Membership"
+msgstr ""
+
+#: classes/class.simple-wp-membership.php:471
+msgid "Settings"
+msgstr "Configurações"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "Senha"
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "Repita a senha"
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "Sexo"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "telefone"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "Rua"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "Cidade"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "Estado"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "Cep"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "PaÃs"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "Empresa"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "Cadastre-se"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "Adicionar membro"
+
+#: views/admin_add.php:7
+#, fuzzy
+msgid "Create a brand new user and add it to this site."
+msgstr "Crie um novo usuário e adicioná-lo a este site."
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr ""
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(obrigatório)"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr ""
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "Adicionar Novo Membro "
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Criar novo nÃvel de associação."
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Nome do NÃvel de Associação"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "WordPress Role Padrão"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "Duração da Assinatura "
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "Sem validade"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "Adicionar Novo NÃvel de Associação "
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Editar Membro"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Edite detalhes de membros existentes."
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "Usuário"
+
+#: views/admin_edit.php:18
+msgid "Edit User "
+msgstr "Editar Usuário "
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Editar NÃvel de Associação"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Editar NÃvel de Associação"
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "Editar NÃvel de Associação "
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Membership WP Simples :: Membros"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "Adicionar Novo"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "Pesquisa"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Membership WP Simples :: NÃveis de Associação"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "NÃvel de associação"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "Gerenciar Produção de Conteúdo"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "Exemplo de configurações de proteção de conteúdo"
+
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(duas vezes, é necessária)"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "Indicador de força"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"Dica: A senha deve ter pelo menos sete caracteres. Para torná-lo mais forte, "
+"use letras maiúsculas e minúsculas, números e sÃmbolos como !?"
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "Status da Conta"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "Cadastrado"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Membership WP Simples :: Configurações"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "Configurações de Integração com PayPal"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "Gerar o Código \"Advanced Variables\" para o botão PayPal"
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Digite o NÃvel de Associação ID"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "Gerar código"
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Gerar link de Conclusão de Registro"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Você pode gerar um atalho manualmente conclusão de inscrição aqui e dar a "
+"seu cliente, se eles perderam o e-mail que foi enviado automaticamente para "
+"eles após o pagamento."
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "Gerar link de Conclusão de Registro"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "OU"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "Para todos os registos pendentes"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Links conclusão de inscrição aparecerá abaixo:"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "Enviar Inscrição Reminder Email demais"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "Enviar"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "Atualização"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "Endereço de e-mail"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "Redefinir senha"
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "Logado como"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "Associado"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:12
+msgid "Account Expiry"
+msgstr "Validade da Conta"
+
+#: views/loggedin.php:19 views/login_widget_logged.php:16
+msgid "Logout"
+msgstr "Sair"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "Lembre-se de mim"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "Esqueci minha senha"
diff --git a/languages/swpm-ro_RO.mo b/languages/swpm-ro_RO.mo
new file mode 100644
index 0000000..09de7a7
Binary files /dev/null and b/languages/swpm-ro_RO.mo differ
diff --git a/languages/swpm-ro_RO.po b/languages/swpm-ro_RO.po
new file mode 100644
index 0000000..eb0c520
--- /dev/null
+++ b/languages/swpm-ro_RO.po
@@ -0,0 +1,709 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: simple membership\n"
+"POT-Creation-Date: 2014-08-28 19:28+1000\n"
+"PO-Revision-Date: 2015-01-11 12:34+0200\n"
+"Last-Translator: Iulian \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.7.3\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
+"2:1));\n"
+"Language: ro_RO\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAccessControl.php:23 classes/class.bAccessControl.php:40
+msgid "You are not allowed to view this content"
+msgstr "Nu aveti dreptul sa accesati aceste informatii"
+
+#: classes/class.bAccessControl.php:26 classes/class.bAccessControl.php:43
+msgid "You need to login to view this content. "
+msgstr "Trebuie sa va autentificati pentru a vedea aceste informatii."
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:64
+msgid "Registration Successful."
+msgstr "Inregistrare reusita."
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:73
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "Te rugam sa corectezi urmatoarele:"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "Deja folosit"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "Disponibil"
+
+#: classes/class.bAuth.php:48 classes/class.bFrontRegistration.php:179
+msgid "User Not Found."
+msgstr "Nu am gasit utilizatorul"
+
+#: classes/class.bAuth.php:55
+msgid "Password Empty or Invalid."
+msgstr "Parola nu este introdusa sau este gresita."
+
+#: classes/class.bAuth.php:79
+msgid "Account is inactive."
+msgstr "Cont inactiv."
+
+#: classes/class.bAuth.php:89
+msgid "You are logged in as:"
+msgstr "Esti autentificat ca si:"
+
+#: classes/class.bAuth.php:128
+msgid "Logged Out Successfully."
+msgstr "Te-ai deautentificat cu succes."
+
+#: classes/class.bAuth.php:170
+msgid "Session Expired."
+msgstr "Sesiune expirata."
+
+#: classes/class.bAuth.php:179
+msgid "Invalid User Name"
+msgstr "Utilizator incorect"
+
+#: classes/class.bAuth.php:187
+msgid "Bad Cookie Hash"
+msgstr "Prajiturica rea :) (bad cookie)"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"Exista un cont wordpress cu acest nume de utilizator dar nu se potrivesc "
+"adresele de email."
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"Exista un cont wordpress cu aceasta adresa de email dar nu se potriveste cu "
+"numele de utilizator."
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "Este nevoie de numele de utilizator"
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "Acest nume de utilizator exista deja."
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "Este nevoie de parola"
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "Parolele nu se potrivesc"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "Este nevoie de adresa de email"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "Adresa de email incorecta"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "Adresa de email deja inregistrata in baza noastra de date"
+
+#: classes/class.bForm.php:178
+msgid "Member since field is invalid"
+msgstr "Campul de membru din este incorect"
+
+#: classes/class.bForm.php:189
+msgid "Subscription starts field is invalid"
+msgstr "Campul de start calitate membru este incorect"
+
+#: classes/class.bForm.php:199
+msgid "Gender field is invalid"
+msgstr "Campul de gen sexual este incorect"
+
+#: classes/class.bForm.php:210
+msgid "Account state field is invalid"
+msgstr "Campul de stare a contului este incorect"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+msgid "Please"
+msgstr "Te rugam"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+#: views/login.php:21
+msgid "Login"
+msgstr "Autentificare"
+
+#: classes/class.bFrontRegistration.php:79
+#: classes/class.bFrontRegistration.php:158
+msgid "Please correct the following"
+msgstr "Te rugam sa corectezi urmatoarele"
+
+#: classes/class.bFrontRegistration.php:92
+msgid "Membership Level Couldn't be found."
+msgstr "Nivelul de membru nu a fost gasit"
+
+#: classes/class.bFrontRegistration.php:168
+msgid "Email Address Not Valid."
+msgstr "Adresa de email incorecta"
+
+#: classes/class.bFrontRegistration.php:199
+msgid "New password has been sent to your email address."
+msgstr "O noua parola a fost trimisa pe adresa dvs. de email."
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "Durata abonarii trebuie sa fie mai mare ca 0"
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Membru"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:467
+msgid "Members"
+msgstr "Membrii"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "Nume de utilizator"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "Prenume"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "Nume de familie"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "Adresa de email"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "Nivel de abonare"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "Abonarea incepe la"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Starea contului"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Stergere"
+
+#: classes/class.bMembers.php:100
+msgid "No Member found."
+msgstr "Nu am gasit membrul"
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "Nivelul de abonare creat cu succes"
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "Actualizat cu succes"
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:469
+msgid "Membership Levels"
+msgstr "Niveluri de abonare"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Rol"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "Abonare valabila pana la"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "Documentatie plugin"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "Setari generale"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "Permite Abonare gratuita"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "Permite/Nu permie inregistrarea pentru abonare gratuita"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "ID pentru Abonarea gratuita"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "Aloca ID pentru abonare gratuita"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "Ascunde bara de admin"
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"Wordpress arata bara de administrator utilizatorilor autentificati. Bifeaza "
+"casuta pentru a ascunde aceasta bara."
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "Setari pagina"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "URL pentru autentificare"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "URL pentru inregistrare"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "URL pentru Pagina de Aderare"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "URL pentru editarea profilului"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "URL pentru resetare parola"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "Setari pentru test & debug"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "Permite testarea in mediul Sandbox"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Bifeaza acesta optiune pentru testarea platilor"
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "Setari diverse de email"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "Adresa de email de la care sa plece toate email-urile"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "Setari email (Pentru a termina inregistrarea)"
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "Subiect Email"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "Continut Email"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "Setari Email (Inregistrare reusita)"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "Trimitere notificari catre Admin"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "Trimite email la membrii cand sunt adaugati via Admin Dashboard"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "Setari Email (Notificari pentru upgrade la abonare)"
+
+#: classes/class.bSettings.php:326
+msgid "Not a Member?"
+msgstr "Nu sunteti inca membru ?"
+
+#: classes/class.bSettings.php:326 views/login.php:30
+msgid "Join Us"
+msgstr "Inscrieti-va"
+
+#: classes/class.bUtils.php:32 views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "Activ"
+
+#: classes/class.bUtils.php:33 views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "Inactiv"
+
+#: classes/class.bUtils.php:34 views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "In asteptare"
+
+#: classes/class.bUtils.php:35 views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "Expirat"
+
+#: classes/class.bUtils.php:225
+msgid "Never"
+msgstr "Niciodata"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Inregistrare"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Autentificare membrii"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Profil"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "Resetare Parola"
+
+#: classes/class.simple-wp-membership.php:178
+msgid "You are not logged in."
+msgstr "Nu sunteti autentificat"
+
+#: classes/class.simple-wp-membership.php:209
+msgid "Simple WP Membership Protection"
+msgstr "Simple WP Membership Protection"
+
+#: classes/class.simple-wp-membership.php:222
+msgid "Simple Membership Protection options"
+msgstr "Optiuni Simple WP Membership Protection"
+
+#: classes/class.simple-wp-membership.php:238
+msgid "Do you want to protect this content?"
+msgstr "Vrei sa protejezi acest continut ?"
+
+#: classes/class.simple-wp-membership.php:243
+msgid "Select the membership level that can access this content:"
+msgstr "Selecteaza nivelul de abonare ce poate accesa acest continu:"
+
+#: classes/class.simple-wp-membership.php:375
+msgid "Display SWPM Login."
+msgstr "Arata autentificare SWPM ."
+
+#: classes/class.simple-wp-membership.php:377
+msgid "SWPM Login"
+msgstr "Autentificare SWPM"
+
+#: classes/class.simple-wp-membership.php:464
+msgid "WP Membership"
+msgstr "Abonare WP"
+
+#: classes/class.simple-wp-membership.php:471
+msgid "Settings"
+msgstr "Setari"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "Parola"
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "Repetare Parola"
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "Sex"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "Telefon"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "Strada"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "Oras"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "Judet"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "Cod postal"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "Tara"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "Companie"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "Inregistrare"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "Adauga membru"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "Creeaza un utilizator nou si adauga-l pe site."
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "Nume de utilizator"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(obligatoriu)"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "Adresa de email"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "Adauga membru nou"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Creeaza nivel nou de abonare"
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Nume nivel de abonare"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "Rol Wordpress implicit"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "Durata Abonare"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "Fara expirare"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "Adauga nivel nou de abonare"
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Editeaza membru"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Editeaza detalii membru existent"
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "Utilizator"
+
+#: views/admin_edit.php:18
+msgid "Edit User "
+msgstr "Editeaza utilizator"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Editeaza nivel abonare"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Editeaza nivel abonare."
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "Editeaza nivel abonare"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Simple WP Membership::Membrii"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "Adauga nou"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "cauta"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Simple WP Membership::Nivele Abonare"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "Nivel Abonare"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "Gestioneaza generarea de continut"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "Exemplu de setari protejare continut"
+
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(de doua ori, obligatoriu)"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "Indicator complexitate"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"Sfat: Parola ar trebui sa aibe macar 7 caractere. Pentru a fi cat mai "
+"complexa, folositi litere mici si mari, numere si simboluri de genul ! \" ? "
+"$ % ^ &)"
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "Status cont"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "Membru din"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Simple WP Membership::Setari"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "Setari integrare plati Paypal"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "Genereaza codul de \"Advanced Variables\" necesar butonului Paypal"
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Introdu ID pentru nivelul de abonare"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "Genereaza cod"
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Genereaza link pentru Inregistrarea incheiata cu succes"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Poti genera manual un link pentru inregistrarea cu succes si il poti trimite "
+"clientului daca acestia nu au primit email-ul automat dupa efectuarea platii."
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "Genereaza link pentru inregistrarea cu succes"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "SAU"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "Pentru toate inregistrarile in asteptare"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Link-ul de inregistrare cu succes va aparea dedesubt:"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "Trimite de asemenea si un email cu reminder de inregistrare"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "Trimite"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "Actualizeaza"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "Adresa de email"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "Resetare Parola"
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "Autentificat ca"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "Abonare"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:12
+msgid "Account Expiry"
+msgstr "Expirare cont"
+
+#: views/loggedin.php:19 views/login_widget_logged.php:16
+msgid "Logout"
+msgstr "Iesire din cont"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "Tine-ma minte"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "Am uitat parola"
diff --git a/languages/swpm-ru_RU.mo b/languages/swpm-ru_RU.mo
new file mode 100644
index 0000000..3d3be29
Binary files /dev/null and b/languages/swpm-ru_RU.mo differ
diff --git a/languages/swpm-ru_RU.po b/languages/swpm-ru_RU.po
new file mode 100644
index 0000000..05f9ca9
--- /dev/null
+++ b/languages/swpm-ru_RU.po
@@ -0,0 +1,712 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: simple membership\n"
+"POT-Creation-Date: 2014-08-28 19:28+1000\n"
+"PO-Revision-Date: 2015-01-11 02:11+0300\n"
+"Last-Translator: Vladimir Vaulin \n"
+"Language-Team: \n"
+"Language: ru_RU\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.7.3\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAccessControl.php:23 classes/class.bAccessControl.php:40
+msgid "You are not allowed to view this content"
+msgstr "У Ð²Ð°Ñ Ð½ÐµÑ Ð¿Ñав на пÑоÑмоÑÑ ÑÑого маÑеÑиала."
+
+#: classes/class.bAccessControl.php:26 classes/class.bAccessControl.php:43
+msgid "You need to login to view this content. "
+msgstr "Ðам необÑ
одимо войÑи, ÑÑÐ¾Ð±Ñ ÑвидеÑÑ ÑÑÐ¾Ñ Ð¼Ð°ÑеÑиал."
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:64
+msgid "Registration Successful."
+msgstr "РегиÑÑÑаÑÐ¸Ñ Ð¾ÑÑÑеÑÑвлена ÑÑпеÑно."
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:73
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "ÐожалÑйÑÑа, иÑпÑавÑÑе ÑледÑÑÑие оÑибки:"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "Уже пÑинÑÑо"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "ÐоÑÑÑпно"
+
+#: classes/class.bAuth.php:48 classes/class.bFrontRegistration.php:179
+msgid "User Not Found."
+msgstr "ÐолÑзоваÑÐµÐ»Ñ Ð½Ðµ найден."
+
+#: classes/class.bAuth.php:55
+msgid "Password Empty or Invalid."
+msgstr "ÐаÑÐ¾Ð»Ñ Ð¿ÑÑÑой или невеÑнÑй."
+
+#: classes/class.bAuth.php:79
+msgid "Account is inactive."
+msgstr "УÑеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð½Ðµ акÑивна."
+
+#: classes/class.bAuth.php:89
+msgid "You are logged in as:"
+msgstr "ÐÑ Ð²Ð¾Ñли как:"
+
+#: classes/class.bAuth.php:128
+msgid "Logged Out Successfully."
+msgstr "ÐÑ ÑÑпеÑно вÑÑли."
+
+#: classes/class.bAuth.php:170
+msgid "Session Expired."
+msgstr "СеÑÑÐ¸Ñ Ð¸ÑÑекла."
+
+#: classes/class.bAuth.php:179
+msgid "Invalid User Name"
+msgstr "ÐевеÑное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ"
+
+#: classes/class.bAuth.php:187
+msgid "Bad Cookie Hash"
+msgstr "ÐевеÑнÑй Ñ
ÑÑ ÐºÑки"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"ÐÐ»Ñ Ñказанного полÑзоваÑÐµÐ»Ñ ÑÑÑеÑÑвÑÐµÑ ÑÑеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ, но e-mail не "
+"ÑовпадаеÑ."
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"ÐÐ»Ñ Ñказанного e-mail ÑÑÑеÑÑвÑÐµÑ ÑÑеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ, но Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ðµ "
+"ÑовпадаеÑ."
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¾Ð±ÑзаÑелÑно."
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "Такой полÑзоваÑÐµÐ»Ñ Ñже ÑÑÑеÑÑвÑеÑ."
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "ÐаÑÐ¾Ð»Ñ Ð¾Ð±ÑзаÑелен"
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "ÐаÑÐ¾Ð»Ñ Ð½Ðµ ÑовпадаеÑ"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "E-mail обÑзаÑелен"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "ÐевеÑнÑй e-mail"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "Такой e-mail Ñже ÑÑÑеÑÑвÑеÑ."
+
+#: classes/class.bForm.php:178
+msgid "Member since field is invalid"
+msgstr "ÐевеÑное поле \"даÑа пÑиÑоединениÑ\""
+
+#: classes/class.bForm.php:189
+msgid "Subscription starts field is invalid"
+msgstr "ÐевеÑное поле \"наÑало подпиÑки\""
+
+#: classes/class.bForm.php:199
+msgid "Gender field is invalid"
+msgstr "ÐевеÑное поле \"пол\""
+
+#: classes/class.bForm.php:210
+msgid "Account state field is invalid"
+msgstr "ÐевеÑное поле \"ÑоÑÑоÑние ÑÑеÑной запиÑи\""
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+msgid "Please"
+msgstr "ÐожалÑйÑÑа,"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+#: views/login.php:21
+msgid "Login"
+msgstr "ÐойдиÑе"
+
+#: classes/class.bFrontRegistration.php:79
+#: classes/class.bFrontRegistration.php:158
+msgid "Please correct the following"
+msgstr "ÐожалÑйÑÑа, иÑпÑавÑÑе ÑледÑÑÑие оÑибки"
+
+#: classes/class.bFrontRegistration.php:92
+msgid "Membership Level Couldn't be found."
+msgstr "УÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа не найден."
+
+#: classes/class.bFrontRegistration.php:168
+msgid "Email Address Not Valid."
+msgstr "ÐевеÑнÑй адÑÐµÑ e-mail."
+
+#: classes/class.bFrontRegistration.php:199
+msgid "New password has been sent to your email address."
+msgstr "Ðа ÐÐ°Ñ Ð°Ð´ÑÐµÑ e-mail вÑÑлан новÑй паÑолÑ."
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "СÑок подпиÑки должен бÑÑÑ Ð±Ð¾Ð»ÑÑе 0."
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "УÑаÑÑник"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:467
+msgid "Members"
+msgstr "УÑаÑÑники"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "ÐмÑ"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "ФамилиÑ"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "E-mail"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "УÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "ÐодпиÑка наÑинаеÑÑÑ"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "СоÑÑоÑние ÑÑеÑной запиÑи"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "УдалиÑÑ"
+
+#: classes/class.bMembers.php:100
+msgid "No Member found."
+msgstr "УÑаÑÑник не найден."
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "УÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа ÑÑпеÑно Ñоздан."
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "УÑпеÑно обновлено."
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:469
+msgid "Membership Levels"
+msgstr "УÑовни доÑÑÑпа"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "РолÑ"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "ÐодпиÑка дейÑÑвиÑелÑна до"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "ÐокÑменÑаÑÐ¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "ÐбÑие наÑÑÑойки"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "ÐклÑÑиÑÑ Ð±ÐµÑплаÑное ÑленÑÑво"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "ÐклÑÑиÑÑ/оÑклÑÑиÑÑ ÑегиÑÑÑаÑÐ¸Ñ Ð´Ð»Ñ Ð±ÐµÑплаÑного ÑÑÐ¾Ð²Ð½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "ID беÑплаÑного ÑÑÐ¾Ð²Ð½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "ÐÑиÑвоиÑÑ ID беÑплаÑного ÑÑÐ¾Ð²Ð½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "СпÑÑÑаÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑиÑованиÑ"
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"ÐÑем воÑедÑим полÑзоваÑелÑм WordPress показÑÐ²Ð°ÐµÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑиÑованиÑ. "
+"ÐоÑÑавÑÑе ÑÑÐ¾Ñ Ñлажок, еÑли Ð²Ñ Ñ
оÑиÑе пÑÑÑаÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñо "
+"ÑÑÑÐ°Ð½Ð¸Ñ Ð²Ð°Ñего ÑайÑа."
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "ÐаÑÑÑойки ÑÑÑаниÑ"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "URL ÑÑÑаниÑÑ Ð»Ð¾Ð³Ð¸Ð½Ð°"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "URL ÑÑÑаниÑÑ ÑегиÑÑÑаÑии"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "URL ÑÑÑаниÑÑ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñков"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "URL ÑÑÑаниÑÑ ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑоÑилÑ"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "URL ÑÑÑаниÑÑ ÑбÑоÑа паÑолÑ"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "ÐаÑÑÑойки ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ оÑладки"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "РазÑеÑиÑÑ ÑеÑÑиÑование в Ñежиме пеÑоÑниÑÑ"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr ""
+"ÐклÑÑиÑе ÑÑÑ Ð½Ð°ÑÑÑойкÑ, еÑли Ð²Ñ Ñ
оÑиÑе пÑоводиÑÑ Ð¿Ð»Ð°Ñежи в ÑеÑÑовом Ñежиме."
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "РазлиÑнÑе наÑÑÑойки e-mail"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "ÐдÑÐµÑ Ð¾ÑпÑавки пиÑем"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "ÐаÑÑÑойки пиÑем (ÐапÑÐ¾Ñ Ð¾ подÑвеÑждении ÑегиÑÑÑаÑии)"
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "Тема пиÑÑма"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "ТекÑÑ Ð¿Ð¸ÑÑма"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "ÐаÑÑÑойки пиÑем (УÑпеÑÐ½Ð°Ñ ÑегиÑÑÑаÑиÑ)"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "ÐÑпÑавлÑÑÑ Ñведомление админиÑÑÑаÑоÑÑ"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "ÐÑпÑавлÑÑÑ Ñведомление ÑÑаÑÑникÑ, когда он добавлен админиÑÑÑаÑоÑом"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "ÐаÑÑÑойки пиÑем (Уведомление об обновлении ÑÑеÑной запиÑи)"
+
+#: classes/class.bSettings.php:326
+msgid "Not a Member?"
+msgstr "Ðе ÑÑаÑÑник?"
+
+#: classes/class.bSettings.php:326 views/login.php:30
+msgid "Join Us"
+msgstr "ÐÑиÑоединÑйÑеÑÑ Ðº нам"
+
+#: classes/class.bUtils.php:32 views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "ÐкÑивнÑй"
+
+#: classes/class.bUtils.php:33 views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "ÐеакÑивнÑй"
+
+#: classes/class.bUtils.php:34 views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "Рожидании"
+
+#: classes/class.bUtils.php:35 views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "ÐÑоÑÑоÑен"
+
+#: classes/class.bUtils.php:225
+msgid "Never"
+msgstr "Ðикогда"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "РегиÑÑÑаÑиÑ"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "ÐÑ
од Ð´Ð»Ñ ÑÑаÑÑников"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "УÑеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "СбÑÐ¾Ñ Ð¿Ð°ÑолÑ"
+
+#: classes/class.simple-wp-membership.php:178
+msgid "You are not logged in."
+msgstr "ÐÑ Ð½Ðµ воÑли на ÑайÑ."
+
+#: classes/class.simple-wp-membership.php:209
+msgid "Simple WP Membership Protection"
+msgstr "ÐаÑиÑа Simple WP Membership"
+
+#: classes/class.simple-wp-membership.php:222
+msgid "Simple Membership Protection options"
+msgstr "ÐаÑÑÑойки заÑиÑÑ Simple Membership"
+
+#: classes/class.simple-wp-membership.php:238
+msgid "Do you want to protect this content?"
+msgstr "ÐÑ Ñ
оÑиÑе заÑиÑиÑÑ ÑÑÐ¾Ñ Ð¼Ð°ÑеÑиал?"
+
+#: classes/class.simple-wp-membership.php:243
+msgid "Select the membership level that can access this content:"
+msgstr ""
+"ÐÑбеÑиÑе ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа, коÑоÑÐ¾Ð¼Ñ Ð±ÑÐ´ÐµÑ ÑазÑеÑен доÑÑÑп к ÑÑÐ¾Ð¼Ñ Ð¼Ð°ÑеÑиалÑ:"
+
+#: classes/class.simple-wp-membership.php:375
+msgid "Display SWPM Login."
+msgstr "ÐоказÑваÑÑ Ð²Ñ
од в SWPM."
+
+#: classes/class.simple-wp-membership.php:377
+msgid "SWPM Login"
+msgstr "ÐÑ
од в SWPM"
+
+#: classes/class.simple-wp-membership.php:464
+msgid "WP Membership"
+msgstr "WP Membership"
+
+#: classes/class.simple-wp-membership.php:471
+msgid "Settings"
+msgstr "ÐаÑÑÑойки"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "ÐаÑолÑ"
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "ÐовÑоÑиÑе паÑолÑ"
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "Ðол"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "ТелеÑон"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "УлиÑа"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "ÐоÑод"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "Регион/ШÑаÑ"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "ÐндекÑ"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "СÑÑана"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "ÐомпаниÑ"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "ÐаÑегиÑÑÑиÑоваÑÑÑÑ"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "ÐобавиÑÑ ÑÑаÑÑника"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "СоздаÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑÑаÑÑника и добавиÑÑ ÐµÐ³Ð¾ на ÑайÑ."
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(обÑзаÑелÑно)"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "E-mail"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "ÐобавиÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑÑаÑÑника"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "СоздаÑÑ Ð½Ð¾Ð²Ñй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа."
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Ðазвание ÑÑÐ¾Ð²Ð½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "Ð Ð¾Ð»Ñ WordPress по ÑмолÑаниÑ"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "СÑок подпиÑки"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "ÐеÑÑÑоÑно"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "ÐобавиÑÑ Ð½Ð¾Ð²Ñй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "ÐзмениÑÑ ÑÑаÑÑника"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "РедакÑиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе ÑÑÑеÑÑвÑÑÑего ÑÑаÑÑника."
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "ÐÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ"
+
+#: views/admin_edit.php:18
+msgid "Edit User "
+msgstr "ÐзмениÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "ÐзмениÑÑ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "ÐзмениÑÑ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа."
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "ÐзмениÑÑ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Simple WP Membership::УÑаÑÑники"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "ÐобавиÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "поиÑк"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Simple WP Membership::УÑовни доÑÑÑпа"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "УÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "УпÑавление доÑÑÑпом к маÑеÑиалам"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "ÐÑÐ¸Ð¼ÐµÑ Ð½Ð°ÑÑÑоек ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпом к маÑеÑиалам"
+
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(дваждÑ, обÑзаÑелÑно)"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "ÐндикаÑÐ¾Ñ ÑложноÑÑи"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"ÐодÑказка: паÑÐ¾Ð»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð½Ðµ коÑоÑе 7 Ñимволов. ЧÑÐ¾Ð±Ñ ÑÑилиÑÑ Ð¿Ð°ÑолÑ, "
+"иÑполÑзÑйÑе заглавнÑе и ÑÑÑоÑнÑе бÑквÑ, ÑиÑÑÑ Ð¸ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ! \" ? $ % ^ & )."
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "СÑаÑÑÑ ÑÑеÑной запиÑи"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "УÑаÑÑник Ñ"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Simple WP Membership::ÐаÑÑÑойки"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "ÐаÑÑÑойки инÑегÑаÑии Ñ PayPal"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "ÐенеÑиÑоваÑÑ ÐºÐ¾Ð´ \"Advanced Variables\" Ð´Ð»Ñ Ð²Ð°Ñей кнопки PayPal"
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "ÐведиÑе ID ÑÑÐ¾Ð²Ð½Ñ Ð´Ð¾ÑÑÑпа"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "ÐенеÑиÑоваÑÑ ÐºÐ¾Ð´"
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "ÐенеÑиÑоваÑÑ ÑÑÑÐ»ÐºÑ Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑегиÑÑÑаÑии"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"ÐÑ Ð¼Ð¾Ð¶ÐµÑе вÑÑÑнÑÑ ÑгенеÑиÑоваÑÑ ÑÑÑÐ»ÐºÑ Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑегиÑÑÑаÑии и пеÑедаÑÑ "
+"ÐµÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ, еÑли он пÑопÑÑÑил пиÑÑмо, оÑпÑавленное авÑомаÑиÑеÑки поÑле "
+"ÑовеÑÑÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ñежа."
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "ÐенеÑиÑоваÑÑ ÑÑÑÐ»ÐºÑ Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑегиÑÑÑаÑии"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "ÐÐÐ"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "ÐÐ»Ñ Ð²ÑеÑ
не подÑвеÑжденнÑÑ
ÑегиÑÑÑаÑий"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "СÑÑлки Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑегиÑÑÑаÑии поÑвÑÑÑÑ Ð½Ð¸Ð¶Ðµ:"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "ÐÑпÑавиÑÑ Ñакже пиÑÑмо Ñ Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸ÐµÐ¼ о ÑегиÑÑÑаÑии"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "ÐÑпÑавиÑÑ"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "ÐбновиÑÑ"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "ÐдÑÐµÑ e-mail"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "СбÑоÑиÑÑ Ð¿Ð°ÑолÑ"
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "ÐÑ
од как"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "УÑаÑÑие"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:12
+msgid "Account Expiry"
+msgstr "УÑеÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸ÑÑекаеÑ"
+
+#: views/loggedin.php:19 views/login_widget_logged.php:16
+msgid "Logout"
+msgstr "ÐÑйÑи"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "ÐапомниÑÑ Ð¼ÐµÐ½Ñ"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "ÐабÑли паÑолÑ"
diff --git a/languages/swpm-sv_SE.mo b/languages/swpm-sv_SE.mo
new file mode 100644
index 0000000..45eaa1f
Binary files /dev/null and b/languages/swpm-sv_SE.mo differ
diff --git a/languages/swpm-sv_SE.po b/languages/swpm-sv_SE.po
new file mode 100644
index 0000000..d4f0816
--- /dev/null
+++ b/languages/swpm-sv_SE.po
@@ -0,0 +1,708 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: simple membership\n"
+"POT-Creation-Date: 2014-08-28 19:28+1000\n"
+"PO-Revision-Date: 2014-10-17 09:59+0100\n"
+"Last-Translator: Geson Perry \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.10\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: sv\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAccessControl.php:23 classes/class.bAccessControl.php:40
+msgid "You are not allowed to view this content"
+msgstr "Du är inte tillåten att se detta innehåll"
+
+#: classes/class.bAccessControl.php:26 classes/class.bAccessControl.php:43
+msgid "You need to login to view this content. "
+msgstr "Du behöver logga in för att se innehållet"
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:64
+msgid "Registration Successful."
+msgstr "Registreringen är fullförd"
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:73
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "Vänligen korrigera följande:"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "Ãr redan tagen"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "Tillgänglig"
+
+#: classes/class.bAuth.php:48 classes/class.bFrontRegistration.php:179
+msgid "User Not Found."
+msgstr "Användaren finns inte."
+
+#: classes/class.bAuth.php:55
+msgid "Password Empty or Invalid."
+msgstr "Lösenordet är tomt eller felaktigt."
+
+#: classes/class.bAuth.php:79
+msgid "Account is inactive."
+msgstr "Kontot är inaktivt."
+
+#: classes/class.bAuth.php:89
+msgid "You are logged in as:"
+msgstr "Du är inloggad som:"
+
+#: classes/class.bAuth.php:128
+msgid "Logged Out Successfully."
+msgstr "Du är nu utloggad."
+
+#: classes/class.bAuth.php:170
+msgid "Session Expired."
+msgstr "Sessionen har utgått."
+
+#: classes/class.bAuth.php:179
+msgid "Invalid User Name"
+msgstr "Ogiltigt Användarnamn"
+
+#: classes/class.bAuth.php:187
+msgid "Bad Cookie Hash"
+msgstr "Felaktig Cookie Hash"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"Wordpress-kontot finns med tanke på användarnamnet. Men e-posten matchar "
+"inte."
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"Wordpress-kontot finns med given e-post. Men matchar inte med tanke på "
+"användarnamnet."
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "Användarnamn krävs"
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "Användarnamnet finns redan."
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "Lösenord krävs"
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "Lösenordet matchar inte"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "E-post krävs"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "E-post är ogiltlig"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "E-post adressen används redan."
+
+#: classes/class.bForm.php:178
+msgid "Member since field is invalid"
+msgstr "Medlem sedan fältet är ogiltigt"
+
+#: classes/class.bForm.php:189
+msgid "Subscription starts field is invalid"
+msgstr "Prenumeration startar fältet är ogiltigt"
+
+#: classes/class.bForm.php:199
+msgid "Gender field is invalid"
+msgstr "Kön Fältet är ogiltigt"
+
+#: classes/class.bForm.php:210
+msgid "Account state field is invalid"
+msgstr "Kontots tillstånds fält är ogiltigt"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+msgid "Please"
+msgstr "Vänligen"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+#: views/login.php:21
+msgid "Login"
+msgstr "Logga in"
+
+#: classes/class.bFrontRegistration.php:79
+#: classes/class.bFrontRegistration.php:158
+msgid "Please correct the following"
+msgstr "Vänligen korrigera följande"
+
+#: classes/class.bFrontRegistration.php:92
+msgid "Membership Level Couldn't be found."
+msgstr "Medlemskapsnivå kunde inte hittas."
+
+#: classes/class.bFrontRegistration.php:168
+msgid "Email Address Not Valid."
+msgstr "E-postadress ogiltig."
+
+#: classes/class.bFrontRegistration.php:199
+msgid "New password has been sent to your email address."
+msgstr "Nytt lösenord har skickats till din e-postadress."
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "Prenumerationens längd måste vara > 0."
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Medlem"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:467
+msgid "Members"
+msgstr "Medlemmar"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "Användarnamn"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "Förnamn"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "Efternamn"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "E-post"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "Medlemsnivå"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "Prenumerationen startar"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Tillstånd på kontot"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Ta bort"
+
+#: classes/class.bMembers.php:100
+msgid "No Member found."
+msgstr "Ingen medlem funnen."
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "Skapande av Medlemsnivå lyckades."
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "Uppdatering klar."
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:469
+msgid "Membership Levels"
+msgstr "Medlemsnivåer"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Roll"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "Prenumerationen gäller"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "Plugin dokumentation"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "Generella inställningar"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "Aktivera gratis medlemskap"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "Aktivera / inaktivera registrering för gratis medlemsnivå"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "Gratis medlemsnivå ID"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "Tilldela gratis medlemskap nivå ID"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "Göm Adminbar"
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"Wordpress visar admin verktygsfältet för inloggade användare på webbplatsen. "
+"Markera den här rutan om du vill dölja admin verktygsfältet på din webbplats."
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "Sidinställningar"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "Login sidans URL"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "Registreringssidans URL"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "GÃ¥ med oss sidans URL"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "Ãndra profilsidans URL"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "Ã
terställ lösenordssidans URL"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "Test & Debug inställningar"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "Aktivera Sandbox test"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Aktivera det här alternativet om du vill testa Sandbox betalning."
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "Diverse E-post inställningar"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "Från E-post adress"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "E-postinställningar (Uppmana att slutföra registreringen)"
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "E-post ämne"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "E-post meddelande"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "E-post inställningar (Registrering avklarad)"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "Skicka ett meddelande till Admin"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "Skicka e-post till medlem när de är tillagda via Admin dashboard"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "E-postinställningar (Kontouppgraderings meddelande)"
+
+#: classes/class.bSettings.php:326
+msgid "Not a Member?"
+msgstr "Inte medlem?"
+
+#: classes/class.bSettings.php:326 views/login.php:30
+msgid "Join Us"
+msgstr "GÃ¥ med oss"
+
+#: classes/class.bUtils.php:32 views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "Aktiv"
+
+#: classes/class.bUtils.php:33 views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "Inaktiv"
+
+#: classes/class.bUtils.php:34 views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "Väntar"
+
+#: classes/class.bUtils.php:35 views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "Förfallen"
+
+#: classes/class.bUtils.php:225
+msgid "Never"
+msgstr "Aldrig"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Registrering"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Login för medlemmar"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Profil"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "Ã
terställ lösenord"
+
+#: classes/class.simple-wp-membership.php:178
+msgid "You are not logged in."
+msgstr "Du är inte inloggad."
+
+#: classes/class.simple-wp-membership.php:209
+msgid "Simple WP Membership Protection"
+msgstr "Simple WP Membership skydd"
+
+#: classes/class.simple-wp-membership.php:222
+msgid "Simple Membership Protection options"
+msgstr "Simple Membership Protection alternativ"
+
+#: classes/class.simple-wp-membership.php:238
+msgid "Do you want to protect this content?"
+msgstr "Vill du skydda innehållet?"
+
+#: classes/class.simple-wp-membership.php:243
+msgid "Select the membership level that can access this content:"
+msgstr "Välj den medlemsnivå som kan komma åt det här innehållet:"
+
+#: classes/class.simple-wp-membership.php:375
+msgid "Display SWPM Login."
+msgstr "Visa SWPM Login."
+
+#: classes/class.simple-wp-membership.php:377
+msgid "SWPM Login"
+msgstr "SWPM Login"
+
+#: classes/class.simple-wp-membership.php:464
+msgid "WP Membership"
+msgstr "WP medlemskap"
+
+#: classes/class.simple-wp-membership.php:471
+msgid "Settings"
+msgstr "Inställningar"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "Lösenord"
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "Upprepa lösenord"
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "Kön"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "Telefon"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "Gata"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "Stad"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "Stat"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "Poastnummer"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "Land"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "Företag"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "Registrera"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "Lägg till medlem"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "Skapa en helt ny användare och lägga till den här webbplatsen."
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "Användarnamn"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(krävs)"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "E.post"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "Lägg till ny medlem"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Skapa ny medlemsnivå."
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Namn på medlemsnivå"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "Standard Wordpress roll"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "Längd på prenumeration"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "Ingen utgång"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "Lägg till ny medlemsnivå"
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Ãndra medlem"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Ãndra existerande medlemsdetaljer"
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "Användarnamn"
+
+#: views/admin_edit.php:18
+msgid "Edit User "
+msgstr "Ãndra användare"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Ãndra medlemsnivÃ¥"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Ãndra medlemsnivÃ¥."
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "Ãndra medlemsnivÃ¥"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Simple WP Membership::Medlemmar"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "Lägg till ny"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "sök"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Simple WP Membership::Medlemsnivåer"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "Medlemsnivå"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "Hantera innehållsproduktion"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "Exempel på skyddsinställningar av innehåll"
+
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(två gånger, krävs)"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "Indikator för styrka"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"Tips: Lösenordet ska vara minst sju tecken långt. För att göra det starkare, "
+"använd stora och små bokstäver, siffror och symboler som! ? \"$% ^ & Amp;)."
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "Tillstånd på kontot"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "Medlem sedan"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Simple WP Membership::Inställningar"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "PayPal integrationsinställningar"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "Generera \"Avancerade variabler \" Kod för din PayPal-knapp"
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Ange medlemsnivå ID"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "Skapa kod"
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Skapa en Registrering klar länk"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"Du kan manuellt skapa en registrerings slutförande länk här och ge den till "
+"din kund om de har missat den e-post som automatiskt skickades ut till dem "
+"efter betalningen."
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "Skapa en Registrering klar länk"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "ELLER"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "För alla väntande registreringar"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Registrering klar länk visas nedan:"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "Skicka registrerings påminnelse via E-post till"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "Skicka"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "Uppdatera"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "E-post adress"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "Ã
terställ lösenord"
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "Inloggad som"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "Medlemskap"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:12
+msgid "Account Expiry"
+msgstr "Utgång för konto"
+
+#: views/loggedin.php:19 views/login_widget_logged.php:16
+msgid "Logout"
+msgstr "Logga ut"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "Kom ihåg mig"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "Glömt lösenordet"
diff --git a/languages/swpm-tr_TR.mo b/languages/swpm-tr_TR.mo
new file mode 100644
index 0000000..b627f90
Binary files /dev/null and b/languages/swpm-tr_TR.mo differ
diff --git a/languages/swpm-tr_TR.po b/languages/swpm-tr_TR.po
new file mode 100644
index 0000000..79326ef
--- /dev/null
+++ b/languages/swpm-tr_TR.po
@@ -0,0 +1,709 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: simple membership\n"
+"POT-Creation-Date: 2014-08-28 19:28+1000\n"
+"PO-Revision-Date: 2014-12-18 21:42+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.7.1\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: tr_TR\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAccessControl.php:23 classes/class.bAccessControl.php:40
+msgid "You are not allowed to view this content"
+msgstr "Bu içeriÄi görmenize izin verilmemektedir."
+
+#: classes/class.bAccessControl.php:26 classes/class.bAccessControl.php:43
+msgid "You need to login to view this content. "
+msgstr "Bu içeriÄi görmek için giriÅ yapmanız gerekmektedir."
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:64
+msgid "Registration Successful."
+msgstr "Kayıt baÅarıyla son bulmuÅtur"
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:73
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "Lütfen düzeltin:"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "Halihazırda alınmıÅtır"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "Müsaittir"
+
+#: classes/class.bAuth.php:48 classes/class.bFrontRegistration.php:179
+msgid "User Not Found."
+msgstr "Kullanıcı bulunamadı"
+
+#: classes/class.bAuth.php:55
+msgid "Password Empty or Invalid."
+msgstr "Åifre boÅ veya geçersiz."
+
+#: classes/class.bAuth.php:79
+msgid "Account is inactive."
+msgstr "Hesap aktif deÄil."
+
+#: classes/class.bAuth.php:89
+msgid "You are logged in as:"
+msgstr "Kullanıcı hesabınız:"
+
+#: classes/class.bAuth.php:128
+msgid "Logged Out Successfully."
+msgstr "Oturum baÅarı ile sonlandırılmıÅtır."
+
+#: classes/class.bAuth.php:170
+msgid "Session Expired."
+msgstr "Oturum zamanı doldu."
+
+#: classes/class.bAuth.php:179
+msgid "Invalid User Name"
+msgstr "Geçersiz Kullanıcı Adı"
+
+#: classes/class.bAuth.php:187
+msgid "Bad Cookie Hash"
+msgstr "Kötü çerez kaydı"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+"Belirtilen kullanıcı hesabı mevcut. Ama verilen e-posta adresi "
+"uyuÅmuyor."
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+"Belirtilen kullanıcı hesabı mevcut. Ama verilen kullanıcı adı adresi "
+"uyuÅmuyor."
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "Kullanıcı adı gerekiyor"
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "Bu kullanıcı adı mevcut."
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "Åifre gerekiyor"
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "Åifre yanlıÅ"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "E-Posta gereklidir"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "E-Posta geçersizdir."
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "E-Posta halen sistemimizde kulanılıyor."
+
+#: classes/class.bForm.php:178
+msgid "Member since field is invalid"
+msgstr "Ãye ...den beri alanı geçersiz."
+
+#: classes/class.bForm.php:189
+msgid "Subscription starts field is invalid"
+msgstr "Kayıt BaÅlama alanı geçersiz"
+
+#: classes/class.bForm.php:199
+msgid "Gender field is invalid"
+msgstr "Cinsiyet alanı geçersiz"
+
+#: classes/class.bForm.php:210
+msgid "Account state field is invalid"
+msgstr "Hesap durumu alanı geçersiz"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+msgid "Please"
+msgstr "Lütfen"
+
+#: classes/class.bFrontRegistration.php:64 classes/class.bSettings.php:326
+#: views/login.php:21
+msgid "Login"
+msgstr "GiriÅ"
+
+#: classes/class.bFrontRegistration.php:79
+#: classes/class.bFrontRegistration.php:158
+msgid "Please correct the following"
+msgstr "Lütfen Düzeltin :"
+
+#: classes/class.bFrontRegistration.php:92
+msgid "Membership Level Couldn't be found."
+msgstr "Ãyelik Seviyesi bulunamıyor"
+
+#: classes/class.bFrontRegistration.php:168
+msgid "Email Address Not Valid."
+msgstr "E-Posta Geçersiz."
+
+#: classes/class.bFrontRegistration.php:199
+msgid "New password has been sent to your email address."
+msgstr "Yeni Åifre e-posta adresinize gönderildi."
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "Ãyelik Süresi Sıfırdan Büyük Olmalıdır."
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "Ãye"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:467
+msgid "Members"
+msgstr "Ãyeler"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "Kimlik No"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "Kullanıcı Adı"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "İlk Adınız"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "Soyadınız"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "E-Posta"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "Ãyelik Düzeyi"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "Ãyelik BaÅlama Tarihi"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "Hesap Durumu"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "Sil"
+
+#: classes/class.bMembers.php:100
+msgid "No Member found."
+msgstr "Ãye Bulunamadı"
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "Ãyelik Derecesi OluÅturulması BaÅarılı."
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "BaÅarıyla Güncellendi."
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:469
+msgid "Membership Levels"
+msgstr "Ãyelik Düzeyleri"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "Görev"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "Ãyelik Geçerli :"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "Eklenti Dökümantasyonu"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "Genel Ayarlar"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "Ãcretsiz Ãyelik Mümkünmü?"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "Ãcretsiz üyelik için kaydolmayı aç veya kapa"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "Ãcretsiz Ãyelik Seviyesi Numarası"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "Ãcretsiz Ãyelik Numarası Atanması"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "Yönetici çubuÄunu sakla"
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"Blog sitenin çevrimiçi kullanıcılarına yönetici çubuÄunu gösterir. EÄer "
+"yönetim çubuÄunu saklamak istiyorsanız bu kutucuÄu iÅaretleyin."
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "Sayfa Ayarları"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "GiriŠSayfası URLsi"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "Kayıt Sayfası URLsi"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "Bize Katılın Sayfası URLsi"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "Profil Düzenleme Sayfası URLsi"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "Åifre Reset Sayfası URLsi"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "Test ve Debug Ayarları"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "Sandbox Testi Aktif Et"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "Bu opsiyonu , eÄer SANDBOX ödeme testi istiyorsanız aktif edin."
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "E-Posta ÃeÅitli Ayarları"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "Gönderen E-Posta Adresi"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "E-Posta Ayarları ( Anında Kayıt Tamamlama) "
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "E-Posta Konusu"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "E-Posta Gövdesi"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "E-Posta Ayarları (Kayut Tamamlandı)"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "Yöneticiye Uyarı Gönder"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "Yönetim Panelinden Kayıt YapıldıÄı Zaman Ãyeye E-Posta Gönder"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "E-Posta Ayarları ( Hesap Yükseltme Bildirimi)"
+
+#: classes/class.bSettings.php:326
+msgid "Not a Member?"
+msgstr "Ãye DeÄilmisiniz?"
+
+#: classes/class.bSettings.php:326 views/login.php:30
+msgid "Join Us"
+msgstr "Bize Katılın"
+
+#: classes/class.bUtils.php:32 views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "Aktif"
+
+#: classes/class.bUtils.php:33 views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "Aktif DeÄil"
+
+#: classes/class.bUtils.php:34 views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "Beklemede"
+
+#: classes/class.bUtils.php:35 views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "Süresi DolmuÅ"
+
+#: classes/class.bUtils.php:225
+msgid "Never"
+msgstr "Asla"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "Kayıt"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "Ãye GiriÅi"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "Profil"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "Åifre Reset"
+
+#: classes/class.simple-wp-membership.php:178
+msgid "You are not logged in."
+msgstr "GiriŠYapmadınız."
+
+#: classes/class.simple-wp-membership.php:209
+msgid "Simple WP Membership Protection"
+msgstr "Basit Blog Ãyelik Koruması"
+
+#: classes/class.simple-wp-membership.php:222
+msgid "Simple Membership Protection options"
+msgstr "Basit Ãyelik Koruması Opsiyonları"
+
+#: classes/class.simple-wp-membership.php:238
+msgid "Do you want to protect this content?"
+msgstr "Bu içeriÄi korumak istiyormusunuz?"
+
+#: classes/class.simple-wp-membership.php:243
+msgid "Select the membership level that can access this content:"
+msgstr "Bu içeriÄe eriÅecek üyelik seviyesini seçiniz:"
+
+#: classes/class.simple-wp-membership.php:375
+msgid "Display SWPM Login."
+msgstr "SWPM GiriÅini Göster."
+
+#: classes/class.simple-wp-membership.php:377
+msgid "SWPM Login"
+msgstr "SWPM GiriÅi"
+
+#: classes/class.simple-wp-membership.php:464
+msgid "WP Membership"
+msgstr "Blog ÃyeliÄi"
+
+#: classes/class.simple-wp-membership.php:471
+msgid "Settings"
+msgstr "Ayarlar"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "Åifre"
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "Åifre Tekrarı"
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "Cinsiyet"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "Telefon"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "Cadde"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "Åehir"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "İl"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "Posta Kodu"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "Ãlke"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "Åirket"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "Kayıt"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "Ãye Ekleme"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "Yeni bir kullanıcı oluÅturun ve bu siteye ekleyin."
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "Kullanıcı Adı"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "(gerekli)"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "E-Posta"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "Yeni Ãye Kaydı"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "Yeni Ãyelik Seviyesi OluÅturulması"
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "Ãyelik Seviyesi İsmi"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "Varsayılan Blog Görevi"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "Ãyelik Süresi"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "Süresiz"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "Yeni Ãyelik Seviyesi Ekleyin"
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "Ãyelik Bilgileri Düzenleyin"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "Mevcut üye detaylarını düzenleyin."
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "Kullanıcı Adı"
+
+#: views/admin_edit.php:18
+msgid "Edit User "
+msgstr "Kullanıcı Bilgilerini Düzenleyin"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "Ãyelik seviyesi düzenleyin"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "Ãyelik seviyesi düzenleyin."
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "Ãyelik Seviyesi Düzenleyin"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "Blog Ãyelik::Ãyeler"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "Yeni Ekleyin"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "ara"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "Blog ÃyeliÄi:: Ãyelik Seviyeleri"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "Ãyelik Seviyeleri"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "İçerik Korumasını Yönet"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "İçerik Yönetimi Ãrnek Ayarları"
+
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "(ikinci defa, bu gereklidir)"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "Güvenlik Seviyesi"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"İpucu: Åifre en az 7 karakterden oluÅmalıdır. Güçlü bir Åifre için küçük ve "
+"Büyük harfler, rakamlar ve ! \" ? $ % ^ & ) gibi çeÅitli semboller "
+"Åifrede kullanılmalıdır. "
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "Hesap Durumu"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "Ãyelik BaÅlama Tarihi"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "Blog ÃyeliÄi:: Ayarlar"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "Paypal Entegrasyon Ayarları"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "PayPal DüÄmeniz için \"GeliÅmiÅ Seçenekler \" OluÅturulması"
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "Ãyelik Numarasını Girin"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "Kod OluÅtur"
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "Kayıt Tamamlama Linki OluÅtur"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"EÄer müÅteriniz kayıttan sonra otomatik olarak gönderilen epostayı "
+"almadıysa, BURADA kayıt tamamlama linkini manuel olarak oluÅturabilir ve "
+"müÅterinize gönderebilirsiniz."
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "Kayıt Tamamlama Linki OluÅtur"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "VEYA"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "Bekleyen Bütün Kayıtlar İçin"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "Kayıt Tamamama Linkleri AÅaÄıda Görülecektir."
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "Kayıt Hatırlatma E-Postası da Gönder"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "GiriŠYapın"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "Güncelle"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "E-Posta Adresi"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "Åifre Resetle"
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "GiriŠyapılan hesap:"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "Ãyelik"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:12
+msgid "Account Expiry"
+msgstr "Hesap süresi doldu"
+
+#: views/loggedin.php:19 views/login_widget_logged.php:16
+msgid "Logout"
+msgstr "ÃIKIÅ"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "Beni Hatırla"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "Åifreyi Unut"
diff --git a/languages/swpm-zh_CN.mo b/languages/swpm-zh_CN.mo
new file mode 100644
index 0000000..562a19b
Binary files /dev/null and b/languages/swpm-zh_CN.mo differ
diff --git a/languages/swpm-zh_CN.po b/languages/swpm-zh_CN.po
new file mode 100644
index 0000000..4d187ba
--- /dev/null
+++ b/languages/swpm-zh_CN.po
@@ -0,0 +1,689 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Simple WordPress Membership\n"
+"POT-Creation-Date: 2014-07-30 17:30+0800\n"
+"PO-Revision-Date: 2014-07-30 23:09+0800\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_Hans\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.7\n"
+"X-Poedit-Basepath: .\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:61
+msgid "Registration Successful."
+msgstr "注åæå"
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:72
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "è¯·æ´æ¹ä»¥ä¸ä¿¡æ¯"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "已被å ç¨"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "å¯ä»¥ä½¿ç¨"
+
+#: classes/class.bAuth.php:47 classes/class.bFrontRegistration.php:176
+msgid "User Not Found."
+msgstr "æ¾ä¸å°ç¨æ·"
+
+#: classes/class.bAuth.php:54
+msgid "Password Empty or Invalid."
+msgstr "å¯ç 空æè
æ æ"
+
+#: classes/class.bAuth.php:78
+msgid "Account is inactive."
+msgstr "è´¦æ·æªæ¿æ´»"
+
+#: classes/class.bAuth.php:88
+msgid "You are logged in as:"
+msgstr "æ¨å·²ä½¿ç¨ä»¥ä¸èº«ä»½ç»é"
+
+#: classes/class.bAuth.php:127
+msgid "Logged Out Successfully."
+msgstr "æåéåºç»é"
+
+#: classes/class.bAuth.php:169
+msgid "Session Expired."
+msgstr "ç»éè¶
æ¶"
+
+#: classes/class.bAuth.php:178
+msgid "Invalid User Name"
+msgstr "æ æçç¨æ·å"
+
+#: classes/class.bAuth.php:186
+msgid "Bad Cookie Hash"
+msgstr "åçCookie"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr "ç¨æ·åæ£ç¡®ï¼ä½é®ç®±é误"
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr "é®ç®±æ£ç¡®ï¼ä½ç¨æ·åé误"
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "请è¾å
¥ç¨æ·å"
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "ç¨æ·åå·²ç»åå¨"
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "请è¾å
¥å¯ç "
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "å¯ç ä¸ç¬¦"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "请è¾å
¥é®ç®±å°å"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "é®ç®±æ æ"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "é®ç®±å·²ç»åå¨"
+
+#: classes/class.bForm.php:128
+msgid "Phone number is invalid"
+msgstr "çµè¯å·ç æ æ"
+
+#: classes/class.bForm.php:174
+msgid "Member since field is invalid"
+msgstr "å·ç æ®µæ æ"
+
+#: classes/class.bForm.php:185
+msgid "Subscription starts field is invalid"
+msgstr "å¼å§æ¶é´åæ®µæ æ"
+
+#: classes/class.bForm.php:195
+msgid "Gender field is invalid"
+msgstr "æ§å«å¡«åæ æ"
+
+#: classes/class.bForm.php:206
+msgid "Account state field is invalid"
+msgstr "è´¦æ·æè¿°æ æ"
+
+#: classes/class.bFrontRegistration.php:61
+msgid "Please"
+msgstr "请"
+
+#: classes/class.bFrontRegistration.php:61 views/login.php:21
+msgid "Login"
+msgstr "ç»é"
+
+#: classes/class.bFrontRegistration.php:76
+#: classes/class.bFrontRegistration.php:155
+msgid "Please correct the following"
+msgstr "请修æ¹ä»¥ä¸ä¿¡æ¯"
+
+#: classes/class.bFrontRegistration.php:89
+msgid "Membership Level Couldn't be found."
+msgstr "ä¼åç级ä¸åå¨"
+
+#: classes/class.bFrontRegistration.php:165
+msgid "Email Address Not Valid."
+msgstr "Emailå°åæ æ"
+
+#: classes/class.bFrontRegistration.php:196
+msgid "New password has been sent to your email address."
+msgstr "æ°çå¯ç å·²ç»åéå°æ¨çé®ç®±"
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "è¿ç¨å¿
须大äº0"
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "ä¼å"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:439
+msgid "Members"
+msgstr "ä¼å"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "ç¨æ·å"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "å"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "å§"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "Email"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "ä¼åç级"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "订é
å¼å§äº"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "è´¦æ·æè¿°"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "å é¤"
+
+#: classes/class.bMembers.php:98
+msgid "No Member found."
+msgstr "ä¼åä¸åå¨"
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "ä¼åç级å建æå"
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "æ´æ°æå"
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:441
+msgid "Membership Levels"
+msgstr "ä¼åç级"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "è§è²"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "订é
ææäº"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "æä»¶æä»¶"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "æ»ä½è®¾ç½®"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "å¯ç¨å
è´¹ä¼å"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "å¯ç¨/ä¸å¯ç¨å
è´¹ä¼å注å"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "å
è´¹ä¼åç级ID"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "æå®å
è´¹ä¼å级å«ID"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "éèç®¡çæ "
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"WordPress对已ç»ç»éçç¨æ·æ¾ç¤ºç®¡çå·¥å
·æ ï¼å¦æä½ æ³å¨ç½ç«å端éèç®¡çæ è¯·å¾éè¿"
+"é"
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "页é¢è®¾ç½®"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "ç»é页é¢URL"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "注å页é¢URL"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "å å
¥é¡µé¢URL"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "ä¿®æ¹ä¼åä¿¡æ¯é¡µé¢URL"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "æ´æ¹å¯ç 页é¢URL"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "æµè¯ä¸è°è¯è®¾ç½®"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "å¯ç¨æ²çæµè¯"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "å¦æä½ è¦æµè¯ä»æ¬¾æ¹å¼ï¼è¯·å¯ç¨æ²ç"
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "çµåé®ä»¶æé¡¹è®¾ç½®"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "çµåé®ä»¶æ¥è·¯"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "çµåé®ä»¶è®¾ç½®ï¼å¿«éå®ææ³¨åï¼"
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "Emailæ é¢"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "Emailå
容"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "Email设置ï¼å®ææ³¨åï¼"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "ç»ç®¡çååééç¥"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "管çåæ·»å ç¨æ·åç»ç¨æ·åéé®ä»¶"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "Email设置ï¼è´¦æ·æ´æ°ä¿¡æ¯éç¥ï¼"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "注å"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "ä¼åç»é"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "ä¸ªäººèµæ"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "æ´æ¹å¯ç "
+
+#: classes/class.simple-wp-membership.php:181
+msgid "Simple WP Membership Protection"
+msgstr "ä¼åä¿æ¤"
+
+#: classes/class.simple-wp-membership.php:194
+msgid "Simple Membership Protection options"
+msgstr "ä¼åä¿æ¤é项"
+
+#: classes/class.simple-wp-membership.php:210
+msgid "Do you want to protect this content?"
+msgstr "ä½ æ¯å¦éè¦ä¿æ¤è¿ä¸ªå
容"
+
+#: classes/class.simple-wp-membership.php:215
+msgid "Select the membership level that can access this content:"
+msgstr "éæ©å¯ä»¥æ¥ç该å
容çä¼åç级"
+
+#: classes/class.simple-wp-membership.php:347
+msgid "Display SWPM Login."
+msgstr "æ¾ç¤ºSWPMç»é"
+
+#: classes/class.simple-wp-membership.php:349
+msgid "SWPM Login"
+msgstr "SWPMç»é"
+
+#: classes/class.simple-wp-membership.php:436
+msgid "WP Membership"
+msgstr "WPä¼å"
+
+#: classes/class.simple-wp-membership.php:443
+msgid "Settings"
+msgstr "设置"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "å¯ç "
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "éå¤å¯ç "
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "æ§å«"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "çµè¯"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "è¡é"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "åå¸"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "ç份"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "é®ç¼"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "å½å®¶"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "å
¬å¸"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "注å"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "æ·»å ä¼å"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "ç»ç½ç«å建ä¸ä¸ªæ°ç¨æ·"
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "ç¨æ·å"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "å¿
å¡«"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "E-mail"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "æ·»å æ°ä¼å"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "å建æ°ä¼åç级"
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "ä¼åç级å"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "é»è®¤çWPè§è²"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "æææ"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "ä¸å¤±æ"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "æ·»å æ°çä¼åç级"
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "ä¿®æ¹ä¼å"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "ä¿®æ¹å·²åå¨ç¨æ·ä¿¡æ¯"
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "ç¨æ·å"
+
+#: views/admin_edit.php:17
+msgid "Edit User "
+msgstr "ä¿®æ¹ç¨æ·"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "ä¿®æ¹ä¼åç级"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "ä¿®æ¹ä¼åç级"
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "ä¿®æ¹ä¼åç级"
+
+#. translators: password input field
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "2次ï¼å¿
å¡«"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "强度æç¤ºå¨"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"å¯ç æå°7个å符ï¼ä¸ºä¿è¯å¯ç 强度ï¼è¯·ä½¿ç¨å¤§å°ååæ¯ï¼æ°ååä¾å¦! \" ? $ % ^ "
+"&ç符å·"
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "è´¦æ·ç¶æ"
+
+#: views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "æ¿æ´»"
+
+#: views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "æªæ¿æ´»"
+
+#: views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "å¾
å®"
+
+#: views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "失æ"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "ä¼åèª"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "ä¼åç级ï¼ä¼å"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "æ·»å æ°ç"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "æç´¢"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "ä¼åç级"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "管çå
容å¶ä½"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "ä¼åï¼ä¼åç级"
+
+#: views/admin_membership_levels.php:4
+msgctxt "Level"
+msgid "Add New"
+msgstr "æ·»å æ°ç级"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "å
å®¹ä¿æ¤è®¾ç½®ä¾å"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "ä¼åï¼è®¾ç½®"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "Paypaléæè®¾ç½®"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "æ¨çPayPalæé®äº§çé«çº§åé代ç "
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "è¾å
¥ä¼åç级ID"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "çæä»£ç "
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "çææ³¨å宿龿¥"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"å¦æä½ çç¨æ·å¨å®æä»æ¬¾å没æ¶å°èªå¨çæçé®ä»¶ï¼é£ä¹ä½ å¯ä»¥å¨è¿éæå¨çææ³¨åå®"
+"æé¾æ¥ï¼å¹¶åéç»ä½ çç¨æ·"
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "çææ³¨å宿龿¥"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "æè
"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "å¯¹äºææå¾
å®ç注å"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "注å宿龿¥ä¼åºç°å¨ï¼"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "åæ¶åéæ³¨åæéé®ä»¶"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "æäº¤"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "æ´æ°"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "Emailå°å"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "éç½®å¯ç "
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "以以ä¸èº«ä»½ç»é"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "ä¼å"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:13
+msgid "Logout"
+msgstr "éåºç»é"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "è®°ä½è¿ä¸ªèº«ä»½"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "å¿è®°å¯ç "
+
+#: views/login.php:30
+msgid "Join Us"
+msgstr "å å
¥ä¼å"
diff --git a/languages/swpm-zh_Hans.mo b/languages/swpm-zh_Hans.mo
new file mode 100644
index 0000000..562a19b
Binary files /dev/null and b/languages/swpm-zh_Hans.mo differ
diff --git a/languages/swpm-zh_Hans.po b/languages/swpm-zh_Hans.po
new file mode 100644
index 0000000..4d187ba
--- /dev/null
+++ b/languages/swpm-zh_Hans.po
@@ -0,0 +1,689 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Simple WordPress Membership\n"
+"POT-Creation-Date: 2014-07-30 17:30+0800\n"
+"PO-Revision-Date: 2014-07-30 23:09+0800\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_Hans\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.7\n"
+"X-Poedit-Basepath: .\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: classes/class.bAdminRegistration.php:48
+#: classes/class.bFrontRegistration.php:61
+msgid "Registration Successful."
+msgstr "注åæå"
+
+#: classes/class.bAdminRegistration.php:53
+#: classes/class.bAdminRegistration.php:72
+#: classes/class.bMembershipLevel.php:36 classes/class.bMembershipLevel.php:54
+msgid "Please correct the following:"
+msgstr "è¯·æ´æ¹ä»¥ä¸ä¿¡æ¯"
+
+#: classes/class.bAjax.php:16 classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr "已被å ç¨"
+
+#: classes/class.bAjax.php:29
+msgid "Available"
+msgstr "å¯ä»¥ä½¿ç¨"
+
+#: classes/class.bAuth.php:47 classes/class.bFrontRegistration.php:176
+msgid "User Not Found."
+msgstr "æ¾ä¸å°ç¨æ·"
+
+#: classes/class.bAuth.php:54
+msgid "Password Empty or Invalid."
+msgstr "å¯ç 空æè
æ æ"
+
+#: classes/class.bAuth.php:78
+msgid "Account is inactive."
+msgstr "è´¦æ·æªæ¿æ´»"
+
+#: classes/class.bAuth.php:88
+msgid "You are logged in as:"
+msgstr "æ¨å·²ä½¿ç¨ä»¥ä¸èº«ä»½ç»é"
+
+#: classes/class.bAuth.php:127
+msgid "Logged Out Successfully."
+msgstr "æåéåºç»é"
+
+#: classes/class.bAuth.php:169
+msgid "Session Expired."
+msgstr "ç»éè¶
æ¶"
+
+#: classes/class.bAuth.php:178
+msgid "Invalid User Name"
+msgstr "æ æçç¨æ·å"
+
+#: classes/class.bAuth.php:186
+msgid "Bad Cookie Hash"
+msgstr "åçCookie"
+
+#: classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr "ç¨æ·åæ£ç¡®ï¼ä½é®ç®±é误"
+
+#: classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr "é®ç®±æ£ç¡®ï¼ä½ç¨æ·åé误"
+
+#: classes/class.bForm.php:40
+msgid "User name is required"
+msgstr "请è¾å
¥ç¨æ·å"
+
+#: classes/class.bForm.php:49
+msgid "User name already exists."
+msgstr "ç¨æ·åå·²ç»åå¨"
+
+#: classes/class.bForm.php:72
+msgid "Password is required"
+msgstr "请è¾å
¥å¯ç "
+
+#: classes/class.bForm.php:79
+msgid "Password mismatch"
+msgstr "å¯ç ä¸ç¬¦"
+
+#: classes/class.bForm.php:95
+msgid "Email is required"
+msgstr "请è¾å
¥é®ç®±å°å"
+
+#: classes/class.bForm.php:99
+msgid "Email is invalid"
+msgstr "é®ç®±æ æ"
+
+#: classes/class.bForm.php:112
+msgid "Email is already used."
+msgstr "é®ç®±å·²ç»åå¨"
+
+#: classes/class.bForm.php:128
+msgid "Phone number is invalid"
+msgstr "çµè¯å·ç æ æ"
+
+#: classes/class.bForm.php:174
+msgid "Member since field is invalid"
+msgstr "å·ç æ®µæ æ"
+
+#: classes/class.bForm.php:185
+msgid "Subscription starts field is invalid"
+msgstr "å¼å§æ¶é´åæ®µæ æ"
+
+#: classes/class.bForm.php:195
+msgid "Gender field is invalid"
+msgstr "æ§å«å¡«åæ æ"
+
+#: classes/class.bForm.php:206
+msgid "Account state field is invalid"
+msgstr "è´¦æ·æè¿°æ æ"
+
+#: classes/class.bFrontRegistration.php:61
+msgid "Please"
+msgstr "请"
+
+#: classes/class.bFrontRegistration.php:61 views/login.php:21
+msgid "Login"
+msgstr "ç»é"
+
+#: classes/class.bFrontRegistration.php:76
+#: classes/class.bFrontRegistration.php:155
+msgid "Please correct the following"
+msgstr "请修æ¹ä»¥ä¸ä¿¡æ¯"
+
+#: classes/class.bFrontRegistration.php:89
+msgid "Membership Level Couldn't be found."
+msgstr "ä¼åç级ä¸åå¨"
+
+#: classes/class.bFrontRegistration.php:165
+msgid "Email Address Not Valid."
+msgstr "Emailå°åæ æ"
+
+#: classes/class.bFrontRegistration.php:196
+msgid "New password has been sent to your email address."
+msgstr "æ°çå¯ç å·²ç»åéå°æ¨çé®ç®±"
+
+#: classes/class.bLevelForm.php:31
+msgid "Subscriptoin duration must be > 0."
+msgstr "è¿ç¨å¿
须大äº0"
+
+#: classes/class.bMembers.php:7
+msgid "Member"
+msgstr "ä¼å"
+
+#: classes/class.bMembers.php:8 classes/class.simple-wp-membership.php:439
+msgid "Members"
+msgstr "ä¼å"
+
+#: classes/class.bMembers.php:16 classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr "ID"
+
+#: classes/class.bMembers.php:17 views/add.php:5 views/edit.php:4
+#: views/login.php:5
+msgid "User Name"
+msgstr "ç¨æ·å"
+
+#: classes/class.bMembers.php:18 views/add.php:21
+#: views/admin_member_form_common_part.php:2 views/edit.php:20
+msgid "First Name"
+msgstr "å"
+
+#: classes/class.bMembers.php:19 views/add.php:25
+#: views/admin_member_form_common_part.php:6 views/edit.php:24
+msgid "Last Name"
+msgstr "å§"
+
+#: classes/class.bMembers.php:20 views/add.php:9 views/edit.php:8
+msgid "Email"
+msgstr "Email"
+
+#: classes/class.bMembers.php:21 classes/class.bMembershipLevels.php:8
+#: classes/class.bMembershipLevels.php:17 views/add.php:64
+#: views/admin_member_form_common_part.php:55 views/edit.php:52
+msgid "Membership Level"
+msgstr "ä¼åç级"
+
+#: classes/class.bMembers.php:22 views/admin_member_form_common_part.php:78
+msgid "Subscription Starts"
+msgstr "订é
å¼å§äº"
+
+#: classes/class.bMembers.php:23
+msgid "Account State"
+msgstr "è´¦æ·æè¿°"
+
+#: classes/class.bMembers.php:35 classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr "å é¤"
+
+#: classes/class.bMembers.php:98
+msgid "No Member found."
+msgstr "ä¼åä¸åå¨"
+
+#: classes/class.bMembershipLevel.php:31
+msgid "Membership Level Creation Successful."
+msgstr "ä¼åç级å建æå"
+
+#: classes/class.bMembershipLevel.php:50
+msgid "Updated Successfully."
+msgstr "æ´æ°æå"
+
+#: classes/class.bMembershipLevels.php:9
+#: classes/class.simple-wp-membership.php:441
+msgid "Membership Levels"
+msgstr "ä¼åç级"
+
+#: classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr "è§è²"
+
+#: classes/class.bMembershipLevels.php:19
+msgid "Subscription Valid For"
+msgstr "订é
ææäº"
+
+#: classes/class.bSettings.php:28
+msgid "Plugin Documentation"
+msgstr "æä»¶æä»¶"
+
+#: classes/class.bSettings.php:30
+msgid "General Settings"
+msgstr "æ»ä½è®¾ç½®"
+
+#: classes/class.bSettings.php:32
+msgid "Enable Free Membership"
+msgstr "å¯ç¨å
è´¹ä¼å"
+
+#: classes/class.bSettings.php:35
+msgid "Enable/disable registration for free membership level"
+msgstr "å¯ç¨/ä¸å¯ç¨å
è´¹ä¼å注å"
+
+#: classes/class.bSettings.php:36
+msgid "Free Membership Level ID"
+msgstr "å
è´¹ä¼åç级ID"
+
+#: classes/class.bSettings.php:39
+msgid "Assign free membership level ID"
+msgstr "æå®å
è´¹ä¼å级å«ID"
+
+#: classes/class.bSettings.php:40
+msgid "Hide Adminbar"
+msgstr "éèç®¡çæ "
+
+#: classes/class.bSettings.php:43
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+"WordPress对已ç»ç»éçç¨æ·æ¾ç¤ºç®¡çå·¥å
·æ ï¼å¦æä½ æ³å¨ç½ç«å端éèç®¡çæ è¯·å¾éè¿"
+"é"
+
+#: classes/class.bSettings.php:45
+msgid "Pages Settings"
+msgstr "页é¢è®¾ç½®"
+
+#: classes/class.bSettings.php:47
+msgid "Login Page URL"
+msgstr "ç»é页é¢URL"
+
+#: classes/class.bSettings.php:51
+msgid "Registration Page URL"
+msgstr "注å页é¢URL"
+
+#: classes/class.bSettings.php:55
+msgid "Join Us Page URL"
+msgstr "å å
¥é¡µé¢URL"
+
+#: classes/class.bSettings.php:59
+msgid "Edit Profile Page URL"
+msgstr "ä¿®æ¹ä¼åä¿¡æ¯é¡µé¢URL"
+
+#: classes/class.bSettings.php:63
+msgid "Password Reset Page URL"
+msgstr "æ´æ¹å¯ç 页é¢URL"
+
+#: classes/class.bSettings.php:68
+msgid "Test & Debug Settings"
+msgstr "æµè¯ä¸è°è¯è®¾ç½®"
+
+#: classes/class.bSettings.php:74
+msgid "Enable Sandbox Testing"
+msgstr "å¯ç¨æ²çæµè¯"
+
+#: classes/class.bSettings.php:77
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr "å¦æä½ è¦æµè¯ä»æ¬¾æ¹å¼ï¼è¯·å¯ç¨æ²ç"
+
+#: classes/class.bSettings.php:90
+msgid "Email Misc. Settings"
+msgstr "çµåé®ä»¶æé¡¹è®¾ç½®"
+
+#: classes/class.bSettings.php:92
+msgid "From Email Address"
+msgstr "çµåé®ä»¶æ¥è·¯"
+
+#: classes/class.bSettings.php:97
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr "çµåé®ä»¶è®¾ç½®ï¼å¿«éå®ææ³¨åï¼"
+
+#: classes/class.bSettings.php:99 classes/class.bSettings.php:110
+#: classes/class.bSettings.php:129
+msgid "Email Subject"
+msgstr "Emailæ é¢"
+
+#: classes/class.bSettings.php:103 classes/class.bSettings.php:114
+#: classes/class.bSettings.php:133
+msgid "Email Body"
+msgstr "Emailå
容"
+
+#: classes/class.bSettings.php:108
+msgid "Email Settings (Registration Complete)"
+msgstr "Email设置ï¼å®ææ³¨åï¼"
+
+#: classes/class.bSettings.php:118
+msgid "Send Notification To Admin"
+msgstr "ç»ç®¡çååééç¥"
+
+#: classes/class.bSettings.php:122
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr "管çåæ·»å ç¨æ·åç»ç¨æ·åéé®ä»¶"
+
+#: classes/class.bSettings.php:127
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr "Email设置ï¼è´¦æ·æ´æ°ä¿¡æ¯éç¥ï¼"
+
+#: classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr "注å"
+
+#: classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr "ä¼åç»é"
+
+#: classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr "ä¸ªäººèµæ"
+
+#: classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr "æ´æ¹å¯ç "
+
+#: classes/class.simple-wp-membership.php:181
+msgid "Simple WP Membership Protection"
+msgstr "ä¼åä¿æ¤"
+
+#: classes/class.simple-wp-membership.php:194
+msgid "Simple Membership Protection options"
+msgstr "ä¼åä¿æ¤é项"
+
+#: classes/class.simple-wp-membership.php:210
+msgid "Do you want to protect this content?"
+msgstr "ä½ æ¯å¦éè¦ä¿æ¤è¿ä¸ªå
容"
+
+#: classes/class.simple-wp-membership.php:215
+msgid "Select the membership level that can access this content:"
+msgstr "éæ©å¯ä»¥æ¥ç该å
容çä¼åç级"
+
+#: classes/class.simple-wp-membership.php:347
+msgid "Display SWPM Login."
+msgstr "æ¾ç¤ºSWPMç»é"
+
+#: classes/class.simple-wp-membership.php:349
+msgid "SWPM Login"
+msgstr "SWPMç»é"
+
+#: classes/class.simple-wp-membership.php:436
+msgid "WP Membership"
+msgstr "WPä¼å"
+
+#: classes/class.simple-wp-membership.php:443
+msgid "Settings"
+msgstr "设置"
+
+#: views/add.php:13 views/admin_member_form_common_part.php:45
+#: views/edit.php:12 views/login.php:11
+msgid "Password"
+msgstr "å¯ç "
+
+#: views/add.php:17 views/edit.php:16
+msgid "Repeat Password"
+msgstr "éå¤å¯ç "
+
+#: views/add.php:29 views/admin_member_form_common_part.php:10
+msgid "Gender"
+msgstr "æ§å«"
+
+#: views/add.php:36 views/admin_member_form_common_part.php:17
+#: views/edit.php:28
+msgid "Phone"
+msgstr "çµè¯"
+
+#: views/add.php:40 views/admin_member_form_common_part.php:21
+#: views/edit.php:32
+msgid "Street"
+msgstr "è¡é"
+
+#: views/add.php:44 views/admin_member_form_common_part.php:25
+#: views/edit.php:36
+msgid "City"
+msgstr "åå¸"
+
+#: views/add.php:48 views/admin_member_form_common_part.php:29
+#: views/edit.php:40
+msgid "State"
+msgstr "ç份"
+
+#: views/add.php:52 views/admin_member_form_common_part.php:33
+#: views/edit.php:44
+msgid "Zipcode"
+msgstr "é®ç¼"
+
+#: views/add.php:56 views/admin_member_form_common_part.php:37
+#: views/edit.php:48
+msgid "Country"
+msgstr "å½å®¶"
+
+#: views/add.php:60 views/admin_member_form_common_part.php:41
+msgid "Company"
+msgstr "å
¬å¸"
+
+#: views/add.php:71
+msgid "Register"
+msgstr "注å"
+
+#: views/admin_add.php:6
+msgid "Add Member"
+msgstr "æ·»å ä¼å"
+
+#: views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr "ç»ç½ç«å建ä¸ä¸ªæ°ç¨æ·"
+
+#: views/admin_add.php:11
+msgid "User name"
+msgstr "ç¨æ·å"
+
+#: views/admin_add.php:11 views/admin_add.php:15 views/admin_add_level.php:11
+#: views/admin_add_level.php:15 views/admin_add_level.php:19
+#: views/admin_edit.php:9 views/admin_edit.php:13
+#: views/admin_edit_level.php:10 views/admin_edit_level.php:14
+#: views/admin_edit_level.php:18
+msgid "(required)"
+msgstr "å¿
å¡«"
+
+#: views/admin_add.php:15 views/admin_edit.php:13
+msgid "E-mail"
+msgstr "E-mail"
+
+#: views/admin_add.php:19
+msgid "Add New Member "
+msgstr "æ·»å æ°ä¼å"
+
+#: views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr "å建æ°ä¼åç级"
+
+#: views/admin_add_level.php:11 views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr "ä¼åç级å"
+
+#: views/admin_add_level.php:15 views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr "é»è®¤çWPè§è²"
+
+#: views/admin_add_level.php:19 views/admin_edit_level.php:18
+msgid "Subscription Duration"
+msgstr "æææ"
+
+#: views/admin_add_level.php:26 views/admin_edit_level.php:27
+msgid "No Expiry"
+msgstr "ä¸å¤±æ"
+
+#: views/admin_add_level.php:55
+msgid "Add New Membership Level "
+msgstr "æ·»å æ°çä¼åç级"
+
+#: views/admin_edit.php:5
+msgid "Edit Member"
+msgstr "ä¿®æ¹ä¼å"
+
+#: views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr "ä¿®æ¹å·²åå¨ç¨æ·ä¿¡æ¯"
+
+#: views/admin_edit.php:9
+msgid "Username"
+msgstr "ç¨æ·å"
+
+#: views/admin_edit.php:17
+msgid "Edit User "
+msgstr "ä¿®æ¹ç¨æ·"
+
+#: views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr "ä¿®æ¹ä¼åç级"
+
+#: views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr "ä¿®æ¹ä¼åç级"
+
+#: views/admin_edit_level.php:54
+msgid "Edit Membership Level "
+msgstr "ä¿®æ¹ä¼åç级"
+
+#. translators: password input field
+#: views/admin_member_form_common_part.php:45
+msgid "(twice, required)"
+msgstr "2次ï¼å¿
å¡«"
+
+#: views/admin_member_form_common_part.php:50
+msgid "Strength indicator"
+msgstr "强度æç¤ºå¨"
+
+#: views/admin_member_form_common_part.php:51
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+"å¯ç æå°7个å符ï¼ä¸ºä¿è¯å¯ç 强度ï¼è¯·ä½¿ç¨å¤§å°ååæ¯ï¼æ°ååä¾å¦! \" ? $ % ^ "
+"&ç符å·"
+
+#: views/admin_member_form_common_part.php:64 views/loggedin.php:7
+#: views/login_widget_logged.php:6
+msgid "Account Status"
+msgstr "è´¦æ·ç¶æ"
+
+#: views/admin_member_form_common_part.php:66
+msgid "Active"
+msgstr "æ¿æ´»"
+
+#: views/admin_member_form_common_part.php:67
+msgid "Inactive"
+msgstr "æªæ¿æ´»"
+
+#: views/admin_member_form_common_part.php:68
+msgid "Pending"
+msgstr "å¾
å®"
+
+#: views/admin_member_form_common_part.php:69
+msgid "Expired"
+msgstr "失æ"
+
+#: views/admin_member_form_common_part.php:74
+msgid "Member Since"
+msgstr "ä¼åèª"
+
+#: views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr "ä¼åç级ï¼ä¼å"
+
+#: views/admin_members.php:3 views/admin_members.php:19
+#: views/admin_membership_levels.php:21
+msgid "Add New"
+msgstr "æ·»å æ°ç"
+
+#: views/admin_members.php:9 views/admin_membership_levels.php:11
+msgid "search"
+msgstr "æç´¢"
+
+#: views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr "ä¼åç级"
+
+#: views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr "管çå
容å¶ä½"
+
+#: views/admin_membership_levels.php:3
+msgid "Simple WP Membership::Membership Levels"
+msgstr "ä¼åï¼ä¼åç级"
+
+#: views/admin_membership_levels.php:4
+msgctxt "Level"
+msgid "Add New"
+msgstr "æ·»å æ°ç级"
+
+#: views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr "å
å®¹ä¿æ¤è®¾ç½®ä¾å"
+
+#: views/admin_payment_settings.php:2 views/admin_settings.php:2
+#: views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr "ä¼åï¼è®¾ç½®"
+
+#: views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr "Paypaléæè®¾ç½®"
+
+#: views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr "æ¨çPayPalæé®äº§çé«çº§åé代ç "
+
+#: views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr "è¾å
¥ä¼åç级ID"
+
+#: views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr "çæä»£ç "
+
+#: views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr "çææ³¨å宿龿¥"
+
+#: views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+"å¦æä½ çç¨æ·å¨å®æä»æ¬¾å没æ¶å°èªå¨çæçé®ä»¶ï¼é£ä¹ä½ å¯ä»¥å¨è¿éæå¨çææ³¨åå®"
+"æé¾æ¥ï¼å¹¶åéç»ä½ çç¨æ·"
+
+#: views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr "çææ³¨å宿龿¥"
+
+#: views/admin_tools_settings.php:20
+msgid "OR"
+msgstr "æè
"
+
+#: views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr "å¯¹äºææå¾
å®ç注å"
+
+#: views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr "注å宿龿¥ä¼åºç°å¨ï¼"
+
+#: views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr "åæ¶åéæ³¨åæéé®ä»¶"
+
+#: views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr "æäº¤"
+
+#: views/edit.php:58
+msgid "Update"
+msgstr "æ´æ°"
+
+#: views/forgot_password.php:5
+msgid "Email Address"
+msgstr "Emailå°å"
+
+#: views/forgot_password.php:12
+msgid "Reset Password"
+msgstr "éç½®å¯ç "
+
+#: views/loggedin.php:3 views/login_widget_logged.php:3
+msgid "Logged in as"
+msgstr "以以ä¸èº«ä»½ç»é"
+
+#: views/loggedin.php:11 views/login_widget_logged.php:9
+msgid "Membership"
+msgstr "ä¼å"
+
+#: views/loggedin.php:15 views/login_widget_logged.php:13
+msgid "Logout"
+msgstr "éåºç»é"
+
+#: views/login.php:17
+msgid "Remember Me"
+msgstr "è®°ä½è¿ä¸ªèº«ä»½"
+
+#: views/login.php:26
+msgid "Forgot Password"
+msgstr "å¿è®°å¯ç "
+
+#: views/login.php:30
+msgid "Join Us"
+msgstr "å å
¥ä¼å"
diff --git a/languages/swpm.pot b/languages/swpm.pot
new file mode 100644
index 0000000..8c5e017
--- /dev/null
+++ b/languages/swpm.pot
@@ -0,0 +1,906 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Simple Membership\n"
+"POT-Creation-Date: 2015-01-27 14:50+1000\n"
+"PO-Revision-Date: 2015-01-27 14:51+1000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.7\n"
+"X-Poedit-KeywordsList: __;_e\n"
+"X-Poedit-Basepath: .\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: simple-membership/classes/class.bAccessControl.php:21
+#: simple-membership/classes/class.bAccessControl.php:28
+#: simple-membership/classes/class.bAccessControl.php:48
+msgid "You need to login to view this content. "
+msgstr ""
+
+#: simple-membership/classes/class.bAccessControl.php:35
+#: simple-membership/classes/class.bAccessControl.php:39
+#: simple-membership/classes/class.bAccessControl.php:54
+msgid "You are not allowed to view this content"
+msgstr ""
+
+#: simple-membership/classes/class.bAccessControl.php:72
+msgid "You do no have permission to view rest of the content"
+msgstr ""
+
+#: simple-membership/classes/class.bAccessControl.php:76
+#: simple-membership/classes/class.bAccessControl.php:94
+msgid "You need to login to view the rest of the content. "
+msgstr ""
+
+#: simple-membership/classes/class.bAdminRegistration.php:49
+msgid "Registration Successful."
+msgstr ""
+
+#: simple-membership/classes/class.bAdminRegistration.php:54
+#: simple-membership/classes/class.bAdminRegistration.php:89
+#: simple-membership/classes/class.bMembershipLevel.php:42
+#: simple-membership/classes/class.bMembershipLevel.php:60
+msgid "Please correct the following:"
+msgstr ""
+
+#: simple-membership/classes/class.bAjax.php:17
+#: simple-membership/classes/class.bAjax.php:28
+msgid "Aready taken"
+msgstr ""
+
+#: simple-membership/classes/class.bAjax.php:29
+msgid "Available"
+msgstr ""
+
+#: simple-membership/classes/class.bAuth.php:46
+#: simple-membership/classes/class.bFrontRegistration.php:173
+msgid "User Not Found."
+msgstr ""
+
+#: simple-membership/classes/class.bAuth.php:53
+msgid "Password Empty or Invalid."
+msgstr ""
+
+#: simple-membership/classes/class.bAuth.php:76
+msgid "Account is inactive."
+msgstr ""
+
+#: simple-membership/classes/class.bAuth.php:93
+msgid "Account has expired."
+msgstr ""
+
+#: simple-membership/classes/class.bAuth.php:100
+msgid "You are logged in as:"
+msgstr ""
+
+#: simple-membership/classes/class.bAuth.php:139
+msgid "Logged Out Successfully."
+msgstr ""
+
+#: simple-membership/classes/class.bAuth.php:186
+msgid "Session Expired."
+msgstr ""
+
+#: simple-membership/classes/class.bAuth.php:194
+msgid "Invalid User Name"
+msgstr ""
+
+#: simple-membership/classes/class.bAuth.php:202
+msgid "Sorry! Something went wrong"
+msgstr ""
+
+#: simple-membership/classes/class.bCategoryList.php:15
+#: simple-membership/classes/class.bMembers.php:21
+#: simple-membership/classes/class.bMembershipLevels.php:8
+#: simple-membership/classes/class.bMembershipLevels.php:17
+#: simple-membership/views/add.php:30
+#: simple-membership/views/admin_member_form_common_part.php:2
+#: simple-membership/views/edit.php:52
+msgid "Membership Level"
+msgstr ""
+
+#: simple-membership/classes/class.bCategoryList.php:16
+#: simple-membership/classes/class.bMembershipLevels.php:9
+#: simple-membership/classes/class.simple-wp-membership.php:464
+msgid "Membership Levels"
+msgstr ""
+
+#: simple-membership/classes/class.bCategoryList.php:29
+#: simple-membership/classes/class.bMembers.php:16
+#: simple-membership/classes/class.bMembershipLevels.php:16
+msgid "ID"
+msgstr ""
+
+#: simple-membership/classes/class.bCategoryList.php:30
+msgid "Name"
+msgstr ""
+
+#: simple-membership/classes/class.bCategoryList.php:31
+msgid "Description"
+msgstr ""
+
+#: simple-membership/classes/class.bCategoryList.php:32
+msgid "Count"
+msgstr ""
+
+#: simple-membership/classes/class.bCategoryList.php:63
+msgid "Updated! "
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:26
+msgid ""
+"Wordpress account exists with given user name. But given email doesn't match."
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:31
+msgid ""
+"Wordpress account exists with given email. But given user name doesn't match."
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:40
+msgid "User name is required"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:44
+msgid "User name contains invalid character"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:52
+msgid "User name already exists."
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:75
+msgid "Password is required"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:82
+msgid "Password mismatch"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:98
+msgid "Email is required"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:102
+msgid "Email is invalid"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:118
+msgid "Email is already used."
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:184
+msgid "Member since field is invalid"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:195
+msgid "Access starts field is invalid"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:205
+msgid "Gender field is invalid"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:216
+msgid "Account state field is invalid"
+msgstr ""
+
+#: simple-membership/classes/class.bForm.php:223
+msgid "Invalid membership level"
+msgstr ""
+
+#: simple-membership/classes/class.bFrontRegistration.php:61
+msgid "Registration Successful. "
+msgstr ""
+
+#: simple-membership/classes/class.bFrontRegistration.php:61
+#: simple-membership/classes/class.bSettings.php:367
+msgid "Please"
+msgstr ""
+
+#: simple-membership/classes/class.bFrontRegistration.php:61
+#: simple-membership/classes/class.bSettings.php:367
+#: simple-membership/views/login.php:21
+msgid "Login"
+msgstr ""
+
+#: simple-membership/classes/class.bFrontRegistration.php:72
+#: simple-membership/classes/class.bFrontRegistration.php:152
+msgid "Please correct the following"
+msgstr ""
+
+#: simple-membership/classes/class.bFrontRegistration.php:106
+msgid "Membership Level Couldn't be found."
+msgstr ""
+
+#: simple-membership/classes/class.bFrontRegistration.php:162
+msgid "Email Address Not Valid."
+msgstr ""
+
+#: simple-membership/classes/class.bFrontRegistration.php:193
+msgid "New password has been sent to your email address."
+msgstr ""
+
+#: simple-membership/classes/class.bLevelForm.php:47
+msgid "Date format is not valid."
+msgstr ""
+
+#: simple-membership/classes/class.bLevelForm.php:54
+msgid "Access duration must be > 0."
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:7
+msgid "Member"
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:8
+#: simple-membership/classes/class.simple-wp-membership.php:462
+msgid "Members"
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:17
+#: simple-membership/views/add.php:6 simple-membership/views/edit.php:4
+msgid "User Name"
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:18
+#: simple-membership/views/add.php:22
+#: simple-membership/views/admin_member_form_common_part.php:15
+#: simple-membership/views/edit.php:20
+msgid "First Name"
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:19
+#: simple-membership/views/add.php:26
+#: simple-membership/views/admin_member_form_common_part.php:19
+#: simple-membership/views/edit.php:24
+msgid "Last Name"
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:20
+#: simple-membership/views/add.php:10 simple-membership/views/edit.php:8
+msgid "Email"
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:22
+#: simple-membership/views/admin_member_form_common_part.php:11
+msgid "Access Starts"
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:23
+msgid "Account State"
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:35
+#: simple-membership/classes/class.bMembershipLevels.php:29
+msgid "Delete"
+msgstr ""
+
+#: simple-membership/classes/class.bMembers.php:101
+msgid "No Member found."
+msgstr ""
+
+#: simple-membership/classes/class.bMembershipLevel.php:37
+msgid "Membership Level Creation Successful."
+msgstr ""
+
+#: simple-membership/classes/class.bMembershipLevel.php:56
+msgid "Updated Successfully."
+msgstr ""
+
+#: simple-membership/classes/class.bMembershipLevels.php:18
+msgid "Role"
+msgstr ""
+
+#: simple-membership/classes/class.bMembershipLevels.php:19
+msgid "Access Valid For/Until"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:30
+msgid "Plugin Documentation"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:32
+msgid "General Settings"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:34
+msgid "Enable Free Membership"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:37
+msgid "Enable/disable registration for free membership level"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:38
+msgid "Free Membership Level ID"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:41
+msgid "Assign free membership level ID"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:42
+msgid "Enable More Tag Protection"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:45
+msgid ""
+"Enables or disables \"more\" tag protection in the posts and pages. Anything "
+"after the More tag is protected. Anything before the more tag is teaser "
+"content."
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:46
+msgid "Hide Adminbar"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:49
+msgid ""
+"WordPress shows an admin toolbar to the logged in users of the site. Check "
+"this box if you want to hide that admin toolbar in the fronend of your site."
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:51
+msgid "Default Account Status"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:56
+msgid ""
+"Select the default account status for newly registered users. If you want to "
+"manually approve the members then you can set the status to \"Pending\"."
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:62
+msgid "Pages Settings"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:64
+msgid "Login Page URL"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:68
+msgid "Registration Page URL"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:72
+msgid "Join Us Page URL"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:76
+msgid "Edit Profile Page URL"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:80
+msgid "Password Reset Page URL"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:85
+msgid "Test & Debug Settings"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:91
+msgid "Enable Sandbox Testing"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:94
+msgid "Enable this option if you want to do sandbox payment testing."
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:104
+msgid "Email Misc. Settings"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:106
+msgid "From Email Address"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:111
+msgid "Email Settings (Prompt to Complete Registration )"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:113
+#: simple-membership/classes/class.bSettings.php:124
+#: simple-membership/classes/class.bSettings.php:143
+msgid "Email Subject"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:117
+#: simple-membership/classes/class.bSettings.php:128
+#: simple-membership/classes/class.bSettings.php:147
+msgid "Email Body"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:122
+msgid "Email Settings (Registration Complete)"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:132
+msgid "Send Notification To Admin"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:136
+msgid "Send Email to Member When Added via Admin Dashboard"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:141
+msgid " Email Settings (Account Upgrade Notification)"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:367
+msgid "Not a Member?"
+msgstr ""
+
+#: simple-membership/classes/class.bSettings.php:367
+#: simple-membership/views/login.php:27
+msgid "Join Us"
+msgstr ""
+
+#: simple-membership/classes/class.bUtils.php:63
+msgid "Active"
+msgstr ""
+
+#: simple-membership/classes/class.bUtils.php:64
+msgid "Inactive"
+msgstr ""
+
+#: simple-membership/classes/class.bUtils.php:65
+msgid "Pending"
+msgstr ""
+
+#: simple-membership/classes/class.bUtils.php:66
+msgid "Expired"
+msgstr ""
+
+#: simple-membership/classes/class.bUtils.php:251
+msgid "Never"
+msgstr ""
+
+#: simple-membership/classes/class.miscUtils.php:51
+msgid "Registration"
+msgstr ""
+
+#: simple-membership/classes/class.miscUtils.php:74
+msgid "Member Login"
+msgstr ""
+
+#: simple-membership/classes/class.miscUtils.php:97
+msgid "Profile"
+msgstr ""
+
+#: simple-membership/classes/class.miscUtils.php:120
+msgid "Password Reset"
+msgstr ""
+
+#: simple-membership/classes/class.simple-wp-membership.php:184
+msgid "You are not logged in."
+msgstr ""
+
+#: simple-membership/classes/class.simple-wp-membership.php:215
+msgid "Simple WP Membership Protection"
+msgstr ""
+
+#: simple-membership/classes/class.simple-wp-membership.php:228
+msgid "Simple Membership Protection options"
+msgstr ""
+
+#: simple-membership/classes/class.simple-wp-membership.php:244
+msgid "Do you want to protect this content?"
+msgstr ""
+
+#: simple-membership/classes/class.simple-wp-membership.php:249
+msgid "Select the membership level that can access this content:"
+msgstr ""
+
+#: simple-membership/classes/class.simple-wp-membership.php:459
+msgid "WP Membership"
+msgstr ""
+
+#: simple-membership/classes/class.simple-wp-membership.php:466
+msgid "Settings"
+msgstr ""
+
+#: simple-membership/classes/class.simple-wp-membership.php:468
+msgid "Add-ons"
+msgstr ""
+
+#: simple-membership/views/add.php:14 simple-membership/views/admin_add.php:19
+#: simple-membership/views/admin_edit.php:17
+#: simple-membership/views/edit.php:12 simple-membership/views/login.php:11
+msgid "Password"
+msgstr ""
+
+#: simple-membership/views/add.php:18 simple-membership/views/edit.php:16
+msgid "Repeat Password"
+msgstr ""
+
+#: simple-membership/views/add.php:37
+msgid "Register"
+msgstr ""
+
+#: simple-membership/views/admin_add.php:6
+msgid "Add Member"
+msgstr ""
+
+#: simple-membership/views/admin_add.php:7
+msgid "Create a brand new user and add it to this site."
+msgstr ""
+
+#: simple-membership/views/admin_add.php:11
+msgid "User name"
+msgstr ""
+
+#: simple-membership/views/admin_add.php:11
+#: simple-membership/views/admin_add.php:15
+#: simple-membership/views/admin_add_level.php:11
+#: simple-membership/views/admin_add_level.php:15
+#: simple-membership/views/admin_add_level.php:19
+#: simple-membership/views/admin_edit.php:9
+#: simple-membership/views/admin_edit.php:13
+#: simple-membership/views/admin_edit_level.php:10
+#: simple-membership/views/admin_edit_level.php:14
+#: simple-membership/views/admin_edit_level.php:18
+msgid "(required)"
+msgstr ""
+
+#: simple-membership/views/admin_add.php:15
+#: simple-membership/views/admin_edit.php:13
+msgid "E-mail"
+msgstr ""
+
+#: simple-membership/views/admin_add.php:19
+msgid "(twice, required)"
+msgstr ""
+
+#: simple-membership/views/admin_add.php:24
+#: simple-membership/views/admin_edit.php:21
+msgid "Strength indicator"
+msgstr ""
+
+#: simple-membership/views/admin_add.php:25
+#: simple-membership/views/admin_edit.php:22
+msgid ""
+"Hint: The password should be at least seven characters long. To make it "
+"stronger, use upper and lower case letters, numbers and symbols like ! \" ? "
+"$ % ^ & )."
+msgstr ""
+
+#: simple-membership/views/admin_add.php:29
+#: simple-membership/views/admin_edit.php:26
+#: simple-membership/views/loggedin.php:7
+msgid "Account Status"
+msgstr ""
+
+#: simple-membership/views/admin_add.php:36
+msgid "Add New Member "
+msgstr ""
+
+#: simple-membership/views/admin_addon_settings.php:2
+#: simple-membership/views/admin_payment_settings.php:2
+#: simple-membership/views/admin_settings.php:2
+#: simple-membership/views/admin_tools_settings.php:2
+msgid "Simple WP Membership::Settings"
+msgstr ""
+
+#: simple-membership/views/admin_addon_settings.php:7
+msgid ""
+"Some of the simple membership plugin's addon settings and options will be "
+"displayed here (if you have them)"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:6
+msgid "Create new membership level."
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:11
+#: simple-membership/views/admin_edit_level.php:10
+msgid "Membership Level Name"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:15
+#: simple-membership/views/admin_edit_level.php:14
+msgid "Default WordPress Role"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:19
+#: simple-membership/views/admin_edit_level.php:18
+msgid "Access Duration"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:22
+msgid "No Expiry (Access for this level will not expire until cancelled"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:23
+#: simple-membership/views/admin_add_level.php:25
+#: simple-membership/views/admin_add_level.php:27
+#: simple-membership/views/admin_add_level.php:29
+#: simple-membership/views/admin_edit_level.php:22
+#: simple-membership/views/admin_edit_level.php:25
+#: simple-membership/views/admin_edit_level.php:28
+#: simple-membership/views/admin_edit_level.php:31
+msgid "Expire After"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:24
+#: simple-membership/views/admin_edit_level.php:23
+msgid "Days (Access expires after given number of days)"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:26
+msgid "Weeks (Access expires after given number of weeks"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:28
+#: simple-membership/views/admin_edit_level.php:29
+msgid "Months (Access expires after given number of months)"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:30
+#: simple-membership/views/admin_edit_level.php:32
+msgid "Years (Access expires after given number of years)"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:31
+#: simple-membership/views/admin_edit_level.php:34
+msgid "Fixed Date Expiry"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:32
+#: simple-membership/views/admin_edit_level.php:35
+msgid "(Access expires on a fixed date)"
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:36
+msgid "Access to older posts."
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:39
+msgid "Only allow access to posts published after the user's join date."
+msgstr ""
+
+#: simple-membership/views/admin_add_level.php:45
+msgid "Add New Membership Level "
+msgstr ""
+
+#: simple-membership/views/admin_add_ons_page.php:6
+msgid "Simple WP Membership::Add-ons"
+msgstr ""
+
+#: simple-membership/views/admin_category_list.php:2
+msgid "Simple WP Membership::Categories"
+msgstr ""
+
+#: simple-membership/views/admin_category_list.php:7
+msgid ""
+"First of all, globally protect the category on your site by selecting "
+"\"General Protection\" from the drop-down box below and then select the "
+"categories that should be protected from non-logged in users."
+msgstr ""
+
+#: simple-membership/views/admin_category_list.php:10
+msgid ""
+"Next, select an existing membership level from the drop-down box below and "
+"then select the categories you want to grant access to (for that particular "
+"membership level)."
+msgstr ""
+
+#: simple-membership/views/admin_edit.php:5
+msgid "Edit Member"
+msgstr ""
+
+#: simple-membership/views/admin_edit.php:6
+msgid "Edit existing member details."
+msgstr ""
+
+#: simple-membership/views/admin_edit.php:9
+#: simple-membership/views/login.php:5
+msgid "Username"
+msgstr ""
+
+#: simple-membership/views/admin_edit.php:17
+msgid "(twice, leave empty to retain old password)"
+msgstr ""
+
+#: simple-membership/views/admin_edit.php:33
+msgid "Notify User"
+msgstr ""
+
+#: simple-membership/views/admin_edit.php:40
+msgid "Edit User "
+msgstr ""
+
+#: simple-membership/views/admin_edit_level.php:5
+msgid "Edit membership level"
+msgstr ""
+
+#: simple-membership/views/admin_edit_level.php:6
+msgid "Edit membership level."
+msgstr ""
+
+#: simple-membership/views/admin_edit_level.php:21
+msgid "No Expiry (Access for this level will not expire until cancelled)"
+msgstr ""
+
+#: simple-membership/views/admin_edit_level.php:26
+msgid "Weeks (Access expires after given number of weeks)"
+msgstr ""
+
+#: simple-membership/views/admin_edit_level.php:40
+msgid "Protect Older Posts (optional)"
+msgstr ""
+
+#: simple-membership/views/admin_edit_level.php:43
+msgid ""
+"Only allow access to protected posts published after the members's join date."
+msgstr ""
+
+#: simple-membership/views/admin_edit_level.php:51
+msgid "Edit Membership Level "
+msgstr ""
+
+#: simple-membership/views/admin_members.php:2
+msgid "Simple WP Membership::Members"
+msgstr ""
+
+#: simple-membership/views/admin_members.php:3
+#: simple-membership/views/admin_members.php:19
+#: simple-membership/views/admin_membership_levels.php:20
+msgid "Add New"
+msgstr ""
+
+#: simple-membership/views/admin_members.php:9
+#: simple-membership/views/admin_membership_levels.php:10
+msgid "search"
+msgstr ""
+
+#: simple-membership/views/admin_membership_levels.php:2
+msgid "Simple WP Membership::Membership Levels"
+msgstr ""
+
+#: simple-membership/views/admin_membership_level_menu.php:2
+msgid "Membership level"
+msgstr ""
+
+#: simple-membership/views/admin_membership_level_menu.php:3
+msgid "Manage Content Production"
+msgstr ""
+
+#: simple-membership/views/admin_membership_level_menu.php:4
+msgid "Category Protection"
+msgstr ""
+
+#: simple-membership/views/admin_membership_manage.php:17
+msgid "Example Content Protection Settings"
+msgstr ""
+
+#: simple-membership/views/admin_member_form_common_part.php:23
+msgid "Gender"
+msgstr ""
+
+#: simple-membership/views/admin_member_form_common_part.php:30
+#: simple-membership/views/edit.php:28
+msgid "Phone"
+msgstr ""
+
+#: simple-membership/views/admin_member_form_common_part.php:34
+#: simple-membership/views/edit.php:32
+msgid "Street"
+msgstr ""
+
+#: simple-membership/views/admin_member_form_common_part.php:38
+#: simple-membership/views/edit.php:36
+msgid "City"
+msgstr ""
+
+#: simple-membership/views/admin_member_form_common_part.php:42
+#: simple-membership/views/edit.php:40
+msgid "State"
+msgstr ""
+
+#: simple-membership/views/admin_member_form_common_part.php:46
+#: simple-membership/views/edit.php:44
+msgid "Zipcode"
+msgstr ""
+
+#: simple-membership/views/admin_member_form_common_part.php:50
+#: simple-membership/views/edit.php:48
+msgid "Country"
+msgstr ""
+
+#: simple-membership/views/admin_member_form_common_part.php:54
+msgid "Company"
+msgstr ""
+
+#: simple-membership/views/admin_member_form_common_part.php:58
+msgid "Member Since"
+msgstr ""
+
+#: simple-membership/views/admin_payment_settings.php:33
+msgid "PayPal Integration Settings"
+msgstr ""
+
+#: simple-membership/views/admin_payment_settings.php:36
+msgid "Generate the \"Advanced Variables\" Code for your PayPal button"
+msgstr ""
+
+#: simple-membership/views/admin_payment_settings.php:39
+msgid "Enter the Membership Level ID"
+msgstr ""
+
+#: simple-membership/views/admin_payment_settings.php:41
+msgid "Generate Code"
+msgstr ""
+
+#: simple-membership/views/admin_tools_settings.php:9
+msgid "Generate a Registration Completion link"
+msgstr ""
+
+#: simple-membership/views/admin_tools_settings.php:12
+msgid ""
+"You can manually generate a registration completion link here and give it to "
+"your customer if they have missed the email that was automatically sent out "
+"to them after the payment."
+msgstr ""
+
+#: simple-membership/views/admin_tools_settings.php:17
+msgid "Generate Registration Completion Link"
+msgstr ""
+
+#: simple-membership/views/admin_tools_settings.php:20
+msgid "OR"
+msgstr ""
+
+#: simple-membership/views/admin_tools_settings.php:21
+msgid "For All Pending Registrations"
+msgstr ""
+
+#: simple-membership/views/admin_tools_settings.php:24
+msgid "Registration Completion Links Will Appear Below:"
+msgstr ""
+
+#: simple-membership/views/admin_tools_settings.php:31
+msgid "Send Registration Reminder Email too"
+msgstr ""
+
+#: simple-membership/views/admin_tools_settings.php:34
+msgid "Submit"
+msgstr ""
+
+#: simple-membership/views/edit.php:58
+msgid "Update"
+msgstr ""
+
+#: simple-membership/views/forgot_password.php:5
+msgid "Email Address"
+msgstr ""
+
+#: simple-membership/views/forgot_password.php:12
+msgid "Reset Password"
+msgstr ""
+
+#: simple-membership/views/loggedin.php:3
+msgid "Logged in as"
+msgstr ""
+
+#: simple-membership/views/loggedin.php:11
+msgid "Membership"
+msgstr ""
+
+#: simple-membership/views/loggedin.php:15
+msgid "Account Expiry"
+msgstr ""
+
+#: simple-membership/views/loggedin.php:19
+msgid "Logout"
+msgstr ""
+
+#: simple-membership/views/login.php:18
+msgid "Remember Me"
+msgstr ""
+
+#: simple-membership/views/login.php:24
+msgid "Forgot Password"
+msgstr ""
diff --git a/log.txt b/log.txt
new file mode 100644
index 0000000..e69de29
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..2a32beb
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1,342 @@
+=== Simple Membership ===
+Contributors: smp7, wp.insider, amijanina
+Donate link: https://simple-membership-plugin.com/
+Tags: member, members, members only, membership, memberships, register, WordPress membership plugin, content, content protection, paypal, restrict, restrict access, Restrict content, admin, access control, subscription, teaser, protection, profile, login, login page,
+Requires at least: 3.3
+Tested up to: 4.2
+Stable tag: 100.2.3
+License: GPLv2 or later
+License URI: http://www.gnu.org/licenses/gpl-2.0.html
+
+Simple membership plugin adds membership functionality to your site. Protect members only content using content protection easily.
+
+== Description ==
+
+= A flexible, well-supported, and easy-to-use WordPress membership plugin for offering free and premium content from your WordPress site =
+
+**** NOTE ****
+This is a modified version of the plugin. Stable tag has been changed from 2.2.3 to 100.2.3 to block future updates.
+**************
+
+The simple membership plugin lets you protect your posts and pages so only your members can view the protected content.
+
+= Unlimited Membership Access Levels =
+Set up unlimited membership levels (example: free, silver, gold etc) and protect your posts and pages using the membership levels you create.
+
+= User Friendly Interface for Content Protection =
+When you are editing a post or page in the WordPress editor, you can select to protect that post or page for your members.
+
+Non-members viewing a protected page will be prompted to login or become a member.
+
+= Have Free and Paid Memberships =
+You can configure it to have free and/or paid memberships on your site. Paid membership payment is handled securely via PayPal.
+
+Both one time and recurring/subscription payments are supported.
+
+= Membership Payments Log =
+All the payments from your members are recorded in the plugin. You can view them anytime by visiting the payments menu from the admin dashboard.
+
+= Member Login Widget on The Sidebar =
+You can easily add a member login widget on the sidebar of your site. Simply use the login form shortcode in the sidebar widget.
+
+= Documentation =
+
+Read the [setup documentation](https://simple-membership-plugin.com/simple-membership-documentation/) after you install the plugin to get started.
+
+= Plugin Support =
+
+If you have any issue with this plugin, please visit the plugin site and post it on the support forum or send us a contact:
+https://simple-membership-plugin.com/
+
+You can create a free forum user account and ask your questions.
+
+= Miscellaneous =
+
+* Works with any WordPress theme.
+* Ability to protect photo galleries.
+* Show teaser content to convert visitors into members.
+* Comments on your protected posts will also be protected automatically.
+* There is an option to enable debug logging so you can troubleshoot membership payment related issues easily (if any).
+* Ability to customize the content protection message that gets shown to non-members.
+* Membership management side is handled by the plugin.
+* Ability to manually approve your members.
+* Ability to import WordPress users as members.
+* Can be translated to any language.
+* Hide the admin toolbar from the frontend of your site.
+* Allow your members to deleter their membership accounts.
+* Send quick notification email to your members.
+* The login and registration widgets will be responsive if you are using a responsive theme.
+* Front-end member registration page.
+* Front-end member profiles.
+* Front-end member login page.
+
+= Language Translations =
+
+The following language translations are already available:
+
+* English
+* Spanish
+* German
+* French
+* Chinese
+* Portuguese (Brazil)
+* Swedish
+* Macedonian
+* Polish
+* Turkish
+* Russian
+* Dutch (Netherlands)
+* Romanian
+* Danish
+* Lithuanian
+
+You can translate the plugin using the language [translation documentation](https://simple-membership-plugin.com/translate-simple-membership-plugin/).
+
+== Installation ==
+
+Do the following to install the membership plugin:
+
+1. Upload the 'simple-wp-membership.zip' file from the Plugins->Add New page in the WordPress administration panel.
+2. Activate the plugin through the 'Plugins' menu in WordPress.
+
+== Frequently Asked Questions ==
+
+None.
+
+== Screenshots ==
+
+Please visit the memberhsip plugin page to view screenshots:
+https://simple-membership-plugin.com/
+
+== Changelog ==
+
+= 2.2.3 =
+- Updated the category protection interface to use the get_terms() function.
+- Added a new Utility class that has some helpful functions (example: check if a member is logged into the site).
+
+= 2.2.2 =
+- All the membership payments are now recorded in the payments table.
+- Added a new menu item (Payments) to show all the membership payments and transactions.
+- Added Lithuanian language translation to the plugin. The translation was submitted by Daiva Pakalne.
+- Fixed an invalid argument error.
+
+= 2.2.1 =
+- Added a new table for logging the membership payments/transactions in the future.
+- Made some enhancements in the installer class so it can handle both the WP Multi-site and single site setup via the same function.
+
+= 2.2 =
+- Added a new feature to allow expired members to be able to log into the system (to allow easy account renewal).
+- The email address value of a member is now editable from the admin dashboard and in the profile edit form.
+- Added CSS classes around some of the messages for styling purpose.
+- Some translation updates.
+
+= 2.1.9 =
+- Improved the password reset functionality.
+- Improved the message that gets displayed after the password reset functionality is used.
+- Updated the Portuguese (Brazil) language file.
+- Improved the user login handling code.
+
+= 2.1.8 =
+- Improved the after logout redirection so it uses the home_url() value.
+- Fixed a bug in the member table sorting functionality.
+- The members table can now be sorted using ID column.
+
+
+= 2.1.7 =
+- Added a new feature to automatically delete pending membership accounts that are older than 1 or 2 months.
+- Fixed an issue with the send notification to admin email settings not saving.
+
+= 2.1.6 =
+- Fixed a bug with new membership level creation with a number of days or weeks duration value.
+
+= 2.1.5 =
+- Improved the attachment protection so it doesn't protect when viewing from the admin side also.
+- Removed a dubug dump statement.
+
+= 2.1.4 =
+- Improved the login authentication handler logic.
+- Fixed the restricted image icon URL.
+- Updated the restricted attachment icon to use a better one.
+
+= 2.1.3 =
+- Added a new feature to allow the members to delete their accounts.
+
+= 2.1.2 =
+- Updated the membership subscription payment cancellation handler and made it more robust.
+- Added an option in the settings to reset the debug log files.
+
+= 2.1.1 =
+- Enhanced the username exists function query.
+- Updated one of the notice messages.
+
+= 2.1 =
+- Changed the PHP short tags to the standard tags
+- Updated a message in the settings to make the usage instruction clear.
+- Corrected a version number value.
+
+= 2.0 =
+- Improved some of the default content protection messages.
+- Added Danish language translation to the plugin. The translation was submitted by Niels Boje Lund.
+
+= 1.9.9 =
+- WP Multi-site network activation error fix.
+
+= 1.9.8 =
+- Fixed an issue with the phone number not saving.
+- Fixed an issue with the new fixed membership expiry date feature.
+
+= 1.9.7 =
+- Minor UI fix in the add new membership level menu.
+
+= 1.9.6 =
+- Added a new feature to allow fixed expiry date for membership levels.
+- Added Russian language translation to the plugin. The translation was submitted by Vladimir Vaulin.
+- Added Dutch language translation to the plugin. The translation was submitted by Henk Rostohar.
+- Added Romanian language translation to the plugin. The translation was submitted by Iulian Cazangiu.
+- Some minor code refactoring.
+
+= 1.9.5 =
+- Added a check to show the content of a protected post/page if the admin is previewing the post or page.
+- Fixed an issue with the quick notification email feature not filtering the email shortcodes.
+- Improved the login form's HTML and CSS.
+
+= 1.9.4 =
+- Added a new feature to send an email notification to a member when you edit a user's record. This will be helpful to notify members when you activate their account.
+- Fixed an issue with "pending" member account getting set to active when the record is edited from admin side.
+
+= 1.9.3 =
+- Fixed an issue with the featured image not showing properly for some protected blog posts.
+
+= 1.9.2 =
+- Fixed the edit link in the member search interface.
+
+= 1.9.1 =
+- Added Turkish language translation to the plugin. The translation was submitted by Murat SEYISOGLU.
+- WordPrss 4.1 compatibility.
+
+= 1.9.0 =
+- Fixed a bug in the default account setting option (the option to do manual approval for membership).
+- Added Polish language translation to the plugin. The translation was submitted by Maytki.
+- Added Macedonian language translation to the plugin. The translation was submitted by I. Ivanov.
+
+= 1.8.9 =
+- Added a new feature so you can set the default account status of your members. This can useful if you want to manually approve members after they signup.
+
+= 1.8.8 =
+- Fixed an issue with the account expiry when it is set to 1 year.
+
+= 1.8.7 =
+- Updated the registration form validation code to not accept apostrophe character in the username field.
+- Added a new tab for showing addon settings options (some of the addons will be able to utilize this settings tab).
+- Added a new action hook in the addon settings tab.
+- Moved the plugin's main class initialization code outside of the plugins_loaded hook.
+
+= 1.8.6 =
+- Fixed an email validation issue with paid membership registration process.
+- Added a new free addon to customize the protected content message.
+
+= 1.8.5 =
+- Added category protection feature under the membership level menu.
+- Fixed a bug with paid membership paypal IPN processing code.
+
+= 1.8.4 =
+- The Password field won't use the browser's autofill option in the admin interface when editing a member info.
+
+= 1.8.3 =
+- Added Swedish language translation to the plugin. The translation was submitted by Geson Perry.
+- There is now a cronjob in the plugin to expire the member profiles in the background.
+- Released a new addon - https://simple-membership-plugin.com/simple-membership-registration-form-shortcode-generator/
+- Added a menu called "Add-ons" for listing all the extensions of this plugin.
+
+= 1.8.2 =
+- Updated the members expiry check code at the time of login and made it more robust.
+
+= 1.8.1 =
+- MySQL database character set and collation values are read from the system when creating the tables.
+- Added German language translation file to the plugin.
+- Some code refactoring work.
+- Added a new feature to allow admins to create a registration form for a particular membership level.
+
+= 1.8.0 =
+- Added a new feature called "more tag protection" to enable teaser content. Read the [teaser content documentation](https://simple-membership-plugin.com/creating-teaser-content-membership-site/) for more info.
+- Added Portuguese (Brazil) language translation to the plugin. The translation was submitted by Rachel Oakes.
+- Added cookiehash definition check (in case it is not defined already).
+
+= 1.7.9 =
+- Added Spanish language translation to the plugin. The translation was submitted by David Sanchez.
+- Removed some hardcoded path from the auth class.
+- WordPress 4.0 compatibility
+
+= 1.7.8 =
+- Architecture improvement for the [WP User import addon](https://simple-membership-plugin.com/import-existing-wordpress-users-simple-membership-plugin/)
+- Updated the POT file with the new translation strings
+
+= 1.7.7 =
+- The plugin will now show the member account expiry date in the login widget (when a user is logged into the site).
+- Added a couple of filters to the plugin.
+
+= 1.7.6 =
+- Fixed an issue with hiding the admin-bar. It will never be shown to non-members.
+- Renamed the chinese language file to correct the name.
+- Removed a lot of fields from the front-end registration form (after user feedback). The membership registration form is now a lot simpler with just a few fields.
+- Fixed a bug with the member search option in the admin dashboard.
+- Added a few new action hooks and filters.
+- Fixed a bug with the media attachment protection.
+
+= 1.7.5 =
+- Fixed an issue with language file loading.
+
+= 1.7.4 =
+- Added capability to use any of the shortcodes (example: Login widget) in the sidebar text widget.
+
+= 1.7.3 =
+- Added french language translation to the plugin. The translation was submitted by Zeb.
+- Fixed a few language textdomain issue.
+- Fixed an issue with the the registration and login page shortcode (On some sites the registration form wasn't visible.)
+- Added simplified Chinese language translation to the plugin. The translation was submitted by Ben.
+
+= 1.7.2 =
+- Added a new hook after the plugin's admin menu is rendered so addons can hook into the main plugin menu.
+- Fixed another PHP 5.2 code compatibility issue.
+- Fixed an issue with the bulk member delete functionality.
+
+= 1.7.1 =
+- Fixed another PHP 5.2 code compatibility issue.
+- Updated the plugin's language file template.
+
+= 1.7 =
+- Tweaked code to make it compatible with PHP 5.2 (previously PHP 5.3 was the requirement).
+- Added checks for checking if a WP user account already exists with the chosen username (when a member registers).
+- Fixed a few translation strings.
+
+= 1.6 =
+- Added comment protection. Comments on your protected posts will also be protected automatically.
+- Added a new feature to hide the admin toolbar for logged in users of the site.
+- Bug fix: password reset email not sent correctly
+- Bug fix: page rendering issue after the member updates the profile.
+
+= 1.5.1 =
+- Compatibility with the after login redirection addon:
+http://wordpress.org/plugins/simple-membership-after-login-redirection/
+
+= 1.5 =
+- Fixed a bug with sending member email when added via admin dashboard.
+- Fixed a bug with general settings values resetting.
+- Added a few action hooks to the plugin.
+
+= 1.4 =
+- Refactored some code to enhance the architecture. This will help us add some good features in the future.
+- Added debug logger to help troubleshoot after membership payment tasks.
+- Added a new action hook for after paypal IPN is processed.
+
+= 1.3 =
+- Fixed a bug with premium membership registration.
+
+= 1.2 =
+- First commit to WordPress repository.
+
+== Upgrade Notice ==
+If you are using the form builder adddon, then that addon will need to be upgraded to v1.1 also.
+
+== Arbitrary section ==
+None
diff --git a/simple-wp-membership.php b/simple-wp-membership.php
new file mode 100644
index 0000000..cbcf86f
--- /dev/null
+++ b/simple-wp-membership.php
@@ -0,0 +1,44 @@
+Settings';
+ array_unshift($links, $settings_link);
+ }
+ return $links;
+}
+add_filter('plugin_action_links', 'swpm_add_settings_link', 10, 2);
diff --git a/views/account_delete_warning.php b/views/account_delete_warning.php
new file mode 100644
index 0000000..0b796ec
--- /dev/null
+++ b/views/account_delete_warning.php
@@ -0,0 +1,16 @@
+
+
+ ' . $msg . '' ; ?>
+
+You are about to delete an account.This will delete user data associated with this account.
+It will also delete associated wordpress account.
+(NOTE: For consistency, we do not allow deleting any associated wordpress account with administrator role).
+Continue?
+
+
\ No newline at end of file
diff --git a/views/add.php b/views/add.php
new file mode 100644
index 0000000..8ab60e4
--- /dev/null
+++ b/views/add.php
@@ -0,0 +1,49 @@
+
+
diff --git a/views/admin-includes/swpm-payments-list-table.php b/views/admin-includes/swpm-payments-list-table.php
new file mode 100644
index 0000000..4c704ef
--- /dev/null
+++ b/views/admin-includes/swpm-payments-list-table.php
@@ -0,0 +1,153 @@
+ 'transaction', //singular name of the listed records
+ 'plural' => 'transactions', //plural name of the listed records
+ 'ajax' => false //does this table support ajax?
+ ));
+ }
+
+ function column_default($item, $column_name) {
+ //Just print the data for that column
+ return $item[$column_name];
+ }
+
+ function column_id($item) {
+
+ //Build row actions
+ $actions = array(
+ /* 'edit' => sprintf('Edit ', $item['id']),//TODO - Will be implemented in a future date */
+ 'delete' => sprintf('Delete ', $item['id']),
+ );
+
+ //Return the refid column contents
+ return $item['id'] . $this->row_actions($actions);
+ }
+
+ function column_cb($item) {
+ return sprintf(
+ ' ',
+ /* $1%s */ $this->_args['singular'], //Let's reuse singular label (affiliate)
+ /* $2%s */ $item['id'] //The value of the checkbox should be the record's key/id
+ );
+ }
+
+ function get_columns() {
+ $columns = array(
+ 'cb' => ' ', //Render a checkbox instead of text
+ 'id' => 'Row ID',
+ 'email' => 'Email Address',
+ 'first_name' => 'First Name',
+ 'last_name' => 'Last Name',
+ 'txn_date' => 'Date',
+ 'txn_id' => 'Transaction ID',
+ 'payment_amount' => 'Amount',
+ 'membership_level' => 'Membership Level'
+ );
+ return $columns;
+ }
+
+ function get_sortable_columns() {
+ $sortable_columns = array(
+ 'id' => array('id', false), //true means its already sorted
+ 'membership_level' => array('membership_level', false),
+ );
+ return $sortable_columns;
+ }
+
+ function get_bulk_actions() {
+ $actions = array(
+ 'delete' => 'Delete'
+ );
+ return $actions;
+ }
+
+ function process_bulk_action() {
+ //Detect when a bulk action is being triggered... //print_r($_GET);
+ if ('delete' === $this->current_action()) {
+ $records_to_delete = $_GET['transaction'];
+ if (empty($records_to_delete)) {
+ echo 'Error! You need to select multiple records to perform a bulk action!
';
+ return;
+ }
+ foreach ($records_to_delete as $record_id) {
+ global $wpdb;
+ $payments_table_name = $wpdb->prefix . "swpm_payments_tbl";
+ $updatedb = "DELETE FROM $payments_table_name WHERE id='$record_id'";
+ $results = $wpdb->query($updatedb);
+ }
+ echo 'Selected records deleted successfully!
';
+ }
+ }
+
+ function delete_record($record_id) {
+ global $wpdb;
+ $payments_table_name = $wpdb->prefix . "swpm_payments_tbl";
+ $delete_command = "DELETE FROM " . $payments_table_name . " WHERE id = '$record_id'";
+ $result = $wpdb->query($delete_command);
+ }
+
+ function prepare_items() {
+
+ // Lets decide how many records per page to show
+ $per_page = 50;
+
+ $columns = $this->get_columns();
+ $hidden = array();
+ $sortable = $this->get_sortable_columns();
+
+ $this->_column_headers = array($columns, $hidden, $sortable);
+
+ $this->process_bulk_action();
+
+ // This checks for sorting input and sorts the data.
+ $orderby_column = isset($_GET['orderby']) ? $_GET['orderby'] : '';
+ $sort_order = isset($_GET['order']) ? $_GET['order'] : '';
+ if (empty($orderby_column)) {
+ $orderby_column = "id";
+ $sort_order = "DESC";
+ }
+ global $wpdb;
+ $payments_table_name = $wpdb->prefix . "swpm_payments_tbl";
+
+ //pagination requirement
+ $current_page = $this->get_pagenum();
+
+ if (isset($_POST['swpm_txn_search'])) {//Only load the searched records
+ $search_term = trim(strip_tags($_POST['swpm_txn_search']));
+ $prepare_query = $wpdb->prepare("SELECT * FROM " . $payments_table_name . " WHERE `email` LIKE '%%%s%%' OR `txn_id` LIKE '%%%s%%' OR `first_name` LIKE '%%%s%%' OR `last_name` LIKE '%%%s%%'", $search_term, $search_term, $search_term, $search_term);
+ $data = $wpdb->get_results($prepare_query, ARRAY_A);
+ $total_items = count($data);
+ } else {//Load all data in an optimized way (so it is only loading data for the current page)
+ $query = "SELECT COUNT(*) FROM $payments_table_name";
+ $total_items = $wpdb->get_var($query);
+
+ //pagination requirement
+ $query = "SELECT * FROM $payments_table_name ORDER BY $orderby_column $sort_order";
+
+ $offset = ($current_page - 1) * $per_page;
+ $query.=' LIMIT ' . (int) $offset . ',' . (int) $per_page;
+
+ $data = $wpdb->get_results($query, ARRAY_A);
+ }
+
+ // Now we add our *sorted* data to the items property, where it can be used by the rest of the class.
+ $this->items = $data;
+
+ //pagination requirement
+ $this->set_pagination_args(array(
+ 'total_items' => $total_items, //WE have to calculate the total number of items
+ 'per_page' => $per_page, //WE have to determine how many items to show on a page
+ 'total_pages' => ceil($total_items / $per_page) //WE have to calculate the total number of pages
+ ));
+ }
+
+}
diff --git a/views/admin_add.php b/views/admin_add.php
new file mode 100644
index 0000000..c851a2d
--- /dev/null
+++ b/views/admin_add.php
@@ -0,0 +1,48 @@
+
+
diff --git a/views/admin_add_level.php b/views/admin_add_level.php
new file mode 100644
index 0000000..8be0124
--- /dev/null
+++ b/views/admin_add_level.php
@@ -0,0 +1,47 @@
+
+
+
diff --git a/views/admin_add_ons_page.php b/views/admin_add_ons_page.php
new file mode 100644
index 0000000..68756c9
--- /dev/null
+++ b/views/admin_add_ons_page.php
@@ -0,0 +1,95 @@
+' . "\n";
+?>
+
+
+
+
+ 'After Login Redirection',
+ 'thumbnail' => SIMPLE_WP_MEMBERSHIP_URL . '/images/addons/swpm-login-redirection.png',
+ 'description' => 'Allows you to configure after login redirection to a specific page based on the member\'s level',
+ 'page_url' => 'https://simple-membership-plugin.com/configure-login-redirection-members/',
+ );
+ array_push($addons_data, $addon_1);
+
+ $addon_2 = array(
+ 'name' => 'MailChimp Integration',
+ 'thumbnail' => SIMPLE_WP_MEMBERSHIP_URL . '/images/addons/mailchimp-integration.png',
+ 'description' => 'Allows you to signup the member to your MailChimp list after registration',
+ 'page_url' => 'https://simple-membership-plugin.com/signup-members-mailchimp-list/',
+ );
+ array_push($addons_data, $addon_2);
+
+ $addon_3 = array(
+ 'name' => 'Form Shortcode',
+ 'thumbnail' => SIMPLE_WP_MEMBERSHIP_URL . '/images/addons/form-shortcode-generator.png',
+ 'description' => 'Simple Membership Addon to generate form shortcode for specific membership level.',
+ 'page_url' => 'https://simple-membership-plugin.com/simple-membership-registration-form-shortcode-generator/',
+ );
+ array_push($addons_data, $addon_3);
+
+ $addon_4 = array(
+ 'name' => 'WP User Import',
+ 'thumbnail' => SIMPLE_WP_MEMBERSHIP_URL . '/images/addons/wp-user-import.png',
+ 'description' => 'Addon for importing existing Wordpress users to Simple Membership plugin',
+ 'page_url' => 'https://simple-membership-plugin.com/import-existing-wordpress-users-simple-membership-plugin/',
+ );
+ array_push($addons_data, $addon_4);
+
+ $addon_5 = array(
+ 'name' => 'Form Builder',
+ 'thumbnail' => SIMPLE_WP_MEMBERSHIP_URL . '/images/addons/swpm-form-builder.png',
+ 'description' => 'Allows you to fully customize the fields that appear on the registration and edit profile forms of your membership site',
+ 'page_url' => 'https://simple-membership-plugin.com/simple-membership-form-builder-addon/',
+ );
+ array_push($addons_data, $addon_5);
+
+ $addon_6 = array(
+ 'name' => 'Custom Messages',
+ 'thumbnail' => SIMPLE_WP_MEMBERSHIP_URL . '/images/addons/swpm-custom-messages.png',
+ 'description' => 'Custom Messages addon allows you to customize the content protection message that gets output from the membership plugin',
+ 'page_url' => 'https://simple-membership-plugin.com/simple-membership-custom-messages-addon/',
+ );
+ array_push($addons_data, $addon_6);
+
+ $addon_7 = array(
+ 'name' => 'Protect Older Posts',
+ 'thumbnail' => SIMPLE_WP_MEMBERSHIP_URL . '/images/addons/swpm-older-posts-protection.png',
+ 'description' => 'The protect older posts addon allows you to control protection of posts that were published before a member\'s access start date.',
+ 'page_url' => 'https://simple-membership-plugin.com/simple-membership-protect-older-posts-addon/',
+ );
+ array_push($addons_data, $addon_7);
+
+ foreach ($addons_data as $addon) {
+ $output .= '
';
+
+ $output .= '
';
+ $img_src = $addon['thumbnail'];
+ $output .= '
';
+ $output .= '
'; //end thumbnail
+
+ $output .='
';
+ $output .='
'; //end name
+
+ $output .='
';
+ $output .= $addon['description'];
+ $output .='
'; //end description
+
+ $output .='
'; //end detils link
+ $output .='
'; //end body
+
+ $output .= '
'; //end canvas
+ }
+
+ echo $output;
+ ?>
+
+
\ No newline at end of file
diff --git a/views/admin_addon_settings.php b/views/admin_addon_settings.php
new file mode 100644
index 0000000..794534c
--- /dev/null
+++ b/views/admin_addon_settings.php
@@ -0,0 +1,14 @@
+
+
+
\ No newline at end of file
diff --git a/views/admin_category_list.php b/views/admin_category_list.php
new file mode 100644
index 0000000..55ee07e
--- /dev/null
+++ b/views/admin_category_list.php
@@ -0,0 +1,34 @@
+
+
diff --git a/views/admin_edit.php b/views/admin_edit.php
new file mode 100644
index 0000000..93812f6
--- /dev/null
+++ b/views/admin_edit.php
@@ -0,0 +1,73 @@
+
+
diff --git a/views/admin_edit_level.php b/views/admin_edit_level.php
new file mode 100644
index 0000000..79a9bfb
--- /dev/null
+++ b/views/admin_edit_level.php
@@ -0,0 +1,49 @@
+
+
diff --git a/views/admin_member_form_common_js.php b/views/admin_member_form_common_js.php
new file mode 100644
index 0000000..e88878f
--- /dev/null
+++ b/views/admin_member_form_common_js.php
@@ -0,0 +1,6 @@
+
diff --git a/views/admin_member_form_common_part.php b/views/admin_member_form_common_part.php
new file mode 100644
index 0000000..55626cd
--- /dev/null
+++ b/views/admin_member_form_common_part.php
@@ -0,0 +1,60 @@
+
+
+
+
+ value="">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/views/admin_members.php b/views/admin_members.php
new file mode 100644
index 0000000..55f25d2
--- /dev/null
+++ b/views/admin_members.php
@@ -0,0 +1,21 @@
+
+
+
+
+ prepare_items(); ?>
+
+
+
+
+
+
diff --git a/views/admin_membership_level_menu.php b/views/admin_membership_level_menu.php
new file mode 100644
index 0000000..7f1062d
--- /dev/null
+++ b/views/admin_membership_level_menu.php
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/views/admin_membership_levels.php b/views/admin_membership_levels.php
new file mode 100644
index 0000000..3b14277
--- /dev/null
+++ b/views/admin_membership_levels.php
@@ -0,0 +1,23 @@
+
+
+
+
+
+ prepare_items(); ?>
+
+
+
+
+
+
+
diff --git a/views/admin_membership_manage.php b/views/admin_membership_manage.php
new file mode 100644
index 0000000..82ca51e
--- /dev/null
+++ b/views/admin_membership_manage.php
@@ -0,0 +1,22 @@
+
+
Simple WP Membership::Manage Protection
+
+
+
+
How to Apply Content Protection
+
+
Take the following steps to apply protection your content so only members can have access to it.
+
+1. Edit the Post or Page that you want to protect in WordPress editor.
+
2. Scroll down to the section titled 'Simple WP Membership Protection'.
+
3. Select 'Yes, Protect this content' option.
+
4. Check the membership levels that should have access to that page's content.
+
5. Hit the Update/Save Button to save the changes.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/views/admin_payment_settings.php b/views/admin_payment_settings.php
new file mode 100644
index 0000000..7d07c6c
--- /dev/null
+++ b/views/admin_payment_settings.php
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+prepare("SELECT * FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id !=1 AND id =%d", $mem_level);
+ $membership_level_resultset = $wpdb->get_row($query);
+ if($membership_level_resultset){
+ $pp_av_code = 'notify_url='.$paypal_ipn_url.'
'.'custom=subsc_ref='.$mem_level;
+ echo '
';
+ echo 'Paste the code below in the "Add advanced variables" field of your PayPal button for membership level '.$mem_level.' ';
+ echo ''.$pp_av_code.'
';
+ echo '
';
+ }
+ else{
+ echo '
';
+ BUtils::e( 'Error! The membership level ID ('.$mem_level.') you specified is incorrect. Please check this value again.');
+ echo '
';
+ }
+}
+?>
+
+
+
+
diff --git a/views/admin_payments_page.php b/views/admin_payments_page.php
new file mode 100644
index 0000000..2c96b8a
--- /dev/null
+++ b/views/admin_payments_page.php
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
Search Transaction
+
+
+
+
+
+
+ delete_record($record_id);
+ $success_msg = '
';
+ $success_msg .= BUtils::_('The selected entry was deleted!');
+ $success_msg .= '
';
+ echo $success_msg;
+ }
+ }
+
+ //Fetch, prepare, sort, and filter our data...
+ $payments_list_table->prepare_items();
+
+ ?>
+
+
+
+
\ No newline at end of file
diff --git a/views/admin_settings.php b/views/admin_settings.php
new file mode 100644
index 0000000..971c78f
--- /dev/null
+++ b/views/admin_settings.php
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/views/admin_tools_settings.php b/views/admin_tools_settings.php
new file mode 100644
index 0000000..a0ba947
--- /dev/null
+++ b/views/admin_tools_settings.php
@@ -0,0 +1,42 @@
+
+
+
diff --git a/views/edit.php b/views/edit.php
new file mode 100644
index 0000000..e955dac
--- /dev/null
+++ b/views/edit.php
@@ -0,0 +1,71 @@
+
+
\ No newline at end of file
diff --git a/views/forgot_password.php b/views/forgot_password.php
new file mode 100644
index 0000000..05b6ed4
--- /dev/null
+++ b/views/forgot_password.php
@@ -0,0 +1,17 @@
+
diff --git a/views/index.html b/views/index.html
new file mode 100644
index 0000000..e69de29
diff --git a/views/join_us.php b/views/join_us.php
new file mode 100644
index 0000000..e69de29
diff --git a/views/loggedin.php b/views/loggedin.php
new file mode 100644
index 0000000..6fdf6b1
--- /dev/null
+++ b/views/loggedin.php
@@ -0,0 +1,21 @@
+
\ No newline at end of file
diff --git a/views/login.php b/views/login.php
new file mode 100644
index 0000000..f7a8638
--- /dev/null
+++ b/views/login.php
@@ -0,0 +1,34 @@
+
diff --git a/views/login_widget.php b/views/login_widget.php
new file mode 100644
index 0000000..c64cf72
--- /dev/null
+++ b/views/login_widget.php
@@ -0,0 +1,16 @@
+
+
diff --git a/views/login_widget_logged.php b/views/login_widget_logged.php
new file mode 100644
index 0000000..2b21776
--- /dev/null
+++ b/views/login_widget_logged.php
@@ -0,0 +1,18 @@
+
+
+
+ get('user_name');?>
+
+
+ get('account_state'));?>
+
+
+ get('alias');?>
+
+
+ get_expire_date();?>
+
+
+ = BUtils::_('Logout')?>
+
+
\ No newline at end of file