/**
 *		js/lib.css
 *		------------------------------------------------------------------------
 *		This file is part of the www.artcontemporainbretagne.org's design.
 *		Status: alpha (maquette_07)
 *		Last Modif.: 2005-10-13
 *		------------------------------------------------------------------------
 *		(c) Copyright 2005 Fabrice Luraine / sofa-design.net.
 *		All Rights Reserved.
 *		------------------------------------------------------------------------  
 */

function type_replace(){
	if(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i)) {com_stewartspeak_replacement();}
}

function com_stewartspeak_replacement() {
/*
	Dynamic Heading Generator
    By Stewart Rosenberger
    http://www.stewartspeak.com/headings/

	Ce script recherche dans une page web des éléments spécifiques ou plus généraux
	et les remplace par des images générées dynamiquement, en conjonction avec un
	script côté serveur.
*/

// TODO réécrire en objet cette fonction pour externaliser dans init.js la conf ainsi que le loadHandler et les fonctions réutilisables telles que `getElementsBySelector()`

replaceSelector("h1.chinese_grande","/js/inc/chinese_grande.php",true);
replaceSelector("h2.chinese_petite","/js/inc/chinese_petite.php",true);

var testURL = "/js/replacement/test.png" ;

var doNotPrintImages = false;
var printerCSS = "/js/replacement/replacement-print.css";

var hideFlicker = false;
var hideFlickerCSS = "/js/replacement/replacement-screen.css";
var hideFlickerTimeout = 1000;

var loadTests = false;




/* ---------------------------------------------------------------------------
	Pour une utilisation basique, vous ne devriez pas avoir besoin d'éditer quoi
    que ce soit sous ce commentaire.
    Si vous avez besoin de personnaliser plus avant ce script,
    assurez-vous d'être suffisamment familier avec Javascript.
	Et attrapez un truc à boire !
*/

var items;
var imageLoaded = false;
var documentLoaded = false;

function replaceSelector(selector,url,wordwrap)
{
	if(typeof items == "undefined")
		items = new Array();

	items[items.length] = {selector: selector, url: url, wordwrap: wordwrap};
}

if(hideFlicker)
{		
	document.write('<link id="hide-flicker" rel="stylesheet" media="screen" href="' + hideFlickerCSS + '" />');		
	window.flickerCheck = function()
	{
		if(!imageLoaded)
			setStyleSheetState('hide-flicker',false);
	};
	setTimeout('window.flickerCheck();',hideFlickerTimeout)
}

if(doNotPrintImages)
	document.write('<link id="print-text" rel="stylesheet" media="print" href="' + printerCSS + '" />');

if(loadTests){
	var test = new Image();
	test.onload = function() { imageLoaded = true; if(documentLoaded) replacement(); };
	test.src = testURL + "?date=" + (new Date()).getTime();
	addLoadHandler(function(){ documentLoaded = true; if(imageLoaded) replacement(); });
} else {
	replacement();
}



function documentLoad()
{
	documentLoaded = true;
	if(imageLoaded)
		replacement();
}

function replacement()
{
	for(var i=0;i<items.length;i++)
	{
		var elements = getElementsBySelector(items[i].selector);
		if(elements.length > 0) for(var j=0;j<elements.length;j++)
		{
			if(!elements[j])
				continue ;

			var text = extractText(elements[j]);
			while(elements[j].hasChildNodes())
				elements[j].removeChild(elements[j].firstChild);

			var tokens = items[i].wordwrap ? text.split(' ') : [text] ;
			for(var k=0;k<tokens.length;k++)
			{
				var url = items[i].url + "?text="+escape(tokens[k]+' ').replace(/\+/g, '%2B')+"&selector="+escape(items[i].selector);
				var image = document.createElement("img");
				image.className = "replacement";
				image.alt = tokens[k] ;
				image.src = url;
				//alert('init '+image.src);
				elements[j].appendChild(image);
			}

			if(doNotPrintImages)
			{
				var span = document.createElement("span");
				span.style.display = 'none';
				span.className = "print-text";
				span.appendChild(document.createTextNode(text));
				elements[j].appendChild(span);
			}
		}
	}

	if(hideFlicker)
		setStyleSheetState('hide-flicker',false);
}

function addLoadHandler(handler)
{
	if(window.addEventListener)
	{
		window.addEventListener("load",handler,false);
	}
	else if(window.attachEvent)
	{
		window.attachEvent("onload",handler);
	}
	else if(window.onload)
	{
		var oldHandler = window.onload;
		window.onload = function piggyback()
		{
			oldHandler();
			handler();
		};
	}
	else
	{
		window.onload = handler;
	}
}

function setStyleSheetState(id,enabled) 
{
	var sheet = document.getElementById(id);
	if(sheet)
		sheet.disabled = (!enabled);
}

function extractText(element)
{
	if(typeof element == "string")
		return element;
	else if(typeof element == "undefined")
		return element;
	else if(element.innerText)
		return element.innerText;

	var text = "";
	var kids = element.childNodes;
	for(var i=0;i<kids.length;i++)
	{
		if(kids[i].nodeType == 1)
		text += extractText(kids[i]);
		else if(kids[i].nodeType == 3)
		text += kids[i].nodeValue;
	}

	return text;
}

/*
	Trouve les éléments d'une page qui correspondent à une rêgle de sélection CSS donnée.
	Certains rêgles complexes ne sont pas compatibles.
	Basé sur l'excellente fonction "getElementsBySelector" de Simon Willison.
	Code d'origine (avec commentaires et description, en anglais):
		http://simon.incutio.com/archive/2003/03/25/getElementsBySelector
*/
function getElementsBySelector(selector)
{
	var tokens = selector.split(' ');
	var currentContext = new Array(document);
	for(var i=0;i<tokens.length;i++)
	{
		token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
		if(token.indexOf('#') > -1)
		{
			var bits = token.split('#');
			var tagName = bits[0];
			var id = bits[1];
			var element = document.getElementById(id);
			if(tagName && element.nodeName.toLowerCase() != tagName)
				return new Array();
			currentContext = new Array(element);
			continue;
		}

		if(token.indexOf('.') > -1)
		{
			var bits = token.split('.');
			var tagName = bits[0];
			var className = bits[1];
			if(!tagName)
				tagName = '*';

			var found = new Array;
			var foundCount = 0;
			for(var h=0;h<currentContext.length;h++)
			{
				var elements;
				if(tagName == '*')
					elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
				else
					elements = currentContext[h].getElementsByTagName(tagName);

				for(var j=0;j<elements.length;j++)
					found[foundCount++] = elements[j];
			}

			currentContext = new Array;
			var currentContextIndex = 0;
			for(var k=0;k<found.length;k++)
			{
				if(found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b')))
					currentContext[currentContextIndex++] = found[k];
			}

			continue;
	    }

		if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/))
		{
			var tagName = RegExp.$1;
			var attrName = RegExp.$2;
			var attrOperator = RegExp.$3;
			var attrValue = RegExp.$4;
			if(!tagName)
				tagName = '*';

			var found = new Array;
			var foundCount = 0;
			for(var h=0;h<currentContext.length;h++)
			{
				var elements;
	        	if(tagName == '*')
					elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
				else
					elements = currentContext[h].getElementsByTagName(tagName);

				for(var j=0;j<elements.length;j++)
					found[foundCount++] = elements[j];
			}

			currentContext = new Array;
			var currentContextIndex = 0;
			var checkFunction;
			switch(attrOperator)
			{
				case '=':
					checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
					break;
				case '~':
					checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
					break;
				case '|':
					checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
					break;
				case '^':
					checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
					break;
				case '$':
					checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
					break;
				case '*':
					checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
					break;
				default :
					checkFunction = function(e) { return e.getAttribute(attrName); };
			}

			currentContext = new Array;
			var currentContextIndex = 0;
			for(var k=0;k<found.length;k++)
			{
				if(checkFunction(found[k]))
					currentContext[currentContextIndex++] = found[k];
			}

			continue;
		}

		tagName = token;
		var found = new Array;
		var foundCount = 0;
		for(var h=0;h<currentContext.length;h++)
		{
			var elements = currentContext[h].getElementsByTagName(tagName);
			for(var j=0;j<elements.length; j++)
				found[foundCount++] = elements[j];
		}

		currentContext = found;
	}

	return currentContext;
}


}

/**
 *	Popups
 */
function _popUp(strURL,strType,strHeight,strWidth,newwin,newwinname){
 	var strOptions="";
	if (strType=="console") strOptions="resizable,scrollbars,height="+strHeight+",width="+strWidth;
 	if (strType=="fixed") strOptions="status,height="+strHeight+",width="+strWidth;
 	if (strType=="elastic") strOptions="toolbar,menubar,scrollbars,resizable,location,height="+strHeight+",width="+strWidth;
 	if(!newwin.closed && newwin.location){newwin.location.href=strURL;}else{newwin=window.open(strURL,newwinname,strOptions);if(!newwin.opener)newwin.opener=self;}
	if(window.focus)newwin.focus();return false;
}
var pop='';
function popUp(strURL,strType,strHeight,strWidth)
{
	_popUp(strURL, strType, strHeight, strWidth, pop, 'pop');
	return false;
}

/**
 *	Retrouver le bouton de retour et l'activer
 */
function addEvent(obj, evType, fn){ 
 if (obj.addEventListener){ 
   obj.addEventListener(evType, fn, false); 
   return true; 
 } else if (obj.attachEvent){ 
   var r = obj.attachEvent("on"+evType, fn); 
   return r; 
 } else { 
   return false; 
 } 
}
function goBack()
{
	window.history.go(-1);
	return false;
}
function activateBackLink()
{
 var a,i;
 a=document.getElementsByTagName('a');
 for(i=0;i<a.length;i++)
 {
	if(a[i].className == "bt_back")
   {
		a[i].onclick=goBack;
		a[i].onkeypress=a[i].onclick;
		a[i].style.visibility = "visible";
   }
  }
}

function changeLinks()
{
	var as,i,islink;
	as=document.getElementsByTagName('a');
	for(i=0;i<as.length;i++)
	{
		islink=as[i].href;
		if(islink.indexOf(window.location.hostname)==-1 && islink.indexOf("javascript:")==-1)
		{
		as[i].title += ' ('+islink+')';
		as[i].onclick=function(){
			window.open(this.href,'newwin','');
			return false;};
		as[i].onkeypress=as[i].onclick;
		}
	}
}

var isMac = {
	init: function(){
		var data = {
			string: navigator.platform,
			subString: "Mac"
		}
		return this.searchString(data);
	},
	searchString: function (data) {
		if (data.string) {
			return (data.string.indexOf(data.subString) != -1)
		}
	}
}
var macMono = {
	init: function(){
		document.body.style.fontFamily = 'courier, "Courier New", monospace';
	}
}
function onBodyLoaded()
{
	if(document.getElementById('end')){
		domInit();
	} else {
		setTimeout('onBodyLoaded()', 10);
	}
}
function domInit() {
    if (arguments.callee.done) return;
    arguments.callee.done = true;
	init();
};
function init(){
	if(isMac.init()) macMono.init();
	type_replace(); changeLinks(); activateBackLink();
}

if(document.addEventListener && !window.opera &&
  !(!document.all && document.childNodes && !navigator.taintEnabled)){
    document.addEventListener('DOMContentLoaded', domInit, null);
} else {
  window.onload = domInit;
  setTimeout('onBodyLoaded()', 0);
}


