;

ojcGlobal = function () {
	var scriptQueue = [];
	var currentFocusChain = [];
	var loadingControls = [];
	var blockLoadingControls = true;

	/* Public */
	this.baseurl = "";
	this.ui = [];
	this.ui.navigators = {};
	this.language = '';
	this.texts = {};
	this.keyPressed = { shift: false, ctrl: false, alt: false };
	this.notificationHandlers = [];
	this.notificationTimeStamp = 0;

	var removeFromArray = function (arr, el) {
		for (var i = 0; i < arr.length; i++)
			if (arr[i] === el) {
				arr[i] = arr[arr.length - 1];
				arr.pop();
				break;
			}
	};

	this.loading = function (c, b) {
		if (c === false) {		// unload all
			while (loadingControls.length)
				this.loading(loadingControls[0], false);
			return;
		}
		if (!(b === false))
			for (i = 0; i < loadingControls.length; i++)
				if (loadingControls[i] === c) return;
//		console.log('loading ' + (typeof (c.element) !== 'undefined' ? c.element.id : 'unknown') + ': ' + (b === false ? '0' : '1'));
		if (b === false)
			removeFromArray(loadingControls, c);
		else
			loadingControls.push(c);
		if (typeof (c.loading) !== 'undefined')
			c.loading = !(b === false);
		if (blockLoadingControls && typeof (c.element) !== 'undefined') {
			if (b === false)
				$(c.element).unblock();
			else
				$(c.element).block({ message: null, fadeIn: 0, fadeOut: 0, overlayCSS: { backgroundColor: '#FFF', cursor: 'default'} });
		}
		var currentlyLoading = '';
		for (var i = 0; i < loadingControls.length; i++) {
			var ctrl = loadingControls[i];
			currentlyLoading += (typeof (ctrl.element) !== 'undefined' ? ctrl.element.id : 'unknown') + ', ';
		}
//		console.log('currentlyLoading: ' + currentlyLoading);
	};

	this.addScript = function (script) {
		var f = this.parseScript(script);
		if (!f) return;
		scriptQueue.push(f);
	};
	this.runScripts = function () {
		if (scriptQueue.length < 1)
			return;
		var f;
		while (f = scriptQueue.shift())
			f.call();
		this.runScripts(); 	// in case new scripts have been added by previously run scripts
	};


	this.displayMessages = function (s) {
		displayedMsg = '';
		for (var i = 0; i < s.length; i++)
			displayedMsg += s[i] + '\n';
		alert(displayedMsg);
	};

	this.registerHandler = function (handlerDef) {
		this.notificationHandlers.unshift(handlerDef);
	};

	this.notify = function (s, cnts) {
		var skip = 0;
		if (typeof s == 'string') s = [s];
		if (cnts) {
			if (this.notificationTimeStamp >= cnts) return; 	// notifications déjà reçues
			skip = s.length - cnts + this.notificationTimeStamp; 	// notifications en partie reçues, il faudra ignorer les premières
			if (skip < 0) skip = 0;
			this.notificationTimeStamp = cnts;
		}
		var updatedNotificationHandlersList = [];
		for (var i = this.notificationHandlers.length - 1; i >= 0; i--) {	// eliminates obsolete handlers
			var handler = this.notificationHandlers[i];
			if (handler && handler.notification && handler.object && handler.method && handler.object[handler.method])
				updatedNotificationHandlersList.unshift(handler);
		}
		this.notificationHandlers = updatedNotificationHandlersList;
		for (var n = skip; n < s.length; n++) {
			var notif = s[n];
			if (notif) {
				for (i = 0, j = this.notificationHandlers.length; i < j; i++) {
					handler = this.notificationHandlers[i];
					matchResult = new RegExp(handler.notification, 'i').exec(notif);
					if (matchResult) {
						if (matchResult.length > 1)
							handler.object[handler.method](matchResult[1]);
						else
							handler.object[handler.method]();
					}
				}
			}
		}
	};

	var setFocusChain = function (newFocusChain) {
		var remainInFocus = [];
		for (var i = newFocusChain.length - 1; i >= 0; i--) {
			var ctrl = newFocusChain[i];
			var j = jQuery.inArray(ctrl, currentFocusChain);
			if (j >= 0) {
				remainInFocus = currentFocusChain.slice(0, j + 1);
				currentFocusChain.splice(0, j + 1);
				newFocusChain.splice(0, i + 1);
			}
		}
		for (i = currentFocusChain.length - 1; i >= 0; i--) {
			ctrl = currentFocusChain[i];
			if (typeof (ctrl.control) !== 'undefined')
				ctrl.control.hasFocus = false;
			$(ctrl).trigger('onBlur');
		}
		for (i in newFocusChain) {
			ctrl = newFocusChain[i];
			if (typeof (ctrl.control) !== 'undefined')
				ctrl.control.hasFocus = true;
			$(ctrl).trigger('onFocus');
			remainInFocus.push(ctrl);
		}
		currentFocusChain = remainInFocus;
	}
	this.setFocus = function (target) {
		var controlChain = [];
		$(target).parents('.ojcControl').each(function () {
			controlChain.push(this);
		});
		controlChain.reverse();
		controlChain.push(target);
		setFocusChain(controlChain);
	}

	this.selectLanguage = function (lang) {
		var ts = this;
		$.ajax({ url: 'Language/SelectLanguage', type: 'POST', dataType: 'text', data: { language: lang },
			complete: function (text, st) {
				if (st === 'success') {
					ts.language = text;
					text = null;
				}
			}
		});

		this.language = lang;
		this.texts = {};
	}
	this.loadResourceSet = function (resourceSet) {
		$.ajax({ url: 'Language/json_GetResourceSet', type: 'POST', async: false, dataType: 'json', data: { resourceSet: resourceSet },
			processJSON: function (JSON) {
				$.ojc.texts[resourceSet] = JSON;
			}
		});
	};
	this.getString = function (resourceSet, resourceKey) {
		if (typeof (this.texts[resourceSet]) == "undefined")
			this.loadResourceSet(resourceSet); 	// attempts to load resource set's texts
		if (typeof (this.texts[resourceSet]) == "undefined" || typeof (this.texts[resourceSet][resourceKey]) == "undefined")
			return "[" + resourceSet + ":" + resourceKey + "]";  // loading failed, or text does not exist
		return this.texts[resourceSet][resourceKey];
	};
	this.intNum = function (val, defval) {
		val = parseInt(val, 10);
		if (isNaN(val)) { return (defval) ? defval : 0; }
		else { return val; }
	};

	this.parseScript = function (script) {
		if (typeof script == 'undefined' || script === null) return false;
		if (!script) return false;
		if ($.isFunction(script)) return script; 	// déjà une fonction
		if (script.length < 1) return false;
		var s;
		try {
			s = eval("a=" + script + ";");
			if ($.isFunction(s)) return s;
		} catch (ex) { }
		try {
			s = eval("a=function() {" + script + "};");
		} catch (ex) { alert('Bad script : ' + script); }
		if ($.isFunction(s)) return s;
		return false;
	};

	/* Gestion des navigateurs */
	var visibleNavigatorsCount = 0;
	var navigatorContainer = null;
	this.registerNavigator = function (navigator) {
		$.ojc.ui.navigators[navigator.element.id] = navigator;
		if (!navigatorContainer)
			navigatorContainer = $(navigator.element).parent();
		visibleNavigatorsCount++;
	}
	this.showNavigator = function (navigator) {
		navigator.show();
		if (visibleNavigatorsCount == 0)
			navigatorContainer.show();
		visibleNavigatorsCount++;
	}
	this.hideNavigator = function (navigator) {
		navigator.hide();
		visibleNavigatorsCount--;
		if (visibleNavigatorsCount == 0)
			navigatorContainer.hide();
	}
	this.getNavigatorSection = function (navigatorId, sectionName) {
		if (typeof ($.ojc.ui.navigators[navigatorId]) === 'undefined') return null;
		return $.ojc.ui.navigators[navigatorId].getSection(sectionName);
	}
	this.showSectionSets = function (sectionSetDefinition) {
		for (var navigatorId in sectionSetDefinition) {
			if (typeof ($.ojc.ui.navigators[navigatorId]) === 'undefined') continue;
			$.ojc.ui.navigators[navigatorId].showSectionSet(sectionSetDefinition[navigatorId]);
		}
	};
	this.hideAllNavigatorSections = function () {
		for (var navigatorId in $.ojc.ui.navigators) {
			$.ojc.ui.navigators[navigatorId].hideAllSections();
		}
	}

	/* Gestion des formulaires */
	this.getFormData = function (t) {
		var a = {};
		form = $("form:first", t);
		if (form.length < 1) return a;
		form = form[0];
		if (typeof (form.elements) == 'undefined' || (!form.elements) || form.elements.length < 1) return a;

		if (typeof (tinyMCE) !== 'undefined')
			tinyMCE.triggerSave();
		var els = form.elements;
		for (var i = 0, max = els.length; i < max; i++) {
			var el = els[i];
			var n = el.name;
			if (!n) continue;

			var v = getFieldValue(el, true);
			if (v !== null && typeof v != 'undefined' && typeof (a[n]) == 'undefined') {
				a[n] = v;
			}
			//					if (v && v.constructor == Array) {
			//						for (var j = 0, jmax = v.length; j < jmax; j++)
			//							a.push({ name: n, value: v[j] });
			//					}
			//					else if (v !== null && typeof v != 'undefined')
			//						a.push({ name: n, value: v });
		}
		return a;
	};
	var getFieldValue = function (el, successful) {
		var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
		if (typeof successful == 'undefined') successful = true;

		if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
					(t == 'checkbox' || t == 'radio') && !el.checked ||
					(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
					tag == 'select' && el.selectedIndex == -1))
			return null;

		if (tag == 'select') {
			var index = el.selectedIndex;
			if (index < 0) return null;
			var a = [], ops = el.options;
			var one = (t == 'select-one');
			var max = (one ? index + 1 : ops.length);
			for (var i = (one ? index : 0); i < max; i++) {
				var op = ops[i];
				if (op.selected) {
					var v = op.value;
					if (!v) // extra pain for IE...
						v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
					if (one) return v;
					a.push(v);
				}
			}
			return a;
		}
		return el.value;
	};

	this.clearForm = function (ele) {
		$(ele).find(':input').each(function () {
			switch (this.type) {
				case 'password':
				case 'select-multiple':
				case 'select-one':
				case 'text':
				case 'textarea':
					$(this).val('');
					break;
				case 'checkbox':
				case 'radio':
					this.checked = false;
			}
		});
	};
};


(function($) {

	$.ojc = new ojcGlobal();

	$(document).keyup(function(e) {
		if (e.which == 16) $.ojc.keyPressed.shift = false;
		else if (e.which == 17) $.ojc.keyPressed.ctrl = false;
		else if (e.which == 18) $.ojc.keyPressed.alt = false;
	}).keydown(function(e) {
		if (e.which == 16) $.ojc.keyPressed.shift = true;
		else if (e.which == 17) $.ojc.keyPressed.ctrl = true;
		else if (e.which == 18) $.ojc.keyPressed.alt = true;
	});

	/* Surcharge les appels AJAX (permet d'ajouter dans les structures JSON des scripts à exécuter) */
	var _ajax = $.ajax;
	$.extend ({
		ajax: function( s ) {
			var _complete = false;
			if (s && s.complete)
				_complete = s.complete;
			s = jQuery.extend(true, {}, s, {
				dataFilter: function(data, type) {
					if (type == "json") {
						var i = data.indexOf('#####');
						if (i >= 0 && data.length > i + 5) {
							var clientScripts = "function() {" + data.substr(i + 5, data.length) + "}";
							$.ojc.addScript(clientScripts);
							return data.substr(0, i);
						}
					}
					return data;
				},
				complete: function( xhr, status ) {
					if (xhr && xhr.responseText && s.dataType == "json" && status == "success" && s.processJSON) {
						var i = xhr.responseText.indexOf('#####');
						var data = xhr.responseText;
						if (i >= 0 && data.length > i + 5) {
							data = data.substr(0, i);
						}
						s.processJSON (eval("(" + data + ")"), xhr);
					}
					if (_complete)
						_complete ( xhr, status);
				}
			});
			if ( s.dataType == "script" && s.url.match(/\.js/)) {
				if (s.cache == null)
					s.cache = true;
			} else {
				var cnts = {
					notificationTimeStamp : $.ojc.notificationTimeStamp
				};
				if (s.data === null)
					s.data = cnts;
				else {
					if (typeof (s.data) === 'string')
						s.data = s.data + "&notificationTimeStamp=" + $.ojc.notificationTimeStamp;
					else
						s.data = jQuery.extend(true, s.data, cnts);
				}
			}
			if (_ajax)
				_ajax(s);
		}
	});

	/* classe 'ojc.i18n' : constructeur */
	$.ojc.i18n = function(resourceSet) {
		//var resourceSet = resourceSet;
		var getString = function(resourceKey, rSet) {
			if (resourceKey == null) return null;
			if (rSet == null) rSet = resourceSet;
			var i = resourceKey.indexOf(':');
			if (i < 0)
				return $.ojc.getString(rSet, resourceKey);
			var s = resourceKey.substr(0, i);
			resourceKey = resourceKey.substr(i + 1, resourceKey.length);
			if (s.length < 1) s = 'global';
			if (resourceKey.length < 1) resourceKey = ':'; // séparateur de champs
			return $.ojc.getString(s, resourceKey);
		};
		this.translate = function(formatString) {
			if (!formatString) return formatString;
			var result = formatString;
			var i = result.indexOf('<script'), tail = '';
			if (i == 0) return result;
			if (i > 0) {
				tail = result.substr(i, formatString.length);
				result = result.substr(0, i);
			}

			splitted = result.split('``');

			result = splitted[0];
			if (result.length > 0) {
				result = result.replace(/`\(([^\)]+)\)/g, function(m, i) { return getString(i); });
				result = result.replace(/`(\w+)/g, function(m, i) { return getString(i); });
				result = result.replace(/`([:])/g, function(m, i) { return getString(i); });
			}
			for (s=1 ; s < splitted.length - 1 ; s += 2) {
				rSet = splitted[s]; text = splitted[s+1];
				text = text.replace(/`\(([^\)]+)\)/g, function(m, i) { return getString(i, rSet); });
				text = text.replace(/`(\w+)/g, function(m, i) { return getString(i, rSet); });
				text = text.replace(/`([:])/g, function(m, i) { return getString(i, rSet); });
				result += text;
			}
			return result + tail;
		};
		this.setResourceSet = function(rSet) {
			resourceSet = rSet;
		};
		this.getString = getString;
	};


	/* package $.ojc.string */
	$.ojc.string = {};
	$.ojc.string.format2 = function(f, args) {
		var success = true;
		var result = f.replace(/\{(\d+)\}/g, function(m, i) {
			if (args !== null && i < args.length && typeof (args[i]) !== 'undefined'/* && args[i].length > 0*/)
				return args[i];
			success = false;
			return '';
		});
		return success ? result : '';
	};
	$.ojc.string.format = function(f) {
		var args = $.makeArray(arguments).slice(1);
		return $.ojc.string.format2(f, args);
	};

	$.ojc.ui.fileBrowser = function(field_name, url, type, win) {
		var cmsURL = 'Files/Selector?popup=1'; //tinyMCE.FileBrowserUrl;    // script URL - use an absolute path!
		if (cmsURL.indexOf("?") < 0) {
			//add the type as the only query parameter
			cmsURL = cmsURL + "?type=" + type;
		}
		else {
			//add the type as an additional query parameter
			// (PHP session ID is now included if there is one at all)
			cmsURL = cmsURL + "&type=" + type;
		}

		tinyMCE.activeEditor.windowManager.open({
			file: cmsURL,
			title: $.ojc.globalResourceSet.getString("fileBrowser"),
			width: 420,  // Your dimensions may differ - toy around with them!
			height: 400,
			resizable: "yes",
			inline: "yes",  // This parameter only has an effect if you use the inlinepopups plugin!
			close_previous: "no"
		}, {
			window: win,
			input: field_name
		});
		return false;
	}

	$.ojc.ui.initTinyMCE = function(fields) {
		/* Activation tinyMCE */
		if (!tinyMCE || !tinyMCE.init) return; // TinyMCE non chargé
		fields = fields || [];
		tinyMCE.init({
			mode: 'exact',
			elements: fields.join(),
			theme: 'advanced',
			plugins: 'safari,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template',	//,imagemanager,filemanager
			// Theme options 
			theme_advanced_buttons1: 'bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,formatselect,fontselect,fontsizeselect',
			theme_advanced_buttons2: 'cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor',
			theme_advanced_buttons3: 'tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,fullscreen',
			theme_advanced_buttons4: 'insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del,ins,|,visualchars,nonbreaking,template,blockquote,pagebreak,|,insertfile,insertimage',
			theme_advanced_toolbar_location: 'top',
			theme_advanced_toolbar_align: 'left',
			theme_advanced_statusbar_location: 'bottom',
			theme_advanced_resizing: false,
			remove_script_host: false,
			relative_urls: false,
			file_browser_callback: '$.ojc.ui.fileBrowser'
		});

		tinymce.PluginManager.load('inlinepopups', 'plugins/inlinepopups/editor_plugin' + tinymce.suffix + '.js');
		tinymce.DOM.loadCSS('Scripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css');
		// Init when que is loaded
		tinymce.ScriptLoader.loadQueue(function() {});
	}

	$.ojc.ui.initTinyMCE();

	$.ojc.ui.activateRichTextEditor = function(fields) {
		if (!tinyMCE || !tinyMCE.init) return; // TinyMCE non chargé
		//$.ojc.ui.initTinyMCE(fields);
		for (var i = 0; i < fields.length; i++)
			tinyMCE.execCommand('mceToggleEditor', false, fields[i]);
	}

	/* class 'ojc.ui.Toolbar' */
	$.ojc.ui.Toolbar = function(p) {
		p = $.extend(true, {
			layout: 'horizontal'
		}, p || {});

		var ts = this, toolbar, row;

		/* Public */
		this.addButton = function(button) {
			$('td#' + button.name, toolbar).remove(); 	// supprime d'éventuels boutons possédant déjà le même nom
			var title = typeof (button.title) == 'undefined' ? '' : (' title="' + button.title + '"'),
					style = 'ui-pg-button ui-icon ' + button.style;
			var btn = $('<td id="' + button.name + '"' + title + '><div class="' + style + '" /></td>');
			if (button.disabled || typeof (button.action) === 'undefined')
				btn.addClass('ui-state-disabled');
			if (button.hidden)
				btn.hide();
			row.append(btn);
			if (p.layout === 'vertical') {
				row = $("<tr></tr>");
				toolbar.append(row);
			}
			if (typeof (button.action) !== 'undefined')
				btn.click(function(e) {
					if (!$(this).hasClass('ui-state-disabled') && button.action)
						button.action.apply(this);
					return false;
				});
			btn.hover(function(e) {
				if ($(this).hasClass('ui-state-disabled')) {
					this.style.cursor = 'default';
				} else {
					$(this).addClass('ui-state-hover');
					this.style.cursor = 'pointer';
				}
			}, function(e) {
				if ($(this).hasClass('ui-state-disabled')) {
				} else {
					$(this).removeClass('ui-state-hover');
					this.style.cursor = "default";
				}
			});
		}
		this.addButtons = function(buttons) {
			for (var i = 0; i < buttons.length; i++)
				ts.addButton(buttons[i]);
			return this;
		}
		this.hideButtons = function(buttons) {
			if (!toolbar) return this;
			$(buttons, toolbar).hide()
			return this;
		}
		this.showButtons = function(buttons) {
			if (!toolbar) return this;
			$(buttons, toolbar).show()
			return this;
		}
		this.disableButtons = function(buttons) {
			if (!toolbar) return this;
			$(buttons, toolbar).addClass('ui-state-disabled');
			return this;
		}
		this.enableButtons = function(buttons) {
			if (!toolbar) return this;
			$(buttons, toolbar).removeClass('ui-state-disabled');
			return this;
		}
		this.init = function(element) {
			toolbar = $("<table></table>").appendTo(element.addClass('toolbar'));
			row = $("<tr></tr>");
			toolbar.append(row);
			return this;
		};
	}

	/* classe 'ojc.ui.Control' */
	$.ojc.ui.Control = function() {
		var _i18n = $.ojc.globalResourceSet;
		var loading = false;
		var ts = this;
		var wMgr = null;
		var loadInternal = null;
		this.hasFocus = false;

		// lazy loading parameters
		this.isVisible = false;

		this.setResourceSet = function(rs) { _i18n = new $.ojc.i18n(rs); }
		this.getString = function(resourceKey) { return _i18n.getString(resourceKey) };
		this.translate = function(formatString) { return _i18n.translate(formatString) };
		this.loading = loading;
		this.element = false;

		this.setVisible = function(b) {
			if (b === false)
				this.isVisible = false;
			else {
				if (this.isVisible) return;
				this.isVisible = true;
				if (this.onShow)
					this.onShow();
			}
		}

		this.getWindowManager = function() {
			if (!wMgr) {
				var parentWindow = (!window.frameElement&&window.dialogArguments)||parent||top;
				if (parentWindow && parentWindow.tinymce && parentWindow.tinymce.EditorManager.activeEditor)
					wMgr = parentWindow.tinymce.EditorManager.activeEditor.windowManager;
				else {
					wMgr = tinymce.InlineWindowManager
					? new tinymce.InlineWindowManager({
						getLang: function (t) { return t; },
						settings: {
							dialog_type: 'modal'
						},
						getContainer: function() { return ts.element; },
						getParam: function(n, dv) { return this.settings[n] ? this.settings[n] : dv; },
						focus: function() {},
						selection: { getBookmark: function() { return null; } }
					})
					: new tinymce.WindowManager({
						getLang: function (t) { return t; },
						settings: {
							dialog_type: 'modal'
						}
					});
				}
				wMgr.currentlyOpenedWindows = {};
				var currentClose = wMgr.close;
				wMgr.close = function(win, id) {
					if (wMgr.currentlyOpenedWindows[id] && wMgr.currentlyOpenedWindows[id].onClosing)
						wMgr.currentlyOpenedWindows[id].onClosing();
					currentClose.call(wMgr, win, id);
					if (wMgr.currentlyOpenedWindows[id] && wMgr.currentlyOpenedWindows[id].onClosed)
						wMgr.currentlyOpenedWindows[id].onClosed();
				};
			}
			return wMgr;
		}

		this.popup = function (p, ajaxOptions) {
			p = $.extend(true, { 
				width : 480, 
				height : 385
			},
				p || {});

			p.inline = 1;
			wMgr = ts.getWindowManager();
			var url = p.url;
			if (!p.iframe)
				p.url = 'javascript:""';
			var w = wMgr.open(p);
			if (w) {
				var content = $('#' + w.id + '_content');
				var ifr = $('#' + w.id + '_ifr', content);
				if (!p.iframe) {
					var ifrHeight = ifr.height(), ifrWidth = ifr.width();
					ifr.replaceWith('<div class="ojcPopupContent" id="' + w.id + '_ifr"></div>');
					ifr = $('#' + w.id + '_ifr', content);
					ifr.height(ifrHeight);
					ifr.width(ifrWidth);
					ifr.loadAndTranslate(url, _i18n, ajaxOptions, function() {
						if (p.save) {
							ifr.wrapInner('<form></form>');
							var form = $('form:first', ifr);
							form.append('<div class="mceActionPanel ojcActionPanel">\
							<input type="button" id="btnSave" name="save" />\
							<input type="button" id="btnCancel" name="cancel" />\
							</div>');
							$('#btnSave', form)
								.attr('value', ts.getString('save'))
								.click(function() {p.save();});
							$('#btnCancel', form)
								.attr('value', ts.getString('cancel'))
								.click(function() {wMgr.close(null, w.id);});
							form.bind('submit', p.save);
						}
					});
				}
				if (p.save && p.iframe) {		// TODO : gérer un formulaire chargé dans un iframe
//					addButtonsToPopup(w, content);
					var actionPanelHeight = $('div.mceActionPanel', content).height() + 20;
					ifr.height(ifr.height() - actionPanelHeight);
					w.deltaHeight += actionPanelHeight;
				}
				wMgr.currentlyOpenedWindows[w.id] = { id: w.id, content: content, 
					close: function() {
						wMgr.close(null, w.id) 
					},
					onClosing: function() {
						$('span.mceEditor', content).each(function() {
							// Find instance by id and remove it
							tinyMCE.get(this.id.replace(/_parent$/, '')).remove();
						});
						if (p.onClosing)
							p.onClosing();
					},
					onClosed: p.onClosed
				};
				return wMgr.currentlyOpenedWindows[w.id];
			}
		}

		this.initControl = function(o, p) {
			this.element = o;
			if (typeof (p.notificationHandlers) !== 'undefined')
				for (var i in p.notificationHandlers) {
					$.ojc.registerHandler({ notification:i, object: $.ojc.ui[o.id], method: p.notificationHandlers[i] });
				}

			if (typeof (p.sectionSets) !== 'undefined')
				$(o).bind('onFocus', function() {
					$.ojc.showSectionSets(p.sectionSets);
				});
			var onFocus = $.ojc.parseScript(p.onFocus),
			onBlur = $.ojc.parseScript(p.onBlur);
			if (onFocus)
				$(o).bind('onFocus', function() { onFocus.apply(this.control); });
			if (onBlur)
				$(o).bind('onBlur', function() { onBlur.apply(this.control); });
			return $(o).addClass('ojcControl');
		};
	};


	$.ojc.globalResourceSet = new $.ojc.i18n('global');


	$(document).click(function(e) { $.ojc.setFocus(e.target); });

	/* disableTextSelect : http://chris-barr.com/entry/disable_text_selection_with_jquery/ */
	$.extend($.fn.disableTextSelect = function() {
		return this.each(function() {
			if ($.browser.mozilla) {//Firefox
				$(this).css('MozUserSelect', 'none');
			} else if ($.browser.msie) {//IE
				$(this).bind('selectstart', function() { return false; });
			} else {//Opera, etc.
				$(this).mousedown(function() { return false; });
			}
		});
	});

	$.fn.loadAndTranslate = function(url, i18n, ajaxOptions, callback) {
		var self = this;
		// unload all TinyMCE editors
		$('span.mceEditor', self).each(function() {
			// Find instance by id and remove it
			tinyMCE.get(this.id.replace(/_parent$/, '')).remove();
		});
		ajaxOptions = $.extend(true, { 
			type: 'GET'
		},
			ajaxOptions || {});
		ajaxOptions.url = url;
		if (!callback && ajaxOptions.complete)
			callback = ajaxOptions.complete;
		if (i18n && typeof i18n == 'string') 
			i18n = new $.ojc.i18n(i18n);

		ajaxOptions.complete = function(response, status, xhr) {
			if ( status == 'success' || status == 'notmodified' ) {
				var content = null;
				if (i18n && i18n.translate)
					content = i18n.translate(response.responseText);
				else {
					var containingControl = self.closest('.ojcControl');
					if (containingControl.length > 0 && containingControl[0].control)
						content = containingControl[0].control.translate(response.responseText);
				}
				if (content == null)
					content = response.responseText;
				// unload all TinyMCE editors
				$('span.mceEditor', self).each(function() {
					// Find instance by id and remove it
					tinyMCE.get(this.id.replace(/_parent$/, '')).remove();
				});
				self.html(content);
				var richTextFields = [];
				$('input[type="text"][name$="Date"]', self).datepicker().attr('size', 8);
				$('textarea[name$="Text"]', self).each(function() {
					richTextFields.push(this.id);
				});
				if (richTextFields.length > 0)
					$.ojc.addScript(function() { $.ojc.ui.activateRichTextEditor(richTextFields) });
			}
			if (callback)
				self.each( callback, [response, status, xhr] );
		}
		return $.ajax(ajaxOptions);
	};

	$(document).ajaxStart(function() {
		$('#loading').show();
	}).ajaxStop(function() {
		$('#loading').hide();
		$.ojc.loading(false);
		$.ojc.runScripts();
	});

	// http: //forum.jquery.com/topic/jquery-post-1-4-1-is-appending-to-vars-when-posting-from-array-within-array
	jQuery.ajaxSettings.traditional = true;

})(jQuery);



