as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. More about this license: http://www.question2answer.org/license.php */ require_once QA_INCLUDE_DIR . 'qa-app-users.php'; require_once QA_INCLUDE_DIR . 'qa-app-cookies.php'; require_once QA_INCLUDE_DIR . 'qa-app-favorites.php'; require_once QA_INCLUDE_DIR . 'qa-app-format.php'; $entitytype = qa_post_text('entitytype'); $entityid = qa_post_text('entityid'); $setfavorite = qa_post_text('favorite'); $userid = qa_get_logged_in_userid(); if (!qa_check_form_security_code('favorite-' . $entitytype . '-' . $entityid, qa_post_text('code'))) { echo "QA_AJAX_RESPONSE\n0\n" . qa_lang('misc/form_security_reload'); } elseif (isset($userid)) { $cookieid = qa_cookie_get(); qa_user_favorite_set($userid, qa_get_logged_in_handle(), $cookieid, $entitytype, $entityid, $setfavorite); $favoriteform = qa_favorite_form($entitytype, $entityid, $setfavorite, qa_lang($setfavorite ? 'main/remove_favorites' : 'main/add_favorites')); $themeclass = qa_load_theme_class(qa_get_site_theme(), 'ajax-favorite', null, null); echo "QA_AJAX_RESPONSE\n1\n"; $themeclass->favorite_inner_html($favoriteform); } /* Omit PHP closing tag to help avoid accidental output */
$parentid = qa_post_text('parentid'); $userid = qa_get_logged_in_userid(); list($comment, $question, $parent, $children) = qa_db_select_with_pending(qa_db_full_post_selectspec($userid, $commentid), qa_db_full_post_selectspec($userid, $questionid), qa_db_full_post_selectspec($userid, $parentid), qa_db_full_child_posts_selectspec($userid, $parentid)); // Check if there was an operation that succeeded if (@$comment['basetype'] == 'C' && @$question['basetype'] == 'Q' && (@$parent['basetype'] == 'Q' || @$parent['basetype'] == 'A')) { $comment = $comment + qa_page_q_post_rules($comment, $parent, $children, null); // array union if (qa_page_q_single_click_c($comment, $question, $parent, $error)) { $comment = qa_db_select_with_pending(qa_db_full_post_selectspec($userid, $commentid)); // If so, page content to be updated via Ajax echo "QA_AJAX_RESPONSE\n1"; // If the comment was not deleted... if (isset($comment)) { $parent = $parent + qa_page_q_post_rules($parent, $questionid == $parentid ? null : $question, null, $children); // in theory we should retrieve the parent's siblings for the above, but they're not going to be relevant $comment = $comment + qa_page_q_post_rules($comment, $parent, $children, null); $usershtml = qa_userids_handles_html(array($comment), true); $c_view = qa_page_q_comment_view($question, $parent, $comment, $usershtml, false); $themeclass = qa_load_theme_class(qa_get_site_theme(), 'ajax-comment', null, null); // ... send back the HTML for it echo "\n"; $themeclass->c_list_item($c_view); } return; } } echo "QA_AJAX_RESPONSE\n0\n"; // fall back to non-Ajax submission if something failed /* Omit PHP closing tag to help avoid accidental output */
require_once QA_INCLUDE_DIR . 'app/users.php'; require_once QA_INCLUDE_DIR . 'app/cookies.php'; require_once QA_INCLUDE_DIR . 'db/selects.php'; $message = qa_post_text('message'); $tohandle = qa_post_text('handle'); $morelink = qa_post_text('morelink'); $touseraccount = qa_db_select_with_pending(qa_db_user_account_selectspec($tohandle, false)); $loginuserid = qa_get_logged_in_userid(); $errorhtml = qa_wall_error_html($loginuserid, $touseraccount['userid'], $touseraccount['flags']); if ($errorhtml || !strlen($message) || !qa_check_form_security_code('wall-' . $tohandle, qa_post_text('code'))) { echo "QA_AJAX_RESPONSE\n0"; } else { $messageid = qa_wall_add_post($loginuserid, qa_get_logged_in_handle(), qa_cookie_get(), $touseraccount['userid'], $touseraccount['handle'], $message, ''); $touseraccount['wallposts']++; // won't have been updated $usermessages = qa_db_select_with_pending(qa_db_recent_messages_selectspec(null, null, $touseraccount['userid'], true, qa_opt('page_size_wall'))); $usermessages = qa_wall_posts_add_rules($usermessages, 0); $themeclass = qa_load_theme_class(qa_get_site_theme(), 'wall', null, null); echo "QA_AJAX_RESPONSE\n1\n"; echo 'm' . $messageid . "\n"; // element in list to be revealed foreach ($usermessages as $message) { $themeclass->message_item(qa_wall_post_view($message)); } if ($morelink && $touseraccount['wallposts'] > count($usermessages)) { $themeclass->message_item(qa_wall_view_more_link($tohandle, count($usermessages))); } } /* Omit PHP closing tag to help avoid accidental output */
*/ require_once QA_INCLUDE_DIR . 'qa-app-users.php'; require_once QA_INCLUDE_DIR . 'qa-app-cookies.php'; require_once QA_INCLUDE_DIR . 'qa-app-votes.php'; require_once QA_INCLUDE_DIR . 'qa-app-format.php'; require_once QA_INCLUDE_DIR . 'qa-app-options.php'; require_once QA_INCLUDE_DIR . 'qa-db-selects.php'; $postid = qa_post_text('postid'); $vote = qa_post_text('vote'); $code = qa_post_text('code'); $userid = qa_get_logged_in_userid(); $cookieid = qa_cookie_get(); if (!qa_check_form_security_code('vote', $code)) { $voteerror = qa_lang_html('misc/form_security_reload'); } else { $post = qa_db_select_with_pending(qa_db_full_post_selectspec($userid, $postid)); $voteerror = qa_vote_error_html($post, $vote, $userid, qa_request()); } if ($voteerror === false) { qa_vote_set($post, $userid, qa_get_logged_in_handle(), $cookieid, $vote); $post = qa_db_select_with_pending(qa_db_full_post_selectspec($userid, $postid)); $fields = qa_post_html_fields($post, $userid, $cookieid, array(), null, array('voteview' => qa_get_vote_view($post, true))); $themeclass = qa_load_theme_class(qa_get_site_theme(), 'voting', null, null); echo "QA_AJAX_RESPONSE\n1\n"; $themeclass->voting_inner_html($fields); } else { echo "QA_AJAX_RESPONSE\n0\n" . $voteerror; } /* Omit PHP closing tag to help avoid accidental output */
$userid = qa_get_logged_in_userid(); list($question, $childposts) = qa_db_select_with_pending(qa_db_full_post_selectspec($userid, $questionid), qa_db_full_child_posts_selectspec($userid, $questionid)); if (@$question['basetype'] == 'Q' && !isset($question['closedbyid'])) { $answers = qa_page_q_load_as($question, $childposts); // Try to create the new answer $answerid = qa_page_q_add_a_submit($question, $answers, $usecaptcha, $in, $errors); $countanswers = $question['acount'] + 1; if (isset($answerid)) { // If successful, page content will be updated via Ajax $answer = qa_db_select_with_pending(qa_db_full_post_selectspec($userid, $answerid)); $question = $question + qa_page_q_post_rules($question, null, null, $childposts); // array union $answer = $answer + qa_page_q_post_rules($answer, $question, $answers, null); $usershtml = qa_userids_handles_html(array($answer), true); $a_view = qa_page_q_answer_view($question, $answer, false, $usershtml, false); $themeclass = qa_load_theme_class(qa_get_site_theme(), 'ajax-answer', null, null); echo "QA_AJAX_RESPONSE\n1\n"; // Send back whether the 'answer' button should still be visible echo (int) qa_opt('allow_multi_answers') . "\n"; // Send back the count of answers if ($countanswers == 1) { echo qa_lang_html('question/1_answer_title') . "\n"; } else { echo qa_lang_html_sub('question/x_answers_title', $countanswers) . "\n"; } // Send back the HTML $themeclass->a_list_item($a_view); return; } } }
/** * Output the $qa_content via the theme class after doing some pre-processing, mainly relating to Javascript */ function qa_output_content($qa_content) { if (qa_to_override(__FUNCTION__)) { $args = func_get_args(); return qa_call_override(__FUNCTION__, $args); } global $qa_template; $requestlower = strtolower(qa_request()); // Set appropriate selected flags for navigation (not done in qa_content_prepare() since it also applies to sub-navigation) foreach ($qa_content['navigation'] as $navtype => $navigation) { if (!is_array($navigation) || $navtype == 'cat') { continue; } foreach ($navigation as $navprefix => $navlink) { $selected =& $qa_content['navigation'][$navtype][$navprefix]['selected']; if (isset($navlink['selected_on'])) { // match specified paths foreach ($navlink['selected_on'] as $path) { if (strpos($requestlower . '$', $path) === 0) { $selected = true; } } } elseif ($requestlower === $navprefix || $requestlower . '$' === $navprefix) { // exact match for array key $selected = true; } } } // Slide down notifications if (!empty($qa_content['notices'])) { foreach ($qa_content['notices'] as $notice) { $qa_content['script_onloads'][] = array("qa_reveal(document.getElementById(" . qa_js($notice['id']) . "), 'notice');"); } } // Handle maintenance mode if (qa_opt('site_maintenance') && $requestlower != 'login') { if (qa_get_logged_in_level() >= QA_USER_LEVEL_ADMIN) { if (!isset($qa_content['error'])) { $qa_content['error'] = strtr(qa_lang_html('admin/maintenance_admin_only'), array('^1' => '<a href="' . qa_path_html('admin/general') . '">', '^2' => '</a>')); } } else { $qa_content = qa_content_prepare(); $qa_content['error'] = qa_lang_html('misc/site_in_maintenance'); } } // Handle new users who must confirm their email now, or must be approved before continuing $userid = qa_get_logged_in_userid(); if (isset($userid) && $requestlower != 'confirm' && $requestlower != 'account') { $flags = qa_get_logged_in_flags(); if ($flags & QA_USER_FLAGS_MUST_CONFIRM && !($flags & QA_USER_FLAGS_EMAIL_CONFIRMED) && qa_opt('confirm_user_emails')) { $qa_content = qa_content_prepare(); $qa_content['title'] = qa_lang_html('users/confirm_title'); $qa_content['error'] = strtr(qa_lang_html('users/confirm_required'), array('^1' => '<a href="' . qa_path_html('confirm') . '">', '^2' => '</a>')); } elseif ($flags & QA_USER_FLAGS_MUST_APPROVE && qa_get_logged_in_level() < QA_USER_LEVEL_APPROVED && qa_opt('moderate_users')) { $qa_content = qa_content_prepare(); $qa_content['title'] = qa_lang_html('users/approve_title'); $qa_content['error'] = strtr(qa_lang_html('users/approve_required'), array('^1' => '<a href="' . qa_path_html('account') . '">', '^2' => '</a>')); } } // Combine various Javascript elements in $qa_content into single array for theme layer $script = array('<script>'); if (isset($qa_content['script_var'])) { foreach ($qa_content['script_var'] as $var => $value) { $script[] = 'var ' . $var . ' = ' . qa_js($value) . ';'; } } if (isset($qa_content['script_lines'])) { foreach ($qa_content['script_lines'] as $scriptlines) { $script[] = ''; $script = array_merge($script, $scriptlines); } } if (isset($qa_content['focusid'])) { $qa_content['script_onloads'][] = array("var elem = document.getElementById(" . qa_js($qa_content['focusid']) . ");", "if (elem) {", "\telem.select();", "\telem.focus();", "}"); } if (isset($qa_content['script_onloads'])) { array_push($script, '', 'var qa_oldonload = window.onload;', 'window.onload = function() {', "\tif (typeof qa_oldonload == 'function')", "\t\tqa_oldonload();"); foreach ($qa_content['script_onloads'] as $scriptonload) { $script[] = "\t"; foreach ((array) $scriptonload as $scriptline) { $script[] = "\t" . $scriptline; } } $script[] = '};'; } $script[] = '</script>'; if (isset($qa_content['script_rel'])) { $uniquerel = array_unique($qa_content['script_rel']); // remove any duplicates foreach ($uniquerel as $script_rel) { $script[] = '<script src="' . qa_html(qa_path_to_root() . $script_rel) . '"></script>'; } } if (isset($qa_content['script_src'])) { $uniquesrc = array_unique($qa_content['script_src']); // remove any duplicates foreach ($uniquesrc as $script_src) { $script[] = '<script src="' . qa_html($script_src) . '"></script>'; } } $qa_content['script'] = $script; // Load the appropriate theme class and output the page $tmpl = substr($qa_template, 0, 7) == 'custom-' ? 'custom' : $qa_template; $themeclass = qa_load_theme_class(qa_get_site_theme(), $tmpl, $qa_content, qa_request()); $themeclass->initialize(); header('Content-type: ' . $qa_content['content_type']); $themeclass->doctype(); $themeclass->html(); $themeclass->finish(); }
require_once QA_INCLUDE_DIR . 'qa-app-users.php'; require_once QA_INCLUDE_DIR . 'qa-app-cookies.php'; require_once QA_INCLUDE_DIR . 'qa-app-votes.php'; require_once QA_INCLUDE_DIR . 'qa-app-format.php'; require_once QA_INCLUDE_DIR . 'qa-app-options.php'; require_once QA_INCLUDE_DIR . 'qa-db-selects.php'; function qa_ajax_vote_db_fail_handler() { echo "QA_AJAX_RESPONSE\n0\nA database error occurred."; exit; } qa_base_db_connect('qa_ajax_vote_db_fail_handler'); $postid = qa_post_text('postid'); $qa_login_userid = qa_get_logged_in_userid(); $qa_cookieid = qa_cookie_get(); $post = qa_db_select_with_pending(qa_db_full_post_selectspec($qa_login_userid, $postid)); $voteerror = qa_vote_error_html($post, $qa_login_userid, $qa_request); if ($voteerror === false) { qa_vote_set($post, $qa_login_userid, qa_get_logged_in_handle(), $qa_cookieid, qa_post_text('vote')); $post = qa_db_select_with_pending(qa_db_full_post_selectspec($qa_login_userid, $postid)); $fields = qa_post_html_fields($post, $qa_login_userid, $qa_cookieid, array(), null, array('voteview' => qa_opt('votes_separated') ? 'updown' : 'net')); $themeclass = qa_load_theme_class(qa_opt('site_theme'), 'voting', null, null); echo "QA_AJAX_RESPONSE\n1\n"; $themeclass->voting_inner_html($fields); } else { echo "QA_AJAX_RESPONSE\n0\n" . $voteerror; } qa_base_db_disconnect(); /* Omit PHP closing tag to help avoid accidental output */
$script[] = '//--></SCRIPT>'; if (isset($qa_content['script_rel'])) { $uniquerel = array_unique($qa_content['script_rel']); // remove any duplicates foreach ($uniquerel as $script_rel) { $script[] = '<SCRIPT SRC="' . qa_html($qa_root_url_relative . $script_rel) . '" TYPE="text/javascript"></SCRIPT>'; } } if (isset($qa_content['script_src'])) { foreach ($qa_content['script_src'] as $script_src) { $script[] = '<SCRIPT SRC="' . qa_html($script_src) . '" TYPE="text/javascript"></SCRIPT>'; } } $qa_content['script'] = $script; // Load the appropriate theme class and output the page $themeclass = qa_load_theme_class(qa_opt('site_theme'), $qa_template, $qa_content, $qa_request); header('Content-type: ' . $qa_content['content_type']); $themeclass->doctype(); $themeclass->html(); $themeclass->finish(); // End of output phase if (QA_DEBUG_PERFORMANCE) { qa_usage_mark('theme'); } // Increment question view counter (do at very end so page can be output first) if (isset($qa_content['inc_views_postid'])) { require_once QA_INCLUDE_DIR . 'qa-db-hotness.php'; qa_db_hotness_update($qa_content['inc_views_postid'], null, true); if (QA_DEBUG_PERFORMANCE) { qa_usage_mark('stats'); }
break; } $exampletags[] = $tag; if (count($exampletags) >= $maxcount) { break; } } } else { $exampletags = array(); } // Output the response header and example tags echo "QA_AJAX_RESPONSE\n1\n"; echo strtr(qa_html(implode(',', $exampletags)), "\r\n", ' ') . "\n"; // Collect and output the list of related questions if ($doaskcheck) { $minscore = qa_match_to_min_score(qa_opt('match_ask_check_qs')); $maxcount = qa_opt('page_size_ask_check_qs'); $relatedquestions = array_slice($relatedquestions, 0, $maxcount); $limitedquestions = array(); foreach ($relatedquestions as $question) { if ($question['score'] < $minscore) { break; } $limitedquestions[] = $question; } $themeclass = qa_load_theme_class(qa_get_site_theme(), 'ajax-asktitle', null, null); $themeclass->q_ask_similar($limitedquestions, qa_lang_html('question/ask_same_q')); } /* Omit PHP closing tag to help avoid accidental output */