/*global window, document, Constants, Element, Ajax, $, $$, tt_Enabled, MMToolTipToggle, MMToolTips, Cookie, Flow, BrowserDetect, JSON, doTip, unTip, statusBar, isset, BALLOON, FONTCOLOR, FOLLOWMOUSE, OFFSETY, OFFSETX, FADEIN, FADEOUT, ABOVE, STICKY, CLICKYSTICK, CLICKCLOSE */
var MMToolTips = function () {
	var _msgs, _loaded = false,
		_url = Constants.ajax() + "helpMessages", _urlP = Constants.ajax() + "prefsManager",
		_cookieName = "MixMatchTips_Off",
		_ajaxP = new Ajax( _urlP, { method: 'get', asynchronous: true, onFailure: function (request) { MMToolTips.error(request); } }),
//		_ajaxA = new Ajax( _url,  { method: 'get', asynchronous: true,  parameters: 'json=y&all=y', onFailure: function (request) { MMToolTips.error(request); } }),
		_ajaxO = new Ajax( _url,  { method: 'get', asynchronous: false, parameters: 'json=y', onFailure: function (request) { MMToolTips.error(request); } }),
		self = {
			enable: function () {
				tt_Enabled = true;
				MMToolTipToggle.showToggle();
			},
			disable: function () {
				tt_Enabled = false;
				MMToolTipToggle.showToggle();
			},
			status: function () { return tt_Enabled; },
			storeMsgs: function (all, request) {
				var resp = JSON.parse(request.responseText);
				if (all) {
					_msgs = request ? resp : false;
					_loaded = _msgs ? true : false;
				} else {
					if (_msgs) { Object.extend( _msgs, resp ); }
					else { _msgs = resp; }
				}
			},
			msg: function (msgID) {
				var retval = null;
				if (MMToolTips.status()) {
					if (!_msgs || !isset(typeof(_msgs[msgID]))) {
						_ajaxO.updateOptions({parameters: 'json=y&msg='+msgID, onSuccess: function (request) { MMToolTips.storeMsgs(false, request); }});
						_ajaxO.send();
					}
					retval = _msgs ? _msgs[msgID] : false;
				}
				return retval;
			},
			dip: function (elID, msgID, always) {
				var el = $(elID);
				if (el) {
					var ie6 = BrowserDetect.browser == "Explorer" && BrowserDetect.version <= 6,
						tip = function () {
							if (ie6 && self.status()) {
								statusBar.talk(MMToolTips.msg(msgID)); // IE 6 compatibility.
							} else {
								if (isset(typeof(doTip))) { if (always) { tt_Enabled = true; } doTip('<div id="tt_beacon" style="display: none;"></div><div class="tipMaxW">'+MMToolTips.msg(msgID)+'</div>', BALLOON, true, FONTCOLOR, '#333333', FOLLOWMOUSE, false, OFFSETY, 10, FADEIN, 500, FADEOUT, 500, ABOVE, true); if (always) { tt_Enabled = false; } }
								var ttb = typeof($) === 'function' ? $('tt_beacon') : false;
								if (ttb) { $$(ttb.parentNode).addClassName('arrow'); }
							}
						};
					var untip = function () {
						if (ie6) { statusBar.hide(); }
						else { unTip(); }
					};
					if ( !el.isNode('TEXTAREA') && !el.isNode('INPUT')) {
						el.setEvent('mouseover', function () { el.addClassName(MMToolTips.status() ? 'help' : 'hand'); });
						el.addEvent('mouseout', function () { el.removeClassName(MMToolTips.status() ? 'help' : 'hand'); });
					}
					el.addEvent('mouseover', tip);
					el.addEvent('mouseout', untip);
				}
			},
			showToggle: function () {
				if (self.toggled()) { MMToolTipToggle.off(); }
				else { MMToolTipToggle.on(); }
			},
			toggle: function () {
				var logged = Flow.loggedIn(), toHide = !self.toggled(), val = toHide ? "hide" : "show";
				if (toHide) {
					if (!logged) { Cookie.createCookie(_cookieName,1,30); }
					else { Cookie.eraseCookie(_cookieName); }
				} else {
					if (!logged) { Cookie.eraseCookie(_cookieName); }
				}
				// set preference
				if (logged) {
					if (!_ajaxP.tipsending) {
						statusBar.hide();
						MMToolTipToggle.top.update(toHide ? 1 : 0);
						_ajaxP.tipsending = true;
						_ajaxP.updateOptions(
							{	parameters: 'pref='+Constants.prefsTip()+'&val='+val,
								onSuccess: function (request) {
									_ajaxP.tipsending = false;
									MMToolTips.handlePref(request, toHide);
								}
							});
						_ajaxP.send();
						self.showToggle();
					}
				} else {
					MMToolTipToggle.top.update(toHide ? 1 : 0);
					self.handlePref(false, toHide);
					self.showToggle();
				}
			},
			handlePref: function (request, hide) {
				var resp = request ? JSON.parse(request.responseText) : {y:1};
				if (resp.y) { statusBar.talk('Tooltips '+(hide ? 'hidden' : 'shown')+'.'); }
				else { statusBar.error('Tooltips preference not saved successfully.'); }
				if (hide) { self.disable(); }
				else { self.enable(); }
			},
			toggled: function ()
				{ return Flow.loggedIn() ? MMToolTipToggle.prefToggled() : !Cookie.readCookie(_cookieName); },
			error: function (request) { statusBar.error("Error: "+request.responseText); }
	};
	return self;
}();

var MMToolTipToggle = function () {
	var h = 'hand', i = 'inline',
		_onImg = document.createElement("img"),
		_offImg = document.createElement("img"),
		_imgPreload = new Image(), _imgPreload2 = new Image(),
		_txt = 'help is ', _onLk = document.create("a", "tt_onlink", h, "on"),
		_offLk = document.create("a", "tt_offlink", h, "off");
	_imgPreload.src = Constants.images()+"tips_on.gif";
	_imgPreload2.src = Constants.images()+"tips_off.gif";
	_onImg.id = "toolTipOn";
	_onImg.src = _imgPreload.src;
	_onImg.height = _offImg.height = 22;
	_onImg.width = _offImg.width = 22;
	_offImg.id = "toolTipOff";
	_offImg.src = _imgPreload2.src;
	_onLk.hide();
	_offLk.hide();

	var self = {
		setup: function () {
			self.tog = $("toolTipToggle");
			self.tot = $("toolTipText");
			self.top = $("toolTipPref");
			if (self.tog) {
				self.tog.addClassName(h);
				self.tog.setClick(MMToolTips.toggle);
			}
			if (self.tot) {
				self.tot.addClassName(h);
				self.tot.update(_txt);
				self.tot.appendChildren([_onLk, _offLk]);
				_onLk = $(_onLk.id);
				_offLk = $(_offLk.id);
				_onLk.setClick(MMToolTips.toggle);
				_offLk.setClick(MMToolTips.toggle);
			}
			self.showToggle();
		},
		showToggle: function () {
			if (MMToolTips.toggled()) { self.off(); }
			else { self.on(); }
		},
		on: function () {
			if (self.tog) {
				_offLk.hide();
				self.hide();
				self.tog.appendChild(_onImg);
				_onLk.show(i);
			}
		},
		off: function () {
			if (self.tog) {
				_onLk.hide();
				self.hide();
				self.tog.appendChild(_offImg);
				_offLk.show(i);
			}
		},
		hide: function () { if (self.tog) { self.tog.empty(); } },
		prefToggled: function () { return self.top.scan(true) == 1; }
	};
	return self;
}();

window.addLoad(MMToolTipToggle.setup);
window.addLoad(function () { if (MMToolTips.toggled()) { MMToolTips.disable(); } });
