Файл: qa-content/qa-ask.js
Строк: 300
<?php
/*
Question2Answer (c) Gideon Greenspan
http://www.question2answer.org/
File: qa-content/qa-ask.js
Version: See define()s at top of qa-include/qa-base.php
Description: Javascript for ask page and question editing, including tag auto-completion
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
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
*/
function qa_title_change(value)
{
qa_ajax_post('asktitle', {title:value}, function(lines) {
if (lines[0]=='1') {
if (lines[1].length) {
qa_tags_examples=lines[1];
qa_tag_hints(true);
}
if (lines.length>2) {
var simelem=document.getElementById('similar');
if (simelem)
simelem.innerHTML=lines.slice(2).join('n');
}
} else if (lines[0]=='0')
alert(lines[1]);
else
qa_ajax_error();
});
qa_show_waiting_after(document.getElementById('similar'), true);
}
function qa_html_unescape(html)
{
return html.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
}
function qa_html_escape(text)
{
return text.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
}
function qa_tag_click(link)
{
var elem=document.getElementById('tags');
var parts=qa_tag_typed_parts(elem);
// removes any HTML tags and ampersand
var tag=qa_html_unescape(link.innerHTML.replace(/<[^>]*>/g, ''));
var separator=qa_tag_onlycomma ? ', ' : ' ';
// replace if matches typed, otherwise append
var newvalue=(parts.typed && (tag.toLowerCase().indexOf(parts.typed.toLowerCase())>=0))
? (parts.before+separator+tag+separator+parts.after+separator) : (elem.value+separator+tag+separator);
// sanitize and set value
if (qa_tag_onlycomma)
elem.value=newvalue.replace(/[s,]*,[s,]*/g, ', ').replace(/^[s,]+/g, '');
else
elem.value=newvalue.replace(/[s,]+/g, ' ').replace(/^[s,]+/g, '');
elem.focus();
qa_tag_hints();
return false;
}
function qa_tag_hints(skipcomplete)
{
var elem=document.getElementById('tags');
var html='';
var completed=false;
// first try to auto-complete
if (qa_tags_complete && !skipcomplete) {
var parts=qa_tag_typed_parts(elem);
if (parts.typed) {
html=qa_tags_to_html((qa_html_unescape(qa_tags_examples+','+qa_tags_complete)).split(','), parts.typed.toLowerCase());
completed=html ? true : false;
}
}
// otherwise show examples
if (qa_tags_examples && !completed)
html=qa_tags_to_html((qa_html_unescape(qa_tags_examples)).split(','), null);
// set title visiblity and hint list
document.getElementById('tag_examples_title').style.display=(html && !completed) ? '' : 'none';
document.getElementById('tag_complete_title').style.display=(html && completed) ? '' : 'none';
document.getElementById('tag_hints').innerHTML=html;
}
function qa_tags_to_html(tags, matchlc)
{
var html='';
var added=0;
var tagseen={};
for (var i=0; i<tags.length; i++) {
var tag=tags[i];
var taglc=tag.toLowerCase();
if (!tagseen[taglc]) {
tagseen[taglc]=true;
if ( (!matchlc) || (taglc.indexOf(matchlc)>=0) ) { // match if necessary
if (matchlc) { // if matching, show appropriate part in bold
var matchstart=taglc.indexOf(matchlc);
var matchend=matchstart+matchlc.length;
inner='<SPAN STYLE="font-weight:normal;">'+qa_html_escape(tag.substring(0, matchstart))+'<B>'+
qa_html_escape(tag.substring(matchstart, matchend))+'</B>'+qa_html_escape(tag.substring(matchend))+'</SPAN>';
} else // otherwise show as-is
inner=qa_html_escape(tag);
html+=qa_tag_template.replace(/^/g, inner.replace('$', '$$$$'))+' '; // replace ^ in template, escape $s
if (++added>=qa_tags_max)
break;
}
}
}
return html;
}
function qa_caret_from_end(elem)
{
if (document.selection) { // for IE
elem.focus();
var sel=document.selection.createRange();
sel.moveStart('character', -elem.value.length);
return elem.value.length-sel.text.length;
} else if (typeof(elem.selectionEnd)!='undefined') // other browsers
return elem.value.length-elem.selectionEnd;
else // by default return safest value
return 0;
}
function qa_tag_typed_parts(elem)
{
var caret=elem.value.length-qa_caret_from_end(elem);
var active=elem.value.substring(0, caret);
var passive=elem.value.substring(active.length);
// if the caret is in the middle of a word, move the end of word from passive to active
if (
active.match(qa_tag_onlycomma ? /[^s,][^,]*$/ : /[^s,]$/) &&
(adjoinmatch=passive.match(qa_tag_onlycomma ? /^[^,]*[^s,][^,]*/ : /^[^s,]+/))
) {
active+=adjoinmatch[0];
passive=elem.value.substring(active.length);
}
// find what has been typed so far
var typedmatch=active.match(qa_tag_onlycomma ? /[^s,]+[^,]*$/ : /[^s,]+$/) || [''];
return {before:active.substring(0, active.length-typedmatch[0].length), after:passive, typed:typedmatch[0]};
}
function qa_category_select(idprefix, startpath)
{
var startval=startpath ? startpath.split("/") : [];
var setdescnow=true;
for (var l=0; l<=qa_cat_maxdepth; l++) {
var elem=document.getElementById(idprefix+'_'+l);
if (elem) {
if (l) {
if (l<startval.length && startval[l].length) {
var val=startval[l];
for (var j=0; j<elem.options.length; j++)
if (elem.options[j].value==val)
elem.selectedIndex=j;
} else
var val=elem.options[elem.selectedIndex].value;
} else
val='';
if (elem.qa_last_sel!==val) {
elem.qa_last_sel=val;
var subelem=document.getElementById(idprefix+'_'+l+'_sub');
if (subelem)
subelem.parentNode.removeChild(subelem);
if (val.length || (l==0)) {
subelem=elem.parentNode.insertBefore(document.createElement('span'), elem.nextSibling);
subelem.id=idprefix+'_'+l+'_sub';
qa_show_waiting_after(subelem, true);
qa_ajax_post('category', {categoryid:val},
(function(elem, l) {
return function(lines) {
var subelem=document.getElementById(idprefix+'_'+l+'_sub');
if (subelem)
subelem.parentNode.removeChild(subelem);
if (lines[0]=='1') {
elem.qa_cat_desc=lines[1];
var addedoption=false;
if (lines.length>2) {
var subelem=elem.parentNode.insertBefore(document.createElement('span'), elem.nextSibling);
subelem.id=idprefix+'_'+l+'_sub';
subelem.innerHTML=' ';
var newelem=elem.cloneNode(false);
newelem.name=newelem.id=idprefix+'_'+(l+1);
newelem.options.length=0;
if (l ? qa_cat_allownosub : qa_cat_allownone)
newelem.options[0]=new Option(l ? '' : elem.options[0].text, '', true, true);
for (var i=2; i<lines.length; i++) {
var parts=lines[i].split('/');
if (String(qa_cat_exclude).length && (String(qa_cat_exclude)==parts[0]))
continue;
newelem.options[newelem.options.length]=new Option(parts.slice(1).join('/'), parts[0]);
addedoption=true;
}
if (addedoption) {
subelem.appendChild(newelem);
qa_category_select(idprefix, startpath);
}
if (l==0)
elem.style.display='none';
}
if (!addedoption)
set_category_description(idprefix);
} else if (lines[0]=='0')
alert(lines[1]);
else
qa_ajax_error();
}
})(elem, l)
);
setdescnow=false;
}
break;
}
}
}
if (setdescnow)
set_category_description(idprefix);
}
function set_category_description(idprefix)
{
var n=document.getElementById(idprefix+'_note');
if (n) {
desc='';
for (var l=1; l<=qa_cat_maxdepth; l++) {
var elem=document.getElementById(idprefix+'_'+l);
if (elem && elem.options[elem.selectedIndex].value.length)
desc=elem.qa_cat_desc;
}
n.innerHTML=desc;
}
}
?>