mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-14 13:33:14 +00:00
1355 lines
34 KiB
JavaScript
1355 lines
34 KiB
JavaScript
|
|
function thesau_show()
|
|
{
|
|
if(p4.thesau.currentWizard == "???") // first show of thesaurus
|
|
thesauShowWizard("wiz_0", false);
|
|
}
|
|
|
|
function thesauCancelWizard()
|
|
{
|
|
thesauShowWizard("wiz_0", true);
|
|
}
|
|
|
|
function thesauShowWizard(wizard, refreshFilter)
|
|
{
|
|
if(wizard != p4.thesau.currentWizard)
|
|
{
|
|
$("#THPD_WIZARDS DIV.wizard", p4.thesau.tabs).hide();
|
|
$("#THPD_WIZARDS ." + wizard, p4.thesau.tabs).show();
|
|
$("#THPD_T_treeBox", p4.thesau.tabs).css('top', $("#THPD_WIZARDS", p4.thesau.tabs).height());
|
|
|
|
p4.thesau.currentWizard = wizard;
|
|
|
|
if(refreshFilter)
|
|
T_Gfilter_delayed($('#THPD_WIZARDS .gform', p4.thesau.tabs).eq(0).val(), 0);
|
|
|
|
if(wizard == "wiz_0") // browse
|
|
$("#THPD_WIZARDS .th_cancel", p4.thesau.tabs).hide();
|
|
else
|
|
$("#THPD_WIZARDS .th_cancel", p4.thesau.tabs).show();
|
|
|
|
if(wizard == "wiz_1") // accept
|
|
$("#THPD_WIZARDS .th_ok", p4.thesau.tabs).hide();
|
|
else
|
|
$("#THPD_WIZARDS .th_ok", p4.thesau.tabs).show();
|
|
|
|
$("#THPD_WIZARDS FORM :text")[0].focus();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// here when the 'filter' forms is submited with key <enter> or button <ok>
|
|
// force immediate search
|
|
function T_Gfilter(o)
|
|
{
|
|
var f;
|
|
if(o.nodeName=="FORM")
|
|
f = $(o).children(":text").val();
|
|
else if(o.nodeName=="INPUT")
|
|
f = o.value;
|
|
|
|
T_Gfilter_delayed(f, 0);
|
|
|
|
switch(p4.thesau.currentWizard)
|
|
{
|
|
case "wiz_0": // browse
|
|
break;
|
|
case "wiz_1": // accept
|
|
break;
|
|
case "wiz_2": // replace
|
|
T_replaceBy2(f);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// here when a key is pressed in the 'filter' form
|
|
function T_Gfilter_delayed(f, delay)
|
|
{
|
|
switch(p4.thesau.currentWizard)
|
|
{
|
|
case "wiz_0": // browse
|
|
T_filter_delayed2(f, delay, "ALL");
|
|
break;
|
|
case "wiz_1": // accept
|
|
T_filter_delayed2(f, delay, "CANDIDATE");
|
|
break;
|
|
case "wiz_2": // replace
|
|
T_filter_delayed2(f, delay, "CANDIDATE");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
function T_replaceBy2(f)
|
|
{
|
|
if(trees.C._selInfos.n != 1)
|
|
return;
|
|
var msg;
|
|
var term = trees.C._selInfos.sel.eq(0).find("span span").html();
|
|
|
|
var cid = trees.C._selInfos.sel[0].getAttribute('id').split('.');
|
|
cid.shift();
|
|
var sbas = cid.shift();
|
|
cid = cid.join('.');
|
|
|
|
trees.C._toReplace = { 'sbas':sbas, 'cid':cid, 'replaceby':f };
|
|
|
|
msg = $.sprintf('{% trans 'prod::thesaurusTab:dlg:Remplacement du candidat "%s" :' %}', term) ;
|
|
msg += "<br/><br/>";
|
|
msg += $.sprintf('{% trans 'prod::thesaurusTab:dlg:Remplacer par "%s"' %}', f) ;
|
|
|
|
$("#THPD_confirm_replace_dlg_msg").html(msg);
|
|
$("#THPD_confirm_replace_dlg").dialog('open');
|
|
}
|
|
|
|
|
|
function T_filter_delayed2(f, delay, mode)
|
|
{
|
|
if(this.timer)
|
|
{
|
|
window.clearTimeout(this.timer);
|
|
this.timer = null;
|
|
for(i in sbas)
|
|
{
|
|
if(sbas[i].seeker)
|
|
sbas[i].seeker.abort();
|
|
}
|
|
}
|
|
|
|
|
|
if(delay < 10)
|
|
delay = 10;
|
|
this.timer = window.setTimeout(
|
|
function()
|
|
{
|
|
if(mode=='ALL')
|
|
{
|
|
// search in every base, everywhere
|
|
for(i in sbas)
|
|
{
|
|
var zurl = "/xmlhttp/search_th_term_prod.j.php"
|
|
+ "?sbid=" + sbas[i].sbid
|
|
+ "&t=" + encodeURIComponent(f);
|
|
|
|
sbas[i].seeker = $.ajax({
|
|
url: zurl,
|
|
type:'POST',
|
|
data: [],
|
|
dataType:'json',
|
|
success: function(j)
|
|
{
|
|
var z = '#TX_P\\.' + j.parm['sbid'] + '\\.T';
|
|
|
|
var o = $(z);
|
|
var isLast = o.hasClass('last');
|
|
|
|
o.replaceWith(j.html);
|
|
|
|
if(isLast)
|
|
$(z).addClass('last');
|
|
},
|
|
error:function(){
|
|
|
|
},
|
|
timeout:function(){
|
|
|
|
}
|
|
});
|
|
|
|
|
|
|
|
}
|
|
}
|
|
else if(mode=='CANDIDATE')
|
|
{
|
|
// search only on the good base and the good branch(es)
|
|
for(i in sbas)
|
|
{
|
|
var zurl = "/xmlhttp/search_th_term_prod.j.php"
|
|
+ "?sbid=" + sbas[i].sbid;
|
|
|
|
if(sbas[i].sbid == trees.C._selInfos.sbas)
|
|
{
|
|
zurl += "&t=" + encodeURIComponent(f)
|
|
+ "&field=" + encodeURIComponent(trees.C._selInfos.field);
|
|
}
|
|
sbas[i].seeker = $.ajax({
|
|
url: zurl,
|
|
type:'POST',
|
|
data: [],
|
|
dataType:'json',
|
|
success: function(j)
|
|
{
|
|
var z = '#TX_P\\.' + j.parm['sbid'] + '\\.T';
|
|
|
|
var o = $(z);
|
|
var isLast = o.hasClass('last');
|
|
|
|
o.replaceWith(j.html);
|
|
|
|
if(isLast)
|
|
$(z).addClass('last');
|
|
},
|
|
error:function(){
|
|
|
|
},
|
|
timeout:function(){
|
|
|
|
}
|
|
});
|
|
|
|
}
|
|
}
|
|
},
|
|
delay
|
|
);
|
|
}
|
|
|
|
|
|
// ======================================================================================================
|
|
|
|
|
|
|
|
function T_replaceCandidates_OK(dlgnode)
|
|
{
|
|
$("#THPD_confirm_replace_dlg_msg").html("{% trans 'prod::thesaurusTab:dlg:Remplacement en cours.' %}");
|
|
|
|
// 3 cases
|
|
// the new term already exists (possibly many times) in the thesaurus
|
|
// the new term already exists in the candidates
|
|
// the new term is brand new
|
|
|
|
// the simpliest solution is to replace the terms and let the indexer work
|
|
|
|
|
|
var parms = {
|
|
url: "/xmlhttp/replacecandidate.j.php",
|
|
data: {
|
|
"sbid" : trees.C._toReplace.sbas
|
|
, "cid" : trees.C._toReplace.cid
|
|
, "t" : trees.C._toReplace.replaceby
|
|
// , "debug" : '1'
|
|
},
|
|
async: false,
|
|
cache: false,
|
|
dataType: "json",
|
|
timeout: 10*60*1000, // 10 minutes !
|
|
success: function(result, textStatus)
|
|
{
|
|
trees.C._toReplace = null;
|
|
thesauShowWizard("wiz_0", false);
|
|
$(dlgnode).dialog("close");
|
|
},
|
|
_ret: null // private alchemy
|
|
};
|
|
|
|
$.ajax( parms );
|
|
}
|
|
|
|
|
|
function T_acceptCandidates_OK(dlgnode)
|
|
{
|
|
$("#THPD_confirm_accept_dlg_msg").html("{% trans 'prod::thesaurusTab:dlg:Acceptation en cours.' %}");
|
|
|
|
var t_ids = [];
|
|
var dst = trees.C._toAccept.dst.split('.');
|
|
dst.shift();
|
|
var sbid = dst.shift();
|
|
dst = dst.join('.');
|
|
same_sbas = true;
|
|
// obviously the candidates and the target already complies (same sbas, good tbranch)
|
|
trees.C._selInfos.sel.each(
|
|
function()
|
|
{
|
|
var x = this.getAttribute('id').split('.');
|
|
x.shift();
|
|
if(x.shift() != sbid)
|
|
same_sbas = false;
|
|
t_ids.push(x.join('.'));
|
|
}
|
|
);
|
|
|
|
if(!same_sbas)
|
|
return;
|
|
|
|
|
|
var parms = {
|
|
url: "/xmlhttp/acceptcandidates.j.php",
|
|
data: {
|
|
// "debug": false,
|
|
"sbid" : sbid,
|
|
"tid" : dst,
|
|
"cid[]": t_ids,
|
|
"typ" : trees.C._toAccept.type,
|
|
"piv" : trees.C._toAccept.lng
|
|
},
|
|
async: false,
|
|
cache: false,
|
|
dataType: "json",
|
|
timeout: 10*60*1000, // 10 minutes !
|
|
success: function(result, textStatus)
|
|
{
|
|
for(i in result.refresh)
|
|
{
|
|
var zurl = "/xmlhttp/openbranch_prod.j.php"
|
|
+ "?type=" + result.refresh[i].type
|
|
+ "&sbid=" + result.refresh[i].sbid
|
|
+ "&id=" + encodeURIComponent(result.refresh[i].id);
|
|
if(result.refresh[i].type=='T')
|
|
zurl += "&sortsy=1" ;
|
|
|
|
$.get(zurl
|
|
, []
|
|
, function(j)
|
|
{
|
|
var z = '#' + j.parm['type']
|
|
+ 'X_P\\.'
|
|
+ j.parm['sbid'] + '\\.'
|
|
+ j.parm['id'].replace(new RegExp("\\.", "g"), "\\."); // escape les '.' pour jquery
|
|
|
|
$(z).replaceWith(j.html);
|
|
trees.C._toAccept = null;
|
|
thesauShowWizard("wiz_0",false);
|
|
$(dlgnode).dialog("close");
|
|
}
|
|
, "json");
|
|
}
|
|
|
|
// $("#THPD_confirm_accept_dlg_msg").dialog("close");
|
|
},
|
|
error:function(){},
|
|
timeout:function(){},
|
|
_ret: null // private alchemy
|
|
};
|
|
|
|
$.ajax( parms );
|
|
}
|
|
|
|
|
|
function C_deleteCandidates_OK()
|
|
{
|
|
$("#THPD_confirm_del_dlg_msg").html("{% trans 'prod::thesaurusTab:dlg:Suppression en cours.' %}");
|
|
|
|
var t_ids = [];
|
|
var lisel = trees.C.tree.find("LI .selected");
|
|
trees.C.tree.find("LI .selected").each(
|
|
function()
|
|
{
|
|
var x = this.getAttribute('id').split('.');
|
|
x.shift();
|
|
t_ids.push(x.join('.'));
|
|
}
|
|
);
|
|
var parms = {
|
|
url:"/xmlhttp/deletecandidates.j.php",
|
|
data:{"id[]":t_ids},
|
|
async:false,
|
|
cache:false,
|
|
dataType:"json",
|
|
timeout:10*60*1000, // 10 minutes !
|
|
success: function(result, textStatus)
|
|
{
|
|
for(i in result)
|
|
{
|
|
var cid = "#CX_P\\." + result[i].replace(new RegExp("\\.", "g"), "\\."); // escape les '.' pour jquery
|
|
$(cid).remove();
|
|
}
|
|
$("#THPD_confirm_del_dlg").dialog("close");
|
|
},
|
|
_ret: null
|
|
};
|
|
|
|
$.ajax( parms );
|
|
}
|
|
|
|
|
|
// menu option T:accept as...
|
|
function T_acceptCandidates(menuItem, menu, type)
|
|
{
|
|
var lidst = trees.T.tree.find("LI .selected");
|
|
if(lidst.length != 1)
|
|
return;
|
|
|
|
var lisel = trees.C.tree.find("LI .selected");
|
|
if(lisel.length == 0)
|
|
return;
|
|
|
|
var msg;
|
|
if(lisel.length > 1)
|
|
{
|
|
msg = $.sprintf("{% trans 'prod::thesaurusTab:dlg:accepter les %d termes candidats ?' %}", lisel.length);
|
|
}
|
|
else
|
|
{
|
|
var term = lisel.eq(0).find("span span").html();
|
|
msg = $.sprintf('{% trans 'prod::thesaurusTab:dlg:accepter le terme candidat "%s" ?' %}', term);
|
|
}
|
|
|
|
trees.C._toAccept.type = type;
|
|
trees.C._toAccept.dst = lidst.eq(0).attr("id");
|
|
|
|
$("#THPD_confirm_accept_dlg_msg").html(msg);
|
|
|
|
$("#THPD_confirm_accept_dlg").dialog('open');
|
|
}
|
|
|
|
|
|
// menu option T:search
|
|
function T_search(menuItem, menu, cmenu, e, label)
|
|
{
|
|
if(!menu._li)
|
|
return;
|
|
var tcids = menu._li.attr("id").split(".");
|
|
tcids.shift();
|
|
var sbid = tcids.shift();
|
|
var term = menu._li.find("span span").html();
|
|
|
|
v = '*:"' + term.replace("(", "[").replace(")", "]") + '"';
|
|
|
|
var nck = 0;
|
|
$('#adv_search :checkbox[name=bas\[\]]').each(function(a)
|
|
{
|
|
bas2sbas["b"+this.value].ckobj = this;
|
|
bas2sbas["b"+this.value].waschecked = this.checked;
|
|
if(bas2sbas["b"+this.value].sbid == sbid)
|
|
{
|
|
if(this.checked)
|
|
nck++;
|
|
}
|
|
else
|
|
{
|
|
this.checked = false;
|
|
}
|
|
}
|
|
);
|
|
|
|
if(nck == 0)
|
|
{
|
|
var i;
|
|
for(i in bas2sbas)
|
|
{
|
|
if(bas2sbas[i].sbid == sbid)
|
|
bas2sbas[i].ckobj.checked = true;
|
|
}
|
|
}
|
|
|
|
$('form[name="phrasea_query"] input[name="qry"]').val(v);
|
|
checkFilters();
|
|
newSearch();
|
|
}
|
|
|
|
|
|
function C_MenuOption(menuItem, menu, option, parm)
|
|
{
|
|
if(!trees.C._selInfos) // nothing selected in candidates ?
|
|
return;
|
|
|
|
trees.C._toAccept = null; // cancel previous 'accept' action anyway
|
|
trees.C._toReplace = null; // cancel previous 'replace' action anyway
|
|
switch(option)
|
|
{
|
|
case 'ACCEPT':
|
|
// glue selection to the tree
|
|
trees.C._toAccept = { 'lng': parm['lng'] } ;
|
|
|
|
// display helpful message into the thesaurus box...
|
|
var msg;
|
|
if(trees.C._selInfos.n > 1)
|
|
{
|
|
msg = $.sprintf("{% trans 'prod::thesaurusTab:wizard:clic-droit / accepter les %s termes candidats' %}", trees.C._selInfos.n);
|
|
}
|
|
else
|
|
{
|
|
msg = $.sprintf('{% trans 'prod::thesaurusTab:wizard:clic-droit / accepter le terme candidat "%s"' %}', menu._srcElement.find("span").html());
|
|
}
|
|
|
|
// set the content of the wizard
|
|
$("#THPD_WIZARDS .wiz_1 .txt").html(msg);
|
|
// ... and switch to the thesaurus tab
|
|
p4.thesau.tabs.tabs('select', 0);
|
|
thesauShowWizard("wiz_1", true);
|
|
|
|
break;
|
|
|
|
case 'REPLACE':
|
|
// display helpful message into the thesaurus box...
|
|
var msg;
|
|
if(trees.C._selInfos.n > 1)
|
|
{
|
|
msg = $.sprintf('{% trans 'prod::thesaurusTab:dlg:remplacer les %d termes des fiches par :' %}', trees.C._selInfos.n);
|
|
}
|
|
else
|
|
{
|
|
var term = trees.C._selInfos.sel.eq(0).find("span span").html();
|
|
msg = $.sprintf('{% trans 'prod::thesaurusTab:dlg:remplacer le terme "%s" des fiches par :' %}', term);
|
|
}
|
|
|
|
p4.thesau.tabs.tabs('select', 0);
|
|
|
|
// set the content of the wizard
|
|
$("#THPD_WIZARDS .wiz_2 .txt").html(msg);
|
|
// ... and switch to the thesaurus tab
|
|
thesauShowWizard("wiz_2", true);
|
|
|
|
break;
|
|
|
|
case 'DELETE':
|
|
$("#THPD_WIZARDS DIV", p4.thesau.tabs).hide();
|
|
// display helpful message into the thesaurus box...
|
|
var msg;
|
|
if(trees.C._selInfos.n > 1)
|
|
{
|
|
msg = $.sprintf("{% trans 'prod::thesaurusTab:dlg:supprimer les %d termes des fiches ?' %}", trees.C._selInfos.n);
|
|
}
|
|
else
|
|
{
|
|
var term = trees.C._selInfos.sel.eq(0).find("span span").html();
|
|
msg = $.sprintf('{% trans 'prod::thesaurusTab:dlg:supprimer le terme "%s" des fiches ?' %}', term);
|
|
}
|
|
|
|
$("#THPD_confirm_del_dlg_msg").html(msg);
|
|
|
|
$("#THPD_confirm_del_dlg").dialog('open');
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function Xclick(e)
|
|
{
|
|
var x = e.srcElement ? e.srcElement : e.target;
|
|
switch(x.nodeName)
|
|
{
|
|
case "DIV": // +/-
|
|
var li = $(x).closest('li');
|
|
var tids = li.attr('id').split('.');
|
|
var tid = tids.shift();
|
|
var sbid = tids.shift();
|
|
var type = tid.substr(0, 1);
|
|
if((type=='T'||type=='C') && tid.substr(1, 4)=="X_P") // TX_P ou CX_P
|
|
{
|
|
var ul = li.children('ul').eq(0);
|
|
if(ul.css("display")=='none' || is_ctrl_key(e))
|
|
{
|
|
if(is_ctrl_key(e))
|
|
{
|
|
var oldField = ul.attr('field');
|
|
ul.remove();
|
|
if(oldField)
|
|
li.append('<ul field="'+oldField+'">{% trans 'prod::thesaurusTab:tree:loading' %}</ul>');
|
|
else
|
|
li.append('<ul>{% trans 'prod::thesaurusTab:tree:loading' %}</ul>');
|
|
li.removeAttr('loaded');
|
|
}
|
|
|
|
ul.show();
|
|
|
|
if(!li.attr('loaded'))
|
|
{
|
|
var zurl = "/xmlhttp/openbranch_prod.j.php?type="+type+"&sbid="+sbid+"&id=" + encodeURIComponent(tids.join('.'));
|
|
if(li.hasClass('last'))
|
|
zurl += "&last=1";
|
|
if(type=='T')
|
|
zurl += "&sortsy=1";
|
|
$.get(zurl, [], function(j)
|
|
{
|
|
li.replaceWith(j.html);
|
|
}
|
|
, "json");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ul.hide();
|
|
}
|
|
}
|
|
break;
|
|
case "SPAN":
|
|
var li = $(x).closest('li');
|
|
var tids = li.attr('id').split('.');
|
|
var type = tids[0].substr(0, 1);
|
|
if((type=='T' && tids.length>2) || tids.length == 4) // && tids[0].substr(0, 1)=='C')
|
|
{
|
|
tids.pop();
|
|
var tid3 = tids.join('.');
|
|
if(!is_ctrl_key(e) && !is_shift_key(e))
|
|
{
|
|
$("LI", trees[type].tree).removeClass('selected');
|
|
p4.thesau.lastClickedCandidate = null;
|
|
}
|
|
else
|
|
{
|
|
// if($("#THPD_C_treeBox")._lastClicked)
|
|
if(p4.thesau.lastClickedCandidate != null)
|
|
{
|
|
if(p4.thesau.lastClickedCandidate.tid3 != tid3)
|
|
{
|
|
$("LI", trees[type].tree).removeClass('selected');
|
|
p4.thesau.lastClickedCandidate = null;
|
|
}
|
|
else
|
|
{
|
|
if(e.shiftKey)
|
|
{
|
|
var lip = li.parent().children('li');
|
|
var idx0 = lip.index(p4.thesau.lastClickedCandidate.item);
|
|
var idx1 = lip.index(li);
|
|
if(idx0 < idx1)
|
|
lip.filter(function(index){return(index >= idx0 && index <idx1); }).addClass('selected');
|
|
else
|
|
lip.filter(function(index){return(index > idx1 && index <=idx0); }).addClass('selected');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
li.toggleClass('selected');
|
|
if(type == 'C')
|
|
{
|
|
p4.thesau.lastClickedCandidate = { item:li, tid3:tid3 };
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
function TXdblClick(e)
|
|
{
|
|
var x = e.srcElement ? e.srcElement : e.target;
|
|
switch(x.nodeName)
|
|
{
|
|
case "SPAN": // term
|
|
switch(p4.thesau.currentWizard)
|
|
{
|
|
case "wiz_0": // simply browse
|
|
var tid = $(x).closest('li').attr('id');
|
|
if(tid.substr(0,5)=="TX_P.")
|
|
{
|
|
var sbid = tid.split(".")[1];
|
|
var term = $(x).hasClass('separator') ? $(x).prev().text() : $(x).text();
|
|
console.log('do thes');
|
|
doThesSearch('T', sbid, term, null);
|
|
}
|
|
break;
|
|
case "wiz_2": // replace by
|
|
var tid = $(x).closest('li').attr('id');
|
|
if(tid.substr(0,5)=="TX_P.")
|
|
{
|
|
var term = $(x).text();
|
|
$("#THPD_WIZARDS .wiz_2 :text").val(term);
|
|
T_replaceBy2(term);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
function CXdblClick(e)
|
|
{
|
|
var x = e.srcElement ? e.srcElement : e.target;
|
|
switch(x.nodeName)
|
|
{
|
|
case "SPAN": // term
|
|
var li = $(x).closest('li');
|
|
var tid = li.attr('id');
|
|
if(tid.substr(0,5)=="CX_P.")
|
|
{
|
|
var sbid = tid.split(".")[1];
|
|
var term = $(x).text();
|
|
var field = li.closest('[field]').attr('field');
|
|
|
|
doThesSearch('C', sbid, term, field);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
function doThesSearch(type, sbid, term, field)
|
|
{
|
|
var nck = 0;
|
|
$('#adv_search input[name="bas[]"]').each(
|
|
function(i,n)
|
|
{
|
|
var base_id = $(n).val();
|
|
|
|
bas2sbas["b"+base_id].ckobj = this;
|
|
bas2sbas["b"+base_id].waschecked = this.checked;
|
|
if(bas2sbas["b"+base_id].sbid == sbid)
|
|
{
|
|
if(this.checked)
|
|
nck++;
|
|
}
|
|
else
|
|
{
|
|
this.checked = false;
|
|
}
|
|
}
|
|
);
|
|
|
|
if(nck == 0 || type=='C')
|
|
{
|
|
var i;
|
|
for(i in bas2sbas)
|
|
{
|
|
if(bas2sbas[i].sbid == sbid)
|
|
bas2sbas[i].ckobj.checked = true;
|
|
}
|
|
}
|
|
if(type=='T')
|
|
v = '*:"' + term.replace("(", "[").replace(")", "]") + '"';
|
|
else
|
|
v = '"' + term + '" IN ' + field;
|
|
$('form[name="phrasea_query"] input[name="qry"]').val(v);
|
|
checkFilters();
|
|
newSearch();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function thesau_clickThesaurus(event) // onclick dans le thesaurus
|
|
{
|
|
// on cherche ou on a clique
|
|
for(e=event.srcElement ? event.srcElement : event.target; e && ((!e.tagName) || (!e.id)); e=e.parentNode)
|
|
;
|
|
if(e)
|
|
{
|
|
switch(e.id.substr(0,4))
|
|
{
|
|
case "TH_P": // +/- de deploiement de mot
|
|
js = "thesau_thesaurus_ow('"+e.id.substr(5)+"')";
|
|
self.setTimeout(js, 10);
|
|
break;
|
|
}
|
|
}
|
|
return(false);
|
|
}
|
|
|
|
function thesau_dblclickThesaurus(event) // onclick dans le thesaurus
|
|
{
|
|
var err;
|
|
try
|
|
{
|
|
p4.thesau.lastTextfocus.focus();
|
|
}
|
|
catch(err)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// on cherche ou on a clique
|
|
for(e=event.srcElement; e && ((!e.tagName) || (!e.id)); e=e.parentNode)
|
|
;
|
|
if(e)
|
|
{
|
|
switch(e.id.substr(0,4))
|
|
{
|
|
case "GL_W": // double click sur le mot
|
|
var t = e.id.split(".");
|
|
t.shift();
|
|
var sbid = t.shift();
|
|
var thid = t.join(".");
|
|
var url = "/xmlhttp/getsy_prod.x.php";
|
|
var parms = "bid=" + sbid + "&id=" + thid;
|
|
|
|
var xmlhttp = new XMLHttpRequest();
|
|
xmlhttp.open("POST", url, false);
|
|
xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
|
|
xmlhttp.send(parms);
|
|
var ret = xmlhttp.responseXML;
|
|
|
|
result = ret.getElementsByTagName("result");
|
|
if(result.length==1)
|
|
{
|
|
val = result.item(0).getAttribute("t");
|
|
replaceEditSel(val);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return(false);
|
|
}
|
|
|
|
function thesaurus_cw(id) // on clique sur un mot de thesaurus
|
|
{
|
|
return(false);
|
|
}
|
|
|
|
function thesau_thesaurus_ow(id) // on ouvre ou ferme une branche de thesaurus
|
|
{
|
|
var o = document.getElementById("TH_K."+id);
|
|
if(o.className=="o")
|
|
{
|
|
// on ferme
|
|
o.className = "c";
|
|
document.getElementById("TH_P."+id).innerHTML = "+";
|
|
document.getElementById("TH_K."+id).innerHTML = "{% trans 'prod::thesaurusTab:tree:loading' %}";
|
|
}
|
|
else if(o.className=="c" || o.className=="h")
|
|
{
|
|
// on ouvre
|
|
o.className = "o";
|
|
document.getElementById("TH_P."+id).innerHTML = "-";
|
|
|
|
var t_id = id.split(".");
|
|
var sbas_id = t_id[0];
|
|
t_id.shift();
|
|
var thid = t_id.join(".");
|
|
var url = "/xmlhttp/getterm_prod.x.php";
|
|
var parms = "bid=" + sbas_id;
|
|
parms += "&lng="+p4.lng;
|
|
parms += "&sortsy=1";
|
|
parms += "&id=" + thid;
|
|
parms += "&typ=TH";
|
|
|
|
p4.thesau.thlist['s'+sbas_id].openBranch(id, thid);
|
|
}
|
|
return(false);
|
|
}
|
|
|
|
function replaceEditSel(value)
|
|
{
|
|
if(!p4.thesau.lastTextfocus || !p4.thesau.lastTextfocus.selectedTerm)
|
|
return;
|
|
// alert(textarea.selectedTerm.start + " ; " + textarea.selectedTerm.end);
|
|
p4.thesau.lastTextfocus.value = p4.thesau.lastTextfocus.value.substr(0, p4.thesau.lastTextfocus.selectedTerm.start) + value + p4.thesau.lastTextfocus.value.substr(p4.thesau.lastTextfocus.selectedTerm.end);
|
|
if(typeof(document.selection) != 'undefined')
|
|
{
|
|
// explorer
|
|
var range = p4.thesau.lastTextfocus.createTextRange();
|
|
range.move('character', p4.thesau.lastTextfocus.selectedTerm.start + value.length);
|
|
range.select();
|
|
}
|
|
else if(typeof(p4.thesau.lastTextfocus.selectionStart) != 'undefined')
|
|
{
|
|
// gecko (safari)
|
|
p4.thesau.lastTextfocus.selectionStart = p4.thesau.lastTextfocus.selectionEnd = p4.thesau.lastTextfocus.selectedTerm.start + value.length;
|
|
}
|
|
cbEditing2(p4.thesau.lastTextfocus, "MOUSEUP"); // force le calcul de la nouvelle selection
|
|
p4.thesau.lastTextfocus.focus();
|
|
return;
|
|
}
|
|
|
|
|
|
function ThesauThesaurusSeeker(sbas_id)
|
|
{
|
|
this.sbas_id = sbas_id;
|
|
this._ctimer = null;
|
|
this._xmlhttp = null;
|
|
this.tObj = { 'TH_searching':null , 'TH_P':null , 'TH_K':null };
|
|
this.search = function(txt) {
|
|
if(this._ctimer)
|
|
clearTimeout(this._ctimer);
|
|
var js = "p4.thesau.thlist['s"+this.sbas_id+"'].search_delayed('"+txt.replace("'", "\\'")+"');" ;
|
|
this._ctimer = setTimeout(js, 100);
|
|
} ;
|
|
this.search_delayed = function(txt) {
|
|
var me = this;
|
|
if($this._xmlttp.abort && typeof $this._xmlttp.abort == 'function')
|
|
{
|
|
this._xmlhttp.abort();
|
|
}
|
|
var url = "/xmlhttp/openbranches_prod.x.php";
|
|
var parms = {
|
|
bid : this.sbas_id,
|
|
t : txt,
|
|
mod : "TREE"
|
|
};
|
|
|
|
this._xmlhttp = $.ajax({
|
|
url: url,
|
|
type:'POST',
|
|
data: parms,
|
|
success: function(ret)
|
|
{
|
|
me.xmlhttpstatechanged(ret);
|
|
},
|
|
error:function(){
|
|
|
|
},
|
|
timeout:function(){
|
|
|
|
}
|
|
});
|
|
|
|
this._ctimer = null;
|
|
} ;
|
|
this.openBranch = function(id, thid) {
|
|
var me = this;
|
|
if($this._xmlttp.abort && typeof $this._xmlttp.abort == 'function')
|
|
{
|
|
this._xmlhttp.abort();
|
|
}
|
|
var url = "/xmlhttp/getterm_prod.x.php";
|
|
var parms = {
|
|
bid : this.sbas_id,
|
|
sortsy : 1,
|
|
id : thid,
|
|
typ : "TH"
|
|
}
|
|
|
|
this._xmlhttp = $.ajax({
|
|
url: url,
|
|
type:'POST',
|
|
data: parms,
|
|
success: function(ret)
|
|
{
|
|
me.xmlhttpstatechanged(ret, id);
|
|
},
|
|
error:function(){
|
|
|
|
},
|
|
timeout:function(){
|
|
|
|
}
|
|
});
|
|
|
|
};
|
|
this.xmlhttpstatechanged = function(ret, id) {
|
|
try
|
|
{
|
|
if(!this.tObj["TH_searching"])
|
|
this.tObj["TH_searching"] = document.getElementById("TH_searching");
|
|
this.tObj["TH_searching"].src = "/skins/icons/ftp-loader-blank.gif";
|
|
|
|
if(ret) // && (typeof(ret.parsed)=="undefined" || ret.parsed))
|
|
{
|
|
var htmlnodes = ret.getElementsByTagName("html");
|
|
if(htmlnodes && htmlnodes.length==1 && (htmlnode=htmlnodes.item(0).firstChild))
|
|
{
|
|
if(typeof(id)=="undefined")
|
|
{
|
|
// called from search or 'auto' : full thesaurus search
|
|
if(!this.tObj["TH_P"])
|
|
this.tObj["TH_P"] = document.getElementById("TH_P."+this.sbas_id+".T");
|
|
if(!this.tObj["TH_K"])
|
|
this.tObj["TH_K"] = document.getElementById("TH_K."+this.sbas_id+".T");
|
|
this.tObj["TH_P"].innerHTML = "...";
|
|
this.tObj["TH_K"].className = "h";
|
|
this.tObj["TH_K"].innerHTML = htmlnode.nodeValue;
|
|
}
|
|
else
|
|
{
|
|
// called from 'openBranch'
|
|
// var js = "document.getElementById('TH_K."+thid+"').innerHTML = \""+htmlnode.nodeValue+"\"";
|
|
// self.setTimeout(js, 10);
|
|
document.getElementById("TH_K."+id).innerHTML = htmlnode.nodeValue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch(err)
|
|
{
|
|
;
|
|
}
|
|
};
|
|
}
|
|
|
|
|
|
function cbEditing2(textarea, act)
|
|
{
|
|
var sbas_id = p4.edit.sbas_id;
|
|
tmpCurField = 0;
|
|
|
|
if(textarea.id=="idZTextArea")
|
|
{
|
|
tmpCurField = p4.edit.curField ;
|
|
}
|
|
else
|
|
{
|
|
if(textarea.id=="idZTextAreaReg")
|
|
tmpCurField = p4.edit.curFieldReg;
|
|
}
|
|
|
|
p4.thesau.lastTextfocus = textarea;
|
|
textarea.selectedTerm = null;
|
|
var p0 = -1;
|
|
var p1 = -1;
|
|
if(typeof(document.selection) != 'undefined')
|
|
{
|
|
// ici si explorer
|
|
var range = document.selection.createRange();
|
|
var i;
|
|
var oldrange = range.duplicate();
|
|
for(i=0; i<200; i++, p0++)
|
|
{
|
|
pe = range.parentElement();
|
|
if(pe != textarea)
|
|
break;
|
|
range.moveStart("character", -1);
|
|
}
|
|
range = oldrange.duplicate();
|
|
for(i=0; i<200; i++, p1++)
|
|
{
|
|
pe = range.parentElement();
|
|
if(pe != textarea)
|
|
break;
|
|
range.moveEnd("character", -1);
|
|
}
|
|
}
|
|
else if(typeof(textarea.selectionStart) != "undefined")
|
|
{
|
|
// ici si gecko (safari)
|
|
p0 = textarea.selectionStart;
|
|
p1 = textarea.selectionEnd;
|
|
}
|
|
if(p0 != -1 && p1 != -1)
|
|
{
|
|
var c;
|
|
// on etend les positions a tout le keyword (entre ';')
|
|
t = textarea.value;
|
|
l = t.length;
|
|
for( ; p0 > 0; p0--)
|
|
{
|
|
c = t.charCodeAt(p0-1);
|
|
if(c==59 || c==10 || c==13) // 59==";"
|
|
break;
|
|
}
|
|
for( ; p1 < l; p1++)
|
|
{
|
|
c = t.charCodeAt(p1);
|
|
if(c==59 || c==10 || c==13)
|
|
break;
|
|
}
|
|
// on copie le resultat dans le textarea
|
|
textarea.selectedTerm = { start:p0, end:p1 };
|
|
|
|
// on cherche le terme dans le thesaurus
|
|
var zText = textarea.value.substr(p0, p1-p0);
|
|
|
|
if(document.forms["formSearchTH"].formSearchTHck.checked)
|
|
{
|
|
if(zText && zText.length>2 && document.forms["formSearchTH"].formSearchTHfld.value != zText)
|
|
{
|
|
document.forms["formSearchTH"].formSearchTHfld.value = zText;
|
|
|
|
document.getElementById("TH_searching").src = "/skins/icons/ftp-loader.gif";
|
|
p4.thesau.thlist['s'+sbas_id].search(zText);
|
|
}
|
|
}
|
|
}
|
|
return(true);
|
|
}
|
|
|
|
function thesauSearchAll()
|
|
{
|
|
var value = document.forms["formSearchTH"].formSearchTHfld.value;
|
|
if(value == "")
|
|
{
|
|
loaded();
|
|
self.setTimeout('document.forms["formSearchTH"].formSearchTHfld.focus()', 100);
|
|
}
|
|
else
|
|
{
|
|
var url, i, bid;
|
|
document.getElementById("TH_searching").src = "/skins/icons/ftp-loader.gif";
|
|
for(i in p4.thesau.thlist)
|
|
{
|
|
thlist[i].search(value);
|
|
}
|
|
}
|
|
}
|
|
|
|
function clkOnglet(onglet)
|
|
{
|
|
switch(onglet)
|
|
{
|
|
case "FULL":
|
|
document.getElementById("TH_Ofull").style.display = "block";
|
|
document.getElementById("TH_Oclip").style.display = "none";
|
|
document.getElementById("TH_Otabs_full").className = "actif";
|
|
document.getElementById("TH_Otabs_clipboard").className = "inactif";
|
|
break;
|
|
case "PROP":
|
|
document.getElementById("TH_Ofull").style.display = "none";
|
|
document.getElementById("TH_Oclip").style.display = "none";
|
|
document.getElementById("TH_Otabs_full").className = "inactif";
|
|
document.getElementById("TH_Otabs_clipboard").className = "inactif";
|
|
break;
|
|
case "CLIP":
|
|
document.getElementById("TH_Ofull").style.display = "none";
|
|
document.getElementById("TH_Oclip").style.display = "block";
|
|
document.getElementById("TH_Otabs_full").className = "inactif";
|
|
document.getElementById("TH_Otabs_clipboard").className = "actif";
|
|
break;
|
|
}
|
|
}
|
|
|
|
function startThesaurus(){
|
|
|
|
p4.thesau.thlist = {
|
|
{% set first = 1 %}
|
|
{% for base in module_prod.get_search_datas['bases'] %}
|
|
{% if base['thesaurus'] %}
|
|
{% if first == 0 %},{% endif %}
|
|
"s{{base['sbas_id']}}": new ThesauThesaurusSeeker({{base['sbas_id']}})
|
|
{% set first = 0 %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
};
|
|
p4.thesau.currentWizard = "???";
|
|
|
|
sbas = {{thesau_json_sbas|raw}};
|
|
bas2sbas = {{thesau_json_bas2sbas|raw}};
|
|
|
|
p4.thesau.lastTextfocus = null;
|
|
|
|
p4.thesau.lastClickedCandidate = null;
|
|
|
|
// $("#THPD_confirm_del_dlg").remove();
|
|
// $("#THPD_confirm_accept_dlg").remove();
|
|
// $("#THPD_confirm_replace_dlg").remove();
|
|
|
|
p4.thesau.tabs = $("#THPD_tabs");
|
|
p4.thesau.tabs.tabs();
|
|
|
|
trees = {
|
|
'T':{
|
|
'tree' : $("#THPD_T_tree", p4.thesau.tabs)
|
|
},
|
|
'C':{
|
|
'tree' : $("#THPD_C_tree", p4.thesau.tabs)
|
|
, '_toAccept' : null // may contain : {'type', 'dst', 'lng'}
|
|
, '_toReplace' : null //
|
|
, '_selInfos' : null // may contain : {'sel':lisel, 'field':field, 'sbas':sbas, 'n':lisel.length}
|
|
}
|
|
};
|
|
|
|
$("#THPD_confirm_del_dlg").dialog( {
|
|
modal:true,
|
|
autoOpen:false,
|
|
buttons:{
|
|
"{% trans 'boutton::ok' %}":function()
|
|
{
|
|
C_deleteCandidates_OK();
|
|
},
|
|
"{% trans 'boutton::annuler' %}":function()
|
|
{
|
|
$(this).dialog("close");
|
|
}
|
|
}
|
|
}
|
|
);
|
|
|
|
|
|
$("#THPD_confirm_accept_dlg").dialog( {
|
|
closeOnEscape:true,
|
|
resizable:false,
|
|
draggable:false,
|
|
modal:true,
|
|
autoOpen:false,
|
|
buttons:{
|
|
"{% trans 'prod::thesaurusTab:dlg:OK' %}":function()
|
|
{
|
|
T_acceptCandidates_OK(this);
|
|
},
|
|
"{% trans 'prod::thesaurusTab:dlg:Annuler' %}":function()
|
|
{
|
|
$(this).dialog("close");
|
|
}
|
|
}
|
|
}
|
|
);
|
|
|
|
|
|
$("#THPD_confirm_replace_dlg").dialog( {
|
|
closeOnEscape:true,
|
|
resizable:false,
|
|
draggable:false,
|
|
modal:true,
|
|
autoOpen:false,
|
|
buttons:{
|
|
"{% trans 'prod::thesaurusTab:dlg:OK' %}":function()
|
|
{
|
|
T_replaceCandidates_OK(this);
|
|
},
|
|
"{% trans 'prod::thesaurusTab:dlg:Annuler' %}":function()
|
|
{
|
|
$(this).dialog("close");
|
|
}
|
|
}
|
|
}
|
|
);
|
|
|
|
|
|
trees.T.tree.contextMenu(
|
|
[
|
|
{
|
|
label:'{% trans 'boutton::chercher' %}',
|
|
onclick:function(menuItem, menu, cmenu, e, label)
|
|
{
|
|
T_search(menuItem, menu, cmenu, e, label);
|
|
}
|
|
},
|
|
{
|
|
label:'{% trans 'prod::thesaurusTab:tmenu:Accepter comme terme specifique' %}',
|
|
onclick:function(menuItem, menu)
|
|
{
|
|
T_acceptCandidates(menuItem, menu, 'TS');
|
|
}
|
|
},
|
|
{
|
|
label:'{% trans 'prod::thesaurusTab:tmenu:Accepter comme synonyme' %}',
|
|
onclick:function(menuItem, menu)
|
|
{
|
|
T_acceptCandidates(menuItem, menu, 'SY');
|
|
}
|
|
}
|
|
]
|
|
,
|
|
{
|
|
className:"THPD_TMenu",
|
|
beforeShow:function()
|
|
{
|
|
var menuOptions = $(this.menu).find(".context-menu-item");
|
|
menuOptions.eq(1).addClass("context-menu-item-disabled");
|
|
menuOptions.eq(2).addClass("context-menu-item-disabled");
|
|
|
|
var x = this._showEvent.srcElement ? this._showEvent.srcElement : this._showEvent.target;
|
|
var li = $(x).closest("li");
|
|
this._li = null;
|
|
var tcids = li.attr("id").split(".");
|
|
if(tcids.length > 2 && tcids[0] == "TX_P" && tcids[2] != 'T' && x.nodeName != "LI")
|
|
{
|
|
this._li = li;
|
|
tcids.shift();
|
|
var sbas = tcids.shift();
|
|
|
|
// this._srcElement = li; // private alchemy
|
|
if(!li.hasClass('selected'))
|
|
{
|
|
// rclick OUTSIDE the selection : unselect all
|
|
trees.T.tree.find("LI").removeClass('selected');
|
|
|
|
$("li", trees.T.tree).removeClass('selected');
|
|
li.addClass('selected');
|
|
}
|
|
|
|
if(trees.C._selInfos && trees.C._selInfos.sbas == sbas)
|
|
{
|
|
// whe check if the candidates can be validated here
|
|
// aka does the tbranch of the field (of candidates) reaches the paste location ?
|
|
var parms = { url:"/xmlhttp/checkcandidatetarget.j.php"
|
|
+ "?sbid=" + sbas
|
|
+ "&acf=" + encodeURIComponent(trees.C._selInfos.field)
|
|
+ "&id=" + encodeURIComponent(tcids.join('.')) ,
|
|
data:[],
|
|
async:false,
|
|
cache:false,
|
|
dataType:"json",
|
|
timeout:1000,
|
|
success: function(result, textStatus)
|
|
{
|
|
this._ret = result ;
|
|
if(result.acceptable)
|
|
{
|
|
menuOptions.eq(1).removeClass("context-menu-item-disabled");
|
|
menuOptions.eq(2).removeClass("context-menu-item-disabled");
|
|
}
|
|
},
|
|
_ret: null // private alchemy
|
|
};
|
|
|
|
$.ajax( parms );
|
|
|
|
}
|
|
}
|
|
return(true);
|
|
}
|
|
}
|
|
);
|
|
|
|
trees.C.tree.contextMenu(
|
|
[
|
|
{% for lng_code, lng in thesau_languages %}
|
|
{
|
|
label:'{% trans %}prod::thesaurusTab:cmenu:Accepter en {{lng_code}}{% endtrans %}',
|
|
onclick:function(menuItem, menu)
|
|
{
|
|
C_MenuOption(menuItem, menu, "ACCEPT", {'lng':'{{lng_code}}'});
|
|
}
|
|
},
|
|
{% endfor %}
|
|
{
|
|
label:'{% trans 'prod::thesaurusTab:cmenu:Remplacer par...' %}',
|
|
onclick:function(menuItem, menu)
|
|
{
|
|
C_MenuOption(menuItem, menu, 'REPLACE', null);
|
|
}
|
|
},
|
|
{
|
|
label:'{% trans 'boutton::supprimer' %}',
|
|
onclick:function(menuItem, menu)
|
|
{
|
|
C_MenuOption(menuItem, menu, 'DELETE', null);
|
|
}
|
|
}
|
|
]
|
|
,
|
|
{
|
|
beforeShow:function()
|
|
{
|
|
var ret = false;
|
|
|
|
var x = this._showEvent.srcElement ? this._showEvent.srcElement : this._showEvent.target;
|
|
var li = $(x).closest("li");
|
|
|
|
if(!li.hasClass('selected'))
|
|
{
|
|
// rclick OUTSIDE the selection : unselect all
|
|
// lisel.removeClass('selected');
|
|
trees.C.tree.find("LI").removeClass('selected');
|
|
p4.thesau.lastClickedCandidate = null;
|
|
}
|
|
var tcids = li.attr("id").split(".");
|
|
if(tcids.length == 4 && tcids[0] == "CX_P" && x.nodeName != "LI")
|
|
{
|
|
// candidate context menu only clicking on final term
|
|
if(!li.hasClass('selected'))
|
|
li.addClass('selected');
|
|
// this._cutInfos = { sbid:tcids[1], field:li.parent().attr('field') }; // private alchemy
|
|
this._srcElement = li; // private alchemy
|
|
|
|
// as selection changes, compute usefull info (field, sbas)
|
|
var lisel = trees.C.tree.find("LI .selected");
|
|
if(lisel.length > 0)
|
|
{
|
|
// lisel are all from the same candidate field, so check the first li
|
|
var li0 = lisel.eq(0);
|
|
var field = li0.parent().attr("field");
|
|
var sbas = li0.attr("id").split('.')[1];
|
|
|
|
// glue selection info to the tree
|
|
trees.C._selInfos = {'sel':lisel, 'field':field, 'sbas':sbas, 'n':lisel.length} ;
|
|
}
|
|
else
|
|
{
|
|
trees.C._selInfos = null;
|
|
}
|
|
|
|
ret = true;
|
|
}
|
|
return(ret);
|
|
}
|
|
}
|
|
);
|
|
|
|
}
|