// 
// Evonux 2005
// 
// evonux_local.js
// 
// Author          : Alexandre HERMANN
// Created         : Fri Nov  4 13:22:16 2005
// Last Modified By: Alexandre HERMANN
// Last Modified On: Mon Jan 16 12:54:49 2006
// ---------------------------------------------------------------------------
// 

Evonux.Local = {};
Evonux.Local.smallWordLength = 2;
Evonux.Local.keyword;

//Evonux.Local.wysiwygFrame = 'Evhe.buf.document.body'; // evjshe version
Evonux.Local.wysiwygFrame = 'oWhizzy.document.body';  // whizzywig version

Evonux.Local.AutoSetKeywords = function()
{
    var re_separator = new RegExp('[, ]+', 'g');
    var re_spaces = new RegExp('[\n\r ]+', 'g');
    // Remove characters stuck to punctuation such as d' or l'
    var re_word_ponctuation = /[\S]+[\']+/g;
    // Remove ponctuation
    var re_ponctuation = new RegExp('[\?\.!:;,"\']+', 'g');
    // Remove common words
    var re_uselessWords = eval('/^('+ Evonux.uselessWords +')$/gi');
    // Remove brackets ( ) [ ] { }
    var re_bracket = /[\)\(\]\[\}\{]+/g;
    var sourceFrame = eval(Evonux.Local.wysiwygFrame);

    with (Evonux)
    {
	// The following array contains :
	// 0 => keyword
	// 1 => nb of times it appears
	// 2 => prominence of kword : average of kword positions inside page (100% = begining, 0% = end)
	var _keyword = new Array();
	var _word_prominence = new Array(); // _word_prominence['keyword'] = [n%, kword freq, type = ['page', 'title', 'h1..9']];

	var LK = Local.keyword = new Array();
	var word_already = $('mainform').keywords.value.toLowerCase().split(re_separator);
	var word_document = RemoveTags(sourceFrame).toLowerCase().replace(re_word_ponctuation, ' ').replace(re_ponctuation, ' ').replace(re_spaces, ', ').replace(re_bracket, '').split(re_separator);
	var word_title = $('mainform').title.value.toLowerCase().split(re_separator);
	var word_hn = new Array(); // Headings
	// Adds already given words + document words
	//	LK = LK.concat(word_already);
	LK = LK.concat(word_document);
	LK = LK.concat(word_title);

	// Number of words inside page, title...
	var word_count = word_document.length;
	var title_word_count = word_title.length;
	// Stores prominence of page words
	for (k = 0; k < word_count; k++)
	    {
		cur = _word_prominence[word_document[k]];
		if (cur == null)
		    _word_prominence[word_document[k]] = [100 - window.Math.floor((k * 100) / word_count), 1, 'page'];
		else
		    {
			(_word_prominence[word_document[k]])[1] = cur[1] + 1;
			(_word_prominence[word_document[k]])[0] = window.Math.floor((100 - ((k * 100) / word_count) + (cur[0] * cur[1])) / (cur[1] + 1));
		    }
	    }
	// Stores prominence of title words
	for (k = 0; k < title_word_count; k++)
	    {
		cur = _word_prominence[word_title[k]];
		if (cur == null)
		    _word_prominence[word_title[k]] = [100 - window.Math.floor((k * 100) / title_word_count), 1, 'title'];
		else
		    {
			(_word_prominence[word_title[k]])[1] = cur[1] + 1;
			(_word_prominence[word_title[k]])[0] = window.Math.floor((100 - ((k * 100) / title_word_count) + (cur[0] * cur[1])) / (cur[1] + 1));
		    }
	    }
	// Tags words contained in h1..9
	for (n = 1; n < 10; n++)
	    {
		h = sourceFrame.getElementsByTagName('h'+ n);
		if (h.length > 0)
		for (i = 0, lg2 = h.length; i < lg2; i++)
		    {
			cur_word = RemoveTags(h[i]).toLowerCase().replace(re_word_ponctuation, ' ').replace(re_ponctuation, ' ').replace(re_spaces, ', ').replace(re_bracket, '').split(re_separator);
			for (k = 0, lg = cur_word.length; k < lg; k++)
			    {
				if (((_word_prominence[cur_word[k]])[2] != null) &&
				    ((_word_prominence[cur_word[k]])[2] == 'page'))
				    (_word_prominence[cur_word[k]])[2] = 'h'+ n;
			    }
		    }
	    }
	
	// Sorts list of keywords
	LK.sort();
	// Removes small words and doublons
	// and builds a new list sorted according frequency of keywords
	LK.push(''); // For easy programming :)
	for (var k = 0, prev = '', _count = 1, lg = LK.length, kw = 0; k < lg; k++)
	{
	    if (prev == LK[k])
		_count++;
	    else if (k > 0)
		{
		    if ((LK[k - 1].length <= Local.smallWordLength) ||
			re_uselessWords.test(LK[k - 1]))
			;
		    else
			_keyword[kw++] = [LK[k - 1], _count, _word_prominence[LK[k - 1]]];
		    _count = 1;
		}
	    prev = LK[k];
	}
	_keyword.sort(Local.SortKeywords);

	// XXX
	var output = '';
	final_kwords = '';
	kword_nb = 0;
	total_freq = 0;
	for (k = 0, lg = _keyword.length; k < lg; k++)
	    {
		// TODO: An undefined _keyword is to be deteted !!!
		if (_keyword[k][2]
		    && ( ((_keyword[k][2][2] != 'title') && (_keyword[k][2][0] >= 50)) // Prominence must be > 50% for a page word
			 || ((_keyword[k][2][2] == 'title') && (_keyword[k][2][0] >= 60)) // Prominence must be > 60% for a title word
		     )
		    && (_keyword[k][1] >= 1) && (_keyword[k][1] <= 6) // 1 <= Kword freq <= 6
		    )
		    {
			// XXX
			output += _keyword[k][0] +' ('+ _keyword[k][1] +' / '+ _keyword[k][2][0] +'% / '+ _keyword[k][2][2] +')';
			final_kwords += (kword_nb > 0 ? ', ' : '') + _keyword[k][0];
			kword_nb++;
			total_freq += _keyword[k][1];
		    }
	    }
	// 5 < Total freq < 20
	// XXX
	//alert(output +'\n\nnumber of keywords: '+ kword_nb +'\ntotal frequency of keywords: '+ total_freq);

	// Writes keywords
	$('mainform').keywords.value = final_kwords;
    }
}

Evonux.Local.SortKeywords = function(o1, o2)
{
    var _title = 0, _h1 = 1, _h2 = 2, _h3 = 3, _h4 = 4, _h5 = 5, _h6 = 6, _h7 = 7, _h8 = 8, _h9 = 9, _page = 10;
    // Type (title, h1..9, page)
    if (eval('_'+ o1[2][2]) > eval('_'+ o2[2][2]))
      return 1;
    else if (eval('_'+ o1[2][2]) < eval('_'+ o2[2][2]))
      return -1;
    // Prominence
    else if (o1[2][0] > o2[2][0])
      return -1;
    else if (o1[2][0] < o2[2][0])
      return 1;
    // Frequency
    else if (o1[1] > o2[1])
      return -1;
    else if (o1[1] < o2[1])
      return 1;
    // Alpha order
    else if (o1[0] < o2[0])
      return -1;
    else if (o1[0] > o2[0])
      return 1;
    return 0;
}

Evonux.Local.PictureLoadActual = function(picId, miniatureURL, originalURL, descId)
{
    var picObj = Evonux.$(picId),
	_w = picObj.width,
        _h = picObj.height
        re_miniature = new RegExp('/image/mini_[0-9]+\.png', 'i');
    // Miniature -> Original picture
    if (re_miniature.test(picObj.src))
    {
	picObj.style.height = _h +'px';
	picObj.style.width = _w +'px';
	picObj.src = originalURL;
	Evonux.$(descId).innerHTML = 'Originale';
    }
    // Original picture -> Miniature
    else
    {
	picObj.src = miniatureURL;
	Evonux.$(descId).innerHTML = 'Miniature';
    }
}

Evonux.Local.FormContact = {};
Evonux.Local.FormContact = function(tableId, varName)
{ // constructor
    this.varName = varName;
    this.tableId = tableId;
    this.field = new Array();

    Evonux.W('<div id="'+ tableId +'"><input name="nb_fields" type="hidden" value="0" /><table cellspacing="0" class="form"><tr><td>&nbsp;</td></tr></table></div>');

    return this;
}

Evonux.Local.FormContact.fieldId = 0;
// Fields' types
Evonux.Local.FormContact.INPUT_TEXT = 0;
Evonux.Local.FormContact.TEXTAREA = 1;
Evonux.Local.FormContact.SELECT = 2;
Evonux.Local.FormContact.INPUT_CHECKBOX = 3;

Evonux.Local.FormContact.Field = function(type, dbId)
{ // static
    this.id = Evonux.Local.FormContact.fieldId++;
    this.dbId = (dbId ? dbId : 0);
    this.type = type;
    this.name = '';
    this.required = 0;
    if (type == Evonux.Local.FormContact.SELECT)
      this.choice = new Array();
    
    return true;
}

Evonux.Local.FormContact.prototype.AddField = function(type, dbId, dont_update_display)
{
    this.field.push(new Evonux.Local.FormContact.Field(type, (dbId ? dbId : 0)));
    if (!dont_update_display)
      this.Display();

    return this.field[this.field.length - 1].id; // new obj's id
}
Evonux.Local.FormContact.prototype.RemoveField = function(id, dont_update_display)
{
    // Looks for object
    for (var k = 0, lg = this.field.length; (k < lg) && (this.field[k].id != id); k++)
      ;
    if (k < lg) // object has been found
    this.field.splice(k, 1);
    if (!dont_update_display)
      this.Display();

    return this.field.length;
}
Evonux.Local.FormContact.prototype.UpdateField = function(id, name, required)
{
    // Looks for object
    for (var k = 0, lg = this.field.length; (k < lg) && (this.field[k].id != id); k++)
      ;
    if (name.length > 0)
      this.field[k].name = name;
    if (required > 0)
      this.field[k].required = required;

    return this.field[k].id; // obj's id
}
Evonux.Local.FormContact.prototype.UpdateFieldChoice = function(id, choice, selectId, dont_update_display)
{
    // Looks for object
    for (var k = 0, lg = this.field.length; (k < lg) && (this.field[k].id != id); k++)
      ;
    if ((this.field[k].type == Evonux.Local.FormContact.SELECT) && (choice.length > 0))
      this.field[k].choice.push(choice);
    else if (selectId)
	this.field[k].choice.splice(Evonux.$(selectId).selectedIndex, 1);
    if (!dont_update_display)
      this.Display();

    return this.field[k].id; // obj's id
}
Evonux.Local.FormContact.prototype.MoveField = function(id, delta, dont_update_display)
{
    // delta must be -1, 0, or 1
    // Looks for object
    for (var k = 0, lg = this.field.length; (k < lg) && (this.field[k].id != id); k++)
    ;
    // Nothing to do
    if ((delta == 0)
	|| ((delta == 1) && (k >= lg - 1))
	|| ((delta == -1) && (k == 0)))
      return false;
    // Moves obj
    moved_obj = this.field[k];
    other_obj = this.field[k + delta];
    if (delta == -1)
      this.field.splice(k + delta, 2, moved_obj, other_obj);
    else
      this.field.splice(k, 2, other_obj, moved_obj);
    if (!dont_update_display)
      this.Display();

    return true; // obj's id
}

// Prints or refreshes form table
Evonux.Local.FormContact.prototype.Display = function()
{
    with (Evonux)
    {
	var output = '',
            form_obj = '';
	for (var k = 0, lg = this.field.length; k < lg; k++)
	{
	    f = this.field[k];
	    with (Local.FormContact)
		{
		    switch (f.type)
			{
			case TEXTAREA:
			    form_obj = '<textarea id="ev_field_'+ f.id +'" disabled="disabled" style="background-color:rgb(255,255,255); color:rgb(180,180,180); font-style:italic;">Ce champ sera renseigné par l\'utilisateur</textarea>';
			    break;
			case SELECT:
			    _options = '';
			    _options_for_form = '';
			    for (opt = 0, lg_opt = f.choice.length; opt < lg_opt; opt++)
				{
				    _options += '<option value="'+ f.choice[opt] +'">'+ f.choice[opt] +'</option>';
				    _options_for_form += (_options_for_form.length > 0 ? '\n' : '') + f.choice[opt];
				}
			    form_obj = '<select name="ev_field_'+ f.id +'" id="ev_field_'+ f.id +'" style="width:130px;">'+ _options +'</select>\
<a href="javascript:;" onclick="eval(\''+ this.varName +'\').UpdateFieldChoice('+ f.id +', \'\', \'ev_field_'+ f.id +'\');" class="button" style="width:130px;"><img src="/picture/ico_remove.gif" alt="" border="0" style="margin-left:5px; height:16px;" /> Retirer ce choix</a><br/>\
<input id="'+ this.varName +'_'+ f.id +'" name="'+ this.varName +'_'+ f.id +'" type="text" style="width:130px;" />\
<a href="javascript:;" onclick="eval(\''+ this.varName +'\').UpdateFieldChoice('+ f.id +', Evonux.$(\''+ this.varName +'_'+ f.id +'\').value);" class="button" style="width:130px;"><img src="/picture/ico_add.gif" alt="" border="0" style="margin-left:5px; height:16px;" /> Ajouter ce choix</a><br/>\
<input name="ev_field_'+ k +'_choice" type="hidden" value="'+ _options_for_form +'" />';
			    break;
			case INPUT_CHECKBOX:
			    form_obj = '<input id="ev_field_'+ f.id +'" type="checkbox" disabled="disabled" class="checkbox" style="vertical-align:top;" />';
			    break;
			case INPUT_TEXT:
			default:
			    form_obj = '<input id="ev_field_'+ f.id +'" type="text" disabled="disabled" value="Ce champ sera renseigné par l\'utilisateur" style="background-color:rgb(255,255,255); color:rgb(180,180,180); font-style:italic;" />';
			}
		}
	    output += '<tr>\
  <td>\
    <a href="javascript:;" onclick="eval(\''+ this.varName +'\').RemoveField('+ f.id +');"><img src="/picture/ico_delete.gif" alt="'+ Trans('delete') +'" title="'+ Trans('delete') +'" border="0" /></a>\
    <!-- Field DB id --><input name="ev_field_'+ k +'_dbid" value="'+ f.dbId +'" type="hidden" />\
    <!-- Field type --><input name="ev_field_'+ k +'_type" value="'+ f.type +'" type="hidden" />\
    '+ (k == 0 ? '<!-- Nb of inputs --><input name="nb_fields" type="hidden" value="'+ lg +'" />' : '') +'\
  </td>\
  <td><div class="mover">\
    '+ (k > 0 ? '<a href="javascript:;" onclick="eval(\''+ this.varName +'\').MoveField('+ f.id +', -1);">' : '') +'<img src="/picture/pic_arrow-nav-'+ (k > 0 ? 'up' : 'blankvert') +'.gif" alt="" border="0" />'+ (k > 0 ? '</a>' : '') +'<br/>'
    + (k < lg - 1 ? '<a href="javascript:;" onclick="eval(\''+ this.varName +'\').MoveField('+ f.id +', 1);">' : '') +'<img src="/picture/pic_arrow-nav-'+ (k < lg - 1 ? 'down' : 'blankvert') +'.gif" alt="" border="0" />'+ (k < lg - 1 ? '</a>' : '') +'\
  </div></td>\
  '+ (f.type != Local.FormContact.INPUT_CHECKBOX ? // All but checkbox
 '<td><input name="ev_field_'+ k +'_name" type="text" value="'+ (f.name.length > 0 ? f.name : 'Intitulé du champ') +'" class="title" onkeyup="eval(\''+ this.varName +'\').UpdateField('+ f.id +', this.value, -1);" /></td>\
  <td style="width:320px;">' + form_obj +'</td>\
  <td style="width:135px; padding-left:20px;"><input name="ev_field_'+ k +'_required" type="checkbox"'+ (f.required ? ' checked="checked"' : '') +' class="checkbox" onclick="eval(\''+ this.varName +'\').UpdateField('+ f.id +', \'\', (this.checked ? 1 : 0));" /> <i>Champ obligatoire</i></td>'
      : // Checkbox
 '<td></td>\
  <td colspan="2">' + form_obj +'<textarea name="ev_field_'+ k +'_name" type="text" style="width:230px; height:50px;" onkeyup="eval(\''+ this.varName +'\').UpdateField('+ f.id +', this.value, -1);">'+ (f.name.length > 0 ? f.name : 'Intitulé du champ') +'</textarea></td>') +'\
</tr>';
	}
	if ($(this.tableId))
	  $(this.tableId).innerHTML = '<table cellspacing="0" class="form">'+ output +'</table>';
    }
}

// Arguments are :
// form_name [, required_field_id1, required_field_id1_name [, required_field_id2, required_field_id2_name] [, ...]]
Evonux.Local.FormContact.CheckAndGo = function()
{ // static
    var arg = Evonux.Local.FormContact.CheckAndGo.arguments;
    var myform = eval('document.forms.'+ arg[0]),
	formOk = true,
	curFieldOk = true,
	badFieldsNames = '';

    // Checks required fields
    for (var k = 1, lg = arg.length; k < lg; k += 2)
    {
	curFieldOk = (eval('myform.'+ arg[k] +'.value').length > 0);
	formOk = curFieldOk && formOk;
	if (!curFieldOk)
	    badFieldsNames += (badFieldsNames.length ? '\n' : '') + arg[k+1];
    }
    if (!formOk)
    {
	alert(Evonux.Trans('field_required_please_fill') +'\n'+ badFieldsNames);
	return false;
    }
    return true;
}
