/*

WisaForce WISA version 3.0
Copyright 2006-2009 Assuroscope. Tous droits reserves. All rigts reserved.

Avertissement : ce logiciel est protege par la loi relative au droit
d'auteur et par les conventions internationales. Toute reproduction ou
distribution partielle ou totale, par quelque moyen que ce soit, est
strictement interdite. Toute personne ne respectant pas ces dispositions se
rendra coupable du delit de contrefacon et sera passible des sanctions
prevues par la loi.

Pour le support logiciel relatif a Wisa.js, veuillez contacter 
support@wisaforce.fr  

*/


// add an event hooks to forward events to counterpart
var wisaOriginalEvent = new Array();
var wisaCounter = 0;

var wisaJSState = new Array();
var wisaJSStateCounter = 0;

// applet 
var wisaApplet = null;

// nagivator
var wisaNagivator = null;

// time stamp
var wisaTimeStamp = -1;

// html document content
var wisaHTML = null;

// applet identification as client or operator
var wisaIsClient = true;
var wisaIsOperator = false;

var WISA_CS_OFF = 0;
var WISA_CS_ASKING = 1;
var WISA_CS_COL = 2;
var WISA_CS_OBS = 3;
var wisaCollaborativeState = WISA_CS_OFF;
var WISA_SEP = '\x01';


function WisaPreRegister(content)
{
	if( null==content )
		content = document.body.childNodes;
	
	_wisaPreRegister = true;
	
	wisaCounter = 0;
	WisaRegister(content);
	
	_wisaPreRegister = false;
}

function WisaJSStateAdd(id, type, fctStr)
{
	var indexBegin = fctStr.indexOf("WisaJSState");
	var indexEnd = fctStr.indexOf(")", indexBegin);
	var args = fctStr.substring(indexBegin+12, indexEnd);
	var indexComma = args.indexOf(",");
	var arg1 = args.substring(0, indexComma);
	var group = args.substring(indexComma+1);
	var order = parseInt(arg1);
	
	if( null==wisaJSState[order] )
		wisaJSState[order] = new Array();
	if( null==wisaJSState[order][group] )
		wisaJSState[order][group] = new Array();
	
	
	wisaJSState[order][group][id]["type"] = type;
	wisaJSState[order][group][id]["type"] = type;
	
}

function WisaAddEventListener(id, type, fct, bubble)
{
	if( null==wisaOriginalEvent[id]["eventList"][type] )
		wisaOriginalEvent[id]["eventList"][type] = new Array();
	
	if( null==wisaOriginalEvent[id]["eventList"][type]["fct"] )
		wisaOriginalEvent[id]["eventList"][type]["fct"] = new Array();
	
	wisaOriginalEvent[id]["eventList"][type]["fct"].push(fct);
	
	var fctStr = "" + fct;
	if( fctStr.indexOf('WisaModifyURL')!=-1 || fctStr.indexOf('document.location')!=-1 )
	{
		var name = null;

		if( wisaOriginalEvent[id][type]!=null )
			name = type;
		else if( wisaOriginalEvent[id]["on" + type]!=null )
			name = "on" + type;
		
		if( name!=null )
			wisaOriginalEvent[id][name]["modifyURL"] = true;
	}
	
}

function WisaRemoveEventListener(id, type, fct, bubble)
{
	if( null==wisaOriginalEvent[id]["eventList"][type]  || null==wisaOriginalEvent[id]["eventList"][type]["fct"] )
		return;
	
	var index = wisaOriginalEvent[id]["eventList"][type]["fct"].indexOf(fct);
	if( -1==index )
		return;
	
	wisaOriginalEvent[id]["eventList"][type]["fct"].splice(index,1);
	
	var indexOnFct = wisaOriginalEvent[id]["eventList"][type]["index"];
	if( indexOnFct!=null && indexOnFct>=index )
		wisaOriginalEvent[id]["eventList"][type]["index"] = indexOnFct-1;
		
	var modifyURL = false;
	
	for(var i=0; i<wisaOriginalEvent[id]["eventList"][type]["fct"].length; i++)
	{
		var fcrtStr = "" + wisaOriginalEvent[id]["eventList"][type]["fct"][i];
		if( fctStr.indexOf('WisaModifyURL')!=-1  || fctStr.indexOf('document.location')!=-1 )
		{
			modifyURL = true;
			break;
		}
	}

	var name = null;

	if( wisaOriginalEvent[id][type]!=null )
		name = type;
	else if( wisaOriginalEvent[id]["on" + type]!=null )
		name = "on" + type;
	
	if( name!=null )
		wisaOriginalEvent[id][name]["modifyURL"] = (modifyURL ? true : null);
}

function WisaAttachEvent(id, type, fct)
{
	WisaAddEventListener(id, type, fct, false);
}

function WisaDetachEvent(id, type, fct)
{
	WisaRemoveEventListener(id, type, fct, false);
}

function WisaPreRegisterSubNode(subNode)
{
		
	if( null==wisaOriginalEvent[wisaCounter] )
		wisaOriginalEvent[wisaCounter] = new Array();

	if( subNode.addEventListener!=null )
	{
		if( null==wisaOriginalEvent[wisaCounter]["eventList"] )
			wisaOriginalEvent[wisaCounter]["eventList"] = new Array();
				
		subNode.addEventListener = new Function("type, fct, bubble", "WisaAddEventListener(" + wisaCounter + ", type, fct, bubble);");
	}

	if( subNode.removeEventListener!=null )
		subNode.removeEventListener = new Function("type, fct, bubble", "WisaRemoveEventListener(" + wisaCounter + ", type, fct, bubble);");

	if( subNode.attachEvent!=null )
	{
		
		if( null==wisaOriginalEvent[wisaCounter]["eventList"] )
			wisaOriginalEvent[wisaCounter]["eventList"] = new Array();
					
		subNode.attachEvent = new Function("type, fct", "WisaAttachEvent(" + wisaCounter + ", type, fct);");
	}

	if( subNode.detachEvent!=null )
		subNode.detachEvent = new Function("type, fct", "WisaDetachEvent(" + wisaCounter + ", type, fct);");
}

function WisaCaptureEvents(subNode, events)
{
	for(var i=0; i<events.length; i++)
	{
		var name = events[i];
		var splitted = name.split(',');
		name = "on" + splitted[0];
		
		var always = false;
		var set = false;
		for(var j=1; j<splitted.length; j++)
		{
			if( 'always' == splitted[j] )
				always = true;
			if( 'set' == splitted[j] )
				set = true;
		}

		var oldFct;
		eval("oldFct = subNode." + name);
		
		var eventListFlag = false;
		var eventListName = null;
		if( wisaOriginalEvent[wisaCounter]["eventList"]!=null)
		{
			if( wisaOriginalEvent[wisaCounter]["eventList"][splitted[0]]!=null )
				eventListName = splitted[0];
			else if( wisaOriginalEvent[wisaCounter]["eventList"]["on" + splitted[0]]!=null )
				eventListName = "on" + splitted[0];
	
			eventListFlag = (eventListName!=null);
		}
	
		if( oldFct==null && !eventListFlag && !always && !set )
			continue;

		if( oldFct!=null )
		{
			wisaOriginalEvent[wisaCounter][name] = oldFct;
			var fctStr = "" + oldFct;
			if( fctStr.indexOf('WisaModifyURL')!=-1 || fctStr.indexOf('document.location')!=-1 )
                            wisaOriginalEvent[wisaCounter][name]["modifyURL"] = true;
			
			if( eventListName!=null )
			{
				var index = wisaOriginalEvent[wisaCounter]["eventList"][eventListName]["fct"].length;
				if( 0==index  )
					index = -1;
				wisaOriginalEvent[wisaCounter]["eventList"][eventListName]["index"] = index;
            }
		}
		
		var newFct;
		if( set )
			newFct = new Function("e", "return WisaEvent(e, " + wisaCounter + ", true);");
		else
			newFct = new Function("e", "return WisaEvent(e, " + wisaCounter + ");");
		
		eval("subNode." + name + " = newFct");
	}
}

function WisaInputTextEvents(subNode)
{
	var events = ["blur,set", "change,set", "focus", "keydown", "keypress", "keyup,set", "select"];

	if( !_wisaPreRegister )
		WisaCaptureEvents(subNode, events);
	else
		WisaPreRegisterSubNode(subNode);
}

function WisaInputPasswordEvents(subNode)
{
	var events = ["blur,set", "change", "focus", "keydown", "keypress,set", "keyup,set", "select"];

	if( !_wisaPreRegister )
		WisaCaptureEvents(subNode, events);
	else
		WisaPreRegisterSubNode(subNode);
}

function WisaSelectEvents(subNode)
{
	var events = ["blur", "change,set", "focus"];

	if( !_wisaPreRegister )
		WisaCaptureEvents(subNode, events);
	else
		WisaPreRegisterSubNode(subNode);
}

function WisaInputRadioEvents(subNode)
{
	var events = ["blur", "click,set", "focus", "mousedown", "mousemove", "mouseover", "mouseup"];

	if( !_wisaPreRegister )
		WisaCaptureEvents(subNode, events);
	else
		WisaPreRegisterSubNode(subNode);
}

function WisaInputCheckboxEvents(subNode)
{
	var events = ["blur", "click,set", "focus", "mousedown", "mousemove", "mouseover", "mouseup"];

	if( !_wisaPreRegister )
		WisaCaptureEvents(subNode, events);
	else
		WisaPreRegisterSubNode(subNode);
}

function WisaInputButtonEvents(subNode)
{
	var events = ["blur", "click,always", "focus", "mousedown", "mousemove", "mouseover", "mouseup"];

	if( !_wisaPreRegister )
		WisaCaptureEvents(subNode, events);
	else
		WisaPreRegisterSubNode(subNode);
}

function WisaTextareaEvents(subNode)
{
	var events = ["blur,set", "change,set", "focus", "keydown", "keypress", "keyup,set", "select", "scroll"];

	if( !_wisaPreRegister )
		WisaCaptureEvents(subNode, events);
	else
		WisaPreRegisterSubNode(subNode);
}

function WisaAEvents(subNode)
{
	var events = ["click,always"];

	if( !_wisaPreRegister )
		WisaCaptureEvents(subNode, events);
	else
		WisaPreRegisterSubNode(subNode);
}

function WisaDivEvents(subNode)
{
	var events = ["click,always"];

	if( !_wisaPreRegister )
		WisaCaptureEvents(subNode, events);
	else
		WisaPreRegisterSubNode(subNode);
}

var _WISA_MONITORING_ = 0x1;
var _WISA_NO_SYNC_ = 0x2;
var _WISA_CLIENT_ACTION_ONLY_ = 0x4;
var _wisaPreRegister = false;

var _wisaMonitoringFieldName;
function WisaRegister(node, flags)
{
	var length = node.length;
	var i;
	
	if( null==flags )
		flags = 0;

	for(i=0; i<length; i++)
	{
		var subNode = node[i];
		var tagName = subNode.tagName;
		var scanSubNode = true;
		var id;
		var action;
		var href;
		var _flags = 0;
		
		switch(tagName)
		{
			case 'A':
				if( null==wisaOriginalEvent[wisaCounter] )
					wisaOriginalEvent[wisaCounter] = new Array();
				
				if( !_wisaPreRegister )
				{
					wisaOriginalEvent[wisaCounter]["kind"] = "a";
					
					if( subNode.onclick!=null )
						wisaOriginalEvent[wisaCounter]["onclick"] = subNode.onclick;
					
					href = subNode.href;
					
					if( href!=null && href!="" && (new String(href)).indexOf('#')!=0 )
					{
						wisaOriginalEvent[wisaCounter]["modifyURL"] = true;
						wisaOriginalEvent[wisaCounter]["href"] = href;
					}
					wisaOriginalEvent[wisaCounter]["flags"] = flags;
				}
				
				WisaAEvents(subNode);
//				subNode.onclick = new Function("e", "return WisaEvent(e, " + wisaCounter + ");");
				

				wisaCounter++;
				break;
				
			case 'INPUT': 
				
				if( null==wisaOriginalEvent[wisaCounter] )
					wisaOriginalEvent[wisaCounter] = new Array();
				
				if( !_wisaPreRegister )
				{
					wisaOriginalEvent[wisaCounter]["kind"] = "input";
					wisaOriginalEvent[wisaCounter]["type"] = subNode.type;
					wisaOriginalEvent[wisaCounter]["object"] = subNode;
				}
				
				switch(subNode.type)
				{
					case 'button':
						WisaInputButtonEvents(subNode);
						break;
					case 'checkbox':
						WisaInputCheckboxEvents(subNode);
						break;
					case 'password':
						WisaInputPasswordEvents(subNode);
						break;
					case 'radio':
						WisaInputRadioEvents(subNode);
						break;
					case 'submit':
					case 'image':
						WisaInputButtonEvents(subNode);
						wisaOriginalEvent[wisaCounter]["modifyURL"] = true;
						break;
					case 'text':
						WisaInputTextEvents(subNode);
						break;
					case 'hidden':
						break;
					default:
						// document.write('do not handle input type' + subNode.type + '<br />');
						
				}

				wisaOriginalEvent[wisaCounter]["flags"] = flags;

				if( !_wisaPreRegister )
				{
					if(flags & _WISA_MONITORING_)
						wisaOriginalEvent[wisaCounter]["monitoring"] = _wisaMonitoringFieldName;
				}
			
				wisaCounter++;
				break;
				
			case 'TEXTAREA':

				if( null==wisaOriginalEvent[wisaCounter] )
					wisaOriginalEvent[wisaCounter] = new Array();
				
				if( !_wisaPreRegister )
				{
					wisaOriginalEvent[wisaCounter]["kind"] = "textarea";
					wisaOriginalEvent[wisaCounter]["type"] = subNode.type;
					wisaOriginalEvent[wisaCounter]["object"] = subNode;
				}

				WisaTextareaEvents(subNode);
				
				if( !_wisaPreRegister )
				{
					wisaOriginalEvent[wisaCounter]["flags"] = flags;
					if(flags & _WISA_MONITORING_)
						wisaOriginalEvent[wisaCounter]["monitoring"] = _wisaMonitoringFieldName;
				}

				wisaCounter++;
				break;
				
			case 'DIV':

				if( subNode.id!=null )
				{
					id = String(subNode.id); 
					if( 0==id.indexOf('wisa_no_sync') || 0==id.indexOf('wisa_collaboration') || 0==id.indexOf('wisa_html_client_only') )
						scanSubNode = false;
					else if( 0==id.indexOf('wisa_monitoring') )
					{
						_flags |= _WISA_MONITORING_;
						_wisaMonitoringFieldName = id;
					} 
					else if( 0==id.indexOf('wisa_client_action_only') )
					{
						_flags |= _WISA_CLIENT_ACTION_ONLY_;
					}
					else if( 0==id.indexOf('wisa_start') ) 
					{
						scanSubNode = false;
						wisaCounter = 0;
					}
				}
				
				if( subNode.className!=null )
				{
					className = String(subNode.className);
					if( 0==className.indexOf('wisa_start') )
					{
						wisaCounter = 0;
					}
				}
				
				if( subNode.onclick!=null ) /* AIW */
				{
					if( null==wisaOriginalEvent[wisaCounter] )
						wisaOriginalEvent[wisaCounter] = new Array();

					if( !_wisaPreRegister )
					{
						wisaOriginalEvent[wisaCounter]["kind"] = "div";
						wisaOriginalEvent[wisaCounter]["type"] = subNode.type;
						wisaOriginalEvent[wisaCounter]["object"] = subNode;
					}
					
					WisaDivEvents(subNode);
					wisaCounter++;
				}
				break;
				
			case 'FORM':
				break;
			
			case 'SELECT':
			
				if( null==wisaOriginalEvent[wisaCounter] )
					wisaOriginalEvent[wisaCounter] = new Array();

				if( !_wisaPreRegister )
				{
					wisaOriginalEvent[wisaCounter]["kind"] = "select";
					wisaOriginalEvent[wisaCounter]["object"] = subNode;
				}
				
				WisaSelectEvents(subNode);
				
				if( !_wisaPreRegister )
				{
					wisaOriginalEvent[wisaCounter]["flags"] = flags;
					if(flags & _WISA_MONITORING_)
						wisaOriginalEvent[wisaCounter]["monitoring"] = _wisaMonitoringFieldName;
				}
				
				wisaCounter++;
				break;
			
			case 'BUTTON':
			
				if( null==wisaOriginalEvent[wisaCounter] )
					wisaOriginalEvent[wisaCounter] = new Array();
				
				if( !_wisaPreRegister )
				{
					wisaOriginalEvent[wisaCounter]["kind"] = "button";
					wisaOriginalEvent[wisaCounter]["type"] = subNode.type;
					wisaOriginalEvent[wisaCounter]["object"] = subNode;
					wisaOriginalEvent[wisaCounter]["flags"] = flags;
				}
				
				WisaInputButtonEvents(subNode); // WisaInputButtonEvents should follow previous block
				if( 'submit'==subNode.type )
					wisaOriginalEvent[wisaCounter]["modifyURL"] = true;
				
				wisaCounter++;
				break;
			default: 
				// nothing done  ... 
				break;
		}

		if(subNode.hasChildNodes() && scanSubNode)
		{
			WisaRegister(subNode.childNodes, flags | _flags);
		}
	}
}

function WisaCommonStr(str1, str2, where)
{
	var length1 = str1.length;
	var length2 = str2.length;
	var length = (length1<length2) ? length1 : length2;
	var inc = Math.floor(length/2);
	var pos;
	var substr1;
	var substr2;
	
	if( length<1 )
		return 0;

	if( inc<1 )
		inc = 1;
	
	if(where==0)
	{
		pos = 0;
		while(inc>0)
		{
			while( pos+inc<=length )
			{
				substr1 = str1.substring(0, pos+inc);
				substr2 = str2.substring(0, pos+inc);
				if( substr1 != substr2 )
					break;
				pos = pos+inc;
			}
			inc = Math.floor(inc/2);
		}
		
		return pos;
	}
	else
	{
		var pos1 = length1;
		var pos2 = length2;
		while(inc>0)
		{
			while( pos1-inc>=0 && pos2-inc>=0 )
			{
				substr1 = str1.substring(pos1-inc, length1);
				substr2 = str2.substring(pos2-inc, length2);
				if( substr1 != substr2 )
					break;
				pos1 = pos1-inc;
				pos2 = pos2-inc;
			}
			inc = Math.floor(inc/2);
		}
		return length1-pos1;
	}
}

function WisaEncodeStrDiff(oldValue, newValue)
{
	var value = null;

	var lengthOld;
	var lengthNew;
	var commonBegin;
	var commonEnd;

	if( oldValue!=null )
	{
		lengthOld = oldValue.length;
		lengthNew = newValue.length;
		commonBegin = WisaCommonStr(oldValue, newValue, 0);
		commonEnd = WisaCommonStr(oldValue, newValue, 1);
		if( lengthOld>lengthNew )
		{
			value = "D," + commonBegin + "," + (lengthOld-lengthNew);
		}
		else if( lengthOld<lengthNew )
		{
			value = "I," + commonBegin + "," + newValue.substring(commonBegin, lengthNew-commonEnd);
		}
	}
	else
		value = "S," + newValue;
	
	return value;
}

function WisaApplyStrDiff(oldValue, diff)
{
	var index = diff.indexOf(',');
	var pos;
	var newValue;
	var nbcars;
	
	if(index!=1)
		return oldValue;
	var cmd = diff.substring(0,1);
	if( "S"==cmd )
		return diff.substring(2, diff.length);
	else if( "I"==cmd )
	{
		index = diff.indexOf(',', 2);
		if( -1==index )
			return oldValue;
		pos = parseInt(diff.substring(2, index));
		value = diff.substring(index+1, diff.length);
		newValue = oldValue.substring(0, pos) + value + oldValue.substring(pos, oldValue.length);
		return newValue;
	}
	else if( "D"==cmd )
	{
		index = diff.indexOf(',', 2);
		if( -1==index )
			return oldValue;
		pos = parseInt(diff.substring(2, index));
		nbcars = parseInt(diff.substring(index+1, diff.length));
		newValue = oldValue.substring(0, pos) + oldValue.substring(pos+nbcars, oldValue.length);
		return newValue;
	}
	
	return oldValue;
}

function WisaGetValue(id, fullField)
{
	var value = null;
	
	switch(wisaOriginalEvent[id]["kind"])
	{
		case "input":
			switch(wisaOriginalEvent[id]["type"])
			{
				case 'button':
					break;
				case 'checkbox':
					value = wisaOriginalEvent[id]["object"].checked ? "true" : "false";
					break;
				case 'password':
					value  = wisaOriginalEvent[id]["object"].value;
					break;
				case 'radio':
					value = wisaOriginalEvent[id]["object"].checked ? "true" : "false";
					break;
				case 'text':
					value  = wisaOriginalEvent[id]["object"].value;
					break;
			}
			break;
			
		case "textarea":
			var newValue = wisaOriginalEvent[id]["object"].value;
			if(null==fullField || !fullField)
			{
				var oldValue = wisaOriginalEvent[id]["object"].oldValue;
				value = WisaEncodeStrDiff(oldValue, newValue);
			}
			else
				value = "S," + newValue;
			
			wisaOriginalEvent[id]["object"].oldValue = newValue;
			break;
		
		case "select":
			value = wisaOriginalEvent[id]["object"].value;
			break;
	}
	
	return value;
}

function WisaGetAllValues()
{	
	if( 0==wisaCounter )
		return null;

	var values = "";
	var loop;
	
	for(loop=0; loop<wisaCounter; loop++)
	{
		var value = WisaGetValue(loop, true);
		if( value!=null && ( "radio"!=wisaOriginalEvent[loop]["type"] || "true"==value) )
		{
			values += new String(loop) + ' "' + WisaEscapeNL(value, '"') +'"\n';
		}
	}
	
	values = WisaEscapeNL(values);
	
	return values;
}

function WisaSetValue(id, value)
{
	if( value!=null )
		value = WisaUnescapeNL(value);
	
	switch(wisaOriginalEvent[id]["kind"])
	{
		case "input":
			switch(wisaOriginalEvent[id]["type"])
			{
				case 'button':
					break;
				case 'checkbox':
					wisaOriginalEvent[id]["object"].checked = (value=="true");
					if( wisaOriginalEvent[id]["onclick"]!=null )
						wisaOriginalEvent[id]["onclick"]();
					break;
				case 'password':
					wisaOriginalEvent[id]["object"].value = value;
					if( wisaOriginalEvent[id]["onchange"]!=null )
						wisaOriginalEvent[id]["onchange"]();
					break;
				case 'radio':
					wisaOriginalEvent[id]["object"].checked = (value=="true");
					if( wisaOriginalEvent[id]["onclick"]!=null )
						wisaOriginalEvent[id]["onclick"]();
					break;
				case 'text':
					wisaOriginalEvent[id]["object"].value = value;
					if( wisaOriginalEvent[id]["onchange"]!=null )
						wisaOriginalEvent[id]["onchange"]();
					break;
			}
			break;
		case "select":
			wisaOriginalEvent[id]["object"].value = value;
			if( wisaOriginalEvent[id]["onchange"]!=null )
				wisaOriginalEvent[id]["onchange"]();
			break;
		case "textarea":
			wisaOriginalEvent[id]["object"].value = WisaApplyStrDiff(wisaOriginalEvent[id]["object"].value, value);
			wisaOriginalEvent[id]["object"].oldValue = wisaOriginalEvent[id]["object"].value;
			break;
	}
}

function WisaSetAllValues(values)
{	
	if( null==values )
		return;
		
	values = new String(values);
	var quoteBegin = " \"";
	var quoteEnd = "\"\n";
	
	values = WisaUnescapeNL(values);
	var loop = 0;	
	for(loop=0; loop<values.length; )
	{
		var begin = values.indexOf(quoteBegin, loop);
		if( -1==begin )
			break;

		var id = parseInt(values.substring(loop, begin));
		
		begin += quoteBegin.length;
		var end = values.indexOf(quoteEnd, begin);
		
		if( -1==end )
			break;

		var value = WisaUnescapeNL(values.substring(begin, end), '"');
		WisaSetValue(id, value);
		
		loop = end + quoteEnd.length;
	}
}

function WisaExcelOriginalOnEvent(id, e, eventName)
{
	var obj = wisaOriginalEvent[id]["object"];
	obj.wisaFct = wisaOriginalEvent[id][eventName];
	return  obj.wisaFct(e);
}

function WisaExecOriginalEvents(id, e, type)
{
	
	var eventName = "on" + type;
	
	var result = null;
	
	if( wisaOriginalEvent[id]["eventList"]!=null )
	{
		var typeName = null;

		if(wisaOriginalEvent[id]["eventList"][type] != null) 
			typeName = type;
		else if(wisaOriginalEvent[id]["eventList"][eventName] != null)
			typeName = eventName;

		if( typeName!=null )
		{
			var length = wisaOriginalEvent[id]["eventList"][typeName]["fct"].length;
			var indexOnFct = wisaOriginalEvent[id]["eventList"][typeName]["index"];
			if( -1==indexOnFct )
				result = WisaExcelOriginalOnEvent(id, e, eventName);
			for(var i=0; i<length; i++)
			{
				var obj = wisaOriginalEvent[id]["object"];
				obj.wisaFct = wisaOriginalEvent[id]["eventList"][typeName]["fct"][i];
				result = obj.wisaFct(e);

				if( indexOnFct==i )
					result = WisaExcelOriginalOnEvent(id, e, eventName);
			}
			if( indexOnFct==length )
				result = WisaExcelOriginalOnEvent(id, e, eventName);
		}
	}
	else if( wisaOriginalEvent[id][eventName]!=null )
		result = WisaExcelOriginalOnEvent(id, e, eventName);
	
	return result;
}

function WisaEvent(e, id, set)
{
	if( "undefined" == typeof e )
	{
		if( typeof window.event != "undefined" )
			e = window.event;
		else
			return null;
//		if( "undefined" == typeof e )
//			return null;
	}
	
	
	var eventType = "";
	var eventName = "";
	var sendEvent = false;
    var result = null;
    var modifyURL = null;
	if( e != null )
	{
		eventType = e.type;
		eventName = "on" + eventType;
	
	    if( wisaOriginalEvent[id]==null )
	        return null;
	    
	    if( wisaOriginalEvent[id][eventName]!=null && wisaOriginalEvent[id][eventName]["modifyURL"]!=null )
	         modifyURL = wisaOriginalEvent[id][eventName]["modifyURL"];
	    else if( wisaOriginalEvent[id]["modifyURL"]!=null )
	         modifyURL = wisaOriginalEvent[id]["modifyURL"];
	            
	        
		if( null==modifyURL || !wisaIsOperator )
			result = WisaExecOriginalEvents(id, e, e.type);

		sendEvent  = (null==modifyURL) || wisaIsOperator;
		sendEvent &= !( ("submit"==wisaOriginalEvent[id]["type"]) && wisaIsClient);
		sendEvent &= !( (wisaOriginalEvent[id]["flags"] & _WISA_CLIENT_ACTION_ONLY_ )!=0 && wisaIsOperator );
	}
	else
		sendEvent = true;
	
        
	if( sendEvent ) // if anchor and operator -> operator send the message to the client
	{		
		// Then launch the action
		if(wisaApplet!=null )
		{

			var flags = null;
			var value = null;
			
			if( set!=null )
			{
				value = WisaGetValue(id);
			
				if( value!=null )
					value = WisaEscapeNL(value);
			}
			
			if( modifyURL!=null )
				flags = "modifyURL";
				
			if( wisaOriginalEvent[id]["monitoring"]!=null )
			{
				if(flags!=null)
					flags += "," + wisaOriginalEvent[id]["monitoring"];
				else
					flags = wisaOriginalEvent[id]["monitoring"];
			}
			
			if( wisaCollaborativeState==WISA_CS_COL || wisaCollaborativeState==WISA_CS_OBS || wisaOriginalEvent[id]["monitoring"]!=null )
				wisaApplet.wisaEvent(id, eventType, value, flags );
		}
	}

	if( wisaIsOperator && "onclick"==eventName && true==modifyURL )
		result = false;
	
	return result;
}

function WisaEventSync(id, type, value)
{	
	if( value!=null )
		WisaSetValue(id, value);
	
	var eventName = "on" + type;
	var result = null;
	
	if(type!="")
	{
		var e = new Object;
		e.target = wisaOriginalEvent[id]["eventList"];
		e.name = type;
		
		result = WisaExecOriginalEvents(id, e, type);
	}
		
	if( wisaOriginalEvent[id]["href"]!=null )
	{
		document.location.href = wisaOriginalEvent[id]["href"];
	}
	
	if( wisaOriginalEvent[id]["type"]=="submit" && wisaOriginalEvent[id]["object"]!=null && wisaOriginalEvent[id]["object"].form!=null)
	{
		wisaOriginalEvent[id]["object"].form.submit();
	}
	
	return result;
}

function WisaJSState(order, group)
{
}

function WisaModified(id)
{
	var el = document.getElementById(id);
	if( null==el )
		return;
	
	for(var loop=0; loop<wisaCounter; loop++)
	{
		if( el==wisaOriginalEvent[loop]["object"] )
		{
			WisaEvent(null, loop, true);
			return;
		}
	}
}

function WisaInvokeRemote(remoteFct, localFct, args)
{
	if( localFct!=null )
		eval(localFct + "(" + args  + ");" );
	
	if( wisaApplet && remoteFct!=null )
		wisaApplet.wisaInvokeRemote(remoteFct, args);
}

function WisaSetProduct(product)
{
	if( wisaApplet )
		wisaApplet.wisaSetProduct(product);
}

function WisaSetCollaborativeStateUserToServer(state, flags)
{
	if( null==wisaApplet )
		return ;

	wisaCollaborativeState = state;
	wisaApplet.wisaSetCollaborativeStateUserToServer(state, flags);
	
	if( typeof WisaCollaborativeStateCallback != "undefined" )
		WisaCollaborativeStateCallback(state);
	
}

function WisaSetCollaborativeStateServerToUser(state)
{
	wisaCollaborativeState = state;
	
	if( typeof WisaCollaborativeStateCallback != "undefined" )
		WisaCollaborativeStateCallback(state);
}

function WisaCollaborativeState()
{
	return wisaCollaborative;
}


function WisaEscapeNL(str, cars) 
{
	str = new String(str).replace(/\\/g,'\\\\').replace(/\n/g,'\\n').replace(/\r/g,'\\r');
	
	if( typeof cars=="undefined" || cars.length<1 )
		return str;
	
	var loop;
	for(loop=0; loop<cars.length; loop++)
		str = str.replace(new RegExp(new String(cars.charAt(loop)), "g"), '\\' + cars.charAt(loop));
	
	return str;
}

function WisaUnescapeNL(str, cars) 
{
	if( ("string"==typeof cars) &&  (cars.length>0) )
	{
		var loop;
		for(loop=0; loop<cars.length; loop++)
			str = str.replace( new RegExp( "\\" + cars.charAt(loop), "g"), cars.charAt(loop));

	}
	
	str = new String(str).replace(/\\\\/g, "\\").replace(/\\n/g, "\n").replace(/\\r/g, "\r");
	
	return str;
}

function WisaNagivator()
{
	if( wisaNagivator!=null )
		return wisaNagivator;
		
	var agent = new String(navigator.userAgent);

	if( agent.indexOf('Safari')!=-1 )
		wisaNagivator = "Safari";
	else if( agent.indexOf('MSIE')!=-1 )
		wisaNagivator = "MSIE";
	else if( agent.indexOf('Firefox')!=-1 )
		wisaNagivator = "Firefox";
	else 
		wisaNagivator = "unknown";
	
	return wisaNagivator;
}

function WisaModifyURL()
{
}

function WisaGetURL()
{
	return document.location.href;
}

function WisaSetURL(url)
{
	document.location.href = url;
}

function WisaGetPage()
{
	if( null==wisaApplet )
		return ;
	
	wisaApplet.wisaSetPage(new String(wisaHTML), 
						   new String(document.location.href), 
						   new String(wisaTimeStamp), 
						   new String(document.cookie)
						   );
}

function WisaPageURL(url, ts, product)
{
	if( wisaApplet )
		wisaApplet.wisaPageURL(url, ts, product);
}

function WisaOperatorLogout()
{
	if( wisaApplet )
		wisaApplet.wisaLogout();
}

function WisaCall(number, session)
{
    if( typeof WisaCallCallback != "undefined" )
    {
        WisaCallCallback(number, session);
        return;
    }
            
    if(wisaIsOperator)
    {
        number = "0033" + number;
    }
     
    document.location.href="skype:" + number + "?call";
}

function WisaGetTimeStamp()
{
	return wisaTimeStamp;
}

var _wisaAppletId;
var _wisaContent;
var _wisaProduct;
var _wisaIntervalId;
function Wisa(ts, product, appletId, content)
{
	_wisaAppletId = (null==appletId) ? "wisa_applet" : appletId;
	_wisaContent = (null==content) ? document.body.childNodes : content;
	_wisaProduct = product;
	
	wisaHTML   = document.documentElement.innerHTML;
	wisaTimeStamp = ts;

	wisaApplet = document.getElementById(_wisaAppletId);
	
	if( wisaApplet!=null )
	{
		if( WisaIsAppletReady() )
			WisaStart();
		else
			_wisaIntervalId = window.setInterval("WisaIsAppletReady()", 300);
	}
}

function WisaIsAppletReady()
{
	var status = null;
	
	try { status = wisaApplet.ready(); } catch(e) {}
	
	if( null==status )
		return null;
	
	var str = "" + status;
		
	var result = (str=="ready");
	if( true==result && _wisaIntervalId!=null )
	{
		clearInterval( _wisaIntervalId );
		WisaStart();
	}
	
	return result;
}

function WisaStart()
{
	var str = wisaApplet.code;
	
	wisaIsClient = str.indexOf("Client")>=0;
	wisaIsOperator = str.indexOf("Operator")>=0;

	wisaCounter = 0;
	WisaRegister( _wisaContent );

	if( wisaIsClient )
		WisaPageURL( document.location.href, wisaTimeStamp, _wisaProduct );
	else if( wisaIsOperator )
		wisaApplet.wisaGetAllValues( new String(wisaTimeStamp) );
}

function WisaOffline()
{
	if( typeof WisaOfflineCallback != "undefined" )
		WisaOfflineCallback();
}

function WisaNoOperator()
{
	if( typeof WisaNoOperatorCallback != "undefined" )
		WisaNoOperatorCallback();
}

function WisaClientQueue(info)
{
	if( typeof WisaClientQueueCallback != "undefined" )
		WisaClientQueueCallback(info);
}

function WisaHelpServerToClient(state)
{
	if( typeof WisaHelpServerToClientCallback != "undefined" )
		WisaHelpServerToClientCallback(state);
}

function WisaHelpUserToServer(state, info)
{
	if( wisaApplet )
		wisaApplet.wisaHelpUserToServer(state, info);
}

function WisaHelpServerToClientCallback(state)
{
	var el = document.getElementById('wisa_help_window');
	if( "0"==state )
	{
		el.style.visibility = "hidden";
	}
	else
	{
		el.style.visibility = "visible";
	}
}

/****************************************************************************************
								CUSTOMABLE PART
****************************************************************************************/

function WisaNoOperatorCallback()
{
	document.location.href = "/assuroscope/rendezvous/rendezvous.php";
}

function WisaOfflineCallback()
{
	document.location.href = "/assuroscope/rendezvous/rendezvous.php";
}
