var inline_editing = (function() { /********************************************************************************************/ /* Global vars */ var prevElement = false; var actionMarkerVisible = true; var actionMarkerArray; var rememberBackgroundColor; var rememberZoom; var editMarkerDefinitions; var parentWindow = parent; /********************************************************************************************/ /* Global Functions */ var findInfoFromClassName = function(element, regexp) { var info; var matches = (jQuery(element).attr("class") || "").match(regexp); if (matches && matches.length > 1) { return matches[1]; } }; /****************************************/ /* Hilfsfunktionen für die Hervorhebung */ var stashStyle = function(element) { var nps_style_stash = {}; jQuery.each(['backgroundColor', 'zoom', 'color'], function(i, property) { nps_style_stash[property] = element.css(property); }); element.data('nps_style_stash', nps_style_stash); }; var highlight = function(element) { // setting the zoom works around incomplete redraws on ie6 element.css({ backgroundColor: '#ffffaa', zoom: 1, color: '#000000' }); }; var unstashStyle = function(element) { if (element.data('nps_style_stash')) { element.css(element.data('nps_style_stash')); element.removeData('nps_style_stash'); } }; /********************************************************************************************/ /* Marker Definitions */ /********************************************************************************************/ /* Marker Permission Checking */ var that = { setParentWindow: function(new_parent) { parentWindow = new_parent; }, attachMarkerMenu: function(marker_menu_target){ var id = findInfoFromClassName(marker_menu_target, /nps_marker_menu_target_([0-9]+)/); var marker_menu = jQuery("#nps_marker_menu_"+id); if (marker_menu.length) { var definition = that.findMarkerDefinitionForElement(marker_menu); var target_pos = marker_menu_target.offset(); var parent_pos = marker_menu.offsetParent().offset(); marker_menu.css({ position: 'absolute', left: target_pos.left + definition.offset_left - parent_pos.left, top: target_pos.top + definition.offset_top - parent_pos.top }); jQuery(marker_menu).unbind('mouseenter'); jQuery(marker_menu).mouseenter(function(){ stashStyle(marker_menu_target); highlight(marker_menu_target); }); jQuery(marker_menu).unbind('mouseleave'); jQuery(marker_menu).mouseleave(function(){ unstashStyle(marker_menu_target); }); } }, initMarkerMenus: function() { var visible = false; jQuery('.nps_marker_menu_button').click(function() { if (visible) { jQuery(this).next().slideUp(200); visible = false; } else { jQuery(this).next().slideDown(200); visible = true; } return false; }); }, attachMarkerMenus: function() { jQuery('.nps_marker_menu_target').each(function() { that.attachMarkerMenu(jQuery(this)); }); }, initActionMarker: function() { jQuery('.nps_action_marker').each(function(ignore, marker_element) { if (!that.hasRequiredPermissionsForMarkerElement(marker_element)) { jQuery(marker_element).hide(); } }); }, bindEditMarkerEvents: function(marker, target){ marker.unbind(); marker.mouseenter(function() { target.find("*").each(function() { stashStyle(jQuery(this)); }); target.find("*").each(function() { highlight(jQuery(this)); }); stashStyle(target); highlight(target); }); marker.mouseleave(function() { target.find("*").each(function() { unstashStyle(jQuery(this)); }); unstashStyle(target); }); marker.click(function() { return that.startEditing(this); }); }, initEditMarker: function() { // add functions and behaviour to all edit marker elements jQuery(".nps_edit_marker").each(function(i, marker) { marker = jQuery(marker); if (that.hasRequiredPermissionsForMarkerElement(marker)) { var id = findInfoFromClassName(marker, /nps_marker_id_([0-9]+)/); var target = jQuery("#nps_marker_id_" + id); if (target.length) { var pos = target.offset(); var parent_pos = marker.offsetParent().offset(); that.bindEditMarkerEvents(marker, target); marker.css({ left: pos.left - parent_pos.left, top: pos.top - parent_pos.top, position: "absolute", display: "inline" }); } else { marker.hide(); } } else { marker.hide(); } }); }, openEditDialog: function(obj_id, attribute, context_id, size, target) { // pass control to Fiona GUI parentWindow.openEditDialog(obj_id, attribute, context_id, size, target); }, initMarker: function() { that.initEditMarker(); that.initActionMarker(); that.initMarkerMenus(); that.attachMarkerMenus(); }, init: function() { jQuery(document).ready(that.initMarker); jQuery(window).load(that.initMarker); jQuery(window).resize(that.initMarker); }, storeMarkerDefinitions: function(definitions) { editMarkerDefinitions = editMarkerDefinitions || {}; jQuery.extend(editMarkerDefinitions, definitions); }, markerDefinition: function(id) { return editMarkerDefinitions[id]; }, findMarkerDefinitionForElement: function(element) { return that.markerDefinition(findInfoFromClassName(element, /nps_marker_id_([0-9]+)/)); }, currentUserHasGlobalPermission: function(perm) { if (parentWindow.currentUserIsMemberOf) { return parentWindow.currentUserHasGlobalPermission(perm); } else { return true; } }, currentUserIsMemberOf: function(groups) { if (parentWindow.currentUserIsMemberOf) { return parentWindow.currentUserIsMemberOf(groups); } else { return true; } }, hasRequiredPermissionsForMarkerElement: function(element) { if (that.currentUserHasGlobalPermission("permissionGlobalRoot")) { return true; } var definition = that.findMarkerDefinitionForElement(element); var member_in_group = 0; jQuery.each(definition.memberships, function() { if (that.currentUserIsMemberOf(this)) { member_in_group += 1; return true; } return false; }); return member_in_group === definition.memberships.length; }, startEditing: function(element) { var definition = that.findMarkerDefinitionForElement(element); // pass control to Fiona GUI that.openEditDialog( definition.obj_id, definition.attribute, definition.context_id, definition.size, definition.target ); return false; } }; return that; }());