Add an ability to start chat with specified operator

This commit is contained in:
Dmitriy Simushev 2013-05-29 14:18:21 +00:00
parent b89e838625
commit e01a75faea
13 changed files with 181 additions and 39 deletions

View File

@ -92,6 +92,14 @@ if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
}
}
// Get operator code
$operator_code = empty($_GET['operator_code'])
? ''
: $_GET['operator_code'];
if (! preg_match("/^[A-z0-9_]+$/", $operator_code)) {
$operator_code = false;
}
// Get visitor info
$visitor = visitor_from_request();
$info = getgetparam('info');
@ -132,8 +140,17 @@ if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
$visitor_is_invited = false;
}
// Get operator info
$requested_operator = false;
if ($operator_code) {
$requested_operator = operator_by_code($operator_code);
}
// Check if survey should be displayed
if(Settings::get('enablepresurvey') == '1' && !$visitor_is_invited) {
if(Settings::get('enablepresurvey') == '1'
&& !$visitor_is_invited
&& !$requested_operator
) {
// Display prechat survey
$page = array_merge_recursive(
setup_logo($group),
@ -145,7 +162,7 @@ if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
}
// Start chat thread
$thread = chat_start_for_user($groupid, $visitor['id'], $visitor['name'], $referrer, $info);
$thread = chat_start_for_user($groupid, $requested_operator, $visitor['id'], $visitor['name'], $referrer, $info);
}
$threadid = $thread->id;
$token = $thread->lastToken;

View File

@ -128,6 +128,8 @@ $dbtables = array(
"iperm" => "int DEFAULT 0", /* Do not grant all privileges by default */
"dtmrestore" => "int NOT NULL DEFAULT 0",
"vcrestoretoken" => "varchar(64)",
// Use to start chat with specified operator
"code" => "varchar(64) DEFAULT ''"
),
"${mysqlprefix}chatoperatorstatistics" => array(
@ -249,7 +251,7 @@ $dbtables_can_update = array(
"${mysqlprefix}requestbuffer" => array("requestid", "requestkey", "request"),
"${mysqlprefix}chatmessage" => array("agentId"),
"${mysqlprefix}indexedchatmessage" => array(),
"${mysqlprefix}chatoperator" => array("vcavatar", "vcjabbername", "iperm", "istatus", "idisabled", "vcemail", "dtmrestore", "vcrestoretoken"),
"${mysqlprefix}chatoperator" => array("vcavatar", "vcjabbername", "iperm", "istatus", "idisabled", "vcemail", "dtmrestore", "vcrestoretoken", "code"),
"${mysqlprefix}chatoperatorstatistics" => array("sentinvitations", "acceptedinvitations", "rejectedinvitations", "ignoredinvitations"),
"${mysqlprefix}chatban" => array(),
"${mysqlprefix}chatgroup" => array("vcemail", "iweight", "parent", "vctitle", "vcchattitle", "vclogo", "vchosturl"),

View File

@ -184,6 +184,10 @@ if ($act == "silentcreateall") {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD vcrestoretoken varchar(64)", $link);
}
if (in_array("${mysqlprefix}chatoperator.code", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD code varchar(64) DEFAULT ''", $link);
}
if (in_array("${mysqlprefix}chatoperatorstatistics.sentinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperatorstatistics ADD sentinvitations int NOT NULL DEFAULT 0", $link);
}

View File

@ -625,12 +625,13 @@ function get_remote_host()
*
* @global string $current_locale Current locale code
* @param int $group_id Id of group related to thread
* @param array $requested_operator Array of requested operator info
* @param string $visitor_id Id of the visitor
* @param string $visitor_name Name of the visitor
* @param string $referrer Page user came from
* @param string $info User info
*/
function chat_start_for_user($group_id, $visitor_id, $visitor_name, $referrer, $info) {
function chat_start_for_user($group_id, $requested_operator, $visitor_id, $visitor_name, $referrer, $info) {
global $current_locale;
// Get user info
@ -651,6 +652,14 @@ function chat_start_for_user($group_id, $visitor_id, $visitor_name, $referrer, $
}
}
// Get info about requested operator
$requested_operator_online = false;
if ($requested_operator) {
$requested_operator_online = is_operator_online(
$requested_operator['operatorid']
);
}
// Get thread object
if ($is_invited) {
// Get thread from invitation
@ -663,6 +672,9 @@ function chat_start_for_user($group_id, $visitor_id, $visitor_name, $referrer, $
// Create thread
$thread = Thread::create();
$thread->state = Thread::STATE_LOADING;
if ($requested_operator && $requested_operator_online) {
$thread->nextAgent = $requested_operator['operatorid'];
}
}
// Update thread fields
@ -695,9 +707,18 @@ function chat_start_for_user($group_id, $visitor_id, $visitor_name, $referrer, $
getstring2('chat.came.from',array($referrer))
);
}
if ($requested_operator && !$requested_operator_online) {
$thread->postMessage(
Thread::KIND_INFO,
getstring2(
'chat.requested_operator.offline',
array(get_operator_name($requested_operator))
)
);
} else {
$thread->postMessage(Thread::KIND_INFO, getstring('chat.wait'));
}
}
// TODO: May be move sending this message somewhere else?
if ($info) {

View File

@ -479,6 +479,7 @@ class ThreadProcessor extends ClientSideProcessor {
// Initialize dialog
$thread = chat_start_for_user(
$group_id,
false,
$visitor['id'],
$visitor['name'],
$referrer,

View File

@ -15,7 +15,7 @@
* limitations under the License.
*/
function generate_button($title, $locale, $style, $invitationstyle, $group, $inner, $showhost, $forcesecure, $modsecurity)
function generate_button($title, $locale, $style, $invitationstyle, $group, $inner, $showhost, $forcesecure, $modsecurity, $operator_code)
{
global $visitorcookie;
$app_location = get_app_location($showhost, $forcesecure);
@ -29,8 +29,23 @@ function generate_button($title, $locale, $style, $invitationstyle, $group, $inn
$modsecfix = $modsecurity ? ".replace('http://','').replace('https://','')" : "";
$jslink = append_query("'" . $link, "url='+escape(document.location.href$modsecfix)+'&referrer='+escape(document.referrer$modsecfix)");
$popup_options = "toolbar=0,scrollbars=0,location=0,status=1,menubar=0,width=640,height=480,resizable=1";
// Generate operator code field
if ($operator_code) {
$form_on_submit = "if(navigator.userAgent.toLowerCase().indexOf('opera') != -1 " .
"&& window.event.preventDefault) window.event.preventDefault();" .
"this.newWindow = window.open({$jslink} + '&operator_code=' + document.getElementById('mibewOperatorCodeField').value, 'webim', '{$popup_options}');" .
"this.newWindow.focus();this.newWindow.opener=window;return false;";
$temp = '<form action="" onsubmit="' . $form_on_submit . '" id="mibewOperatorCodeForm">' .
'<input type="text" id="mibewOperatorCodeField" />' .
'</form>';
return "<!-- mibew operator code field -->" . $temp . "<!-- / mibew operator code field -->";
}
// Generate button
$temp = get_popup($link, "$jslink",
$inner, $title, "webim", "toolbar=0,scrollbars=0,location=0,status=1,menubar=0,width=640,height=480,resizable=1");
$inner, $title, "webim", $popup_options);
if (Settings::get('enabletracking')) {
$widget_data = array();

View File

@ -96,6 +96,21 @@ function operator_by_id($id)
);
}
/**
* Load operator info by specified operators code
* @param string $code Operators code
* @return array|boolean Operators info array or boolean false if there is no
* operator with specified code.
*/
function operator_by_code($code) {
$db = Database::getInstance();
return $db->query(
"select * from {chatoperator} where code = ?",
array($code),
array('return_rows' => Database::RETURN_ONE_ROW)
);
}
/**
* Get list of operators taking into account $options
* @param array $options Associative array of options. It can contains following keys:
@ -134,7 +149,7 @@ function get_operators_list($options)
$orderby = "vclogin";
}
$query = "select distinct {chatoperator}.operatorid, vclogin, vclocalename, vccommonname, istatus, idisabled, (:now - dtmlastvisited) as time " .
$query = "select distinct {chatoperator}.operatorid, vclogin, vclocalename, vccommonname, code, istatus, idisabled, (:now - dtmlastvisited) as time " .
"from {chatoperator}" .
(
empty($options['isolated_operator_id']) ? "" :
@ -165,11 +180,10 @@ function get_operators_list($options)
return $operators;
}
function operator_get_all()
{
function operator_get_all() {
$db = Database::getInstance();
return $operators = $db->query(
"select operatorid, vclogin, vclocalename, vccommonname, istatus, idisabled, " .
"select operatorid, vclogin, vclocalename, vccommonname, istatus, code, idisabled, " .
"(:now - dtmlastvisited) as time " .
"from {chatoperator} order by vclogin",
array(':now' => time()),
@ -181,7 +195,7 @@ function get_operators_from_adjacent_groups($operator)
{
$db = Database::getInstance();
$query = "select distinct {chatoperator}.operatorid, vclogin, vclocalename,vccommonname, " .
"istatus, idisabled, " .
"istatus, idisabled, code, " .
"(:now - dtmlastvisited) as time " .
"from {chatoperator}, {chatgroupoperator} " .
"where {chatoperator}.operatorid = {chatgroupoperator}.operatorid " .
@ -224,8 +238,22 @@ function operator_is_disabled($operator)
return $operator['idisabled'] == '1';
}
function update_operator($operatorid, $login, $email, $password, $localename, $commonname)
{
/**
* Update existing operator's info.
*
* If $password argument is empty operators password will not be changed.
*
* @param int $operatorid ID of operator to update
* @param string $login Operator's login
* @param string $email Operator's
* @param string $password Operator's password
* @param string $localename Operator's local name
* @param string $commonname Operator's international name
* @param string $avatar Operator's avatar
* @param string $code Operator's code which use to start chat with specified
* operator
*/
function update_operator($operatorid, $login, $email, $password, $localename, $commonname, $code) {
$db = Database::getInstance();
$values = array(
':login' => $login,
@ -233,7 +261,8 @@ function update_operator($operatorid, $login, $email, $password, $localename, $c
':commonname' => $commonname,
':email' => $email,
':jabbername' => '',
':operatorid' => $operatorid
':operatorid' => $operatorid,
':code' => $code
);
if ($password) {
$values[':password'] = md5($password);
@ -242,7 +271,7 @@ function update_operator($operatorid, $login, $email, $password, $localename, $c
"update {chatoperator} set vclogin = :login, " .
($password ? " vcpassword=:password, " : "") .
"vclocalename = :localname, vccommonname = :commonname, " .
"vcemail = :email, vcjabbername= :jabbername " .
"vcemail = :email, code = :code, vcjabbername= :jabbername " .
"where operatorid = :operatorid",
$values
@ -267,23 +296,29 @@ function update_operator_avatar($operatorid, $avatar)
* @param string $localename Operator's local name
* @param string $commonname Operator's international name
* @param string $avatar Operator's avatar
* @param string $code Operator's code which use to start chat with specified
* operator
* @return array Operator's array
*/
function create_operator($login, $email, $password, $localename, $commonname, $avatar)
{
function create_operator($login, $email, $password, $localename, $commonname, $avatar, $code) {
$db = Database::getInstance();
$db->query(
"insert into {chatoperator} " .
"(vclogin,vcpassword,vclocalename,vccommonname,vcavatar,vcemail,vcjabbername) " .
"values (?, ?, ?, ?, ?, ?, ?)",
"INSERT INTO {chatoperator} (" .
"vclogin, vcpassword, vclocalename, vccommonname, vcavatar, " .
"vcemail, code, vcjabbername " .
") VALUES (" .
":login, :pass, :localename, :commonname, :avatar, " .
":email, :code, :jabber".
")",
array(
$login,
md5($password),
$localename,
$commonname,
$avatar,
$email,
''
':login' => $login,
':pass' => md5($password),
':localename' => $localename,
':commonname' => $commonname,
':avatar' => $avatar,
':email' => $email,
':code' => $code,
':jabber' => ''
)
);

View File

@ -63,6 +63,7 @@ chat.redirected.closewindow=Click to close the window
chat.redirected.content=The visitor has been placed in the priorty queue of the operator {0}.
chat.redirected.group.content=The visitor has been placed in a priorty queue of the group {0}.
chat.redirected.title=The visitor has been redirected to another operator
chat.requested_operator.offline=Thank you for contacting us. We are sorry, but requested operator <strong>{0}</strong> is offline. Another operator will be with you shortly.
chat.status.operator.changed=Operator <strong>{0}</strong> changed operator <strong>{1}</strong>
chat.status.operator.dead=Your operator has connection issues. We have moved you to a priorty position in the queue. Sorry for keeping you waiting.
chat.status.operator.joined=Operator {0} joined the chat
@ -138,6 +139,8 @@ error.no_password.visit_profile=Visit your <a href="{0}">Profile Page</a>.
features.saved=Features activated
form.field.address.description=Ex: 12.23.45.123 or todo.com
form.field.address=Visitor's Address
form.field.agent_code.description=Use to start chat with determined operator
form.field.agent_code=Code
form.field.agent_commonname.description=This name will be seen by your visitors.
form.field.agent_commonname=International name (Latin)
form.field.agent_name.description=This name will be seen by your visitors.
@ -278,17 +281,20 @@ page.chat.old_browser.close=Close...
page.chat.old_browser.list=<ul>\n<li>Internet Explorer 5.5+</li>\n<li>Firefox 1.0+</li>\n<li>Opera 8.0+</li>\n<li>Mozilla 1.4+</li>\n<li>Netscape 7.1+</li>\n<li>Safari 1.2+</li>\n</ul>\n<p>Also, we support some old browsers:</p>\n<ul>\n<li>Internet Explorer 5.0</li>\n<li>Opera 7.0</li>\n</ul>
page.chat.old_browser.problem=<p>Your web browser is not fully supported. \nPlease, use one of the following web browsers:</p>
page.chat.old_browser.title=Please use a more recent browser
page.gen_button.button=button
page.gen_button.choose_group=Code for group
page.gen_button.choose_image=Choose image
page.gen_button.choose_invitationstyle=Invitation style
page.gen_button.choose_locale=Code for language
page.gen_button.choose_style=Chat window style
page.gen_button.choose_type=Generating code type
page.gen_button.code.description=<strong>Caution!</strong> Please don't change<br/> the code manually because<br/> we don't guarantee that<br/> it will work!
page.gen_button.code=HTML code
page.gen_button.default_group=-all operators-
page.gen_button.include_site_name=Include host name into the code
page.gen_button.intro=You can generate HTML code to place at your site here.
page.gen_button.modsecurity=Compatibility with mod_security (modsecurity.org), turn on only if you have problems with it
page.gen_button.operator_code=operator code field
page.gen_button.sample=Example
page.gen_button.secure_links=Use secure links (https)
page.gen_button.title=Button HTML code generation
@ -343,6 +349,7 @@ page_agent.create_new=You can create a new operator here.
page_agent.error.duplicate_login=Please choose another login because an operator with that login is already registered in the system.
page_agent.error.forbidden_create=You are not allowed to create operators.
page_agent.error.wrong_login=Login should contain only latin characters, numbers and underscore symbol.
page_agent.error.wrong_agent_code=Code should contain only latin characters, numbers and underscore symbol.
page_agent.intro=Edit general operator settings.
page_agent.tab.avatar=Photo
page_agent.tab.groups=Groups

View File

@ -63,6 +63,7 @@ chat.redirected.closewindow=
chat.redirected.content=Посетитель помещен в привелегированную очередь оператора {0}.
chat.redirected.group.content=Посетитель помещен в привелегированную очередь группы {0}.
chat.redirected.title=Посетитель переведен другому оператору
chat.requested_operator.offline=Нам очень жаль, но запрошенный оператор <strong>{0}</strong> сейчас недоступен. Пожалуйста, подождите немного, к Вам присоединится другой оператор...
chat.status.operator.changed=Оператор <strong>{0}</strong> сменил оператора <strong>{1}</strong>
chat.status.operator.dead=У оператора возникли проблемы со связью, мы временно перевели Вас в приоритетную очередь. Приносим извинения за Ваше ожидание.
chat.status.operator.joined=Оператор {0} включился в разговор
@ -138,6 +139,8 @@ errors.wrong_field=
features.saved=Набор сервисов изменен
form.field.address.description=Например: 12.23.45.123 или relay.info.ru
form.field.address=Адрес посетителя
form.field.agent_code.description=Используется для начала диалога с определенным оператором
form.field.agent_code=Код
form.field.agent_commonname.description=Под этим именем Вас увидят ваши посетители из других стран.
form.field.agent_commonname=Интернациональное имя (латиницей)
form.field.agent_name.description=Под этим именем Вас увидят ваши посетители, по нему же к <br/>Вам будет обращаться система.
@ -278,17 +281,20 @@ page.chat.old_browser.close=
page.chat.old_browser.list=<ul>\n<li>Internet Explorer 5.5+</li>\n<li>Firefox 1.0+</li>\n<li>Opera 8.0+</li>\n<li>Mozilla 1.4+</li>\n<li>Netscape 7.1+</li>\n<li>Safari 1.2+</li>\n</ul>\n<p>Также поддерживаются некоторые старые браузеры:</p>\n<ul>\n<li>Internet Explorer 5.0</li>\n<li>Opera 7.0</li>\n</ul>
page.chat.old_browser.problem=<p>К сожалению, для работы этой страницы необходим более новый браузер. Для лучшего просмотра используйте:</p>
page.chat.old_browser.title=Используйте более новый browser
page.gen_button.button=кнопка
page.gen_button.choose_group=Для группы
page.gen_button.choose_image=Выбор картинки
page.gen_button.choose_invitationstyle=Стиль приглашения
page.gen_button.choose_locale=Для какой локали создавать кнопку
page.gen_button.choose_style=Стиль чат-окна
page.gen_button.choose_type=Тип генерируемого кода
page.gen_button.code.description=<strong>Внимание!</strong> При внесении<br/> каких-либо изменений<br/> в этот код работоспособность<br/> кнопки не гарантируется!
page.gen_button.code=HTML-код
page.gen_button.default_group=-все операторы-
page.gen_button.include_site_name=Включать имя сайта в код
page.gen_button.intro=На этой странице Вы можете получить HTML-код кнопки "Веб Мессенджера" для размещения на своем сайте.
page.gen_button.modsecurity=Совместимость с mod_security (modsecurity.org), включите если окно с чатом открывается с http ошибкой
page.gen_button.operator_code=поле для ввода кода оператора
page.gen_button.sample=Пример
page.gen_button.secure_links=Использовать защищенное соединение (https)
page.gen_button.title=Получение HTML-кода кнопки
@ -343,6 +349,7 @@ page_agent.create_new=
page_agent.error.duplicate_login=Выберите другой логин, т.к. оператор с введенным логином уже зарегистрирован в системе.
page_agent.error.forbidden_create=Вы не можете создавать операторов.
page_agent.error.wrong_login=Логин должен состоять из латинских символов, цифр и знака подчеркивания.
page_agent.error.wrong_agent_code=Код должен состоять из латинских символов, цифр и знака подчеркивания.
page_agent.intro=На этой странице вы можете просмотреть детали оператора и отредактировать их.
page_agent.tab.avatar=Фотография
page_agent.tab.groups=Группы

View File

@ -52,6 +52,9 @@ $showhost = verifyparam("hostname", "/^on$/", "") == "on";
$forcesecure = verifyparam("secure", "/^on$/", "") == "on";
$modsecurity = verifyparam("modsecurity", "/^on$/", "") == "on";
$code_type = verifyparam("codetype", "/^(button|operator_code)$/", "button");
$operator_code = ($code_type == "operator_code");
$lang = verifyparam("lang", "/^[\w-]{2,5}$/", "");
if (!$lang || !in_array($lang, $image_locales))
$lang = in_array($current_locale, $image_locales) ? $current_locale : $image_locales[0];
@ -66,13 +69,18 @@ if ($groupid) {
$message = get_image($imagehref, $size[0], $size[1]);
$page = array();
$page['buttonCode'] = generate_button("", $lang, $style, $invitationstyle, $groupid, $message, $showhost, $forcesecure, $modsecurity);
$page['buttonCode'] = generate_button("", $lang, $style, $invitationstyle, $groupid, $message, $showhost, $forcesecure, $modsecurity, $operator_code);
$page['availableImages'] = array_keys($imageLocales);
$page['availableLocales'] = $image_locales;
$page['availableChatStyles'] = $stylelist;
$page['availableInvitationStyles'] = $invitationstylelist;
$page['groups'] = get_groups_list();
$page['availableCodeTypes'] = array(
'button' => getlocal('page.gen_button.button'),
'operator_code' => getlocal('page.gen_button.operator_code')
);
$page['formgroup'] = $groupid;
$page['formstyle'] = $style;
$page['forminvitationstyle'] = $invitationstyle;
@ -81,8 +89,10 @@ $page['formlang'] = $lang;
$page['formhostname'] = $showhost;
$page['formsecure'] = $forcesecure;
$page['formmodsecurity'] = $modsecurity;
$page['formcodetype'] = $code_type;
$page['enabletracking'] = Settings::get('enabletracking');
$page['operator_code'] = $operator_code;
prepare_menu($operator);
start_html_output();

View File

@ -38,6 +38,7 @@ if ((isset($_POST['login']) || !is_capable(CAN_ADMINISTRATE, $operator)) && isse
$passwordConfirm = getparam('passwordConfirm');
$localname = getparam('name');
$commonname = getparam('commonname');
$code = getparam('code');
if (!$localname)
$errors[] = no_field("form.field.agent_name");
@ -54,6 +55,10 @@ if ((isset($_POST['login']) || !is_capable(CAN_ADMINISTRATE, $operator)) && isse
if ($email != '' && !is_valid_email($email))
$errors[] = wrong_field("form.field.mail");
if ($code != '' && (! preg_match("/^[A-z0-9_]+$/", $code))) {
$errors[] = getlocal("page_agent.error.wrong_agent_code");
}
if (!$opId && !$password)
$errors[] = no_field("form.field.password");
@ -73,11 +78,11 @@ if ((isset($_POST['login']) || !is_capable(CAN_ADMINISTRATE, $operator)) && isse
if (count($errors) == 0) {
if (!$opId) {
$newop = create_operator($login, $email, $password, $localname, $commonname, "");
$newop = create_operator($login, $email, $password, $localname, $commonname, "", $code);
header("Location: $webimroot/operator/avatar.php?op=" . $newop['operatorid']);
exit;
} else {
update_operator($opId, $login, $email, $password, $localname, $commonname);
update_operator($opId, $login, $email, $password, $localname, $commonname, $code);
// update the session password
if (!empty($password) && $opId == $operator['operatorid']) {
$toDashboard = $operator['vcpassword'] == md5('') && $password != '';
@ -95,6 +100,7 @@ if ((isset($_POST['login']) || !is_capable(CAN_ADMINISTRATE, $operator)) && isse
$page['formname'] = topage($localname);
$page['formemail'] = topage($email);
$page['formcommonname'] = topage($commonname);
$page['formcode'] = topage($code);
$page['opid'] = topage($opId);
}
@ -116,6 +122,7 @@ if ((isset($_POST['login']) || !is_capable(CAN_ADMINISTRATE, $operator)) && isse
$page['formname'] = topage($op['vclocalename']);
$page['formemail'] = topage($op['vcemail']);
$page['formcommonname'] = topage($op['vccommonname']);
$page['formcode'] = topage($op['code']);
$page['opid'] = topage($op['operatorid']);
}
}

View File

@ -107,6 +107,14 @@ require_once('inc_errors.php');
<br clear="all"/>
</div>
<div class="field">
<div class="flabel"><?php echo getlocal('form.field.agent_code') ?></div>
<div class="fvalue">
<input type="text" name="code" size="40" value="<?php echo form_value('code') ?>" class="formauth"<?php echo $page['canmodify'] ? "" : " disabled=\"disabled\"" ?>/>
</div>
<div class="fdescr"> &mdash; <?php echo getlocal('form.field.agent_code.description') ?></div>
<br clear="all"/>
</div>
<?php if($page['canmodify']) { ?>
<div class="fbutton">
<input type="image" name="save" value="" src='<?php echo $webimroot.getlocal("image.button.save") ?>' alt='<?php echo getlocal("button.save") ?>'/>

View File

@ -41,19 +41,26 @@ require_once('inc_errors.php');
</div>
<div class="fieldinrow">
<div class="flabel"><?php echo getlocal("page.gen_button.choose_image") ?></div>
<div class="flabel"><?php echo getlocal("page.gen_button.choose_style") ?></div>
<div class="fvaluenodesc">
<select name="i" onchange="this.form.submit();"><?php foreach($page['availableImages'] as $k) { echo "<option value=\"".$k."\"".($k == form_value("image") ? " selected=\"selected\"" : "").">".$k."</option>"; } ?></select>
<select name="style" onchange="this.form.submit();"><?php foreach($page['availableChatStyles'] as $k => $v) { echo "<option value=\"".$k."\"".($k == form_value("style") ? " selected=\"selected\"" : "").">".$v."</option>"; } ?></select>
</div>
</div>
<br clear="all"/>
<div class="fieldinrow">
<div class="flabel"><?php echo getlocal("page.gen_button.choose_style") ?></div>
<div class="flabel"><?php echo getlocal("page.gen_button.choose_type") ?></div>
<div class="fvaluenodesc">
<select name="style" onchange="this.form.submit();"><?php foreach($page['availableChatStyles'] as $k => $v) { echo "<option value=\"".$k."\"".($k == form_value("style") ? " selected=\"selected\"" : "").">".$v."</option>"; } ?></select>
<select name="codetype" onchange="this.form.submit();"><?php foreach($page['availableCodeTypes'] as $k => $v) { echo "<option value=\"".$k."\"".($k == form_value("codetype") ? " selected=\"selected\"" : "").">".$v."</option>"; } ?></select>
</div>
</div>
<br clear="all"/>
<?php if(! $page['operator_code']) { ?>
<div class="fieldinrow">
<div class="flabel"><?php echo getlocal("page.gen_button.choose_image") ?></div>
<div class="fvaluenodesc">
<select name="i" onchange="this.form.submit();"><?php foreach($page['availableImages'] as $k) { echo "<option value=\"".$k."\"".($k == form_value("image") ? " selected=\"selected\"" : "").">".$k."</option>"; } ?></select>
</div>
</div>
@ -66,6 +73,7 @@ require_once('inc_errors.php');
</div>
<?php } ?>
<br clear="all"/>
<?php } ?>
<div class="fieldinrow">
<div class="flabel"><?php echo getlocal("page.gen_button.choose_group") ?></div>