/* Na-Code
 * Copyright (c) 2007 - Net Actuality
 * Révision 2
 *
 * Mick@el
 */

var naZones       = {};
var naZonesApercu = {};
var naTimers      = {};
var naTextesAvant = {};

var PROMPTS = {
	TEXT       : "Entrez un texte :",
	IMG_URL    : "Entrez l'adresse URL de l'image :",
	IMG_ALIGN  : "Choisissez l'alignement de l'image : G = Gauche / C = Centre / D = Droite\nPour créer une miniature, entrez seulement M.",
	LINK_URL   : "Entrez l'adresse URL du lien :",
	LINK_TITLE : 'Entrez le titre du lien :'
};

var na_emo = 'http://www.net-actuality.org/forum/img/emoticones/';
var smilies = [
	'-*',     'http://images.net-actuality.org/pucenews.gif',
	':)',     na_emo + 'emot13.gif',
	':-)',     na_emo + 'emot13.gif',
	'^^',     na_emo + 'emot3.gif',
	':lol:',     na_emo + 'emot8.gif',
	'^_^',     na_emo + 'emot3.gif',
	':dark:', na_emo + 'emot19.gif',
	':d',     na_emo + 'emot2.gif',
	':D',     na_emo + 'emot2.gif',
	';)',     na_emo + 'emot5.gif',
	';-)',     na_emo + 'emot5.gif',
	':p',     na_emo + 'emot6.gif',
	':sad:',     na_emo + 'emot16.gif',
	':s',     na_emo + 'emot17.gif',
	':@',     na_emo + 'emot14.gif',
	':oops:', na_emo + 'oops.gif',
	':o',     na_emo + 'emot4.gif',
	':-/',    na_emo + 'emot10.gif',
	':5',     na_emo + 'emot15.gif',
	':oui:',  na_emo + 'yes.gif',
	':cool:', na_emo + 'cool.gif',
	':mdr:',  na_emo + 'rofl.gif',
	'^^',     na_emo + 'emot3.gif',
	":'(",    na_emo + 'emot18.gif',
	":beurk:",    na_emo + 'emot11.gif',
	":-diable:",    na_emo + 'emot16.gif',
	":love:",    na_emo + 'emot20.gif',
	"B)",    na_emo + 'emot9.gif',
	"(_(",    na_emo + 'emot12.gif',
	":angry:",    na_emo + 'emot14.gif',
	":me:",    na_emo + 'emot1.gif',
	":(",    na_emo + 'emot15.gif',
	":-(",    na_emo + 'emot15.gif'
];

function NaCode(nID, sIDZone, sIDZoneApercu)
{
	naZones[nID]       = document.getElementById(sIDZone);
	naZonesApercu[nID] = document.getElementById(sIDZoneApercu);
}

/* Boutons */

function insererLien(nID)
{
	var oZone = naZones[nID];
	var pos   = _getCursorPos(oZone);

	if (pos !== false)
	{
		var start = pos.start;
		var end   = pos.end;
		var txtAvt = oZone.value.substring(0, start);
		var txtApr = oZone.value.substr(end);
		var texte = '';

		if (start != end)
			texte = oZone.value.substring(start, end);

		var lien = _creerLien(texte);

		if (lien == null)
			return;

		texte = lien.texte;

		oZone.value = txtAvt + texte + txtApr;

		_setCursorPos(oZone, start + lien.pos, start + lien.pos);
	}
	else
	{
		var texte = _creerLien('');

		if (texte != null)
		{
			oZone.value += texte;
			oZone.focus();
		}
	}
}

function insererTag(nID, sDebutTag, sFinTag)
{
	var oZone = naZones[nID];
	var pos   = _getCursorPos(oZone);

	if (pos !== false)
	{
		var start = pos.start;
		var end   = pos.end;
		var pos1;
		var pos2;
		var txtAvt = oZone.value.substring(0, start);
		var txtApr = oZone.value.substr(end);
		var texte = '';

		if (start != end)
			texte = oZone.value.substring(start, end);

		if (texte != '')
		{
			if (texte.startsWith(sDebutTag) && texte.endsWith(sFinTag))
				texte = texte.substring(sDebutTag.length, texte.length - sFinTag.length);
			else
				texte = sDebutTag + texte + sFinTag;

			pos1 = texte.length;
			pos2 = pos1;
		}
		else if (texte == '')
		{
			texte = sDebutTag + sFinTag;
			pos1 = sDebutTag.length;
			pos2 = pos1;
		}

		oZone.value = txtAvt + texte + txtApr;

		_setCursorPos(oZone, start + pos1, start + pos2);
	}
	else
	{
		var texte = prompt(PROMPTS.TEXT, '');

		if (texte != undefined)
		{
			oZone.value += sDebutTag + texte + sFinTag;
			oZone.focus();
		}
	}
}

function insererImage(nID)
{
	var oZone = naZones[nID];
	var pos   = _getCursorPos(oZone);

	if (pos !== false)
	{
		var start  = pos.start;
		var end    = pos.end;
		var txtAvt = oZone.value.substring(0, start);
		var txtApr = oZone.value.substring(end);
		var texte  = '';
		
		if (start != end)
			texte = oZone.value.substring(start, end);
		
		var image = _creerImage(texte);

		if (image == null)
			return;

		texte = image.texte;

		oZone.value = txtAvt + texte + txtApr;

		_setCursorPos(oZone, start + image.pos, start + image.pos);
	}
	else
	{
		var image = _creerImage('');

		if (image != null)
		{
			oZone.value += image.texte;
			oZone.focus();
		}
	}
}

function insererTexte(nID, sTexte)
{
	var oZone = naZones[nID];
	var pos   = _getCursorPos(oZone);

	if (pos !== false)
	{
		var end    = pos.end;
		var txtAvt = oZone.value.substring(0, end);
		var txtApr = oZone.value.substr(end);

		oZone.value = txtAvt + sTexte + txtApr;

		_setCursorPos(oZone, end + sTexte.length, end + sTexte.length);
	}
	else
	{
		oZone.value += sTexte;
		oZone.focus();
	}
}


/* Previsualisation */

function activerApercu(nID)
{
	desactiverApercu(nID);
	
	var oZoneApercu = naZonesApercu[nID];

	oZoneApercu.style.display = 'block';
	naTimers[nID] = setInterval(function() { majApercu(nID) } , 500);
}

function desactiverApercu(nID)
{
	var oZoneApercu = naZonesApercu[nID];

	oZoneApercu.style.display = 'none';	
	clearInterval(naTimers[nID]);
}

function majApercu(nID)
{
	var oZone       = naZones[nID];
	var oZoneApercu = naZonesApercu[nID];
	var texte       = oZone.value;

	if (texte === naTextesAvant[nID]) // Rien à changer, ni même a réinterpreter
		return;

	naTextesAvant[nID] = texte;

	texte = texte.replace(/&/g, '&amp;');
	texte = texte.replace(/"/g, '&quot;');
	texte = texte.replace(/</g, '&lt;');
	texte = texte.replace(/>/g, '&gt;');
	texte = texte.replace(/\r?\n/g, '<br />');
	
	for (var i = 0; i < smilies.length; i += 2)
	{
		var nom = smilies[i];
		var url = smilies[i+1];
		var regex = _creerRegex(nom, 'ig');

		texte = texte.replace(regex, '<img src="' + url + '" alt="Smiley" />');
		//texte = texte.replace(regex, '<img src="' + url + '" alt="Smiley" />'); // Deux passes nécessaires :s
	}

	texte = texte.replace(/\[quote]/gi, '<div class="citation">');
	texte = texte.replace(/\[quote=&quot;(.+?)&quot;]/gi, '<div class="citation"><h6>$1 a dit :</h6>');
		texte = texte.replace(/\[\/quote]/gi, '</div>');

	
	
	texte = texte.replace(/\[left](.+?)\[\/left]/gi, '<div align="left">$1</div>');
	texte = texte.replace(/\[center](.+?)\[\/center]/gi, '<div align="center">$1</div>');
	texte = texte.replace(/\[right](.+?)\[\/right]/gi, '<div align="right">$1</div>');

	texte = texte.replace(/\[b](.+?)\[\/b]/gi, '<strong>$1</strong>');
	texte = texte.replace(/\[i](.+?)\[\/i]/gi, '<em>$1</em>');
	texte = texte.replace(/\[u](.+?)\[\/u]/gi, '<u>$1</u>');
	texte = texte.replace(/\[l](.+?)\[\/l]/gi, '<del>$1</del>');

	texte = texte.replace(/\[img]((?!javascript:)[^ ]+?)\[\/img]/gi, '<img src="$1" alt="Image" title="" />');
	texte = texte.replace(/\[img align=(left|right)]((?!javascript:)[^ ]+?)\[\/img]/gi, '<img align="$1" src="$2" alt="Image" title="" />');
	texte = texte.replace(/\[img align=center]((?!javascript:)[^ ]+?)\[\/img]/gi, '<div align="center"><img src="$1" alt="Image" title="" /></div>');
	texte = texte.replace(/\[img2]((?!javascript:)[^ ]+?)\[\/img2]/gi, '<div align="center"><a href="$1" rel="lightbox[galerie]" style="border-bottom:0px dashed #F85407;cursor:pointer"><div class="ming"><img style="border:1px solid #b5b5b5" src="http://www.net-actuality.org/include/redimensionner_image.php?op=news&amp;url=$1" alt="" /></div></a></div>');
	texte = texte.replace(/\[screen=((?!javascript:)[^ ]+?)](.+?)\[\/screen]/gi, '<div class="screen"><a href="$1" rel="lightbox[galerie]" title=""><img src="http://www.net-actuality.org/include/redimensionner_image.php?op=tests&amp;url=$1" alt="" /><br />$2</a></div>');
	texte = texte.replace(/\[url=((?!javascript:)[^\] ]+)](.+?)\[\/url]/gi, '<a target="_blank" style="border-bottom:1px dashed" href="$1">$2</a>');
	texte = texte.replace(/\[url]((?!javascript:)[^\] ]+)\[\/url]/gi, '<a target="_blank" style="border-bottom:1px dashed" href="$1">$1</a>');
	
	texte = texte.replace(/\[color=(#[0-9a-f]+|[a-z]+)](.+?)\[\/color]/gi, '<span style="color: $1;">$2</span>');
	texte = texte.replace(/\[size=([0-9]{1,2})](.+?)\[\/size]/gi, '<span style="font-size: $1px;">$2</span>');

	texte = texte.replace(/\[c](.+?)\[\/c]/gi, '<i>« $1 »</i>');
	texte = texte.replace(/\[secret](.+?)\[\/secret]/gi, '		<div class="citation" onclick="switch_spoiler(this)"><span style="font-size:10px;border-bottom:1px dashed;width:100%;margin-bottom:10px;float:left;">Texte caché : cliquez sur le cadre pour l\'afficher.</span><div style="visibility: hidden;" class="spoiler3">$1</div></div><br />');
	texte = texte.replace(/\[(interdit|attention|information|question)](.+?)\[\/\1]/gi, '<div class="englobe4"><div class="$12"></div><div class="$13">$2</div></div><br />');
	
	texte = texte.replace(/\[date](.+?)\[\/date]/gi, '<div class="test_titre" style="width:357px;">$1 :</div>Le site ayant une activité réduite, retrouvez, tout au long de la semaine, chaque jour, le résumé des principales actualités informatique et internet. Pratique pour s\'informer de manière rapide, concise et efficace sur les principales informations qui ont jalonné le monde de l\'informatique en une journée seulement !<div class="trompage" style="width:350px"><div>');
	texte = texte.replace(/\[titre](.+?)\[\/titre]/gi, '</div><div class="news_rappel1" style="width:357px;"><h6 style="width:357px;margin-top:15px;margin-left:-9px">$1</h6>');
	texte = texte.replace(/\[source](.+?)\[\/source]/gi, '<font color="#838383"><small>(Source : $1)</small></font>');

	oZoneApercu.innerHTML = texte;

	if (texte.indexOf('lightbox[') > 0 && typeof initLightbox == 'function')
		initLightbox(); // Pour prendre en compte les nouvelles miniatures
}

function _creerLien(texte)
{
	var titre, url, pos;
	var defTitre = '';
	var defUrl   = '';

	if (texte.match(/^https?:\/\/[^ ]+$/i))
		url = texte;

	else if (texte.match(/\[url=((?!javascript:)[^\] ]*)](.*?)\[\/url]/i))
	{
		defUrl = RegExp.$1;
		defTitre = RegExp.$2;
	}
	else
		titre = texte;

	if (defUrl || !url)
		url = prompt(PROMPTS.LINK_URL, defUrl);

	if (url == undefined)
		return null;

	if (defTitre || !titre)
		titre = prompt(PROMPTS.LINK_TITLE, defTitre);

	if (titre == undefined)
		return null;

	var texte = '[url=' + url + ']' + titre + '[/url]';

	pos = (!url ? 5 : (!titre ? 5 + url.length + 1 : texte.length));

	return { 'texte' : texte, 'pos' : pos };
}

function _creerImage(texte)
{
	var src, align, pos;
	var defSrc = '';
	var defAlign = '';


	if (texte.match(/^\[img2](.*?)\[\/img2]$/i))
	{
		defSrc   = RegExp.$1;
		defAlign = 'M';
	}
	else if (texte.match(/^\[img(?: align=(left|center|right))?](.*?)\[\/img]$/i))
	{
		defSrc   = RegExp.$2;
		defAlign = RegExp.$1;		
		defAlign = defAlign.toLowerCase();
		defAlign =
		(defAlign == 'left' ? 'G' :
			(defAlign == 'center' ? 'C' :
				(defAlign == 'right' ? 'D' : ''
		)));
	}

	else if (texte.match(/^(?!javascript:)[^ ]+$/i))
		src = texte;

	if (defSrc || !src)
		src = prompt(PROMPTS.IMG_URL, defSrc);

	if (src == undefined)
		return null;

	if (defAlign || !align)
		align = prompt(PROMPTS.IMG_ALIGN, defAlign);

	if (align == undefined)
		return null;
	
	align = align.toLowerCase();
	
	var texte = '';
	
	if (align == 'm' || align == 's') // Support de l'ancienne option pour les habitués ;)
	{
		texte = '[img2]' + src + '[/img2]';
		
		pos = !src ? 6 : texte.length;
	}
	else
	{
		align =
		(align == 'g' ? 'left' :
			(align == 'c' ? 'center' :
				(align == 'd' ? 'right' : null
		)));
		
		if (align == null)
		{
			texte = '[img]' + src + '[/img]';
			pos = !src ? 5 : texte.length;
		}
		else
		{
			texte = '[img align=' + align + ']' + src + '[/img]';
			pos   = !src ? 11 + align.length : texte.length;
		}
	}


	return { 'texte' : texte, 'pos' : pos };
}

function _getCursorPos(oZone)
{
	if (oZone.selectionStart != undefined)
		return { 'start' : oZone.selectionStart, 'end' : oZone.selectionEnd};

	else if (document.selection)
	{
		oZone.focus();

		var range = document.selection.createRange();
		var stored_range = range.duplicate();
		stored_range.moveToElementText(oZone);
		stored_range.setEndPoint('EndToEnd', range);

		var start = stored_range.text.length - range.text.length;
		var end   = start + range.text.length;

		return { 'start' : start, 'end' : end };
	}
	else
		return false;	
}

function _setCursorPos(oZone, start, end)
{
	if (oZone.selectionStart != undefined)
	{
		oZone.selectionStart = start;
		oZone.selectionEnd   = end;
	}
	else if (document.selection)
	{
		var sel = oZone.createTextRange();
		sel.collapse(true);
		sel.moveStart('character', start);
		sel.moveEnd('character', end - start);
		sel.select();
	}

	oZone.focus();
}

function _creerRegex(sTexte, sOptions)
{
	sTexte = sTexte.replace(/([\\^+?*$\]\[(){}\.-])/g, '\\$1');

	return new RegExp(sTexte, sOptions);
}

String.prototype.startsWith = function(sTxt)
{
	return this.indexOf(sTxt) === 0;
}

String.prototype.endsWith = function(sTxt)
{
	return this.lastIndexOf(sTxt) === this.length - sTxt.length;
}
