﻿/* -- CSSJSFix()-- */
function CSSJSFix() {
	if (!document.body) {
		setTimeout("CSSJSFix()",50);
	} else {
		AddBrowserSupport();	
	}
}

/* Micro IE7 fix for CSS*/
function AddBrowserSupport(){
	if(/MSIE 7.0/.test(navigator.userAgent))
		document.body.className+=" IS_IE7";
}
CSSJSFix();

/*******************
	framework
********************/

// getStyle : retourne la valeur d'une propriété CSS appliquée à un élément
function getStyle(oElm, strCssRule){
    var strValue = "";
    if(document.defaultView && document.defaultView.getComputedStyle) {
		try{ strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); }
		catch(e) { strValue = ""; }
    }
    else if(oElm.currentStyle) {
        try{
			strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
	            return p1.toUpperCase();
	        });
	        strValue = oElm.currentStyle[strCssRule];
		} catch(e) {
			strValue = "";
		}
    }
    return strValue;
}
/*retourne la valeur entière d'un style*/
function intStyle(oElm, strCSSRule) {
	var val = parseInt(getStyle(oElm, strCSSRule));
	if (isNaN(val)) val=0;
	return val;
}
//Add Events
function addEvent( obj, type, fn ) {
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}

/* upgrade de Array pour IE5.0 */
if(Array.prototype.push==null){
	Array.prototype.push=function(elm){
		this[this.length]=elm;
		return this[this.length];
	};
}

/* raccourci pour document.getElementById*/
function $(obj) {
	if(typeof obj == "string") {
		return document.getElementById(obj);
	} else {
		return obj;
	}
}

/*getElementsByClassName: return an array of Objects with specified className*/
function getElementsByClassName(oElm, sTagName, sClassName){
    var aElements = (sTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(sTagName);
	var aReturnElements = new Array();
    sClassName = sClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + sClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i < aElements.length; i++){
    	oElement = aElements[i];
		if(oRegExp.test(oElement.className))
            aReturnElements.push(oElement);
    }
	return aReturnElements
}

/* findPos */
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}
/* removeClass: tries to remove a given class name from a className, O(n) */
function removeClassFrom(to_remove, className) {
	return replaceClassWith(to_remove, "", className);
}
/* replaceClassWith: replaces class A by class B in className, O(n) */
function replaceClassWith(to_remove, to_add, className) {
	var classes = className.split(/\s+/);
	var out = [];
	for(var i=0, len = classes.length; i<len; ++i) {
		if(classes[i] != to_remove) {
			out.push(classes[i]);
		} else {
			out.push(to_add);
		}
	}
	return out.join(" ");
}

/* setType: set type on an input because IE can't modify input type*/
function setType(node, type) {
	try {
		node.type = type;
	} catch(e) {
		node.outerHTML=node.outerHTML.replace(/\btype=\w+\b/,'type="text"');
	}
}

/*******************
	fonctions
*******************/


/*initialise le menu*/
function initmenu() {
   var menu = document.getElementById("nav");
   if (!menu) return;
   var lis = menu.getElementsByTagName("li");
   for (var i=0; i<lis.length;i++) {
       var li = lis[i];
       if (li.nodeName=="LI") {
           var a = li.getElementsByTagName("a");
           if (a.length>0) {
               a = a[0];
               var ul = li.getElementsByTagName("ul");
               if (ul.length>0) {
				   if (!li.className.match(/\bcurrent\b/)) {
							li.ul = ul[0];
							li.timer=null;
							li.onclick=function(e) {
								var obj = (window.event != null) ? window.event.srcElement : e.target;
								var aLink = null;
								if (obj.tagName.toLowerCase() == 'a') aLink = obj;
								else {
									var as = obj.getElementsByTagName("a");
									if (as.length > 0) aLink = as[0];
								}
								if ((aLink != null) && (aLink.className == "hierarchic")) {
									fixColumnsToMin();
									if (this.ul.style.display == "block") this.ul.style.display = "none";
									else this.ul.style.display = "block";
									if (!this.className.match(/\bexpand\b/)) this.className += " expand";
									else this.className = this.className.replace(/\bexpand\b/,"");
									fixColumns();
									return false;
								}
								return true;
							}
				   }
               }
           }
       }
   }
}


/* fonction pour avoir des boutons styles sous Safari*/
function fixbuttonsforSafari() {
	if (!/khtml|safari/i.test(navigator.userAgent)) return
	document.body.className+=" JSForSafari";
	var span = document.getElementsByTagName("span");
	for (var i=0; i<span.length;i++) {
		var x=span[i];
		if (/\bbtn2\b/.test(x.className)) {
			var inp = x.getElementsByTagName("input");
			if (inp.length>0) {
				inp = inp[0];
				var insideSpan = x.appendChild(document.createElement("span"));
				insideSpan.innerHTML = inp.value;
				insideSpan.appendChild(inp);
				inp.style.height = insideSpan.offsetHeight+"px";
				inp.style.width = insideSpan.offsetWidth+"px";
			}
		}
	}
}

/* -- Fonctions pour aligner les blocks en hauteur -- */
/* fonction qui va aligner toutes les lignes de la page */
/* retourne seulements les enfants d'un block correspondant au tag HTML spécifié*/
function getOnlyChildElements(obj,tag) {
	var aElt=[];
	tag = tag.toUpperCase();
	for (var i=0; i<obj.childNodes.length; i++) {
		var o = obj.childNodes[i];
		if (o.nodeName==tag) {
			aElt.push(o);
		}
	}
	return aElt;
}

/* Récupère un array de référence vers des blocks */
function setBlocksSameHeight(blocksArr, parentNode) {
	if (blocksArr.length==0) return;
	if (parentNode) {
		var maxHeight=parentNode.clientHeight;
	} else {
		var maxHeight=blocksArr[0].parentNode.offsetHeight;
	}
	for (var i=0; i<blocksArr.length; i++) {
		setBlockHeight(blocksArr[i],maxHeight);
	}
}

function setBlocksHeightMin(blocksArr) {
	if (blocksArr.length==0) return;
	for (var i=0; i<blocksArr.length; i++) {
		setBlockHeight(blocksArr[i],"1%");
	}
}

/* fixPage Height */
function fixColumnsToMin() {
	setBlocksHeightMin(idToreferentElement(["nav", "content"]));	
}
function fixColumns() {
	setBlocksSameHeight(idToreferentElement(["nav", "content"]));	
}

/* transforme un tableau d'id (string) en tableau de référence vers les éléments spécifiés */
function idToreferentElement(IdArr) {
	var returnArr=[];
	for (var i=0; i<IdArr.length; i++) {
		var elt = typeof(IdArr[i])=="string" ? document.getElementById(IdArr[i]) : IdArr[i];
		if (elt) returnArr.push(elt);
	}
	return returnArr;
}

/* retourne le block Main d'une boite */
function getMain(parentObj, tag) {
	regExp = /_main\b|\bisdbox_cnr\b|\bbox_main\b/;
	attachedElement =  "mainBlock";
	tag = tag || "div";
	parentObj = typeof(parentObj)=="string" ? document.getElementById(parentObj) : parentObj;
	if (!parentObj) return null;
	if (parentObj[attachedElement]) {
		return parentObj[attachedElement];
	}
	var arrElt = parentObj.getElementsByTagName(tag);
	for (var i=0; i<arrElt.length; i++) {
		if (regExp.test(arrElt[i].className)) {
			parentObj[attachedElement] = arrElt[i];
			return arrElt[i];
		}
	}
	return null;
}

/* Spécifie la nouvelle hauteur d'un block */
function setBlockHeight(block, height) {
	block = typeof(block)=="string" ? document.getElementById(block) : block;
	if (/\bnosizebox\b/.test(block.className)) return;
	var main = getMain(block);
	if (main) {
		if (typeof(height)=="string") {
			var tmpHeight = height;
		} else {
			var pendingHeight = block.offsetHeight-main.offsetHeight;
			var tmpHeight = (height-pendingHeight-intStyle(main,"padding-top")-intStyle(main,"padding-bottom"))+"px";
		}
		if (main.currentStyle!=null) {
			main.style.height = tmpHeight;
		} else {
			main.style.minHeight = tmpHeight;
		}
	}
}

/* -- fonctions for Editables Arrays --*/
var _span = document.createElement('span');
var _inpt = document.createElement('input');
var _tr = document.createElement('tr');
var _th = document.createElement('th');
var _td = document.createElement('td');
var _sel = document.createElement('select');
var _option = document.createElement('option');
var _a = document.createElement('a');
var _img = document.createElement('img');
function setData(node, opts, args) {
	if(opts) {
		for(opt in opts) {
			if ((opt == "class") && (/MSIE/.test(navigator.userAgent))) node.setAttribute("className", opts[opt]);
			else node.setAttribute(opt, opts[opt]);
		}
	}
	for(var i=1; i<args.length; ++i) {
		if(typeof args[i] == "string") {
			node.appendChild(document.createTextNode(args[i]));
		} else { 
			node.appendChild(args[i]);
		}
	}
}
function SPAN(opts) {
	var span = _span.cloneNode(true);
	setData(span, opts, arguments);
	return span;
}
function INPUT(opts) {
	var inpt = _inpt.cloneNode(true);
	setData(inpt, opts, arguments);
	return inpt;
}
function TR(opts) {
	var tr = _tr.cloneNode(true);
	setData(tr, opts, arguments);
	return tr;
}
function TH(opts) {
	var th = _th.cloneNode(true);
	setData(th, opts, arguments);
	return th;
}
function TD(opts) {
	var td = _td.cloneNode(true);
	setData(td, opts, arguments);
	return td;
}
function SELECT(opts) {
	var sel = _sel.cloneNode(true);
	setData(sel, opts, arguments);
	return sel;
}
function OPTION(opts) {
	var option = _option.cloneNode(true);
	setData(option, opts, arguments);
	return option;
}
function A(opts) {
	var a = _a.cloneNode(true);
	setData(a, opts, arguments);
	return a;
}
function IMG(opts) {
	var img = _img.cloneNode(true);
	setData(img, opts, arguments);
	return img;
}


function replaceNode(from, to) {
	from.parentNode.replaceChild(to, from);
}
function map(arr, fun) {
	var out = [];
	for(var i=0; i<arr.length; ++i) {
		out.push(fun(arr[i]));
	}
	return out;
}
function filter(arr, fun) {
	var out = [];
	for(var i=0, len=arr.length; i<len; ++i) {
		var elm = arr[i];
		if(fun(elm)) {
			out.push(elm);
		}
	}
	return out;
}
function removeElement(line) {
	line.parentNode.removeChild(line);
}
function editize(node) {
	var textSpan = node.childNodes[0];
	var data = node.childNodes[1];
	if(!textSpan || !data || textSpan.nodeType != 1 || data.nodeType != 1) return;
	
	if(data.nodeName.toLowerCase() == "input") {
			data.setAttribute('value', textSpan.firstChild ? textSpan.firstChild.data : "");
			setType(data,'text');
			data.style.display="inline";
	} else if(data.nodeName.toLowerCase() == 'select') {
		var text = textSpan.firstChild.data;
		for(var i=0; i<data.options.length; ++i) {
			if(text.toLowerCase() == data.options[i].value.toLowerCase()) {
				data.selectedIndex = i;
				break;
			}
		}
		data.style.display = 'inline';
	}
	removeElement(textSpan);
}
function editLine(line) {
	var tds = filter(line.childNodes, function (node) {
		return (node.nodeType == 1);
	});
	for(var i=0; i<tds.length; ++i) {
		editize(tds[i]);
	}
}
function addLine(fromLine) {
	fixColumnsToMin();

	var line = newline.cloneNode(true);
	
	fromLine.parentNode.insertBefore(line, fromLine);

	if(fromLine.className.match(/odd/)) {
		line.className = "odd";
		fromLine.className = fromLine.className.replace("odd","even");
	} else {
		line.className = "even";
		fromLine.className = fromLine.className.replace("even", "odd");
	}
	
	var from_inputs = fromLine.getElementsByTagName('input');
	var to_inputs = line.getElementsByTagName('input');
	var defaultInputValue;
	for(var i=0; i<from_inputs.length; i++) {
		defaultInputValue = to_inputs[i].value;
		to_inputs[i].value = from_inputs[i].value;
		from_inputs[i].value = defaultInputValue;
	}
	
	var line_selects = line.getElementsByTagName('select');
	var from_selects = fromLine.getElementsByTagName('select');
	var defaultSelectValue;
	for(var i=0, len=from_selects.length; i<len; ++i) {
		defaultSelectValue = line_selects[i].selectedIndex;
		line_selects[i].selectedIndex = from_selects[i].selectedIndex;
		from_selects[i].selectedIndex = defaultSelectValue;
	}
	
	var links = line.getElementsByTagName('a');

	for(var i=0; i<links.length; ++i) {
		processLink(links[i], line);
	}
	
	fixColumns();
}
function pushLineUp(line) {
	var previous = line;
	do { 
		previous = previous.previousSibling;
	}while(previous && previous.nodeType != 1);
	if(!previous) { // Line 1 already
		return;
	}
	var table = line.parentNode;
	table.insertBefore(table.removeChild(line), previous);
	
	var line_prio = filter(line.getElementsByTagName('input'), function (node) {
		return node.getAttribute('name') == 'priority';
	})[0];
	var prev_prio = filter(previous.getElementsByTagName('input'), function (node) {
		return node.getAttribute('name') == 'priority';
	})[0];
	
	if (prev_prio) {
		line_prio.setAttribute('value', parseInt(line_prio.getAttribute('value'), 10) - 1);
		prev_prio.setAttribute('value', parseInt(prev_prio.getAttribute('value'), 10) + 1);
	}
		
	if(line.className.match(/\beven\b/)) { // even
		line.className = replaceClassWith("even","odd",line.className);
		previous.className = replaceClassWith("odd","even",previous.className);
	} else { // odd
		line.className = replaceClassWith("odd","even",line.className);
		previous.className = replaceClassWith("even","odd",previous.className);
	}
}
function pushLineDown(line) {
	var next = line;
	do {
		next = next.nextSibling;
	}while(next && next.nodeType != 1);
	if(!next) { // last line already
		return;
	}
	var following = next;
	do {
		following = following.nextSibling;
	}while(following && following.nodeType != 1);
	if(!following) { // line is second-to-last => use appendChild?
		return;
	}
	
	var table = line.parentNode;
	table.insertBefore(table.removeChild(line), following);
	
	var line_prio = filter(line.getElementsByTagName('input'), function (node) {
		return node.getAttribute('name') == 'priority';
	})[0];
	var next_prio = filter(next.getElementsByTagName('input'), function (node) {
		return node.getAttribute('name') == 'priority';
	})[0];
	
	if (next_prio) {
		line_prio.setAttribute('value', parseInt(line_prio.getAttribute('value'), 10) + 1);
		next_prio.setAttribute('value', parseInt(next_prio.getAttribute('value'), 10) - 1);
	}
	
	if(line.className.match(/\beven\b/)) { // even
		line.className = replaceClassWith("even","odd",line.className);
		next.className = replaceClassWith("odd","even",next.className);
	} else { // odd
		line.className = replaceClassWith("odd","even",line.className);
		next.className = replaceClassWith("even","odd",next.className);
	}
}
function deletize(line) {
	if (line.className.match(/\bdeleted\b/)) {
		line.className=line.className.replace(/\bdeleted\b/,"")
		var deleteInput = filter(line.getElementsByTagName('input'), function (node) {
			return node.getAttribute('name') == 'delete';
		})[0];
		deleteInput.value = "0";
		var disabled = false;
	} else {
		line.className += " deleted";
		var deleteInput = filter(line.getElementsByTagName('input'), function (node) {
			return node.getAttribute('name') == 'delete';
		})[0];
		deleteInput.value = "1";
	
		var disabled = true;
	}
	var inputs = line.getElementsByTagName('input');
	for(var i=0; i<inputs.length; ++i) {
		if(inputs[i].getAttribute('name') != 'delete') {
			inputs[i].disabled = disabled;
		}
	}
	var selects = line.getElementsByTagName('select');
	for(var i=0; i<selects.length; ++i) {
		selects[i].disabled = disabled;
	}
}

function getLine(node) {
	var line = node;
	do {
		node = node.parentNode;
	}while(node && node.nodeName.toLowerCase() != 'tr');
	if(!node) return null;
	return node;
}
function processLink(current_link, line) {
	var cls = current_link.getAttribute("class") || current_link.className;
	if(cls.match(/\bdelete\b/)) {
		current_link.onclick = function (lne) {
			return function () {
				deletize(lne);
				return false;
			}
		}(line);
	} else if(cls.match(/\bmodify\b/)) {
		current_link.onclick = function (lne) {
			return function () {
				editLine(lne);
				return false;
			}
		}(line);
	} else if(cls.match(/\bpush-up\b/)) {
		current_link.onclick = function (lne) {
			return function () {
				pushLineUp(lne);
				return false;
			}
		}(line);
	} else if(cls.match(/\bpush-down\b/)) {
		current_link.onclick = function (lne) {
			return function () {
				pushLineDown(lne);
				return false;
			}
		}(line);
	} else if(current_link.id == "add-new-rule") {
		current_link.onclick = function () {
			addLine(line);
			return false;
		};
	}
}

function initArray(arrayId) {
	var table = $(arrayId);
	if (!table) return;
	var table_links = table.getElementsByTagName('a');
	for(var i=0,len=table_links.length; i<len; ++i) {
		var current_link = table_links[i];
		var line = getLine(current_link);
		if(!line) continue;
		
		processLink(current_link, line);
	}
}


/* -- End fonctions for Editables Arrays --*/

/* -- Applications popup for IE (dynamic width) -- */ 
var fixSelectsReduced = Array();
var fixSelectsEnlarged = null;
function fixSelectReduceDelayed(slt)
{
	fixSelectsReduced.push(slt);
	setTimeout("doFixSelectReduce()",200);
}
function doFixSelectReduce()
{
	fixSelectReduce(fixSelectsReduced.pop());
}
function fixSelectReduce(slt)
{
	slt.mousedowned = false;
	slt.mouseclicked = false;
	slt.runtimeStyle.width = slt.defaultSize;
	if (fixSelectsEnlarged == slt) fixSelectsEnlarged = null;
}
function fixSelectExpand(slt)
{
	if ((fixSelectsEnlarged != null) && (fixSelectsEnlarged != slt)) fixSelectReduce(fixSelectsEnlarged);
	slt.mousedowned = false;
	slt.mouseclicked = false;
	slt.runtimeStyle.width = 'auto';
	fixSelectsEnlarged = slt;
}
function fixSelectMouseDown()
{
	window.event.srcElement.mousedowned = true;
	return true;
}
function fixSelectMouseUp()
{
	window.event.srcElement.mouseclicked = true;
	window.event.srcElement.mousedowned = true;
	return true;
}
function fixSelectMouseEnter()
{
	fixSelectExpand(window.event.srcElement);
	return true;
}
function fixSelectMouseLeave()
{
	if (!window.event.srcElement.mousedowned) fixSelectReduceDelayed(window.event.srcElement);
	return true;
}
function fixSelectChanged(slt)
{
	if (!(/MSIE/.test(navigator.userAgent))) return;
	fixSelectReduce(slt);
}
function fixSelectPopup()
{
	if (!(/MSIE/.test(navigator.userAgent))) return;
	var selectBoxes = getElementsByClassName(document,"span","select-box");
	var selectBoxesLen = (selectBoxes == null) ? 0 : selectBoxes.length;
	for (var i = 0; i < selectBoxesLen; i++) {
		var selects = selectBoxes[i].getElementsByTagName('select');
		var selectsLen = (selects == null) ? 0 : selects.length;
		for (var j = 0; j < selectsLen; j++) {
			selects[j].defaultSize = selects[j].currentStyle.width;
			fixSelectReduce(selects[j]);
			addEvent(selects[j],"mousedown",fixSelectMouseDown);
			addEvent(selects[j],"onmouseup",fixSelectMouseUp);
			addEvent(selects[j],"click",fixSelectMouseUp);
			addEvent(selects[j],"mouseenter",fixSelectMouseEnter);
			addEvent(selects[j],"mouseleave",fixSelectMouseLeave);
		}
	}
}

/* -- fonction d'initialisation -- */ 
function init() {
	fixbuttonsforSafari();
	initmenu();
	fixColumns();
	fixSelectPopup();
	document.body.style.zoom=1;
	if (this.InitForm) InitForm();
}
addEvent(window, "load", init);

