<?php
/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 4.0.5
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2010 vBulletin Solutions Inc. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/
// ######################## SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);
// ##################### DEFINE IMPORTANT CONSTANTS #######################
define('CVS_REVISION', '$RCSfile$ - $Revision: 37230 $');
// #################### PRE-CACHE TEMPLATES AND DATA ######################
$phrasegroups = array('advertising', 'notice');
$specialtemplates = array();
// ########################## REQUIRE BACK-END ############################
require_once('./global.php');
// ############################# LOG ACTION ###############################
if (!can_administer('canadminads'))
{
print_cp_no_permission();
}
$vbulletin->input->clean_array_gpc('r', array('adid' => TYPE_UINT));
log_admin_action($vbulletin->GPC['adid'] != 0 ? "ad id = " . $vbulletin->GPC['adid'] : '');
// ########################################################################
// ######################### START MAIN SCRIPT ############################
// ########################################################################
print_cp_header($vbphrase['advertising']);
if (!in_array($_REQUEST['do'], array('add', 'edit', 'update', 'delete', 'remove', 'locate', 'flipcoin')))
{
if (!empty($_REQUEST['adid']))
{
$_REQUEST['do'] = 'edit';
}
else
{
$_REQUEST['do'] = 'modify';
}
}
// initialize some data storage
$ad_locations = array(); //not used, repurposing to hold map of location_key => location data
$ad_cache = array();
$ad_name_cache = array();
// we don't want this if we're in modify (the listing view), and maybe other views to come
if (in_array($_REQUEST['do'], array('add', 'edit', 'update', 'remove', 'locate')))
{
require_once(DIR . '/includes/class_xml.php');
$locfiles = array();
if ($handle = @opendir(DIR . '/includes/xml/'))
{
while (($file = readdir($handle)) !== false)
{
if (!preg_match('#^ad_locations_(.*).xml$#i', $file, $matches))
{
continue;
}
$loc_key = preg_replace('#[^a-z0-9]#i', '', $matches[1]);
$locfiles["$loc_key"] = $file;
}
closedir($handle);
}
if (empty($locfiles['vbulletin'])) // opendir failed or ad_locations_vbulletin.xml is missing
{
if (is_readable(DIR . '/includes/xml/ad_locations_vbulletin.xml'))
{
$locfiles['vbulletin'] = 'ad_locations_vbulletin.xml';
}
else
{
echo construct_phrase($vbphrase['could_not_open_x'], DIR . '/includes/xml/ad_locations_vbulletin.xml');
exit;
}
}
// sort location groups and locations
$locgroups = array();
foreach ($locfiles AS $loc_file => $file)
{
$xmlobj = new vB_XML_Parser(false, DIR . "/includes/xml/$file");
$xml = $xmlobj->parse();
if ($xml['product'] AND empty($vbulletin->products[$xml['product']]))
{
// attached to a specific product and that product isn't enabled
continue;
}
if (!is_array($xml['locationgroup'][0]))
{
$xml['locationgroup'] = array($xml['locationgroup']);
}
$xmlgroups = $xml['locationgroup'];
foreach ($xmlgroups AS $xmlgroup)
{
$locations = array();
if(!is_array($xmlgroup['location'][0]))
{
$xmlgroup['location'] = array($xmlgroup['location']);
}
$xmllocations = $xmlgroup['location'];
foreach ($xmllocations AS $xmllocation)
{
$xmllocation['displayorder'] = intval($xmllocation['displayorder']);
$xmllocation['cp_width'] = intval($xmllocation['cp_width']);
$xmllocation['cp_height'] = intval($xmllocation['cp_height']);
$xmllocation['cp_xpos'] = intval($xmllocation['cp_xpos']);
$xmllocation['cp_ypos'] = intval($xmllocation['cp_ypos']);
$xmllocation['product'] = $xml['product'];
// add in order
while (isset($locations[$xmllocation['displayorder']]))
{
$xmllocation['displayorder']++;
}
$locations[$xmllocation['displayorder']] = $xmllocation;
$ad_locations[$xmlgroup['key'] . '_' . $xmllocation['key']] = $xmllocation;
}
ksort($locations);
$xmlgroup['location'] = $locations;
// add in order
$xmlgroup['displayorder'] = intval($xmlgroup['displayorder']);
while (isset($locgroups[$xmlgroup['displayorder']]))
{
$xmlgroup['displayorder']++;
}
$locgroups[$xmlgroup['displayorder']] = $xmlgroup;
}
ksort($locgroups);
}
unset($locfiles, $file, $xmlobj, $xml, $xmlgroups, $locations);
// create options
if ($_REQUEST['do'] == 'add' OR $_REQUEST['do'] == 'edit')
{
foreach ($locgroups AS $locgroup)
{
foreach ($locgroup['location'] AS $location)
{
$location_options[$vbphrase['locationgroup_' . $locgroup['key']]]["$locgroup[key]_$location[key]"] = $vbphrase["adlocation_$locgroup[key]_$location[key]"];
}
}
}
else if ($_REQUEST['do'] == 'locate')
{
foreach($locgroups AS $locgroup)
{
$location_options[$locgroup['key']] = $vbphrase['locationgroup_' . $locgroup['key']];
}
}
// cache all ads
$ad_result = $db->query_read("SELECT * FROM " . TABLE_PREFIX . "ad ORDER BY displayorder");
$max_displayorder = 0;
while ($ad = $db->fetch_array($ad_result))
{
$ad_cache["$ad[adid]"] = $ad;
if ($ad['adid'] != $vbulletin->GPC['adid'])
{
$ad_name_cache["$ad[adid]"] = $ad['title'];
}
if ($ad['displayorder'] > $max_displayorder)
{
$max_displayorder = $ad['displayorder'];
}
}
$db->free_result($ad_result);
}
// #############################################################################
// edit an ad
if ($_REQUEST['do'] == 'edit' OR $_REQUEST['do'] == 'add')
{
$vbulletin->input->clean_array_gpc('r', array(
'ad_location' => TYPE_NOHTML,
'ad_location_orig' => TYPE_NOHTML
));
// set some default values
$ad = array(
'displayorder' => $max_displayorder + 10,
'active' => true,
);
$table_title = $vbphrase['add_new_ad'];
$criteria_cache = array();
// are we editing or adding?
if ($vbulletin->GPC['adid'] AND !empty($ad_cache[$vbulletin->GPC['adid']]))
{
// edit existing ad
$ad = $ad_cache[$vbulletin->GPC['adid']];
$criteria_result = $db->query_read("SELECT * FROM " . TABLE_PREFIX . "adcriteria WHERE adid = " . $vbulletin->GPC['adid']);
while ($criteria = $db->fetch_array($criteria_result))
{
$criteria_cache["$criteria[criteriaid]"] = $criteria;
}
$db->free_result($criteria);
$table_title = $vbphrase['edit_ad'] . " <span class=\"normal\">$ad[title]</span>";
}
// build list of usergroup titles
$usergroup_options = array();
foreach ($vbulletin->usergroupcache AS $usergroupid => $usergroup)
{
$usergroup_options["$usergroupid"] = $usergroup['title'];
}
// build list of style names
require_once(DIR . '/includes/adminfunctions_template.php');
cache_styles();
$style_options = array();
foreach($stylecache AS $style)
{
$style_options["$style[styleid]"] = /*construct_depth_mark($style['depth'], ' ') . ' ' .*/ $style['title'];
$style_options["$style[styleid]"] = construct_depth_mark($style['depth'], '--') . ' ' . $style['title'];
}
// build the list of criteria options
$criteria_options = array(
'in_usergroup_x' => array(
'<select name="criteria[in_usergroup_x][condition1]" tabindex="1">' .
construct_select_options($usergroup_options, (empty($criteria_cache['in_usergroup_x']) ? 2 : $criteria_cache['in_usergroup_x']['condition1'])) .
'</select>'
),
'not_in_usergroup_x' => array(
'<select name="criteria[not_in_usergroup_x][condition1]" tabindex="1">' .
construct_select_options($usergroup_options, (empty($criteria_cache['not_in_usergroup_x']) ? 6 : $criteria_cache['not_in_usergroup_x']['condition1'])) .
'</select>'
),
'browsing_content_page' => array(
'<select name="criteria[browsing_content_page][condition1]" tabindex="1">
<option value="1"' . (empty($criteria_cache['browsing_content_page']['condition1']) ? ' selected="selected"' : '') . '>' . $vbphrase['content'] . '</option>
<option value="0"' . ($criteria_cache['browsing_content_page']['condition1'] == 0 ? ' selected="selected"' : '') . '>' . $vbphrase['non_content'] . '</option>
</select>'
),
'browsing_forum_x' => array(
'<select name="criteria[browsing_forum_x][condition1]" tabindex="1">' .
construct_select_options(construct_forum_chooser_options(), $criteria_cache['browsing_forum_x']['condition1']) .
'</select>'
),
'browsing_forum_x_and_children' => array(
'<select name="criteria[browsing_forum_x_and_children][condition1]" tabindex="1">' .
construct_select_options(construct_forum_chooser_options(), $criteria_cache['browsing_forum_x_and_children']['condition1']) .
'</select>'
),
'style_is_x' => array(
'<select name="criteria[style_is_x][condition1]" tabindex="1">' .
construct_select_options($style_options, $criteria_cache['style_is_x']['condition1']) .
'</select>'
),
'no_visit_in_x_days' => array(
'<input type="text" name="criteria[no_visit_in_x_days][condition1]" size="5" class="bginput" tabindex="1" value="' .
(empty($criteria_cache['no_visit_in_x_days']) ? 30 : intval($criteria_cache['no_visit_in_x_days']['condition1'])) .
'" />'
),
'no_posts_in_x_days' => array(
'<input type="text" name="criteria[no_posts_in_x_days][condition1]" size="5" class="bginput" tabindex="1" value="' .
(empty($criteria_cache['no_posts_in_x_days']) ? 30 : intval($criteria_cache['no_posts_in_x_days']['condition1'])) .
'" />'
),
'has_x_postcount' => array(
'<input type="text" name="criteria[has_x_postcount][condition1]" size="5" class="bginput" tabindex="1" value="' .
$criteria_cache['has_x_postcount']['condition1'] .
'" />',
'<input type="text" name="criteria[has_x_postcount][condition2]" size="5" class="bginput" tabindex="1" value="' .
$criteria_cache['has_x_postcount']['condition2'] .
'" />'
),
'has_never_posted' => array(
),
'has_x_reputation' => array(
'<input type="text" name="criteria[has_x_reputation][condition1]" size="5" class="bginput" tabindex="1" value="' .
(empty($criteria_cache['has_x_reputation']) ? 100 : $criteria_cache['has_x_reputation']['condition1']) .
'" />',
'<input type="text" name="criteria[has_x_reputation][condition2]" size="5" class="bginput" tabindex="1" value="' .
(empty($criteria_cache['has_x_reputation']) ? 200 : $criteria_cache['has_x_reputation']['condition2']) .
'" />'
),
'pm_storage_x_percent_full' => array(
'<input type="text" name="criteria[pm_storage_x_percent_full][condition1]" size="5" class="bginput" tabindex="1" value="' .
(empty($criteria_cache['pm_storage_x_percent_full']) ? 90 : $criteria_cache['pm_storage_x_percent_full']['condition1']) .
'" />',
'<input type="text" name="criteria[pm_storage_x_percent_full][condition2]" size="5" class="bginput" tabindex="1" value="' .
(empty($criteria_cache['pm_storage_x_percent_full']) ? 100 : $criteria_cache['pm_storage_x_percent_full']['condition2']) .
'" />'
),
'came_from_search_engine' => array(
),
'is_date' => array(
'<input type="text" name="criteria[is_date][condition1]" size="10" class="bginput" tabindex="1" value="' .
(empty($criteria_cache['is_date']['condition1']) ? vbdate('d-m-Y', TIMENOW, false, false) : $criteria_cache['is_date']['condition1']) .
'" />',
'<select name="criteria[is_date][condition2]" tabindex="1">
<option value="0"' . (empty($criteria_cache['is_date']['condition2']) ? ' selected="selected"' : '') . '>' . $vbphrase['user_timezone'] . '</option>
<option value="1"' . ($criteria_cache['is_date']['condition2'] == 1 ? ' selected="selected"' : '') . '>' . $vbphrase['utc_universal_time'] . '</option>
</select>'
),
'is_time' => array(
'<input type="text" name="criteria[is_time][condition1]" size="5" class="bginput" tabindex="1" value="' .
(empty($criteria_cache['is_time']['condition1']) ? vbdate('H:i', TIMENOW, false, false) : $criteria_cache['is_time']['condition1']) .
'" />',
'<input type="text" name="criteria[is_time][condition2]" size="5" class="bginput" tabindex="1" value="' .
(empty($criteria_cache['is_time']['condition2']) ? (intval(vbdate('H', TIMENOW, false, false)) + 1) . vbdate(':i', TIMENOW, false, false) : $criteria_cache['is_time']['condition2']) .
'" />',
'<select name="criteria[is_time][condition3]" tabindex="1">
<option value="0"' . (empty($criteria_cache['is_time']['condition3']) ? ' selected="selected"' : '') . '>' . $vbphrase['user_timezone'] . '</option>
<option value="1"' . ($criteria_cache['is_time']['condition3'] == 1 ? ' selected="selected"' : '') . '>' . $vbphrase['utc_universal_time'] . '</option>
</select>'
),
/*
* These are flagged for a future version
'userfield_x_equals_y' => array(
),
'userfield_x_contains_y' => array(
),
*/
);
if (sizeof($ad_name_cache))
{
$criteria_options['ad_x_not_displayed'] = array(
'<select name="criteria[ad_x_not_displayed][condition1]" tabindex="1">' .
construct_select_options($ad_name_cache, $criteria_cache['ad_x_not_displayed']['condition1']) .
'</select>'
);
}
// hook to allow third-party additions of criteria
($hook = vBulletinHook::fetch_hook('ads_list_criteria')) ? eval($hook) : false;
// build the editor form
print_form_header('ad', 'update');
construct_hidden_code('adid', $vbulletin->GPC['adid']);
if($vbulletin->GPC['ad_location_orig']){
construct_hidden_code('ad_location_orig', $vbulletin->GPC['ad_location_orig']);
}
print_table_header($table_title);
print_input_row($vbphrase['title'] . '<dfn>' . $vbphrase['ad_title_description'] . '</dfn>', 'title', $ad['title'], 0, 60);
print_select_row($vbphrase['ad_location'] . '<dfn>' . $vbphrase['ad_location_description'] . '</dfn>', 'ad_location', $location_options, $vbulletin->GPC['ad_location'] ? $vbulletin->GPC['ad_location'] : $ad['adlocation'] );
print_textarea_row($vbphrase['ad_html'] . '<dfn>' . $vbphrase['ad_html_description'] . '</dfn>', 'ad_html', $ad['html'] ? $ad['html'] : $ad['snippet'], 8, 60, true, false);
print_input_row($vbphrase['display_order'], 'displayorder', $ad['displayorder'], 0, 10);
print_yes_no_row($vbphrase['active'] . '<dfn>' . $vbphrase['ad_active_description'] . '</dfn>', 'active', $ad['active']);
print_description_row('<strong>' . $vbphrase['display_ad_if_elipsis'] . '</strong>', false, 2, 'tcat', '', 'criteria');
if ($display_active_criteria_first)
{
function print_ad_criterion($criteria_option_id, &$criteria_options, $criteria_cache)
{
global $vbphrase;
$criteria_option = $criteria_options["$criteria_option_id"];
print_description_row(
"<label><input type=\"checkbox\" id=\"cb_$criteria_option_id\" tabindex=\"1\" name=\"criteria[$criteria_option_id][active]\" title=\"$vbphrase[criterion_is_active]\" value=\"1\"" . (empty($criteria_cache["$criteria_option_id"]) ? '' : ' checked="checked"') . " />" .
"<span id=\"span_$criteria_option_id\">" . construct_phrase($vbphrase[$criteria_option_id . '_criteria'], $criteria_option[0], $criteria_option[1], $criteria_option[2]) . '</span></label>'
);
unset($criteria_options["$criteria_option_id"]);
}
foreach (array_keys($criteria_cache) AS $id)
{
print_ad_criterion($id, $criteria_options, $criteria_cache);
}
foreach ($criteria_options AS $id => $criteria_option)
{
print_ad_criterion($id, $criteria_options, $criteria_cache);
}
}
else
{
foreach ($criteria_options AS $criteria_option_id => $criteria_option)
{
// the criteria options can't trigger the checkbox to change, we need to break out of the label
$criteria_text = '<label>' . construct_phrase($vbphrase[$criteria_option_id . '_criteria'],
"</label>$criteria_option[0]<label>",
"</label>$criteria_option[1]<label>",
"</label>$criteria_option[2]<label>"
) . '</label>';
$criteria_text = str_replace('<label>', "<label for=\"cb_$criteria_option_id\">", $criteria_text);
print_description_row(
"<input type=\"checkbox\" id=\"cb_$criteria_option_id\" tabindex=\"1\" name=\"criteria[$criteria_option_id][active]\" title=\"$vbphrase[criterion_is_active]\" value=\"1\"" . (empty($criteria_cache["$criteria_option_id"]) ? '' : ' checked="checked"') . " />" .
"<span id=\"span_$criteria_option_id\">$criteria_text</span>"
);
}
}
print_submit_row();
}
// #############################################################################
// update or insert an ad
if ($_POST['do'] == 'update')
{
$vbulletin->input->clean_array_gpc('p', array(
'title' => TYPE_NOHTML,
'ad_location' => TYPE_NOHTML,
'ad_location_orig' => TYPE_NOHTML,
'ad_html' => TYPE_STR,
'displayorder' => TYPE_UINT,
'active' => TYPE_BOOL,
'criteria' => TYPE_ARRAY,
'criteria_serialized' => TYPE_STR,
'confirmerrors' => TYPE_BOOL,
));
$adid = $vbulletin->GPC['adid'];
$criterion = $vbulletin->GPC['criteria'];
if ($vbulletin->GPC['criteria_serialized'])
{
$criterion = unserialize($vbulletin->GPC['criteria_serialized']);
}
/*
foreach ($vbulletin->GPC['criteria'] AS $criteria)
{
if ($criteria['active'])
{
$have_criteria = true;
break;
}
}
if (!$have_criteria)
{
print_stop_message('no_ad_criteria_active');
}
*/
if ($vbulletin->GPC['title'] === '')
{
print_stop_message('invalid_title_specified');
}
// we are editing
if ($vbulletin->GPC['adid'])
{
// update ad record
$db->query_write("
UPDATE " . TABLE_PREFIX . "ad SET
title = '" . $db->escape_string($vbulletin->GPC['title']) . "',
adlocation = '" . $db->escape_string($vbulletin->GPC['ad_location']) . "',
displayorder = " . $vbulletin->GPC['displayorder'] . ",
active = " . $vbulletin->GPC['active'] . ",
snippet = '" . $db->escape_string($vbulletin->GPC['ad_html']) . "'
WHERE adid = " . $adid
);
// delete criteria
$db->query_write("
DELETE FROM " . TABLE_PREFIX . "adcriteria
WHERE adid = " . $adid
);
}
// we are adding a new ad
else
{
// insert ad record
$db->query_write($sql = "
INSERT INTO " . TABLE_PREFIX . "ad
(title, adlocation, displayorder, active, snippet)
VALUES (" .
"'" . $db->escape_string($vbulletin->GPC['title']) . "', " .
"'" . $db->escape_string($vbulletin->GPC['ad_location']) . "', " .
$vbulletin->GPC['displayorder'] . ", " .
$vbulletin->GPC['active'] . ", " .
"'" . $db->escape_string($vbulletin->GPC['ad_html']) . "'
)
");
$adid = $db->insert_id();
}
// update the ad_cache
$ad = array();
$ad['adid'] = $adid;
$ad['adlocation'] = $vbulletin->GPC['ad_location'];
$ad['displayorder'] = $vbulletin->GPC['displayorder'];
$ad['active'] = $vbulletin->GPC['active'];
$ad['snippet'] = $vbulletin->GPC['ad_html'];
$ad_cache[$adid] = $ad;
$criteria_sql = array();
foreach ($criterion AS $criteriaid => $criteria)
{
if ($criteria['active'])
{
$criteria_sql[] = "(
$adid,
'" . $db->escape_string($criteriaid) . "',
'" . $db->escape_string(trim($criteria['condition1'])) . "',
'" . $db->escape_string(trim($criteria['condition2'])) . "',
'" . $db->escape_string(trim($criteria['condition3'])) . "'
)";
}
}
if (sizeof($criteria_sql))
{
// insert criteria
$db->query_write("
INSERT INTO " . TABLE_PREFIX . "adcriteria
(adid, criteriaid, condition1, condition2, condition3)
VALUES " . implode(', ', $criteria_sql)
);
}
require_once(DIR . '/includes/functions_ad.php');
$template = wrap_ad_template(build_ad_template($vbulletin->GPC['ad_location']), $ad['adlocation']);
$template_un = $template;
require_once(DIR . '/includes/adminfunctions_template.php');
$template = compile_template($template);
// rebuild previous template if ad has moved locations
$ad_location_orig = $vbulletin->GPC['ad_location_orig'];
if (!empty($ad_location_orig) AND $ad['adlocation'] != $ad_location_orig)
{
$template_orig = wrap_ad_template(build_ad_template($ad_location_orig), $ad_location_orig);
$template_orig_un = $template_orig;
$template_orig = compile_template($template_orig);
replace_ad_template(0, $ad_location_orig, $template_orig, $template_orig_un,
$vbulletin->userinfo['username'], $vbulletin->options['templateversion'],
$ad_locations[$ad_location_orig]['product']);
replace_ad_template(-1, $ad_location_orig, $template_orig, $template_orig_un,
$vbulletin->userinfo['username'], $vbulletin->options['templateversion'],
$ad_locations[$ad_location_orig]['product']);
}
$ad_location = $vbulletin->GPC['ad_location'];
// note: this error check will ALWAYS be triggered if another ad on the same location have an error.
// would be a good idea to add a new description row to detail this problem for end users.
if (empty($vbulletin->GPC['confirmerrors']))
{
$errors = check_template_errors($template);
if (!empty($errors))
{
print_form_header('ad', 'update', 0, 1, '', '75%');
construct_hidden_code('confirmerrors', 1);
construct_hidden_code('adid', intval($vbulletin->GPC['adid']));
construct_hidden_code('title', $vbulletin->GPC['title']);
construct_hidden_code('ad_location', $ad_location);
construct_hidden_code('ad_html', $vbulletin->GPC['ad_html']);
construct_hidden_code('displayorder', intval($vbulletin->GPC['displayorder']));
construct_hidden_code('active', $vbulletin->GPC['active']);
construct_hidden_code('criteria_serialized', $criterion);
print_table_header($vbphrase['vbulletin_message']);
print_description_row(construct_phrase($vbphrase['template_eval_error'], $errors));
print_description_row(construct_phrase($template_un, $errors));
print_submit_row($vbphrase['continue'], 0, 2, $vbphrase['go_back']);
print_cp_footer();
exit;
}
}
// The insert of the template.
replace_ad_template(0, $ad_location, $template, $template_un,
$vbulletin->userinfo['username'], $vbulletin->options['templateversion'],
$ad_locations[$ad_location]['product']);
replace_ad_template(-1, $ad_location, $template, $template_un,
$vbulletin->userinfo['username'], $vbulletin->options['templateversion'],
$ad_locations[$ad_location]['product']);
build_all_styles();
define('CP_REDIRECT', 'ad.php');
print_stop_message('saved_ad_x_successfully', $vbulletin->GPC['title']);
}
// #############################################################################
// confirm deletion of a ad
if ($_REQUEST['do'] == 'delete')
{
print_delete_confirmation('ad', $vbulletin->GPC['adid'], 'ad', 'remove');
}
// #############################################################################
// remove an ad
if ($_POST['do'] == 'remove')
{
// get ad location
$adlocation = $ad_cache[$vbulletin->GPC['adid']]['adlocation'];
// delete criteria
$db->query_write("
DELETE FROM " . TABLE_PREFIX . "adcriteria
WHERE adid = " . $vbulletin->GPC['adid']
);
// delete ad
$db->query_write("
DELETE FROM " . TABLE_PREFIX . "ad
WHERE adid = " . $vbulletin->GPC['adid']
);
// remove record from ad_cache
unset($ad_cache[$vbulletin->GPC['adid']]);
$ad_cache = array_values($ad_cache);
// rebuild affected template
require_once(DIR . '/includes/functions_ad.php');
$template = build_ad_template($adlocation);
$template_un = $template;
require_once(DIR . '/includes/adminfunctions_template.php');
$template = compile_template($template);
// note: we are skipping the error check this time around because it would not make sense to ask user to check the
// template if they've already confirmed at other locations that their if conditions are wrong or whatever, and they
// cannot fix it here.
$db->query_write("
UPDATE " . TABLE_PREFIX . "template SET
template = '" . $db->escape_string($template) . "',
template_un = '" . $db->escape_string($template_un) . "',
dateline = " . TIMENOW . ",
username = '" . $db->escape_string($vbulletin->userinfo['username']) . "'
WHERE
title = 'ad_" . $db->escape_string($adlocation) . "'
AND
styleid IN (-1,0)
");
build_all_styles();
define('CP_REDIRECT', 'ad.php?do=modify');
print_stop_message('deleted_ad_successfully');
}
// #############################################################################
// quick update of active and display order fields
if ($_POST['do'] == 'quickupdate')
{
$vbulletin->input->clean_array_gpc('p', array(
'active' => TYPE_ARRAY_BOOL,
'displayorder' => TYPE_ARRAY_UINT,
'displayorderswap' => TYPE_CONVERT_KEYS
));
$changes = false;
$update_ids = '0';
$update_active = '';
$update_displayorder = '';
$ads_dispord = array();
$changed_locations = array();
$ads_result = $db->query_read("SELECT * FROM " . TABLE_PREFIX . "ad");
while ($ad = $db->fetch_array($ads_result))
{
$ads_dispord["$ad[adid]"] = $ad['displayorder'];
if (intval($ad['active']) != $vbulletin->GPC['active']["$ad[adid]"] OR $ad['displayorder'] != $vbulletin->GPC['displayorder']["$ad[$adid]"])
{
// prepare the queries
$update_ids .= ",$ad[adid]";
$update_active .= " WHEN $ad[adid] THEN " . intval($vbulletin->GPC['active']["$ad[adid]"]);
$update_displayorder .= " WHEN $ad[adid] THEN " . $vbulletin->GPC['displayorder']["$ad[adid]"];
// update the ad_cache
$ad['active'] = $vbulletin->GPC['active']["$ad[adid]"];
$ad['displayorder'] = $vbulletin->GPC['displayorder']["$ad[$adid]"];
$ad_cache[$ad['adid']] = $ad;
// flag location for rebuild later
if (!in_array($ad['adlocation'], $changed_locations))
{
$changed_locations[] = $ad['adlocation'];
}
}
}
$db->free_result($ads_result);
if (strlen($update_ids) > 1)
{
$db->query_write("
UPDATE " . TABLE_PREFIX . "ad
SET
active = CASE adid
$update_active ELSE active END,
displayorder = CASE adid
$update_displayorder ELSE displayorder END
WHERE
adid IN($update_ids)
");
// tell the templates to rebuild
$changes = true;
}
// handle swapping
if (!empty($vbulletin->GPC['displayorderswap']))
{
list($orig_adid, $swap_direction) = explode(',', $vbulletin->GPC['displayorderswap'][0]);
if (isset($vbulletin->GPC['displayorder']["$orig_adid"]))
{
$ad_orig = array(
'adid' => $orig_adid,
'displayorder' => $vbulletin->GPC['displayorder']["$orig_adid"]
);
switch ($swap_direction)
{
case 'lower':
{
$comp = '<';
$sort = 'DESC';
break;
}
case 'higher':
{
$comp = '>';
$sort = 'ASC';
break;
}
default:
{
$comp = false;
$sort = false;
}
}
if ($comp AND $sort AND $ad_swap = $db->query_first("SELECT adid, displayorder FROM " . TABLE_PREFIX . "ad WHERE displayorder $comp $ad_orig[displayorder] ORDER BY displayorder $sort, title ASC LIMIT 1"))
{
$db->query_write("
UPDATE " . TABLE_PREFIX . "ad
SET displayorder = CASE adid
WHEN $ad_orig[adid] THEN $ad_swap[displayorder]
WHEN $ad_swap[adid] THEN $ad_orig[displayorder]
ELSE displayorder END
WHERE adid IN($ad_orig[adid], $ad_swap[adid])
");
// tell the datastore to update
$changes = true;
}
}
}
//update the ad templates
if ($changes)
{
require_once(DIR . '/includes/functions_ad.php');
require_once(DIR . '/includes/adminfunctions_template.php');
foreach($changed_locations AS $location)
{
// same as above, we're not telling user errors here, because they already confirmed the error else where
$template = wrap_ad_template(build_ad_template($location), $location);
$template_un = $template;
$template = compile_template($template);
$db->query_write("
UPDATE " . TABLE_PREFIX . "template SET
template = '" . $db->escape_string($template) . "',
template_un = '" . $db->escape_string($template_un) . "',
dateline = " . TIMENOW . ",
username = '" . $db->escape_string($vbulletin->userinfo['username']) . "'
WHERE
title = 'ad_" . $db->escape_string($location) . "'
AND styleid IN (-1,0)
");
}
}
$_REQUEST['do'] = 'modify';
}
// #############################################################################
// list existing ads
if ($_REQUEST['do'] == 'modify')
{
print_form_header('ad', 'quickupdate');
print_column_style_code(array('width:100%', 'white-space:nowrap'));
print_table_header($vbphrase['ad_manager']);
$ad_result = $db->query("SELECT * FROM " . TABLE_PREFIX . "ad ORDER BY displayorder, title");
$ad_count = $db->num_rows($ad_result);
if ($ad_count)
{
print_description_row('<label><input type="checkbox" id="allbox" checked="checked" />' . $vbphrase['toggle_active_status_for_all'] . '</label><input type="image" src="../' . $vbulletin->options['cleargifurl'] . '" name="normalsubmit" />', false, 2, 'thead" style="font-weight:normal; padding:0px 4px 0px 4px');
while ($ad = $db->fetch_array($ad_result))
{
print_label_row(
'<a href="ad.php?' . $vbulletin->session->vars['sessionurl'] . 'do=locate&editloc=1&ad_location=' . $ad['adlocation'] . '&adid=' . $ad['adid'] . '" title="' . $vbphrase['edit_ad'] . '">' . $ad['title'] . '</a>',
'<div style="white-space:nowrap">' .
'<label class="smallfont"><input type="checkbox" name="active[' . $ad['adid'] . ']" value="1"' . ($ad['active'] ? ' checked="checked"' : '') . ' />' . $vbphrase['active'] . '</label> ' .
'<input type="image" src="../cpstyles/' . $vbulletin->options['cpstylefolder'] . '/move_down.gif" name="displayorderswap[' . $ad['adid'] . ',higher]" />' .
'<input type="text" name="displayorder[' . $ad['adid'] . ']" value="' . $ad['displayorder'] . '" class="bginput" size="4" title="' . $vbphrase['display_order'] . '" style="text-align:' . vB_Template_Runtime::fetchStyleVar('right') . '" />' .
'<input type="image" src="../cpstyles/' . $vbulletin->options['cpstylefolder'] . '/move_up.gif" name="displayorderswap[' . $ad['adid'] . ',lower]" />' .
construct_link_code($vbphrase['edit'], 'ad.php?' . $vbulletin->session->vars['sessionurl'] . 'do=locate&editloc=1&ad_location=' . $ad['adlocation'] . '&adid=' . $ad['adid']) .
construct_link_code($vbphrase['delete'], 'ad.php?' . $vbulletin->session->vars['sessionurl'] . 'do=delete&adid=' . $ad['adid']) .
'</div>'
);
}
}
print_label_row(
'<input type="button" class="button" value="' . $vbphrase['add_new_ad'] . '" onclick="window.location=\'ad.php?' . $vbulletin->session->vars['sessionurl'] . 'do=locate\';" />',
($ad_count ? '<div align="' . vB_Template_Runtime::fetchStyleVar('right') . '"><input type="submit" class="button" accesskey="s" value="' . $vbphrase['save'] . '" /> <input type="reset" class="button" accesskey="r" value="' . $vbphrase['reset'] . '" /></div>' : ' '),
'tfoot'
);
print_table_footer();
?>
<script type="text/javascript">
<!--
function toggle_all_active(e)
{
for (var i = 0; i < this.form.elements.length; i++)
{
if (this.form.elements[i].type == "checkbox" && this.form.elements[i].name.substr(0, 6) == "active")
{
this.form.elements[i].checked = this.checked;
}
}
}
YAHOO.util.Event.on("allbox", "click", toggle_all_active);
//-->
</script>
<?php
}
// ###################### Select Ad Location #######################
if ($_REQUEST['do'] == 'locate')
{
$vbulletin->input->clean_array_gpc('r', array(
'ad_location' => TYPE_NOHTML,
'editloc' => TYPE_BOOL
));
$orig_location = $vbulletin->GPC['ad_location'];
if ($vbulletin->GPC['ad_location'] AND sizeof($location_info = explode('_', $vbulletin->GPC['ad_location'], 2)) == 2)
{
list($selected_group, $ad_location) = $location_info;
}
else
{
$selected_group = 'global';
$ad_location = false;
}
?>
<style type="text/css">
a.ad
{
display: table-cell;
position: absolute;
background-color: gold;
color: gold;
font: bold 12px verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif;
padding: 0px;
vertical-align: middle;
text-decoration: none;
overflow: hidden;
/* border: dashed 1px navy; */
}
div .ad:hover, div .ad_selected
{
color: black;
/* background-color: #E1E4F2; */
background-color: gold;
border: 2px dashed navy;
margin: -2px 0 0 -2px;
}
</style>
<?php
echo '<script type="text/javascript" src="../clientscript/vbulletin_cpadlocator.js?v=' . SIMPLE_VERSION . '"></script>';
print_table_start();
print_table_header($vbphrase['ad_selector']);
echo '<tr><td colspan="2" class="alt1" align="center">
<label for="languagegroup"><strong>' . $vbphrase['page'] . ':</strong></label> <select name="languagegroup" id="languagegroup" tabindex="1" class="bginput" title="name="languagegroup"">';
foreach ($location_options as $key => $name)
{
echo '<option value="' . $key . '"' . ($selected_group == $key ? 'selected="selected"' : '') . '>' . $name . "</option>\r\n";
}
echo '</select>
<tr><td colspan="2" class="alt1" align="center">';
foreach ($locgroups AS $locgroup)
{
$display = (($selected_group == $locgroup['key']) ? '' : 'none');
$do = $vbulletin->GPC['editloc'] ? 'edit' : 'add';
?>
<div id="group_<?php echo $locgroup['key']; ?>" style="display:<?php echo $display; ?>;position:relative;width:500px">
<img src="../images/ads/locator/ad_<?php echo($locgroup['key']); ?>.jpg?v=<?php echo SIMPLE_VERSION; ?>" style="border: none" alt="<?php echo($locgroup['key']) ?>" />
<?php
foreach ($locgroup['location'] AS $location)
{
$selected = false;
$lineheight = ($location['cp_height']);
if ($vbulletin->GPC['editloc'] AND $vbulletin->GPC['adid'])
{
if ($locgroup['key'] == $selected_group AND $location['key'] == $ad_location)
{
$selected = true;
}
if ($orig_location != $locgroup['key']."_".$location['key']) {
$orig_loc = "&ad_location_orig=".$orig_location;
}
echo "\n\t<a id=\"location_$location[key]\" href=\"ad.php?do=edit&adid={$vbulletin->GPC['adid']}&ad_location=$locgroup[key]_$location[key]$orig_loc\" class=\"ad" . ($selected ? ' ad_selected' : '') . "\" style=\"top:$location[cp_ypos]px;left:$location[cp_xpos]px;width:$location[cp_width]px;height:$location[cp_height]px;line-height:$location[cp_height]px\">" . $vbphrase["adlocation_$locgroup[key]_$location[key]"] . "</a>";
}
else
{
echo "\n\t<a id=\"location_$location[key]\" href=\"ad.php?do=add&ad_location=$locgroup[key]_$location[key]\" class=\"ad\" style=\"top:$location[cp_ypos]px;left:$location[cp_xpos]px;width:$location[cp_width]px;height:$location[cp_height]px;line-height:$location[cp_height]px\">" . $vbphrase["adlocation_$locgroup[key]_$location[key]"] . "</a>";
}
}
echo '</div>';
}
echo "</td></tr>";
print_table_footer();
?>
<script type="text/javascript">
<!--
vBulletin_init();
//-->
</script>
<?php
}
// #### Dev 101: Deciding the best approach for a given problem ####
if ($_REQUEST['do'] == 'flipcoin')
{
echo rand(0,1) ? 'Heads' : 'Tails';
}
print_cp_footer();
/*======================================================================*\
|| ####################################################################
|| # CVS: $RCSfile$ - $Revision: 37230 $
|| ####################################################################
\*======================================================================*/