/*
* This file is part of NOALYSS.
*
* NOALYSS 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.
*
* NOALYSS 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.
*
* You should have received a copy of the GNU General Public License
* along with NOALYSS; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* $Revision$ */
// Copyright Author Dany De Bontridder danydb@aevalys.eu
/*!\file
* \brief javascript script, always added to every page
*
*/
var ask_reload = 0;
var tag_choose = '';
/**
* callback function when we just need to update a hidden div with an info
* message
*/
function infodiv(req, json)
{
try
{
remove_waiting_box();
var answer = req.responseXML;
var a = answer.getElementsByTagName('ctl');
var html = answer.getElementsByTagName('code');
if (a.length === 0)
{
var rec = req.responseText;
alert_box('erreur :' + rec);
}
var name_ctl = a[0].firstChild.nodeValue;
var code_html = getNodeText(html[0]);
code_html = unescape_xml(code_html);
g(name_ctl + "info").innerHTML = code_html;
}
catch (e)
{
alert_box("success_box" + e.message);
}
try
{
code_html.evalScripts();
}
catch (e)
{
alert_box("answer_box Impossible executer script de la reponse\n" + e.message);
}
}
/**
*@brief delete a row from a table (tb) the input button send the this
as second parameter
*/
function deleteRow(tb, obj)
{
smoke.confirm('Confirmez effacement',function (e)
{
if (e) {
var td = obj.parentNode;
var tr = td.parentNode;
var lidx = tr.rowIndex;
g(tb).deleteRow(lidx);
} else {
return ;
}
});
}
function deleteRowRec(tb, obj)
{
var tr = obj;
var lidx = tr.rowIndex;
g(tb).deleteRow(lidx);
}
/*!\brief remove trailing and heading space
* \param the string to modify
* \return string without heading and trailing space
*/
function trim(s)
{
return s.replace(/^\s+/, '').replace(/\s+$/, '');
}
/**
* @brief retrieve an element thanks its ID
* @param ID is a string
* @return the found object of undefined if not found
*/
function g(ID)
{
if (document.getElementById)
{
return this.document.getElementById(ID);
}
else if (document.all)
{
return document.all[ID];
}
else
{
return undefined;
}
}
/**
*@brief enable the type of periode
*/
function enable_type_periode()
{
if ($("type_periode").options[$("type_periode").selectedIndex].value == 0)
{
$('from_periode').enable();
$('to_periode').enable();
$('from_date').disable();
$('to_date').disable();
$('p_step').enable();
}
else
{
$('from_periode').disable();
$('to_periode').disable();
$('from_date').enable();
$('to_date').enable();
$('p_step').disable();
}
}
/**
*@brief will reload the window but it is dangerous if we have submitted
* a form with POST
*/
function refresh_window()
{
window.location.reload();
}
/**
*@fn encodeJSON(obj)
*@brief we receive a json object as parameter and the function returns the string
* with the format variable=value&var2=val2...
*/
function encodeJSON(obj)
{
if (typeof obj != 'object')
{
alert_box('encodeParameter obj n\'est pas un objet');
}
try
{
var str = '';
var e = 0;
for (i in obj)
{
if (e !== 0)
{
str += '&';
}
else
{
e = 1;
}
str += i;
str += '=' + encodeURI(obj[i]);
}
return str;
}
catch (e)
{
alert_box('encodeParameter ' + e.message);
return "";
}
}
function hide(p_param)
{
g(p_param).style.display = 'none';
}
function show(p_param)
{
g(p_param).style.display = 'block';
}
/**
*@brief set the focus on the selected field
*@param Field id of the control
*@param selectIt : the value selected in case of Field is a object select, numeric
*/
function SetFocus(Field, SelectIt)
{
var elem = g(Field);
if (elem)
{
elem.focus();
}
return true;
}
/**
* @brief set a DOM id with a value in the parent window (the caller),
@param p_ctl is the name of the control
@param p_value is the value to set in
@param p_add if we don't replace the current value but we add something
*/
function set_inparent(p_ctl, p_value, p_add)
{
self.opener.set_value(p_ctl, p_value, p_add);
}
/**
* @brief set a DOM id with a value, it will consider if it the attribute
value or innerHTML has be used
@param p_ctl is the name of the control
@param p_value is the value to set in
@param p_add if we don't replace the current value but we add something
*/
function set_value(p_ctl, p_value, p_add)
{
if (g(p_ctl))
{
var g_ctrl = g(p_ctl);
if (p_add != undefined && p_add === 1)
{
if (g_ctrl.value)
{
p_value = g_ctrl.value + ',' + p_value;
}
}
if (g_ctrl.tagName === 'INPUT')
{
g(p_ctl).value = p_value;
}
if (g_ctrl.tagName === 'SPAN')
{
g(p_ctl).innerHTML = p_value;
}
if (g_ctrl.tagName === 'SELECT')
{
g(p_ctl).value = p_value;
}
}
}
/**
*@brief format the number change comma to point
*@param HTML obj
*/
function format_number(obj, p_prec)
{
var precision = 2;
if (p_prec === undefined)
{
precision = 2;
} else {
precision = p_prec;
}
var value = obj.value;
value = value.replace(/,/, '.');
value = parseFloat(value);
if (isNaN(value))
{
value = 0;
}
var arrondi = Math.pow(10, precision);
value = Math.round(value * arrondi) / arrondi;
$(obj).value = value;
}
/**
*@brief check if the object is hidden or show and perform the opposite,
* show the hidden obj or hide the shown one
*@param name of the object
*/
function toggleHideShow(p_obj, p_button)
{
var stat = g(p_obj).style.display;
var str = g(p_button).value;
if (stat === 'none')
{
show(p_obj);
str = str.replace(/Afficher/, 'Cacher');
g(p_button).value = str;
}
else
{
hide(p_obj);
str = str.replace(/Cacher/, 'Afficher');
g(p_button).value = str;
}
}
/**
*@brief open popup with the search windows
*@param p_dossier the dossier where to search
*@param p_style style of the detail value are E for expert or S for simple
*/
function popup_recherche(p_dossier)
{
var w = window.open("recherche.php?gDossier=" + p_dossier + "&ac=SEARCH", '', 'statusbar=no,scrollbars=yes,toolbar=no');
w.focus();
}
/**
*@brief replace the special characters (><'") by their HTML representation
*@return a string without the offending char.
*/
function unescape_xml(code_html)
{
code_html = code_html.replace(/\</, '<');
code_html = code_html.replace(/\>/, '>');
code_html = code_html.replace(/\"/, '"');
code_html = code_html.replace(/\'/, "'");
code_html = code_html.replace(/\&/, '&');
return code_html;
}
/**
*@brief Firefox splits the XML into 4K chunk, so to retrieve everything we need
* to get the different parts thanks textContent
*@param xmlNode a node (result of var data = =answer.getElementsByTagName('code'))
*@return all the content of the XML node
*/
function getNodeText(xmlNode)
{
if (!xmlNode)
return '';
if (typeof (xmlNode.textContent) != "undefined")
{
return xmlNode.textContent;
}
if (xmlNode.firstChild && xmlNode.firstChild.nodeValue)
return xmlNode.firstChild.nodeValue;
return "";
}
/**
*@brief change the periode in the calendar of the dashboard
*@param object select
*/
function change_month(obj)
{
var action = new Ajax.Request(
"ajax_misc.php",
{
method: 'get',
parameters: { gDossier : obj.gDossier , op:'cal' ,"per" : obj.value , t: obj.type_display, notitle:obj.notitle},
onFailure: ajax_misc_failure,
onSuccess: success_misc
}
);
}
/**
*@brief basic answer to ajax on success, it will fill the DOMID code with
* the code. In that case, you need to create the object before the Ajax.Request
*The difference with success box is that
*@see add_div removeDiv success_box is that the width and height are not changed ajax_misc.php
*@parameter code is the ID of the object containing the html (div, button...)
*@parameter value is the html code, with it you fill the ctl element
*/
function success_misc(req)
{
try
{
var answer = req.responseXML;
var html = answer.getElementsByTagName('code');
if (html.length === 0)
{
var rec = req.responseText;
alert_box('erreur :' + rec);
}
var nodeXml = html[0];
var code_html = getNodeText(nodeXml);
code_html = unescape_xml(code_html);
$("user_cal").innerHTML = code_html;
}
catch (e)
{
alert_box(e.message);
}
try
{
code_html.evalScripts();
}
catch (e)
{
alert_box("Impossible executer script de la reponse\n" + e.message);
}
}
function loading()
{
var str = '
Un instant ...
';
str = str + '';
return str;
}
function ajax_misc_failure()
{
alert_box('Ajax Misc failed');
}
/**
*@brief remove a document_modele
*/
function cat_doc_remove(p_dt_id, p_dossier)
{
var queryString = "gDossier=" + p_dossier + "&op=rem_cat_doc" + "&dt_id=" + p_dt_id;
var action = new Ajax.Request(
"ajax_misc.php", {method: 'get',
parameters: queryString,
onFailure: ajax_misc_failure,
onSuccess: function (req)
{
try
{
var answer = req.responseXML;
var html = answer.getElementsByTagName('dtid');
if (html.length === 0)
{
var rec = req.responseText;
alert_box('erreur ' + rec );
return;
}
nodeXML = html[0];
row_id = getNodeText(nodeXML);
if (row_id === 'nok')
{
var message_node = answer.getElementsByTagName('message');
var message_text = getNodeText(message_node[0]);
alert_box('erreur ' + message_text);
return;
}
$('row' + row_id).style.textDecoration = "line-through";
$('X' + row_id).style.display='none';
$('M' + row_id).style.display='none';
}
catch (e)
{
alert_box(e.message);
}
}
}
);
}
/**
*@brief change a document_modele
*/
function cat_doc_change(p_dt_id, p_dossier)
{
var queryString = "gDossier=" + p_dossier + "&op=mod_cat_doc" + "&dt_id=" + p_dt_id;
var nTop = calcy(posY);
var nLeft = "200px";
var str_style = "top:" + nTop + "px;left:" + nLeft + ";width:50em;height:auto";
removeDiv('change_doc_div');
waiting_box();
var action = new Ajax.Request(
"ajax_misc.php",
{
method: 'get', parameters: queryString,
onFailure: ajax_misc_failure,
onSuccess: function (req) {
remove_waiting_box();
add_div({id: 'change_doc_div', style: str_style, cssclass: 'inner_box', drag: "1"});
$('change_doc_div').innerHTML = req.responseText;
}
}
);
}
/**
*@brief display the popup with vat and explanation
*@param obj with 4 attributes gdossier, ctl,popup
*/
function popup_select_tva(obj)
{
try
{
if ($('tva_select')) {
removeDiv('tva_select');
}
var queryString = "gDossier=" + obj.gDossier + "&op=dsp_tva" + "&ctl=" + obj.ctl + '&popup=' + 'tva_select';
if (obj.jcode)
queryString += '&code=' + obj.jcode;
if (obj.compute)
queryString += '&compute=' + obj.compute;
var action = new Ajax.Request(
"ajax_misc.php",
{method: 'get',
parameters: queryString,
onFailure: ajax_misc_failure,
onSuccess: function (req)
{
try
{
var answer = req.responseXML;
var popup = answer.getElementsByTagName('popup');
if (popup.length === 0)
{
var rec = req.responseText;
alert_box('erreur :' + rec);
}
var html = answer.getElementsByTagName('code');
var name_ctl = popup[0].firstChild.nodeValue;
var nodeXml = html[0];
var code_html = getNodeText(nodeXml);
code_html = unescape_xml(code_html);
var nTop = posY - 200;
var nLeft = "15%";
var str_style = "top:" + nTop + "px;left:" + nLeft + ";right:" + nLeft + ";width:55em;height:auto";
var popup = {'id': 'tva_select', 'cssclass': 'inner_box', 'style': str_style, 'html': code_html, 'drag': true};
add_div(popup);
$('lk_tva_select_table').focus();
}
catch (e)
{
alert_box("success_popup_select_tva " + e.message);
}
}
}
);
}
catch (e)
{
alert_box("popup_select_tva " + e.message);
}
}
/**
*@brief display the popup with vat and explanations
*@obsolete
*/
function success_popup_select_tva_obsolete(req)
{
}
/**
*@brief display the popup with vat and explanation
*@param obj with 4 attributes gdossier, ctl,popup
*/
function set_tva_label(obj)
{
try
{
var queryString = "gDossier=" + obj.gDossier + "&op=label_tva" + "&id=" + obj.value;
if (obj.jcode)
queryString += '&code=' + obj.jcode;
var action = new Ajax.Request(
"ajax_misc.php",
{method: 'get',
parameters: queryString,
onFailure: ajax_misc_failure,
onSuccess: success_set_tva_label
}
);
}
catch (e)
{
alert_box("set_tva_label " + e.message);
}
}
/**
*@brief display the popup with vat and explanations
*/
function success_set_tva_label(req)
{
try
{
var answer = req.responseXML;
var code = answer.getElementsByTagName('code');
var value = answer.getElementsByTagName('value');
if (code.length === 0)
{
var rec = req.responseText;
alert_box('erreur :' + rec);
}
var label_code = code[0].firstChild.nodeValue;
var label_value = value[0].firstChild.nodeValue;
set_value(label_code, label_value);
}
catch (e)
{
alert_box("success_set_tva_label " + e.message);
}
}
/**
*@brief set loading for waiting
*@param name of ipopup
*@see showIPopup
*@obsolete
*/
function set_wait_obsolete(name)
{
var content = name + "_content";
$(content).innerHTML = 'Un instant...';
}
/**
* Create a div without showing it
* @param {type} obj
* the attributes are
* - style to add style
* - id to add an id
* - cssclass to add a class
* - html is the content
* - drag is the div can be moved
* @returns html dom element
* @see add_div
*/
function create_div(obj)
{
try
{
var top = document;
var elt = null;
if (!$(obj.id)) {
elt = top.createElement('div');
}
else {
elt = $(obj.id);
}
if (obj.id)
{
elt.setAttribute('id', obj.id);
}
if (obj.style)
{
if (elt.style.setAttribute)
{ /* IE7 bug */
elt.style.setAttribute('cssText', obj.style);
}
else
{ /* good Browser */
elt.setAttribute('style', obj.style);
}
}
if (obj.cssclass)
{
elt.setAttribute('class', obj.cssclass); /* FF */
elt.setAttribute('className', obj.cssclass); /* IE */
}
if (obj.html)
{
elt.innerHTML = obj.html;
}
var bottom_div = document.body;
elt.hide();
bottom_div.appendChild(elt);
/* if ( obj.effect && obj.effect != 'none' ) { Effect.Grow(obj.id,{direction:'top-right',duration:0.1}); }
else if ( ! obj.effect ){ Effect.Grow(obj.id,{direction:'top-right',duration:0.1}); }*/
if (obj.drag)
{
new Draggable(obj.id, {starteffect: function ()
{
new Effect.Highlight(obj.id, {scroll: window, queue: 'end'});
}}
);
}
return elt;
}
catch (e)
{
error_message("create_div " + e.message);
}
}
/**
*@brief add dynamically a object for AJAX
*@param obj.
* the attributes are
* - style to add style
* - id to add an id
* - cssclass to add a class
* - html is the content
* - drag is the div can be moved
*/
function add_div(obj)
{
try {
var elt=create_div(obj);
/* elt.setStyle({visibility:'visible'}); */
elt.style.visibility = 'visible';
elt.show();
}
catch (e)
{
alert_box("add_div " + e.message);
}
}
/**
* remove a object created with add_div
* @param elt id of the elt
*/
function removeDiv(elt)
{
if (g(elt))
{
document.body.removeChild(g(elt));
}
// if reloaded if asked the window will be reloaded when
// the box is closed
if (ask_reload === 1)
{
// avoid POST window.location = window.location.href;
window.location.reload();
}
}
function waiting_node()
{
$('info_div').innerHTML = 'Un instant';
$('info_div').style.display = "block";
}
/**
*show a box while loading
*must be remove when ajax is successfull
* the id is wait_box
*/
function waiting_box()
{
var obj = {
id: 'wait_box', html: '
Chargement
' + loading()
};
var y = fixed_position(10, 250)
obj.style = y + ";width:20%;margin-left:40%;";
if ($('wait_box')) {
removeDiv('wait_box');
}
waiting_node();
add_div(obj);
$('wait_box').setOpacity(0.7);
}
/**
*@brief call add_div to add a DIV and after call the ajax
* the queryString, the callback for function for success and error management
* the method is always GET
*@param obj, the mandatory attributes are
* - obj.qs querystring
* - obj.js_success callback function in javascript for handling the xml answer
* - obj.js_error callback function for error
* - obj.callback the php file to call
* - obj.fixed optional let you determine the position, otherwise works like IPopup
*@see add_div IBox
*/
function show_box(obj)
{
add_div(obj);
if (!obj.fixed)
{
var sx = 0;
if (window.scrollY)
{
sx = window.scrollY + 40;
}
else
{
sx = document.body.scrollTop + 40;
}
g(obj.id).style.top = sx + "px";
show(obj.id);
}
else
{
show(obj.id);
}
var action = new Ajax.Request(
obj.callback,
{
method: 'GET',
parameters: obj.qs,
onFailure: eval(obj.js_error),
onSuccess: eval(obj.js_success)
});
}
/**
*@brief receive answer from ajax and just display it into the IBox
* XML must contains at least 2 fields : ctl is the ID of the IBOX and
* code is the HTML to put in it
*@see fill_box
*/
function success_box(req, json)
{
try
{
var answer = req.responseXML;
var a = answer.getElementsByTagName('ctl');
var html = answer.getElementsByTagName('code');
if (a.length === 0)
{
var rec = req.responseText;
alert_box('erreur :' + rec);
}
var name_ctl = a[0].firstChild.nodeValue;
var code_html = getNodeText(html[0]);
code_html = unescape_xml(code_html);
g(name_ctl).innerHTML = code_html;
g(name_ctl).style.height = 'auto';
if (name_ctl == 'popup')
g(name_ctl).style.width = 'auto';
}
catch (e)
{
alert_box("success_box" + e.message);
}
try
{
code_html.evalScripts();
}
catch (e)
{
alert_box("answer_box Impossible executer script de la reponse\n" + e.message);
}
}
function error_box()
{
alert_box('[error_box] ajax not implemented');
}
/**
* show the ledger choice
*/
function show_ledger_choice(json_obj)
{
try
{
waiting_box();
var i = 0;
var query = "gDossier=" + json_obj.dossier + '&type=' + json_obj.type + '&div=' + json_obj.div + '&op=ledger_show';
query = query + '&nbjrn=' + $(json_obj.div + 'nb_jrn').value;
query = query + '&all_type=' + json_obj.all_type;
for (i = 0; i < $(json_obj.div + 'nb_jrn').value; i++) {
query = query + "&r_jrn[]=" + $(json_obj.div + 'r_jrn[' + i + ']').value;
}
var action = new Ajax.Request(
"ajax_misc.php",
{method: 'get',
parameters: query,
onFailure: ajax_misc_failure,
onSuccess: function (req, json) {
try {
var obj = {
id: json_obj.div + 'jrn_search',
cssclass: 'inner_box',
style: ';position:absolute;width:60%;z-index:20;margin-left:20%',
drag: 1
};
//var y=calcy(posY);
var y = posY;
if (json_obj.div != '')
obj.cssclass = "";
obj.style = "top:" + y + 'px;' + obj.style;
/* if ( json_obj.class )
{
obj.cssclass=json_obj.class;
}*/
add_div(obj);
var answer = req.responseXML;
var a = answer.getElementsByTagName('ctl');
var html = answer.getElementsByTagName('code');
if (a.length === 0) {
var rec = req.responseText;
alert_box('erreur :' + rec);
}
var name_ctl = a[0].firstChild.nodeValue;
var code_html = getNodeText(html[0]);
code_html = unescape_xml(code_html);
remove_waiting_box();
g(obj.id).innerHTML = code_html;
}
catch (e) {
alert_box("show_ledger_callback" + e.message);
}
try {
code_html.evalScripts();
}
catch (e) {
alert_box("answer_box Impossible executer script de la reponse\n" + e.message);
}
}
}
);
} catch (e) {
alert_box('show_ledger_choice' + e.message);
}
}
/**
* hide the ledger choice
*/
function hide_ledger_choice(p_frm_search)
{
try
{
var nb = $(p_frm_search).nb_jrn.value;
var div = $(p_frm_search).div.value;
var i = 0;
var str = "";
var name = "";
var n_name = "";
var sel = 0;
for (i = 0; i < nb; i++) {
n_name = div + "r_jrn[" + sel + "]";
name = div + "r_jrn" + i;
if ($(name).checked) {
str += '';
sel++;
}
}
str += '';
$('ledger_id' + div).innerHTML = str;
removeDiv(div + 'jrn_search');
return false;
} catch (e) {
alert_box('hide_ledger_choice' + e.message);
return false;
}
}
/**
* show the cat of ledger choice
*/
function show_cat_choice()
{
g('div_cat').style.visibility = 'visible';
}
/**
* hide the cat of ledger choice
*/
function hide_cat_choice()
{
g('div_cat').style.visibility = 'hidden';
}
/**
* add a row for the forecast item
*/
function for_add_row(tableid)
{
style = 'class="input_text"';
var mytable = g(tableid).tBodies[0];
var nNumberRow = mytable.rows.length;
var oRow = mytable.insertRow(nNumberRow);
var rowToCopy = mytable.rows[1];
var nNumberCell = rowToCopy.cells.length;
var nb = g("nbrow");
var oNewRow = mytable.insertRow(nNumberRow);
for (var e = 0; e < nNumberCell; e++)
{
var newCell = oRow.insertCell(e);
var tt = rowToCopy.cells[e].innerHTML;
new_tt = tt.replace(/an_cat0/g, "an_cat" + nb.value);
new_tt = new_tt.replace(/an_cat_acc0/g, "an_cat_acc" + nb.value);
new_tt = new_tt.replace(/an_qc0/g, "an_qc" + nb.value);
new_tt = new_tt.replace(/an_label0/g, "an_label" + nb.value);
new_tt = new_tt.replace(/month0/g, "month" + nb.value);
new_tt = new_tt.replace(/an_cat_amount0/g, "an_cat_amount" + nb.value);
new_tt = new_tt.replace(/an_deb0/g, "an_deb" + nb.value);
newCell.innerHTML = new_tt;
new_tt.evalScripts();
}
$("an_cat_acc" + nb.value).value = "";
$("an_qc" + nb.value).value = "";
$("an_label" + nb.value).value = "";
$("an_cat_amount" + nb.value).value = "0";
nb.value++;
}
/**
* toggle all the checkbox in a given form
* @param form_id id of the form
*/
function toggle_checkbox(form_id)
{
var form = g(form_id);
for (var i = 0; i < form.length; i++)
{
var e = form.elements[i];
if (e.type === 'checkbox')
{
if (e.checked === true)
{
e.checked = false;
}
else
{
e.checked = true;
}
}
}
}
/**
* select all the checkbox in a given form
* @param form_id id of the form
*/
function select_checkbox(form_id)
{
var form = $(form_id);
for (var i = 0; i < form.length; i++)
{
var e = form.elements[i];
if (e.type === 'checkbox')
{
e.checked = true;
}
}
}
/**
* unselect all the checkbox in a given form
* @param form_id id of the form
*/
function unselect_checkbox(form_id)
{
var form = $(form_id);
for (var i = 0; i < form.length; i++)
{
var e = form.elements[i];
if (e.type === 'checkbox')
{
e.checked = false;
}
}
}
/**
* show the calculator
*/
function show_calc()
{
if (g('calc1'))
{
this.document.getElementById('inp').value = "";
this.document.getElementById('inp').focus();
return;
}
var sid = 'calc1';
var shtml = '';
shtml += '