commit 0d6571352b4a52e72c522310281140ee16d9e5ae
Author: Pavel Fidranský <fidransky@outlook.com>
Date:   Sat Aug 18 19:01:18 2018 +0200

    dropped old CoCAEx frontend code

diff --git a/sources/WebContent/old/images/3D9140.png b/sources/WebContent/old/images/3D9140.png
deleted file mode 100644
index 5dcaa6d..0000000
Binary files a/sources/WebContent/old/images/3D9140.png and /dev/null differ
diff --git a/sources/WebContent/old/images/63B8FF.png b/sources/WebContent/old/images/63B8FF.png
deleted file mode 100644
index 77a307e..0000000
Binary files a/sources/WebContent/old/images/63B8FF.png and /dev/null differ
diff --git a/sources/WebContent/old/images/B23AEE.png b/sources/WebContent/old/images/B23AEE.png
deleted file mode 100644
index 00450d1..0000000
Binary files a/sources/WebContent/old/images/B23AEE.png and /dev/null differ
diff --git a/sources/WebContent/old/images/B3EE3A.png b/sources/WebContent/old/images/B3EE3A.png
deleted file mode 100644
index 8d8dbf3..0000000
Binary files a/sources/WebContent/old/images/B3EE3A.png and /dev/null differ
diff --git a/sources/WebContent/old/images/B7B7B7.png b/sources/WebContent/old/images/B7B7B7.png
deleted file mode 100644
index 7c9a7df..0000000
Binary files a/sources/WebContent/old/images/B7B7B7.png and /dev/null differ
diff --git a/sources/WebContent/old/images/DC143C.png b/sources/WebContent/old/images/DC143C.png
deleted file mode 100644
index 1a0e6ad..0000000
Binary files a/sources/WebContent/old/images/DC143C.png and /dev/null differ
diff --git a/sources/WebContent/old/images/FF8000.png b/sources/WebContent/old/images/FF8000.png
deleted file mode 100644
index 1438bcf..0000000
Binary files a/sources/WebContent/old/images/FF8000.png and /dev/null differ
diff --git a/sources/WebContent/old/images/FFD700.png b/sources/WebContent/old/images/FFD700.png
deleted file mode 100644
index 39285d2..0000000
Binary files a/sources/WebContent/old/images/FFD700.png and /dev/null differ
diff --git a/sources/WebContent/old/images/arrow_move.png b/sources/WebContent/old/images/arrow_move.png
deleted file mode 100644
index 971631d..0000000
Binary files a/sources/WebContent/old/images/arrow_move.png and /dev/null differ
diff --git a/sources/WebContent/old/images/button_cancel.png b/sources/WebContent/old/images/button_cancel.png
deleted file mode 100644
index f920375..0000000
Binary files a/sources/WebContent/old/images/button_cancel.png and /dev/null differ
diff --git a/sources/WebContent/old/images/cut.png b/sources/WebContent/old/images/cut.png
deleted file mode 100644
index f215d6f..0000000
Binary files a/sources/WebContent/old/images/cut.png and /dev/null differ
diff --git a/sources/WebContent/old/images/door.png b/sources/WebContent/old/images/door.png
deleted file mode 100644
index 369fc46..0000000
Binary files a/sources/WebContent/old/images/door.png and /dev/null differ
diff --git a/sources/WebContent/old/images/efp_qtip/ERROR.png b/sources/WebContent/old/images/efp_qtip/ERROR.png
deleted file mode 100644
index 45746c1..0000000
Binary files a/sources/WebContent/old/images/efp_qtip/ERROR.png and /dev/null differ
diff --git a/sources/WebContent/old/images/efp_qtip/OK.png b/sources/WebContent/old/images/efp_qtip/OK.png
deleted file mode 100644
index c5a98cf..0000000
Binary files a/sources/WebContent/old/images/efp_qtip/OK.png and /dev/null differ
diff --git a/sources/WebContent/old/images/efp_qtip/provided.png b/sources/WebContent/old/images/efp_qtip/provided.png
deleted file mode 100644
index 168da4e..0000000
Binary files a/sources/WebContent/old/images/efp_qtip/provided.png and /dev/null differ
diff --git a/sources/WebContent/old/images/efp_qtip/required.png b/sources/WebContent/old/images/efp_qtip/required.png
deleted file mode 100644
index 7ce6f81..0000000
Binary files a/sources/WebContent/old/images/efp_qtip/required.png and /dev/null differ
diff --git a/sources/WebContent/old/images/excludeSeparately.png b/sources/WebContent/old/images/excludeSeparately.png
deleted file mode 100644
index 19ffb2f..0000000
Binary files a/sources/WebContent/old/images/excludeSeparately.png and /dev/null differ
diff --git a/sources/WebContent/old/images/icon_back.png b/sources/WebContent/old/images/icon_back.png
deleted file mode 100644
index 94b7f6d..0000000
Binary files a/sources/WebContent/old/images/icon_back.png and /dev/null differ
diff --git a/sources/WebContent/old/images/icon_new_diagram.png b/sources/WebContent/old/images/icon_new_diagram.png
deleted file mode 100644
index e20639e..0000000
Binary files a/sources/WebContent/old/images/icon_new_diagram.png and /dev/null differ
diff --git a/sources/WebContent/old/images/icon_refresh.png b/sources/WebContent/old/images/icon_refresh.png
deleted file mode 100644
index 781a20b..0000000
Binary files a/sources/WebContent/old/images/icon_refresh.png and /dev/null differ
diff --git a/sources/WebContent/old/images/icon_refresh_reset.png b/sources/WebContent/old/images/icon_refresh_reset.png
deleted file mode 100644
index 22e2d5b..0000000
Binary files a/sources/WebContent/old/images/icon_refresh_reset.png and /dev/null differ
diff --git a/sources/WebContent/old/images/icon_refresh_reset.psd b/sources/WebContent/old/images/icon_refresh_reset.psd
deleted file mode 100644
index 9c2b9a0..0000000
Binary files a/sources/WebContent/old/images/icon_refresh_reset.psd and /dev/null differ
diff --git a/sources/WebContent/old/images/icon_save.png b/sources/WebContent/old/images/icon_save.png
deleted file mode 100644
index fc47b2a..0000000
Binary files a/sources/WebContent/old/images/icon_save.png and /dev/null differ
diff --git a/sources/WebContent/old/images/interface.svg b/sources/WebContent/old/images/interface.svg
deleted file mode 100644
index 544ec3c..0000000
--- a/sources/WebContent/old/images/interface.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
-  <g id="layer1">
-    <rect
-       width="8.483736"
-       height="8.0177965"
-       x="277.91251"
-       y="144.85161"
-       id="rect2984"
-       style="fill:#00aad4;stroke:#000000;stroke-width:0.24770834;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8.78740132" />
-    <rect
-       width="4.383657"
-       height="2.2156539"
-       x="275.53561"
-       y="146.12935"
-       id="rect2986-7-4"
-       style="fill:#00aad4;stroke:#000000;stroke-width:0.30870754;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8.78740132" />
-    <rect
-       width="4.383657"
-       height="2.2156539"
-       x="275.53561"
-       y="149.50435"
-       id="rect2986-7-4-0"
-       style="fill:#00aad4;stroke:#000000;stroke-width:0.30870754;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8.78740132" />
-  </g>
-</svg>
diff --git a/sources/WebContent/old/images/layout.png b/sources/WebContent/old/images/layout.png
deleted file mode 100644
index a32dff2..0000000
Binary files a/sources/WebContent/old/images/layout.png and /dev/null differ
diff --git a/sources/WebContent/old/images/layout_off.png b/sources/WebContent/old/images/layout_off.png
deleted file mode 100644
index d3c0336..0000000
Binary files a/sources/WebContent/old/images/layout_off.png and /dev/null differ
diff --git a/sources/WebContent/old/images/layout_on.png b/sources/WebContent/old/images/layout_on.png
deleted file mode 100644
index 4a0d1f9..0000000
Binary files a/sources/WebContent/old/images/layout_on.png and /dev/null differ
diff --git a/sources/WebContent/old/images/logo.png b/sources/WebContent/old/images/logo.png
deleted file mode 100644
index f8b2bb1..0000000
Binary files a/sources/WebContent/old/images/logo.png and /dev/null differ
diff --git a/sources/WebContent/old/images/move.png b/sources/WebContent/old/images/move.png
deleted file mode 100644
index 9955f8d..0000000
Binary files a/sources/WebContent/old/images/move.png and /dev/null differ
diff --git a/sources/WebContent/old/images/package.png b/sources/WebContent/old/images/package.png
deleted file mode 100644
index 59a58fe..0000000
Binary files a/sources/WebContent/old/images/package.png and /dev/null differ
diff --git a/sources/WebContent/old/images/page_white_copy.png b/sources/WebContent/old/images/page_white_copy.png
deleted file mode 100644
index a9f31a2..0000000
Binary files a/sources/WebContent/old/images/page_white_copy.png and /dev/null differ
diff --git a/sources/WebContent/old/images/page_white_delete.png b/sources/WebContent/old/images/page_white_delete.png
deleted file mode 100644
index af1ecaf..0000000
Binary files a/sources/WebContent/old/images/page_white_delete.png and /dev/null differ
diff --git a/sources/WebContent/old/images/page_white_edit.png b/sources/WebContent/old/images/page_white_edit.png
deleted file mode 100644
index b93e776..0000000
Binary files a/sources/WebContent/old/images/page_white_edit.png and /dev/null differ
diff --git a/sources/WebContent/old/images/page_white_paste.png b/sources/WebContent/old/images/page_white_paste.png
deleted file mode 100644
index 5b2cbb3..0000000
Binary files a/sources/WebContent/old/images/page_white_paste.png and /dev/null differ
diff --git a/sources/WebContent/old/images/png_save.png b/sources/WebContent/old/images/png_save.png
deleted file mode 100644
index b92d72c..0000000
Binary files a/sources/WebContent/old/images/png_save.png and /dev/null differ
diff --git a/sources/WebContent/old/images/remove.png b/sources/WebContent/old/images/remove.png
deleted file mode 100644
index 450a80c..0000000
Binary files a/sources/WebContent/old/images/remove.png and /dev/null differ
diff --git a/sources/WebContent/old/images/remove2.png b/sources/WebContent/old/images/remove2.png
deleted file mode 100644
index 483c8c5..0000000
Binary files a/sources/WebContent/old/images/remove2.png and /dev/null differ
diff --git a/sources/WebContent/old/images/search.png b/sources/WebContent/old/images/search.png
deleted file mode 100644
index 47d2c7e..0000000
Binary files a/sources/WebContent/old/images/search.png and /dev/null differ
diff --git a/sources/WebContent/old/images/tochange/accept-trans.gif b/sources/WebContent/old/images/tochange/accept-trans.gif
deleted file mode 100644
index fef6e60..0000000
Binary files a/sources/WebContent/old/images/tochange/accept-trans.gif and /dev/null differ
diff --git a/sources/WebContent/old/images/tochange/crce-call-trans.gif b/sources/WebContent/old/images/tochange/crce-call-trans.gif
deleted file mode 100644
index 6373380..0000000
Binary files a/sources/WebContent/old/images/tochange/crce-call-trans.gif and /dev/null differ
diff --git a/sources/WebContent/old/images/tochange/postpone-trans.gif b/sources/WebContent/old/images/tochange/postpone-trans.gif
deleted file mode 100644
index dad561d..0000000
Binary files a/sources/WebContent/old/images/tochange/postpone-trans.gif and /dev/null differ
diff --git a/sources/WebContent/old/images/tochange/tochange-trans.gif b/sources/WebContent/old/images/tochange/tochange-trans.gif
deleted file mode 100644
index 5bd59de..0000000
Binary files a/sources/WebContent/old/images/tochange/tochange-trans.gif and /dev/null differ
diff --git a/sources/WebContent/old/images/unconnected/uncon_left.png b/sources/WebContent/old/images/unconnected/uncon_left.png
deleted file mode 100644
index fb88429..0000000
Binary files a/sources/WebContent/old/images/unconnected/uncon_left.png and /dev/null differ
diff --git a/sources/WebContent/old/images/unconnected/uncon_list.png b/sources/WebContent/old/images/unconnected/uncon_list.png
deleted file mode 100644
index 704b975..0000000
Binary files a/sources/WebContent/old/images/unconnected/uncon_list.png and /dev/null differ
diff --git a/sources/WebContent/old/images/unconnected/uncon_right.png b/sources/WebContent/old/images/unconnected/uncon_right.png
deleted file mode 100644
index e680095..0000000
Binary files a/sources/WebContent/old/images/unconnected/uncon_right.png and /dev/null differ
diff --git a/sources/WebContent/old/images/unconnected/uncon_unlist.png b/sources/WebContent/old/images/unconnected/uncon_unlist.png
deleted file mode 100644
index 9c1bc05..0000000
Binary files a/sources/WebContent/old/images/unconnected/uncon_unlist.png and /dev/null differ
diff --git a/sources/WebContent/old/images/zoom_help.png b/sources/WebContent/old/images/zoom_help.png
deleted file mode 100644
index 78ad2db..0000000
Binary files a/sources/WebContent/old/images/zoom_help.png and /dev/null differ
diff --git a/sources/WebContent/old/images/zoom_in.png b/sources/WebContent/old/images/zoom_in.png
deleted file mode 100644
index 922c8ef..0000000
Binary files a/sources/WebContent/old/images/zoom_in.png and /dev/null differ
diff --git a/sources/WebContent/old/images/zoom_in_disabled.png b/sources/WebContent/old/images/zoom_in_disabled.png
deleted file mode 100644
index 4a9a114..0000000
Binary files a/sources/WebContent/old/images/zoom_in_disabled.png and /dev/null differ
diff --git a/sources/WebContent/old/images/zoom_out.png b/sources/WebContent/old/images/zoom_out.png
deleted file mode 100644
index afca302..0000000
Binary files a/sources/WebContent/old/images/zoom_out.png and /dev/null differ
diff --git a/sources/WebContent/old/images/zoom_out_disabled.png b/sources/WebContent/old/images/zoom_out_disabled.png
deleted file mode 100644
index 00a54d0..0000000
Binary files a/sources/WebContent/old/images/zoom_out_disabled.png and /dev/null differ
diff --git a/sources/WebContent/old/index.jsp b/sources/WebContent/old/index.jsp
deleted file mode 100644
index 0b5b19e..0000000
--- a/sources/WebContent/old/index.jsp
+++ /dev/null
@@ -1,325 +0,0 @@
-<%@page import="cz.zcu.kiv.offscreen.graph.efp.EfpGraphicSettings"%>
-<%--<%@page import="org.eclipse.jdt.internal.compiler.ast.ForeachStatement"%>--%>
-<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
-<%@page import="cz.zcu.kiv.comav.loaders.osgi.service.RequiredService"%>
-<%@page import="sun.reflect.ReflectionFactory.GetReflectionFactoryAction"%>
-<%@page contentType="text/html" pageEncoding="UTF-8"%>
-<%@page import="java.util.Map"%>
-<%@page import="com.google.gson.Gson"%>
-<%@page import="com.google.gson.GsonBuilder"%>
-
-<!DOCTYPE html>
-<html>
-	<head>
-		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-
-		<link rel="stylesheet" href="styles/libs/jquery-ui/smoothness/jquery-ui-1.10.3.custom.css" media="screen">
-		<link rel="stylesheet" href="styles/libs/jquery.contextMenu.css" media="screen">
-		<link rel="stylesheet" href="styles/libs/jquery.qtip.css" media="screen">
-		<link rel="stylesheet" href="styles/basic.css" media="screen">
-		<link rel="stylesheet" href="styles/tooltip.css" media="screen">
-		<link rel="stylesheet" href="styles/tree.css" media="screen">
-		<link rel="stylesheet" href="styles/dialog.css" media="screen">
-
-		<script src="js/libs/jquery-1.8.3.js"></script>
-		<script src="js/libs/jquery-ui-1.10.3.custom.js"></script>
-		<script src="js/libs/jquery.contextMenu.js"></script>
-		<script src="js/libs/jquery.qtip.js"></script>
-		<script src="js/libs/jquery.jstree.js"></script>
-		<script src="js/libs/saveSvgAsPng.js"></script>
-		<script src="js/libs/spin.js"></script>
-
-		<script src="js/app.js"></script>
-		<script src="js/util.js"></script>
-		<script src="js/svgFactory.js"></script>
-		<script src="js/graphManager.js"></script>
-		<script src="js/hash.js"></script>
-		<script src="js/mark.js"></script>
-		<script src="js/markSymbol.js"></script>
-		<script src="js/gridMark.js"></script>
-		<script src="js/group.js"></script>
-		<script src="js/groupManager.js"></script>
-		<script src="js/offScreenKiv.js"></script>
-		<script src="js/zoom.js"></script>
-		<script src="js/efps.js"></script>
-		<script src="js/viewportManager.js"></script>
-		<script src="js/dialog.js"></script>
-		<script src="js/tooltips.js"></script>
-		<script src="js/loader.js"></script>
-		<script src="js/diagram.js"></script>
-		<script src="js/user.js"></script>
-
-		<title>Visualization of large component diagrams</title>
-	</head>
-
-	<body>
-		<%
-		//String path = request.getContextPath();
-		String getProtocol=request.getScheme();
-		String getDomain=request.getServerName();
-		String getPort=Integer.toString(request.getServerPort());
-		String getPath = getProtocol+"://"+getDomain+":"+getPort+"/";
-		String getURI=request.getRequestURI();
-
-		// set graphic settings for EFP graph
-		ServletContext context = this.getServletContext();
-		EfpGraphicSettings efpSettings = new EfpGraphicSettings();
-
-		efpSettings.setMinInterfaceDiameter(Integer.valueOf(context.getInitParameter("minInterfaceDiameter")));
-		efpSettings.setMaxInterfaceDiameter(Integer.valueOf(context.getInitParameter("maxInterfaceDiameter")));
-
-		// JSONize graph settings
-		GsonBuilder gsonBuilder = new GsonBuilder();
-		Gson gson = gsonBuilder.create();
-
-		String efpSettingsJson = gson.toJson(efpSettings);
-
-		// logged-in user
-		boolean logged_user = false;
-		boolean diagram_id_hash_set = false;
-		if (request.getSession().getAttribute("logged_user") == "1"){
-			logged_user = true;
-		}
-
-		if (request.getParameter("diagram_id")!= null && request.getParameter("diagram_hash") != null) {
-			diagram_id_hash_set = true;
-		}
-
-		String diagram_url = "";
-		boolean show_icon_save = false;
-		if (logged_user && diagram_id_hash_set) {
-			diagram_url = "?diagram_id="+ request.getParameter("diagram_id")+"&diagram_hash=" + request.getParameter("diagram_hash");
-			show_icon_save = true;
-		}
-
-		boolean is_efp_diagram = false;
-		if (request.getAttribute("efpPortalRefererUrl") != null) {
-			is_efp_diagram = true;
-		}
-		%>
-
-		<div class="loader" id="loader">
-			<div class="loader-content" id="spinLoader">
-				<p>Loading graph...</p>
-			</div>
-		</div>
-
-		<div class="dialog" id="dialog" title="Group rename">
-			<p>Enter new group name:</p>
-
-			<input type="text" name="name" id="groupNameTextarea" />
-			<br>
-
-			<button type="button" name="button" id="clearNameButton" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="Clear">
-				<span class="ui-button-text">Clear</span>
-			</button>
-		</div>
-
-		<div class="wrapper" id="envelope">
-			<header class="header" id="header">
-				<img src="images/logo.png" class="header-logo" alt="logo of University of West Bohemia" title="University of West Bohemia">
-
-				<h2 class="header-title color-blue">Visualization of large component diagrams </h2>
-
-				<% if (!is_efp_diagram) { %>
-					<jsp:include page="logged_user.jsp" />
-				<% } %>
-			</header>
-
-			<nav class="navbar" id="navigation">
-				<ul>
-					<li>
-						<button class="btn zoom" id="zoomOut" title="zoom-"><img src="images/zoom_out.png" alt="zoom-"/></button>
-						<span class="zoom-value" id="zoomValue">100%</span>
-						<button class="btn zoom" id="zoomIn" title="zoom+"><img src="images/zoom_in.png" alt="zoom+"/></button>
-					</li>
-
-					<li><hr class="navbar-separator"></li>
-					<li>
-						<input class="search-text" id="searchText" type="text" value="Search components..."/>
-						<button class="btn search" id="search"><img src="images/search.png" title="search" alt="search"></button>
-						<span class="search-count" id="countOfFinded" title="Count of components found">0</span>
-					</li>
-
-					<li><hr class="navbar-separator"></li>
-					<li>
-						<form>
-							<input type="radio" name="actionMove" value="move" id="move" checked><label for="move">move<img class="navbar-image" src="images/move.png" alt="move"></label>
-							<input type="radio" name="actionMove" value="exclude" id="remove"><label for="remove">exclude<img class="navbar-image" src="images/remove2.png" alt="remove"></label>
-						</form>
-					</li>
-
-					<li><hr class="navbar-separator"></li>
-					<li><button id="mostEdge" class="btn exclude-separately" title="Exclude components with the most count of edges separately."><img src="images/excludeSeparately.png" alt="excludeSeparately"/></button></li>
-
-					<li><hr class="navbar-separator"></li>
-					<li><button id="vertexToGroup" class="btn exclude-to-group" title="Exclude components with the most count of edges to group."><img src="images/package.png" alt="Exclude components to group"/></button></li>
-
-					<li><hr class="navbar-separator"></li>
-					<li>
-						<% if (!is_efp_diagram) { %>
-							<a href="<%=getServletContext().getInitParameter("HOME_URL")%><%= diagram_url %>" class="btn btn-block back-to-upload" id="view_back_to_upload" title="Back to upload"></a>
-						<% } else { %>
-							<a href="<%=request.getAttribute("efpPortalRefererUrl")%>" class="btn btn-block back-to-upload" id="view_back_to_upload" title="Back"></a>
-						<% } %>
-					</li>
-
-					<li><hr class="navbar-separator"></li>
-					<li>
-						<button class="btn" id="applyLayout" title="Apply layout to current graph.">
-							<img src="images/layout_off.png" id="applyLayoutImg" alt="Apply layout to current graph.">
-						</button>
-					</li>
-
-					<%
-					if (request.getAttribute("efpPortalEfpNames") != null) {
-						final Map<String, String> efpMappings = (Map<String, String>)request.getAttribute("efpPortalEfpNames");
-						if (!efpMappings.isEmpty()) {
-					%>
-					<li><hr class="navbar-separator"></li>
-					<li>
-						<select name="EFPselector" class="EFP-selector" id="EFPselector">
-							<option value="" selected="selected" class="option_default">none</option>
-							<% for (Map.Entry<String, String> entry : efpMappings.entrySet()) { %>
-								<option value="<%=entry.getValue()%>"><%=entry.getValue()%></option>
-							<% } %>
-						</select>
-					</li>
-					<%
-						}
-					}
-					%>
-
-					<% if (show_icon_save) { %>
-						<li><hr class="navbar-separator"></li>
-						<li><a href="#" class="btn btn-block view-save-diagram" id="view_save_diagram" onClick="saveDiagram(<%=request.getParameter("diagram_id")%>); return false;" title="Save diagram"></a></li>
-
-						<li><hr class="navbar-separator"></li>
-						<li><a href="<%=getServletContext().getInitParameter("HOME_URL")%>ShowGraph?diagram_id=<%=request.getParameter("diagram_id")%>&diagram_hash=<%=request.getParameter("diagram_hash")%>" class="btn btn-block view-refresh-diagram" id="view_refresh_diagram" title="Refresh diagram"></a></li>
-
-						<li><hr class="navbar-separator"></li>
-						<li><a href="<%=getServletContext().getInitParameter("HOME_URL")%>ShowGraph?diagram_id=<%=request.getParameter("diagram_id")%>&diagram_hash=<%=request.getParameter("diagram_hash")%>" class="btn btn-block view-refresh-reset-diagram" id="view_refresh_reset_diagram" onclick="return reset_diagram(<%=request.getParameter("diagram_id")%>,'<%=request.getParameter("diagram_hash")%>');" title="Refresh diagram - reset position"></a></li>
-					<% } %>
-
-					<li><hr class="navbar-separator"></li>
-					<li>
-						<button class="btn save-diagram" id="btnSaveDiagram" title="Save diagram as PNG." onclick="saveSvgAsPng(document.getElementById('svg1'), 'diagram.png', {scale: 1})">
-							<img src="images/png_save.png" id="applyLayoutImg" alt="Save diagram as PNG.">
-						</button>
-					</li>
-				</ul>
-			</nav>
-
-			<div class="content" id="content" >
-				<div class="viewport" id="viewport" contextmenu="contextMenu">
-					<img src="./images/zoom_help.png" class="zoom-help" id="zoom_help">
-
-					<ul class="contextMenu" id="myMenu"></ul>
-
-					<svg id="svg1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-						<g class="graph" id="graph" transform="scale(1)">
-							<g class="edges" id="edges"></g>
-							<g class="vertices" id="vertices"></g>
-						</g>
-					</svg>
-				</div>
-
-				<div class="sidebar" id="rightPanel">
-					<div class="sidebar-navbar" id="uploadMenu">
-						<a class="button buttonClassic" id="postponed">Postponed</a>
-						<a class="button buttonClassic" id="toChange">To Change</a>
-						<a class="button buttonClassic" id="unconnected">Unconnected</a>
-						<a class="button buttonClassic" id="incompatible" style="display: none;">Incompatible</a>
-					</div>
-
-					<div class="components-count" id="allComps"></div>
-
-					<div class="components-box postponed-components" id="postponedComps">
-						<h5>Postponed components</h5>
-					</div>
-
-					<div class="components-box to-change-components" id="toChangeComps">
-						<h5>To Change components</h5>
-						<button type="button" id="proposeChanges">
-							<img class="buttonImage" src="images/tochange/crce-call-trans.gif" alt="Propose changes" title="Propose changes">
-						</button>
-
-						<!--
-						<h5>Proposed components</h5>
-						<div class="control-buttons">
-							<div class="button buttonClassic" id="accept-proposed">
-								<img class="buttonImage" src="images/tochange/accept-trans.gif" alt="Accept" title="Accept component change">
-							</div>
-							<div class="button buttonClassic" id="reject-proposed">
-								<img class="buttonImage" src="images/button_cancel.png" alt="Reject" title="Reject component change">
-							</div>
-						</div>
-						-->
-					</div>
-
-					<div class="components-box unconnected-components" id="unconComps">
-						<h5>Unconnected components</h5>
-						<div class="control-buttons">
-							<div class="button buttonClassic" id="showUnconnected">
-								<img src="images/unconnected/uncon_left.png" alt="<-" title="Show unconnected components">
-							</div>
-							<div class="button buttonClassic" id="hideUnconnected">
-								<img src="images/unconnected/uncon_right.png" alt="->" title="Hide unconnected components">
-							</div>
-						</div>
-
-						<ul id="unconCmpList"></ul>
-					</div>
-
-					<div class="components-box incompatible-components" id="allIncomps">
-						<h5 class="notCompatible">Incompatible components</h5>
-
-						<ul id="incomCmpList"></ul>
-					</div>
-
-					<div class="components-box excluded-components" id="excludedComponents">
-						<h5>Excluded components</h5>
-
-						<div class="btn-group">
-							<button type="button" class="sort-button" id="sortComponents_name_asc">
-								<span class="sort-icon">▲</span> Name
-							</button>
-							<button type="button" class="sort-button" id="sortComponents_name_desc">
-								<span class="sort-icon">▼</span> Name
-							</button>
-							<button type="button" class="sort-button" id="sortComponents_count_asc">
-								<span class="sort-icon">▲</span> #component
-							</button>
-							<button type="button" class="sort-button" id="sortComponents_count_desc">
-								<span class="sort-icon">▼</span> #component
-							</button>
-
-							<button type="button" class="include-components-button" id="includeAllComponents">
-								<img src="images/button_cancel.png" title="Include all components to graph">
-							</button>
-						</div>
-					</div>
-				</div>
-			</div>
-		</div>
-
-		<script>
-		var app = new App;
-		app.HOME_URL = '<%=getPath%>cocaex-compatibility/';
-
-		$(document).ready(function() {
-			// set theme path for jsTree lib
-			$.jstree._themes = "styles/libs/jstree/themes/";
-
-			var loaderFn;
-			<% if (request.getAttribute("graph_json") != null) { %>
-				loaderFn = app.efpLoader(<%= request.getAttribute("graph_json") %>, <%= efpSettingsJson %>);
-			<% } else { %>
-				loaderFn = app.diagramLoader(<%= request.getParameter("diagram_id") %>, <%= request.getParameter("diagram_hash") %>);
-			<% } %>
-
-			app.run(loaderFn);
-		});
-		</script>
-	</body>
-</html>
diff --git a/sources/WebContent/old/js/app.js b/sources/WebContent/old/js/app.js
deleted file mode 100644
index ef78772..0000000
--- a/sources/WebContent/old/js/app.js
+++ /dev/null
@@ -1,259 +0,0 @@
-/**
- * Main class of the application. 
- */
-function App() {
-	this.loader = new Loader;
-
-	this.HOME_URL = null;
-
-	this.api = {
-		loadGraph: 'LoadGraphData',
-		loadDiagram: 'LoadDiagram',
-	};
-
-	/**
-	 * Loads graph using diagram (if available).
-	 * @param diagramId Diagram identifier.
-	 * @param diagramHash Diagram hash.
-	 */
-	this.diagramLoader = function(diagramId, diagramHash) {
-		return function() {
-			loadGraphData(diagramId, diagramHash, null, null);
-		};
-	};
-
-	/**
-	 * Loads graph using EFP data.
-	 * @param withEfps Is EFPs in graph?
-	 * @param efpSettings EFP settings.
-	 */
-	this.efpLoader = function(withEfps, efpSettings) {
-		return function() {
-			loadGraphData(null, null, withEfps, efpSettings);
-		};
-	};
-
-	this.run = function(startFn) {
-		console.log('running...');
-
-		bootstrap();
-		startFn();
-	};
-
-	function bootstrap() {
-		GraphManager.init();
-		ViewportManager.init();
-		OffScreenKiv.init();
-
-		// when user changes window size then set height and width #viewport and #rightPanel
-		$(window).bind('resize', setHeight);
-
-		setHeight();
-
-		// zoom
-		$('#zoomIn').click(function() {
-			ViewportManager.zoom.zoomIn();
-		});
-
-		$('#zoomOut').click(function() {
-			ViewportManager.zoom.zoomOut();
-		});
-
-		// viewport mode
-		$("input[name='actionMove']").change(function() {
-			var action = $("input[name='actionMove']:checked").val();
-			var vertex;
-
-			if (action == 'move') {
-				for (var i = 0; i < GraphManager.graph.vertices.length; i++) {
-					// remove context menu
-					ViewportManager.removeContextMenu('#vertex'+ (i+1));
-					
-					vertex = GraphManager.graph.vertices[i];
-					vertex.$selector.unbind('mousedown', OffScreenKiv.showVertexInRightPanel);
-					vertex.$selector.mousedown(ViewportManager.vertexMousedownHandler);
-				}
-
-			} else if (action == 'exclude') {
-				for (var j = 0; j < GraphManager.graph.vertices.length; j++) {
-					vertex = GraphManager.graph.vertices[j];
-					vertex.$selector.unbind('mousedown', ViewportManager.vertexMousedownHandler);
-					vertex.$selector.mousedown(OffScreenKiv.showVertexInRightPanel);
-					
-					// add context menu
-					ViewportManager.addContextMenu('#vertex'+ (j+1));
-				}
-			}
-		});
-
-		// search
-		$("#search").click(OffScreenKiv.search);
-		$("#searchText").focusin(function() {
-			if ($(this).val() == 'Search components...') {
-				$(this).val('');
-			}
-		});
-
-		$("#countOfFinded").click(OffScreenKiv.deselectHighlightSearchedVertices);
-		$("#mostEdge").click(OffScreenKiv.excludeVerticesWithMostEdges);
-		$("#vertexToGroup").click(OffScreenKiv.excludeVerticesWithMostEdgesToGroup);
-		$('#applyLayout').click(GraphManager.forceDirectedLayoutOnClick);
-
-		$('.sort-button').click(OffScreenKiv.sortComponents);
-		$('#includeAllComponents').click(OffScreenKiv.includeAllComponents);
-
-		initSearchOnEnterPressed();
-		initZoomKeys();
-		initViewportMove();
-	}
-
-	function loadGraphData(diagram_id, diagram_hash, with_efps, efp_settings) {
-		app.loader.enable();
-	
-		var load_url = app.api.loadGraph;
-		var load_diagram_url = app.api.loadDiagram;
-		
-		if (diagram_id !== null) {
-			load_url += "?diagram_id=" + diagram_id;
-			load_diagram_url += "?diagram_id=" + diagram_id;
-		}
-		
-		if (diagram_hash !== null) {
-			load_url +=  "&diagram_hash=" + diagram_hash;
-			load_diagram_url += "&diagram_hash=" + diagram_hash;
-		}
-
-		if (with_efps !== null) {
-			/* Build graph with EFPs */
-			GraphManager.isEfpGraph = true;
-	
-			// set EFP settings
-			GraphManager.efpMinIntDiameter = efp_settings.minInterfaceDiameter;
-			GraphManager.efpMaxIntDiameter = efp_settings.maxInterfaceDiameter;
-		}
-
-		// gets vertex position data
-		$.getJSON(load_diagram_url, function(data) {
-			GraphManager.vertices_position = data;
-		});
-
-		// build the graph
-		$.getJSON(load_url, function(data) {
-			GraphManager.graph = data;
-
-			GraphManager.buildGraph();
-			ViewportManager.revive();
-		});
-	}
-
-	/**
-	 * Set height of viewport and right panel.
-	 */
-	function setHeight() {
-		var headerHeight = $('#header').height() + $('#navigation').height() + 5;	/* magic 5, dunno where it comes from */
-		var contentHeight = $(window).height() - headerHeight;
-		
-		$('#viewport').height(contentHeight);
-		$('#rightPanel').height(contentHeight - 40); /* 40px is the sidebar-navbar */
-	}
-
-	/**
-	 * Set Enter as accelerator for the searching box
-	 */
-	function initSearchOnEnterPressed() {
-		$("#searchText").keydown(function(event) {
-			// react on Enter key pressed
-			if (event.which === 13) {
-				OffScreenKiv.search();
-			}
-		});
-	}
-
-	/**
-	 * Initialize zoom keys.
-	 */
-	function initZoomKeys() {
-		var scrollViewportOnZoom = function(e) {
-			e = e ? e : window.event;
-			var raw = e.detail ? e.detail : e.deltaY;
-			
-			if (event.ctrlKey === true) {
-				e.preventDefault();
-
-				if (raw > 0){
-					ViewportManager.zoom.zoomOut();
-				}
-				if (raw < 0){
-					ViewportManager.zoom.zoomIn();
-				}
-			}
-		};
-
-		$(window).keydown(function(event) {
-			if (event.ctrlKey === false) return;
-	
-			$('#zoom_help').show();
-
-			// key code 107 is the plus sign
-			if (event.which === 107) {
-				event.preventDefault();
-
-				ViewportManager.zoom.zoomIn();
-			}
-	
-			// key code 109 is the plus sign
-			if (event.which === 109) {
-				event.preventDefault();
-
-				ViewportManager.zoom.zoomOut();
-			}
-		});
-	
-		$(window).keyup(function(event) {
-			if (event.ctrlKey === false) {
-				$('#zoom_help').hide();
-			}
-		});
-
-		document.getElementById('envelope').addEventListener('wheel', scrollViewportOnZoom);
-		document.getElementById('zoom_help').addEventListener('wheel', scrollViewportOnZoom);
-	}
-
-	/**
-	 * Initialization of moving with viewport
-	 */
-	function initViewportMove() {
-		var viewport = $('#viewport'),
-			viewportX, viewportY,
-			startX, startY;
-		
-		var bindMove = function(e) {
-			if (e.button === 0) {
-				document.getElementById('envelope').addEventListener('mousemove', move);
-				
-				viewportX = viewport.scrollLeft();
-				viewportY = viewport.scrollTop();
-				
-				startX = e.screenX;
-				startY = e.screenY;
-			}
-		};
-		
-		var unbindMove = function(e) {
-			document.getElementById('envelope').removeEventListener('mousemove', move);
-		};
-		
-		var move = function(e) {
-			e.preventDefault();
-			e.stopPropagation();
-			
-			viewport.scrollLeft(viewportX + startX - e.screenX);
-			viewport.scrollTop(viewportY + startY - e.screenY);
-		};
-		
-		document.getElementById('viewport').addEventListener('mousedown', bindMove);
-		document.getElementById('envelope').addEventListener('mouseup', unbindMove);
-		document.getElementById('envelope').addEventListener('mouseleave', unbindMove);
-	}
-
-}
diff --git a/sources/WebContent/old/js/diagram.js b/sources/WebContent/old/js/diagram.js
deleted file mode 100644
index 8f1ee7c..0000000
--- a/sources/WebContent/old/js/diagram.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
-* Funkce zavola servlet, ktery odstrani diagram z databáze a ze serveru.
-*
-* @param id_diagram - id diagramu
-*/
-function deleteDiagram(id_diagram) {
-	var really = confirm('Do you really want to remove diagram?');
-	if (really === false) {
-		return false;
-	}
-
-	$.ajax({
-		url: 'api/diagram?id_diagram=' + id_diagram,
-		type: 'DELETE',
-		success: function(result) {
-			$('#diagram_id_' + id_diagram).remove();
-			$('#public_diagram_id_' + id_diagram).remove();
-		},
-	});
-}
-
-/**
-* Funkce nalezne vsechny komponenty zobrazene ve viewportu, ulozi je jako json a odesle servletu.
-* 
-* @param id_diagram ID diagramu
-*/
-function saveDiagram(id_diagram) {
-	var vertex_position = new Array(),
-		vertex_position_counter = 0;
-	
-	$('g.vertex').each(function () {
-		vertex_position[vertex_position_counter] = ' {"id":"' + $(this).attr('id') + '" , ' +
-		'  "transform":"' + $(this).attr('transform') + '" }';
-		vertex_position_counter++;
-	});
-	
-	vertex_position.join(',');
-	vertex_position = '{"vertices_position": [ ' + vertex_position + ' ]}';
-	
-	$.post('api/diagram', {
-		id_diagram: id_diagram,
-		vertices_position: vertex_position,
-	}).done(function () {
-		alert("Diagram saved.");
-	}).fail(function () {
-		alert("Error - Diagram not saved!");
-	});
-}
-
-/**
-* Funkce zobrazi vyskakovaci okno s potvrzenim
-*
-* @param id_diagram ID diagramu
-* @param diagram_hash hash diagramu
-* @returns {Boolean} true if reset confirmed
-*/
-function reset_diagram(id_diagram, diagram_hash) {
-	var really = confirm('Do you want to reset components position and refresh page?');
-	if (really === false) {
-		return false;
-	}
-
-	$.post('api/diagram', {
-		id_diagram: id_diagram,
-		vertices_position: "",
-	});
-
-	return true;
-}
\ No newline at end of file
diff --git a/sources/WebContent/old/js/dialog.js b/sources/WebContent/old/js/dialog.js
deleted file mode 100644
index da397f3..0000000
--- a/sources/WebContent/old/js/dialog.js
+++ /dev/null
@@ -1,101 +0,0 @@
-
-/**
-*
-* Group rename dialog.
-*/
-var Dialog = {
-	
-	/**
-	* Set up the dialog - settings and such.
-	*/
-	setDialog : function() {
-		
-		$("#dialog").dialog({
-			dialogClass : "no-close",
-			buttons : [ {
-				text : "OK",
-				
-				click : function(e) {
-					Dialog.saveDialogValue(this);
-				}
-			}, {
-				text : "Cancel",
-				click : function() {
-					$(this).dialog("close");
-				}
-			} ],
-			closeOnEscape : true,
-			draggable : false,
-			modal : true,
-			autoOpen : false
-		});
-		
-		// setup clearing button
-		$("#clearNameButton").click(function() { $("#groupNameTextarea").val(""); });
-		
-		// when focused
-		$("#dialog").on("dialogfocus", function(event, ui) {
-			// set Enter as dialog completion accelerator
-			$(this).keypress(function(e) {
-				if(e.which == 13) {
-					Dialog.saveDialogValue($("#dialog").dialog());
-				}
-			});
-			
-			// get the group object and set the input field value
-			var group = $("#dialog").dialog().data('group');
-			$("#groupNameTextarea").val(group.label);
-		} );
-	},
-
-	/**
-	 * Save the values in dialog textarea to the group.
-	 * 
-	 * @param callingParent parent
-	 * 
-	 * group - group object itself
-	 * groupLabel - group label element
-	 * isSvgElement - if SVG element then true, false otherwise
-	 */
-	saveDialogValue : function(callingParent) {
-		var MAX_CHARS = 15;
-		
-		var newName = $("#groupNameTextarea").val();
-		var group = $(callingParent).data('group');
-		var groupLabel = $(callingParent).data('groupLabel');
-		var isSVG = $(callingParent).data('isSvgElement');
-		
-		if (newName.replace(/ /g, '').length === 0) {
-			// default name
-			newName = 'Group';
-			} else {
-			if (newName.length > MAX_CHARS) {
-				newName = newName.substring(0, MAX_CHARS);
-				newName += "..";
-			}
-		}
-		
-		if(isSVG) {
-			var test = document.getElementById('labelTextElement' + group.idGroup);
-			test.textContent = newName;
-			}else {
-			groupLabel.html(newName);
-		}
-		
-		// set new group label
-		group.label = newName;
-		
-		// makes the label visible if newName isn't Group and adjusts position and size of the icon
-		if (newName != 'Group') {
-			$('#labelTextElement' + group.idGroup).attr('display', '');
-
-			$('#symbol' + group.idGroup).attr('class', 'group-symbol');
-			$('#symbol' + group.idGroup).attr('x', '20');
-			$('#symbol' + group.idGroup).attr('y', '11');
-		}
-
-
-
-		$(callingParent).dialog("close");
-	}
-};
\ No newline at end of file
diff --git a/sources/WebContent/old/js/efps.js b/sources/WebContent/old/js/efps.js
deleted file mode 100644
index 1031c57..0000000
--- a/sources/WebContent/old/js/efps.js
+++ /dev/null
@@ -1,305 +0,0 @@
-
-/**
-* Representation of EFP interface functionality.
-*/
-var EFPs = {
-	elementName : "#EFPselector",
-	graph : null,
-	// map {EFP name, EFP ID}
-	efpsIds : {},
-	// array [EFP ID, edge ID]
-	efpsStruct : new Array(),
-	currentEfpSeclected : null,
-	minDiameter : null,
-	maxDiameter : null,
-	// left - required - misticka
-	minEfpsValuesLeft : {},
-	maxEfpsValuesLeft : {},
-	// right - provided - lizatko
-	minEfpsValuesRight : {},
-	maxEfpsValuesRight : {},
-	
-	/**
-	* Init.
-	*
-	* @param graph
-	*/
-	init : function(graph) {
-		this.graph = graph;
-		this.minDiameter = GraphManager.efpMinIntDiameter;
-		this.maxDiameter = GraphManager.efpMaxIntDiameter;
-		
-		// min is really min
-		if (parseFloat(this.minDiameter) > parseFloat(this.maxDiameter)) {
-			var tmp = this.minDiameter;
-			this.minDiameter = this.maxDiameter;
-			this.maxDiameter = tmp;
-		}
-		
-		this.currentEfpSeclected = $(this.elementName).val();
-		this.associateEfpsToEdgeIds();
-	},
-	
-	/**
-	* Make cached association EFP;edgeID.
-	*/
-	associateEfpsToEdgeIds : function() {
-		// array of EFPs
-		var efpsCount = $(this.elementName + " option").length - 1;
-		
-		var tmp = 0;
-		
-		// hack for "this" when entering to
-		var ids = this.efpsIds;
-		var minEfpsLeft = this.minEfpsValuesLeft;
-		var maxEfpsLeft = this.maxEfpsValuesLeft;
-		var minEfpsRight = this.minEfpsValuesRight;
-		var maxEfpsRight = this.maxEfpsValuesRight;
-		
-		// fill map
-		$("#EFPselector option").each(function(e) {
-			if ($(this).val() != "") {
-				ids[$(this).val()] = tmp++;
-				
-				// init the min/max arrays
-				minEfpsLeft[$(this).val()] = Number.MAX_VALUE;
-				maxEfpsLeft[$(this).val()] = -Number.MAX_VALUE;
-				
-				minEfpsRight[$(this).val()] = Number.MAX_VALUE;
-				maxEfpsRight[$(this).val()] = -Number.MAX_VALUE;
-			}
-		});
-		
-		for ( var i = 0; i < efpsCount; i++) {
-			// efpsStruct[i].push(new Array());
-			this.efpsStruct[i] = new Array();
-		}
-		
-		// edges
-		for (var i = 0; i < this.graph.edges.length; i++) {
-			var features = this.graph.edges[i].features;
-			
-			// features
-			for (var j = 0; j < features.length; j++) {
-				var efps = features[j].efps;
-				
-				// efps
-				for (var k = 0; k < efps.length; k++) {
-					if (efps[k].efpName != "") {
-						var tmpEfpId = this.efpsIds[efps[k].efpName];
-						var tmpEdgeId = this.graph.edges[i].id;
-						
-						// assign edge to the efps
-						if (this.efpsStruct[tmpEfpId].indexOf(tmpEdgeId) < 0) {
-							// check if the EFP values are really valid numbers
-							if(!isNaN(efps[k].leftEfpValue) && !isNaN(efps[k].rightEfpValue)) {
-								this.efpsStruct[tmpEfpId].push(tmpEdgeId);;
-							}
-						}
-						
-						/* LEFT numeric values */
-						if (!isNaN(efps[k].leftEfpValue)) {
-							// check and set min
-							if (parseFloat(efps[k].leftEfpValue) < parseFloat(this.minEfpsValuesLeft[efps[k].efpName])) {
-								this.minEfpsValuesLeft[efps[k].efpName] = efps[k].leftEfpValue;
-							}
-							
-							// check and set max
-							if (parseFloat(efps[k].leftEfpValue) > parseFloat(this.maxEfpsValuesLeft[efps[k].efpName])) {
-								this.maxEfpsValuesLeft[efps[k].efpName] = efps[k].leftEfpValue;
-							}
-						}
-						
-						/* RIGHT numeric values */
-						if (!isNaN(efps[k].rightEfpValue)) {
-							// check and set min
-							if (parseFloat(efps[k].rightEfpValue) < parseFloat(this.minEfpsValuesRight[efps[k].efpName])) {
-								this.minEfpsValuesRight[efps[k].efpName] = efps[k].rightEfpValue;
-							}
-							
-							// check and set max
-							if (parseFloat(efps[k].rightEfpValue) > parseFloat(this.maxEfpsValuesRight[efps[k].efpName])) {
-								this.maxEfpsValuesRight[efps[k].efpName] = efps[k].rightEfpValue;
-							}
-						}
-					}
-				}
-			}
-		}
-	},
-	
-	/**
-	* Triggered after a change of selected EFP.
-	*
-	* @param element
-	*/
-	recalculate : function(element) {
-		var efpName = $(element).val();
-		
-		// empty selected => reset
-		if (efpName == "") {
-			this.changeEdges(this.currentEfpSeclected, true);
-			
-			this.currentEfpSeclected = efpName;
-			
-			return;
-		}
-		
-		// is already empty => no need for a reset
-		if (this.currentEfpSeclected != "") {
-			this.changeEdges(this.currentEfpSeclected, true);
-		}
-		
-		this.changeEdges(efpName, false);
-		
-		// set new selected value
-		this.currentEfpSeclected = efpName;
-	},
-	
-	/**
-	*
-	* Calculate average of all selected EFPs on given edge.
-	*
-	* @param efpName
-	* @param edge
-	* @returns {Array}
-	*/
-	calculateEfpAvg : function(efpName, edge) {
-		var foundEFps = 0;
-		var avgStructLeftRight = [Number(0),Number(0)];
-		
-		// get the EFP and its values
-		for(var j = 0; j < edge.features.length; j++) {
-			var tmpEdgeFeature = edge.features[j];
-			
-			for(var k = 0; k < tmpEdgeFeature.efps.length; k++) {
-				var tmpEdgeFeatureEfp = tmpEdgeFeature.efps[k];
-				
-				// set the EFP if matched and numeric
-				if(tmpEdgeFeatureEfp.efpName == efpName){
-					if(!isNaN(tmpEdgeFeatureEfp.leftEfpValue) && !isNaN(tmpEdgeFeatureEfp.rightEfpValue)) {
-						foundEFps++;
-						
-						avgStructLeftRight[0] += parseFloat(tmpEdgeFeatureEfp.leftEfpValue);
-						avgStructLeftRight[0] /= foundEFps;
-						
-						avgStructLeftRight[1] += parseFloat(tmpEdgeFeatureEfp.rightEfpValue);
-						avgStructLeftRight[1] /= foundEFps;
-						}else {
-						// found some non-numeric -> error state
-						return null;
-					}
-				}
-			}
-		}
-		
-		return avgStructLeftRight;
-	},
-	
-	/**
-	*
-	* @param efpName
-	* @param reset
-	*/
-	changeEdges : function(efpName, reset) {
-		var diameterLeft = null, diameterRight = this.minDiameter;
-		var tmpEfpId = this.efpsIds[efpName];
-		
-		var singleSelectedEfpInDiagram = false;
-		
-		var kLeft = null, qLeft = null, kRight = null, qRight = null;
-		
-		// [minDiameter][maxDiameter] of chosen EFP
-		var minMaxDiameterOfEfpLeft = [this.minEfpsValuesLeft[efpName], this.maxEfpsValuesLeft[efpName]];
-		var minMaxDiameterOfEfpRight = [this.minEfpsValuesRight[efpName], this.maxEfpsValuesRight[efpName]];
-		
-		// check if we won't run into the DIV 0
-		if((minMaxDiameterOfEfpLeft[0] - minMaxDiameterOfEfpLeft[1]) == 0 || (minMaxDiameterOfEfpRight[0] - minMaxDiameterOfEfpRight[1]) == 0){
-			singleSelectedEfpInDiagram = true;
-			}else {
-			// y = k * x + q
-			kLeft = (this.minDiameter - this.maxDiameter) / (minMaxDiameterOfEfpLeft[0] - minMaxDiameterOfEfpLeft[1]);
-			qLeft = this.maxDiameter - kLeft * minMaxDiameterOfEfpLeft[1];
-			
-			kRight = (this.minDiameter - this.maxDiameter) / (minMaxDiameterOfEfpRight[0] - minMaxDiameterOfEfpRight[1]);
-			qRight = this.maxDiameter - kRight * minMaxDiameterOfEfpRight[1];
-		}
-		
-		// iterates through all edges which have the selected EFP
-		for (var i = 0; i < this.efpsStruct[tmpEfpId].length; i++) {
-			var tmpEdgeId = this.efpsStruct[tmpEfpId][i];
-			diameterLeft = this.minDiameter;
-			diameterRight = this.minDiameter;
-			
-			// calculate avg
-			var selectedEfpAvg = this.calculateEfpAvg(efpName, this.graph.edges[tmpEdgeId - 1]);
-			
-			if (reset) {
-				// remove tick symbol
-				var lolliToRemove = document.getElementById("lollipop-tick" + tmpEdgeId);
-				
-				if(lolliToRemove != null) {
-					var lolliParent = lolliToRemove.parentNode;
-					lolliParent.removeChild(lolliToRemove);
-				}
-				
-				}else {
-				if(selectedEfpAvg != null && !singleSelectedEfpInDiagram) {
-					// calculate the size - linear scaling
-					diameterLeft = kLeft * selectedEfpAvg[0] + qLeft;
-					diameterRight = kRight * selectedEfpAvg[1] + qRight;
-				}
-			}
-			
-			// set circle radius
-			$(".lollipop[data-edgeid='" + tmpEdgeId + "'] circle").attr("r", diameterRight / 2);
-			
-			
-			if (!reset) {
-				if(selectedEfpAvg != null) {
-					// set path dimensions
-					var yDistance = diameterLeft / 2 + 4;
-					// X distance of half-circle's "draggers" should be equal to 2/3 of circle diameter (eg. circle diametr=24, draggers=16)
-					var xDistance = yDistance * 4 / 3;
-					var distanceOffsetToRight = diameterRight / 2;
-					// add distance between lolli and circle
-					var dString = 'M' + distanceOffsetToRight + ',' + -yDistance + ' C' + (xDistance + distanceOffsetToRight) + ',' + -yDistance + ' ' + (xDistance + distanceOffsetToRight) + ',' + yDistance + ' ' + distanceOffsetToRight + ',' + yDistance;
-					
-					$(".lollipop[data-edgeid='" + tmpEdgeId + "'] path").first().attr("d", dString);
-				}
-				
-				// add tick symbol if needed
-				if(this.graph.edges[tmpEdgeId-1].edgeStatusOk) {
-					// create tick element
-					var tick = document.createElementNS('http://www.w3.org/2000/svg','path');
-					tick.setAttribute('class','SamplePath');
-					tick.setAttribute('id', 'lollipop-tick' + tmpEdgeId);
-					tick.setAttribute('d','M-4,-2 C-3,12 1,0 5,-7');
-					tick.setAttribute('stroke','green');
-					
-					// get the angle
-					var xforms = $(".lollipop[data-edgeid='" + tmpEdgeId + "']").attr('transform');
-					var parts  = /rotate\(\s*([^\s,)]+)[ ,]([^\s,)]+)[ ,]([^\s,)]+)/.exec(xforms);
-					var angle = parts[1];
-					
-					// prevent rotation
-					tick.setAttribute('transform','rotate(' + (-angle) + ',0,0) translate(0,0)');
-					
-					// add the tick
-					var lollipop = $(".lollipop[data-edgeid='" + tmpEdgeId + "']")[0];
-					lollipop.appendChild(tick);
-				}
-				}else {
-				// set path dimensions
-				var yDistance = diameterLeft / 2 + 4;
-				// X distance of half-circle's "draggers" should be equal to 2/3 of circle diameter (eg. circle diametr=24, draggers=16)
-				var xDistance = yDistance * 4 / 3;
-				var dString = 'M0,' + -yDistance + ' C' + xDistance + ',' + -yDistance + ' ' + xDistance + ',' + yDistance + ' 0,' + yDistance;
-				
-				$(".lollipop[data-edgeid='" + tmpEdgeId + "'] path").first().attr("d", dString);
-			}
-		}
-		
-	},
-	
-};
\ No newline at end of file
diff --git a/sources/WebContent/old/js/graphManager.js b/sources/WebContent/old/js/graphManager.js
deleted file mode 100644
index f856f01..0000000
--- a/sources/WebContent/old/js/graphManager.js
+++ /dev/null
@@ -1,675 +0,0 @@
-
-/**
- * Object which represent graph.
- */
-var GraphManager = {
-	graph: null,
-	unconList: [],
-	isEfpGraph : false,
-	isCompatibilityGraph: true,
-	vertices_position: null,
-	forceField: [],
-	otherVertex: [],
-	canvasSize: 0,
-
-	// parametry layoutu
-	inumber: 30, // pocet iteraci; default 300
-	inumberClick: 20, // pocet iteraci u tlacitka
-	restrength: 400, // odpudiva sila (prima umera); default 450
-	atstrength: 510, // pritazliva sila (neprima umera, nesmi byt 0); default 110
-	deffect: 1000, // tlumeni sily (nesmi byt 0); default 200
-	borderRatio: 1, // hranice layoutu (cislo kterym se deli velikost canvasu)
-	// tahle funkce se mi nelibi, je treba to vyresit jinak, nici to layout (nechat na 1)
-
-	layouting: false,
-	myVar: null,
-
-	/**
-	 * Initialization
-	 */
-	init: function(){
-		this.buildGraph.bind(this);
-		this.forceDirectedLayoutOnClick = this.forceDirectedLayoutOnClick.bind(this);
-	},
-
-	/**
-	 * Apply layout and set interval
-	 */
-	forceDirectedLayoutOnClick: function(){
-		if (this.layouting === true) {
-			$('#applyLayoutImg').attr('src', 'images/layout_off.png');
-			this.layouting = false;
-			clearInterval(this.myVar);
-		} else {
-			$('#applyLayoutImg').attr('src', 'images/layout_on.png');
-			this.layouting = true;
-			this.myVar = window.setInterval(this.awesomeFirePenguin.bind(this), 10);
-		}
-	},
-
-	/**
-	 * Force directed layout for visible components
-	 */
-	awesomeFirePenguin: function(){
-		var canvas = this.canvasSize,
-
-			repulsiveStrength = this.restrength, // more is more
-			attractiveStrength = this.atstrength, // more is less
-			dampeningEffect = this.deffect,
-			border = canvas/this.borderRatio,
-
-			visibleVertices = [],
-			vertices = this.graph.vertices,
-			i = 0,
-			j = 0,
-			counter = 0,
-			otherVisibleVertices = [];
-
-		// gets the visible components
-		for (i = 0; i < vertices.length; i++){
-			if (vertices[i].$selector[0].isVisible()){
-				visibleVertices[counter] = vertices[i];
-				counter++;
-			}
-		}
-
-		for (i = 0; i < this.graph.vertices.length; i++){
-			this.forceField[i][0] = 0;
-			this.forceField[i][1] = 0;
-		}
-
-		// calculate repulsive force
-		for (i = 0; i < visibleVertices.length; i++){
-			var currVertex = visibleVertices[i];
-
-			// other vertices
-			for (var j = 0; j < visibleVertices.length; j++){
-				otherVisibleVertices[j] = visibleVertices[j];
-			}
-			otherVisibleVertices.splice(i, 1);
-
-			// iterate over other vertices
-			for (j = 0; j < otherVisibleVertices.length; j++){
-				// currVertex position
-				var currX = currVertex.x,
-					currY = currVertex.y,
-
-				// otherVertex position
-					otherX = otherVisibleVertices[j].x,
-					otherY = otherVisibleVertices[j].y,
-
-				// calculate force
-					x = currX - otherX,
-					y = currY - otherY,
-
-					sum = Math.pow(x,2) + Math.pow(y,2),
-					distance = Math.sqrt(sum);
-
-				if (distance !== 0) {
-					this.forceField[currVertex.id-1][0] += Math.floor((x * (repulsiveStrength / distance)));
-					this.forceField[currVertex.id-1][1] += Math.floor((y * (repulsiveStrength / distance)));
-				}
-			}
-		}
-
-		// calculate attractive forces
-		for (i = 0; i < visibleVertices.length; i++){
-			var currVertex = visibleVertices[i];
-
-			for (j = 0; j < currVertex.edges.length; j++){
-				var otherVertex;
-
-				if (currVertex.edges[j].to == currVertex){
-					otherVertex = currVertex.edges[j].from;
-				} else {
-					otherVertex = currVertex.edges[j].to;
-				}
-
-				if (otherVertex.$selector[0].isHidden()) continue;
-
-				// currVertex position
-				var currX = currVertex.x,
-					currY = currVertex.y,
-
-				// otherVertex position
-					otherX = otherVertex.x,
-					otherY = otherVertex.y,
-
-				// calculate force
-					x = currX - otherX,
-					y = currY - otherY,
-
-					sum = Math.pow(x, 2) + Math.pow(y, 2),
-					distance = Math.sqrt(sum);
-
-				//$('#rightPanel').append(distance+"<BR>");
-				this.forceField[visibleVertices[i].id-1][0] += Math.round(-( (x * (distance / attractiveStrength))));
-				this.forceField[visibleVertices[i].id-1][1] += Math.round(-( (y * (distance / attractiveStrength))));
-				/*
-				 this.forceField[otherVertex.id-1][0] -= Math.round(-( (x * (distance / attractiveStrength))));
-				 this.forceField[otherVertex.id-1][1] -= Math.round(-( (y * (distance / attractiveStrength))));
-				 */
-			}
-		}
-
-		// applying the force
-		for (i = 0; i < this.graph.vertices.length; i++){
-			var currVertex = this.graph.vertices[i],
-
-				halfCan = canvas / 2,
-
-				deltaX = currVertex.x - halfCan,
-				deltaY = currVertex.y - halfCan;
-
-			// tohle drzi layout uprostred, chtelo by to vymyslet nejak lip, docela ho to kurvi
-			/*
-			 if (deltaX > 0) {
-			 currVertex.x = Math.min(currVertex.x, (canvas/2)+border);
-			 } else {
-			 currVertex.x = Math.max(currVertex.x, (canvas/2)-border);
-			 }
-			 if (deltaY > 0) {
-			 currVertex.y = Math.min(currVertex.y, (canvas/2)+border);
-			 } else {
-			 currVertex.y = Math.max(currVertex.y, (canvas/2)-border);
-			 }
-			 */
-
-			// kolecko
-			var dist = Math.sqrt(Math.pow(deltaX,2)+Math.pow(deltaY,+2)),
-				maxDist = Math.sqrt(Math.pow(border,2)+Math.pow(border,+2));
-
-			if (dist > maxDist){
-				var ratio = maxDist / dist,
-
-					newX = deltaX * ratio,
-					newY = deltaY * ratio;
-
-				currVertex.x += newX - deltaX;
-				currVertex.y += newY - deltaY;
-			}
-
-			// force dampening
-			var forceX = Math.floor(this.forceField[i][0]/dampeningEffect),
-				forceY = Math.floor(this.forceField[i][1]/dampeningEffect);
-
-			// adding a random effect
-			/*
-			 forceX += -3+Math.floor((Math.random()*6)+1);
-			 forceY += -3+Math.floor((Math.random()*6)+1);
-			 */
-
-
-			// moving a component
-			if (Math.abs(forceX) > 1 || Math.abs(forceY) > 1){
-				currVertex.x += forceX;
-				currVertex.y += forceY;
-			}
-
-			// translating the graph
-			currVertex.$selector.attr('transform', 'translate(' + currVertex.x + ',' + currVertex.y + ')');
-
-			// translating edges
-			var newX, newY, lollipop;
-
-			if (currVertex.edges !== null) {
-				for (var k = 0; k< currVertex.edges.length; k++) {
-					var edge = currVertex.edges[k],
-						sizeOfRectFrom = edge.from.size,
-						sizeOfRectTo = edge.to.size;
-
-					if(edge.from.id == currVertex.id){
-						newX = currVertex.edges[k].to.x + sizeOfRectTo/2;
-						newY = currVertex.edges[k].to.y + 13;
-						lollipop = getLollipopPosition(currVertex.x + sizeOfRectFrom/2, currVertex.y +13 , newX, newY);
-
-						edge.$selector.children("line").attr('x1', currVertex.x + sizeOfRectFrom/2);
-						edge.$selector.children("line").attr('y1', currVertex.y + 13);
-						edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-
-						ViewportManager.preventTickRotation(edge, lollipop);
-						ViewportManager.preventCrossRotation(edge, lollipop);
-					} else {
-						newX = currVertex.edges[k].from.x + sizeOfRectFrom/2;
-						newY = currVertex.edges[k].from.y + 13;
-						lollipop = getLollipopPosition(newX, newY, currVertex.x + sizeOfRectTo/2, currVertex.y + 13);
-
-						edge.$selector.children("line").attr('x2', currVertex.x + sizeOfRectTo/2);
-						edge.$selector.children("line").attr('y2', currVertex.y + 13);
-						edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-
-						ViewportManager.preventTickRotation(edge, lollipop);
-						ViewportManager.preventCrossRotation(edge, lollipop);
-					}
-				}
-			}
-		}
-	},
-
-	/**
-	 * Force Directed Layout
-	 *
-	 * @param canvas canvas
-	 */
-	forceDirectedLayout: function(canvas) {
-		var repulsiveStrength = this.restrength, // more is more
-			attractiveStrength = this.atstrength, // more is less
-			dampeningEffect = this.deffect,
-			border = canvas/this.borderRatio;
-
-		//$('#rightPanel').append("s<BR>");
-
-		var length = this.graph.vertices.length;
-		// initialize repulsive forces
-
-		for (var i = 0; i < length; i++){
-			this.forceField[i][0] = 0;
-			this.forceField[i][1] = 0;
-		}
-
-		// calculate repulsive force
-		for (var i = 0; i < length; i++){
-
-			var currVertex = this.graph.vertices[i];
-			//var otherVertex = new Array();
-
-			// other vertices
-			for (var j = 0; j < length; j++){
-				this.otherVertex[j] = this.graph.vertices[j];
-			}
-			this.otherVertex.splice(i, 1);
-
-			// iterate over other vertices
-			for (var j = 0; j < this.otherVertex.length; j++){
-				// currVertex position
-				var currX = currVertex.x,
-					currY = currVertex.y,
-
-				// otherVertex position
-					otherX = this.otherVertex[j].x,
-					otherY = this.otherVertex[j].y,
-
-				// calculate force
-					x = currX - otherX,
-					y = currY - otherY,
-
-					sum = Math.pow(x,2) + Math.pow(y,2),
-					distance = Math.sqrt(sum);
-
-				if (distance !== 0) {
-					this.forceField[i][0] += Math.floor((x * (repulsiveStrength / distance)));
-					this.forceField[i][1] += Math.floor((y * (repulsiveStrength / distance)));
-				}
-			}
-
-			//$('#rightPanel').append(forceField[i][0]+" | "+forceField[i][1]+" - rf<BR>");
-		}
-
-		// calculate attractive forces
-		for (var i = 0; i < length; i++){
-			var currVertex = this.graph.vertices[i];
-			//$('#rightPanel').append(currVertex.id+"<BR>");
-			//$('#rightPanel').append(currVertex.edges.length+"<BR>");
-			for (var j = 0; j < currVertex.edges.length; j++){
-				var otherVertex;
-
-				if (currVertex.edges[j].to == currVertex){
-					otherVertex = currVertex.edges[j].from;
-				} else {
-					otherVertex = currVertex.edges[j].to;
-				}
-
-				// currVertex position
-				var currX = currVertex.x,
-					currY = currVertex.y,
-
-				// otherVertex position
-					otherX = otherVertex.x,
-					otherY = otherVertex.y,
-
-				// calculate force
-					x = currX - otherX,
-					y = currY - otherY,
-
-					sum = Math.pow(x, 2) + Math.pow(y, 2),
-					distance = Math.sqrt(sum);
-
-				//$('#rightPanel').append(distance+"<BR>");
-				this.forceField[i][0] += Math.round(-( (x * (distance / attractiveStrength))));
-				this.forceField[i][1] += Math.round(-( (y * (distance / attractiveStrength))));
-				/*
-				 this.forceField[otherVertex.id-1][0] -= Math.round(-( (x * (distance / attractiveStrength))));
-				 this.forceField[otherVertex.id-1][1] -= Math.round(-( (y * (distance / attractiveStrength))));
-				 */
-			}
-			//$('#rightPanel').append(forceField[i][0]+" | "+forceField[i][1]+" - ff<BR>");
-		}
-
-		// applying the force
-		for (var i = 0; i < length; i++){
-			var currVertex = this.graph.vertices[i],
-
-				deltaX = currVertex.x - (canvas/2),
-				deltaY = currVertex.y - (canvas/2);
-
-			// tohle drzi layout uprostred, chtelo by to vymyslet nejak lip, docela ho to kurvi
-			/*
-			 if (deltaX > 0) {
-			 currVertex.x = Math.min(currVertex.x, (canvas/2)+border);
-			 } else {
-			 currVertex.x = Math.max(currVertex.x, (canvas/2)-border);
-			 }
-			 if (deltaY > 0) {
-			 currVertex.y = Math.min(currVertex.y, (canvas/2)+border);
-			 } else {
-			 currVertex.y = Math.max(currVertex.y, (canvas/2)-border);
-			 }
-			 */
-
-			//kolecko
-			var dist = Math.sqrt(Math.pow(deltaX,2)+Math.pow(deltaY,+2)),
-				maxDist = Math.sqrt(Math.pow(border,2)+Math.pow(border,+2));
-
-			if (dist > maxDist){
-				var ratio = maxDist / dist,
-
-					newX = deltaX * ratio,
-					newY = deltaY * ratio;
-
-				currVertex.x += newX - deltaX;
-				currVertex.y += newY - deltaY;
-			}
-
-			// force dampening
-			var forceX = Math.floor(this.forceField[i][0]/dampeningEffect),
-				forceY = Math.floor(this.forceField[i][1]/dampeningEffect);
-
-			// adding a random effect
-			/*
-			 forceX += -3+Math.floor((Math.random()*6)+1);
-			 forceY += -3+Math.floor((Math.random()*6)+1);
-			 */
-
-			//$('#rightPanel').append(forceX+" | "+forceY+" - asaf<BR>");
-
-			// moving a component
-			currVertex.x += forceX;
-			currVertex.y += forceY;
-		}
-	},
-
-	/**
-	 * Create graph from data which were send by server.
-	 */
-	buildGraph: function(){
-		var vertexMap = {},
-			verticesBuff = '',
-			edgesBuff = '',
-			position_loaded = false;
-
-		if (this.graph === null) {
-			alert('Error loading graph.');
-			window.location.href = app.HOME_URL;
-			return;
-		}
-
-		if (this.graph !== null && this.graph.cause !== undefined) {
-			console.log("Error generating graph.");
-			console.log(this.graph);
-			app.loader.disable();
-			alert("Error generating graph. Check the console for details.");
-			return;
-		}
-
-		// start generating graph
-		var odm = Math.sqrt(this.graph.vertices.length),
-			canvas = ((this.graph.vertices.length * 75) / Math.round(odm)) + 1000;
-
-		this.canvasSize = canvas;
-		this.graph.vertices.sort(function(a, b) {
-			return a.id > b.id;
-		});
-
-		// initialize vertices
-		for (var i = 0; i < this.graph.vertices.length; i++) {
-			var vertex = this.graph.vertices[i];
-			vertexMap[vertex.symbolicName] = vertex;
-			vertex.edges = [];
-			vertex.gridMark = new GridMarks();
-
-			//pokud je nastavena pozice x y u prvku - nastavit tuto pozici
-			if (this.vertices_position !== null && this.vertices_position.vertices_position !== null) {
-				$.each(this.vertices_position.vertices_position, function(i, item) {
-					if ("vertex" + vertex.id == item.id){
-						var coords = getCoordinates(item.transform);
-
-						vertex.x = parseFloat(coords.x);
-						vertex.y = parseFloat(coords.y);
-
-						position_loaded = true;
-						return false;	// break
-					}
-				});
-			}
-
-			// nahodna pozice
-			if (position_loaded === false) {
-				vertex.x = Math.floor(Math.random() * canvas);
-				vertex.y = Math.floor(Math.random() * canvas);
-			}
-		}
-
-		// initialize edges
-		for (var j = 0; j < this.graph.edges.length; j++) {
-			var edge = this.graph.edges[j];
-			edge.from = vertexMap[edge.from];
-
-			if (typeof vertexMap[edge.to] !== 'undefined') {
-				edge.to = vertexMap[edge.to];
-			} else {
-				edge.to = vertexMap["vertex_NOT_FOUND"];
-			}
-
-			edge.from.edges.push(edge);
-			edge.to.edges.push(edge);
-		}
-
-		// calling force layout
-		if (position_loaded === false) {
-			//var avgX = 0, avgY = 0;
-
-			for (var x = 0; x < this.graph.vertices.length; x++) {
-				this.forceField[x] = [];
-			}
-
-			for (var x = 0; x < this.inumber; x++){
-				this.forceDirectedLayout(canvas);
-			}
-		}
-
-		// fill the vertices buffer
-		for (var i = 0; i < this.graph.vertices.length; i++) {
-			var vertex = this.graph.vertices[i];
-			vertex.size = getSizeOfRectangle(vertex.name);
-
-			verticesBuff += SvgFactory.createVertex(vertex);
-		}
-
-		// fill the edges buffer
-		for (var j = 0; j < this.graph.edges.length; j++){
-			var edge = this.graph.edges[j];
-
-			edgesBuff += SvgFactory.createEdge(edge, this.isEfpGraph);
-		}
-
-		$("#graph #edges").html(edgesBuff);
-		$("#graph #vertices").html(verticesBuff);
-
-		this.setSizeOfSvg();
-		this.centerGraphInViewport(1);
-		this.setTooltips();
-		this.fillUnconnectedList();
-		this.setVertexCounters();
-
-		/* Creating text field with total number of components loaded */
-		$('#allComps').text(this.graph.vertices.length+ ' components displayed');
-
-		/* Highlight if there are any incompability */
-		if (!this.isJarsCompatible()) {
-			$('#incomCmpList').empty();
-
-			var missingComponents = this.getMissingComponents();
-			missingComponents.forEach(function(component) {
-				$('#incomCmpList').append('<li>' + component + '</li>');
-			});
-
-			$('#incompatible').show();
-			$('#allIncomps').show();
-		}
-
-		// vytvoreni seznamu nepropojenych komponent
-		for (var i = 0; i < this.unconList.length; i++){
-			var ind = this.unconList[i],
-				name = this.graph.vertices[ind-1].name;
-
-			$('#unconCmpList').append('<li class="node vertex" id="liuc' + ind + '" data-id="' + ind + '"><p data-vertexId="' + ind + '" data-title="' + name + '">' + name + '</p><img class="" id="liuc_del_' + ind  + '" alt="delete" src="images/button_cancel.png"/></li>');
-		}
-
-		app.loader.disable();
-	},
-
-	/**
-	 * Set size of svg according bounding box of svg.
-	 */
-	setSizeOfSvg: function(){
-		var svg = $("#svg1"),
-			bbox = svg.get(0).getBBox(),
-			viewportWidth = stringToInt(cutTwoLastCharacters($("#viewport").css("width"))),
-			viewportHeight = stringToInt(cutTwoLastCharacters($("#viewport").css("height")));
-
-		if (bbox.width < viewportWidth){
-			svg.css("width", viewportWidth*1.5);
-		} else {
-			svg.css("width", bbox.width*1.5);
-		}
-
-		if (bbox.height < viewportHeight){
-			svg.css("height", viewportHeight*1.5);
-		} else {
-			svg.css("height", bbox.height*1.5);
-		}
-	},
-
-	/**
-	 * Centers graph in viewport. 
-	 * @param currentZoom
-	 */
-	centerGraphInViewport: function(currentZoom){
-		var svg = $("#svg1"),
-			graph = $("#graph"),
-			bboxSvg = svg.get(0).getBBox(),
-			svgWidth = stringToInt(cutTwoLastCharacters(svg.css("width"))),
-			svgHeight = stringToInt(cutTwoLastCharacters(svg.css("height"))),
-
-			centerSvgX = svgWidth/2.0,
-			centerSvgY = svgHeight/2.0,
-
-			newPositionGraphX = centerSvgX - bboxSvg.width/2.0 - bboxSvg.x,
-			newPositionGraphY = centerSvgY - bboxSvg.height/2.0 - bboxSvg.y,
-			viewport = $("#viewport");
-
-		viewport.scrollLeft(-(svgWidth-(viewport.width()-17))/2.0);
-		viewport.scrollTop((svgHeight-(viewport.height()-17))/2.0);
-		graph.attr("transform", "translate(" + newPositionGraphX/currentZoom + "," + newPositionGraphY/currentZoom + ")");
-
-		return "translate(" + newPositionGraphX/currentZoom + "," + newPositionGraphY/currentZoom + ")";
-	},
-
-	/**
-	 * Sets qTip tooltips to edge lollipops and vertex interface symbols
-	 */
-	setTooltips: function() {
-		configurationEdgeTooltip(".lollipop");
-
-		// only for non-EFP graphs
-		if (!GraphManager.isEfpGraph) {
-			configurationVertexTooltip(".interface");
-		}
-	},
-
-	/**
-	 * Fills list of unconnected components in graph.
-	 */
-	fillUnconnectedList: function() {
-		var unCount = 0;
-
-		for (var i = 0; i < this.graph.vertices.length; i++){
-			var vertex = this.graph.vertices[i];
-
-			if (vertex.edges.length === 0) {
-				this.unconList[unCount] = vertex.id;
-				$('#vertex'+ vertex.id).hide();
-
-				vertex.leftAlone = true;
-
-				unCount++;
-			}
-		}		
-	},
-
-	/**
-	 * Sets vertex provided and required components counters.
-	 */
-	setVertexCounters: function() {
-		for (var i = 0; i < this.graph.vertices.length; i++){
-			var countFrom = 0,
-				countTo = 0,
-				vertex = this.graph.vertices[i];
-
-			if (this.isEfpGraph) { // legacy method
-				// count TO and FROM numbers for lollipops
-				for (var j = 0; j < vertex.edges.length;j++){
-					if (vertex.id == vertex.edges[j].from.id){
-						countFrom++;
-					}
-				}
-				countTo = vertex.edges.length - countFrom;
-
-				$('#rectTopText'+ vertex.id).text(countTo);
-				$('#rectBotText'+ vertex.id).text(countFrom);
-			} else { // count lollis by packages
-				$('#rectTopText'+ vertex.id).text(vertex.importedPackages.length);
-				$('#rectBotText'+ vertex.id).text(vertex.exportedPackages.length);
-			}
-		}
-	},
-	
-	/**
-	 * Finds incompatible jars by vertex name.
-	 * @returns true if all jars are compatible, otherwise false 
-	 */
-	isJarsCompatible: function() {
-		return this.graph.vertices.every(function(vertex) {
-			return vertex.name !== "NOT_FOUND";
-		});
-	},
-
-	/**
-	 * Retrieves all missing components.
-	 *
-	 * @returns array List of missing components.
-	 */
-	getMissingComponents: function() {
-		var missing = [];
-
-		this.graph.edges.forEach(function(edge) {
-			if (edge.from.name === "NOT_FOUND") {
-				var compatibilityInfo = JSON.parse(edge.compInfoJSON);
-
-				missing.push(compatibilityInfo[0].causedBy);
-			}
-		});
-
-		return missing;
-	},
-};
\ No newline at end of file
diff --git a/sources/WebContent/old/js/gridMark.js b/sources/WebContent/old/js/gridMark.js
deleted file mode 100644
index 628dfe5..0000000
--- a/sources/WebContent/old/js/gridMark.js
+++ /dev/null
@@ -1,133 +0,0 @@
-
-/**
-* This class represents creating and sorting of marks.
-*/
-function GridMarks() {
-	var CONST_COUNT_MARKS_ON_ROW = 5;
-	var CONST_WIDTH_MARK = 21;
-	var CONST_HEIGHT_MARK = 21;
-
-	var marks = new Hash();
-	var position = {
-		rx: -60,
-		ry: 13,
-		tx: -50,
-		ty: 23
-	};
-
-	/**
-	 * Add mark to list.
-	 * 
-	 * @param markId id of added mark
-	 * @param mark mark with symbol and color
-	 */
-	this.addMark = function(markId, mark) {
-		if (mark.symbol != "undefined" || mark.symbol != "" || mark.symbol !== undefined) {
-			var translate = countTranslate(marks.size());
-			var markGroup = createMarkSvg(mark, position, translate);
-
-			marks.add(markId, {
-				mark: mark,
-				$markGroup: $(markGroup)
-			});
-
-			mark.$vertexSelector.append(markGroup);
-		}
-	};
-
-	/**
-	 * Removes mark with given id from list.
-	 * 
-	 * @param markId mark ID
-	 */
-	this.removeMark = function(markId) {
-		var item = marks.remove(markId).$markGroup;
-		item.remove();
-
-		reorganizeMarks();
-	};
-
-	/**
-	 * Tests if mark with given id is in list of mark.
-	 * 
-	 * @param markId mark ID
-	 * @returns {*|boolean} If mark exists, it is returned
-	 */
-	this.existMark = function(markId) {
-		return marks.contains(markId);
-	};
-
-	/**
-	 * Count translate of mark in grids.
-	 * 
-	 * @param length length
-	 * @returns {{x: number, y: number}} calculated x and y axes
-	 */
-	function countTranslate(length) {
-		return {
-			x: (length % CONST_COUNT_MARKS_ON_ROW) * CONST_WIDTH_MARK,
-			y: Math.floor(length / CONST_COUNT_MARKS_ON_ROW) * CONST_HEIGHT_MARK
-		};
-	}
-
-	/**
-	* This method organized marks in grid.
-	*/
-	function reorganizeMarks() {
-		var countMark = 0;
-		for (var key in marks.getAll()) {
-			if (marks.getAll().hasOwnProperty(key)) {
-				marks.get(key).$markGroup.remove();
-
-				var translate = countTranslate(countMark);
-				var markGroup = createMarkSvg(marks.get(key).mark, position, translate);
-
-				marks.get(key).$markGroup = $(markGroup);
-				marks.get(key).mark.$vertexSelector.append(markGroup);
-				
-				countMark++;
-			}
-		}
-	}
-	
-	/**
-	 * Create svg element which represents mark in graph.
-	 * 
-	 * @param mark mark
-	 * @param position mark position
-	 * @param translate translate
-	 * @returns {*} group
-	 */
-	function createMarkSvg(mark, position, translate) {
-		var group = createSvgElement('g', {
-			'class': mark.id,
-			'transform': 'translate(' + (translate.x) + ',' + translate.y + ')'
-		});
-
-		var rect = createSvgElement('rect', {
-			rx: 4,
-			ry: 4,
-			height: CONST_HEIGHT_MARK,
-			width: CONST_WIDTH_MARK,
-		//            x: position['rx'],
-		//            y: position['ry'],
-			y: 2 * position['ry'],
-			stroke: 'black',
-			fill: mark.symbol[1]
-		});
-
-		var label = createSvgElement('text', {
-			'x': 10,
-			'y': position['ty'] + 13,
-			'fill': 'black',
-		});
-
-		var myText = document.createTextNode(mark.symbol[0]);
-
-		label.appendChild(myText);
-		group.appendChild(rect);
-		group.appendChild(label);
-
-		return group;
-	}
-}
diff --git a/sources/WebContent/old/js/group.js b/sources/WebContent/old/js/group.js
deleted file mode 100644
index 19113ea..0000000
--- a/sources/WebContent/old/js/group.js
+++ /dev/null
@@ -1,153 +0,0 @@
-
-/**
- * The class represents group.
- * @param groupSymbol group symbol
- * @param idGroup group id
- */
-function Group(groupSymbol, idGroup) {
-	this.groupSymbol = groupSymbol;
-	this.idGroup = idGroup;
-	this.label = 'Group';
-	this.x = 0;
-	this.y = 0;
-
-	this.items = new Hash();
-	this.providedPackage = new Hash();
-	this.requiredPackage = new Hash();
-
-	var countRequired = 0;
-	var countProvided = 0;
-	var decompose = false;
-
-	/**
-	 * Adds provided packages.
-	 * @param exportPackages package which be added.
-	 */
-	this.addProvidedPackage = function(exportPackages) {
-		var frequency = 1;
-		
-		for (var i = 0; i < exportPackages.length; i++){
-			if (providedPackage.contains(exportPackages[i])) {
-				frequency = providedPackage.get(exportPackages[i]) + 1;
-			}
-			
-			providedPackage.add(exportPackages[i], frequency);
-			frequency = 1;
-			
-			// this new provided bundle satisfies required of some old bundle
-			if (requiredPackage.contains(exportPackages[i])) {
-				requiredPackage.remove(exportPackages[i]);
-			}
-		}
-	};
-	
-	/**
-	 * Adds required packages.
-	 * 
-	 * @param importPackages package which be added.
-	 */
-	this.addRequiredPackage = function(importPackages) {
-		var frequency = 1, i;
-		
-		for (i = 0; i < importPackages.length; i++){
-			// no old provided bundle satisfies required of this new bundle
-			if (!providedPackage.contains(importPackages[i])) {
-				if (requiredPackage.contains(importPackages[i])) {
-					frequency = requiredPackage.get(importPackages[i]) + 1;
-				}
-
-				requiredPackage.add(importPackages[i], frequency);
-				frequency = 1;
-			}
-		}
-	};
-	
-	/**
-	 * Delete provided packages.
-	 * 
-	 * @param exportPackages package which will be deleted.
-	 */
-	this.deleteProvidedPackage = function(exportPackages) {
-		var frequency = -1;
-		var i;
-		
-		for (i = 0; i < exportPackages.length; i++) {
-			if (providedPackage.contains(exportPackages[i])) {
-				frequency = providedPackage.get(exportPackages[i]) - 1;
-				
-				if (frequency == 0) {
-					providedPackage.remove(exportPackages[i]);
-				} else {
-					providedPackage.add(exportPackages[i], frequency);
-				}
-
-				frequency = -1;
-			}
-		}
-	};
-	
-	/**
-	 * Delete required packages.
-	 * 
-	 * @param importPackages package which will be deleted.
-	 */
-	this.deleteRequiredPackage = function(importPackages) {
-		var frequency = -1;
-		var i;
-		
-		for (i = 0; i < importPackages.length; i++) {
-			if (requiredPackage.contains(importPackages[i])){
-				frequency = requiredPackage.get(importPackages[i]) - 1;
-				
-				if (frequency == 0) {
-					requiredPackage.remove(importPackages[i]);
-				} else {
-					requiredPackage.add(importPackages[i], frequency);
-				}
-
-				frequency = -1;
-			}
-		}
-	};
-
-	/**
-	 * Adds new item to group.
-	 * 
-	 * @param itemId id of saved item (vertex)
-	 * @param item vertex which will be added
-	 */
-	this.addToGroup = function(itemId, item) {
-		this.items.add(itemId, item);
-	};
-
-	/**
-	 * Removes item from group.
-	 * 
-	 * @param itemId id of deleted item (vertex)
-	 */
-	this.removeFromGroup = function(itemId) {
-		this.items.remove(itemId);
-	};
-
-	/**
-	 * Gets count of item in group.
-	 * 
-	 * @returns {number} number of items
-	 */
-	this.getGroupItemsLength = function() {
-		return this.items.size();
-	};
-
-	/**
-	 * Writes group item name into console
-	 */
-	this.toString = function() {
-		var groupItems = this.items.getAll();
-
-		for (var key in groupItems) {
-			if (groupItems.hasOwnProperty(key)) {
-				console.info('>> ' + groupItems.get(key).name);
-			}
-		}
-	};
-}
diff --git a/sources/WebContent/old/js/groupManager.js b/sources/WebContent/old/js/groupManager.js
deleted file mode 100644
index a0314da..0000000
--- a/sources/WebContent/old/js/groupManager.js
+++ /dev/null
@@ -1,67 +0,0 @@
-
-/**
-* GroupManager caters to group.
-*/
-function GroupManager() {
-	var groupList = {};
-	var size = 0;
-
-	/**
-	 * Low-level access to the hash table.
-	 */
-	this.getAll = function() {
-		return groupList;
-	};
-
-	/**
-	 * Adds group to list of groups.
-	 *
-	 * @param idGroup group ID
-	 * @param group group which will be added
-	 */
-	this.addGroupToList = function(idGroup, group) {
-		groupList[idGroup] = group;
-		size++;
-	};
-
-	/**
-	 * Removes group from list of groups.
-	 *
-	 * @param idGroup group ID
-	 */
-	this.removeGroupFromList = function(idGroup) {
-		delete groupList[idGroup];
-		size--;
-	};
-
-	/**
-	 * Finds out if the group with given id is in list of existing group.
-	 *
-	 * @param idGroup group ID
-	 * @returns {boolean} true if group is in list
-	 */
-	this.existGroup = function(idGroup) {
-		if (groupList[idGroup] === null || groupList[idGroup] === undefined) {
-			return false;
-		}
-
-		return true;
-	};
-
-	/**
-	 * Gets group with given id.
-	 *
-	 * @param idGroup group ID
-	 * @returns {*} group from list
-	 */
-	this.getGroup = function(idGroup) {
-		return groupList[idGroup];
-	};
-	
-	/**
-	* Get count of group in group list.
-	*/
-	this.size = function() {
-		return this.size;
-	};
-}
diff --git a/sources/WebContent/old/js/hash.js b/sources/WebContent/old/js/hash.js
deleted file mode 100644
index 1a85e72..0000000
--- a/sources/WebContent/old/js/hash.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
-* The class represents hash table.
-*/
-function Hash() {
-	var size = 0;
-	var list = {};
-
-	/**
-	 * Low-level access to the hash table.
-	 */
-	this.getAll = function() {
-		return list;
-	};
-
-	/**
-	 * Add item
-	 * 
-	 * @param key key of added item
-	 * @param val value of added item
-	 */
-	this.add = function(key, val) {
-		if (!this.contains(key)) {
-			size++;
-		}
-
-		list[key] = val;
-	};
-
-	/**
-	 * Gets item with given key
-	 * 
-	 * @param key key of searched item
-	 * @returns {*} item
-	 */
-	this.get = function(key) {
-		return list[key];
-	};
-	
-	/**
-	 * Remove item with given key
-	 * 
-	 * @param key key of item
-	 * @returns {*} removed item
-	 */
-	this.remove = function(key) {
-		var val = list[key];
-		delete list[key];
-		size--;
-
-		return val;
-	};
-	
-	/**
-	* Gets count of item in "hash list".
-	*/
-	this.size = function() {
-		return size;
-	};
-	
-	/**
-	 * Tests if the item with given key is in "hash table".
-	 * 
-	 * @param key key of item
-	 * @returns {boolean} true if item with key is in "hash table"
-	 */
-	this.contains = function(key) {
-		if (list[key] == "undefined" || list[key] == null) {
-			return false;
-		}
-
-		return true;
-	};
-}
diff --git a/sources/WebContent/old/js/libs/htmlFactory.js b/sources/WebContent/old/js/libs/htmlFactory.js
deleted file mode 100644
index 2e17a56..0000000
--- a/sources/WebContent/old/js/libs/htmlFactory.js
+++ /dev/null
@@ -1,90 +0,0 @@
-function htmlFactory() {
-	function copy(object) {
-		return jQuery.extend({}, object);
-	}
-
-	function Text(text) {
-		this.text = text;
-
-		this.render = function() {
-			return document.createTextNode(text);
-		};
-	}
-
-	function Element(element) {
-		this.element = element;
-
-		this.render = function() {
-			return document.createElement(element);
-		};
-	}
-
-	function Component(element, attributes) {
-		this.element = element;
-		this.attributes = attributes;
-
-		this.components = [];
-
-		this.addComponent = function(component) {
-			this.components.push(component);
-		};
-
-		this.render = function() {
-			var element = new Element(this.element).render();
-
-			for (key in this.attributes) {
-				if (this.attributes.hasOwnProperty(key)) {
-					element.setAttribute(key, this.attributes[key]);
-				}
-			}
-
-			this.components.forEach(function(component) {
-				element.appendChild(component.render());
-			});
-
-			return element;
-		};
-
-		return copy(this);
-	}
-
-	function List(element, attributes) {
-		Component.call(this, element, attributes);
-
-		this.items = [];
-
-		this.add = function(item) {
-			this.items.push(item);
-		};
-
-		return copy(this);
-	}
-
-	function UnorderedList(attributes) {
-		List.call(this, 'ul', attributes);
-
-		return copy(this);
-	}
-
-	function OrderedList(attributes) {
-		List.call(this, 'ol', attributes);
-
-		return copy(this);
-	}
-
-	function ListItem(attributes) {
-		Component.call(this, 'li', attributes);
-
-		return copy(this);
-	}
-
-	// public API
-	return {
-		text: Text,
-		element: Element,
-		component: Component,
-		unorderedList: UnorderedList,
-		orderedList: OrderedList,
-		listItem: ListItem,
-	};
-};
diff --git a/sources/WebContent/old/js/libs/jquery-1.8.3.js b/sources/WebContent/old/js/libs/jquery-1.8.3.js
deleted file mode 100644
index 87e644a..0000000
--- a/sources/WebContent/old/js/libs/jquery-1.8.3.js
+++ /dev/null
@@ -1,9472 +0,0 @@
-
-/*!
-* jQuery JavaScript Library v1.8.3
-* http://jquery.com/
-*
-* Includes Sizzle.js
-* http://sizzlejs.com/
-*
-* Copyright 2012 jQuery Foundation and other contributors
-* Released under the MIT license
-* http://jquery.org/license
-*
-* Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
-*/
-(function( window, undefined ) {
-	var
-	// A central reference to the root jQuery(document)
-	rootjQuery,
-	
-	// The deferred used on DOM ready
-	readyList,
-	
-	// Use the correct document accordingly with window argument (sandbox)
-	document = window.document,
-	location = window.location,
-	navigator = window.navigator,
-	
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-	
-	// Map over the $ in case of overwrite
-	_$ = window.$,
-	
-	// Save a reference to some core methods
-	core_push = Array.prototype.push,
-	core_slice = Array.prototype.slice,
-	core_indexOf = Array.prototype.indexOf,
-	core_toString = Object.prototype.toString,
-	core_hasOwn = Object.prototype.hasOwnProperty,
-	core_trim = String.prototype.trim,
-	
-	// Define a local copy of jQuery
-	jQuery = function( selector, context ) {
-		// The jQuery object is actually just the init constructor 'enhanced'
-		return new jQuery.fn.init( selector, context, rootjQuery );
-	},
-	
-	// Used for matching numbers
-	core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
-	
-	// Used for detecting and trimming whitespace
-	core_rnotwhite = /\S/,
-	core_rspace = /\s+/,
-	
-	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
-	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-	
-	// A simple way to check for HTML strings
-	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-	rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-	
-	// Match a standalone tag
-	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-	
-	// JSON RegExp
-	rvalidchars = /^[\],:{}\s]*$/,
-	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
-	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
-	
-	// Matches dashed string for camelizing
-	rmsPrefix = /^-ms-/,
-	rdashAlpha = /-([\da-z])/gi,
-	
-	// Used by jQuery.camelCase as callback to replace()
-	fcamelCase = function( all, letter ) {
-		return ( letter + "" ).toUpperCase();
-	},
-	
-	// The ready event handler and self cleanup method
-	DOMContentLoaded = function() {
-		if ( document.addEventListener ) {
-			document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-			jQuery.ready();
-			} else if ( document.readyState === "complete" ) {
-			// we're here because readyState === "complete" in oldIE
-			// which is good enough for us to call the dom ready!
-			document.detachEvent( "onreadystatechange", DOMContentLoaded );
-			jQuery.ready();
-		}
-	},
-	
-	// [[Class]] -> type pairs
-	class2type = {};
-	
-	jQuery.fn = jQuery.prototype = {
-		constructor: jQuery,
-		init: function( selector, context, rootjQuery ) {
-			var match, elem, ret, doc;
-			
-			// Handle $(""), $(null), $(undefined), $(false)
-			if ( !selector ) {
-				return this;
-			}
-			
-			// Handle $(DOMElement)
-			if ( selector.nodeType ) {
-				this.context = this[0] = selector;
-				this.length = 1;
-				return this;
-			}
-			
-			// Handle HTML strings
-			if ( typeof selector === "string" ) {
-				if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-					// Assume that strings that start and end with <> are HTML and skip the regex check
-					match = [ null, selector, null ];
-					
-					} else {
-					match = rquickExpr.exec( selector );
-				}
-				
-				// Match html or make sure no context is specified for #id
-				if ( match && (match[1] || !context) ) {
-					
-					// HANDLE: $(html) -> $(array)
-					if ( match[1] ) {
-						context = context instanceof jQuery ? context[0] : context;
-						doc = ( context && context.nodeType ? context.ownerDocument || context : document );
-						
-						// scripts is true for back-compat
-						selector = jQuery.parseHTML( match[1], doc, true );
-						if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
-							this.attr.call( selector, context, true );
-						}
-						
-						return jQuery.merge( this, selector );
-						
-						// HANDLE: $(#id)
-						} else {
-						elem = document.getElementById( match[2] );
-						
-						// Check parentNode to catch when Blackberry 4.6 returns
-						// nodes that are no longer in the document #6963
-						if ( elem && elem.parentNode ) {
-							// Handle the case where IE and Opera return items
-							// by name instead of ID
-							if ( elem.id !== match[2] ) {
-								return rootjQuery.find( selector );
-							}
-							
-							// Otherwise, we inject the element directly into the jQuery object
-							this.length = 1;
-							this[0] = elem;
-						}
-						
-						this.context = document;
-						this.selector = selector;
-						return this;
-					}
-					
-					// HANDLE: $(expr, $(...))
-					} else if ( !context || context.jquery ) {
-					return ( context || rootjQuery ).find( selector );
-					
-					// HANDLE: $(expr, context)
-					// (which is just equivalent to: $(context).find(expr)
-					} else {
-					return this.constructor( context ).find( selector );
-				}
-				
-				// HANDLE: $(function)
-				// Shortcut for document ready
-				} else if ( jQuery.isFunction( selector ) ) {
-				return rootjQuery.ready( selector );
-			}
-			
-			if ( selector.selector !== undefined ) {
-				this.selector = selector.selector;
-				this.context = selector.context;
-			}
-			
-			return jQuery.makeArray( selector, this );
-		},
-		
-		// Start with an empty selector
-		selector: "",
-		
-		// The current version of jQuery being used
-		jquery: "1.8.3",
-		
-		// The default length of a jQuery object is 0
-		length: 0,
-		
-		// The number of elements contained in the matched element set
-		size: function() {
-			return this.length;
-		},
-		
-		toArray: function() {
-			return core_slice.call( this );
-		},
-		
-		// Get the Nth element in the matched element set OR
-		// Get the whole matched element set as a clean array
-		get: function( num ) {
-			return num == null ?
-			
-			// Return a 'clean' array
-			this.toArray() :
-			
-			// Return just the object
-			( num < 0 ? this[ this.length + num ] : this[ num ] );
-		},
-		
-		// Take an array of elements and push it onto the stack
-		// (returning the new matched element set)
-		pushStack: function( elems, name, selector ) {
-			
-			// Build a new jQuery matched element set
-			var ret = jQuery.merge( this.constructor(), elems );
-			
-			// Add the old object onto the stack (as a reference)
-			ret.prevObject = this;
-			
-			ret.context = this.context;
-			
-			if ( name === "find" ) {
-				ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
-				} else if ( name ) {
-				ret.selector = this.selector + "." + name + "(" + selector + ")";
-			}
-			
-			// Return the newly-formed element set
-			return ret;
-		},
-		
-		// Execute a callback for every element in the matched set.
-		// (You can seed the arguments with an array of args, but this is
-		// only used internally.)
-		each: function( callback, args ) {
-			return jQuery.each( this, callback, args );
-		},
-		
-		ready: function( fn ) {
-			// Add the callback
-			jQuery.ready.promise().done( fn );
-			
-			return this;
-		},
-		
-		eq: function( i ) {
-			i = +i;
-			return i === -1 ?
-			this.slice( i ) :
-			this.slice( i, i + 1 );
-		},
-		
-		first: function() {
-			return this.eq( 0 );
-		},
-		
-		last: function() {
-			return this.eq( -1 );
-		},
-		
-		slice: function() {
-			return this.pushStack( core_slice.apply( this, arguments ),
-			"slice", core_slice.call(arguments).join(",") );
-		},
-		
-		map: function( callback ) {
-			return this.pushStack( jQuery.map(this, function( elem, i ) {
-				return callback.call( elem, i, elem );
-			}));
-		},
-		
-		end: function() {
-			return this.prevObject || this.constructor(null);
-		},
-		
-		// For internal use only.
-		// Behaves like an Array's method, not like a jQuery method.
-		push: core_push,
-		sort: [].sort,
-		splice: [].splice
-	};
-	
-	// Give the init function the jQuery prototype for later instantiation
-	jQuery.fn.init.prototype = jQuery.fn;
-	
-	jQuery.extend = jQuery.fn.extend = function() {
-		var options, name, src, copy, copyIsArray, clone,
-		target = arguments[0] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-		
-		// Handle a deep copy situation
-		if ( typeof target === "boolean" ) {
-			deep = target;
-			target = arguments[1] || {};
-			// skip the boolean and the target
-			i = 2;
-		}
-		
-		// Handle case when target is a string or something (possible in deep copy)
-		if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-			target = {};
-		}
-		
-		// extend jQuery itself if only one argument is passed
-		if ( length === i ) {
-			target = this;
-			--i;
-		}
-		
-		for ( ; i < length; i++ ) {
-			// Only deal with non-null/undefined values
-			if ( (options = arguments[ i ]) != null ) {
-				// Extend the base object
-				for ( name in options ) {
-					src = target[ name ];
-					copy = options[ name ];
-					
-					// Prevent never-ending loop
-					if ( target === copy ) {
-						continue;
-					}
-					
-					// Recurse if we're merging plain objects or arrays
-					if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-						if ( copyIsArray ) {
-							copyIsArray = false;
-							clone = src && jQuery.isArray(src) ? src : [];
-							
-							} else {
-							clone = src && jQuery.isPlainObject(src) ? src : {};
-						}
-						
-						// Never move original objects, clone them
-						target[ name ] = jQuery.extend( deep, clone, copy );
-						
-						// Don't bring in undefined values
-						} else if ( copy !== undefined ) {
-						target[ name ] = copy;
-					}
-				}
-			}
-		}
-		
-		// Return the modified object
-		return target;
-	};
-	
-	jQuery.extend({
-		noConflict: function( deep ) {
-			if ( window.$ === jQuery ) {
-				window.$ = _$;
-			}
-			
-			if ( deep && window.jQuery === jQuery ) {
-				window.jQuery = _jQuery;
-			}
-			
-			return jQuery;
-		},
-		
-		// Is the DOM ready to be used? Set to true once it occurs.
-		isReady: false,
-		
-		// A counter to track how many items to wait for before
-		// the ready event fires. See #6781
-		readyWait: 1,
-		
-		// Hold (or release) the ready event
-		holdReady: function( hold ) {
-			if ( hold ) {
-				jQuery.readyWait++;
-				} else {
-				jQuery.ready( true );
-			}
-		},
-		
-		// Handle when the DOM is ready
-		ready: function( wait ) {
-			
-			// Abort if there are pending holds or we're already ready
-			if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-				return;
-			}
-			
-			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-			if ( !document.body ) {
-				return setTimeout( jQuery.ready, 1 );
-			}
-			
-			// Remember that the DOM is ready
-			jQuery.isReady = true;
-			
-			// If a normal DOM Ready event fired, decrement, and wait if need be
-			if ( wait !== true && --jQuery.readyWait > 0 ) {
-				return;
-			}
-			
-			// If there are functions bound, to execute
-			readyList.resolveWith( document, [ jQuery ] );
-			
-			// Trigger any bound ready events
-			if ( jQuery.fn.trigger ) {
-				jQuery( document ).trigger("ready").off("ready");
-			}
-		},
-		
-		// See test/unit/core.js for details concerning isFunction.
-		// Since version 1.3, DOM methods and functions like alert
-		// aren't supported. They return false on IE (#2968).
-		isFunction: function( obj ) {
-			return jQuery.type(obj) === "function";
-		},
-		
-		isArray: Array.isArray || function( obj ) {
-			return jQuery.type(obj) === "array";
-		},
-		
-		isWindow: function( obj ) {
-			return obj != null && obj == obj.window;
-		},
-		
-		isNumeric: function( obj ) {
-			return !isNaN( parseFloat(obj) ) && isFinite( obj );
-		},
-		
-		type: function( obj ) {
-			return obj == null ?
-			String( obj ) :
-			class2type[ core_toString.call(obj) ] || "object";
-		},
-		
-		isPlainObject: function( obj ) {
-			// Must be an Object.
-			// Because of IE, we also have to check the presence of the constructor property.
-			// Make sure that DOM nodes and window objects don't pass through, as well
-			if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-				return false;
-			}
-			
-			try {
-				// Not own constructor property must be Object
-				if ( obj.constructor &&
-				!core_hasOwn.call(obj, "constructor") &&
-				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-					return false;
-				}
-				} catch ( e ) {
-				// IE8,9 Will throw exceptions on certain host objects #9897
-				return false;
-			}
-			
-			// Own properties are enumerated firstly, so to speed up,
-			// if last one is own, then all properties are own.
-			
-			var key;
-			for ( key in obj ) {}
-			
-			return key === undefined || core_hasOwn.call( obj, key );
-		},
-		
-		isEmptyObject: function( obj ) {
-			var name;
-			for ( name in obj ) {
-				return false;
-			}
-			return true;
-		},
-		
-		error: function( msg ) {
-			throw new Error( msg );
-		},
-		
-		// data: string of html
-		// context (optional): If specified, the fragment will be created in this context, defaults to document
-		// scripts (optional): If true, will include scripts passed in the html string
-		parseHTML: function( data, context, scripts ) {
-			var parsed;
-			if ( !data || typeof data !== "string" ) {
-				return null;
-			}
-			if ( typeof context === "boolean" ) {
-				scripts = context;
-				context = 0;
-			}
-			context = context || document;
-			
-			// Single tag
-			if ( (parsed = rsingleTag.exec( data )) ) {
-				return [ context.createElement( parsed[1] ) ];
-			}
-			
-			parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
-			return jQuery.merge( [],
-			(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
-		},
-		
-		parseJSON: function( data ) {
-			if ( !data || typeof data !== "string") {
-				return null;
-			}
-			
-			// Make sure leading/trailing whitespace is removed (IE can't handle it)
-			data = jQuery.trim( data );
-			
-			// Attempt to parse using the native JSON parser first
-			if ( window.JSON && window.JSON.parse ) {
-				return window.JSON.parse( data );
-			}
-			
-			// Make sure the incoming data is actual JSON
-			// Logic borrowed from http://json.org/json2.js
-			if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-			.replace( rvalidtokens, "]" )
-			.replace( rvalidbraces, "")) ) {
-				
-				return ( new Function( "return " + data ) )();
-				
-			}
-			jQuery.error( "Invalid JSON: " + data );
-		},
-		
-		// Cross-browser xml parsing
-		parseXML: function( data ) {
-			var xml, tmp;
-			if ( !data || typeof data !== "string" ) {
-				return null;
-			}
-			try {
-				if ( window.DOMParser ) { // Standard
-					tmp = new DOMParser();
-					xml = tmp.parseFromString( data , "text/xml" );
-					} else { // IE
-					xml = new ActiveXObject( "Microsoft.XMLDOM" );
-					xml.async = "false";
-					xml.loadXML( data );
-				}
-				} catch( e ) {
-				xml = undefined;
-			}
-			if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-				jQuery.error( "Invalid XML: " + data );
-			}
-			return xml;
-		},
-		
-		noop: function() {},
-		
-		// Evaluates a script in a global context
-		// Workarounds based on findings by Jim Driscoll
-		// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-		globalEval: function( data ) {
-			if ( data && core_rnotwhite.test( data ) ) {
-				// We use execScript on Internet Explorer
-				// We use an anonymous function so that context is window
-				// rather than jQuery in Firefox
-				( window.execScript || function( data ) {
-					window[ "eval" ].call( window, data );
-				} )( data );
-			}
-		},
-		
-		// Convert dashed to camelCase; used by the css and data modules
-		// Microsoft forgot to hump their vendor prefix (#9572)
-		camelCase: function( string ) {
-			return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-		},
-		
-		nodeName: function( elem, name ) {
-			return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-		},
-		
-		// args is for internal usage only
-		each: function( obj, callback, args ) {
-			var name,
-			i = 0,
-			length = obj.length,
-			isObj = length === undefined || jQuery.isFunction( obj );
-			
-			if ( args ) {
-				if ( isObj ) {
-					for ( name in obj ) {
-						if ( callback.apply( obj[ name ], args ) === false ) {
-							break;
-						}
-					}
-					} else {
-					for ( ; i < length; ) {
-						if ( callback.apply( obj[ i++ ], args ) === false ) {
-							break;
-						}
-					}
-				}
-				
-				// A special, fast, case for the most common use of each
-				} else {
-				if ( isObj ) {
-					for ( name in obj ) {
-						if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
-							break;
-						}
-					}
-					} else {
-					for ( ; i < length; ) {
-						if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
-							break;
-						}
-					}
-				}
-			}
-			
-			return obj;
-		},
-		
-		// Use native String.trim function wherever possible
-		trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
-		function( text ) {
-			return text == null ?
-			"" :
-			core_trim.call( text );
-		} :
-		
-		// Otherwise use our own trimming functionality
-		function( text ) {
-			return text == null ?
-			"" :
-			( text + "" ).replace( rtrim, "" );
-		},
-		
-		// results is for internal usage only
-		makeArray: function( arr, results ) {
-			var type,
-			ret = results || [];
-			
-			if ( arr != null ) {
-				// The window, strings (and functions) also have 'length'
-				// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-				type = jQuery.type( arr );
-				
-				if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
-					core_push.call( ret, arr );
-					} else {
-					jQuery.merge( ret, arr );
-				}
-			}
-			
-			return ret;
-		},
-		
-		inArray: function( elem, arr, i ) {
-			var len;
-			
-			if ( arr ) {
-				if ( core_indexOf ) {
-					return core_indexOf.call( arr, elem, i );
-				}
-				
-				len = arr.length;
-				i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-				
-				for ( ; i < len; i++ ) {
-					// Skip accessing in sparse arrays
-					if ( i in arr && arr[ i ] === elem ) {
-						return i;
-					}
-				}
-			}
-			
-			return -1;
-		},
-		
-		merge: function( first, second ) {
-			var l = second.length,
-			i = first.length,
-			j = 0;
-			
-			if ( typeof l === "number" ) {
-				for ( ; j < l; j++ ) {
-					first[ i++ ] = second[ j ];
-				}
-				
-				} else {
-				while ( second[j] !== undefined ) {
-					first[ i++ ] = second[ j++ ];
-				}
-			}
-			
-			first.length = i;
-			
-			return first;
-		},
-		
-		grep: function( elems, callback, inv ) {
-			var retVal,
-			ret = [],
-			i = 0,
-			length = elems.length;
-			inv = !!inv;
-			
-			// Go through the array, only saving the items
-			// that pass the validator function
-			for ( ; i < length; i++ ) {
-				retVal = !!callback( elems[ i ], i );
-				if ( inv !== retVal ) {
-					ret.push( elems[ i ] );
-				}
-			}
-			
-			return ret;
-		},
-		
-		// arg is for internal usage only
-		map: function( elems, callback, arg ) {
-			var value, key,
-			ret = [],
-			i = 0,
-			length = elems.length,
-			// jquery objects are treated as arrays
-			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-			
-			// Go through the array, translating each of the items to their
-			if ( isArray ) {
-				for ( ; i < length; i++ ) {
-					value = callback( elems[ i ], i, arg );
-					
-					if ( value != null ) {
-						ret[ ret.length ] = value;
-					}
-				}
-				
-				// Go through every key on the object,
-				} else {
-				for ( key in elems ) {
-					value = callback( elems[ key ], key, arg );
-					
-					if ( value != null ) {
-						ret[ ret.length ] = value;
-					}
-				}
-			}
-			
-			// Flatten any nested arrays
-			return ret.concat.apply( [], ret );
-		},
-		
-		// A global GUID counter for objects
-		guid: 1,
-		
-		// Bind a function to a context, optionally partially applying any
-		// arguments.
-		proxy: function( fn, context ) {
-			var tmp, args, proxy;
-			
-			if ( typeof context === "string" ) {
-				tmp = fn[ context ];
-				context = fn;
-				fn = tmp;
-			}
-			
-			// Quick check to determine if target is callable, in the spec
-			// this throws a TypeError, but we will just return undefined.
-			if ( !jQuery.isFunction( fn ) ) {
-				return undefined;
-			}
-			
-			// Simulated bind
-			args = core_slice.call( arguments, 2 );
-			proxy = function() {
-				return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
-			};
-			
-			// Set the guid of unique handler to the same of original handler, so it can be removed
-			proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-			
-			return proxy;
-		},
-		
-		// Multifunctional method to get and set values of a collection
-		// The value/s can optionally be executed if it's a function
-		access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
-			var exec,
-			bulk = key == null,
-			i = 0,
-			length = elems.length;
-			
-			// Sets many values
-			if ( key && typeof key === "object" ) {
-				for ( i in key ) {
-					jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
-				}
-				chainable = 1;
-				
-				// Sets one value
-				} else if ( value !== undefined ) {
-				// Optionally, function values get executed if exec is true
-				exec = pass === undefined && jQuery.isFunction( value );
-				
-				if ( bulk ) {
-					// Bulk operations only iterate when executing function values
-					if ( exec ) {
-						exec = fn;
-						fn = function( elem, key, value ) {
-							return exec.call( jQuery( elem ), value );
-						};
-						
-						// Otherwise they run against the entire set
-						} else {
-						fn.call( elems, value );
-						fn = null;
-					}
-				}
-				
-				if ( fn ) {
-					for (; i < length; i++ ) {
-						fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
-					}
-				}
-				
-				chainable = 1;
-			}
-			
-			return chainable ?
-			elems :
-			
-			// Gets
-			bulk ?
-			fn.call( elems ) :
-			length ? fn( elems[0], key ) : emptyGet;
-		},
-		
-		now: function() {
-			return ( new Date() ).getTime();
-		}
-	});
-	
-	jQuery.ready.promise = function( obj ) {
-		if ( !readyList ) {
-			
-			readyList = jQuery.Deferred();
-			
-			// Catch cases where $(document).ready() is called after the browser event has already occurred.
-			// we once tried to use readyState "interactive" here, but it caused issues like the one
-			// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
-			if ( document.readyState === "complete" ) {
-				// Handle it asynchronously to allow scripts the opportunity to delay ready
-				setTimeout( jQuery.ready, 1 );
-				
-				// Standards-based browsers support DOMContentLoaded
-				} else if ( document.addEventListener ) {
-				// Use the handy event callback
-				document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-				
-				// A fallback to window.onload, that will always work
-				window.addEventListener( "load", jQuery.ready, false );
-				
-				// If IE event model is used
-				} else {
-				// Ensure firing before onload, maybe late but safe also for iframes
-				document.attachEvent( "onreadystatechange", DOMContentLoaded );
-				
-				// A fallback to window.onload, that will always work
-				window.attachEvent( "onload", jQuery.ready );
-				
-				// If IE and not a frame
-				// continually check to see if the document is ready
-				var top = false;
-				
-				try {
-					top = window.frameElement == null && document.documentElement;
-					} catch(e) {}
-					
-					if ( top && top.doScroll ) {
-						(function doScrollCheck() {
-							if ( !jQuery.isReady ) {
-								
-								try {
-									// Use the trick by Diego Perini
-									// http://javascript.nwbox.com/IEContentLoaded/
-									top.doScroll("left");
-									} catch(e) {
-									return setTimeout( doScrollCheck, 50 );
-								}
-								
-								// and execute any waiting functions
-								jQuery.ready();
-							}
-						})();
-					}
-				}
-			}
-			return readyList.promise( obj );
-		};
-		
-		// Populate the class2type map
-		jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-			class2type[ "[object " + name + "]" ] = name.toLowerCase();
-		});
-		
-		// All jQuery objects should point back to these
-		rootjQuery = jQuery(document);
-		// String to Object options format cache
-		var optionsCache = {};
-		
-		// Convert String-formatted options into Object-formatted ones and store in cache
-		function createOptions( options ) {
-			var object = optionsCache[ options ] = {};
-			jQuery.each( options.split( core_rspace ), function( _, flag ) {
-				object[ flag ] = true;
-			});
-			return object;
-		}
-		
-		/*
-		* Create a callback list using the following parameters:
-		*
-		*	options: an optional list of space-separated options that will change how
-		*			the callback list behaves or a more traditional option object
-		*
-		* By default a callback list will act like an event callback list and can be
-		* "fired" multiple times.
-		*
-		* Possible options:
-		*
-		*	once:			will ensure the callback list can only be fired once (like a Deferred)
-		*
-		*	memory:			will keep track of previous values and will call any callback added
-		*					after the list has been fired right away with the latest "memorized"
-		*					values (like a Deferred)
-		*
-		*	unique:			will ensure a callback can only be added once (no duplicate in the list)
-		*
-		*	stopOnFalse:	interrupt callings when a callback returns false
-		*
-		*/
-		jQuery.Callbacks = function( options ) {
-			
-			// Convert options from String-formatted to Object-formatted if needed
-			// (we check in cache first)
-			options = typeof options === "string" ?
-			( optionsCache[ options ] || createOptions( options ) ) :
-			jQuery.extend( {}, options );
-			
-			var // Last fire value (for non-forgettable lists)
-			memory,
-			// Flag to know if list was already fired
-			fired,
-			// Flag to know if list is currently firing
-			firing,
-			// First callback to fire (used internally by add and fireWith)
-			firingStart,
-			// End of the loop when firing
-			firingLength,
-			// Index of currently firing callback (modified by remove if needed)
-			firingIndex,
-			// Actual callback list
-			list = [],
-			// Stack of fire calls for repeatable lists
-			stack = !options.once && [],
-			// Fire callbacks
-			fire = function( data ) {
-				memory = options.memory && data;
-				fired = true;
-				firingIndex = firingStart || 0;
-				firingStart = 0;
-				firingLength = list.length;
-				firing = true;
-				for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-					if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
-						memory = false; // To prevent further calls using add
-						break;
-					}
-				}
-				firing = false;
-				if ( list ) {
-					if ( stack ) {
-						if ( stack.length ) {
-							fire( stack.shift() );
-						}
-						} else if ( memory ) {
-						list = [];
-						} else {
-						self.disable();
-					}
-				}
-			},
-			// Actual Callbacks object
-			self = {
-				// Add a callback or a collection of callbacks to the list
-				add: function() {
-					if ( list ) {
-						// First, we save the current length
-						var start = list.length;
-						(function add( args ) {
-							jQuery.each( args, function( _, arg ) {
-								var type = jQuery.type( arg );
-								if ( type === "function" ) {
-									if ( !options.unique || !self.has( arg ) ) {
-										list.push( arg );
-									}
-									} else if ( arg && arg.length && type !== "string" ) {
-									// Inspect recursively
-									add( arg );
-								}
-							});
-						})( arguments );
-						// Do we need to add the callbacks to the
-						// current firing batch?
-						if ( firing ) {
-							firingLength = list.length;
-							// With memory, if we're not firing then
-							// we should call right away
-							} else if ( memory ) {
-							firingStart = start;
-							fire( memory );
-						}
-					}
-					return this;
-				},
-				// Remove a callback from the list
-				remove: function() {
-					if ( list ) {
-						jQuery.each( arguments, function( _, arg ) {
-							var index;
-							while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-								list.splice( index, 1 );
-								// Handle firing indexes
-								if ( firing ) {
-									if ( index <= firingLength ) {
-										firingLength--;
-									}
-									if ( index <= firingIndex ) {
-										firingIndex--;
-									}
-								}
-							}
-						});
-					}
-					return this;
-				},
-				// Control if a given callback is in the list
-				has: function( fn ) {
-					return jQuery.inArray( fn, list ) > -1;
-				},
-				// Remove all callbacks from the list
-				empty: function() {
-					list = [];
-					return this;
-				},
-				// Have the list do nothing anymore
-				disable: function() {
-					list = stack = memory = undefined;
-					return this;
-				},
-				// Is it disabled?
-				disabled: function() {
-					return !list;
-				},
-				// Lock the list in its current state
-				lock: function() {
-					stack = undefined;
-					if ( !memory ) {
-						self.disable();
-					}
-					return this;
-				},
-				// Is it locked?
-				locked: function() {
-					return !stack;
-				},
-				// Call all callbacks with the given context and arguments
-				fireWith: function( context, args ) {
-					args = args || [];
-					args = [ context, args.slice ? args.slice() : args ];
-					if ( list && ( !fired || stack ) ) {
-						if ( firing ) {
-							stack.push( args );
-							} else {
-							fire( args );
-						}
-					}
-					return this;
-				},
-				// Call all the callbacks with the given arguments
-				fire: function() {
-					self.fireWith( this, arguments );
-					return this;
-				},
-				// To know if the callbacks have already been called at least once
-				fired: function() {
-					return !!fired;
-				}
-			};
-			
-			return self;
-		};
-		jQuery.extend({
-			
-			Deferred: function( func ) {
-				var tuples = [
-				// action, add listener, listener list, final state
-				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
-				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
-				[ "notify", "progress", jQuery.Callbacks("memory") ]
-				],
-				state = "pending",
-				promise = {
-					state: function() {
-						return state;
-					},
-					always: function() {
-						deferred.done( arguments ).fail( arguments );
-						return this;
-					},
-					then: function( /* fnDone, fnFail, fnProgress */ ) {
-						var fns = arguments;
-						return jQuery.Deferred(function( newDefer ) {
-							jQuery.each( tuples, function( i, tuple ) {
-								var action = tuple[ 0 ],
-								fn = fns[ i ];
-								// deferred[ done | fail | progress ] for forwarding actions to newDefer
-								deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
-								function() {
-									var returned = fn.apply( this, arguments );
-									if ( returned && jQuery.isFunction( returned.promise ) ) {
-										returned.promise()
-										.done( newDefer.resolve )
-										.fail( newDefer.reject )
-										.progress( newDefer.notify );
-										} else {
-										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
-									}
-								} :
-								newDefer[ action ]
-								);
-							});
-							fns = null;
-						}).promise();
-					},
-					// Get a promise for this deferred
-					// If obj is provided, the promise aspect is added to the object
-					promise: function( obj ) {
-						return obj != null ? jQuery.extend( obj, promise ) : promise;
-					}
-				},
-				deferred = {};
-				
-				// Keep pipe for back-compat
-				promise.pipe = promise.then;
-				
-				// Add list-specific methods
-				jQuery.each( tuples, function( i, tuple ) {
-					var list = tuple[ 2 ],
-					stateString = tuple[ 3 ];
-					
-					// promise[ done | fail | progress ] = list.add
-					promise[ tuple[1] ] = list.add;
-					
-					// Handle state
-					if ( stateString ) {
-						list.add(function() {
-							// state = [ resolved | rejected ]
-							state = stateString;
-							
-							// [ reject_list | resolve_list ].disable; progress_list.lock
-						}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-					}
-					
-					// deferred[ resolve | reject | notify ] = list.fire
-					deferred[ tuple[0] ] = list.fire;
-					deferred[ tuple[0] + "With" ] = list.fireWith;
-				});
-				
-				// Make the deferred a promise
-				promise.promise( deferred );
-				
-				// Call given func if any
-				if ( func ) {
-					func.call( deferred, deferred );
-				}
-				
-				// All done!
-				return deferred;
-			},
-			
-			// Deferred helper
-			when: function( subordinate /* , ..., subordinateN */ ) {
-				var i = 0,
-				resolveValues = core_slice.call( arguments ),
-				length = resolveValues.length,
-				
-				// the count of uncompleted subordinates
-				remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-				
-				// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
-				deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-				
-				// Update function for both resolve and progress values
-				updateFunc = function( i, contexts, values ) {
-					return function( value ) {
-						contexts[ i ] = this;
-						values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
-						if( values === progressValues ) {
-							deferred.notifyWith( contexts, values );
-							} else if ( !( --remaining ) ) {
-							deferred.resolveWith( contexts, values );
-						}
-					};
-				},
-				
-				progressValues, progressContexts, resolveContexts;
-				
-				// add listeners to Deferred subordinates; treat others as resolved
-				if ( length > 1 ) {
-					progressValues = new Array( length );
-					progressContexts = new Array( length );
-					resolveContexts = new Array( length );
-					for ( ; i < length; i++ ) {
-						if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-							resolveValues[ i ].promise()
-							.done( updateFunc( i, resolveContexts, resolveValues ) )
-							.fail( deferred.reject )
-							.progress( updateFunc( i, progressContexts, progressValues ) );
-							} else {
-							--remaining;
-						}
-					}
-				}
-				
-				// if we're not waiting on anything, resolve the master
-				if ( !remaining ) {
-					deferred.resolveWith( resolveContexts, resolveValues );
-				}
-				
-				return deferred.promise();
-			}
-		});
-		jQuery.support = (function() {
-			
-			var support,
-			all,
-			a,
-			select,
-			opt,
-			input,
-			fragment,
-			eventName,
-			i,
-			isSupported,
-			clickFn,
-			div = document.createElement("div");
-			
-			// Setup
-			div.setAttribute( "className", "t" );
-			div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-			
-			// Support tests won't run in some limited or non-browser environments
-			all = div.getElementsByTagName("*");
-			a = div.getElementsByTagName("a")[ 0 ];
-			if ( !all || !a || !all.length ) {
-				return {};
-			}
-			
-			// First batch of tests
-			select = document.createElement("select");
-			opt = select.appendChild( document.createElement("option") );
-			input = div.getElementsByTagName("input")[ 0 ];
-			
-			a.style.cssText = "top:1px;float:left;opacity:.5";
-			support = {
-				// IE strips leading whitespace when .innerHTML is used
-				leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-				
-				// Make sure that tbody elements aren't automatically inserted
-				// IE will insert them into empty tables
-				tbody: !div.getElementsByTagName("tbody").length,
-				
-				// Make sure that link elements get serialized correctly by innerHTML
-				// This requires a wrapper element in IE
-				htmlSerialize: !!div.getElementsByTagName("link").length,
-				
-				// Get the style information from getAttribute
-				// (IE uses .cssText instead)
-				style: /top/.test( a.getAttribute("style") ),
-				
-				// Make sure that URLs aren't manipulated
-				// (IE normalizes it by default)
-				hrefNormalized: ( a.getAttribute("href") === "/a" ),
-				
-				// Make sure that element opacity exists
-				// (IE uses filter instead)
-				// Use a regex to work around a WebKit issue. See #5145
-				opacity: /^0.5/.test( a.style.opacity ),
-				
-				// Verify style float existence
-				// (IE uses styleFloat instead of cssFloat)
-				cssFloat: !!a.style.cssFloat,
-				
-				// Make sure that if no value is specified for a checkbox
-				// that it defaults to "on".
-				// (WebKit defaults to "" instead)
-				checkOn: ( input.value === "on" ),
-				
-				// Make sure that a selected-by-default option has a working selected property.
-				// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-				optSelected: opt.selected,
-				
-				// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-				getSetAttribute: div.className !== "t",
-				
-				// Tests for enctype support on a form (#6743)
-				enctype: !!document.createElement("form").enctype,
-				
-				// Makes sure cloning an html5 element does not cause problems
-				// Where outerHTML is undefined, this still works
-				html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-				
-				// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
-				boxModel: ( document.compatMode === "CSS1Compat" ),
-				
-				// Will be defined later
-				submitBubbles: true,
-				changeBubbles: true,
-				focusinBubbles: false,
-				deleteExpando: true,
-				noCloneEvent: true,
-				inlineBlockNeedsLayout: false,
-				shrinkWrapBlocks: false,
-				reliableMarginRight: true,
-				boxSizingReliable: true,
-				pixelPosition: false
-			};
-			
-			// Make sure checked status is properly cloned
-			input.checked = true;
-			support.noCloneChecked = input.cloneNode( true ).checked;
-			
-			// Make sure that the options inside disabled selects aren't marked as disabled
-			// (WebKit marks them as disabled)
-			select.disabled = true;
-			support.optDisabled = !opt.disabled;
-			
-			// Test to see if it's possible to delete an expando from an element
-			// Fails in Internet Explorer
-			try {
-				delete div.test;
-				} catch( e ) {
-				support.deleteExpando = false;
-			}
-			
-			if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-				div.attachEvent( "onclick", clickFn = function() {
-					// Cloning a node shouldn't copy over any
-					// bound event handlers (IE does this)
-					support.noCloneEvent = false;
-				});
-				div.cloneNode( true ).fireEvent("onclick");
-				div.detachEvent( "onclick", clickFn );
-			}
-			
-			// Check if a radio maintains its value
-			// after being appended to the DOM
-			input = document.createElement("input");
-			input.value = "t";
-			input.setAttribute( "type", "radio" );
-			support.radioValue = input.value === "t";
-			
-			input.setAttribute( "checked", "checked" );
-			
-			// #11217 - WebKit loses check when the name is after the checked attribute
-			input.setAttribute( "name", "t" );
-			
-			div.appendChild( input );
-			fragment = document.createDocumentFragment();
-			fragment.appendChild( div.lastChild );
-			
-			// WebKit doesn't clone checked state correctly in fragments
-			support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-			
-			// Check if a disconnected checkbox will retain its checked
-			// value of true after appended to the DOM (IE6/7)
-			support.appendChecked = input.checked;
-			
-			fragment.removeChild( input );
-			fragment.appendChild( div );
-			
-			// Technique from Juriy Zaytsev
-			// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
-			// We only care about the case where non-standard event systems
-			// are used, namely in IE. Short-circuiting here helps us to
-			// avoid an eval call (in setAttribute) which can cause CSP
-			// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-			if ( div.attachEvent ) {
-				for ( i in {
-					submit: true,
-					change: true,
-					focusin: true
-					}) {
-					eventName = "on" + i;
-					isSupported = ( eventName in div );
-					if ( !isSupported ) {
-						div.setAttribute( eventName, "return;" );
-						isSupported = ( typeof div[ eventName ] === "function" );
-					}
-					support[ i + "Bubbles" ] = isSupported;
-				}
-			}
-			
-			// Run tests that need a body at doc ready
-			jQuery(function() {
-				var container, div, tds, marginDiv,
-				divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
-				body = document.getElementsByTagName("body")[0];
-				
-				if ( !body ) {
-					// Return for frameset docs that don't have a body
-					return;
-				}
-				
-				container = document.createElement("div");
-				container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
-				body.insertBefore( container, body.firstChild );
-				
-				// Construct the test element
-				div = document.createElement("div");
-				container.appendChild( div );
-				
-				// Check if table cells still have offsetWidth/Height when they are set
-				// to display:none and there are still other visible table cells in a
-				// table row; if so, offsetWidth/Height are not reliable for use when
-				// determining if an element has been hidden directly using
-				// display:none (it is still safe to use offsets if a parent element is
-				// hidden; don safety goggles and see bug #4512 for more information).
-				// (only IE 8 fails this test)
-				div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-				tds = div.getElementsByTagName("td");
-				tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
-				isSupported = ( tds[ 0 ].offsetHeight === 0 );
-				
-				tds[ 0 ].style.display = "";
-				tds[ 1 ].style.display = "none";
-				
-				// Check if empty table cells still have offsetWidth/Height
-				// (IE <= 8 fail this test)
-				support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-				
-				// Check box-sizing and margin behavior
-				div.innerHTML = "";
-				div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
-				support.boxSizing = ( div.offsetWidth === 4 );
-				support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
-				
-				// NOTE: To any future maintainer, we've window.getComputedStyle
-				// because jsdom on node.js will break without it.
-				if ( window.getComputedStyle ) {
-					support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
-					support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-					
-					// Check if div with explicit width and no margin-right incorrectly
-					// gets computed margin-right based on width of container. For more
-					// info see bug #3333
-					// Fails in WebKit before Feb 2011 nightlies
-					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-					marginDiv = document.createElement("div");
-					marginDiv.style.cssText = div.style.cssText = divReset;
-					marginDiv.style.marginRight = marginDiv.style.width = "0";
-					div.style.width = "1px";
-					div.appendChild( marginDiv );
-					support.reliableMarginRight =
-					!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
-				}
-				
-				if ( typeof div.style.zoom !== "undefined" ) {
-					// Check if natively block-level elements act like inline-block
-					// elements when setting their display to 'inline' and giving
-					// them layout
-					// (IE < 8 does this)
-					div.innerHTML = "";
-					div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
-					support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-					
-					// Check if elements with layout shrink-wrap their children
-					// (IE 6 does this)
-					div.style.display = "block";
-					div.style.overflow = "visible";
-					div.innerHTML = "<div></div>";
-					div.firstChild.style.width = "5px";
-					support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-					
-					container.style.zoom = 1;
-				}
-				
-				// Null elements to avoid leaks in IE
-				body.removeChild( container );
-				container = div = tds = marginDiv = null;
-			});
-			
-			// Null elements to avoid leaks in IE
-			fragment.removeChild( div );
-			all = a = select = opt = input = fragment = div = null;
-			
-			return support;
-		})();
-		var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
-		rmultiDash = /([A-Z])/g;
-		
-		jQuery.extend({
-			cache: {},
-			
-			deletedIds: [],
-			
-			// Remove at next major release (1.9/2.0)
-			uuid: 0,
-			
-			// Unique for each copy of jQuery on the page
-			// Non-digits removed to match rinlinejQuery
-			expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-			
-			// The following elements throw uncatchable exceptions if you
-			// attempt to add expando properties to them.
-			noData: {
-				"embed": true,
-				// Ban all objects except for Flash (which handle expandos)
-				"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-				"applet": true
-			},
-			
-			hasData: function( elem ) {
-				elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-				return !!elem && !isEmptyDataObject( elem );
-			},
-			
-			data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-				if ( !jQuery.acceptData( elem ) ) {
-					return;
-				}
-				
-				var thisCache, ret,
-				internalKey = jQuery.expando,
-				getByName = typeof name === "string",
-				
-				// We have to handle DOM nodes and JS objects differently because IE6-7
-				// can't GC object references properly across the DOM-JS boundary
-				isNode = elem.nodeType,
-				
-				// Only DOM nodes need the global jQuery cache; JS object data is
-				// attached directly to the object so GC can occur automatically
-				cache = isNode ? jQuery.cache : elem,
-				
-				// Only defining an ID for JS objects if its cache already exists allows
-				// the code to shortcut on the same path as a DOM node with no cache
-				id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-				
-				// Avoid doing any more work than we need to when trying to get data on an
-				// object that has no data at all
-				if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
-					return;
-				}
-				
-				if ( !id ) {
-					// Only DOM nodes need a new unique ID for each element since their data
-					// ends up in the global cache
-					if ( isNode ) {
-						elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
-						} else {
-						id = internalKey;
-					}
-				}
-				
-				if ( !cache[ id ] ) {
-					cache[ id ] = {};
-					
-					// Avoids exposing jQuery metadata on plain JS objects when the object
-					// is serialized using JSON.stringify
-					if ( !isNode ) {
-						cache[ id ].toJSON = jQuery.noop;
-					}
-				}
-				
-				// An object can be passed to jQuery.data instead of a key/value pair; this gets
-				// shallow copied over onto the existing cache
-				if ( typeof name === "object" || typeof name === "function" ) {
-					if ( pvt ) {
-						cache[ id ] = jQuery.extend( cache[ id ], name );
-						} else {
-						cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-					}
-				}
-				
-				thisCache = cache[ id ];
-				
-				// jQuery data() is stored in a separate object inside the object's internal data
-				// cache in order to avoid key collisions between internal data and user-defined
-				// data.
-				if ( !pvt ) {
-					if ( !thisCache.data ) {
-						thisCache.data = {};
-					}
-					
-					thisCache = thisCache.data;
-				}
-				
-				if ( data !== undefined ) {
-					thisCache[ jQuery.camelCase( name ) ] = data;
-				}
-				
-				// Check for both converted-to-camel and non-converted data property names
-				// If a data property was specified
-				if ( getByName ) {
-					
-					// First Try to find as-is property data
-					ret = thisCache[ name ];
-					
-					// Test for null|undefined property data
-					if ( ret == null ) {
-						
-						// Try to find the camelCased property
-						ret = thisCache[ jQuery.camelCase( name ) ];
-					}
-					} else {
-					ret = thisCache;
-				}
-				
-				return ret;
-			},
-			
-			removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-				if ( !jQuery.acceptData( elem ) ) {
-					return;
-				}
-				
-				var thisCache, i, l,
-				
-				isNode = elem.nodeType,
-				
-				// See jQuery.data for more information
-				cache = isNode ? jQuery.cache : elem,
-				id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-				
-				// If there is already no cache entry for this object, there is no
-				// purpose in continuing
-				if ( !cache[ id ] ) {
-					return;
-				}
-				
-				if ( name ) {
-					
-					thisCache = pvt ? cache[ id ] : cache[ id ].data;
-					
-					if ( thisCache ) {
-						
-						// Support array or space separated string names for data keys
-						if ( !jQuery.isArray( name ) ) {
-							
-							// try the string as a key before any manipulation
-							if ( name in thisCache ) {
-								name = [ name ];
-								} else {
-								
-								// split the camel cased version by spaces unless a key with the spaces exists
-								name = jQuery.camelCase( name );
-								if ( name in thisCache ) {
-									name = [ name ];
-									} else {
-									name = name.split(" ");
-								}
-							}
-						}
-						
-						for ( i = 0, l = name.length; i < l; i++ ) {
-							delete thisCache[ name[i] ];
-						}
-						
-						// If there is no data left in the cache, we want to continue
-						// and let the cache object itself get destroyed
-						if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-							return;
-						}
-					}
-				}
-				
-				// See jQuery.data for more information
-				if ( !pvt ) {
-					delete cache[ id ].data;
-					
-					// Don't destroy the parent cache unless the internal data object
-					// had been the only thing left in it
-					if ( !isEmptyDataObject( cache[ id ] ) ) {
-						return;
-					}
-				}
-				
-				// Destroy the cache
-				if ( isNode ) {
-					jQuery.cleanData( [ elem ], true );
-					
-					// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-					} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
-					delete cache[ id ];
-					
-					// When all else fails, null
-					} else {
-					cache[ id ] = null;
-				}
-			},
-			
-			// For internal use only.
-			_data: function( elem, name, data ) {
-				return jQuery.data( elem, name, data, true );
-			},
-			
-			// A method for determining if a DOM node can handle the data expando
-			acceptData: function( elem ) {
-				var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
-				
-				// nodes accept data unless otherwise specified; rejection can be conditional
-				return !noData || noData !== true && elem.getAttribute("classid") === noData;
-			}
-		});
-		
-		jQuery.fn.extend({
-			data: function( key, value ) {
-				var parts, part, attr, name, l,
-				elem = this[0],
-				i = 0,
-				data = null;
-				
-				// Gets all values
-				if ( key === undefined ) {
-					if ( this.length ) {
-						data = jQuery.data( elem );
-						
-						if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-							attr = elem.attributes;
-							for ( l = attr.length; i < l; i++ ) {
-								name = attr[i].name;
-								
-								if ( !name.indexOf( "data-" ) ) {
-									name = jQuery.camelCase( name.substring(5) );
-									
-									dataAttr( elem, name, data[ name ] );
-								}
-							}
-							jQuery._data( elem, "parsedAttrs", true );
-						}
-					}
-					
-					return data;
-				}
-				
-				// Sets multiple values
-				if ( typeof key === "object" ) {
-					return this.each(function() {
-						jQuery.data( this, key );
-					});
-				}
-				
-				parts = key.split( ".", 2 );
-				parts[1] = parts[1] ? "." + parts[1] : "";
-				part = parts[1] + "!";
-				
-				return jQuery.access( this, function( value ) {
-					
-					if ( value === undefined ) {
-						data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-						
-						// Try to fetch any internally stored data first
-						if ( data === undefined && elem ) {
-							data = jQuery.data( elem, key );
-							data = dataAttr( elem, key, data );
-						}
-						
-						return data === undefined && parts[1] ?
-						this.data( parts[0] ) :
-						data;
-					}
-					
-					parts[1] = value;
-					this.each(function() {
-						var self = jQuery( this );
-						
-						self.triggerHandler( "setData" + part, parts );
-						jQuery.data( this, key, value );
-						self.triggerHandler( "changeData" + part, parts );
-					});
-				}, null, value, arguments.length > 1, null, false );
-			},
-			
-			removeData: function( key ) {
-				return this.each(function() {
-					jQuery.removeData( this, key );
-				});
-			}
-		});
-		
-		function dataAttr( elem, key, data ) {
-			// If nothing was found internally, try to fetch any
-			// data from the HTML5 data-* attribute
-			if ( data === undefined && elem.nodeType === 1 ) {
-				
-				var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-				
-				data = elem.getAttribute( name );
-				
-				if ( typeof data === "string" ) {
-					try {
-						data = data === "true" ? true :
-						data === "false" ? false :
-						data === "null" ? null :
-						// Only convert to a number if it doesn't change the string
-						+data + "" === data ? +data :
-						rbrace.test( data ) ? jQuery.parseJSON( data ) :
-						data;
-						} catch( e ) {}
-						
-						// Make sure we set the data so it isn't changed later
-						jQuery.data( elem, key, data );
-						
-						} else {
-						data = undefined;
-					}
-				}
-				
-				return data;
-			}
-			
-			// checks a cache object for emptiness
-			function isEmptyDataObject( obj ) {
-				var name;
-				for ( name in obj ) {
-					
-					// if the public data object is empty, the private is still empty
-					if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-						continue;
-					}
-					if ( name !== "toJSON" ) {
-						return false;
-					}
-				}
-				
-				return true;
-			}
-			jQuery.extend({
-				queue: function( elem, type, data ) {
-					var queue;
-					
-					if ( elem ) {
-						type = ( type || "fx" ) + "queue";
-						queue = jQuery._data( elem, type );
-						
-						// Speed up dequeue by getting out quickly if this is just a lookup
-						if ( data ) {
-							if ( !queue || jQuery.isArray(data) ) {
-								queue = jQuery._data( elem, type, jQuery.makeArray(data) );
-								} else {
-								queue.push( data );
-							}
-						}
-						return queue || [];
-					}
-				},
-				
-				dequeue: function( elem, type ) {
-					type = type || "fx";
-					
-					var queue = jQuery.queue( elem, type ),
-					startLength = queue.length,
-					fn = queue.shift(),
-					hooks = jQuery._queueHooks( elem, type ),
-					next = function() {
-						jQuery.dequeue( elem, type );
-					};
-					
-					// If the fx queue is dequeued, always remove the progress sentinel
-					if ( fn === "inprogress" ) {
-						fn = queue.shift();
-						startLength--;
-					}
-					
-					if ( fn ) {
-						
-						// Add a progress sentinel to prevent the fx queue from being
-						// automatically dequeued
-						if ( type === "fx" ) {
-							queue.unshift( "inprogress" );
-						}
-						
-						// clear up the last queue stop function
-						delete hooks.stop;
-						fn.call( elem, next, hooks );
-					}
-					
-					if ( !startLength && hooks ) {
-						hooks.empty.fire();
-					}
-				},
-				
-				// not intended for public consumption - generates a queueHooks object, or returns the current one
-				_queueHooks: function( elem, type ) {
-					var key = type + "queueHooks";
-					return jQuery._data( elem, key ) || jQuery._data( elem, key, {
-						empty: jQuery.Callbacks("once memory").add(function() {
-							jQuery.removeData( elem, type + "queue", true );
-							jQuery.removeData( elem, key, true );
-						})
-					});
-				}
-			});
-			
-			jQuery.fn.extend({
-				queue: function( type, data ) {
-					var setter = 2;
-					
-					if ( typeof type !== "string" ) {
-						data = type;
-						type = "fx";
-						setter--;
-					}
-					
-					if ( arguments.length < setter ) {
-						return jQuery.queue( this[0], type );
-					}
-					
-					return data === undefined ?
-					this :
-					this.each(function() {
-						var queue = jQuery.queue( this, type, data );
-						
-						// ensure a hooks for this queue
-						jQuery._queueHooks( this, type );
-						
-						if ( type === "fx" && queue[0] !== "inprogress" ) {
-							jQuery.dequeue( this, type );
-						}
-					});
-				},
-				dequeue: function( type ) {
-					return this.each(function() {
-						jQuery.dequeue( this, type );
-					});
-				},
-				// Based off of the plugin by Clint Helfers, with permission.
-				// http://blindsignals.com/index.php/2009/07/jquery-delay/
-				delay: function( time, type ) {
-					time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-					type = type || "fx";
-					
-					return this.queue( type, function( next, hooks ) {
-						var timeout = setTimeout( next, time );
-						hooks.stop = function() {
-							clearTimeout( timeout );
-						};
-					});
-				},
-				clearQueue: function( type ) {
-					return this.queue( type || "fx", [] );
-				},
-				// Get a promise resolved when queues of a certain type
-				// are emptied (fx is the type by default)
-				promise: function( type, obj ) {
-					var tmp,
-					count = 1,
-					defer = jQuery.Deferred(),
-					elements = this,
-					i = this.length,
-					resolve = function() {
-						if ( !( --count ) ) {
-							defer.resolveWith( elements, [ elements ] );
-						}
-					};
-					
-					if ( typeof type !== "string" ) {
-						obj = type;
-						type = undefined;
-					}
-					type = type || "fx";
-					
-					while( i-- ) {
-						tmp = jQuery._data( elements[ i ], type + "queueHooks" );
-						if ( tmp && tmp.empty ) {
-							count++;
-							tmp.empty.add( resolve );
-						}
-					}
-					resolve();
-					return defer.promise( obj );
-				}
-			});
-			var nodeHook, boolHook, fixSpecified,
-			rclass = /[\t\r\n]/g,
-			rreturn = /\r/g,
-			rtype = /^(?:button|input)$/i,
-			rfocusable = /^(?:button|input|object|select|textarea)$/i,
-			rclickable = /^a(?:rea|)$/i,
-			rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-			getSetAttribute = jQuery.support.getSetAttribute;
-			
-			jQuery.fn.extend({
-				attr: function( name, value ) {
-					return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
-				},
-				
-				removeAttr: function( name ) {
-					return this.each(function() {
-						jQuery.removeAttr( this, name );
-					});
-				},
-				
-				prop: function( name, value ) {
-					return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-				},
-				
-				removeProp: function( name ) {
-					name = jQuery.propFix[ name ] || name;
-					return this.each(function() {
-						// try/catch handles cases where IE balks (such as removing a property on window)
-						try {
-							this[ name ] = undefined;
-							delete this[ name ];
-							} catch( e ) {}
-						});
-					},
-					
-					addClass: function( value ) {
-						var classNames, i, l, elem,
-						setClass, c, cl;
-						
-						if ( jQuery.isFunction( value ) ) {
-							return this.each(function( j ) {
-								jQuery( this ).addClass( value.call(this, j, this.className) );
-							});
-						}
-						
-						if ( value && typeof value === "string" ) {
-							classNames = value.split( core_rspace );
-							
-							for ( i = 0, l = this.length; i < l; i++ ) {
-								elem = this[ i ];
-								
-								if ( elem.nodeType === 1 ) {
-									if ( !elem.className && classNames.length === 1 ) {
-										elem.className = value;
-										
-										} else {
-										setClass = " " + elem.className + " ";
-										
-										for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-											if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
-												setClass += classNames[ c ] + " ";
-											}
-										}
-										elem.className = jQuery.trim( setClass );
-									}
-								}
-							}
-						}
-						
-						return this;
-					},
-					
-					removeClass: function( value ) {
-						var removes, className, elem, c, cl, i, l;
-						
-						if ( jQuery.isFunction( value ) ) {
-							return this.each(function( j ) {
-								jQuery( this ).removeClass( value.call(this, j, this.className) );
-							});
-						}
-						if ( (value && typeof value === "string") || value === undefined ) {
-							removes = ( value || "" ).split( core_rspace );
-							
-							for ( i = 0, l = this.length; i < l; i++ ) {
-								elem = this[ i ];
-								if ( elem.nodeType === 1 && elem.className ) {
-									
-									className = (" " + elem.className + " ").replace( rclass, " " );
-									
-									// loop over each item in the removal list
-									for ( c = 0, cl = removes.length; c < cl; c++ ) {
-										// Remove until there is nothing to remove,
-										while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
-											className = className.replace( " " + removes[ c ] + " " , " " );
-										}
-									}
-									elem.className = value ? jQuery.trim( className ) : "";
-								}
-							}
-						}
-						
-						return this;
-					},
-					
-					toggleClass: function( value, stateVal ) {
-						var type = typeof value,
-						isBool = typeof stateVal === "boolean";
-						
-						if ( jQuery.isFunction( value ) ) {
-							return this.each(function( i ) {
-								jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-							});
-						}
-						
-						return this.each(function() {
-							if ( type === "string" ) {
-								// toggle individual class names
-								var className,
-								i = 0,
-								self = jQuery( this ),
-								state = stateVal,
-								classNames = value.split( core_rspace );
-								
-								while ( (className = classNames[ i++ ]) ) {
-									// check each className given, space separated list
-									state = isBool ? state : !self.hasClass( className );
-									self[ state ? "addClass" : "removeClass" ]( className );
-								}
-								
-								} else if ( type === "undefined" || type === "boolean" ) {
-								if ( this.className ) {
-									// store className if set
-									jQuery._data( this, "__className__", this.className );
-								}
-								
-								// toggle whole className
-								this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-							}
-						});
-					},
-					
-					hasClass: function( selector ) {
-						var className = " " + selector + " ",
-						i = 0,
-						l = this.length;
-						for ( ; i < l; i++ ) {
-							if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
-								return true;
-							}
-						}
-						
-						return false;
-					},
-					
-					val: function( value ) {
-						var hooks, ret, isFunction,
-						elem = this[0];
-						
-						if ( !arguments.length ) {
-							if ( elem ) {
-								hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-								
-								if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-									return ret;
-								}
-								
-								ret = elem.value;
-								
-								return typeof ret === "string" ?
-								// handle most common string cases
-								ret.replace(rreturn, "") :
-								// handle cases where value is null/undef or number
-								ret == null ? "" : ret;
-							}
-							
-							return;
-						}
-						
-						isFunction = jQuery.isFunction( value );
-						
-						return this.each(function( i ) {
-							var val,
-							self = jQuery(this);
-							
-							if ( this.nodeType !== 1 ) {
-								return;
-							}
-							
-							if ( isFunction ) {
-								val = value.call( this, i, self.val() );
-								} else {
-								val = value;
-							}
-							
-							// Treat null/undefined as ""; convert numbers to string
-							if ( val == null ) {
-								val = "";
-								} else if ( typeof val === "number" ) {
-								val += "";
-								} else if ( jQuery.isArray( val ) ) {
-								val = jQuery.map(val, function ( value ) {
-									return value == null ? "" : value + "";
-								});
-							}
-							
-							hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-							
-							// If set returns undefined, fall back to normal setting
-							if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-								this.value = val;
-							}
-						});
-					}
-				});
-				
-				jQuery.extend({
-					valHooks: {
-						option: {
-							get: function( elem ) {
-								// attributes.value is undefined in Blackberry 4.7 but
-								// uses .value. See #6932
-								var val = elem.attributes.value;
-								return !val || val.specified ? elem.value : elem.text;
-							}
-						},
-						select: {
-							get: function( elem ) {
-								var value, option,
-								options = elem.options,
-								index = elem.selectedIndex,
-								one = elem.type === "select-one" || index < 0,
-								values = one ? null : [],
-								max = one ? index + 1 : options.length,
-								i = index < 0 ?
-								max :
-								one ? index : 0;
-								
-								// Loop through all the selected options
-								for ( ; i < max; i++ ) {
-									option = options[ i ];
-									
-									// oldIE doesn't update selected after form reset (#2551)
-									if ( ( option.selected || i === index ) &&
-									// Don't return options that are disabled or in a disabled optgroup
-									( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
-									( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-										
-										// Get the specific value for the option
-										value = jQuery( option ).val();
-										
-										// We don't need an array for one selects
-										if ( one ) {
-											return value;
-										}
-										
-										// Multi-Selects return an array
-										values.push( value );
-									}
-								}
-								
-								return values;
-							},
-							
-							set: function( elem, value ) {
-								var values = jQuery.makeArray( value );
-								
-								jQuery(elem).find("option").each(function() {
-									this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-								});
-								
-								if ( !values.length ) {
-									elem.selectedIndex = -1;
-								}
-								return values;
-							}
-						}
-					},
-					
-					// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
-					attrFn: {},
-					
-					attr: function( elem, name, value, pass ) {
-						var ret, hooks, notxml,
-						nType = elem.nodeType;
-						
-						// don't get/set attributes on text, comment and attribute nodes
-						if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-							return;
-						}
-						
-						if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
-							return jQuery( elem )[ name ]( value );
-						}
-						
-						// Fallback to prop when attributes are not supported
-						if ( typeof elem.getAttribute === "undefined" ) {
-							return jQuery.prop( elem, name, value );
-						}
-						
-						notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-						
-						// All attributes are lowercase
-						// Grab necessary hook if one is defined
-						if ( notxml ) {
-							name = name.toLowerCase();
-							hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
-						}
-						
-						if ( value !== undefined ) {
-							
-							if ( value === null ) {
-								jQuery.removeAttr( elem, name );
-								return;
-								
-								} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
-								return ret;
-								
-								} else {
-								elem.setAttribute( name, value + "" );
-								return value;
-							}
-							
-							} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
-							return ret;
-							
-							} else {
-							
-							ret = elem.getAttribute( name );
-							
-							// Non-existent attributes return null, we normalize to undefined
-							return ret === null ?
-							undefined :
-							ret;
-						}
-					},
-					
-					removeAttr: function( elem, value ) {
-						var propName, attrNames, name, isBool,
-						i = 0;
-						
-						if ( value && elem.nodeType === 1 ) {
-							
-							attrNames = value.split( core_rspace );
-							
-							for ( ; i < attrNames.length; i++ ) {
-								name = attrNames[ i ];
-								
-								if ( name ) {
-									propName = jQuery.propFix[ name ] || name;
-									isBool = rboolean.test( name );
-									
-									// See #9699 for explanation of this approach (setting first, then removal)
-									// Do not do this for boolean attributes (see #10870)
-									if ( !isBool ) {
-										jQuery.attr( elem, name, "" );
-									}
-									elem.removeAttribute( getSetAttribute ? name : propName );
-									
-									// Set corresponding property to false for boolean attributes
-									if ( isBool && propName in elem ) {
-										elem[ propName ] = false;
-									}
-								}
-							}
-						}
-					},
-					
-					attrHooks: {
-						type: {
-							set: function( elem, value ) {
-								// We can't allow the type property to be changed (since it causes problems in IE)
-								if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
-									jQuery.error( "type property can't be changed" );
-									} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-									// Setting the type on a radio button after the value resets the value in IE6-9
-									// Reset value to it's default in case type is set after value
-									// This is for element creation
-									var val = elem.value;
-									elem.setAttribute( "type", value );
-									if ( val ) {
-										elem.value = val;
-									}
-									return value;
-								}
-							}
-						},
-						// Use the value property for back compat
-						// Use the nodeHook for button elements in IE6/7 (#1954)
-						value: {
-							get: function( elem, name ) {
-								if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-									return nodeHook.get( elem, name );
-								}
-								return name in elem ?
-								elem.value :
-								null;
-							},
-							set: function( elem, value, name ) {
-								if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-									return nodeHook.set( elem, value, name );
-								}
-								// Does not return so that setAttribute is also used
-								elem.value = value;
-							}
-						}
-					},
-					
-					propFix: {
-						tabindex: "tabIndex",
-						readonly: "readOnly",
-						"for": "htmlFor",
-						"class": "className",
-						maxlength: "maxLength",
-						cellspacing: "cellSpacing",
-						cellpadding: "cellPadding",
-						rowspan: "rowSpan",
-						colspan: "colSpan",
-						usemap: "useMap",
-						frameborder: "frameBorder",
-						contenteditable: "contentEditable"
-					},
-					
-					prop: function( elem, name, value ) {
-						var ret, hooks, notxml,
-						nType = elem.nodeType;
-						
-						// don't get/set properties on text, comment and attribute nodes
-						if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-							return;
-						}
-						
-						notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-						
-						if ( notxml ) {
-							// Fix name and attach hooks
-							name = jQuery.propFix[ name ] || name;
-							hooks = jQuery.propHooks[ name ];
-						}
-						
-						if ( value !== undefined ) {
-							if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-								return ret;
-								
-								} else {
-								return ( elem[ name ] = value );
-							}
-							
-							} else {
-							if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-								return ret;
-								
-								} else {
-								return elem[ name ];
-							}
-						}
-					},
-					
-					propHooks: {
-						tabIndex: {
-							get: function( elem ) {
-								// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-								// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-								var attributeNode = elem.getAttributeNode("tabindex");
-								
-								return attributeNode && attributeNode.specified ?
-								parseInt( attributeNode.value, 10 ) :
-								rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-								0 :
-								undefined;
-							}
-						}
-					}
-				});
-				
-				// Hook for boolean attributes
-				boolHook = {
-					get: function( elem, name ) {
-						// Align boolean attributes with corresponding properties
-						// Fall back to attribute presence where some booleans are not supported
-						var attrNode,
-						property = jQuery.prop( elem, name );
-						return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-						name.toLowerCase() :
-						undefined;
-					},
-					set: function( elem, value, name ) {
-						var propName;
-						if ( value === false ) {
-							// Remove boolean attributes when set to false
-							jQuery.removeAttr( elem, name );
-							} else {
-							// value is true since we know at this point it's type boolean and not false
-							// Set boolean attributes to the same name and set the DOM property
-							propName = jQuery.propFix[ name ] || name;
-							if ( propName in elem ) {
-								// Only set the IDL specifically if it already exists on the element
-								elem[ propName ] = true;
-							}
-							
-							elem.setAttribute( name, name.toLowerCase() );
-						}
-						return name;
-					}
-				};
-				
-				// IE6/7 do not support getting/setting some attributes with get/setAttribute
-				if ( !getSetAttribute ) {
-					
-					fixSpecified = {
-						name: true,
-						id: true,
-						coords: true
-					};
-					
-					// Use this for any attribute in IE6/7
-					// This fixes almost every IE6/7 issue
-					nodeHook = jQuery.valHooks.button = {
-						get: function( elem, name ) {
-							var ret;
-							ret = elem.getAttributeNode( name );
-							return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
-							ret.value :
-							undefined;
-						},
-						set: function( elem, value, name ) {
-							// Set the existing or create a new attribute node
-							var ret = elem.getAttributeNode( name );
-							if ( !ret ) {
-								ret = document.createAttribute( name );
-								elem.setAttributeNode( ret );
-							}
-							return ( ret.value = value + "" );
-						}
-					};
-					
-					// Set width and height to auto instead of 0 on empty string( Bug #8150 )
-					// This is for removals
-					jQuery.each([ "width", "height" ], function( i, name ) {
-						jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-							set: function( elem, value ) {
-								if ( value === "" ) {
-									elem.setAttribute( name, "auto" );
-									return value;
-								}
-							}
-						});
-					});
-					
-					// Set contenteditable to false on removals(#10429)
-					// Setting to empty string throws an error as an invalid value
-					jQuery.attrHooks.contenteditable = {
-						get: nodeHook.get,
-						set: function( elem, value, name ) {
-							if ( value === "" ) {
-								value = "false";
-							}
-							nodeHook.set( elem, value, name );
-						}
-					};
-				}
-				
-				
-				// Some attributes require a special call on IE
-				if ( !jQuery.support.hrefNormalized ) {
-					jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
-						jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-							get: function( elem ) {
-								var ret = elem.getAttribute( name, 2 );
-								return ret === null ? undefined : ret;
-							}
-						});
-					});
-				}
-				
-				if ( !jQuery.support.style ) {
-					jQuery.attrHooks.style = {
-						get: function( elem ) {
-							// Return undefined in the case of empty string
-							// Normalize to lowercase since IE uppercases css property names
-							return elem.style.cssText.toLowerCase() || undefined;
-						},
-						set: function( elem, value ) {
-							return ( elem.style.cssText = value + "" );
-						}
-					};
-				}
-				
-				// Safari mis-reports the default selected property of an option
-				// Accessing the parent's selectedIndex property fixes it
-				if ( !jQuery.support.optSelected ) {
-					jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
-						get: function( elem ) {
-							var parent = elem.parentNode;
-							
-							if ( parent ) {
-								parent.selectedIndex;
-								
-								// Make sure that it also works with optgroups, see #5701
-								if ( parent.parentNode ) {
-									parent.parentNode.selectedIndex;
-								}
-							}
-							return null;
-						}
-					});
-				}
-				
-				// IE6/7 call enctype encoding
-				if ( !jQuery.support.enctype ) {
-					jQuery.propFix.enctype = "encoding";
-				}
-				
-				// Radios and checkboxes getter/setter
-				if ( !jQuery.support.checkOn ) {
-					jQuery.each([ "radio", "checkbox" ], function() {
-						jQuery.valHooks[ this ] = {
-							get: function( elem ) {
-								// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-								return elem.getAttribute("value") === null ? "on" : elem.value;
-							}
-						};
-					});
-				}
-				jQuery.each([ "radio", "checkbox" ], function() {
-					jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
-						set: function( elem, value ) {
-							if ( jQuery.isArray( value ) ) {
-								return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-							}
-						}
-					});
-				});
-				var rformElems = /^(?:textarea|input|select)$/i,
-				rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
-				rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
-				rkeyEvent = /^key/,
-				rmouseEvent = /^(?:mouse|contextmenu)|click/,
-				rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-				hoverHack = function( events ) {
-					return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
-				};
-				
-				/*
-				* Helper functions for managing events -- not part of the public interface.
-				* Props to Dean Edwards' addEvent library for many of the ideas.
-				*/
-				jQuery.event = {
-					
-					add: function( elem, types, handler, data, selector ) {
-						
-						var elemData, eventHandle, events,
-						t, tns, type, namespaces, handleObj,
-						handleObjIn, handlers, special;
-						
-						// Don't attach events to noData or text/comment nodes (allow plain objects tho)
-						if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
-							return;
-						}
-						
-						// Caller can pass in an object of custom data in lieu of the handler
-						if ( handler.handler ) {
-							handleObjIn = handler;
-							handler = handleObjIn.handler;
-							selector = handleObjIn.selector;
-						}
-						
-						// Make sure that the handler has a unique ID, used to find/remove it later
-						if ( !handler.guid ) {
-							handler.guid = jQuery.guid++;
-						}
-						
-						// Init the element's event structure and main handler, if this is the first
-						events = elemData.events;
-						if ( !events ) {
-							elemData.events = events = {};
-						}
-						eventHandle = elemData.handle;
-						if ( !eventHandle ) {
-							elemData.handle = eventHandle = function( e ) {
-								// Discard the second event of a jQuery.event.trigger() and
-								// when an event is called after a page has unloaded
-								return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
-								jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-								undefined;
-							};
-							// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-							eventHandle.elem = elem;
-						}
-						
-						// Handle multiple events separated by a space
-						// jQuery(...).bind("mouseover mouseout", fn);
-						types = jQuery.trim( hoverHack(types) ).split( " " );
-						for ( t = 0; t < types.length; t++ ) {
-							
-							tns = rtypenamespace.exec( types[t] ) || [];
-							type = tns[1];
-							namespaces = ( tns[2] || "" ).split( "." ).sort();
-							
-							// If event changes its type, use the special event handlers for the changed type
-							special = jQuery.event.special[ type ] || {};
-							
-							// If selector defined, determine special event api type, otherwise given type
-							type = ( selector ? special.delegateType : special.bindType ) || type;
-							
-							// Update special based on newly reset type
-							special = jQuery.event.special[ type ] || {};
-							
-							// handleObj is passed to all event handlers
-							handleObj = jQuery.extend({
-								type: type,
-								origType: tns[1],
-								data: data,
-								handler: handler,
-								guid: handler.guid,
-								selector: selector,
-								needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-								namespace: namespaces.join(".")
-							}, handleObjIn );
-							
-							// Init the event handler queue if we're the first
-							handlers = events[ type ];
-							if ( !handlers ) {
-								handlers = events[ type ] = [];
-								handlers.delegateCount = 0;
-								
-								// Only use addEventListener/attachEvent if the special events handler returns false
-								if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-									// Bind the global event handler to the element
-									if ( elem.addEventListener ) {
-										elem.addEventListener( type, eventHandle, false );
-										
-										} else if ( elem.attachEvent ) {
-										elem.attachEvent( "on" + type, eventHandle );
-									}
-								}
-							}
-							
-							if ( special.add ) {
-								special.add.call( elem, handleObj );
-								
-								if ( !handleObj.handler.guid ) {
-									handleObj.handler.guid = handler.guid;
-								}
-							}
-							
-							// Add to the element's handler list, delegates in front
-							if ( selector ) {
-								handlers.splice( handlers.delegateCount++, 0, handleObj );
-								} else {
-								handlers.push( handleObj );
-							}
-							
-							// Keep track of which events have ever been used, for event optimization
-							jQuery.event.global[ type ] = true;
-						}
-						
-						// Nullify elem to prevent memory leaks in IE
-						elem = null;
-					},
-					
-					global: {},
-					
-					// Detach an event or set of events from an element
-					remove: function( elem, types, handler, selector, mappedTypes ) {
-						
-						var t, tns, type, origType, namespaces, origCount,
-						j, events, special, eventType, handleObj,
-						elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-						
-						if ( !elemData || !(events = elemData.events) ) {
-							return;
-						}
-						
-						// Once for each type.namespace in types; type may be omitted
-						types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
-						for ( t = 0; t < types.length; t++ ) {
-							tns = rtypenamespace.exec( types[t] ) || [];
-							type = origType = tns[1];
-							namespaces = tns[2];
-							
-							// Unbind all events (on this namespace, if provided) for the element
-							if ( !type ) {
-								for ( type in events ) {
-									jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-								}
-								continue;
-							}
-							
-							special = jQuery.event.special[ type ] || {};
-							type = ( selector? special.delegateType : special.bindType ) || type;
-							eventType = events[ type ] || [];
-							origCount = eventType.length;
-							namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-							
-							// Remove matching events
-							for ( j = 0; j < eventType.length; j++ ) {
-								handleObj = eventType[ j ];
-								
-								if ( ( mappedTypes || origType === handleObj.origType ) &&
-								( !handler || handler.guid === handleObj.guid ) &&
-								( !namespaces || namespaces.test( handleObj.namespace ) ) &&
-								( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-									eventType.splice( j--, 1 );
-									
-									if ( handleObj.selector ) {
-										eventType.delegateCount--;
-									}
-									if ( special.remove ) {
-										special.remove.call( elem, handleObj );
-									}
-								}
-							}
-							
-							// Remove generic event handler if we removed something and no more handlers exist
-							// (avoids potential for endless recursion during removal of special event handlers)
-							if ( eventType.length === 0 && origCount !== eventType.length ) {
-								if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-									jQuery.removeEvent( elem, type, elemData.handle );
-								}
-								
-								delete events[ type ];
-							}
-						}
-						
-						// Remove the expando if it's no longer used
-						if ( jQuery.isEmptyObject( events ) ) {
-							delete elemData.handle;
-							
-							// removeData also checks for emptiness and clears the expando if empty
-							// so use it instead of delete
-							jQuery.removeData( elem, "events", true );
-						}
-					},
-					
-					// Events that are safe to short-circuit if no handlers are attached.
-					// Native DOM events should not be added, they may have inline handlers.
-					customEvent: {
-						"getData": true,
-						"setData": true,
-						"changeData": true
-					},
-					
-					trigger: function( event, data, elem, onlyHandlers ) {
-						// Don't do events on text and comment nodes
-						if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
-							return;
-						}
-						
-						// Event object or event type
-						var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
-						type = event.type || event,
-						namespaces = [];
-						
-						// focus/blur morphs to focusin/out; ensure we're not firing them right now
-						if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-							return;
-						}
-						
-						if ( type.indexOf( "!" ) >= 0 ) {
-							// Exclusive events trigger only for the exact event (no namespaces)
-							type = type.slice(0, -1);
-							exclusive = true;
-						}
-						
-						if ( type.indexOf( "." ) >= 0 ) {
-							// Namespaced trigger; create a regexp to match event type in handle()
-							namespaces = type.split(".");
-							type = namespaces.shift();
-							namespaces.sort();
-						}
-						
-						if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
-							// No jQuery handlers for this event type, and it can't have inline handlers
-							return;
-						}
-						
-						// Caller can pass in an Event, Object, or just an event type string
-						event = typeof event === "object" ?
-						// jQuery.Event object
-						event[ jQuery.expando ] ? event :
-						// Object literal
-						new jQuery.Event( type, event ) :
-						// Just the event type (string)
-						new jQuery.Event( type );
-						
-						event.type = type;
-						event.isTrigger = true;
-						event.exclusive = exclusive;
-						event.namespace = namespaces.join( "." );
-						event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-						ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-						
-						// Handle a global trigger
-						if ( !elem ) {
-							
-							// TODO: Stop taunting the data cache; remove global events and always attach to document
-							cache = jQuery.cache;
-							for ( i in cache ) {
-								if ( cache[ i ].events && cache[ i ].events[ type ] ) {
-									jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
-								}
-							}
-							return;
-						}
-						
-						// Clean up the event in case it is being reused
-						event.result = undefined;
-						if ( !event.target ) {
-							event.target = elem;
-						}
-						
-						// Clone any incoming data and prepend the event, creating the handler arg list
-						data = data != null ? jQuery.makeArray( data ) : [];
-						data.unshift( event );
-						
-						// Allow special events to draw outside the lines
-						special = jQuery.event.special[ type ] || {};
-						if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
-							return;
-						}
-						
-						// Determine event propagation path in advance, per W3C events spec (#9951)
-						// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-						eventPath = [[ elem, special.bindType || type ]];
-						if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-							
-							bubbleType = special.delegateType || type;
-							cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
-							for ( old = elem; cur; cur = cur.parentNode ) {
-								eventPath.push([ cur, bubbleType ]);
-								old = cur;
-							}
-							
-							// Only add window if we got to document (e.g., not plain obj or detached DOM)
-							if ( old === (elem.ownerDocument || document) ) {
-								eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
-							}
-						}
-						
-						// Fire handlers on the event path
-						for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-							
-							cur = eventPath[i][0];
-							event.type = eventPath[i][1];
-							
-							handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-							if ( handle ) {
-								handle.apply( cur, data );
-							}
-							// Note that this is a bare JS function and not a jQuery handler
-							handle = ontype && cur[ ontype ];
-							if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
-								event.preventDefault();
-							}
-						}
-						event.type = type;
-						
-						// If nobody prevented the default action, do it now
-						if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-							
-							if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-							!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-								
-								// Call a native DOM method on the target with the same name name as the event.
-								// Can't use an .isFunction() check here because IE6/7 fails that test.
-								// Don't do default actions on window, that's where global variables be (#6170)
-								// IE<9 dies on focus/blur to hidden element (#1486)
-								if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-									
-									// Don't re-trigger an onFOO event when we call its FOO() method
-									old = elem[ ontype ];
-									
-									if ( old ) {
-										elem[ ontype ] = null;
-									}
-									
-									// Prevent re-triggering of the same event, since we already bubbled it above
-									jQuery.event.triggered = type;
-									elem[ type ]();
-									jQuery.event.triggered = undefined;
-									
-									if ( old ) {
-										elem[ ontype ] = old;
-									}
-								}
-							}
-						}
-						
-						return event.result;
-					},
-					
-					dispatch: function( event ) {
-						
-						// Make a writable jQuery.Event from the native event object
-						event = jQuery.event.fix( event || window.event );
-						
-						var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
-						handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
-						delegateCount = handlers.delegateCount,
-						args = core_slice.call( arguments ),
-						run_all = !event.exclusive && !event.namespace,
-						special = jQuery.event.special[ event.type ] || {},
-						handlerQueue = [];
-						
-						// Use the fix-ed jQuery.Event rather than the (read-only) native event
-						args[0] = event;
-						event.delegateTarget = this;
-						
-						// Call the preDispatch hook for the mapped type, and let it bail if desired
-						if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-							return;
-						}
-						
-						// Determine handlers that should run if there are delegated events
-						// Avoid non-left-click bubbling in Firefox (#3861)
-						if ( delegateCount && !(event.button && event.type === "click") ) {
-							
-							for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-								
-								// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
-								if ( cur.disabled !== true || event.type !== "click" ) {
-									selMatch = {};
-									matches = [];
-									for ( i = 0; i < delegateCount; i++ ) {
-										handleObj = handlers[ i ];
-										sel = handleObj.selector;
-										
-										if ( selMatch[ sel ] === undefined ) {
-											selMatch[ sel ] = handleObj.needsContext ?
-											jQuery( sel, this ).index( cur ) >= 0 :
-											jQuery.find( sel, this, null, [ cur ] ).length;
-										}
-										if ( selMatch[ sel ] ) {
-											matches.push( handleObj );
-										}
-									}
-									if ( matches.length ) {
-										handlerQueue.push({ elem: cur, matches: matches });
-									}
-								}
-							}
-						}
-						
-						// Add the remaining (directly-bound) handlers
-						if ( handlers.length > delegateCount ) {
-							handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
-						}
-						
-						// Run delegates first; they may want to stop propagation beneath us
-						for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
-							matched = handlerQueue[ i ];
-							event.currentTarget = matched.elem;
-							
-							for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
-								handleObj = matched.matches[ j ];
-								
-								// Triggered event must either 1) be non-exclusive and have no namespace, or
-								// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-								if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-									
-									event.data = handleObj.data;
-									event.handleObj = handleObj;
-									
-									ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-									.apply( matched.elem, args );
-									
-									if ( ret !== undefined ) {
-										event.result = ret;
-										if ( ret === false ) {
-											event.preventDefault();
-											event.stopPropagation();
-										}
-									}
-								}
-							}
-						}
-						
-						// Call the postDispatch hook for the mapped type
-						if ( special.postDispatch ) {
-							special.postDispatch.call( this, event );
-						}
-						
-						return event.result;
-					},
-					
-					// Includes some event props shared by KeyEvent and MouseEvent
-					// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
-					props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-					
-					fixHooks: {},
-					
-					keyHooks: {
-						props: "char charCode key keyCode".split(" "),
-						filter: function( event, original ) {
-							
-							// Add which for key events
-							if ( event.which == null ) {
-								event.which = original.charCode != null ? original.charCode : original.keyCode;
-							}
-							
-							return event;
-						}
-					},
-					
-					mouseHooks: {
-						props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-						filter: function( event, original ) {
-							var eventDoc, doc, body,
-							button = original.button,
-							fromElement = original.fromElement;
-							
-							// Calculate pageX/Y if missing and clientX/Y available
-							if ( event.pageX == null && original.clientX != null ) {
-								eventDoc = event.target.ownerDocument || document;
-								doc = eventDoc.documentElement;
-								body = eventDoc.body;
-								
-								event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-								event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-							}
-							
-							// Add relatedTarget, if necessary
-							if ( !event.relatedTarget && fromElement ) {
-								event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-							}
-							
-							// Add which for click: 1 === left; 2 === middle; 3 === right
-							// Note: button is not normalized, so don't use it
-							if ( !event.which && button !== undefined ) {
-								event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-							}
-							
-							return event;
-						}
-					},
-					
-					fix: function( event ) {
-						if ( event[ jQuery.expando ] ) {
-							return event;
-						}
-						
-						// Create a writable copy of the event object and normalize some properties
-						var i, prop,
-						originalEvent = event,
-						fixHook = jQuery.event.fixHooks[ event.type ] || {},
-						copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-						
-						event = jQuery.Event( originalEvent );
-						
-						for ( i = copy.length; i; ) {
-							prop = copy[ --i ];
-							event[ prop ] = originalEvent[ prop ];
-						}
-						
-						// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
-						if ( !event.target ) {
-							event.target = originalEvent.srcElement || document;
-						}
-						
-						// Target should not be a text node (#504, Safari)
-						if ( event.target.nodeType === 3 ) {
-							event.target = event.target.parentNode;
-						}
-						
-						// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
-						event.metaKey = !!event.metaKey;
-						
-						return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
-					},
-					
-					special: {
-						load: {
-							// Prevent triggered image.load events from bubbling to window.load
-							noBubble: true
-						},
-						
-						focus: {
-							delegateType: "focusin"
-						},
-						blur: {
-							delegateType: "focusout"
-						},
-						
-						beforeunload: {
-							setup: function( data, namespaces, eventHandle ) {
-								// We only want to do this special case on windows
-								if ( jQuery.isWindow( this ) ) {
-									this.onbeforeunload = eventHandle;
-								}
-							},
-							
-							teardown: function( namespaces, eventHandle ) {
-								if ( this.onbeforeunload === eventHandle ) {
-									this.onbeforeunload = null;
-								}
-							}
-						}
-					},
-					
-					simulate: function( type, elem, event, bubble ) {
-						// Piggyback on a donor event to simulate a different one.
-						// Fake originalEvent to avoid donor's stopPropagation, but if the
-						// simulated event prevents default then we do the same on the donor.
-						var e = jQuery.extend(
-						new jQuery.Event(),
-						event,
-						{ type: type,
-							isSimulated: true,
-							originalEvent: {}
-						}
-						);
-						if ( bubble ) {
-							jQuery.event.trigger( e, null, elem );
-							} else {
-							jQuery.event.dispatch.call( elem, e );
-						}
-						if ( e.isDefaultPrevented() ) {
-							event.preventDefault();
-						}
-					}
-				};
-				
-				// Some plugins are using, but it's undocumented/deprecated and will be removed.
-				// The 1.7 special event interface should provide all the hooks needed now.
-				jQuery.event.handle = jQuery.event.dispatch;
-				
-				jQuery.removeEvent = document.removeEventListener ?
-				function( elem, type, handle ) {
-					if ( elem.removeEventListener ) {
-						elem.removeEventListener( type, handle, false );
-					}
-				} :
-				function( elem, type, handle ) {
-					var name = "on" + type;
-					
-					if ( elem.detachEvent ) {
-						
-						// #8545, #7054, preventing memory leaks for custom events in IE6-8
-						// detachEvent needed property on element, by name of that event, to properly expose it to GC
-						if ( typeof elem[ name ] === "undefined" ) {
-							elem[ name ] = null;
-						}
-						
-						elem.detachEvent( name, handle );
-					}
-				};
-				
-				jQuery.Event = function( src, props ) {
-					// Allow instantiation without the 'new' keyword
-					if ( !(this instanceof jQuery.Event) ) {
-						return new jQuery.Event( src, props );
-					}
-					
-					// Event object
-					if ( src && src.type ) {
-						this.originalEvent = src;
-						this.type = src.type;
-						
-						// Events bubbling up the document may have been marked as prevented
-						// by a handler lower down the tree; reflect the correct value.
-						this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-						src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-						
-						// Event type
-						} else {
-						this.type = src;
-					}
-					
-					// Put explicitly provided properties onto the event object
-					if ( props ) {
-						jQuery.extend( this, props );
-					}
-					
-					// Create a timestamp if incoming event doesn't have one
-					this.timeStamp = src && src.timeStamp || jQuery.now();
-					
-					// Mark it as fixed
-					this[ jQuery.expando ] = true;
-				};
-				
-				function returnFalse() {
-					return false;
-				}
-				function returnTrue() {
-					return true;
-				}
-				
-				// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-				// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-				jQuery.Event.prototype = {
-					preventDefault: function() {
-						this.isDefaultPrevented = returnTrue;
-						
-						var e = this.originalEvent;
-						if ( !e ) {
-							return;
-						}
-						
-						// if preventDefault exists run it on the original event
-						if ( e.preventDefault ) {
-							e.preventDefault();
-							
-							// otherwise set the returnValue property of the original event to false (IE)
-							} else {
-							e.returnValue = false;
-						}
-					},
-					stopPropagation: function() {
-						this.isPropagationStopped = returnTrue;
-						
-						var e = this.originalEvent;
-						if ( !e ) {
-							return;
-						}
-						// if stopPropagation exists run it on the original event
-						if ( e.stopPropagation ) {
-							e.stopPropagation();
-						}
-						// otherwise set the cancelBubble property of the original event to true (IE)
-						e.cancelBubble = true;
-					},
-					stopImmediatePropagation: function() {
-						this.isImmediatePropagationStopped = returnTrue;
-						this.stopPropagation();
-					},
-					isDefaultPrevented: returnFalse,
-					isPropagationStopped: returnFalse,
-					isImmediatePropagationStopped: returnFalse
-				};
-				
-				// Create mouseenter/leave events using mouseover/out and event-time checks
-				jQuery.each({
-					mouseenter: "mouseover",
-					mouseleave: "mouseout"
-					}, function( orig, fix ) {
-					jQuery.event.special[ orig ] = {
-						delegateType: fix,
-						bindType: fix,
-						
-						handle: function( event ) {
-							var ret,
-							target = this,
-							related = event.relatedTarget,
-							handleObj = event.handleObj,
-							selector = handleObj.selector;
-							
-							// For mousenter/leave call the handler if related is outside the target.
-							// NB: No relatedTarget if the mouse left/entered the browser window
-							if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-								event.type = handleObj.origType;
-								ret = handleObj.handler.apply( this, arguments );
-								event.type = fix;
-							}
-							return ret;
-						}
-					};
-				});
-				
-				// IE submit delegation
-				if ( !jQuery.support.submitBubbles ) {
-					
-					jQuery.event.special.submit = {
-						setup: function() {
-							// Only need this for delegated form submit events
-							if ( jQuery.nodeName( this, "form" ) ) {
-								return false;
-							}
-							
-							// Lazy-add a submit handler when a descendant form may potentially be submitted
-							jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-								// Node name check avoids a VML-related crash in IE (#9807)
-								var elem = e.target,
-								form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-								if ( form && !jQuery._data( form, "_submit_attached" ) ) {
-									jQuery.event.add( form, "submit._submit", function( event ) {
-										event._submit_bubble = true;
-									});
-									jQuery._data( form, "_submit_attached", true );
-								}
-							});
-							// return undefined since we don't need an event listener
-						},
-						
-						postDispatch: function( event ) {
-							// If form was submitted by the user, bubble the event up the tree
-							if ( event._submit_bubble ) {
-								delete event._submit_bubble;
-								if ( this.parentNode && !event.isTrigger ) {
-									jQuery.event.simulate( "submit", this.parentNode, event, true );
-								}
-							}
-						},
-						
-						teardown: function() {
-							// Only need this for delegated form submit events
-							if ( jQuery.nodeName( this, "form" ) ) {
-								return false;
-							}
-							
-							// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-							jQuery.event.remove( this, "._submit" );
-						}
-					};
-				}
-				
-				// IE change delegation and checkbox/radio fix
-				if ( !jQuery.support.changeBubbles ) {
-					
-					jQuery.event.special.change = {
-						
-						setup: function() {
-							
-							if ( rformElems.test( this.nodeName ) ) {
-								// IE doesn't fire change on a check/radio until blur; trigger it on click
-								// after a propertychange. Eat the blur-change in special.change.handle.
-								// This still fires onchange a second time for check/radio after blur.
-								if ( this.type === "checkbox" || this.type === "radio" ) {
-									jQuery.event.add( this, "propertychange._change", function( event ) {
-										if ( event.originalEvent.propertyName === "checked" ) {
-											this._just_changed = true;
-										}
-									});
-									jQuery.event.add( this, "click._change", function( event ) {
-										if ( this._just_changed && !event.isTrigger ) {
-											this._just_changed = false;
-										}
-										// Allow triggered, simulated change events (#11500)
-										jQuery.event.simulate( "change", this, event, true );
-									});
-								}
-								return false;
-							}
-							// Delegated event; lazy-add a change handler on descendant inputs
-							jQuery.event.add( this, "beforeactivate._change", function( e ) {
-								var elem = e.target;
-								
-								if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
-									jQuery.event.add( elem, "change._change", function( event ) {
-										if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-											jQuery.event.simulate( "change", this.parentNode, event, true );
-										}
-									});
-									jQuery._data( elem, "_change_attached", true );
-								}
-							});
-						},
-						
-						handle: function( event ) {
-							var elem = event.target;
-							
-							// Swallow native change events from checkbox/radio, we already triggered them above
-							if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-								return event.handleObj.handler.apply( this, arguments );
-							}
-						},
-						
-						teardown: function() {
-							jQuery.event.remove( this, "._change" );
-							
-							return !rformElems.test( this.nodeName );
-						}
-					};
-				}
-				
-				// Create "bubbling" focus and blur events
-				if ( !jQuery.support.focusinBubbles ) {
-					jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-					
-					// Attach a single capturing handler while someone wants focusin/focusout
-					var attaches = 0,
-					handler = function( event ) {
-						jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-					};
-					
-					jQuery.event.special[ fix ] = {
-						setup: function() {
-							if ( attaches++ === 0 ) {
-								document.addEventListener( orig, handler, true );
-							}
-						},
-						teardown: function() {
-							if ( --attaches === 0 ) {
-								document.removeEventListener( orig, handler, true );
-							}
-						}
-					};
-				});
-			}
-			
-			jQuery.fn.extend({
-				
-				on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-					var origFn, type;
-					
-					// Types can be a map of types/handlers
-					if ( typeof types === "object" ) {
-						// ( types-Object, selector, data )
-						if ( typeof selector !== "string" ) { // && selector != null
-							// ( types-Object, data )
-							data = data || selector;
-							selector = undefined;
-						}
-						for ( type in types ) {
-							this.on( type, selector, data, types[ type ], one );
-						}
-						return this;
-					}
-					
-					if ( data == null && fn == null ) {
-						// ( types, fn )
-						fn = selector;
-						data = selector = undefined;
-						} else if ( fn == null ) {
-						if ( typeof selector === "string" ) {
-							// ( types, selector, fn )
-							fn = data;
-							data = undefined;
-							} else {
-							// ( types, data, fn )
-							fn = data;
-							data = selector;
-							selector = undefined;
-						}
-					}
-					if ( fn === false ) {
-						fn = returnFalse;
-						} else if ( !fn ) {
-						return this;
-					}
-					
-					if ( one === 1 ) {
-						origFn = fn;
-						fn = function( event ) {
-							// Can use an empty set, since event contains the info
-							jQuery().off( event );
-							return origFn.apply( this, arguments );
-						};
-						// Use same guid so caller can remove using origFn
-						fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-					}
-					return this.each( function() {
-						jQuery.event.add( this, types, fn, data, selector );
-					});
-				},
-				one: function( types, selector, data, fn ) {
-					return this.on( types, selector, data, fn, 1 );
-				},
-				off: function( types, selector, fn ) {
-					var handleObj, type;
-					if ( types && types.preventDefault && types.handleObj ) {
-						// ( event )  dispatched jQuery.Event
-						handleObj = types.handleObj;
-						jQuery( types.delegateTarget ).off(
-						handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-						handleObj.selector,
-						handleObj.handler
-						);
-						return this;
-					}
-					if ( typeof types === "object" ) {
-						// ( types-object [, selector] )
-						for ( type in types ) {
-							this.off( type, selector, types[ type ] );
-						}
-						return this;
-					}
-					if ( selector === false || typeof selector === "function" ) {
-						// ( types [, fn] )
-						fn = selector;
-						selector = undefined;
-					}
-					if ( fn === false ) {
-						fn = returnFalse;
-					}
-					return this.each(function() {
-						jQuery.event.remove( this, types, fn, selector );
-					});
-				},
-				
-				bind: function( types, data, fn ) {
-					return this.on( types, null, data, fn );
-				},
-				unbind: function( types, fn ) {
-					return this.off( types, null, fn );
-				},
-				
-				live: function( types, data, fn ) {
-					jQuery( this.context ).on( types, this.selector, data, fn );
-					return this;
-				},
-				die: function( types, fn ) {
-					jQuery( this.context ).off( types, this.selector || "**", fn );
-					return this;
-				},
-				
-				delegate: function( selector, types, data, fn ) {
-					return this.on( types, selector, data, fn );
-				},
-				undelegate: function( selector, types, fn ) {
-					// ( namespace ) or ( selector, types [, fn] )
-					return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
-				},
-				
-				trigger: function( type, data ) {
-					return this.each(function() {
-						jQuery.event.trigger( type, data, this );
-					});
-				},
-				triggerHandler: function( type, data ) {
-					if ( this[0] ) {
-						return jQuery.event.trigger( type, data, this[0], true );
-					}
-				},
-				
-				toggle: function( fn ) {
-					// Save reference to arguments for access in closure
-					var args = arguments,
-					guid = fn.guid || jQuery.guid++,
-					i = 0,
-					toggler = function( event ) {
-						// Figure out which function to execute
-						var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-						jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-						
-						// Make sure that clicks stop
-						event.preventDefault();
-						
-						// and execute the function
-						return args[ lastToggle ].apply( this, arguments ) || false;
-					};
-					
-					// link all the functions, so any of them can unbind this click handler
-					toggler.guid = guid;
-					while ( i < args.length ) {
-						args[ i++ ].guid = guid;
-					}
-					
-					return this.click( toggler );
-				},
-				
-				hover: function( fnOver, fnOut ) {
-					return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-				}
-			});
-			
-			jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-			"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-			"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-				
-				// Handle event binding
-				jQuery.fn[ name ] = function( data, fn ) {
-					if ( fn == null ) {
-						fn = data;
-						data = null;
-					}
-					
-					return arguments.length > 0 ?
-					this.on( name, null, data, fn ) :
-					this.trigger( name );
-				};
-				
-				if ( rkeyEvent.test( name ) ) {
-					jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
-				}
-				
-				if ( rmouseEvent.test( name ) ) {
-					jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
-				}
-			});
-			/*!
-			* Sizzle CSS Selector Engine
-			* Copyright 2012 jQuery Foundation and other contributors
-			* Released under the MIT license
-			* http://sizzlejs.com/
-			*/
-			(function( window, undefined ) {
-				
-				var cachedruns,
-				assertGetIdNotName,
-				Expr,
-				getText,
-				isXML,
-				contains,
-				compile,
-				sortOrder,
-				hasDuplicate,
-				outermostContext,
-				
-				baseHasDuplicate = true,
-				strundefined = "undefined",
-				
-				expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
-				
-				Token = String,
-				document = window.document,
-				docElem = document.documentElement,
-				dirruns = 0,
-				done = 0,
-				pop = [].pop,
-				push = [].push,
-				slice = [].slice,
-				// Use a stripped-down indexOf if a native one is unavailable
-				indexOf = [].indexOf || function( elem ) {
-					var i = 0,
-					len = this.length;
-					for ( ; i < len; i++ ) {
-						if ( this[i] === elem ) {
-							return i;
-						}
-					}
-					return -1;
-				},
-				
-				// Augment a function for special use by Sizzle
-				markFunction = function( fn, value ) {
-					fn[ expando ] = value == null || value;
-					return fn;
-				},
-				
-				createCache = function() {
-					var cache = {},
-					keys = [];
-					
-					return markFunction(function( key, value ) {
-						// Only keep the most recent entries
-						if ( keys.push( key ) > Expr.cacheLength ) {
-							delete cache[ keys.shift() ];
-						}
-						
-						// Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
-						return (cache[ key + " " ] = value);
-					}, cache );
-				},
-				
-				classCache = createCache(),
-				tokenCache = createCache(),
-				compilerCache = createCache(),
-				
-				// Regex
-				
-				// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
-				whitespace = "[\\x20\\t\\r\\n\\f]",
-				// http://www.w3.org/TR/css3-syntax/#characters
-				characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
-				
-				// Loosely modeled on CSS identifier characters
-				// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
-				// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-				identifier = characterEncoding.replace( "w", "w#" ),
-				
-				// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
-				operators = "([*^$|!~]?=)",
-				attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
-				"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-				
-				// Prefer arguments not in parens/brackets,
-				//   then attribute selectors and non-pseudos (denoted by :),
-				//   then anything else
-				// These preferences are here to reduce the number of selectors
-				//   needing tokenize in the PSEUDO preFilter
-				pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
-				
-				// For matchExpr.POS and matchExpr.needsContext
-				pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
-				"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
-				
-				// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-				rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-				
-				rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-				rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
-				rpseudo = new RegExp( pseudos ),
-				
-				// Easily-parseable/retrievable ID or TAG or CLASS selectors
-				rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
-				
-				rnot = /^:not/,
-				rsibling = /[\x20\t\r\n\f]*[+~]/,
-				rendsWithNot = /:not\($/,
-				
-				rheader = /h\d/i,
-				rinputs = /input|select|textarea|button/i,
-				
-				rbackslash = /\\(?!\\)/g,
-				
-				matchExpr = {
-					"ID": new RegExp( "^#(" + characterEncoding + ")" ),
-					"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
-					"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
-					"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
-					"ATTR": new RegExp( "^" + attributes ),
-					"PSEUDO": new RegExp( "^" + pseudos ),
-					"POS": new RegExp( pos, "i" ),
-					"CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
-					"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-					"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-					// For use in libraries implementing .is()
-					"needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
-				},
-				
-				// Support
-				
-				// Used for testing something on an element
-				assert = function( fn ) {
-					var div = document.createElement("div");
-					
-					try {
-						return fn( div );
-						} catch (e) {
-						return false;
-						} finally {
-						// release memory in IE
-						div = null;
-					}
-				},
-				
-				// Check if getElementsByTagName("*") returns only elements
-				assertTagNameNoComments = assert(function( div ) {
-					div.appendChild( document.createComment("") );
-					return !div.getElementsByTagName("*").length;
-				}),
-				
-				// Check if getAttribute returns normalized href attributes
-				assertHrefNotNormalized = assert(function( div ) {
-					div.innerHTML = "<a href='#'></a>";
-					return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
-					div.firstChild.getAttribute("href") === "#";
-				}),
-				
-				// Check if attributes should be retrieved by attribute nodes
-				assertAttributes = assert(function( div ) {
-					div.innerHTML = "<select></select>";
-					var type = typeof div.lastChild.getAttribute("multiple");
-					// IE8 returns a string for some attributes even when not present
-					return type !== "boolean" && type !== "string";
-				}),
-				
-				// Check if getElementsByClassName can be trusted
-				assertUsableClassName = assert(function( div ) {
-					// Opera can't find a second classname (in 9.6)
-					div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
-					if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
-						return false;
-					}
-					
-					// Safari 3.2 caches class attributes and doesn't catch changes
-					div.lastChild.className = "e";
-					return div.getElementsByClassName("e").length === 2;
-				}),
-				
-				// Check if getElementById returns elements by name
-				// Check if getElementsByName privileges form controls or returns elements by ID
-				assertUsableName = assert(function( div ) {
-					// Inject content
-					div.id = expando + 0;
-					div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
-					docElem.insertBefore( div, docElem.firstChild );
-					
-					// Test
-					var pass = document.getElementsByName &&
-					// buggy browsers will return fewer than the correct 2
-					document.getElementsByName( expando ).length === 2 +
-					// buggy browsers will return more than the correct 0
-					document.getElementsByName( expando + 0 ).length;
-					assertGetIdNotName = !document.getElementById( expando );
-					
-					// Cleanup
-					docElem.removeChild( div );
-					
-					return pass;
-				});
-				
-				// If slice is not available, provide a backup
-				try {
-					slice.call( docElem.childNodes, 0 )[0].nodeType;
-					} catch ( e ) {
-					slice = function( i ) {
-						var elem,
-						results = [];
-						for ( ; (elem = this[i]); i++ ) {
-							results.push( elem );
-						}
-						return results;
-					};
-				}
-				
-				function Sizzle( selector, context, results, seed ) {
-					results = results || [];
-					context = context || document;
-					var match, elem, xml, m,
-					nodeType = context.nodeType;
-					
-					if ( !selector || typeof selector !== "string" ) {
-						return results;
-					}
-					
-					if ( nodeType !== 1 && nodeType !== 9 ) {
-						return [];
-					}
-					
-					xml = isXML( context );
-					
-					if ( !xml && !seed ) {
-						if ( (match = rquickExpr.exec( selector )) ) {
-							// Speed-up: Sizzle("#ID")
-							if ( (m = match[1]) ) {
-								if ( nodeType === 9 ) {
-									elem = context.getElementById( m );
-									// Check parentNode to catch when Blackberry 4.6 returns
-									// nodes that are no longer in the document #6963
-									if ( elem && elem.parentNode ) {
-										// Handle the case where IE, Opera, and Webkit return items
-										// by name instead of ID
-										if ( elem.id === m ) {
-											results.push( elem );
-											return results;
-										}
-										} else {
-										return results;
-									}
-									} else {
-									// Context is not a document
-									if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
-									contains( context, elem ) && elem.id === m ) {
-										results.push( elem );
-										return results;
-									}
-								}
-								
-								// Speed-up: Sizzle("TAG")
-								} else if ( match[2] ) {
-								push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
-								return results;
-								
-								// Speed-up: Sizzle(".CLASS")
-								} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
-								push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
-								return results;
-							}
-						}
-					}
-					
-					// All others
-					return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
-				}
-				
-				Sizzle.matches = function( expr, elements ) {
-					return Sizzle( expr, null, null, elements );
-				};
-				
-				Sizzle.matchesSelector = function( elem, expr ) {
-					return Sizzle( expr, null, null, [ elem ] ).length > 0;
-				};
-				
-				// Returns a function to use in pseudos for input types
-				function createInputPseudo( type ) {
-					return function( elem ) {
-						var name = elem.nodeName.toLowerCase();
-						return name === "input" && elem.type === type;
-					};
-				}
-				
-				// Returns a function to use in pseudos for buttons
-				function createButtonPseudo( type ) {
-					return function( elem ) {
-						var name = elem.nodeName.toLowerCase();
-						return (name === "input" || name === "button") && elem.type === type;
-					};
-				}
-				
-				// Returns a function to use in pseudos for positionals
-				function createPositionalPseudo( fn ) {
-					return markFunction(function( argument ) {
-						argument = +argument;
-						return markFunction(function( seed, matches ) {
-							var j,
-							matchIndexes = fn( [], seed.length, argument ),
-							i = matchIndexes.length;
-							
-							// Match elements found at the specified indexes
-							while ( i-- ) {
-								if ( seed[ (j = matchIndexes[i]) ] ) {
-									seed[j] = !(matches[j] = seed[j]);
-								}
-							}
-						});
-					});
-				}
-				
-				/**
-				* Utility function for retrieving the text value of an array of DOM nodes
-				* @param {Array|Element} elem
-				*/
-				getText = Sizzle.getText = function( elem ) {
-					var node,
-					ret = "",
-					i = 0,
-					nodeType = elem.nodeType;
-					
-					if ( nodeType ) {
-						if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-							// Use textContent for elements
-							// innerText usage removed for consistency of new lines (see #11153)
-							if ( typeof elem.textContent === "string" ) {
-								return elem.textContent;
-								} else {
-								// Traverse its children
-								for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-									ret += getText( elem );
-								}
-							}
-							} else if ( nodeType === 3 || nodeType === 4 ) {
-							return elem.nodeValue;
-						}
-						// Do not include comment or processing instruction nodes
-						} else {
-						
-						// If no nodeType, this is expected to be an array
-						for ( ; (node = elem[i]); i++ ) {
-							// Do not traverse comment nodes
-							ret += getText( node );
-						}
-					}
-					return ret;
-				};
-				
-				isXML = Sizzle.isXML = function( elem ) {
-					// documentElement is verified for cases where it doesn't yet exist
-					// (such as loading iframes in IE - #4833)
-					var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-					return documentElement ? documentElement.nodeName !== "HTML" : false;
-				};
-				
-				// Element contains another
-				contains = Sizzle.contains = docElem.contains ?
-				function( a, b ) {
-					var adown = a.nodeType === 9 ? a.documentElement : a,
-					bup = b && b.parentNode;
-					return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
-				} :
-				docElem.compareDocumentPosition ?
-				function( a, b ) {
-					return b && !!( a.compareDocumentPosition( b ) & 16 );
-				} :
-				function( a, b ) {
-					while ( (b = b.parentNode) ) {
-						if ( b === a ) {
-							return true;
-						}
-					}
-					return false;
-				};
-				
-				Sizzle.attr = function( elem, name ) {
-					var val,
-					xml = isXML( elem );
-					
-					if ( !xml ) {
-						name = name.toLowerCase();
-					}
-					if ( (val = Expr.attrHandle[ name ]) ) {
-						return val( elem );
-					}
-					if ( xml || assertAttributes ) {
-						return elem.getAttribute( name );
-					}
-					val = elem.getAttributeNode( name );
-					return val ?
-					typeof elem[ name ] === "boolean" ?
-					elem[ name ] ? name : null :
-					val.specified ? val.value : null :
-					null;
-				};
-				
-				Expr = Sizzle.selectors = {
-					
-					// Can be adjusted by the user
-					cacheLength: 50,
-					
-					createPseudo: markFunction,
-					
-					match: matchExpr,
-					
-					// IE6/7 return a modified href
-					attrHandle: assertHrefNotNormalized ?
-					{} :					{
-						"href": function( elem ) {
-							return elem.getAttribute( "href", 2 );
-						},
-						"type": function( elem ) {
-							return elem.getAttribute("type");
-						}
-					},
-					
-					find: {
-						"ID": assertGetIdNotName ?
-						function( id, context, xml ) {
-							if ( typeof context.getElementById !== strundefined && !xml ) {
-								var m = context.getElementById( id );
-								// Check parentNode to catch when Blackberry 4.6 returns
-								// nodes that are no longer in the document #6963
-								return m && m.parentNode ? [m] : [];
-							}
-						} :
-						function( id, context, xml ) {
-							if ( typeof context.getElementById !== strundefined && !xml ) {
-								var m = context.getElementById( id );
-								
-								return m ?
-								m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
-								[m] :
-								undefined :
-								[];
-							}
-						},
-						
-						"TAG": assertTagNameNoComments ?
-						function( tag, context ) {
-							if ( typeof context.getElementsByTagName !== strundefined ) {
-								return context.getElementsByTagName( tag );
-							}
-						} :
-						function( tag, context ) {
-							var results = context.getElementsByTagName( tag );
-							
-							// Filter out possible comments
-							if ( tag === "*" ) {
-								var elem,
-								tmp = [],
-								i = 0;
-								
-								for ( ; (elem = results[i]); i++ ) {
-									if ( elem.nodeType === 1 ) {
-										tmp.push( elem );
-									}
-								}
-								
-								return tmp;
-							}
-							return results;
-						},
-						
-						"NAME": assertUsableName && function( tag, context ) {
-							if ( typeof context.getElementsByName !== strundefined ) {
-								return context.getElementsByName( name );
-							}
-						},
-						
-						"CLASS": assertUsableClassName && function( className, context, xml ) {
-							if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
-								return context.getElementsByClassName( className );
-							}
-						}
-					},
-					
-					relative: {
-						">": { dir: "parentNode", first: true },
-						" ": { dir: "parentNode" },
-						"+": { dir: "previousSibling", first: true },
-						"~": { dir: "previousSibling" }
-					},
-					
-					preFilter: {
-						"ATTR": function( match ) {
-							match[1] = match[1].replace( rbackslash, "" );
-							
-							// Move the given value to match[3] whether quoted or unquoted
-							match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
-							
-							if ( match[2] === "~=" ) {
-								match[3] = " " + match[3] + " ";
-							}
-							
-							return match.slice( 0, 4 );
-						},
-						
-						"CHILD": function( match ) {
-							/* matches from matchExpr["CHILD"]
-							1 type (only|nth|...)
-							2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-							3 xn-component of xn+y argument ([+-]?\d*n|)
-							4 sign of xn-component
-							5 x of xn-component
-							6 sign of y-component
-							7 y of y-component
-							*/
-							match[1] = match[1].toLowerCase();
-							
-							if ( match[1] === "nth" ) {
-								// nth-child requires argument
-								if ( !match[2] ) {
-									Sizzle.error( match[0] );
-								}
-								
-								// numeric x and y parameters for Expr.filter.CHILD
-								// remember that false/true cast respectively to 0/1
-								match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
-								match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
-								
-								// other types prohibit arguments
-								} else if ( match[2] ) {
-								Sizzle.error( match[0] );
-							}
-							
-							return match;
-						},
-						
-						"PSEUDO": function( match ) {
-							var unquoted, excess;
-							if ( matchExpr["CHILD"].test( match[0] ) ) {
-								return null;
-							}
-							
-							if ( match[3] ) {
-								match[2] = match[3];
-								} else if ( (unquoted = match[4]) ) {
-								// Only check arguments that contain a pseudo
-								if ( rpseudo.test(unquoted) &&
-								// Get excess from tokenize (recursively)
-								(excess = tokenize( unquoted, true )) &&
-								// advance to the next closing parenthesis
-								(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-									
-									// excess is a negative index
-									unquoted = unquoted.slice( 0, excess );
-									match[0] = match[0].slice( 0, excess );
-								}
-								match[2] = unquoted;
-							}
-							
-							// Return only captures needed by the pseudo filter method (type and argument)
-							return match.slice( 0, 3 );
-						}
-					},
-					
-					filter: {
-						"ID": assertGetIdNotName ?
-						function( id ) {
-							id = id.replace( rbackslash, "" );
-							return function( elem ) {
-								return elem.getAttribute("id") === id;
-							};
-						} :
-						function( id ) {
-							id = id.replace( rbackslash, "" );
-							return function( elem ) {
-								var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
-								return node && node.value === id;
-							};
-						},
-						
-						"TAG": function( nodeName ) {
-							if ( nodeName === "*" ) {
-								return function() { return true; };
-							}
-							nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
-							
-							return function( elem ) {
-								return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-							};
-						},
-						
-						"CLASS": function( className ) {
-							var pattern = classCache[ expando ][ className + " " ];
-							
-							return pattern ||
-							(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-							classCache( className, function( elem ) {
-								return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
-							});
-						},
-						
-						"ATTR": function( name, operator, check ) {
-							return function( elem, context ) {
-								var result = Sizzle.attr( elem, name );
-								
-								if ( result == null ) {
-									return operator === "!=";
-								}
-								if ( !operator ) {
-									return true;
-								}
-								
-								result += "";
-								
-								return operator === "=" ? result === check :
-								operator === "!=" ? result !== check :
-								operator === "^=" ? check && result.indexOf( check ) === 0 :
-								operator === "*=" ? check && result.indexOf( check ) > -1 :
-								operator === "$=" ? check && result.substr( result.length - check.length ) === check :
-								operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
-								operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
-								false;
-							};
-						},
-						
-						"CHILD": function( type, argument, first, last ) {
-							
-							if ( type === "nth" ) {
-								return function( elem ) {
-									var node, diff,
-									parent = elem.parentNode;
-									
-									if ( first === 1 && last === 0 ) {
-										return true;
-									}
-									
-									if ( parent ) {
-										diff = 0;
-										for ( node = parent.firstChild; node; node = node.nextSibling ) {
-											if ( node.nodeType === 1 ) {
-												diff++;
-												if ( elem === node ) {
-													break;
-												}
-											}
-										}
-									}
-									
-									// Incorporate the offset (or cast to NaN), then check against cycle size
-									diff -= last;
-									return diff === first || ( diff % first === 0 && diff / first >= 0 );
-								};
-							}
-							
-							return function( elem ) {
-								var node = elem;
-								
-								switch ( type ) {
-									case "only":
-									case "first":
-									while ( (node = node.previousSibling) ) {
-										if ( node.nodeType === 1 ) {
-											return false;
-										}
-									}
-									
-									if ( type === "first" ) {
-										return true;
-									}
-									
-									node = elem;
-									
-									/* falls through */
-									case "last":
-									while ( (node = node.nextSibling) ) {
-										if ( node.nodeType === 1 ) {
-											return false;
-										}
-									}
-									
-									return true;
-								}
-							};
-						},
-						
-						"PSEUDO": function( pseudo, argument ) {
-							// pseudo-class names are case-insensitive
-							// http://www.w3.org/TR/selectors/#pseudo-classes
-							// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-							// Remember that setFilters inherits from pseudos
-							var args,
-							fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-							Sizzle.error( "unsupported pseudo: " + pseudo );
-							
-							// The user may use createPseudo to indicate that
-							// arguments are needed to create the filter function
-							// just as Sizzle does
-							if ( fn[ expando ] ) {
-								return fn( argument );
-							}
-							
-							// But maintain support for old signatures
-							if ( fn.length > 1 ) {
-								args = [ pseudo, pseudo, "", argument ];
-								return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-								markFunction(function( seed, matches ) {
-									var idx,
-									matched = fn( seed, argument ),
-									i = matched.length;
-									while ( i-- ) {
-										idx = indexOf.call( seed, matched[i] );
-										seed[ idx ] = !( matches[ idx ] = matched[i] );
-									}
-								}) :
-								function( elem ) {
-									return fn( elem, 0, args );
-								};
-							}
-							
-							return fn;
-						}
-					},
-					
-					pseudos: {
-						"not": markFunction(function( selector ) {
-							// Trim the selector passed to compile
-							// to avoid treating leading and trailing
-							// spaces as combinators
-							var input = [],
-							results = [],
-							matcher = compile( selector.replace( rtrim, "$1" ) );
-							
-							return matcher[ expando ] ?
-							markFunction(function( seed, matches, context, xml ) {
-								var elem,
-								unmatched = matcher( seed, null, xml, [] ),
-								i = seed.length;
-								
-								// Match elements unmatched by `matcher`
-								while ( i-- ) {
-									if ( (elem = unmatched[i]) ) {
-										seed[i] = !(matches[i] = elem);
-									}
-								}
-							}) :
-							function( elem, context, xml ) {
-								input[0] = elem;
-								matcher( input, null, xml, results );
-								return !results.pop();
-							};
-						}),
-						
-						"has": markFunction(function( selector ) {
-							return function( elem ) {
-								return Sizzle( selector, elem ).length > 0;
-							};
-						}),
-						
-						"contains": markFunction(function( text ) {
-							return function( elem ) {
-								return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-							};
-						}),
-						
-						"enabled": function( elem ) {
-							return elem.disabled === false;
-						},
-						
-						"disabled": function( elem ) {
-							return elem.disabled === true;
-						},
-						
-						"checked": function( elem ) {
-							// In CSS3, :checked should return both checked and selected elements
-							// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-							var nodeName = elem.nodeName.toLowerCase();
-							return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-						},
-						
-						"selected": function( elem ) {
-							// Accessing this property makes selected-by-default
-							// options in Safari work properly
-							if ( elem.parentNode ) {
-								elem.parentNode.selectedIndex;
-							}
-							
-							return elem.selected === true;
-						},
-						
-						"parent": function( elem ) {
-							return !Expr.pseudos["empty"]( elem );
-						},
-						
-						"empty": function( elem ) {
-							// http://www.w3.org/TR/selectors/#empty-pseudo
-							// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
-							//   not comment, processing instructions, or others
-							// Thanks to Diego Perini for the nodeName shortcut
-							//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
-							var nodeType;
-							elem = elem.firstChild;
-							while ( elem ) {
-								if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
-									return false;
-								}
-								elem = elem.nextSibling;
-							}
-							return true;
-						},
-						
-						"header": function( elem ) {
-							return rheader.test( elem.nodeName );
-						},
-						
-						"text": function( elem ) {
-							var type, attr;
-							// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
-							// use getAttribute instead to test this case
-							return elem.nodeName.toLowerCase() === "input" &&
-							(type = elem.type) === "text" &&
-							( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
-						},
-						
-						// Input types
-						"radio": createInputPseudo("radio"),
-						"checkbox": createInputPseudo("checkbox"),
-						"file": createInputPseudo("file"),
-						"password": createInputPseudo("password"),
-						"image": createInputPseudo("image"),
-						
-						"submit": createButtonPseudo("submit"),
-						"reset": createButtonPseudo("reset"),
-						
-						"button": function( elem ) {
-							var name = elem.nodeName.toLowerCase();
-							return name === "input" && elem.type === "button" || name === "button";
-						},
-						
-						"input": function( elem ) {
-							return rinputs.test( elem.nodeName );
-						},
-						
-						"focus": function( elem ) {
-							var doc = elem.ownerDocument;
-							return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-						},
-						
-						"active": function( elem ) {
-							return elem === elem.ownerDocument.activeElement;
-						},
-						
-						// Positional types
-						"first": createPositionalPseudo(function() {
-							return [ 0 ];
-						}),
-						
-						"last": createPositionalPseudo(function( matchIndexes, length ) {
-							return [ length - 1 ];
-						}),
-						
-						"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-							return [ argument < 0 ? argument + length : argument ];
-						}),
-						
-						"even": createPositionalPseudo(function( matchIndexes, length ) {
-							for ( var i = 0; i < length; i += 2 ) {
-								matchIndexes.push( i );
-							}
-							return matchIndexes;
-						}),
-						
-						"odd": createPositionalPseudo(function( matchIndexes, length ) {
-							for ( var i = 1; i < length; i += 2 ) {
-								matchIndexes.push( i );
-							}
-							return matchIndexes;
-						}),
-						
-						"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-							for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
-								matchIndexes.push( i );
-							}
-							return matchIndexes;
-						}),
-						
-						"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-							for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
-								matchIndexes.push( i );
-							}
-							return matchIndexes;
-						})
-					}
-				};
-				
-				function siblingCheck( a, b, ret ) {
-					if ( a === b ) {
-						return ret;
-					}
-					
-					var cur = a.nextSibling;
-					
-					while ( cur ) {
-						if ( cur === b ) {
-							return -1;
-						}
-						
-						cur = cur.nextSibling;
-					}
-					
-					return 1;
-				}
-				
-				sortOrder = docElem.compareDocumentPosition ?
-				function( a, b ) {
-					if ( a === b ) {
-						hasDuplicate = true;
-						return 0;
-					}
-					
-					return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
-					a.compareDocumentPosition :
-					a.compareDocumentPosition(b) & 4
-					) ? -1 : 1;
-				} :
-				function( a, b ) {
-					// The nodes are identical, we can exit early
-					if ( a === b ) {
-						hasDuplicate = true;
-						return 0;
-						
-						// Fallback to using sourceIndex (in IE) if it's available on both nodes
-						} else if ( a.sourceIndex && b.sourceIndex ) {
-						return a.sourceIndex - b.sourceIndex;
-					}
-					
-					var al, bl,
-					ap = [],
-					bp = [],
-					aup = a.parentNode,
-					bup = b.parentNode,
-					cur = aup;
-					
-					// If the nodes are siblings (or identical) we can do a quick check
-					if ( aup === bup ) {
-						return siblingCheck( a, b );
-						
-						// If no parents were found then the nodes are disconnected
-						} else if ( !aup ) {
-						return -1;
-						
-						} else if ( !bup ) {
-						return 1;
-					}
-					
-					// Otherwise they're somewhere else in the tree so we need
-					// to build up a full list of the parentNodes for comparison
-					while ( cur ) {
-						ap.unshift( cur );
-						cur = cur.parentNode;
-					}
-					
-					cur = bup;
-					
-					while ( cur ) {
-						bp.unshift( cur );
-						cur = cur.parentNode;
-					}
-					
-					al = ap.length;
-					bl = bp.length;
-					
-					// Start walking down the tree looking for a discrepancy
-					for ( var i = 0; i < al && i < bl; i++ ) {
-						if ( ap[i] !== bp[i] ) {
-							return siblingCheck( ap[i], bp[i] );
-						}
-					}
-					
-					// We ended someplace up the tree so do a sibling check
-					return i === al ?
-					siblingCheck( a, bp[i], -1 ) :
-					siblingCheck( ap[i], b, 1 );
-				};
-				
-				// Always assume the presence of duplicates if sort doesn't
-				// pass them to our comparison function (as in Google Chrome).
-				[0, 0].sort( sortOrder );
-				baseHasDuplicate = !hasDuplicate;
-				
-				// Document sorting and removing duplicates
-				Sizzle.uniqueSort = function( results ) {
-					var elem,
-					duplicates = [],
-					i = 1,
-					j = 0;
-					
-					hasDuplicate = baseHasDuplicate;
-					results.sort( sortOrder );
-					
-					if ( hasDuplicate ) {
-						for ( ; (elem = results[i]); i++ ) {
-							if ( elem === results[ i - 1 ] ) {
-								j = duplicates.push( i );
-							}
-						}
-						while ( j-- ) {
-							results.splice( duplicates[ j ], 1 );
-						}
-					}
-					
-					return results;
-				};
-				
-				Sizzle.error = function( msg ) {
-					throw new Error( "Syntax error, unrecognized expression: " + msg );
-				};
-				
-				function tokenize( selector, parseOnly ) {
-					var matched, match, tokens, type,
-					soFar, groups, preFilters,
-					cached = tokenCache[ expando ][ selector + " " ];
-					
-					if ( cached ) {
-						return parseOnly ? 0 : cached.slice( 0 );
-					}
-					
-					soFar = selector;
-					groups = [];
-					preFilters = Expr.preFilter;
-					
-					while ( soFar ) {
-						
-						// Comma and first run
-						if ( !matched || (match = rcomma.exec( soFar )) ) {
-							if ( match ) {
-								// Don't consume trailing commas as valid
-								soFar = soFar.slice( match[0].length ) || soFar;
-							}
-							groups.push( tokens = [] );
-						}
-						
-						matched = false;
-						
-						// Combinators
-						if ( (match = rcombinators.exec( soFar )) ) {
-							tokens.push( matched = new Token( match.shift() ) );
-							soFar = soFar.slice( matched.length );
-							
-							// Cast descendant combinators to space
-							matched.type = match[0].replace( rtrim, " " );
-						}
-						
-						// Filters
-						for ( type in Expr.filter ) {
-							if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-							(match = preFilters[ type ]( match ))) ) {
-								
-								tokens.push( matched = new Token( match.shift() ) );
-								soFar = soFar.slice( matched.length );
-								matched.type = type;
-								matched.matches = match;
-							}
-						}
-						
-						if ( !matched ) {
-							break;
-						}
-					}
-					
-					// Return the length of the invalid excess
-					// if we're just parsing
-					// Otherwise, throw an error or return tokens
-					return parseOnly ?
-					soFar.length :
-					soFar ?
-					Sizzle.error( selector ) :
-					// Cache the tokens
-					tokenCache( selector, groups ).slice( 0 );
-				}
-				
-				function addCombinator( matcher, combinator, base ) {
-					var dir = combinator.dir,
-					checkNonElements = base && combinator.dir === "parentNode",
-					doneName = done++;
-					
-					return combinator.first ?
-					// Check against closest ancestor/preceding element
-					function( elem, context, xml ) {
-						while ( (elem = elem[ dir ]) ) {
-							if ( checkNonElements || elem.nodeType === 1  ) {
-								return matcher( elem, context, xml );
-							}
-						}
-					} :
-					
-					// Check against all ancestor/preceding elements
-					function( elem, context, xml ) {
-						// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
-						if ( !xml ) {
-							var cache,
-							dirkey = dirruns + " " + doneName + " ",
-							cachedkey = dirkey + cachedruns;
-							while ( (elem = elem[ dir ]) ) {
-								if ( checkNonElements || elem.nodeType === 1 ) {
-									if ( (cache = elem[ expando ]) === cachedkey ) {
-										return elem.sizset;
-										} else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
-										if ( elem.sizset ) {
-											return elem;
-										}
-										} else {
-										elem[ expando ] = cachedkey;
-										if ( matcher( elem, context, xml ) ) {
-											elem.sizset = true;
-											return elem;
-										}
-										elem.sizset = false;
-									}
-								}
-							}
-							} else {
-							while ( (elem = elem[ dir ]) ) {
-								if ( checkNonElements || elem.nodeType === 1 ) {
-									if ( matcher( elem, context, xml ) ) {
-										return elem;
-									}
-								}
-							}
-						}
-					};
-				}
-				
-				function elementMatcher( matchers ) {
-					return matchers.length > 1 ?
-					function( elem, context, xml ) {
-						var i = matchers.length;
-						while ( i-- ) {
-							if ( !matchers[i]( elem, context, xml ) ) {
-								return false;
-							}
-						}
-						return true;
-					} :
-					matchers[0];
-				}
-				
-				function condense( unmatched, map, filter, context, xml ) {
-					var elem,
-					newUnmatched = [],
-					i = 0,
-					len = unmatched.length,
-					mapped = map != null;
-					
-					for ( ; i < len; i++ ) {
-						if ( (elem = unmatched[i]) ) {
-							if ( !filter || filter( elem, context, xml ) ) {
-								newUnmatched.push( elem );
-								if ( mapped ) {
-									map.push( i );
-								}
-							}
-						}
-					}
-					
-					return newUnmatched;
-				}
-				
-				function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-					if ( postFilter && !postFilter[ expando ] ) {
-						postFilter = setMatcher( postFilter );
-					}
-					if ( postFinder && !postFinder[ expando ] ) {
-						postFinder = setMatcher( postFinder, postSelector );
-					}
-					return markFunction(function( seed, results, context, xml ) {
-						var temp, i, elem,
-						preMap = [],
-						postMap = [],
-						preexisting = results.length,
-						
-						// Get initial elements from seed or context
-						elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-						
-						// Prefilter to get matcher input, preserving a map for seed-results synchronization
-						matcherIn = preFilter && ( seed || !selector ) ?
-						condense( elems, preMap, preFilter, context, xml ) :
-						elems,
-						
-						matcherOut = matcher ?
-						// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-						postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-						
-						// ...intermediate processing is necessary
-						[] :
-						
-						// ...otherwise use results directly
-						results :
-						matcherIn;
-						
-						// Find primary matches
-						if ( matcher ) {
-							matcher( matcherIn, matcherOut, context, xml );
-						}
-						
-						// Apply postFilter
-						if ( postFilter ) {
-							temp = condense( matcherOut, postMap );
-							postFilter( temp, [], context, xml );
-							
-							// Un-match failing elements by moving them back to matcherIn
-							i = temp.length;
-							while ( i-- ) {
-								if ( (elem = temp[i]) ) {
-									matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-								}
-							}
-						}
-						
-						if ( seed ) {
-							if ( postFinder || preFilter ) {
-								if ( postFinder ) {
-									// Get the final matcherOut by condensing this intermediate into postFinder contexts
-									temp = [];
-									i = matcherOut.length;
-									while ( i-- ) {
-										if ( (elem = matcherOut[i]) ) {
-											// Restore matcherIn since elem is not yet a final match
-											temp.push( (matcherIn[i] = elem) );
-										}
-									}
-									postFinder( null, (matcherOut = []), temp, xml );
-								}
-								
-								// Move matched elements from seed to results to keep them synchronized
-								i = matcherOut.length;
-								while ( i-- ) {
-									if ( (elem = matcherOut[i]) &&
-									(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
-										
-										seed[temp] = !(results[temp] = elem);
-									}
-								}
-							}
-							
-							// Add elements to results, through postFinder if defined
-							} else {
-							matcherOut = condense(
-							matcherOut === results ?
-							matcherOut.splice( preexisting, matcherOut.length ) :
-							matcherOut
-							);
-							if ( postFinder ) {
-								postFinder( null, results, matcherOut, xml );
-								} else {
-								push.apply( results, matcherOut );
-							}
-						}
-					});
-				}
-				
-				function matcherFromTokens( tokens ) {
-					var checkContext, matcher, j,
-					len = tokens.length,
-					leadingRelative = Expr.relative[ tokens[0].type ],
-					implicitRelative = leadingRelative || Expr.relative[" "],
-					i = leadingRelative ? 1 : 0,
-					
-					// The foundational matcher ensures that elements are reachable from top-level context(s)
-					matchContext = addCombinator( function( elem ) {
-						return elem === checkContext;
-					}, implicitRelative, true ),
-					matchAnyContext = addCombinator( function( elem ) {
-						return indexOf.call( checkContext, elem ) > -1;
-					}, implicitRelative, true ),
-					matchers = [ function( elem, context, xml ) {
-						return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-						(checkContext = context).nodeType ?
-						matchContext( elem, context, xml ) :
-						matchAnyContext( elem, context, xml ) );
-					} ];
-					
-					for ( ; i < len; i++ ) {
-						if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-							matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
-							} else {
-							matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-							
-							// Return special upon seeing a positional matcher
-							if ( matcher[ expando ] ) {
-								// Find the next relative operator (if any) for proper handling
-								j = ++i;
-								for ( ; j < len; j++ ) {
-									if ( Expr.relative[ tokens[j].type ] ) {
-										break;
-									}
-								}
-								return setMatcher(
-								i > 1 && elementMatcher( matchers ),
-								i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
-								matcher,
-								i < j && matcherFromTokens( tokens.slice( i, j ) ),
-								j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-								j < len && tokens.join("")
-								);
-							}
-							matchers.push( matcher );
-						}
-					}
-					
-					return elementMatcher( matchers );
-				}
-				
-				function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-					var bySet = setMatchers.length > 0,
-					byElement = elementMatchers.length > 0,
-					superMatcher = function( seed, context, xml, results, expandContext ) {
-						var elem, j, matcher,
-						setMatched = [],
-						matchedCount = 0,
-						i = "0",
-						unmatched = seed && [],
-						outermost = expandContext != null,
-						contextBackup = outermostContext,
-						// We must always have either seed elements or context
-						elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
-						// Nested matchers should use non-integer dirruns
-						dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
-						
-						if ( outermost ) {
-							outermostContext = context !== document && context;
-							cachedruns = superMatcher.el;
-						}
-						
-						// Add elements passing elementMatchers directly to results
-						for ( ; (elem = elems[i]) != null; i++ ) {
-							if ( byElement && elem ) {
-								for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
-									if ( matcher( elem, context, xml ) ) {
-										results.push( elem );
-										break;
-									}
-								}
-								if ( outermost ) {
-									dirruns = dirrunsUnique;
-									cachedruns = ++superMatcher.el;
-								}
-							}
-							
-							// Track unmatched elements for set filters
-							if ( bySet ) {
-								// They will have gone through all possible matchers
-								if ( (elem = !matcher && elem) ) {
-									matchedCount--;
-								}
-								
-								// Lengthen the array for every element, matched or not
-								if ( seed ) {
-									unmatched.push( elem );
-								}
-							}
-						}
-						
-						// Apply set filters to unmatched elements
-						matchedCount += i;
-						if ( bySet && i !== matchedCount ) {
-							for ( j = 0; (matcher = setMatchers[j]); j++ ) {
-								matcher( unmatched, setMatched, context, xml );
-							}
-							
-							if ( seed ) {
-								// Reintegrate element matches to eliminate the need for sorting
-								if ( matchedCount > 0 ) {
-									while ( i-- ) {
-										if ( !(unmatched[i] || setMatched[i]) ) {
-											setMatched[i] = pop.call( results );
-										}
-									}
-								}
-								
-								// Discard index placeholder values to get only actual matches
-								setMatched = condense( setMatched );
-							}
-							
-							// Add matches to results
-							push.apply( results, setMatched );
-							
-							// Seedless set matches succeeding multiple successful matchers stipulate sorting
-							if ( outermost && !seed && setMatched.length > 0 &&
-							( matchedCount + setMatchers.length ) > 1 ) {
-								
-								Sizzle.uniqueSort( results );
-							}
-						}
-						
-						// Override manipulation of globals by nested matchers
-						if ( outermost ) {
-							dirruns = dirrunsUnique;
-							outermostContext = contextBackup;
-						}
-						
-						return unmatched;
-					};
-					
-					superMatcher.el = 0;
-					return bySet ?
-					markFunction( superMatcher ) :
-					superMatcher;
-				}
-				
-				compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
-					var i,
-					setMatchers = [],
-					elementMatchers = [],
-					cached = compilerCache[ expando ][ selector + " " ];
-					
-					if ( !cached ) {
-						// Generate a function of recursive functions that can be used to check each element
-						if ( !group ) {
-							group = tokenize( selector );
-						}
-						i = group.length;
-						while ( i-- ) {
-							cached = matcherFromTokens( group[i] );
-							if ( cached[ expando ] ) {
-								setMatchers.push( cached );
-								} else {
-								elementMatchers.push( cached );
-							}
-						}
-						
-						// Cache the compiled function
-						cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-					}
-					return cached;
-				};
-				
-				function multipleContexts( selector, contexts, results ) {
-					var i = 0,
-					len = contexts.length;
-					for ( ; i < len; i++ ) {
-						Sizzle( selector, contexts[i], results );
-					}
-					return results;
-				}
-				
-				function select( selector, context, results, seed, xml ) {
-					var i, tokens, token, type, find,
-					match = tokenize( selector ),
-					j = match.length;
-					
-					if ( !seed ) {
-						// Try to minimize operations if there is only one group
-						if ( match.length === 1 ) {
-							
-							// Take a shortcut and set the context if the root selector is an ID
-							tokens = match[0] = match[0].slice( 0 );
-							if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-							context.nodeType === 9 && !xml &&
-							Expr.relative[ tokens[1].type ] ) {
-								
-								context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
-								if ( !context ) {
-									return results;
-								}
-								
-								selector = selector.slice( tokens.shift().length );
-							}
-							
-							// Fetch a seed set for right-to-left matching
-							for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
-								token = tokens[i];
-								
-								// Abort if we hit a combinator
-								if ( Expr.relative[ (type = token.type) ] ) {
-									break;
-								}
-								if ( (find = Expr.find[ type ]) ) {
-									// Search, expanding context for leading sibling combinators
-									if ( (seed = find(
-									token.matches[0].replace( rbackslash, "" ),
-									rsibling.test( tokens[0].type ) && context.parentNode || context,
-									xml
-									)) ) {
-										
-										// If seed is empty or no tokens remain, we can return early
-										tokens.splice( i, 1 );
-										selector = seed.length && tokens.join("");
-										if ( !selector ) {
-											push.apply( results, slice.call( seed, 0 ) );
-											return results;
-										}
-										
-										break;
-									}
-								}
-							}
-						}
-					}
-					
-					// Compile and execute a filtering function
-					// Provide `match` to avoid retokenization if we modified the selector above
-					compile( selector, match )(
-					seed,
-					context,
-					xml,
-					results,
-					rsibling.test( selector )
-					);
-					return results;
-				}
-				
-				if ( document.querySelectorAll ) {
-					(function() {
-						var disconnectedMatch,
-						oldSelect = select,
-						rescape = /'|\\/g,
-						rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
-						
-						// qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA
-						// A support test would require too much code (would include document ready)
-						rbuggyQSA = [ ":focus" ],
-						
-						// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-						// A support test would require too much code (would include document ready)
-						// just skip matchesSelector for :active
-						rbuggyMatches = [ ":active" ],
-						matches = docElem.matchesSelector ||
-						docElem.mozMatchesSelector ||
-						docElem.webkitMatchesSelector ||
-						docElem.oMatchesSelector ||
-						docElem.msMatchesSelector;
-						
-						// Build QSA regex
-						// Regex strategy adopted from Diego Perini
-						assert(function( div ) {
-							// Select is set to empty string on purpose
-							// This is to test IE's treatment of not explictly
-							// setting a boolean content attribute,
-							// since its presence should be enough
-							// http://bugs.jquery.com/ticket/12359
-							div.innerHTML = "<select><option selected=''></option></select>";
-							
-							// IE8 - Some boolean attributes are not treated correctly
-							if ( !div.querySelectorAll("[selected]").length ) {
-								rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
-							}
-							
-							// Webkit/Opera - :checked should return selected option elements
-							// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-							// IE8 throws error here (do not put tests after this one)
-							if ( !div.querySelectorAll(":checked").length ) {
-								rbuggyQSA.push(":checked");
-							}
-						});
-						
-						assert(function( div ) {
-							
-							// Opera 10-12/IE9 - ^= $= *= and empty values
-							// Should not select anything
-							div.innerHTML = "<p test=''></p>";
-							if ( div.querySelectorAll("[test^='']").length ) {
-								rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
-							}
-							
-							// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-							// IE8 throws error here (do not put tests after this one)
-							div.innerHTML = "<input type='hidden'/>";
-							if ( !div.querySelectorAll(":enabled").length ) {
-								rbuggyQSA.push(":enabled", ":disabled");
-							}
-						});
-						
-						// rbuggyQSA always contains :focus, so no need for a length check
-						rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
-						
-						select = function( selector, context, results, seed, xml ) {
-							// Only use querySelectorAll when not filtering,
-							// when this is not xml,
-							// and when no QSA bugs apply
-							if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {
-								var groups, i,
-								old = true,
-								nid = expando,
-								newContext = context,
-								newSelector = context.nodeType === 9 && selector;
-								
-								// qSA works strangely on Element-rooted queries
-								// We can work around this by specifying an extra ID on the root
-								// and working up from there (Thanks to Andrew Dupont for the technique)
-								// IE 8 doesn't work on object elements
-								if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-									groups = tokenize( selector );
-									
-									if ( (old = context.getAttribute("id")) ) {
-										nid = old.replace( rescape, "\\$&" );
-										} else {
-										context.setAttribute( "id", nid );
-									}
-									nid = "[id='" + nid + "'] ";
-									
-									i = groups.length;
-									while ( i-- ) {
-										groups[i] = nid + groups[i].join("");
-									}
-									newContext = rsibling.test( selector ) && context.parentNode || context;
-									newSelector = groups.join(",");
-								}
-								
-								if ( newSelector ) {
-									try {
-										push.apply( results, slice.call( newContext.querySelectorAll(
-										newSelector
-										), 0 ) );
-										return results;
-										} catch(qsaError) {
-										} finally {
-										if ( !old ) {
-											context.removeAttribute("id");
-										}
-									}
-								}
-							}
-							
-							return oldSelect( selector, context, results, seed, xml );
-						};
-						
-						if ( matches ) {
-							assert(function( div ) {
-								// Check to see if it's possible to do matchesSelector
-								// on a disconnected node (IE 9)
-								disconnectedMatch = matches.call( div, "div" );
-								
-								// This should fail with an exception
-								// Gecko does not error, returns false instead
-								try {
-									matches.call( div, "[test!='']:sizzle" );
-									rbuggyMatches.push( "!=", pseudos );
-									} catch ( e ) {}
-								});
-								
-								// rbuggyMatches always contains :active and :focus, so no need for a length check
-								rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
-								
-								Sizzle.matchesSelector = function( elem, expr ) {
-									// Make sure that attribute selectors are quoted
-									expr = expr.replace( rattributeQuotes, "='$1']" );
-									
-									// rbuggyMatches always contains :active, so no need for an existence check
-									if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {
-										try {
-											var ret = matches.call( elem, expr );
-											
-											// IE 9's matchesSelector returns false on disconnected nodes
-											if ( ret || disconnectedMatch ||
-											// As well, disconnected nodes are said to be in a document
-											// fragment in IE 9
-											elem.document && elem.document.nodeType !== 11 ) {
-												return ret;
-											}
-											} catch(e) {}
-										}
-										
-										return Sizzle( expr, null, null, [ elem ] ).length > 0;
-									};
-								}
-							})();
-						}
-						
-						// Deprecated
-						Expr.pseudos["nth"] = Expr.pseudos["eq"];
-						
-						// Back-compat
-						function setFilters() {}
-						Expr.filters = setFilters.prototype = Expr.pseudos;
-						Expr.setFilters = new setFilters();
-						
-						// Override sizzle attribute retrieval
-						Sizzle.attr = jQuery.attr;
-						jQuery.find = Sizzle;
-						jQuery.expr = Sizzle.selectors;
-						jQuery.expr[":"] = jQuery.expr.pseudos;
-						jQuery.unique = Sizzle.uniqueSort;
-						jQuery.text = Sizzle.getText;
-						jQuery.isXMLDoc = Sizzle.isXML;
-						jQuery.contains = Sizzle.contains;
-						
-						
-					})( window );
-					var runtil = /Until$/,
-					rparentsprev = /^(?:parents|prev(?:Until|All))/,
-					isSimple = /^.[^:#\[\.,]*$/,
-					rneedsContext = jQuery.expr.match.needsContext,
-					// methods guaranteed to produce a unique set when starting from a unique set
-					guaranteedUnique = {
-						children: true,
-						contents: true,
-						next: true,
-						prev: true
-					};
-					
-					jQuery.fn.extend({
-						find: function( selector ) {
-							var i, l, length, n, r, ret,
-							self = this;
-							
-							if ( typeof selector !== "string" ) {
-								return jQuery( selector ).filter(function() {
-									for ( i = 0, l = self.length; i < l; i++ ) {
-										if ( jQuery.contains( self[ i ], this ) ) {
-											return true;
-										}
-									}
-								});
-							}
-							
-							ret = this.pushStack( "", "find", selector );
-							
-							for ( i = 0, l = this.length; i < l; i++ ) {
-								length = ret.length;
-								jQuery.find( selector, this[i], ret );
-								
-								if ( i > 0 ) {
-									// Make sure that the results are unique
-									for ( n = length; n < ret.length; n++ ) {
-										for ( r = 0; r < length; r++ ) {
-											if ( ret[r] === ret[n] ) {
-												ret.splice(n--, 1);
-												break;
-											}
-										}
-									}
-								}
-							}
-							
-							return ret;
-						},
-						
-						has: function( target ) {
-							var i,
-							targets = jQuery( target, this ),
-							len = targets.length;
-							
-							return this.filter(function() {
-								for ( i = 0; i < len; i++ ) {
-									if ( jQuery.contains( this, targets[i] ) ) {
-										return true;
-									}
-								}
-							});
-						},
-						
-						not: function( selector ) {
-							return this.pushStack( winnow(this, selector, false), "not", selector);
-						},
-						
-						filter: function( selector ) {
-							return this.pushStack( winnow(this, selector, true), "filter", selector );
-						},
-						
-						is: function( selector ) {
-							return !!selector && (
-							typeof selector === "string" ?
-							// If this is a positional/relative selector, check membership in the returned set
-							// so $("p:first").is("p:last") won't return true for a doc with two "p".
-							rneedsContext.test( selector ) ?
-							jQuery( selector, this.context ).index( this[0] ) >= 0 :
-							jQuery.filter( selector, this ).length > 0 :
-							this.filter( selector ).length > 0 );
-						},
-						
-						closest: function( selectors, context ) {
-							var cur,
-							i = 0,
-							l = this.length,
-							ret = [],
-							pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-							jQuery( selectors, context || this.context ) :
-							0;
-							
-							for ( ; i < l; i++ ) {
-								cur = this[i];
-								
-								while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
-									if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-										ret.push( cur );
-										break;
-									}
-									cur = cur.parentNode;
-								}
-							}
-							
-							ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-							
-							return this.pushStack( ret, "closest", selectors );
-						},
-						
-						// Determine the position of an element within
-						// the matched set of elements
-						index: function( elem ) {
-							
-							// No argument, return index in parent
-							if ( !elem ) {
-								return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
-							}
-							
-							// index in selector
-							if ( typeof elem === "string" ) {
-								return jQuery.inArray( this[0], jQuery( elem ) );
-							}
-							
-							// Locate the position of the desired element
-							return jQuery.inArray(
-							// If it receives a jQuery object, the first element is used
-							elem.jquery ? elem[0] : elem, this );
-						},
-						
-						add: function( selector, context ) {
-							var set = typeof selector === "string" ?
-							jQuery( selector, context ) :
-							jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-							all = jQuery.merge( this.get(), set );
-							
-							return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-							all :
-							jQuery.unique( all ) );
-						},
-						
-						addBack: function( selector ) {
-							return this.add( selector == null ?
-							this.prevObject : this.prevObject.filter(selector)
-							);
-						}
-					});
-					
-					jQuery.fn.andSelf = jQuery.fn.addBack;
-					
-					// A painfully simple check to see if an element is disconnected
-					// from a document (should be improved, where feasible).
-					function isDisconnected( node ) {
-						return !node || !node.parentNode || node.parentNode.nodeType === 11;
-					}
-					
-					function sibling( cur, dir ) {
-						do {
-							cur = cur[ dir ];
-						} while ( cur && cur.nodeType !== 1 );
-						
-						return cur;
-					}
-					
-					jQuery.each({
-						parent: function( elem ) {
-							var parent = elem.parentNode;
-							return parent && parent.nodeType !== 11 ? parent : null;
-						},
-						parents: function( elem ) {
-							return jQuery.dir( elem, "parentNode" );
-						},
-						parentsUntil: function( elem, i, until ) {
-							return jQuery.dir( elem, "parentNode", until );
-						},
-						next: function( elem ) {
-							return sibling( elem, "nextSibling" );
-						},
-						prev: function( elem ) {
-							return sibling( elem, "previousSibling" );
-						},
-						nextAll: function( elem ) {
-							return jQuery.dir( elem, "nextSibling" );
-						},
-						prevAll: function( elem ) {
-							return jQuery.dir( elem, "previousSibling" );
-						},
-						nextUntil: function( elem, i, until ) {
-							return jQuery.dir( elem, "nextSibling", until );
-						},
-						prevUntil: function( elem, i, until ) {
-							return jQuery.dir( elem, "previousSibling", until );
-						},
-						siblings: function( elem ) {
-							return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
-						},
-						children: function( elem ) {
-							return jQuery.sibling( elem.firstChild );
-						},
-						contents: function( elem ) {
-							return jQuery.nodeName( elem, "iframe" ) ?
-							elem.contentDocument || elem.contentWindow.document :
-							jQuery.merge( [], elem.childNodes );
-						}
-						}, function( name, fn ) {
-						jQuery.fn[ name ] = function( until, selector ) {
-							var ret = jQuery.map( this, fn, until );
-							
-							if ( !runtil.test( name ) ) {
-								selector = until;
-							}
-							
-							if ( selector && typeof selector === "string" ) {
-								ret = jQuery.filter( selector, ret );
-							}
-							
-							ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-							
-							if ( this.length > 1 && rparentsprev.test( name ) ) {
-								ret = ret.reverse();
-							}
-							
-							return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
-						};
-					});
-					
-					jQuery.extend({
-						filter: function( expr, elems, not ) {
-							if ( not ) {
-								expr = ":not(" + expr + ")";
-							}
-							
-							return elems.length === 1 ?
-							jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-							jQuery.find.matches(expr, elems);
-						},
-						
-						dir: function( elem, dir, until ) {
-							var matched = [],
-							cur = elem[ dir ];
-							
-							while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-								if ( cur.nodeType === 1 ) {
-									matched.push( cur );
-								}
-								cur = cur[dir];
-							}
-							return matched;
-						},
-						
-						sibling: function( n, elem ) {
-							var r = [];
-							
-							for ( ; n; n = n.nextSibling ) {
-								if ( n.nodeType === 1 && n !== elem ) {
-									r.push( n );
-								}
-							}
-							
-							return r;
-						}
-					});
-					
-					// Implement the identical functionality for filter and not
-					function winnow( elements, qualifier, keep ) {
-						
-						// Can't pass null or undefined to indexOf in Firefox 4
-						// Set to 0 to skip string check
-						qualifier = qualifier || 0;
-						
-						if ( jQuery.isFunction( qualifier ) ) {
-							return jQuery.grep(elements, function( elem, i ) {
-								var retVal = !!qualifier.call( elem, i, elem );
-								return retVal === keep;
-							});
-							
-							} else if ( qualifier.nodeType ) {
-							return jQuery.grep(elements, function( elem, i ) {
-								return ( elem === qualifier ) === keep;
-							});
-							
-							} else if ( typeof qualifier === "string" ) {
-							var filtered = jQuery.grep(elements, function( elem ) {
-								return elem.nodeType === 1;
-							});
-							
-							if ( isSimple.test( qualifier ) ) {
-								return jQuery.filter(qualifier, filtered, !keep);
-								} else {
-								qualifier = jQuery.filter( qualifier, filtered );
-							}
-						}
-						
-						return jQuery.grep(elements, function( elem, i ) {
-							return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-						});
-					}
-					function createSafeFragment( document ) {
-						var list = nodeNames.split( "|" ),
-						safeFrag = document.createDocumentFragment();
-						
-						if ( safeFrag.createElement ) {
-							while ( list.length ) {
-								safeFrag.createElement(
-								list.pop()
-								);
-							}
-						}
-						return safeFrag;
-					}
-					
-					var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-					"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-					rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-					rleadingWhitespace = /^\s+/,
-					rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
-					rtagName = /<([\w:]+)/,
-					rtbody = /<tbody/i,
-					rhtml = /<|&#?\w+;/,
-					rnoInnerhtml = /<(?:script|style|link)/i,
-					rnocache = /<(?:script|object|embed|option|style)/i,
-					rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-					rcheckableType = /^(?:checkbox|radio)$/,
-					// checked="checked" or checked
-					rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-					rscriptType = /\/(java|ecma)script/i,
-					rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
-					wrapMap = {
-						option: [ 1, "<select multiple='multiple'>", "</select>" ],
-						legend: [ 1, "<fieldset>", "</fieldset>" ],
-						thead: [ 1, "<table>", "</table>" ],
-						tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-						td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-						col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-						area: [ 1, "<map>", "</map>" ],
-						_default: [ 0, "", "" ]
-					},
-					safeFragment = createSafeFragment( document ),
-					fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-					
-					wrapMap.optgroup = wrapMap.option;
-					wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-					wrapMap.th = wrapMap.td;
-					
-					// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-					// unless wrapped in a div with non-breaking characters in front of it.
-					if ( !jQuery.support.htmlSerialize ) {
-						wrapMap._default = [ 1, "X<div>", "</div>" ];
-					}
-					
-					jQuery.fn.extend({
-						text: function( value ) {
-							return jQuery.access( this, function( value ) {
-								return value === undefined ?
-								jQuery.text( this ) :
-								this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-							}, null, value, arguments.length );
-						},
-						
-						wrapAll: function( html ) {
-							if ( jQuery.isFunction( html ) ) {
-								return this.each(function(i) {
-									jQuery(this).wrapAll( html.call(this, i) );
-								});
-							}
-							
-							if ( this[0] ) {
-								// The elements to wrap the target around
-								var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-								
-								if ( this[0].parentNode ) {
-									wrap.insertBefore( this[0] );
-								}
-								
-								wrap.map(function() {
-									var elem = this;
-									
-									while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-										elem = elem.firstChild;
-									}
-									
-									return elem;
-								}).append( this );
-							}
-							
-							return this;
-						},
-						
-						wrapInner: function( html ) {
-							if ( jQuery.isFunction( html ) ) {
-								return this.each(function(i) {
-									jQuery(this).wrapInner( html.call(this, i) );
-								});
-							}
-							
-							return this.each(function() {
-								var self = jQuery( this ),
-								contents = self.contents();
-								
-								if ( contents.length ) {
-									contents.wrapAll( html );
-									
-									} else {
-									self.append( html );
-								}
-							});
-						},
-						
-						wrap: function( html ) {
-							var isFunction = jQuery.isFunction( html );
-							
-							return this.each(function(i) {
-								jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-							});
-						},
-						
-						unwrap: function() {
-							return this.parent().each(function() {
-								if ( !jQuery.nodeName( this, "body" ) ) {
-									jQuery( this ).replaceWith( this.childNodes );
-								}
-							}).end();
-						},
-						
-						append: function() {
-							return this.domManip(arguments, true, function( elem ) {
-								if ( this.nodeType === 1 || this.nodeType === 11 ) {
-									this.appendChild( elem );
-								}
-							});
-						},
-						
-						prepend: function() {
-							return this.domManip(arguments, true, function( elem ) {
-								if ( this.nodeType === 1 || this.nodeType === 11 ) {
-									this.insertBefore( elem, this.firstChild );
-								}
-							});
-						},
-						
-						before: function() {
-							if ( !isDisconnected( this[0] ) ) {
-								return this.domManip(arguments, false, function( elem ) {
-									this.parentNode.insertBefore( elem, this );
-								});
-							}
-							
-							if ( arguments.length ) {
-								var set = jQuery.clean( arguments );
-								return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
-							}
-						},
-						
-						after: function() {
-							if ( !isDisconnected( this[0] ) ) {
-								return this.domManip(arguments, false, function( elem ) {
-									this.parentNode.insertBefore( elem, this.nextSibling );
-								});
-							}
-							
-							if ( arguments.length ) {
-								var set = jQuery.clean( arguments );
-								return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
-							}
-						},
-						
-						// keepData is for internal use only--do not document
-						remove: function( selector, keepData ) {
-							var elem,
-							i = 0;
-							
-							for ( ; (elem = this[i]) != null; i++ ) {
-								if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
-									if ( !keepData && elem.nodeType === 1 ) {
-										jQuery.cleanData( elem.getElementsByTagName("*") );
-										jQuery.cleanData( [ elem ] );
-									}
-									
-									if ( elem.parentNode ) {
-										elem.parentNode.removeChild( elem );
-									}
-								}
-							}
-							
-							return this;
-						},
-						
-						empty: function() {
-							var elem,
-							i = 0;
-							
-							for ( ; (elem = this[i]) != null; i++ ) {
-								// Remove element nodes and prevent memory leaks
-								if ( elem.nodeType === 1 ) {
-									jQuery.cleanData( elem.getElementsByTagName("*") );
-								}
-								
-								// Remove any remaining nodes
-								while ( elem.firstChild ) {
-									elem.removeChild( elem.firstChild );
-								}
-							}
-							
-							return this;
-						},
-						
-						clone: function( dataAndEvents, deepDataAndEvents ) {
-							dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-							deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-							
-							return this.map( function () {
-								return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-							});
-						},
-						
-						html: function( value ) {
-							return jQuery.access( this, function( value ) {
-								var elem = this[0] || {},
-								i = 0,
-								l = this.length;
-								
-								if ( value === undefined ) {
-									return elem.nodeType === 1 ?
-									elem.innerHTML.replace( rinlinejQuery, "" ) :
-									undefined;
-								}
-								
-								// See if we can take a shortcut and just use innerHTML
-								if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-								( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-								( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-								!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
-									
-									value = value.replace( rxhtmlTag, "<$1></$2>" );
-									
-									try {
-										for (; i < l; i++ ) {
-											// Remove element nodes and prevent memory leaks
-											elem = this[i] || {};
-											if ( elem.nodeType === 1 ) {
-												jQuery.cleanData( elem.getElementsByTagName( "*" ) );
-												elem.innerHTML = value;
-											}
-										}
-										
-										elem = 0;
-										
-										// If using innerHTML throws an exception, use the fallback method
-										} catch(e) {}
-									}
-									
-									if ( elem ) {
-										this.empty().append( value );
-									}
-								}, null, value, arguments.length );
-							},
-							
-							replaceWith: function( value ) {
-								if ( !isDisconnected( this[0] ) ) {
-									// Make sure that the elements are removed from the DOM before they are inserted
-									// this can help fix replacing a parent with child elements
-									if ( jQuery.isFunction( value ) ) {
-										return this.each(function(i) {
-											var self = jQuery(this), old = self.html();
-											self.replaceWith( value.call( this, i, old ) );
-										});
-									}
-									
-									if ( typeof value !== "string" ) {
-										value = jQuery( value ).detach();
-									}
-									
-									return this.each(function() {
-										var next = this.nextSibling,
-										parent = this.parentNode;
-										
-										jQuery( this ).remove();
-										
-										if ( next ) {
-											jQuery(next).before( value );
-											} else {
-											jQuery(parent).append( value );
-										}
-									});
-								}
-								
-								return this.length ?
-								this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-								this;
-							},
-							
-							detach: function( selector ) {
-								return this.remove( selector, true );
-							},
-							
-							domManip: function( args, table, callback ) {
-								
-								// Flatten any nested arrays
-								args = [].concat.apply( [], args );
-								
-								var results, first, fragment, iNoClone,
-								i = 0,
-								value = args[0],
-								scripts = [],
-								l = this.length;
-								
-								// We can't cloneNode fragments that contain checked, in WebKit
-								if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
-									return this.each(function() {
-										jQuery(this).domManip( args, table, callback );
-									});
-								}
-								
-								if ( jQuery.isFunction(value) ) {
-									return this.each(function(i) {
-										var self = jQuery(this);
-										args[0] = value.call( this, i, table ? self.html() : undefined );
-										self.domManip( args, table, callback );
-									});
-								}
-								
-								if ( this[0] ) {
-									results = jQuery.buildFragment( args, this, scripts );
-									fragment = results.fragment;
-									first = fragment.firstChild;
-									
-									if ( fragment.childNodes.length === 1 ) {
-										fragment = first;
-									}
-									
-									if ( first ) {
-										table = table && jQuery.nodeName( first, "tr" );
-										
-										// Use the original fragment for the last item instead of the first because it can end up
-										// being emptied incorrectly in certain situations (#8070).
-										// Fragments from the fragment cache must always be cloned and never used in place.
-										for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
-											callback.call(
-											table && jQuery.nodeName( this[i], "table" ) ?
-											findOrAppend( this[i], "tbody" ) :
-											this[i],
-											i === iNoClone ?
-											fragment :
-											jQuery.clone( fragment, true, true )
-											);
-										}
-									}
-									
-									// Fix #11809: Avoid leaking memory
-									fragment = first = null;
-									
-									if ( scripts.length ) {
-										jQuery.each( scripts, function( i, elem ) {
-											if ( elem.src ) {
-												if ( jQuery.ajax ) {
-													jQuery.ajax({
-														url: elem.src,
-														type: "GET",
-														dataType: "script",
-														async: false,
-														global: false,
-														"throws": true
-													});
-													} else {
-													jQuery.error("no ajax");
-												}
-												} else {
-												jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
-											}
-											
-											if ( elem.parentNode ) {
-												elem.parentNode.removeChild( elem );
-											}
-										});
-									}
-								}
-								
-								return this;
-							}
-						});
-						
-						function findOrAppend( elem, tag ) {
-							return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
-						}
-						
-						function cloneCopyEvent( src, dest ) {
-							
-							if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-								return;
-							}
-							
-							var type, i, l,
-							oldData = jQuery._data( src ),
-							curData = jQuery._data( dest, oldData ),
-							events = oldData.events;
-							
-							if ( events ) {
-								delete curData.handle;
-								curData.events = {};
-								
-								for ( type in events ) {
-									for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-										jQuery.event.add( dest, type, events[ type ][ i ] );
-									}
-								}
-							}
-							
-							// make the cloned public data object a copy from the original
-							if ( curData.data ) {
-								curData.data = jQuery.extend( {}, curData.data );
-							}
-						}
-						
-						function cloneFixAttributes( src, dest ) {
-							var nodeName;
-							
-							// We do not need to do anything for non-Elements
-							if ( dest.nodeType !== 1 ) {
-								return;
-							}
-							
-							// clearAttributes removes the attributes, which we don't want,
-							// but also removes the attachEvent events, which we *do* want
-							if ( dest.clearAttributes ) {
-								dest.clearAttributes();
-							}
-							
-							// mergeAttributes, in contrast, only merges back on the
-							// original attributes, not the events
-							if ( dest.mergeAttributes ) {
-								dest.mergeAttributes( src );
-							}
-							
-							nodeName = dest.nodeName.toLowerCase();
-							
-							if ( nodeName === "object" ) {
-								// IE6-10 improperly clones children of object elements using classid.
-								// IE10 throws NoModificationAllowedError if parent is null, #12132.
-								if ( dest.parentNode ) {
-									dest.outerHTML = src.outerHTML;
-								}
-								
-								// This path appears unavoidable for IE9. When cloning an object
-								// element in IE9, the outerHTML strategy above is not sufficient.
-								// If the src has innerHTML and the destination does not,
-								// copy the src.innerHTML into the dest.innerHTML. #10324
-								if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
-									dest.innerHTML = src.innerHTML;
-								}
-								
-								} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-								// IE6-8 fails to persist the checked state of a cloned checkbox
-								// or radio button. Worse, IE6-7 fail to give the cloned element
-								// a checked appearance if the defaultChecked value isn't also set
-								
-								dest.defaultChecked = dest.checked = src.checked;
-								
-								// IE6-7 get confused and end up setting the value of a cloned
-								// checkbox/radio button to an empty string instead of "on"
-								if ( dest.value !== src.value ) {
-									dest.value = src.value;
-								}
-								
-								// IE6-8 fails to return the selected option to the default selected
-								// state when cloning options
-								} else if ( nodeName === "option" ) {
-								dest.selected = src.defaultSelected;
-								
-								// IE6-8 fails to set the defaultValue to the correct value when
-								// cloning other types of input fields
-								} else if ( nodeName === "input" || nodeName === "textarea" ) {
-								dest.defaultValue = src.defaultValue;
-								
-								// IE blanks contents when cloning scripts
-								} else if ( nodeName === "script" && dest.text !== src.text ) {
-								dest.text = src.text;
-							}
-							
-							// Event data gets referenced instead of copied if the expando
-							// gets copied too
-							dest.removeAttribute( jQuery.expando );
-						}
-						
-						jQuery.buildFragment = function( args, context, scripts ) {
-							var fragment, cacheable, cachehit,
-							first = args[ 0 ];
-							
-							// Set context from what may come in as undefined or a jQuery collection or a node
-							// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
-							// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
-							context = context || document;
-							context = !context.nodeType && context[0] || context;
-							context = context.ownerDocument || context;
-							
-							// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
-							// Cloning options loses the selected state, so don't cache them
-							// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
-							// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
-							// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
-							if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
-							first.charAt(0) === "<" && !rnocache.test( first ) &&
-							(jQuery.support.checkClone || !rchecked.test( first )) &&
-							(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-								
-								// Mark cacheable and look for a hit
-								cacheable = true;
-								fragment = jQuery.fragments[ first ];
-								cachehit = fragment !== undefined;
-							}
-							
-							if ( !fragment ) {
-								fragment = context.createDocumentFragment();
-								jQuery.clean( args, context, fragment, scripts );
-								
-								// Update the cache, but only store false
-								// unless this is a second parsing of the same content
-								if ( cacheable ) {
-									jQuery.fragments[ first ] = cachehit && fragment;
-								}
-							}
-							
-							return { fragment: fragment, cacheable: cacheable };
-						};
-						
-						jQuery.fragments = {};
-						
-						jQuery.each({
-							appendTo: "append",
-							prependTo: "prepend",
-							insertBefore: "before",
-							insertAfter: "after",
-							replaceAll: "replaceWith"
-							}, function( name, original ) {
-							jQuery.fn[ name ] = function( selector ) {
-								var elems,
-								i = 0,
-								ret = [],
-								insert = jQuery( selector ),
-								l = insert.length,
-								parent = this.length === 1 && this[0].parentNode;
-								
-								if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
-									insert[ original ]( this[0] );
-									return this;
-									} else {
-									for ( ; i < l; i++ ) {
-										elems = ( i > 0 ? this.clone(true) : this ).get();
-										jQuery( insert[i] )[ original ]( elems );
-										ret = ret.concat( elems );
-									}
-									
-									return this.pushStack( ret, name, insert.selector );
-								}
-							};
-						});
-						
-						function getAll( elem ) {
-							if ( typeof elem.getElementsByTagName !== "undefined" ) {
-								return elem.getElementsByTagName( "*" );
-								
-								} else if ( typeof elem.querySelectorAll !== "undefined" ) {
-								return elem.querySelectorAll( "*" );
-								
-								} else {
-								return [];
-							}
-						}
-						
-						// Used in clean, fixes the defaultChecked property
-						function fixDefaultChecked( elem ) {
-							if ( rcheckableType.test( elem.type ) ) {
-								elem.defaultChecked = elem.checked;
-							}
-						}
-						
-						jQuery.extend({
-							clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-								var srcElements,
-								destElements,
-								i,
-								clone;
-								
-								if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-									clone = elem.cloneNode( true );
-									
-									// IE<=8 does not properly clone detached, unknown element nodes
-									} else {
-									fragmentDiv.innerHTML = elem.outerHTML;
-									fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
-								}
-								
-								if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-								(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-									// IE copies events bound via attachEvent when using cloneNode.
-									// Calling detachEvent on the clone will also remove the events
-									// from the original. In order to get around this, we use some
-									// proprietary methods to clear the events. Thanks to MooTools
-									// guys for this hotness.
-									
-									cloneFixAttributes( elem, clone );
-									
-									// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
-									srcElements = getAll( elem );
-									destElements = getAll( clone );
-									
-									// Weird iteration because IE will replace the length property
-									// with an element if you are cloning the body and one of the
-									// elements on the page has a name or id of "length"
-									for ( i = 0; srcElements[i]; ++i ) {
-										// Ensure that the destination node is not null; Fixes #9587
-										if ( destElements[i] ) {
-											cloneFixAttributes( srcElements[i], destElements[i] );
-										}
-									}
-								}
-								
-								// Copy the events from the original to the clone
-								if ( dataAndEvents ) {
-									cloneCopyEvent( elem, clone );
-									
-									if ( deepDataAndEvents ) {
-										srcElements = getAll( elem );
-										destElements = getAll( clone );
-										
-										for ( i = 0; srcElements[i]; ++i ) {
-											cloneCopyEvent( srcElements[i], destElements[i] );
-										}
-									}
-								}
-								
-								srcElements = destElements = null;
-								
-								// Return the cloned set
-								return clone;
-							},
-							
-							clean: function( elems, context, fragment, scripts ) {
-								var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
-								safe = context === document && safeFragment,
-								ret = [];
-								
-								// Ensure that context is a document
-								if ( !context || typeof context.createDocumentFragment === "undefined" ) {
-									context = document;
-								}
-								
-								// Use the already-created safe fragment if context permits
-								for ( i = 0; (elem = elems[i]) != null; i++ ) {
-									if ( typeof elem === "number" ) {
-										elem += "";
-									}
-									
-									if ( !elem ) {
-										continue;
-									}
-									
-									// Convert html string into DOM nodes
-									if ( typeof elem === "string" ) {
-										if ( !rhtml.test( elem ) ) {
-											elem = context.createTextNode( elem );
-											} else {
-											// Ensure a safe container in which to render the html
-											safe = safe || createSafeFragment( context );
-											div = context.createElement("div");
-											safe.appendChild( div );
-											
-											// Fix "XHTML"-style tags in all browsers
-											elem = elem.replace(rxhtmlTag, "<$1></$2>");
-											
-											// Go to html and back, then peel off extra wrappers
-											tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
-											wrap = wrapMap[ tag ] || wrapMap._default;
-											depth = wrap[0];
-											div.innerHTML = wrap[1] + elem + wrap[2];
-											
-											// Move to the right depth
-											while ( depth-- ) {
-												div = div.lastChild;
-											}
-											
-											// Remove IE's autoinserted <tbody> from table fragments
-											if ( !jQuery.support.tbody ) {
-												
-												// String was a <table>, *may* have spurious <tbody>
-												hasBody = rtbody.test(elem);
-												tbody = tag === "table" && !hasBody ?
-												div.firstChild && div.firstChild.childNodes :
-												
-												// String was a bare <thead> or <tfoot>
-												wrap[1] === "<table>" && !hasBody ?
-												div.childNodes :
-												[];
-												
-												for ( j = tbody.length - 1; j >= 0 ; --j ) {
-													if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-														tbody[ j ].parentNode.removeChild( tbody[ j ] );
-													}
-												}
-											}
-											
-											// IE completely kills leading whitespace when innerHTML is used
-											if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-												div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
-											}
-											
-											elem = div.childNodes;
-											
-											// Take out of fragment container (we need a fresh div each time)
-											div.parentNode.removeChild( div );
-										}
-									}
-									
-									if ( elem.nodeType ) {
-										ret.push( elem );
-										} else {
-										jQuery.merge( ret, elem );
-									}
-								}
-								
-								// Fix #11356: Clear elements from safeFragment
-								if ( div ) {
-									elem = div = safe = null;
-								}
-								
-								// Reset defaultChecked for any radios and checkboxes
-								// about to be appended to the DOM in IE 6/7 (#8060)
-								if ( !jQuery.support.appendChecked ) {
-									for ( i = 0; (elem = ret[i]) != null; i++ ) {
-										if ( jQuery.nodeName( elem, "input" ) ) {
-											fixDefaultChecked( elem );
-											} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
-											jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
-										}
-									}
-								}
-								
-								// Append elements to a provided document fragment
-								if ( fragment ) {
-									// Special handling of each script element
-									handleScript = function( elem ) {
-										// Check if we consider it executable
-										if ( !elem.type || rscriptType.test( elem.type ) ) {
-											// Detach the script and store it in the scripts array (if provided) or the fragment
-											// Return truthy to indicate that it has been handled
-											return scripts ?
-											scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
-											fragment.appendChild( elem );
-										}
-									};
-									
-									for ( i = 0; (elem = ret[i]) != null; i++ ) {
-										// Check if we're done after handling an executable script
-										if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
-											// Append to fragment and handle embedded scripts
-											fragment.appendChild( elem );
-											if ( typeof elem.getElementsByTagName !== "undefined" ) {
-												// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
-												jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-												
-												// Splice the scripts into ret after their former ancestor and advance our index beyond them
-												ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
-												i += jsTags.length;
-											}
-										}
-									}
-								}
-								
-								return ret;
-							},
-							
-							cleanData: function( elems, /* internal */ acceptData ) {
-								var data, id, elem, type,
-								i = 0,
-								internalKey = jQuery.expando,
-								cache = jQuery.cache,
-								deleteExpando = jQuery.support.deleteExpando,
-								special = jQuery.event.special;
-								
-								for ( ; (elem = elems[i]) != null; i++ ) {
-									
-									if ( acceptData || jQuery.acceptData( elem ) ) {
-										
-										id = elem[ internalKey ];
-										data = id && cache[ id ];
-										
-										if ( data ) {
-											if ( data.events ) {
-												for ( type in data.events ) {
-													if ( special[ type ] ) {
-														jQuery.event.remove( elem, type );
-														
-														// This is a shortcut to avoid jQuery.event.remove's overhead
-														} else {
-														jQuery.removeEvent( elem, type, data.handle );
-													}
-												}
-											}
-											
-											// Remove cache only if it was not already removed by jQuery.event.remove
-											if ( cache[ id ] ) {
-												
-												delete cache[ id ];
-												
-												// IE does not allow us to delete expando properties from nodes,
-												// nor does it have a removeAttribute function on Document nodes;
-												// we must handle all of these cases
-												if ( deleteExpando ) {
-													delete elem[ internalKey ];
-													
-													} else if ( elem.removeAttribute ) {
-													elem.removeAttribute( internalKey );
-													
-													} else {
-													elem[ internalKey ] = null;
-												}
-												
-												jQuery.deletedIds.push( id );
-											}
-										}
-									}
-								}
-							}
-						});
-						// Limit scope pollution from any deprecated API
-						(function() {
-							
-							var matched, browser;
-							
-							// Use of jQuery.browser is frowned upon.
-							// More details: http://api.jquery.com/jQuery.browser
-							// jQuery.uaMatch maintained for back-compat
-							jQuery.uaMatch = function( ua ) {
-								ua = ua.toLowerCase();
-								
-								var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
-								/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
-								/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
-								/(msie) ([\w.]+)/.exec( ua ) ||
-								ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
-								[];
-								
-								return {
-									browser: match[ 1 ] || "",
-									version: match[ 2 ] || "0"
-								};
-							};
-							
-							matched = jQuery.uaMatch( navigator.userAgent );
-							browser = {};
-							
-							if ( matched.browser ) {
-								browser[ matched.browser ] = true;
-								browser.version = matched.version;
-							}
-							
-							// Chrome is Webkit, but Webkit is also Safari.
-							if ( browser.chrome ) {
-								browser.webkit = true;
-								} else if ( browser.webkit ) {
-								browser.safari = true;
-							}
-							
-							jQuery.browser = browser;
-							
-							jQuery.sub = function() {
-								function jQuerySub( selector, context ) {
-									return new jQuerySub.fn.init( selector, context );
-								}
-								jQuery.extend( true, jQuerySub, this );
-								jQuerySub.superclass = this;
-								jQuerySub.fn = jQuerySub.prototype = this();
-								jQuerySub.fn.constructor = jQuerySub;
-								jQuerySub.sub = this.sub;
-								jQuerySub.fn.init = function init( selector, context ) {
-									if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
-										context = jQuerySub( context );
-									}
-									
-									return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-								};
-								jQuerySub.fn.init.prototype = jQuerySub.fn;
-								var rootjQuerySub = jQuerySub(document);
-								return jQuerySub;
-							};
-							
-						})();
-						var curCSS, iframe, iframeDoc,
-						ralpha = /alpha\([^)]*\)/i,
-						ropacity = /opacity=([^)]*)/,
-						rposition = /^(top|right|bottom|left)$/,
-						// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
-						// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-						rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-						rmargin = /^margin/,
-						rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
-						rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
-						rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
-						elemdisplay = { BODY: "block" },
-						
-						cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-						cssNormalTransform = {
-							letterSpacing: 0,
-							fontWeight: 400
-						},
-						
-						cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-						cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
-						
-						eventsToggle = jQuery.fn.toggle;
-						
-						// return a css property mapped to a potentially vendor prefixed property
-						function vendorPropName( style, name ) {
-							
-							// shortcut for names that are not vendor prefixed
-							if ( name in style ) {
-								return name;
-							}
-							
-							// check for vendor prefixed names
-							var capName = name.charAt(0).toUpperCase() + name.slice(1),
-							origName = name,
-							i = cssPrefixes.length;
-							
-							while ( i-- ) {
-								name = cssPrefixes[ i ] + capName;
-								if ( name in style ) {
-									return name;
-								}
-							}
-							
-							return origName;
-						}
-						
-						function isHidden( elem, el ) {
-							elem = el || elem;
-							return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-						}
-						
-						function showHide( elements, show ) {
-							var elem, display,
-							values = [],
-							index = 0,
-							length = elements.length;
-							
-							for ( ; index < length; index++ ) {
-								elem = elements[ index ];
-								if ( !elem.style ) {
-									continue;
-								}
-								values[ index ] = jQuery._data( elem, "olddisplay" );
-								if ( show ) {
-									// Reset the inline display of this element to learn if it is
-									// being hidden by cascaded rules or not
-									if ( !values[ index ] && elem.style.display === "none" ) {
-										elem.style.display = "";
-									}
-									
-									// Set elements which have been overridden with display: none
-									// in a stylesheet to whatever the default browser style is
-									// for such an element
-									if ( elem.style.display === "" && isHidden( elem ) ) {
-										values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
-									}
-									} else {
-									display = curCSS( elem, "display" );
-									
-									if ( !values[ index ] && display !== "none" ) {
-										jQuery._data( elem, "olddisplay", display );
-									}
-								}
-							}
-							
-							// Set the display of most of the elements in a second loop
-							// to avoid the constant reflow
-							for ( index = 0; index < length; index++ ) {
-								elem = elements[ index ];
-								if ( !elem.style ) {
-									continue;
-								}
-								if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-									elem.style.display = show ? values[ index ] || "" : "none";
-								}
-							}
-							
-							return elements;
-						}
-						
-						jQuery.fn.extend({
-							css: function( name, value ) {
-								return jQuery.access( this, function( elem, name, value ) {
-									return value !== undefined ?
-									jQuery.style( elem, name, value ) :
-									jQuery.css( elem, name );
-								}, name, value, arguments.length > 1 );
-							},
-							show: function() {
-								return showHide( this, true );
-							},
-							hide: function() {
-								return showHide( this );
-							},
-							toggle: function( state, fn2 ) {
-								var bool = typeof state === "boolean";
-								
-								if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
-									return eventsToggle.apply( this, arguments );
-								}
-								
-								return this.each(function() {
-									if ( bool ? state : isHidden( this ) ) {
-										jQuery( this ).show();
-										} else {
-										jQuery( this ).hide();
-									}
-								});
-							}
-						});
-						
-						jQuery.extend({
-							// Add in style property hooks for overriding the default
-							// behavior of getting and setting a style property
-							cssHooks: {
-								opacity: {
-									get: function( elem, computed ) {
-										if ( computed ) {
-											// We should always get a number back from opacity
-											var ret = curCSS( elem, "opacity" );
-											return ret === "" ? "1" : ret;
-											
-										}
-									}
-								}
-							},
-							
-							// Exclude the following css properties to add px
-							cssNumber: {
-								"fillOpacity": true,
-								"fontWeight": true,
-								"lineHeight": true,
-								"opacity": true,
-								"orphans": true,
-								"widows": true,
-								"zIndex": true,
-								"zoom": true
-							},
-							
-							// Add in properties whose names you wish to fix before
-							// setting or getting the value
-							cssProps: {
-								// normalize float css property
-								"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-							},
-							
-							// Get and set the style property on a DOM Node
-							style: function( elem, name, value, extra ) {
-								// Don't set styles on text and comment nodes
-								if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-									return;
-								}
-								
-								// Make sure that we're working with the right name
-								var ret, type, hooks,
-								origName = jQuery.camelCase( name ),
-								style = elem.style;
-								
-								name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
-								
-								// gets hook for the prefixed version
-								// followed by the unprefixed version
-								hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-								
-								// Check if we're setting a value
-								if ( value !== undefined ) {
-									type = typeof value;
-									
-									// convert relative number strings (+= or -=) to relative numbers. #7345
-									if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-										value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
-										// Fixes bug #9237
-										type = "number";
-									}
-									
-									// Make sure that NaN and null values aren't set. See: #7116
-									if ( value == null || type === "number" && isNaN( value ) ) {
-										return;
-									}
-									
-									// If a number was passed in, add 'px' to the (except for certain CSS properties)
-									if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-										value += "px";
-									}
-									
-									// If a hook was provided, use that value, otherwise just set the specified value
-									if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-										// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-										// Fixes bug #5509
-										try {
-											style[ name ] = value;
-											} catch(e) {}
-										}
-										
-										} else {
-										// If a hook was provided get the non-computed value from there
-										if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-											return ret;
-										}
-										
-										// Otherwise just get the value from the style object
-										return style[ name ];
-									}
-								},
-								
-								css: function( elem, name, numeric, extra ) {
-									var val, num, hooks,
-									origName = jQuery.camelCase( name );
-									
-									// Make sure that we're working with the right name
-									name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
-									
-									// gets hook for the prefixed version
-									// followed by the unprefixed version
-									hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-									
-									// If a hook was provided get the computed value from there
-									if ( hooks && "get" in hooks ) {
-										val = hooks.get( elem, true, extra );
-									}
-									
-									// Otherwise, if a way to get the computed value exists, use that
-									if ( val === undefined ) {
-										val = curCSS( elem, name );
-									}
-									
-									//convert "normal" to computed value
-									if ( val === "normal" && name in cssNormalTransform ) {
-										val = cssNormalTransform[ name ];
-									}
-									
-									// Return, converting to number if forced or a qualifier was provided and val looks numeric
-									if ( numeric || extra !== undefined ) {
-										num = parseFloat( val );
-										return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
-									}
-									return val;
-								},
-								
-								// A method for quickly swapping in/out CSS properties to get correct calculations
-								swap: function( elem, options, callback ) {
-									var ret, name,
-									old = {};
-									
-									// Remember the old values, and insert the new ones
-									for ( name in options ) {
-										old[ name ] = elem.style[ name ];
-										elem.style[ name ] = options[ name ];
-									}
-									
-									ret = callback.call( elem );
-									
-									// Revert the old values
-									for ( name in options ) {
-										elem.style[ name ] = old[ name ];
-									}
-									
-									return ret;
-								}
-							});
-							
-							// NOTE: To any future maintainer, we've window.getComputedStyle
-							// because jsdom on node.js will break without it.
-							if ( window.getComputedStyle ) {
-								curCSS = function( elem, name ) {
-									var ret, width, minWidth, maxWidth,
-									computed = window.getComputedStyle( elem, null ),
-									style = elem.style;
-									
-									if ( computed ) {
-										
-										// getPropertyValue is only needed for .css('filter') in IE9, see #12537
-										ret = computed.getPropertyValue( name ) || computed[ name ];
-										
-										if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-											ret = jQuery.style( elem, name );
-										}
-										
-										// A tribute to the "awesome hack by Dean Edwards"
-										// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
-										// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
-										// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-										if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-											width = style.width;
-											minWidth = style.minWidth;
-											maxWidth = style.maxWidth;
-											
-											style.minWidth = style.maxWidth = style.width = ret;
-											ret = computed.width;
-											
-											style.width = width;
-											style.minWidth = minWidth;
-											style.maxWidth = maxWidth;
-										}
-									}
-									
-									return ret;
-								};
-								} else if ( document.documentElement.currentStyle ) {
-								curCSS = function( elem, name ) {
-									var left, rsLeft,
-									ret = elem.currentStyle && elem.currentStyle[ name ],
-									style = elem.style;
-									
-									// Avoid setting ret to empty string here
-									// so we don't default to auto
-									if ( ret == null && style && style[ name ] ) {
-										ret = style[ name ];
-									}
-									
-									// From the awesome hack by Dean Edwards
-									// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-									
-									// If we're not dealing with a regular pixel number
-									// but a number that has a weird ending, we need to convert it to pixels
-									// but not position css attributes, as those are proportional to the parent element instead
-									// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
-									if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-										
-										// Remember the original values
-										left = style.left;
-										rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
-										
-										// Put in the new values to get a computed value out
-										if ( rsLeft ) {
-											elem.runtimeStyle.left = elem.currentStyle.left;
-										}
-										style.left = name === "fontSize" ? "1em" : ret;
-										ret = style.pixelLeft + "px";
-										
-										// Revert the changed values
-										style.left = left;
-										if ( rsLeft ) {
-											elem.runtimeStyle.left = rsLeft;
-										}
-									}
-									
-									return ret === "" ? "auto" : ret;
-								};
-							}
-							
-							function setPositiveNumber( elem, value, subtract ) {
-								var matches = rnumsplit.exec( value );
-								return matches ?
-								Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-								value;
-							}
-							
-							function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
-								var i = extra === ( isBorderBox ? "border" : "content" ) ?
-								// If we already have the right measurement, avoid augmentation
-								4 :
-								// Otherwise initialize for horizontal or vertical properties
-								name === "width" ? 1 : 0,
-								
-								val = 0;
-								
-								for ( ; i < 4; i += 2 ) {
-									// both box models exclude margin, so add it if we want it
-									if ( extra === "margin" ) {
-										// we use jQuery.css instead of curCSS here
-										// because of the reliableMarginRight CSS hook!
-										val += jQuery.css( elem, extra + cssExpand[ i ], true );
-									}
-									
-									// From this point on we use curCSS for maximum performance (relevant in animations)
-									if ( isBorderBox ) {
-										// border-box includes padding, so remove it if we want content
-										if ( extra === "content" ) {
-											val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
-										}
-										
-										// at this point, extra isn't border nor margin, so remove border
-										if ( extra !== "margin" ) {
-											val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-										}
-										} else {
-										// at this point, extra isn't content, so add padding
-										val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
-										
-										// at this point, extra isn't content nor padding, so add border
-										if ( extra !== "padding" ) {
-											val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-										}
-									}
-								}
-								
-								return val;
-							}
-							
-							function getWidthOrHeight( elem, name, extra ) {
-								
-								// Start with offset property, which is equivalent to the border-box value
-								var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-								valueIsBorderBox = true,
-								isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
-								
-								// some non-html elements return undefined for offsetWidth, so check for null/undefined
-								// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-								// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-								if ( val <= 0 || val == null ) {
-									// Fall back to computed then uncomputed css if necessary
-									val = curCSS( elem, name );
-									if ( val < 0 || val == null ) {
-										val = elem.style[ name ];
-									}
-									
-									// Computed unit is not pixels. Stop here and return.
-									if ( rnumnonpx.test(val) ) {
-										return val;
-									}
-									
-									// we need the check for style in case a browser which returns unreliable values
-									// for getComputedStyle silently falls back to the reliable elem.style
-									valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
-									
-									// Normalize "", auto, and prepare for extra
-									val = parseFloat( val ) || 0;
-								}
-								
-								// use the active box-sizing model to add/subtract irrelevant styles
-								return ( val +
-								augmentWidthOrHeight(
-								elem,
-								name,
-								extra || ( isBorderBox ? "border" : "content" ),
-								valueIsBorderBox
-								)
-								) + "px";
-							}
-							
-							
-							// Try to determine the default display value of an element
-							function css_defaultDisplay( nodeName ) {
-								if ( elemdisplay[ nodeName ] ) {
-									return elemdisplay[ nodeName ];
-								}
-								
-								var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
-								display = elem.css("display");
-								elem.remove();
-								
-								// If the simple way fails,
-								// get element's real default display by attaching it to a temp iframe
-								if ( display === "none" || display === "" ) {
-									// Use the already-created iframe if possible
-									iframe = document.body.appendChild(
-									iframe || jQuery.extend( document.createElement("iframe"), {
-										frameBorder: 0,
-										width: 0,
-										height: 0
-									})
-									);
-									
-									// Create a cacheable copy of the iframe document on first call.
-									// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
-									// document to it; WebKit & Firefox won't allow reusing the iframe document.
-									if ( !iframeDoc || !iframe.createElement ) {
-										iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-										iframeDoc.write("<!doctype html><html><body>");
-										iframeDoc.close();
-									}
-									
-									elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
-									
-									display = curCSS( elem, "display" );
-									document.body.removeChild( iframe );
-								}
-								
-								// Store the correct default display
-								elemdisplay[ nodeName ] = display;
-								
-								return display;
-							}
-							
-							jQuery.each([ "height", "width" ], function( i, name ) {
-								jQuery.cssHooks[ name ] = {
-									get: function( elem, computed, extra ) {
-										if ( computed ) {
-											// certain elements can have dimension info if we invisibly show them
-											// however, it must have a current display style that would benefit from this
-											if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
-												return jQuery.swap( elem, cssShow, function() {
-													return getWidthOrHeight( elem, name, extra );
-												});
-												} else {
-												return getWidthOrHeight( elem, name, extra );
-											}
-										}
-									},
-									
-									set: function( elem, value, extra ) {
-										return setPositiveNumber( elem, value, extra ?
-										augmentWidthOrHeight(
-										elem,
-										name,
-										extra,
-										jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
-										) : 0
-										);
-									}
-								};
-							});
-							
-							if ( !jQuery.support.opacity ) {
-								jQuery.cssHooks.opacity = {
-									get: function( elem, computed ) {
-										// IE uses filters for opacity
-										return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-										( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
-										computed ? "1" : "";
-									},
-									
-									set: function( elem, value ) {
-										var style = elem.style,
-										currentStyle = elem.currentStyle,
-										opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-										filter = currentStyle && currentStyle.filter || style.filter || "";
-										
-										// IE has trouble with opacity if it does not have layout
-										// Force it by setting the zoom level
-										style.zoom = 1;
-										
-										// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-										if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-										style.removeAttribute ) {
-											
-											// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-											// if "filter:" is present at all, clearType is disabled, we want to avoid this
-											// style.removeAttribute is IE Only, but so apparently is this code path...
-											style.removeAttribute( "filter" );
-											
-											// if there there is no filter style applied in a css rule, we are done
-											if ( currentStyle && !currentStyle.filter ) {
-												return;
-											}
-										}
-										
-										// otherwise, set new filter values
-										style.filter = ralpha.test( filter ) ?
-										filter.replace( ralpha, opacity ) :
-										filter + " " + opacity;
-									}
-								};
-							}
-							
-							// These hooks cannot be added until DOM ready because the support test
-							// for it is not run until after DOM ready
-							jQuery(function() {
-								if ( !jQuery.support.reliableMarginRight ) {
-									jQuery.cssHooks.marginRight = {
-										get: function( elem, computed ) {
-											// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-											// Work around by temporarily setting element display to inline-block
-											return jQuery.swap( elem, { "display": "inline-block" }, function() {
-											if ( computed ) {
-												return curCSS( elem, "marginRight" );
-											}
-										});
-									}
-								};
-							}
-							
-							// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-							// getComputedStyle returns percent when specified for top/left/bottom/right
-							// rather than make the css module depend on the offset module, we just check for it here
-							if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
-								jQuery.each( [ "top", "left" ], function( i, prop ) {
-									jQuery.cssHooks[ prop ] = {
-										get: function( elem, computed ) {
-											if ( computed ) {
-												var ret = curCSS( elem, prop );
-												// if curCSS returns percentage, fallback to offset
-												return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
-											}
-										}
-									};
-								});
-							}
-							
-						});
-						
-						if ( jQuery.expr && jQuery.expr.filters ) {
-							jQuery.expr.filters.hidden = function( elem ) {
-								return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
-							};
-							
-							jQuery.expr.filters.visible = function( elem ) {
-								return !jQuery.expr.filters.hidden( elem );
-							};
-						}
-						
-						// These hooks are used by animate to expand properties
-						jQuery.each({
-							margin: "",
-							padding: "",
-							border: "Width"
-							}, function( prefix, suffix ) {
-							jQuery.cssHooks[ prefix + suffix ] = {
-								expand: function( value ) {
-									var i,
-									
-									// assumes a single number if not a string
-									parts = typeof value === "string" ? value.split(" ") : [ value ],
-									expanded = {};
-									
-									for ( i = 0; i < 4; i++ ) {
-										expanded[ prefix + cssExpand[ i ] + suffix ] =
-										parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-									}
-									
-									return expanded;
-								}
-							};
-							
-							if ( !rmargin.test( prefix ) ) {
-								jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-							}
-						});
-						var r20 = /%20/g,
-						rbracket = /\[\]$/,
-						rCRLF = /\r?\n/g,
-						rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-						rselectTextarea = /^(?:select|textarea)/i;
-						
-						jQuery.fn.extend({
-							serialize: function() {
-								return jQuery.param( this.serializeArray() );
-							},
-							serializeArray: function() {
-								return this.map(function(){
-									return this.elements ? jQuery.makeArray( this.elements ) : this;
-								})
-								.filter(function(){
-									return this.name && !this.disabled &&
-									( this.checked || rselectTextarea.test( this.nodeName ) ||
-									rinput.test( this.type ) );
-								})
-								.map(function( i, elem ){
-									var val = jQuery( this ).val();
-									
-									return val == null ?
-									null :
-									jQuery.isArray( val ) ?
-									jQuery.map( val, function( val, i ){
-										return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-									}) :
-									{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-								}).get();
-							}
-						});
-						
-						//Serialize an array of form elements or a set of
-						//key/values into a query string
-						jQuery.param = function( a, traditional ) {
-							var prefix,
-							s = [],
-							add = function( key, value ) {
-								// If value is a function, invoke it and return its value
-								value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-								s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-							};
-							
-							// Set traditional to true for jQuery <= 1.3.2 behavior.
-							if ( traditional === undefined ) {
-								traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-							}
-							
-							// If an array was passed in, assume that it is an array of form elements.
-							if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-								// Serialize the form elements
-								jQuery.each( a, function() {
-									add( this.name, this.value );
-								});
-								
-								} else {
-								// If traditional, encode the "old" way (the way 1.3.2 or older
-								// did it), otherwise encode params recursively.
-								for ( prefix in a ) {
-									buildParams( prefix, a[ prefix ], traditional, add );
-								}
-							}
-							
-							// Return the resulting serialization
-							return s.join( "&" ).replace( r20, "+" );
-						};
-						
-						function buildParams( prefix, obj, traditional, add ) {
-							var name;
-							
-							if ( jQuery.isArray( obj ) ) {
-								// Serialize array item.
-								jQuery.each( obj, function( i, v ) {
-									if ( traditional || rbracket.test( prefix ) ) {
-										// Treat each array item as a scalar.
-										add( prefix, v );
-										
-										} else {
-										// If array item is non-scalar (array or object), encode its
-										// numeric index to resolve deserialization ambiguity issues.
-										// Note that rack (as of 1.0.0) can't currently deserialize
-										// nested arrays properly, and attempting to do so may cause
-										// a server error. Possible fixes are to modify rack's
-										// deserialization algorithm or to provide an option or flag
-										// to force array serialization to be shallow.
-										buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
-									}
-								});
-								
-								} else if ( !traditional && jQuery.type( obj ) === "object" ) {
-								// Serialize object item.
-								for ( name in obj ) {
-									buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-								}
-								
-								} else {
-								// Serialize scalar item.
-								add( prefix, obj );
-							}
-						}
-						var
-						// Document location
-						ajaxLocParts,
-						ajaxLocation,
-						
-						rhash = /#.*$/,
-						rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-						// #7653, #8125, #8152: local protocol detection
-						rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
-						rnoContent = /^(?:GET|HEAD)$/,
-						rprotocol = /^\/\//,
-						rquery = /\?/,
-						rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-						rts = /([?&])_=[^&]*/,
-						rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
-						
-						// Keep a copy of the old load method
-						_load = jQuery.fn.load,
-						
-						/* Prefilters
-						* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-						* 2) These are called:
-						*    - BEFORE asking for a transport
-						*    - AFTER param serialization (s.data is a string if s.processData is true)
-						* 3) key is the dataType
-						* 4) the catchall symbol "*" can be used
-						* 5) execution will start with transport dataType and THEN continue down to "*" if needed
-						*/
-						prefilters = {},
-						
-						/* Transports bindings
-						* 1) key is the dataType
-						* 2) the catchall symbol "*" can be used
-						* 3) selection will start with transport dataType and THEN go to "*" if needed
-						*/
-						transports = {},
-						
-						// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-						allTypes = ["*/"] + ["*"];
-						
-						// #8138, IE may throw an exception when accessing
-						// a field from window.location if document.domain has been set
-						try {
-							ajaxLocation = location.href;
-							} catch( e ) {
-							// Use the href attribute of an A element
-							// since IE will modify it given document.location
-							ajaxLocation = document.createElement( "a" );
-							ajaxLocation.href = "";
-							ajaxLocation = ajaxLocation.href;
-						}
-						
-						// Segment location into parts
-						ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-						
-						// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-						function addToPrefiltersOrTransports( structure ) {
-							
-							// dataTypeExpression is optional and defaults to "*"
-							return function( dataTypeExpression, func ) {
-								
-								if ( typeof dataTypeExpression !== "string" ) {
-									func = dataTypeExpression;
-									dataTypeExpression = "*";
-								}
-								
-								var dataType, list, placeBefore,
-								dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
-								i = 0,
-								length = dataTypes.length;
-								
-								if ( jQuery.isFunction( func ) ) {
-									// For each dataType in the dataTypeExpression
-									for ( ; i < length; i++ ) {
-										dataType = dataTypes[ i ];
-										// We control if we're asked to add before
-										// any existing element
-										placeBefore = /^\+/.test( dataType );
-										if ( placeBefore ) {
-											dataType = dataType.substr( 1 ) || "*";
-										}
-										list = structure[ dataType ] = structure[ dataType ] || [];
-										// then we add to the structure accordingly
-										list[ placeBefore ? "unshift" : "push" ]( func );
-									}
-								}
-							};
-						}
-						
-						// Base inspection function for prefilters and transports
-						function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
-						dataType /* internal */, inspected /* internal */ ) {
-							
-							dataType = dataType || options.dataTypes[ 0 ];
-							inspected = inspected || {};
-							
-							inspected[ dataType ] = true;
-							
-							var selection,
-							list = structure[ dataType ],
-							i = 0,
-							length = list ? list.length : 0,
-							executeOnly = ( structure === prefilters );
-							
-							for ( ; i < length && ( executeOnly || !selection ); i++ ) {
-								selection = list[ i ]( options, originalOptions, jqXHR );
-								// If we got redirected to another dataType
-								// we try there if executing only and not done already
-								if ( typeof selection === "string" ) {
-									if ( !executeOnly || inspected[ selection ] ) {
-										selection = undefined;
-										} else {
-										options.dataTypes.unshift( selection );
-										selection = inspectPrefiltersOrTransports(
-										structure, options, originalOptions, jqXHR, selection, inspected );
-									}
-								}
-							}
-							// If we're only executing or nothing was selected
-							// we try the catchall dataType if not done already
-							if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
-								selection = inspectPrefiltersOrTransports(
-								structure, options, originalOptions, jqXHR, "*", inspected );
-							}
-							// unnecessary when only executing (prefilters)
-							// but it'll be ignored by the caller in that case
-							return selection;
-						}
-						
-						// A special extend for ajax options
-						// that takes "flat" options (not to be deep extended)
-						// Fixes #9887
-						function ajaxExtend( target, src ) {
-							var key, deep,
-							flatOptions = jQuery.ajaxSettings.flatOptions || {};
-							for ( key in src ) {
-								if ( src[ key ] !== undefined ) {
-									( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
-								}
-							}
-							if ( deep ) {
-								jQuery.extend( true, target, deep );
-							}
-						}
-						
-						jQuery.fn.load = function( url, params, callback ) {
-							if ( typeof url !== "string" && _load ) {
-								return _load.apply( this, arguments );
-							}
-							
-							// Don't do a request if no elements are being requested
-							if ( !this.length ) {
-								return this;
-							}
-							
-							var selector, type, response,
-							self = this,
-							off = url.indexOf(" ");
-							
-							if ( off >= 0 ) {
-								selector = url.slice( off, url.length );
-								url = url.slice( 0, off );
-							}
-							
-							// If it's a function
-							if ( jQuery.isFunction( params ) ) {
-								
-								// We assume that it's the callback
-								callback = params;
-								params = undefined;
-								
-								// Otherwise, build a param string
-								} else if ( params && typeof params === "object" ) {
-								type = "POST";
-							}
-							
-							// Request the remote document
-							jQuery.ajax({
-								url: url,
-								
-								// if "type" variable is undefined, then "GET" method will be used
-								type: type,
-								dataType: "html",
-								data: params,
-								complete: function( jqXHR, status ) {
-									if ( callback ) {
-										self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
-									}
-								}
-								}).done(function( responseText ) {
-								
-								// Save response for use in complete callback
-								response = arguments;
-								
-								// See if a selector was specified
-								self.html( selector ?
-								
-								// Create a dummy div to hold the results
-								jQuery("<div>")
-								
-								// inject the contents of the document in, removing the scripts
-								// to avoid any 'Permission Denied' errors in IE
-								.append( responseText.replace( rscript, "" ) )
-								
-								// Locate the specified elements
-								.find( selector ) :
-								
-								// If not, just inject the full result
-								responseText );
-								
-							});
-							
-							return this;
-						};
-						
-						// Attach a bunch of functions for handling common AJAX events
-						jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
-							jQuery.fn[ o ] = function( f ){
-								return this.on( o, f );
-							};
-						});
-						
-						jQuery.each( [ "get", "post" ], function( i, method ) {
-							jQuery[ method ] = function( url, data, callback, type ) {
-								// shift arguments if data argument was omitted
-								if ( jQuery.isFunction( data ) ) {
-									type = type || callback;
-									callback = data;
-									data = undefined;
-								}
-								
-								return jQuery.ajax({
-									type: method,
-									url: url,
-									data: data,
-									success: callback,
-									dataType: type
-								});
-							};
-						});
-						
-						jQuery.extend({
-							
-							getScript: function( url, callback ) {
-								return jQuery.get( url, undefined, callback, "script" );
-							},
-							
-							getJSON: function( url, data, callback ) {
-								return jQuery.get( url, data, callback, "json" );
-							},
-							
-							// Creates a full fledged settings object into target
-							// with both ajaxSettings and settings fields.
-							// If target is omitted, writes into ajaxSettings.
-							ajaxSetup: function( target, settings ) {
-								if ( settings ) {
-									// Building a settings object
-									ajaxExtend( target, jQuery.ajaxSettings );
-									} else {
-									// Extending ajaxSettings
-									settings = target;
-									target = jQuery.ajaxSettings;
-								}
-								ajaxExtend( target, settings );
-								return target;
-							},
-							
-							ajaxSettings: {
-								url: ajaxLocation,
-								isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-								global: true,
-								type: "GET",
-								contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-								processData: true,
-								async: true,
-								/*
-								timeout: 0,
-								data: null,
-								dataType: null,
-								username: null,
-								password: null,
-								cache: null,
-								throws: false,
-								traditional: false,
-								headers: {},
-								*/
-								
-								accepts: {
-									xml: "application/xml, text/xml",
-									html: "text/html",
-									text: "text/plain",
-									json: "application/json, text/javascript",
-									"*": allTypes
-								},
-								
-								contents: {
-									xml: /xml/,
-									html: /html/,
-									json: /json/
-								},
-								
-								responseFields: {
-									xml: "responseXML",
-									text: "responseText"
-								},
-								
-								// List of data converters
-								// 1) key format is "source_type destination_type" (a single space in-between)
-								// 2) the catchall symbol "*" can be used for source_type
-								converters: {
-									
-									// Convert anything to text
-									"* text": window.String,
-									
-									// Text to html (true = no transformation)
-									"text html": true,
-									
-									// Evaluate text as a json expression
-									"text json": jQuery.parseJSON,
-									
-									// Parse text as xml
-									"text xml": jQuery.parseXML
-								},
-								
-								// For options that shouldn't be deep extended:
-								// you can add your own custom options here if
-								// and when you create one that shouldn't be
-								// deep extended (see ajaxExtend)
-								flatOptions: {
-									context: true,
-									url: true
-								}
-							},
-							
-							ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-							ajaxTransport: addToPrefiltersOrTransports( transports ),
-							
-							// Main method
-							ajax: function( url, options ) {
-								
-								// If url is an object, simulate pre-1.5 signature
-								if ( typeof url === "object" ) {
-									options = url;
-									url = undefined;
-								}
-								
-								// Force options to be an object
-								options = options || {};
-								
-								var // ifModified key
-								ifModifiedKey,
-								// Response headers
-								responseHeadersString,
-								responseHeaders,
-								// transport
-								transport,
-								// timeout handle
-								timeoutTimer,
-								// Cross-domain detection vars
-								parts,
-								// To know if global events are to be dispatched
-								fireGlobals,
-								// Loop variable
-								i,
-								// Create the final options object
-								s = jQuery.ajaxSetup( {}, options ),
-								// Callbacks context
-								callbackContext = s.context || s,
-								// Context for global events
-								// It's the callbackContext if one was provided in the options
-								// and if it's a DOM node or a jQuery collection
-								globalEventContext = callbackContext !== s &&
-								( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
-								jQuery( callbackContext ) : jQuery.event,
-								// Deferreds
-								deferred = jQuery.Deferred(),
-								completeDeferred = jQuery.Callbacks( "once memory" ),
-								// Status-dependent callbacks
-								statusCode = s.statusCode || {},
-								// Headers (they are sent all at once)
-								requestHeaders = {},
-								requestHeadersNames = {},
-								// The jqXHR state
-								state = 0,
-								// Default abort message
-								strAbort = "canceled",
-								// Fake xhr
-								jqXHR = {
-									
-									readyState: 0,
-									
-									// Caches the header
-									setRequestHeader: function( name, value ) {
-										if ( !state ) {
-											var lname = name.toLowerCase();
-											name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-											requestHeaders[ name ] = value;
-										}
-										return this;
-									},
-									
-									// Raw string
-									getAllResponseHeaders: function() {
-										return state === 2 ? responseHeadersString : null;
-									},
-									
-									// Builds headers hashtable if needed
-									getResponseHeader: function( key ) {
-										var match;
-										if ( state === 2 ) {
-											if ( !responseHeaders ) {
-												responseHeaders = {};
-												while( ( match = rheaders.exec( responseHeadersString ) ) ) {
-													responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-												}
-											}
-											match = responseHeaders[ key.toLowerCase() ];
-										}
-										return match === undefined ? null : match;
-									},
-									
-									// Overrides response content-type header
-									overrideMimeType: function( type ) {
-										if ( !state ) {
-											s.mimeType = type;
-										}
-										return this;
-									},
-									
-									// Cancel the request
-									abort: function( statusText ) {
-										statusText = statusText || strAbort;
-										if ( transport ) {
-											transport.abort( statusText );
-										}
-										done( 0, statusText );
-										return this;
-									}
-								};
-								
-								// Callback for when everything is done
-								// It is defined here because jslint complains if it is declared
-								// at the end of the function (which would be more logical and readable)
-								function done( status, nativeStatusText, responses, headers ) {
-									var isSuccess, success, error, response, modified,
-									statusText = nativeStatusText;
-									
-									// Called once
-									if ( state === 2 ) {
-										return;
-									}
-									
-									// State is "done" now
-									state = 2;
-									
-									// Clear timeout if it exists
-									if ( timeoutTimer ) {
-										clearTimeout( timeoutTimer );
-									}
-									
-									// Dereference transport for early garbage collection
-									// (no matter how long the jqXHR object will be used)
-									transport = undefined;
-									
-									// Cache response headers
-									responseHeadersString = headers || "";
-									
-									// Set readyState
-									jqXHR.readyState = status > 0 ? 4 : 0;
-									
-									// Get response data
-									if ( responses ) {
-										response = ajaxHandleResponses( s, jqXHR, responses );
-									}
-									
-									// If successful, handle type chaining
-									if ( status >= 200 && status < 300 || status === 304 ) {
-										
-										// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-										if ( s.ifModified ) {
-											
-											modified = jqXHR.getResponseHeader("Last-Modified");
-											if ( modified ) {
-												jQuery.lastModified[ ifModifiedKey ] = modified;
-											}
-											modified = jqXHR.getResponseHeader("Etag");
-											if ( modified ) {
-												jQuery.etag[ ifModifiedKey ] = modified;
-											}
-										}
-										
-										// If not modified
-										if ( status === 304 ) {
-											
-											statusText = "notmodified";
-											isSuccess = true;
-											
-											// If we have data
-											} else {
-											
-											isSuccess = ajaxConvert( s, response );
-											statusText = isSuccess.state;
-											success = isSuccess.data;
-											error = isSuccess.error;
-											isSuccess = !error;
-										}
-										} else {
-										// We extract error from statusText
-										// then normalize statusText and status for non-aborts
-										error = statusText;
-										if ( !statusText || status ) {
-											statusText = "error";
-											if ( status < 0 ) {
-												status = 0;
-											}
-										}
-									}
-									
-									// Set data for the fake xhr object
-									jqXHR.status = status;
-									jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-									
-									// Success/Error
-									if ( isSuccess ) {
-										deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-										} else {
-										deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-									}
-									
-									// Status-dependent callbacks
-									jqXHR.statusCode( statusCode );
-									statusCode = undefined;
-									
-									if ( fireGlobals ) {
-										globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-										[ jqXHR, s, isSuccess ? success : error ] );
-									}
-									
-									// Complete
-									completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-									
-									if ( fireGlobals ) {
-										globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-										// Handle the global AJAX counter
-										if ( !( --jQuery.active ) ) {
-											jQuery.event.trigger( "ajaxStop" );
-										}
-									}
-								}
-								
-								// Attach deferreds
-								deferred.promise( jqXHR );
-								jqXHR.success = jqXHR.done;
-								jqXHR.error = jqXHR.fail;
-								jqXHR.complete = completeDeferred.add;
-								
-								// Status-dependent callbacks
-								jqXHR.statusCode = function( map ) {
-									if ( map ) {
-										var tmp;
-										if ( state < 2 ) {
-											for ( tmp in map ) {
-												statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
-											}
-											} else {
-											tmp = map[ jqXHR.status ];
-											jqXHR.always( tmp );
-										}
-									}
-									return this;
-								};
-								
-								// Remove hash character (#7531: and string promotion)
-								// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-								// We also use the url parameter if available
-								s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-								
-								// Extract dataTypes list
-								s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
-								
-								// A cross-domain request is in order when we have a protocol:host:port mismatch
-								if ( s.crossDomain == null ) {
-									parts = rurl.exec( s.url.toLowerCase() );
-									s.crossDomain = !!( parts &&
-									( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
-									( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-									( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-									);
-								}
-								
-								// Convert data if not already a string
-								if ( s.data && s.processData && typeof s.data !== "string" ) {
-									s.data = jQuery.param( s.data, s.traditional );
-								}
-								
-								// Apply prefilters
-								inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-								
-								// If request was aborted inside a prefilter, stop there
-								if ( state === 2 ) {
-									return jqXHR;
-								}
-								
-								// We can fire global events as of now if asked to
-								fireGlobals = s.global;
-								
-								// Uppercase the type
-								s.type = s.type.toUpperCase();
-								
-								// Determine if request has content
-								s.hasContent = !rnoContent.test( s.type );
-								
-								// Watch for a new set of requests
-								if ( fireGlobals && jQuery.active++ === 0 ) {
-									jQuery.event.trigger( "ajaxStart" );
-								}
-								
-								// More options handling for requests with no content
-								if ( !s.hasContent ) {
-									
-									// If data is available, append data to url
-									if ( s.data ) {
-										s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
-										// #9682: remove data so that it's not used in an eventual retry
-										delete s.data;
-									}
-									
-									// Get ifModifiedKey before adding the anti-cache parameter
-									ifModifiedKey = s.url;
-									
-									// Add anti-cache in url if needed
-									if ( s.cache === false ) {
-										
-										var ts = jQuery.now(),
-										// try replacing _= if it is there
-										ret = s.url.replace( rts, "$1_=" + ts );
-										
-										// if nothing was replaced, add timestamp to the end
-										s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
-									}
-								}
-								
-								// Set the correct header, if data is being sent
-								if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-									jqXHR.setRequestHeader( "Content-Type", s.contentType );
-								}
-								
-								// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-								if ( s.ifModified ) {
-									ifModifiedKey = ifModifiedKey || s.url;
-									if ( jQuery.lastModified[ ifModifiedKey ] ) {
-										jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
-									}
-									if ( jQuery.etag[ ifModifiedKey ] ) {
-										jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
-									}
-								}
-								
-								// Set the Accepts header for the server, depending on the dataType
-								jqXHR.setRequestHeader(
-								"Accept",
-								s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-								s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-								s.accepts[ "*" ]
-								);
-								
-								// Check for headers option
-								for ( i in s.headers ) {
-									jqXHR.setRequestHeader( i, s.headers[ i ] );
-								}
-								
-								// Allow custom headers/mimetypes and early abort
-								if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-									// Abort if not done already and return
-									return jqXHR.abort();
-									
-								}
-								
-								// aborting is no longer a cancellation
-								strAbort = "abort";
-								
-								// Install callbacks on deferreds
-								for ( i in { success: 1, error: 1, complete: 1 } ) {
-								jqXHR[ i ]( s[ i ] );
-							}
-							
-							// Get transport
-							transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-							
-							// If no transport, we auto-abort
-							if ( !transport ) {
-								done( -1, "No Transport" );
-								} else {
-								jqXHR.readyState = 1;
-								// Send global event
-								if ( fireGlobals ) {
-									globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-								}
-								// Timeout
-								if ( s.async && s.timeout > 0 ) {
-									timeoutTimer = setTimeout( function(){
-										jqXHR.abort( "timeout" );
-									}, s.timeout );
-								}
-								
-								try {
-									state = 1;
-									transport.send( requestHeaders, done );
-									} catch (e) {
-									// Propagate exception as error if not done
-									if ( state < 2 ) {
-										done( -1, e );
-										// Simply rethrow otherwise
-										} else {
-										throw e;
-									}
-								}
-							}
-							
-							return jqXHR;
-						},
-						
-						// Counter for holding the number of active queries
-						active: 0,
-						
-						// Last-Modified header cache for next request
-						lastModified: {},
-						etag: {}
-						
-					});
-					
-					/* Handles responses to an ajax request:
-					* - sets all responseXXX fields accordingly
-					* - finds the right dataType (mediates between content-type and expected dataType)
-					* - returns the corresponding response
-					*/
-					function ajaxHandleResponses( s, jqXHR, responses ) {
-						
-						var ct, type, finalDataType, firstDataType,
-						contents = s.contents,
-						dataTypes = s.dataTypes,
-						responseFields = s.responseFields;
-						
-						// Fill responseXXX fields
-						for ( type in responseFields ) {
-							if ( type in responses ) {
-								jqXHR[ responseFields[type] ] = responses[ type ];
-							}
-						}
-						
-						// Remove auto dataType and get content-type in the process
-						while( dataTypes[ 0 ] === "*" ) {
-							dataTypes.shift();
-							if ( ct === undefined ) {
-								ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
-							}
-						}
-						
-						// Check if we're dealing with a known content-type
-						if ( ct ) {
-							for ( type in contents ) {
-								if ( contents[ type ] && contents[ type ].test( ct ) ) {
-									dataTypes.unshift( type );
-									break;
-								}
-							}
-						}
-						
-						// Check to see if we have a response for the expected dataType
-						if ( dataTypes[ 0 ] in responses ) {
-							finalDataType = dataTypes[ 0 ];
-							} else {
-							// Try convertible dataTypes
-							for ( type in responses ) {
-								if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-									finalDataType = type;
-									break;
-								}
-								if ( !firstDataType ) {
-									firstDataType = type;
-								}
-							}
-							// Or just use first one
-							finalDataType = finalDataType || firstDataType;
-						}
-						
-						// If we found a dataType
-						// We add the dataType to the list if needed
-						// and return the corresponding response
-						if ( finalDataType ) {
-							if ( finalDataType !== dataTypes[ 0 ] ) {
-								dataTypes.unshift( finalDataType );
-							}
-							return responses[ finalDataType ];
-						}
-					}
-					
-					// Chain conversions given the request and the original response
-					function ajaxConvert( s, response ) {
-						
-						var conv, conv2, current, tmp,
-						// Work with a copy of dataTypes in case we need to modify it for conversion
-						dataTypes = s.dataTypes.slice(),
-						prev = dataTypes[ 0 ],
-						converters = {},
-						i = 0;
-						
-						// Apply the dataFilter if provided
-						if ( s.dataFilter ) {
-							response = s.dataFilter( response, s.dataType );
-						}
-						
-						// Create converters map with lowercased keys
-						if ( dataTypes[ 1 ] ) {
-							for ( conv in s.converters ) {
-								converters[ conv.toLowerCase() ] = s.converters[ conv ];
-							}
-						}
-						
-						// Convert to each sequential dataType, tolerating list modification
-						for ( ; (current = dataTypes[++i]); ) {
-							
-							// There's only work to do if current dataType is non-auto
-							if ( current !== "*" ) {
-								
-								// Convert response if prev dataType is non-auto and differs from current
-								if ( prev !== "*" && prev !== current ) {
-									
-									// Seek a direct converter
-									conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-									
-									// If none found, seek a pair
-									if ( !conv ) {
-										for ( conv2 in converters ) {
-											
-											// If conv2 outputs current
-											tmp = conv2.split(" ");
-											if ( tmp[ 1 ] === current ) {
-												
-												// If prev can be converted to accepted input
-												conv = converters[ prev + " " + tmp[ 0 ] ] ||
-												converters[ "* " + tmp[ 0 ] ];
-												if ( conv ) {
-													// Condense equivalence converters
-													if ( conv === true ) {
-														conv = converters[ conv2 ];
-														
-														// Otherwise, insert the intermediate dataType
-														} else if ( converters[ conv2 ] !== true ) {
-														current = tmp[ 0 ];
-														dataTypes.splice( i--, 0, current );
-													}
-													
-													break;
-												}
-											}
-										}
-									}
-									
-									// Apply converter (if not an equivalence)
-									if ( conv !== true ) {
-										
-										// Unless errors are allowed to bubble, catch and return them
-										if ( conv && s["throws"] ) {
-											response = conv( response );
-											} else {
-											try {
-												response = conv( response );
-												} catch ( e ) {
-												return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
-											}
-										}
-									}
-								}
-								
-								// Update prev for next iteration
-								prev = current;
-							}
-						}
-						
-						return { state: "success", data: response };
-					}
-					var oldCallbacks = [],
-					rquestion = /\?/,
-					rjsonp = /(=)\?(?=&|$)|\?\?/,
-					nonce = jQuery.now();
-					
-					// Default jsonp settings
-					jQuery.ajaxSetup({
-						jsonp: "callback",
-						jsonpCallback: function() {
-							var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-							this[ callback ] = true;
-							return callback;
-						}
-					});
-					
-					// Detect, normalize options and install callbacks for jsonp requests
-					jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-						
-						var callbackName, overwritten, responseContainer,
-						data = s.data,
-						url = s.url,
-						hasCallback = s.jsonp !== false,
-						replaceInUrl = hasCallback && rjsonp.test( url ),
-						replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
-						!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
-						rjsonp.test( data );
-						
-						// Handle iff the expected data type is "jsonp" or we have a parameter to set
-						if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
-							
-							// Get callback name, remembering preexisting value associated with it
-							callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-							s.jsonpCallback() :
-							s.jsonpCallback;
-							overwritten = window[ callbackName ];
-							
-							// Insert callback into url or form data
-							if ( replaceInUrl ) {
-								s.url = url.replace( rjsonp, "$1" + callbackName );
-								} else if ( replaceInData ) {
-								s.data = data.replace( rjsonp, "$1" + callbackName );
-								} else if ( hasCallback ) {
-								s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-							}
-							
-							// Use data converter to retrieve json after script execution
-							s.converters["script json"] = function() {
-								if ( !responseContainer ) {
-									jQuery.error( callbackName + " was not called" );
-								}
-								return responseContainer[ 0 ];
-							};
-							
-							// force json dataType
-							s.dataTypes[ 0 ] = "json";
-							
-							// Install callback
-							window[ callbackName ] = function() {
-								responseContainer = arguments;
-							};
-							
-							// Clean-up function (fires after converters)
-							jqXHR.always(function() {
-								// Restore preexisting value
-								window[ callbackName ] = overwritten;
-								
-								// Save back as free
-								if ( s[ callbackName ] ) {
-									// make sure that re-using the options doesn't screw things around
-									s.jsonpCallback = originalSettings.jsonpCallback;
-									
-									// save the callback name for future use
-									oldCallbacks.push( callbackName );
-								}
-								
-								// Call if it was a function and we have a response
-								if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-									overwritten( responseContainer[ 0 ] );
-								}
-								
-								responseContainer = overwritten = undefined;
-							});
-							
-							// Delegate to script
-							return "script";
-						}
-					});
-					// Install script dataType
-					jQuery.ajaxSetup({
-						accepts: {
-							script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-						},
-						contents: {
-							script: /javascript|ecmascript/
-						},
-						converters: {
-							"text script": function( text ) {
-								jQuery.globalEval( text );
-								return text;
-							}
-						}
-					});
-					
-					// Handle cache's special case and global
-					jQuery.ajaxPrefilter( "script", function( s ) {
-						if ( s.cache === undefined ) {
-							s.cache = false;
-						}
-						if ( s.crossDomain ) {
-							s.type = "GET";
-							s.global = false;
-						}
-					});
-					
-					// Bind script tag hack transport
-					jQuery.ajaxTransport( "script", function(s) {
-						
-						// This transport only deals with cross domain requests
-						if ( s.crossDomain ) {
-							
-							var script,
-							head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
-							
-							return {
-								
-								send: function( _, callback ) {
-									
-									script = document.createElement( "script" );
-									
-									script.async = "async";
-									
-									if ( s.scriptCharset ) {
-										script.charset = s.scriptCharset;
-									}
-									
-									script.src = s.url;
-									
-									// Attach handlers for all browsers
-									script.onload = script.onreadystatechange = function( _, isAbort ) {
-										
-										if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-											
-											// Handle memory leak in IE
-											script.onload = script.onreadystatechange = null;
-											
-											// Remove the script
-											if ( head && script.parentNode ) {
-												head.removeChild( script );
-											}
-											
-											// Dereference the script
-											script = undefined;
-											
-											// Callback if not abort
-											if ( !isAbort ) {
-												callback( 200, "success" );
-											}
-										}
-									};
-									// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-									// This arises when a base node is used (#2709 and #4378).
-									head.insertBefore( script, head.firstChild );
-								},
-								
-								abort: function() {
-									if ( script ) {
-										script.onload( 0, 1 );
-									}
-								}
-							};
-						}
-					});
-					var xhrCallbacks,
-					// #5280: Internet Explorer will keep connections alive if we don't abort on unload
-					xhrOnUnloadAbort = window.ActiveXObject ? function() {
-						// Abort all pending requests
-						for ( var key in xhrCallbacks ) {
-							xhrCallbacks[ key ]( 0, 1 );
-						}
-					} : false,
-					xhrId = 0;
-					
-					// Functions to create xhrs
-					function createStandardXHR() {
-						try {
-							return new window.XMLHttpRequest();
-							} catch( e ) {}
-						}
-						
-						function createActiveXHR() {
-							try {
-								return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-								} catch( e ) {}
-							}
-							
-							// Create the request object
-							// (This is still attached to ajaxSettings for backward compatibility)
-							jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-							/* Microsoft failed to properly
-							* implement the XMLHttpRequest in IE7 (can't request local files),
-							* so we use the ActiveXObject when it is available
-							* Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-							* we need a fallback.
-							*/
-							function() {
-								return !this.isLocal && createStandardXHR() || createActiveXHR();
-							} :
-							// For all other browsers, use the standard XMLHttpRequest object
-							createStandardXHR;
-							
-							// Determine support properties
-							(function( xhr ) {
-								jQuery.extend( jQuery.support, {
-									ajax: !!xhr,
-									cors: !!xhr && ( "withCredentials" in xhr )
-								});
-							})( jQuery.ajaxSettings.xhr() );
-							
-							// Create transport if the browser can provide an xhr
-							if ( jQuery.support.ajax ) {
-								
-								jQuery.ajaxTransport(function( s ) {
-									// Cross domain only allowed if supported through XMLHttpRequest
-									if ( !s.crossDomain || jQuery.support.cors ) {
-										
-										var callback;
-										
-										return {
-											send: function( headers, complete ) {
-												
-												// Get a new xhr
-												var handle, i,
-												xhr = s.xhr();
-												
-												// Open the socket
-												// Passing null username, generates a login popup on Opera (#2865)
-												if ( s.username ) {
-													xhr.open( s.type, s.url, s.async, s.username, s.password );
-													} else {
-													xhr.open( s.type, s.url, s.async );
-												}
-												
-												// Apply custom fields if provided
-												if ( s.xhrFields ) {
-													for ( i in s.xhrFields ) {
-														xhr[ i ] = s.xhrFields[ i ];
-													}
-												}
-												
-												// Override mime type if needed
-												if ( s.mimeType && xhr.overrideMimeType ) {
-													xhr.overrideMimeType( s.mimeType );
-												}
-												
-												// X-Requested-With header
-												// For cross-domain requests, seeing as conditions for a preflight are
-												// akin to a jigsaw puzzle, we simply never set it to be sure.
-												// (it can always be set on a per-request basis or even using ajaxSetup)
-												// For same-domain requests, won't change header if already provided.
-												if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-													headers[ "X-Requested-With" ] = "XMLHttpRequest";
-												}
-												
-												// Need an extra try/catch for cross domain requests in Firefox 3
-												try {
-													for ( i in headers ) {
-														xhr.setRequestHeader( i, headers[ i ] );
-													}
-													} catch( _ ) {}
-													
-													// Do send the request
-													// This may raise an exception which is actually
-													// handled in jQuery.ajax (so no try/catch here)
-													xhr.send( ( s.hasContent && s.data ) || null );
-													
-													// Listener
-													callback = function( _, isAbort ) {
-														
-														var status,
-														statusText,
-														responseHeaders,
-														responses,
-														xml;
-														
-														// Firefox throws exceptions when accessing properties
-														// of an xhr when a network error occurred
-														// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-														try {
-															
-															// Was never called and is aborted or complete
-															if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-																
-																// Only called once
-																callback = undefined;
-																
-																// Do not keep as active anymore
-																if ( handle ) {
-																	xhr.onreadystatechange = jQuery.noop;
-																	if ( xhrOnUnloadAbort ) {
-																		delete xhrCallbacks[ handle ];
-																	}
-																}
-																
-																// If it's an abort
-																if ( isAbort ) {
-																	// Abort it manually if needed
-																	if ( xhr.readyState !== 4 ) {
-																		xhr.abort();
-																	}
-																	} else {
-																	status = xhr.status;
-																	responseHeaders = xhr.getAllResponseHeaders();
-																	responses = {};
-																	xml = xhr.responseXML;
-																	
-																	// Construct response list
-																	if ( xml && xml.documentElement /* #4958 */ ) {
-																		responses.xml = xml;
-																	}
-																	
-																	// When requesting binary data, IE6-9 will throw an exception
-																	// on any attempt to access responseText (#11426)
-																	try {
-																		responses.text = xhr.responseText;
-																		} catch( e ) {
-																	}
-																	
-																	// Firefox throws an exception when accessing
-																	// statusText for faulty cross-domain requests
-																	try {
-																		statusText = xhr.statusText;
-																		} catch( e ) {
-																		// We normalize with Webkit giving an empty statusText
-																		statusText = "";
-																	}
-																	
-																	// Filter status for non standard behaviors
-																	
-																	// If the request is local and we have data: assume a success
-																	// (success with no data won't get notified, that's the best we
-																	// can do given current implementations)
-																	if ( !status && s.isLocal && !s.crossDomain ) {
-																		status = responses.text ? 200 : 404;
-																		// IE - #1450: sometimes returns 1223 when it should be 204
-																		} else if ( status === 1223 ) {
-																		status = 204;
-																	}
-																}
-															}
-															} catch( firefoxAccessException ) {
-															if ( !isAbort ) {
-																complete( -1, firefoxAccessException );
-															}
-														}
-														
-														// Call complete if needed
-														if ( responses ) {
-															complete( status, statusText, responses, responseHeaders );
-														}
-													};
-													
-													if ( !s.async ) {
-														// if we're in sync mode we fire the callback
-														callback();
-														} else if ( xhr.readyState === 4 ) {
-														// (IE6 & IE7) if it's in cache and has been
-														// retrieved directly we need to fire the callback
-														setTimeout( callback, 0 );
-														} else {
-														handle = ++xhrId;
-														if ( xhrOnUnloadAbort ) {
-															// Create the active xhrs callbacks list if needed
-															// and attach the unload handler
-															if ( !xhrCallbacks ) {
-																xhrCallbacks = {};
-																jQuery( window ).unload( xhrOnUnloadAbort );
-															}
-															// Add to list of active xhrs callbacks
-															xhrCallbacks[ handle ] = callback;
-														}
-														xhr.onreadystatechange = callback;
-													}
-												},
-												
-												abort: function() {
-													if ( callback ) {
-														callback(0,1);
-													}
-												}
-											};
-										}
-									});
-								}
-								var fxNow, timerId,
-								rfxtypes = /^(?:toggle|show|hide)$/,
-								rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
-								rrun = /queueHooks$/,
-								animationPrefilters = [ defaultPrefilter ],
-								tweeners = {
-									"*": [function( prop, value ) {
-										var end, unit,
-										tween = this.createTween( prop, value ),
-										parts = rfxnum.exec( value ),
-										target = tween.cur(),
-										start = +target || 0,
-										scale = 1,
-										maxIterations = 20;
-										
-										if ( parts ) {
-											end = +parts[2];
-											unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-											
-											// We need to compute starting value
-											if ( unit !== "px" && start ) {
-												// Iteratively approximate from a nonzero starting point
-												// Prefer the current property, because this process will be trivial if it uses the same units
-												// Fallback to end or a simple constant
-												start = jQuery.css( tween.elem, prop, true ) || end || 1;
-												
-												do {
-													// If previous iteration zeroed out, double until we get *something*
-													// Use a string for doubling factor so we don't accidentally see scale as unchanged below
-													scale = scale || ".5";
-													
-													// Adjust and apply
-													start = start / scale;
-													jQuery.style( tween.elem, prop, start + unit );
-													
-													// Update scale, tolerating zero or NaN from tween.cur()
-													// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
-												} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
-											}
-											
-											tween.unit = unit;
-											tween.start = start;
-											// If a +=/-= token was provided, we're doing a relative animation
-											tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
-										}
-										return tween;
-									}]
-								};
-								
-								// Animations created synchronously will run synchronously
-								function createFxNow() {
-									setTimeout(function() {
-										fxNow = undefined;
-									}, 0 );
-									return ( fxNow = jQuery.now() );
-								}
-								
-								function createTweens( animation, props ) {
-									jQuery.each( props, function( prop, value ) {
-										var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
-										index = 0,
-										length = collection.length;
-										for ( ; index < length; index++ ) {
-											if ( collection[ index ].call( animation, prop, value ) ) {
-												
-												// we're done with this property
-												return;
-											}
-										}
-									});
-								}
-								
-								function Animation( elem, properties, options ) {
-									var result,
-									index = 0,
-									tweenerIndex = 0,
-									length = animationPrefilters.length,
-									deferred = jQuery.Deferred().always( function() {
-										// don't match elem in the :animated selector
-										delete tick.elem;
-									}),
-									tick = function() {
-										var currentTime = fxNow || createFxNow(),
-										remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-										// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
-										temp = remaining / animation.duration || 0,
-										percent = 1 - temp,
-										index = 0,
-										length = animation.tweens.length;
-										
-										for ( ; index < length ; index++ ) {
-											animation.tweens[ index ].run( percent );
-										}
-										
-										deferred.notifyWith( elem, [ animation, percent, remaining ]);
-										
-										if ( percent < 1 && length ) {
-											return remaining;
-											} else {
-											deferred.resolveWith( elem, [ animation ] );
-											return false;
-										}
-									},
-									animation = deferred.promise({
-										elem: elem,
-										props: jQuery.extend( {}, properties ),
-										opts: jQuery.extend( true, { specialEasing: {} }, options ),
-										originalProperties: properties,
-										originalOptions: options,
-										startTime: fxNow || createFxNow(),
-										duration: options.duration,
-										tweens: [],
-										createTween: function( prop, end, easing ) {
-											var tween = jQuery.Tween( elem, animation.opts, prop, end,
-											animation.opts.specialEasing[ prop ] || animation.opts.easing );
-											animation.tweens.push( tween );
-											return tween;
-										},
-										stop: function( gotoEnd ) {
-											var index = 0,
-											// if we are going to the end, we want to run all the tweens
-											// otherwise we skip this part
-											length = gotoEnd ? animation.tweens.length : 0;
-											
-											for ( ; index < length ; index++ ) {
-												animation.tweens[ index ].run( 1 );
-											}
-											
-											// resolve when we played the last frame
-											// otherwise, reject
-											if ( gotoEnd ) {
-												deferred.resolveWith( elem, [ animation, gotoEnd ] );
-												} else {
-												deferred.rejectWith( elem, [ animation, gotoEnd ] );
-											}
-											return this;
-										}
-									}),
-									props = animation.props;
-									
-									propFilter( props, animation.opts.specialEasing );
-									
-									for ( ; index < length ; index++ ) {
-										result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
-										if ( result ) {
-											return result;
-										}
-									}
-									
-									createTweens( animation, props );
-									
-									if ( jQuery.isFunction( animation.opts.start ) ) {
-										animation.opts.start.call( elem, animation );
-									}
-									
-									jQuery.fx.timer(
-									jQuery.extend( tick, {
-										anim: animation,
-										queue: animation.opts.queue,
-										elem: elem
-									})
-									);
-									
-									// attach callbacks from options
-									return animation.progress( animation.opts.progress )
-									.done( animation.opts.done, animation.opts.complete )
-									.fail( animation.opts.fail )
-									.always( animation.opts.always );
-								}
-								
-								function propFilter( props, specialEasing ) {
-									var index, name, easing, value, hooks;
-									
-									// camelCase, specialEasing and expand cssHook pass
-									for ( index in props ) {
-										name = jQuery.camelCase( index );
-										easing = specialEasing[ name ];
-										value = props[ index ];
-										if ( jQuery.isArray( value ) ) {
-											easing = value[ 1 ];
-											value = props[ index ] = value[ 0 ];
-										}
-										
-										if ( index !== name ) {
-											props[ name ] = value;
-											delete props[ index ];
-										}
-										
-										hooks = jQuery.cssHooks[ name ];
-										if ( hooks && "expand" in hooks ) {
-											value = hooks.expand( value );
-											delete props[ name ];
-											
-											// not quite $.extend, this wont overwrite keys already present.
-											// also - reusing 'index' from above because we have the correct "name"
-											for ( index in value ) {
-												if ( !( index in props ) ) {
-													props[ index ] = value[ index ];
-													specialEasing[ index ] = easing;
-												}
-											}
-											} else {
-											specialEasing[ name ] = easing;
-										}
-									}
-								}
-								
-								jQuery.Animation = jQuery.extend( Animation, {
-									
-									tweener: function( props, callback ) {
-										if ( jQuery.isFunction( props ) ) {
-											callback = props;
-											props = [ "*" ];
-											} else {
-											props = props.split(" ");
-										}
-										
-										var prop,
-										index = 0,
-										length = props.length;
-										
-										for ( ; index < length ; index++ ) {
-											prop = props[ index ];
-											tweeners[ prop ] = tweeners[ prop ] || [];
-											tweeners[ prop ].unshift( callback );
-										}
-									},
-									
-									prefilter: function( callback, prepend ) {
-										if ( prepend ) {
-											animationPrefilters.unshift( callback );
-											} else {
-											animationPrefilters.push( callback );
-										}
-									}
-								});
-								
-								function defaultPrefilter( elem, props, opts ) {
-									var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
-									anim = this,
-									style = elem.style,
-									orig = {},
-									handled = [],
-									hidden = elem.nodeType && isHidden( elem );
-									
-									// handle queue: false promises
-									if ( !opts.queue ) {
-										hooks = jQuery._queueHooks( elem, "fx" );
-										if ( hooks.unqueued == null ) {
-											hooks.unqueued = 0;
-											oldfire = hooks.empty.fire;
-											hooks.empty.fire = function() {
-												if ( !hooks.unqueued ) {
-													oldfire();
-												}
-											};
-										}
-										hooks.unqueued++;
-										
-										anim.always(function() {
-											// doing this makes sure that the complete handler will be called
-											// before this completes
-											anim.always(function() {
-												hooks.unqueued--;
-												if ( !jQuery.queue( elem, "fx" ).length ) {
-													hooks.empty.fire();
-												}
-											});
-										});
-									}
-									
-									// height/width overflow pass
-									if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-										// Make sure that nothing sneaks out
-										// Record all 3 overflow attributes because IE does not
-										// change the overflow attribute when overflowX and
-										// overflowY are set to the same value
-										opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-										
-										// Set display property to inline-block for height/width
-										// animations on inline elements that are having width/height animated
-										if ( jQuery.css( elem, "display" ) === "inline" &&
-										jQuery.css( elem, "float" ) === "none" ) {
-											
-											// inline-level elements accept inline-block;
-											// block-level elements need to be inline with layout
-											if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
-												style.display = "inline-block";
-												
-												} else {
-												style.zoom = 1;
-											}
-										}
-									}
-									
-									if ( opts.overflow ) {
-										style.overflow = "hidden";
-										if ( !jQuery.support.shrinkWrapBlocks ) {
-											anim.done(function() {
-												style.overflow = opts.overflow[ 0 ];
-												style.overflowX = opts.overflow[ 1 ];
-												style.overflowY = opts.overflow[ 2 ];
-											});
-										}
-									}
-									
-									
-									// show/hide pass
-									for ( index in props ) {
-										value = props[ index ];
-										if ( rfxtypes.exec( value ) ) {
-											delete props[ index ];
-											toggle = toggle || value === "toggle";
-											if ( value === ( hidden ? "hide" : "show" ) ) {
-												continue;
-											}
-											handled.push( index );
-										}
-									}
-									
-									length = handled.length;
-									if ( length ) {
-										dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
-										if ( "hidden" in dataShow ) {
-											hidden = dataShow.hidden;
-										}
-										
-										// store state if its toggle - enables .stop().toggle() to "reverse"
-										if ( toggle ) {
-											dataShow.hidden = !hidden;
-										}
-										if ( hidden ) {
-											jQuery( elem ).show();
-											} else {
-											anim.done(function() {
-												jQuery( elem ).hide();
-											});
-										}
-										anim.done(function() {
-											var prop;
-											jQuery.removeData( elem, "fxshow", true );
-											for ( prop in orig ) {
-												jQuery.style( elem, prop, orig[ prop ] );
-											}
-										});
-										for ( index = 0 ; index < length ; index++ ) {
-											prop = handled[ index ];
-											tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
-											orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
-											
-											if ( !( prop in dataShow ) ) {
-												dataShow[ prop ] = tween.start;
-												if ( hidden ) {
-													tween.end = tween.start;
-													tween.start = prop === "width" || prop === "height" ? 1 : 0;
-												}
-											}
-										}
-									}
-								}
-								
-								function Tween( elem, options, prop, end, easing ) {
-									return new Tween.prototype.init( elem, options, prop, end, easing );
-								}
-								jQuery.Tween = Tween;
-								
-								Tween.prototype = {
-									constructor: Tween,
-									init: function( elem, options, prop, end, easing, unit ) {
-										this.elem = elem;
-										this.prop = prop;
-										this.easing = easing || "swing";
-										this.options = options;
-										this.start = this.now = this.cur();
-										this.end = end;
-										this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-									},
-									cur: function() {
-										var hooks = Tween.propHooks[ this.prop ];
-										
-										return hooks && hooks.get ?
-										hooks.get( this ) :
-										Tween.propHooks._default.get( this );
-									},
-									run: function( percent ) {
-										var eased,
-										hooks = Tween.propHooks[ this.prop ];
-										
-										if ( this.options.duration ) {
-											this.pos = eased = jQuery.easing[ this.easing ](
-											percent, this.options.duration * percent, 0, 1, this.options.duration
-											);
-											} else {
-											this.pos = eased = percent;
-										}
-										this.now = ( this.end - this.start ) * eased + this.start;
-										
-										if ( this.options.step ) {
-											this.options.step.call( this.elem, this.now, this );
-										}
-										
-										if ( hooks && hooks.set ) {
-											hooks.set( this );
-											} else {
-											Tween.propHooks._default.set( this );
-										}
-										return this;
-									}
-								};
-								
-								Tween.prototype.init.prototype = Tween.prototype;
-								
-								Tween.propHooks = {
-									_default: {
-										get: function( tween ) {
-											var result;
-											
-											if ( tween.elem[ tween.prop ] != null &&
-											(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
-												return tween.elem[ tween.prop ];
-											}
-											
-											// passing any value as a 4th parameter to .css will automatically
-											// attempt a parseFloat and fallback to a string if the parse fails
-											// so, simple values such as "10px" are parsed to Float.
-											// complex values such as "rotate(1rad)" are returned as is.
-											result = jQuery.css( tween.elem, tween.prop, false, "" );
-											// Empty strings, null, undefined and "auto" are converted to 0.
-											return !result || result === "auto" ? 0 : result;
-										},
-										set: function( tween ) {
-											// use step hook for back compat - use cssHook if its there - use .style if its
-											// available and use plain properties where available
-											if ( jQuery.fx.step[ tween.prop ] ) {
-												jQuery.fx.step[ tween.prop ]( tween );
-												} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
-												jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-												} else {
-												tween.elem[ tween.prop ] = tween.now;
-											}
-										}
-									}
-								};
-								
-								// Remove in 2.0 - this supports IE8's panic based approach
-								// to setting things on disconnected nodes
-								
-								Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-									set: function( tween ) {
-										if ( tween.elem.nodeType && tween.elem.parentNode ) {
-											tween.elem[ tween.prop ] = tween.now;
-										}
-									}
-								};
-								
-								jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
-									var cssFn = jQuery.fn[ name ];
-									jQuery.fn[ name ] = function( speed, easing, callback ) {
-										return speed == null || typeof speed === "boolean" ||
-										// special check for .toggle( handler, handler, ... )
-										( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
-										cssFn.apply( this, arguments ) :
-										this.animate( genFx( name, true ), speed, easing, callback );
-									};
-								});
-								
-								jQuery.fn.extend({
-									fadeTo: function( speed, to, easing, callback ) {
-										
-										// show any hidden elements after setting opacity to 0
-										return this.filter( isHidden ).css( "opacity", 0 ).show()
-										
-										// animate to the value specified
-										.end().animate({ opacity: to }, speed, easing, callback );
-									},
-									animate: function( prop, speed, easing, callback ) {
-										var empty = jQuery.isEmptyObject( prop ),
-										optall = jQuery.speed( speed, easing, callback ),
-										doAnimation = function() {
-											// Operate on a copy of prop so per-property easing won't be lost
-											var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-											
-											// Empty animations resolve immediately
-											if ( empty ) {
-												anim.stop( true );
-											}
-										};
-										
-										return empty || optall.queue === false ?
-										this.each( doAnimation ) :
-										this.queue( optall.queue, doAnimation );
-									},
-									stop: function( type, clearQueue, gotoEnd ) {
-										var stopQueue = function( hooks ) {
-											var stop = hooks.stop;
-											delete hooks.stop;
-											stop( gotoEnd );
-										};
-										
-										if ( typeof type !== "string" ) {
-											gotoEnd = clearQueue;
-											clearQueue = type;
-											type = undefined;
-										}
-										if ( clearQueue && type !== false ) {
-											this.queue( type || "fx", [] );
-										}
-										
-										return this.each(function() {
-											var dequeue = true,
-											index = type != null && type + "queueHooks",
-											timers = jQuery.timers,
-											data = jQuery._data( this );
-											
-											if ( index ) {
-												if ( data[ index ] && data[ index ].stop ) {
-													stopQueue( data[ index ] );
-												}
-												} else {
-												for ( index in data ) {
-													if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-														stopQueue( data[ index ] );
-													}
-												}
-											}
-											
-											for ( index = timers.length; index--; ) {
-												if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-													timers[ index ].anim.stop( gotoEnd );
-													dequeue = false;
-													timers.splice( index, 1 );
-												}
-											}
-											
-											// start the next in the queue if the last step wasn't forced
-											// timers currently will call their complete callbacks, which will dequeue
-											// but only if they were gotoEnd
-											if ( dequeue || !gotoEnd ) {
-												jQuery.dequeue( this, type );
-											}
-										});
-									}
-								});
-								
-								// Generate parameters to create a standard animation
-								function genFx( type, includeWidth ) {
-									var which,
-									attrs = { height: type },
-									i = 0;
-									
-									// if we include width, step value is 1 to do all cssExpand values,
-									// if we don't include width, step value is 2 to skip over Left and Right
-									includeWidth = includeWidth? 1 : 0;
-									for( ; i < 4 ; i += 2 - includeWidth ) {
-										which = cssExpand[ i ];
-										attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-									}
-									
-									if ( includeWidth ) {
-										attrs.opacity = attrs.width = type;
-									}
-									
-									return attrs;
-								}
-								
-								// Generate shortcuts for custom animations
-								jQuery.each({
-									slideDown: genFx("show"),
-									slideUp: genFx("hide"),
-									slideToggle: genFx("toggle"),
-									fadeIn: { opacity: "show" },
-									fadeOut: { opacity: "hide" },
-									fadeToggle: { opacity: "toggle" }
-									}, function( name, props ) {
-									jQuery.fn[ name ] = function( speed, easing, callback ) {
-										return this.animate( props, speed, easing, callback );
-									};
-								});
-								
-								jQuery.speed = function( speed, easing, fn ) {
-									var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-									complete: fn || !fn && easing ||
-									jQuery.isFunction( speed ) && speed,
-									duration: speed,
-									easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-								};
-								
-								opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-								opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-								
-								// normalize opt.queue - true/undefined/null -> "fx"
-								if ( opt.queue == null || opt.queue === true ) {
-									opt.queue = "fx";
-								}
-								
-								// Queueing
-								opt.old = opt.complete;
-								
-								opt.complete = function() {
-									if ( jQuery.isFunction( opt.old ) ) {
-										opt.old.call( this );
-									}
-									
-									if ( opt.queue ) {
-										jQuery.dequeue( this, opt.queue );
-									}
-								};
-								
-								return opt;
-							};
-							
-							jQuery.easing = {
-								linear: function( p ) {
-									return p;
-								},
-								swing: function( p ) {
-									return 0.5 - Math.cos( p*Math.PI ) / 2;
-								}
-							};
-							
-							jQuery.timers = [];
-							jQuery.fx = Tween.prototype.init;
-							jQuery.fx.tick = function() {
-								var timer,
-								timers = jQuery.timers,
-								i = 0;
-								
-								fxNow = jQuery.now();
-								
-								for ( ; i < timers.length; i++ ) {
-									timer = timers[ i ];
-									// Checks the timer has not already been removed
-									if ( !timer() && timers[ i ] === timer ) {
-										timers.splice( i--, 1 );
-									}
-								}
-								
-								if ( !timers.length ) {
-									jQuery.fx.stop();
-								}
-								fxNow = undefined;
-							};
-							
-							jQuery.fx.timer = function( timer ) {
-								if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
-									timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
-								}
-							};
-							
-							jQuery.fx.interval = 13;
-							
-							jQuery.fx.stop = function() {
-								clearInterval( timerId );
-								timerId = null;
-							};
-							
-							jQuery.fx.speeds = {
-								slow: 600,
-								fast: 200,
-								// Default speed
-								_default: 400
-							};
-							
-							// Back Compat <1.8 extension point
-							jQuery.fx.step = {};
-							
-							if ( jQuery.expr && jQuery.expr.filters ) {
-								jQuery.expr.filters.animated = function( elem ) {
-									return jQuery.grep(jQuery.timers, function( fn ) {
-										return elem === fn.elem;
-									}).length;
-								};
-							}
-							var rroot = /^(?:body|html)$/i;
-							
-							jQuery.fn.offset = function( options ) {
-								if ( arguments.length ) {
-									return options === undefined ?
-									this :
-									this.each(function( i ) {
-										jQuery.offset.setOffset( this, options, i );
-									});
-								}
-								
-								var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
-								box = { top: 0, left: 0 },
-								elem = this[ 0 ],
-								doc = elem && elem.ownerDocument;
-								
-								if ( !doc ) {
-									return;
-								}
-								
-								if ( (body = doc.body) === elem ) {
-									return jQuery.offset.bodyOffset( elem );
-								}
-								
-								docElem = doc.documentElement;
-								
-								// Make sure it's not a disconnected DOM node
-								if ( !jQuery.contains( docElem, elem ) ) {
-									return box;
-								}
-								
-								// If we don't have gBCR, just use 0,0 rather than error
-								// BlackBerry 5, iOS 3 (original iPhone)
-								if ( typeof elem.getBoundingClientRect !== "undefined" ) {
-									box = elem.getBoundingClientRect();
-								}
-								win = getWindow( doc );
-								clientTop  = docElem.clientTop  || body.clientTop  || 0;
-								clientLeft = docElem.clientLeft || body.clientLeft || 0;
-								scrollTop  = win.pageYOffset || docElem.scrollTop;
-								scrollLeft = win.pageXOffset || docElem.scrollLeft;
-								return {
-									top: box.top  + scrollTop  - clientTop,
-									left: box.left + scrollLeft - clientLeft
-								};
-							};
-							
-							jQuery.offset = {
-								
-								bodyOffset: function( body ) {
-									var top = body.offsetTop,
-									left = body.offsetLeft;
-									
-									if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
-										top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-										left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
-									}
-									
-									return { top: top, left: left };
-								},
-								
-								setOffset: function( elem, options, i ) {
-									var position = jQuery.css( elem, "position" );
-									
-									// set position first, in-case top/left are set even on static elem
-									if ( position === "static" ) {
-										elem.style.position = "relative";
-									}
-									
-									var curElem = jQuery( elem ),
-									curOffset = curElem.offset(),
-									curCSSTop = jQuery.css( elem, "top" ),
-									curCSSLeft = jQuery.css( elem, "left" ),
-									calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-									props = {}, curPosition = {}, curTop, curLeft;
-									
-									// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-									if ( calculatePosition ) {
-										curPosition = curElem.position();
-										curTop = curPosition.top;
-										curLeft = curPosition.left;
-										} else {
-										curTop = parseFloat( curCSSTop ) || 0;
-										curLeft = parseFloat( curCSSLeft ) || 0;
-									}
-									
-									if ( jQuery.isFunction( options ) ) {
-										options = options.call( elem, i, curOffset );
-									}
-									
-									if ( options.top != null ) {
-										props.top = ( options.top - curOffset.top ) + curTop;
-									}
-									if ( options.left != null ) {
-										props.left = ( options.left - curOffset.left ) + curLeft;
-									}
-									
-									if ( "using" in options ) {
-										options.using.call( elem, props );
-										} else {
-										curElem.css( props );
-									}
-								}
-							};
-							
-							
-							jQuery.fn.extend({
-								
-								position: function() {
-									if ( !this[0] ) {
-										return;
-									}
-									
-									var elem = this[0],
-									
-									// Get *real* offsetParent
-									offsetParent = this.offsetParent(),
-									
-									// Get correct offsets
-									offset       = this.offset(),
-									parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
-									
-									// Subtract element margins
-									// note: when an element has margin: auto the offsetLeft and marginLeft
-									// are the same in Safari causing offset.left to incorrectly be 0
-									offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
-									offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-									
-									// Add offsetParent borders
-									parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
-									parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-									
-									// Subtract the two offsets
-									return {
-										top:  offset.top  - parentOffset.top,
-										left: offset.left - parentOffset.left
-									};
-								},
-								
-								offsetParent: function() {
-									return this.map(function() {
-										var offsetParent = this.offsetParent || document.body;
-										while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
-											offsetParent = offsetParent.offsetParent;
-										}
-										return offsetParent || document.body;
-									});
-								}
-							});
-							
-							
-							// Create scrollLeft and scrollTop methods
-							jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
-							var top = /Y/.test( prop );
-							
-							jQuery.fn[ method ] = function( val ) {
-								return jQuery.access( this, function( elem, method, val ) {
-									var win = getWindow( elem );
-									
-									if ( val === undefined ) {
-										return win ? (prop in win) ? win[ prop ] :
-										win.document.documentElement[ method ] :
-										elem[ method ];
-									}
-									
-									if ( win ) {
-										win.scrollTo(
-										!top ? val : jQuery( win ).scrollLeft(),
-										top ? val : jQuery( win ).scrollTop()
-										);
-										
-										} else {
-										elem[ method ] = val;
-									}
-								}, method, val, arguments.length, null );
-							};
-						});
-						
-						function getWindow( elem ) {
-							return jQuery.isWindow( elem ) ?
-							elem :
-							elem.nodeType === 9 ?
-							elem.defaultView || elem.parentWindow :
-							false;
-						}
-						// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-						jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-						jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
-						// margin is only for outerHeight, outerWidth
-						jQuery.fn[ funcName ] = function( margin, value ) {
-							var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-							extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-							
-							return jQuery.access( this, function( elem, type, value ) {
-								var doc;
-								
-								if ( jQuery.isWindow( elem ) ) {
-									// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
-									// isn't a whole lot we can do. See pull request at this URL for discussion:
-									// https://github.com/jquery/jquery/pull/764
-									return elem.document.documentElement[ "client" + name ];
-								}
-								
-								// Get document width or height
-								if ( elem.nodeType === 9 ) {
-									doc = elem.documentElement;
-									
-									// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
-									// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
-									return Math.max(
-									elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-									elem.body[ "offset" + name ], doc[ "offset" + name ],
-									doc[ "client" + name ]
-									);
-								}
-								
-								return value === undefined ?
-								// Get width or height on the element, requesting but not forcing parseFloat
-								jQuery.css( elem, type, value, extra ) :
-								
-								// Set width or height on the element
-								jQuery.style( elem, type, value, extra );
-							}, type, chainable ? margin : undefined, chainable, null );
-						};
-					});
-				});
-				// Expose jQuery to the global object
-				window.jQuery = window.$ = jQuery;
-				
-				// Expose jQuery as an AMD module, but only for AMD loaders that
-				// understand the issues with loading multiple versions of jQuery
-				// in a page that all might call define(). The loader will indicate
-				// they have special allowances for multiple jQuery versions by
-				// specifying define.amd.jQuery = true. Register as a named module,
-				// since jQuery can be concatenated with other files that may use define,
-				// but not use a proper concatenation script that understands anonymous
-				// AMD modules. A named AMD is safest and most robust way to register.
-				// Lowercase jquery is used because AMD module names are derived from
-				// file names, and jQuery is normally delivered in a lowercase file name.
-				// Do this after creating the global so that if an AMD module wants to call
-				// noConflict to hide this version of jQuery, it will work.
-				if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-					define( "jquery", [], function () { return jQuery; } );
-				}
-				
-			})( window );
\ No newline at end of file
diff --git a/sources/WebContent/old/js/libs/jquery-ui-1.10.3.custom.js b/sources/WebContent/old/js/libs/jquery-ui-1.10.3.custom.js
deleted file mode 100644
index 04c95a8..0000000
--- a/sources/WebContent/old/js/libs/jquery-ui-1.10.3.custom.js
+++ /dev/null
@@ -1,7727 +0,0 @@
-
-/*! jQuery UI - v1.10.3 - 2013-12-10
-* http://jqueryui.com
-* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.button.js, jquery.ui.dialog.js, jquery.ui.effect.js
-* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
-
-(function( $, undefined ) {
-	
-	var uuid = 0,
-	runiqueId = /^ui-id-\d+$/;
-	
-	// $.ui might exist from components with no dependencies, e.g., $.ui.position
-	$.ui = $.ui || {};
-	
-	$.extend( $.ui, {
-		version: "1.10.3",
-		
-		keyCode: {
-			BACKSPACE: 8,
-			COMMA: 188,
-			DELETE: 46,
-			DOWN: 40,
-			END: 35,
-			ENTER: 13,
-			ESCAPE: 27,
-			HOME: 36,
-			LEFT: 37,
-			NUMPAD_ADD: 107,
-			NUMPAD_DECIMAL: 110,
-			NUMPAD_DIVIDE: 111,
-			NUMPAD_ENTER: 108,
-			NUMPAD_MULTIPLY: 106,
-			NUMPAD_SUBTRACT: 109,
-			PAGE_DOWN: 34,
-			PAGE_UP: 33,
-			PERIOD: 190,
-			RIGHT: 39,
-			SPACE: 32,
-			TAB: 9,
-			UP: 38
-		}
-	});
-	
-	// plugins
-	$.fn.extend({
-		focus: (function( orig ) {
-			return function( delay, fn ) {
-				return typeof delay === "number" ?
-				this.each(function() {
-					var elem = this;
-					setTimeout(function() {
-						$( elem ).focus();
-						if ( fn ) {
-							fn.call( elem );
-						}
-					}, delay );
-				}) :
-				orig.apply( this, arguments );
-			};
-		})( $.fn.focus ),
-		
-		scrollParent: function() {
-			var scrollParent;
-			if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {
-				scrollParent = this.parents().filter(function() {
-					return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
-				}).eq(0);
-				} else {
-				scrollParent = this.parents().filter(function() {
-					return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
-				}).eq(0);
-			}
-			
-			return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;
-		},
-		
-		zIndex: function( zIndex ) {
-			if ( zIndex !== undefined ) {
-				return this.css( "zIndex", zIndex );
-			}
-			
-			if ( this.length ) {
-				var elem = $( this[ 0 ] ), position, value;
-				while ( elem.length && elem[ 0 ] !== document ) {
-					// Ignore z-index if position is set to a value where z-index is ignored by the browser
-					// This makes behavior of this function consistent across browsers
-					// WebKit always returns auto if the element is positioned
-					position = elem.css( "position" );
-					if ( position === "absolute" || position === "relative" || position === "fixed" ) {
-						// IE returns 0 when zIndex is not specified
-						// other browsers return a string
-						// we ignore the case of nested elements with an explicit value of 0
-						// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
-						value = parseInt( elem.css( "zIndex" ), 10 );
-						if ( !isNaN( value ) && value !== 0 ) {
-							return value;
-						}
-					}
-					elem = elem.parent();
-				}
-			}
-			
-			return 0;
-		},
-		
-		uniqueId: function() {
-			return this.each(function() {
-				if ( !this.id ) {
-					this.id = "ui-id-" + (++uuid);
-				}
-			});
-		},
-		
-		removeUniqueId: function() {
-			return this.each(function() {
-				if ( runiqueId.test( this.id ) ) {
-					$( this ).removeAttr( "id" );
-				}
-			});
-		}
-	});
-	
-	// selectors
-	function focusable( element, isTabIndexNotNaN ) {
-		var map, mapName, img,
-		nodeName = element.nodeName.toLowerCase();
-		if ( "area" === nodeName ) {
-			map = element.parentNode;
-			mapName = map.name;
-			if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
-				return false;
-			}
-			img = $( "img[usemap=#" + mapName + "]" )[0];
-			return !!img && visible( img );
-		}
-		return ( /input|select|textarea|button|object/.test( nodeName ) ?
-		!element.disabled :
-		"a" === nodeName ?
-		element.href || isTabIndexNotNaN :
-		isTabIndexNotNaN) &&
-		// the element and all of its ancestors must be visible
-		visible( element );
-	}
-	
-	function visible( element ) {
-		return $.expr.filters.visible( element ) &&
-		!$( element ).parents().addBack().filter(function() {
-			return $.css( this, "visibility" ) === "hidden";
-		}).length;
-	}
-	
-	$.extend( $.expr[ ":" ], {
-		data: $.expr.createPseudo ?
-		$.expr.createPseudo(function( dataName ) {
-			return function( elem ) {
-				return !!$.data( elem, dataName );
-			};
-		}) :
-		// support: jQuery <1.8
-		function( elem, i, match ) {
-			return !!$.data( elem, match[ 3 ] );
-		},
-		
-		focusable: function( element ) {
-			return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
-		},
-		
-		tabbable: function( element ) {
-			var tabIndex = $.attr( element, "tabindex" ),
-			isTabIndexNaN = isNaN( tabIndex );
-			return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
-		}
-	});
-	
-	// support: jQuery <1.8
-	if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
-		$.each( [ "Width", "Height" ], function( i, name ) {
-			var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
-			type = name.toLowerCase(),
-			orig = {
-				innerWidth: $.fn.innerWidth,
-				innerHeight: $.fn.innerHeight,
-				outerWidth: $.fn.outerWidth,
-				outerHeight: $.fn.outerHeight
-			};
-			
-			function reduce( elem, size, border, margin ) {
-				$.each( side, function() {
-					size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
-					if ( border ) {
-						size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
-					}
-					if ( margin ) {
-						size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
-					}
-				});
-				return size;
-			}
-			
-			$.fn[ "inner" + name ] = function( size ) {
-				if ( size === undefined ) {
-					return orig[ "inner" + name ].call( this );
-				}
-				
-				return this.each(function() {
-					$( this ).css( type, reduce( this, size ) + "px" );
-				});
-			};
-			
-			$.fn[ "outer" + name] = function( size, margin ) {
-				if ( typeof size !== "number" ) {
-					return orig[ "outer" + name ].call( this, size );
-				}
-				
-				return this.each(function() {
-					$( this).css( type, reduce( this, size, true, margin ) + "px" );
-				});
-			};
-		});
-	}
-	
-	// support: jQuery <1.8
-	if ( !$.fn.addBack ) {
-		$.fn.addBack = function( selector ) {
-			return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter( selector )
-			);
-		};
-	}
-	
-	// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
-	if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
-		$.fn.removeData = (function( removeData ) {
-			return function( key ) {
-				if ( arguments.length ) {
-					return removeData.call( this, $.camelCase( key ) );
-					} else {
-					return removeData.call( this );
-				}
-			};
-		})( $.fn.removeData );
-	}
-	
-	
-	
-	
-	
-	// deprecated
-	$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
-	
-	$.support.selectstart = "onselectstart" in document.createElement( "div" );
-	$.fn.extend({
-		disableSelection: function() {
-			return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
-			".ui-disableSelection", function( event ) {
-				event.preventDefault();
-			});
-		},
-		
-		enableSelection: function() {
-			return this.unbind( ".ui-disableSelection" );
-		}
-	});
-	
-	$.extend( $.ui, {
-		// $.ui.plugin is deprecated. Use $.widget() extensions instead.
-		plugin: {
-			add: function( module, option, set ) {
-				var i,
-				proto = $.ui[ module ].prototype;
-				for ( i in set ) {
-					proto.plugins[ i ] = proto.plugins[ i ] || [];
-					proto.plugins[ i ].push( [ option, set[ i ] ] );
-				}
-			},
-			call: function( instance, name, args ) {
-				var i,
-				set = instance.plugins[ name ];
-				if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
-					return;
-				}
-				
-				for ( i = 0; i < set.length; i++ ) {
-					if ( instance.options[ set[ i ][ 0 ] ] ) {
-						set[ i ][ 1 ].apply( instance.element, args );
-					}
-				}
-			}
-		},
-		
-		// only used by resizable
-		hasScroll: function( el, a ) {
-			
-			//If overflow is hidden, the element might have extra content, but the user wants to hide it
-			if ( $( el ).css( "overflow" ) === "hidden") {
-				return false;
-			}
-			
-			var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
-			has = false;
-			
-			if ( el[ scroll ] > 0 ) {
-				return true;
-			}
-			
-			// TODO: determine which cases actually cause this to happen
-			// if the element doesn't have the scroll set, see if it's possible to
-			// set the scroll
-			el[ scroll ] = 1;
-			has = ( el[ scroll ] > 0 );
-			el[ scroll ] = 0;
-			return has;
-		}
-	});
-	
-})( jQuery );
-(function( $, undefined ) {
-	
-	var uuid = 0,
-	slice = Array.prototype.slice,
-	_cleanData = $.cleanData;
-	$.cleanData = function( elems ) {
-		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-			try {
-				$( elem ).triggerHandler( "remove" );
-				// http://bugs.jquery.com/ticket/8235
-				} catch( e ) {}
-			}
-			_cleanData( elems );
-		};
-		
-		$.widget = function( name, base, prototype ) {
-			var fullName, existingConstructor, constructor, basePrototype,
-			// proxiedPrototype allows the provided prototype to remain unmodified
-			// so that it can be used as a mixin for multiple widgets (#8876)
-			proxiedPrototype = {},
-			namespace = name.split( "." )[ 0 ];
-			
-			name = name.split( "." )[ 1 ];
-			fullName = namespace + "-" + name;
-			
-			if ( !prototype ) {
-				prototype = base;
-				base = $.Widget;
-			}
-			
-			// create selector for plugin
-			$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
-				return !!$.data( elem, fullName );
-			};
-			
-			$[ namespace ] = $[ namespace ] || {};
-			existingConstructor = $[ namespace ][ name ];
-			constructor = $[ namespace ][ name ] = function( options, element ) {
-				// allow instantiation without "new" keyword
-				if ( !this._createWidget ) {
-					return new constructor( options, element );
-				}
-				
-				// allow instantiation without initializing for simple inheritance
-				// must use "new" keyword (the code above always passes args)
-				if ( arguments.length ) {
-					this._createWidget( options, element );
-				}
-			};
-			// extend with the existing constructor to carry over any static properties
-			$.extend( constructor, existingConstructor, {
-				version: prototype.version,
-				// copy the object used to create the prototype in case we need to
-				// redefine the widget later
-				_proto: $.extend( {}, prototype ),
-				// track widgets that inherit from this widget in case this widget is
-				// redefined after a widget inherits from it
-				_childConstructors: []
-			});
-			
-			basePrototype = new base();
-			// we need to make the options hash a property directly on the new instance
-			// otherwise we'll modify the options hash on the prototype that we're
-			// inheriting from
-			basePrototype.options = $.widget.extend( {}, basePrototype.options );
-			$.each( prototype, function( prop, value ) {
-				if ( !$.isFunction( value ) ) {
-					proxiedPrototype[ prop ] = value;
-					return;
-				}
-				proxiedPrototype[ prop ] = (function() {
-					var _super = function() {
-						return base.prototype[ prop ].apply( this, arguments );
-					},
-					_superApply = function( args ) {
-						return base.prototype[ prop ].apply( this, args );
-					};
-					return function() {
-						var __super = this._super,
-						__superApply = this._superApply,
-						returnValue;
-						
-						this._super = _super;
-						this._superApply = _superApply;
-						
-						returnValue = value.apply( this, arguments );
-						
-						this._super = __super;
-						this._superApply = __superApply;
-						
-						return returnValue;
-					};
-				})();
-			});
-			constructor.prototype = $.widget.extend( basePrototype, {
-				// TODO: remove support for widgetEventPrefix
-				// always use the name + a colon as the prefix, e.g., draggable:start
-				// don't prefix for widgets that aren't DOM-based
-				widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
-				}, proxiedPrototype, {
-				constructor: constructor,
-				namespace: namespace,
-				widgetName: name,
-				widgetFullName: fullName
-			});
-			
-			// If this widget is being redefined then we need to find all widgets that
-			// are inheriting from it and redefine all of them so that they inherit from
-			// the new version of this widget. We're essentially trying to replace one
-			// level in the prototype chain.
-			if ( existingConstructor ) {
-				$.each( existingConstructor._childConstructors, function( i, child ) {
-					var childPrototype = child.prototype;
-					
-					// redefine the child widget using the same prototype that was
-					// originally used, but inherit from the new version of the base
-					$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
-				});
-				// remove the list of existing child constructors from the old constructor
-				// so the old child constructors can be garbage collected
-				delete existingConstructor._childConstructors;
-				} else {
-				base._childConstructors.push( constructor );
-			}
-			
-			$.widget.bridge( name, constructor );
-		};
-		
-		$.widget.extend = function( target ) {
-			var input = slice.call( arguments, 1 ),
-			inputIndex = 0,
-			inputLength = input.length,
-			key,
-			value;
-			for ( ; inputIndex < inputLength; inputIndex++ ) {
-				for ( key in input[ inputIndex ] ) {
-					value = input[ inputIndex ][ key ];
-					if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
-						// Clone objects
-						if ( $.isPlainObject( value ) ) {
-							target[ key ] = $.isPlainObject( target[ key ] ) ?
-							$.widget.extend( {}, target[ key ], value ) :
-							// Don't extend strings, arrays, etc. with objects
-							$.widget.extend( {}, value );
-							// Copy everything else by reference
-							} else {
-							target[ key ] = value;
-						}
-					}
-				}
-			}
-			return target;
-		};
-		
-		$.widget.bridge = function( name, object ) {
-			var fullName = object.prototype.widgetFullName || name;
-			$.fn[ name ] = function( options ) {
-				var isMethodCall = typeof options === "string",
-				args = slice.call( arguments, 1 ),
-				returnValue = this;
-				
-				// allow multiple hashes to be passed on init
-				options = !isMethodCall && args.length ?
-				$.widget.extend.apply( null, [ options ].concat(args) ) :
-				options;
-				
-				if ( isMethodCall ) {
-					this.each(function() {
-						var methodValue,
-						instance = $.data( this, fullName );
-						if ( !instance ) {
-							return $.error( "cannot call methods on " + name + " prior to initialization; " +
-							"attempted to call method '" + options + "'" );
-						}
-						if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
-							return $.error( "no such method '" + options + "' for " + name + " widget instance" );
-						}
-						methodValue = instance[ options ].apply( instance, args );
-						if ( methodValue !== instance && methodValue !== undefined ) {
-							returnValue = methodValue && methodValue.jquery ?
-							returnValue.pushStack( methodValue.get() ) :
-							methodValue;
-							return false;
-						}
-					});
-					} else {
-					this.each(function() {
-						var instance = $.data( this, fullName );
-						if ( instance ) {
-							instance.option( options || {} )._init();
-							} else {
-							$.data( this, fullName, new object( options, this ) );
-						}
-					});
-				}
-				
-				return returnValue;
-			};
-		};
-		
-		$.Widget = function( /* options, element */ ) {};
-		$.Widget._childConstructors = [];
-		
-		$.Widget.prototype = {
-			widgetName: "widget",
-			widgetEventPrefix: "",
-			defaultElement: "<div>",
-			options: {
-				disabled: false,
-				
-				// callbacks
-				create: null
-			},
-			_createWidget: function( options, element ) {
-				element = $( element || this.defaultElement || this )[ 0 ];
-				this.element = $( element );
-				this.uuid = uuid++;
-				this.eventNamespace = "." + this.widgetName + this.uuid;
-				this.options = $.widget.extend( {},
-				this.options,
-				this._getCreateOptions(),
-				options );
-				
-				this.bindings = $();
-				this.hoverable = $();
-				this.focusable = $();
-				
-				if ( element !== this ) {
-					$.data( element, this.widgetFullName, this );
-					this._on( true, this.element, {
-						remove: function( event ) {
-							if ( event.target === element ) {
-								this.destroy();
-							}
-						}
-					});
-					this.document = $( element.style ?
-					// element within the document
-					element.ownerDocument :
-					// element is window or document
-					element.document || element );
-					this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
-				}
-				
-				this._create();
-				this._trigger( "create", null, this._getCreateEventData() );
-				this._init();
-			},
-			_getCreateOptions: $.noop,
-			_getCreateEventData: $.noop,
-			_create: $.noop,
-			_init: $.noop,
-			
-			destroy: function() {
-				this._destroy();
-				// we can probably remove the unbind calls in 2.0
-				// all event bindings should go through this._on()
-				this.element
-				.unbind( this.eventNamespace )
-				// 1.9 BC for #7810
-				// TODO remove dual storage
-				.removeData( this.widgetName )
-				.removeData( this.widgetFullName )
-				// support: jquery <1.6.3
-				// http://bugs.jquery.com/ticket/9413
-				.removeData( $.camelCase( this.widgetFullName ) );
-				this.widget()
-				.unbind( this.eventNamespace )
-				.removeAttr( "aria-disabled" )
-				.removeClass(
-				this.widgetFullName + "-disabled " +
-				"ui-state-disabled" );
-				
-				// clean up events and states
-				this.bindings.unbind( this.eventNamespace );
-				this.hoverable.removeClass( "ui-state-hover" );
-				this.focusable.removeClass( "ui-state-focus" );
-			},
-			_destroy: $.noop,
-			
-			widget: function() {
-				return this.element;
-			},
-			
-			option: function( key, value ) {
-				var options = key,
-				parts,
-				curOption,
-				i;
-				
-				if ( arguments.length === 0 ) {
-					// don't return a reference to the internal hash
-					return $.widget.extend( {}, this.options );
-				}
-				
-				if ( typeof key === "string" ) {
-					// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
-					options = {};
-					parts = key.split( "." );
-					key = parts.shift();
-					if ( parts.length ) {
-						curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
-						for ( i = 0; i < parts.length - 1; i++ ) {
-							curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
-							curOption = curOption[ parts[ i ] ];
-						}
-						key = parts.pop();
-						if ( value === undefined ) {
-							return curOption[ key ] === undefined ? null : curOption[ key ];
-						}
-						curOption[ key ] = value;
-						} else {
-						if ( value === undefined ) {
-							return this.options[ key ] === undefined ? null : this.options[ key ];
-						}
-						options[ key ] = value;
-					}
-				}
-				
-				this._setOptions( options );
-				
-				return this;
-			},
-			_setOptions: function( options ) {
-				var key;
-				
-				for ( key in options ) {
-					this._setOption( key, options[ key ] );
-				}
-				
-				return this;
-			},
-			_setOption: function( key, value ) {
-				this.options[ key ] = value;
-				
-				if ( key === "disabled" ) {
-					this.widget()
-					.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
-					.attr( "aria-disabled", value );
-					this.hoverable.removeClass( "ui-state-hover" );
-					this.focusable.removeClass( "ui-state-focus" );
-				}
-				
-				return this;
-			},
-			
-			enable: function() {
-				return this._setOption( "disabled", false );
-			},
-			disable: function() {
-				return this._setOption( "disabled", true );
-			},
-			
-			_on: function( suppressDisabledCheck, element, handlers ) {
-				var delegateElement,
-				instance = this;
-				
-				// no suppressDisabledCheck flag, shuffle arguments
-				if ( typeof suppressDisabledCheck !== "boolean" ) {
-					handlers = element;
-					element = suppressDisabledCheck;
-					suppressDisabledCheck = false;
-				}
-				
-				// no element argument, shuffle and use this.element
-				if ( !handlers ) {
-					handlers = element;
-					element = this.element;
-					delegateElement = this.widget();
-					} else {
-					// accept selectors, DOM elements
-					element = delegateElement = $( element );
-					this.bindings = this.bindings.add( element );
-				}
-				
-				$.each( handlers, function( event, handler ) {
-					function handlerProxy() {
-						// allow widgets to customize the disabled handling
-						// - disabled as an array instead of boolean
-						// - disabled class as method for disabling individual parts
-						if ( !suppressDisabledCheck &&
-						( instance.options.disabled === true ||
-						$( this ).hasClass( "ui-state-disabled" ) ) ) {
-							return;
-						}
-						return ( typeof handler === "string" ? instance[ handler ] : handler )
-						.apply( instance, arguments );
-					}
-					
-					// copy the guid so direct unbinding works
-					if ( typeof handler !== "string" ) {
-						handlerProxy.guid = handler.guid =
-						handler.guid || handlerProxy.guid || $.guid++;
-					}
-					
-					var match = event.match( /^(\w+)\s*(.*)$/ ),
-					eventName = match[1] + instance.eventNamespace,
-					selector = match[2];
-					if ( selector ) {
-						delegateElement.delegate( selector, eventName, handlerProxy );
-						} else {
-						element.bind( eventName, handlerProxy );
-					}
-				});
-			},
-			
-			_off: function( element, eventName ) {
-				eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
-				element.unbind( eventName ).undelegate( eventName );
-			},
-			
-			_delay: function( handler, delay ) {
-				function handlerProxy() {
-					return ( typeof handler === "string" ? instance[ handler ] : handler )
-					.apply( instance, arguments );
-				}
-				var instance = this;
-				return setTimeout( handlerProxy, delay || 0 );
-			},
-			
-			_hoverable: function( element ) {
-				this.hoverable = this.hoverable.add( element );
-				this._on( element, {
-					mouseenter: function( event ) {
-						$( event.currentTarget ).addClass( "ui-state-hover" );
-					},
-					mouseleave: function( event ) {
-						$( event.currentTarget ).removeClass( "ui-state-hover" );
-					}
-				});
-			},
-			
-			_focusable: function( element ) {
-				this.focusable = this.focusable.add( element );
-				this._on( element, {
-					focusin: function( event ) {
-						$( event.currentTarget ).addClass( "ui-state-focus" );
-					},
-					focusout: function( event ) {
-						$( event.currentTarget ).removeClass( "ui-state-focus" );
-					}
-				});
-			},
-			
-			_trigger: function( type, event, data ) {
-				var prop, orig,
-				callback = this.options[ type ];
-				
-				data = data || {};
-				event = $.Event( event );
-				event.type = ( type === this.widgetEventPrefix ?
-				type :
-				this.widgetEventPrefix + type ).toLowerCase();
-				// the original event may come from any element
-				// so we need to reset the target on the new event
-				event.target = this.element[ 0 ];
-				
-				// copy original event properties over to the new event
-				orig = event.originalEvent;
-				if ( orig ) {
-					for ( prop in orig ) {
-						if ( !( prop in event ) ) {
-							event[ prop ] = orig[ prop ];
-						}
-					}
-				}
-				
-				this.element.trigger( event, data );
-				return !( $.isFunction( callback ) &&
-				callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
-				event.isDefaultPrevented() );
-			}
-		};
-		
-		$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
-		$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
-			if ( typeof options === "string" ) {
-				options = { effect: options };
-			}
-			var hasOptions,
-			effectName = !options ?
-			method :
-			options === true || typeof options === "number" ?
-			defaultEffect :
-			options.effect || defaultEffect;
-			options = options || {};
-			if ( typeof options === "number" ) {
-				options = { duration: options };
-			}
-			hasOptions = !$.isEmptyObject( options );
-			options.complete = callback;
-			if ( options.delay ) {
-				element.delay( options.delay );
-			}
-			if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
-				element[ method ]( options );
-				} else if ( effectName !== method && element[ effectName ] ) {
-				element[ effectName ]( options.duration, options.easing, callback );
-				} else {
-				element.queue(function( next ) {
-					$( this )[ method ]();
-					if ( callback ) {
-						callback.call( element[ 0 ] );
-					}
-					next();
-				});
-			}
-		};
-	});
-	
-})( jQuery );
-(function( $, undefined ) {
-	
-	var mouseHandled = false;
-	$( document ).mouseup( function() {
-		mouseHandled = false;
-	});
-	
-	$.widget("ui.mouse", {
-		version: "1.10.3",
-		options: {
-			cancel: "input,textarea,button,select,option",
-			distance: 1,
-			delay: 0
-		},
-		_mouseInit: function() {
-			var that = this;
-			
-			this.element
-			.bind("mousedown."+this.widgetName, function(event) {
-				return that._mouseDown(event);
-			})
-			.bind("click."+this.widgetName, function(event) {
-				if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
-					$.removeData(event.target, that.widgetName + ".preventClickEvent");
-					event.stopImmediatePropagation();
-					return false;
-				}
-			});
-			
-			this.started = false;
-		},
-		
-		// TODO: make sure destroying one instance of mouse doesn't mess with
-		// other instances of mouse
-		_mouseDestroy: function() {
-			this.element.unbind("."+this.widgetName);
-			if ( this._mouseMoveDelegate ) {
-				$(document)
-				.unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
-				.unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
-			}
-		},
-		
-		_mouseDown: function(event) {
-			// don't let more than one widget handle mouseStart
-			if( mouseHandled ) { return; }
-			
-			// we may have missed mouseup (out of window)
-			(this._mouseStarted && this._mouseUp(event));
-			
-			this._mouseDownEvent = event;
-			
-			var that = this,
-			btnIsLeft = (event.which === 1),
-			// event.target.nodeName works around a bug in IE 8 with
-			// disabled inputs (#7620)
-			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
-			if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
-				return true;
-			}
-			
-			this.mouseDelayMet = !this.options.delay;
-			if (!this.mouseDelayMet) {
-				this._mouseDelayTimer = setTimeout(function() {
-					that.mouseDelayMet = true;
-				}, this.options.delay);
-			}
-			
-			if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
-				this._mouseStarted = (this._mouseStart(event) !== false);
-				if (!this._mouseStarted) {
-					event.preventDefault();
-					return true;
-				}
-			}
-			
-			// Click event may never have fired (Gecko & Opera)
-			if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
-				$.removeData(event.target, this.widgetName + ".preventClickEvent");
-			}
-			
-			// these delegates are required to keep context
-			this._mouseMoveDelegate = function(event) {
-				return that._mouseMove(event);
-			};
-			this._mouseUpDelegate = function(event) {
-				return that._mouseUp(event);
-			};
-			$(document)
-			.bind("mousemove."+this.widgetName, this._mouseMoveDelegate)
-			.bind("mouseup."+this.widgetName, this._mouseUpDelegate);
-			
-			event.preventDefault();
-			
-			mouseHandled = true;
-			return true;
-		},
-		
-		_mouseMove: function(event) {
-			// IE mouseup check - mouseup happened when mouse was out of window
-			if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
-				return this._mouseUp(event);
-			}
-			
-			if (this._mouseStarted) {
-				this._mouseDrag(event);
-				return event.preventDefault();
-			}
-			
-			if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
-				this._mouseStarted =
-				(this._mouseStart(this._mouseDownEvent, event) !== false);
-				(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
-			}
-			
-			return !this._mouseStarted;
-		},
-		
-		_mouseUp: function(event) {
-			$(document)
-			.unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
-			.unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
-			
-			if (this._mouseStarted) {
-				this._mouseStarted = false;
-				
-				if (event.target === this._mouseDownEvent.target) {
-					$.data(event.target, this.widgetName + ".preventClickEvent", true);
-				}
-				
-				this._mouseStop(event);
-			}
-			
-			return false;
-		},
-		
-		_mouseDistanceMet: function(event) {
-			return (Math.max(
-			Math.abs(this._mouseDownEvent.pageX - event.pageX),
-			Math.abs(this._mouseDownEvent.pageY - event.pageY)
-			) >= this.options.distance
-			);
-		},
-		
-		_mouseDelayMet: function(/* event */) {
-			return this.mouseDelayMet;
-		},
-		
-		// These are placeholder methods, to be overriden by extending plugin
-		_mouseStart: function(/* event */) {},
-		_mouseDrag: function(/* event */) {},
-		_mouseStop: function(/* event */) {},
-		_mouseCapture: function(/* event */) { return true; }
-	});
-	
-})(jQuery);
-(function( $, undefined ) {
-	
-	$.ui = $.ui || {};
-	
-	var cachedScrollbarWidth,
-	max = Math.max,
-	abs = Math.abs,
-	round = Math.round,
-	rhorizontal = /left|center|right/,
-	rvertical = /top|center|bottom/,
-	roffset = /[\+\-]\d+(\.[\d]+)?%?/,
-	rposition = /^\w+/,
-	rpercent = /%$/,
-	_position = $.fn.position;
-	
-	function getOffsets( offsets, width, height ) {
-		return [
-		parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
-		parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
-		];
-	}
-	
-	function parseCss( element, property ) {
-		return parseInt( $.css( element, property ), 10 ) || 0;
-	}
-	
-	function getDimensions( elem ) {
-		var raw = elem[0];
-		if ( raw.nodeType === 9 ) {
-			return {
-				width: elem.width(),
-				height: elem.height(),
-				offset: { top: 0, left: 0 }
-			};
-		}
-		if ( $.isWindow( raw ) ) {
-			return {
-				width: elem.width(),
-				height: elem.height(),
-				offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
-			};
-		}
-		if ( raw.preventDefault ) {
-			return {
-				width: 0,
-				height: 0,
-				offset: { top: raw.pageY, left: raw.pageX }
-			};
-		}
-		return {
-			width: elem.outerWidth(),
-			height: elem.outerHeight(),
-			offset: elem.offset()
-		};
-	}
-	
-	$.position = {
-		scrollbarWidth: function() {
-			if ( cachedScrollbarWidth !== undefined ) {
-				return cachedScrollbarWidth;
-			}
-			var w1, w2,
-			div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
-			innerDiv = div.children()[0];
-			
-			$( "body" ).append( div );
-			w1 = innerDiv.offsetWidth;
-			div.css( "overflow", "scroll" );
-			
-			w2 = innerDiv.offsetWidth;
-			
-			if ( w1 === w2 ) {
-				w2 = div[0].clientWidth;
-			}
-			
-			div.remove();
-			
-			return (cachedScrollbarWidth = w1 - w2);
-		},
-		getScrollInfo: function( within ) {
-			var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
-			overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
-			hasOverflowX = overflowX === "scroll" ||
-			( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
-			hasOverflowY = overflowY === "scroll" ||
-			( overflowY === "auto" && within.height < within.element[0].scrollHeight );
-			return {
-				width: hasOverflowY ? $.position.scrollbarWidth() : 0,
-				height: hasOverflowX ? $.position.scrollbarWidth() : 0
-			};
-		},
-		getWithinInfo: function( element ) {
-			var withinElement = $( element || window ),
-			isWindow = $.isWindow( withinElement[0] );
-			return {
-				element: withinElement,
-				isWindow: isWindow,
-				offset: withinElement.offset() || { left: 0, top: 0 },
-				scrollLeft: withinElement.scrollLeft(),
-				scrollTop: withinElement.scrollTop(),
-				width: isWindow ? withinElement.width() : withinElement.outerWidth(),
-				height: isWindow ? withinElement.height() : withinElement.outerHeight()
-			};
-		}
-	};
-	
-	$.fn.position = function( options ) {
-		if ( !options || !options.of ) {
-			return _position.apply( this, arguments );
-		}
-		
-		// make a copy, we don't want to modify arguments
-		options = $.extend( {}, options );
-		
-		var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
-		target = $( options.of ),
-		within = $.position.getWithinInfo( options.within ),
-		scrollInfo = $.position.getScrollInfo( within ),
-		collision = ( options.collision || "flip" ).split( " " ),
-		offsets = {};
-		
-		dimensions = getDimensions( target );
-		if ( target[0].preventDefault ) {
-			// force left top to allow flipping
-			options.at = "left top";
-		}
-		targetWidth = dimensions.width;
-		targetHeight = dimensions.height;
-		targetOffset = dimensions.offset;
-		// clone to reuse original targetOffset later
-		basePosition = $.extend( {}, targetOffset );
-		
-		// force my and at to have valid horizontal and vertical positions
-		// if a value is missing or invalid, it will be converted to center
-		$.each( [ "my", "at" ], function() {
-			var pos = ( options[ this ] || "" ).split( " " ),
-			horizontalOffset,
-			verticalOffset;
-			
-			if ( pos.length === 1) {
-				pos = rhorizontal.test( pos[ 0 ] ) ?
-				pos.concat( [ "center" ] ) :
-				rvertical.test( pos[ 0 ] ) ?
-				[ "center" ].concat( pos ) :
-				[ "center", "center" ];
-			}
-			pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
-			pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
-			
-			// calculate offsets
-			horizontalOffset = roffset.exec( pos[ 0 ] );
-			verticalOffset = roffset.exec( pos[ 1 ] );
-			offsets[ this ] = [
-			horizontalOffset ? horizontalOffset[ 0 ] : 0,
-			verticalOffset ? verticalOffset[ 0 ] : 0
-			];
-			
-			// reduce to just the positions without the offsets
-			options[ this ] = [
-			rposition.exec( pos[ 0 ] )[ 0 ],
-			rposition.exec( pos[ 1 ] )[ 0 ]
-			];
-		});
-		
-		// normalize collision option
-		if ( collision.length === 1 ) {
-			collision[ 1 ] = collision[ 0 ];
-		}
-		
-		if ( options.at[ 0 ] === "right" ) {
-			basePosition.left += targetWidth;
-			} else if ( options.at[ 0 ] === "center" ) {
-			basePosition.left += targetWidth / 2;
-		}
-		
-		if ( options.at[ 1 ] === "bottom" ) {
-			basePosition.top += targetHeight;
-			} else if ( options.at[ 1 ] === "center" ) {
-			basePosition.top += targetHeight / 2;
-		}
-		
-		atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
-		basePosition.left += atOffset[ 0 ];
-		basePosition.top += atOffset[ 1 ];
-		
-		return this.each(function() {
-			var collisionPosition, using,
-			elem = $( this ),
-			elemWidth = elem.outerWidth(),
-			elemHeight = elem.outerHeight(),
-			marginLeft = parseCss( this, "marginLeft" ),
-			marginTop = parseCss( this, "marginTop" ),
-			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
-			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
-			position = $.extend( {}, basePosition ),
-			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
-			
-			if ( options.my[ 0 ] === "right" ) {
-				position.left -= elemWidth;
-				} else if ( options.my[ 0 ] === "center" ) {
-				position.left -= elemWidth / 2;
-			}
-			
-			if ( options.my[ 1 ] === "bottom" ) {
-				position.top -= elemHeight;
-				} else if ( options.my[ 1 ] === "center" ) {
-				position.top -= elemHeight / 2;
-			}
-			
-			position.left += myOffset[ 0 ];
-			position.top += myOffset[ 1 ];
-			
-			// if the browser doesn't support fractions, then round for consistent results
-			if ( !$.support.offsetFractions ) {
-				position.left = round( position.left );
-				position.top = round( position.top );
-			}
-			
-			collisionPosition = {
-				marginLeft: marginLeft,
-				marginTop: marginTop
-			};
-			
-			$.each( [ "left", "top" ], function( i, dir ) {
-				if ( $.ui.position[ collision[ i ] ] ) {
-					$.ui.position[ collision[ i ] ][ dir ]( position, {
-						targetWidth: targetWidth,
-						targetHeight: targetHeight,
-						elemWidth: elemWidth,
-						elemHeight: elemHeight,
-						collisionPosition: collisionPosition,
-						collisionWidth: collisionWidth,
-						collisionHeight: collisionHeight,
-						offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
-						my: options.my,
-						at: options.at,
-						within: within,
-						elem : elem
-					});
-				}
-			});
-			
-			if ( options.using ) {
-				// adds feedback as second argument to using callback, if present
-				using = function( props ) {
-					var left = targetOffset.left - position.left,
-					right = left + targetWidth - elemWidth,
-					top = targetOffset.top - position.top,
-					bottom = top + targetHeight - elemHeight,
-					feedback = {
-						target: {
-							element: target,
-							left: targetOffset.left,
-							top: targetOffset.top,
-							width: targetWidth,
-							height: targetHeight
-						},
-						element: {
-							element: elem,
-							left: position.left,
-							top: position.top,
-							width: elemWidth,
-							height: elemHeight
-						},
-						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
-						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
-					};
-					if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
-						feedback.horizontal = "center";
-					}
-					if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
-						feedback.vertical = "middle";
-					}
-					if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
-						feedback.important = "horizontal";
-						} else {
-						feedback.important = "vertical";
-					}
-					options.using.call( this, props, feedback );
-				};
-			}
-			
-			elem.offset( $.extend( position, { using: using } ) );
-		});
-	};
-	
-	$.ui.position = {
-		fit: {
-			left: function( position, data ) {
-				var within = data.within,
-				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
-				outerWidth = within.width,
-				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
-				overLeft = withinOffset - collisionPosLeft,
-				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
-				newOverRight;
-				
-				// element is wider than within
-				if ( data.collisionWidth > outerWidth ) {
-					// element is initially over the left side of within
-					if ( overLeft > 0 && overRight <= 0 ) {
-						newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
-						position.left += overLeft - newOverRight;
-						// element is initially over right side of within
-						} else if ( overRight > 0 && overLeft <= 0 ) {
-						position.left = withinOffset;
-						// element is initially over both left and right sides of within
-						} else {
-						if ( overLeft > overRight ) {
-							position.left = withinOffset + outerWidth - data.collisionWidth;
-							} else {
-							position.left = withinOffset;
-						}
-					}
-					// too far left -> align with left edge
-					} else if ( overLeft > 0 ) {
-					position.left += overLeft;
-					// too far right -> align with right edge
-					} else if ( overRight > 0 ) {
-					position.left -= overRight;
-					// adjust based on position and margin
-					} else {
-					position.left = max( position.left - collisionPosLeft, position.left );
-				}
-			},
-			top: function( position, data ) {
-				var within = data.within,
-				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
-				outerHeight = data.within.height,
-				collisionPosTop = position.top - data.collisionPosition.marginTop,
-				overTop = withinOffset - collisionPosTop,
-				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
-				newOverBottom;
-				
-				// element is taller than within
-				if ( data.collisionHeight > outerHeight ) {
-					// element is initially over the top of within
-					if ( overTop > 0 && overBottom <= 0 ) {
-						newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
-						position.top += overTop - newOverBottom;
-						// element is initially over bottom of within
-						} else if ( overBottom > 0 && overTop <= 0 ) {
-						position.top = withinOffset;
-						// element is initially over both top and bottom of within
-						} else {
-						if ( overTop > overBottom ) {
-							position.top = withinOffset + outerHeight - data.collisionHeight;
-							} else {
-							position.top = withinOffset;
-						}
-					}
-					// too far up -> align with top
-					} else if ( overTop > 0 ) {
-					position.top += overTop;
-					// too far down -> align with bottom edge
-					} else if ( overBottom > 0 ) {
-					position.top -= overBottom;
-					// adjust based on position and margin
-					} else {
-					position.top = max( position.top - collisionPosTop, position.top );
-				}
-			}
-		},
-		flip: {
-			left: function( position, data ) {
-				var within = data.within,
-				withinOffset = within.offset.left + within.scrollLeft,
-				outerWidth = within.width,
-				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
-				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
-				overLeft = collisionPosLeft - offsetLeft,
-				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
-				myOffset = data.my[ 0 ] === "left" ?
-				-data.elemWidth :
-				data.my[ 0 ] === "right" ?
-				data.elemWidth :
-				0,
-				atOffset = data.at[ 0 ] === "left" ?
-				data.targetWidth :
-				data.at[ 0 ] === "right" ?
-				-data.targetWidth :
-				0,
-				offset = -2 * data.offset[ 0 ],
-				newOverRight,
-				newOverLeft;
-				
-				if ( overLeft < 0 ) {
-					newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
-					if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
-						position.left += myOffset + atOffset + offset;
-					}
-				}
-				else if ( overRight > 0 ) {
-					newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
-					if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
-						position.left += myOffset + atOffset + offset;
-					}
-				}
-			},
-			top: function( position, data ) {
-				var within = data.within,
-				withinOffset = within.offset.top + within.scrollTop,
-				outerHeight = within.height,
-				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
-				collisionPosTop = position.top - data.collisionPosition.marginTop,
-				overTop = collisionPosTop - offsetTop,
-				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
-				top = data.my[ 1 ] === "top",
-				myOffset = top ?
-				-data.elemHeight :
-				data.my[ 1 ] === "bottom" ?
-				data.elemHeight :
-				0,
-				atOffset = data.at[ 1 ] === "top" ?
-				data.targetHeight :
-				data.at[ 1 ] === "bottom" ?
-				-data.targetHeight :
-				0,
-				offset = -2 * data.offset[ 1 ],
-				newOverTop,
-				newOverBottom;
-				if ( overTop < 0 ) {
-					newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
-					if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
-						position.top += myOffset + atOffset + offset;
-					}
-				}
-				else if ( overBottom > 0 ) {
-					newOverTop = position.top -  data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
-					if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
-						position.top += myOffset + atOffset + offset;
-					}
-				}
-			}
-		},
-		flipfit: {
-			left: function() {
-				$.ui.position.flip.left.apply( this, arguments );
-				$.ui.position.fit.left.apply( this, arguments );
-			},
-			top: function() {
-				$.ui.position.flip.top.apply( this, arguments );
-				$.ui.position.fit.top.apply( this, arguments );
-			}
-		}
-	};
-	
-	// fraction support test
-	(function () {
-		var testElement, testElementParent, testElementStyle, offsetLeft, i,
-		body = document.getElementsByTagName( "body" )[ 0 ],
-		div = document.createElement( "div" );
-		
-		//Create a "fake body" for testing based on method used in jQuery.support
-		testElement = document.createElement( body ? "div" : "body" );
-		testElementStyle = {
-			visibility: "hidden",
-			width: 0,
-			height: 0,
-			border: 0,
-			margin: 0,
-			background: "none"
-		};
-		if ( body ) {
-			$.extend( testElementStyle, {
-				position: "absolute",
-				left: "-1000px",
-				top: "-1000px"
-			});
-		}
-		for ( i in testElementStyle ) {
-			testElement.style[ i ] = testElementStyle[ i ];
-		}
-		testElement.appendChild( div );
-		testElementParent = body || document.documentElement;
-		testElementParent.insertBefore( testElement, testElementParent.firstChild );
-		
-		div.style.cssText = "position: absolute; left: 10.7432222px;";
-		
-		offsetLeft = $( div ).offset().left;
-		$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
-		
-		testElement.innerHTML = "";
-		testElementParent.removeChild( testElement );
-	})();
-	
-}( jQuery ) );
-(function( $, undefined ) {
-	
-	$.widget("ui.draggable", $.ui.mouse, {
-		version: "1.10.3",
-		widgetEventPrefix: "drag",
-		options: {
-			addClasses: true,
-			appendTo: "parent",
-			axis: false,
-			connectToSortable: false,
-			containment: false,
-			cursor: "auto",
-			cursorAt: false,
-			grid: false,
-			handle: false,
-			helper: "original",
-			iframeFix: false,
-			opacity: false,
-			refreshPositions: false,
-			revert: false,
-			revertDuration: 500,
-			scope: "default",
-			scroll: true,
-			scrollSensitivity: 20,
-			scrollSpeed: 20,
-			snap: false,
-			snapMode: "both",
-			snapTolerance: 20,
-			stack: false,
-			zIndex: false,
-			
-			// callbacks
-			drag: null,
-			start: null,
-			stop: null
-		},
-		_create: function() {
-			
-			if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) {
-				this.element[0].style.position = "relative";
-			}
-			if (this.options.addClasses){
-				this.element.addClass("ui-draggable");
-			}
-			if (this.options.disabled){
-				this.element.addClass("ui-draggable-disabled");
-			}
-			
-			this._mouseInit();
-			
-		},
-		
-		_destroy: function() {
-			this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
-			this._mouseDestroy();
-		},
-		
-		_mouseCapture: function(event) {
-			
-			var o = this.options;
-			
-			// among others, prevent a drag on a resizable-handle
-			if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
-				return false;
-			}
-			
-			//Quit if we're not on a valid handle
-			this.handle = this._getHandle(event);
-			if (!this.handle) {
-				return false;
-			}
-			
-			$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
-				$("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>")
-				.css({
-					width: this.offsetWidth+"px", height: this.offsetHeight+"px",
-					position: "absolute", opacity: "0.001", zIndex: 1000
-				})
-				.css($(this).offset())
-				.appendTo("body");
-			});
-			
-			return true;
-			
-		},
-		
-		_mouseStart: function(event) {
-			
-			var o = this.options;
-			
-			//Create and append the visible helper
-			this.helper = this._createHelper(event);
-			
-			this.helper.addClass("ui-draggable-dragging");
-			
-			//Cache the helper size
-			this._cacheHelperProportions();
-			
-			//If ddmanager is used for droppables, set the global draggable
-			if($.ui.ddmanager) {
-				$.ui.ddmanager.current = this;
-			}
-			
-			/*
-			* - Position generation -
-			* This block generates everything position related - it's the core of draggables.
-			*/
-			
-			//Cache the margins of the original element
-			this._cacheMargins();
-			
-			//Store the helper's css position
-			this.cssPosition = this.helper.css( "position" );
-			this.scrollParent = this.helper.scrollParent();
-			this.offsetParent = this.helper.offsetParent();
-			this.offsetParentCssPosition = this.offsetParent.css( "position" );
-			
-			//The element's absolute position on the page minus margins
-			this.offset = this.positionAbs = this.element.offset();
-			this.offset = {
-				top: this.offset.top - this.margins.top,
-				left: this.offset.left - this.margins.left
-			};
-			
-			//Reset scroll cache
-			this.offset.scroll = false;
-			
-			$.extend(this.offset, {
-				click: { //Where the click happened, relative to the element
-					left: event.pageX - this.offset.left,
-					top: event.pageY - this.offset.top
-				},
-				parent: this._getParentOffset(),
-				relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
-			});
-			
-			//Generate the original position
-			this.originalPosition = this.position = this._generatePosition(event);
-			this.originalPageX = event.pageX;
-			this.originalPageY = event.pageY;
-			
-			//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
-			(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
-			
-			//Set a containment if given in the options
-			this._setContainment();
-			
-			//Trigger event + callbacks
-			if(this._trigger("start", event) === false) {
-				this._clear();
-				return false;
-			}
-			
-			//Recache the helper size
-			this._cacheHelperProportions();
-			
-			//Prepare the droppable offsets
-			if ($.ui.ddmanager && !o.dropBehaviour) {
-				$.ui.ddmanager.prepareOffsets(this, event);
-			}
-			
-			
-			this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-			
-			//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
-			if ( $.ui.ddmanager ) {
-				$.ui.ddmanager.dragStart(this, event);
-			}
-			
-			return true;
-		},
-		
-		_mouseDrag: function(event, noPropagation) {
-			// reset any necessary cached properties (see #5009)
-			if ( this.offsetParentCssPosition === "fixed" ) {
-				this.offset.parent = this._getParentOffset();
-			}
-			
-			//Compute the helpers position
-			this.position = this._generatePosition(event);
-			this.positionAbs = this._convertPositionTo("absolute");
-			
-			//Call plugins and callbacks and use the resulting position if something is returned
-			if (!noPropagation) {
-				var ui = this._uiHash();
-				if(this._trigger("drag", event, ui) === false) {
-					this._mouseUp({});
-					return false;
-				}
-				this.position = ui.position;
-			}
-			
-			if(!this.options.axis || this.options.axis !== "y") {
-				this.helper[0].style.left = this.position.left+"px";
-			}
-			if(!this.options.axis || this.options.axis !== "x") {
-				this.helper[0].style.top = this.position.top+"px";
-			}
-			if($.ui.ddmanager) {
-				$.ui.ddmanager.drag(this, event);
-			}
-			
-			return false;
-		},
-		
-		_mouseStop: function(event) {
-			
-			//If we are using droppables, inform the manager about the drop
-			var that = this,
-			dropped = false;
-			if ($.ui.ddmanager && !this.options.dropBehaviour) {
-				dropped = $.ui.ddmanager.drop(this, event);
-			}
-			
-			//if a drop comes from outside (a sortable)
-			if(this.dropped) {
-				dropped = this.dropped;
-				this.dropped = false;
-			}
-			
-			//if the original element is no longer in the DOM don't bother to continue (see #8269)
-			if ( this.options.helper === "original" && !$.contains( this.element[ 0 ].ownerDocument, this.element[ 0 ] ) ) {
-				return false;
-			}
-			
-			if((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
-				$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
-					if(that._trigger("stop", event) !== false) {
-						that._clear();
-					}
-				});
-				} else {
-				if(this._trigger("stop", event) !== false) {
-					this._clear();
-				}
-			}
-			
-			return false;
-		},
-		
-		_mouseUp: function(event) {
-			//Remove frame helpers
-			$("div.ui-draggable-iframeFix").each(function() {
-				this.parentNode.removeChild(this);
-			});
-			
-			//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
-			if( $.ui.ddmanager ) {
-				$.ui.ddmanager.dragStop(this, event);
-			}
-			
-			return $.ui.mouse.prototype._mouseUp.call(this, event);
-		},
-		
-		cancel: function() {
-			
-			if(this.helper.is(".ui-draggable-dragging")) {
-				this._mouseUp({});
-				} else {
-				this._clear();
-			}
-			
-			return this;
-			
-		},
-		
-		_getHandle: function(event) {
-			return this.options.handle ?
-			!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
-			true;
-		},
-		
-		_createHelper: function(event) {
-			
-			var o = this.options,
-			helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element);
-			
-			if(!helper.parents("body").length) {
-				helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
-			}
-			
-			if(helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
-				helper.css("position", "absolute");
-			}
-			
-			return helper;
-			
-		},
-		
-		_adjustOffsetFromHelper: function(obj) {
-			if (typeof obj === "string") {
-				obj = obj.split(" ");
-			}
-			if ($.isArray(obj)) {
-				obj = {left: +obj[0], top: +obj[1] || 0};
-			}
-			if ("left" in obj) {
-				this.offset.click.left = obj.left + this.margins.left;
-			}
-			if ("right" in obj) {
-				this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
-			}
-			if ("top" in obj) {
-				this.offset.click.top = obj.top + this.margins.top;
-			}
-			if ("bottom" in obj) {
-				this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
-			}
-		},
-		
-		_getParentOffset: function() {
-			
-			//Get the offsetParent and cache its position
-			var po = this.offsetParent.offset();
-			
-			// This is a special case where we need to modify a offset calculated on start, since the following happened:
-			// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
-			// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
-			//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-			if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
-				po.left += this.scrollParent.scrollLeft();
-				po.top += this.scrollParent.scrollTop();
-			}
-			
-			//This needs to be actually done for all browsers, since pageX/pageY includes this information
-			//Ugly IE fix
-			if((this.offsetParent[0] === document.body) ||
-			(this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
-				po = { top: 0, left: 0 };
-			}
-			
-			return {
-				top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
-				left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
-			};
-			
-		},
-		
-		_getRelativeOffset: function() {
-			
-			if(this.cssPosition === "relative") {
-				var p = this.element.position();
-				return {
-					top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
-					left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
-				};
-				} else {
-				return { top: 0, left: 0 };
-			}
-			
-		},
-		
-		_cacheMargins: function() {
-			this.margins = {
-				left: (parseInt(this.element.css("marginLeft"),10) || 0),
-				top: (parseInt(this.element.css("marginTop"),10) || 0),
-				right: (parseInt(this.element.css("marginRight"),10) || 0),
-				bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
-			};
-		},
-		
-		_cacheHelperProportions: function() {
-			this.helperProportions = {
-				width: this.helper.outerWidth(),
-				height: this.helper.outerHeight()
-			};
-		},
-		
-		_setContainment: function() {
-			
-			var over, c, ce,
-			o = this.options;
-			
-			if ( !o.containment ) {
-				this.containment = null;
-				return;
-			}
-			
-			if ( o.containment === "window" ) {
-				this.containment = [
-				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
-				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
-				$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
-				$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
-				];
-				return;
-			}
-			
-			if ( o.containment === "document") {
-				this.containment = [
-				0,
-				0,
-				$( document ).width() - this.helperProportions.width - this.margins.left,
-				( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
-				];
-				return;
-			}
-			
-			if ( o.containment.constructor === Array ) {
-				this.containment = o.containment;
-				return;
-			}
-			
-			if ( o.containment === "parent" ) {
-				o.containment = this.helper[ 0 ].parentNode;
-			}
-			
-			c = $( o.containment );
-			ce = c[ 0 ];
-			
-			if( !ce ) {
-				return;
-			}
-			
-			over = c.css( "overflow" ) !== "hidden";
-			
-			this.containment = [
-			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
-			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ) ,
-			( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - this.helperProportions.width - this.margins.left - this.margins.right,
-			( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - this.helperProportions.height - this.margins.top  - this.margins.bottom
-			];
-			this.relative_container = c;
-		},
-		
-		_convertPositionTo: function(d, pos) {
-			
-			if(!pos) {
-				pos = this.position;
-			}
-			
-			var mod = d === "absolute" ? 1 : -1,
-			scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent;
-			
-			//Cache the scroll
-			if (!this.offset.scroll) {
-				this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
-			}
-			
-			return {
-				top: (
-				pos.top	+																// The absolute mouse position
-				this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.parent.top * mod -										// The offsetParent's offset without borders (offset + border)
-				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) * mod )
-				),
-				left: (
-				pos.left +																// The absolute mouse position
-				this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
-				( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) * mod )
-				)
-			};
-			
-		},
-		
-		_generatePosition: function(event) {
-			
-			var containment, co, top, left,
-			o = this.options,
-			scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent,
-			pageX = event.pageX,
-			pageY = event.pageY;
-			
-			//Cache the scroll
-			if (!this.offset.scroll) {
-				this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()};
-			}
-			
-			/*
-			* - Position constraining -
-			* Constrain the position to a mix of grid, containment.
-			*/
-			
-			// If we are not dragging yet, we won't check for options
-			if ( this.originalPosition ) {
-				if ( this.containment ) {
-					if ( this.relative_container ){
-						co = this.relative_container.offset();
-						containment = [
-						this.containment[ 0 ] + co.left,
-						this.containment[ 1 ] + co.top,
-						this.containment[ 2 ] + co.left,
-						this.containment[ 3 ] + co.top
-						];
-					}
-					else {
-						containment = this.containment;
-					}
-					
-					if(event.pageX - this.offset.click.left < containment[0]) {
-						pageX = containment[0] + this.offset.click.left;
-					}
-					if(event.pageY - this.offset.click.top < containment[1]) {
-						pageY = containment[1] + this.offset.click.top;
-					}
-					if(event.pageX - this.offset.click.left > containment[2]) {
-						pageX = containment[2] + this.offset.click.left;
-					}
-					if(event.pageY - this.offset.click.top > containment[3]) {
-						pageY = containment[3] + this.offset.click.top;
-					}
-				}
-				
-				if(o.grid) {
-					//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
-					top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
-					pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-					
-					left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
-					pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
-				}
-				
-			}
-			
-			return {
-				top: (
-				pageY -																	// The absolute mouse position
-				this.offset.click.top	-												// Click offset (relative to the element)
-				this.offset.relative.top -												// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
-				( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top )
-				),
-				left: (
-				pageX -																	// The absolute mouse position
-				this.offset.click.left -												// Click offset (relative to the element)
-				this.offset.relative.left -												// Only for relative positioned nodes: Relative offset from element to offset parent
-				this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
-				( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left )
-				)
-			};
-			
-		},
-		
-		_clear: function() {
-			this.helper.removeClass("ui-draggable-dragging");
-			if(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
-				this.helper.remove();
-			}
-			this.helper = null;
-			this.cancelHelperRemoval = false;
-		},
-		
-		// From now on bulk stuff - mainly helpers
-		
-		_trigger: function(type, event, ui) {
-			ui = ui || this._uiHash();
-			$.ui.plugin.call(this, type, [event, ui]);
-			//The absolute position has to be recalculated after plugins
-			if(type === "drag") {
-				this.positionAbs = this._convertPositionTo("absolute");
-			}
-			return $.Widget.prototype._trigger.call(this, type, event, ui);
-		},
-		
-		plugins: {},
-		
-		_uiHash: function() {
-			return {
-				helper: this.helper,
-				position: this.position,
-				originalPosition: this.originalPosition,
-				offset: this.positionAbs
-			};
-		}
-		
-	});
-	
-	$.ui.plugin.add("draggable", "connectToSortable", {
-		start: function(event, ui) {
-			
-			var inst = $(this).data("ui-draggable"), o = inst.options,
-			uiSortable = $.extend({}, ui, { item: inst.element });
-			inst.sortables = [];
-			$(o.connectToSortable).each(function() {
-				var sortable = $.data(this, "ui-sortable");
-				if (sortable && !sortable.options.disabled) {
-					inst.sortables.push({
-						instance: sortable,
-						shouldRevert: sortable.options.revert
-					});
-					sortable.refreshPositions();	// Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
-					sortable._trigger("activate", event, uiSortable);
-				}
-			});
-			
-		},
-		stop: function(event, ui) {
-			
-			//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
-			var inst = $(this).data("ui-draggable"),
-			uiSortable = $.extend({}, ui, { item: inst.element });
-			
-			$.each(inst.sortables, function() {
-				if(this.instance.isOver) {
-					
-					this.instance.isOver = 0;
-					
-					inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
-					this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
-					
-					//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: "valid/invalid"
-					if(this.shouldRevert) {
-						this.instance.options.revert = this.shouldRevert;
-					}
-					
-					//Trigger the stop of the sortable
-					this.instance._mouseStop(event);
-					
-					this.instance.options.helper = this.instance.options._helper;
-					
-					//If the helper has been the original item, restore properties in the sortable
-					if(inst.options.helper === "original") {
-						this.instance.currentItem.css({ top: "auto", left: "auto" });
-					}
-					
-					} else {
-					this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
-					this.instance._trigger("deactivate", event, uiSortable);
-				}
-				
-			});
-			
-		},
-		drag: function(event, ui) {
-			
-			var inst = $(this).data("ui-draggable"), that = this;
-			
-			$.each(inst.sortables, function() {
-				
-				var innermostIntersecting = false,
-				thisSortable = this;
-				
-				//Copy over some variables to allow calling the sortable's native _intersectsWith
-				this.instance.positionAbs = inst.positionAbs;
-				this.instance.helperProportions = inst.helperProportions;
-				this.instance.offset.click = inst.offset.click;
-				
-				if(this.instance._intersectsWith(this.instance.containerCache)) {
-					innermostIntersecting = true;
-					$.each(inst.sortables, function () {
-						this.instance.positionAbs = inst.positionAbs;
-						this.instance.helperProportions = inst.helperProportions;
-						this.instance.offset.click = inst.offset.click;
-						if (this !== thisSortable &&
-						this.instance._intersectsWith(this.instance.containerCache) &&
-						$.contains(thisSortable.instance.element[0], this.instance.element[0])
-						) {
-							innermostIntersecting = false;
-						}
-						return innermostIntersecting;
-					});
-				}
-				
-				
-				if(innermostIntersecting) {
-					//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
-					if(!this.instance.isOver) {
-						
-						this.instance.isOver = 1;
-						//Now we fake the start of dragging for the sortable instance,
-						//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
-						//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
-						this.instance.currentItem = $(that).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item", true);
-						this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
-						this.instance.options.helper = function() { return ui.helper[0]; };
-						
-						event.target = this.instance.currentItem[0];
-						this.instance._mouseCapture(event, true);
-						this.instance._mouseStart(event, true, true);
-						
-						//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
-						this.instance.offset.click.top = inst.offset.click.top;
-						this.instance.offset.click.left = inst.offset.click.left;
-						this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
-						this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
-						
-						inst._trigger("toSortable", event);
-						inst.dropped = this.instance.element; //draggable revert needs that
-						//hack so receive/update callbacks work (mostly)
-						inst.currentItem = inst.element;
-						this.instance.fromOutside = inst;
-						
-					}
-					
-					//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
-					if(this.instance.currentItem) {
-						this.instance._mouseDrag(event);
-					}
-					
-					} else {
-					
-					//If it doesn't intersect with the sortable, and it intersected before,
-					//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
-					if(this.instance.isOver) {
-						
-						this.instance.isOver = 0;
-						this.instance.cancelHelperRemoval = true;
-						
-						//Prevent reverting on this forced stop
-						this.instance.options.revert = false;
-						
-						// The out event needs to be triggered independently
-						this.instance._trigger("out", event, this.instance._uiHash(this.instance));
-						
-						this.instance._mouseStop(event, true);
-						this.instance.options.helper = this.instance.options._helper;
-						
-						//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
-						this.instance.currentItem.remove();
-						if(this.instance.placeholder) {
-							this.instance.placeholder.remove();
-						}
-						
-						inst._trigger("fromSortable", event);
-						inst.dropped = false; //draggable revert needs that
-					}
-					
-				}
-				
-			});
-			
-		}
-	});
-	
-	$.ui.plugin.add("draggable", "cursor", {
-		start: function() {
-			var t = $("body"), o = $(this).data("ui-draggable").options;
-			if (t.css("cursor")) {
-				o._cursor = t.css("cursor");
-			}
-			t.css("cursor", o.cursor);
-		},
-		stop: function() {
-			var o = $(this).data("ui-draggable").options;
-			if (o._cursor) {
-				$("body").css("cursor", o._cursor);
-			}
-		}
-	});
-	
-	$.ui.plugin.add("draggable", "opacity", {
-		start: function(event, ui) {
-			var t = $(ui.helper), o = $(this).data("ui-draggable").options;
-			if(t.css("opacity")) {
-				o._opacity = t.css("opacity");
-			}
-			t.css("opacity", o.opacity);
-		},
-		stop: function(event, ui) {
-			var o = $(this).data("ui-draggable").options;
-			if(o._opacity) {
-				$(ui.helper).css("opacity", o._opacity);
-			}
-		}
-	});
-	
-	$.ui.plugin.add("draggable", "scroll", {
-		start: function() {
-			var i = $(this).data("ui-draggable");
-			if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
-				i.overflowOffset = i.scrollParent.offset();
-			}
-		},
-		drag: function( event ) {
-			
-			var i = $(this).data("ui-draggable"), o = i.options, scrolled = false;
-			
-			if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") {
-				
-				if(!o.axis || o.axis !== "x") {
-					if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
-						i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
-						} else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) {
-						i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
-					}
-				}
-				
-				if(!o.axis || o.axis !== "y") {
-					if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
-						i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
-						} else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) {
-						i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
-					}
-				}
-				
-				} else {
-				
-				if(!o.axis || o.axis !== "x") {
-					if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
-						scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
-						} else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
-						scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
-					}
-				}
-				
-				if(!o.axis || o.axis !== "y") {
-					if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
-						scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
-						} else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
-						scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
-					}
-				}
-				
-			}
-			
-			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
-				$.ui.ddmanager.prepareOffsets(i, event);
-			}
-			
-		}
-	});
-	
-	$.ui.plugin.add("draggable", "snap", {
-		start: function() {
-			
-			var i = $(this).data("ui-draggable"),
-			o = i.options;
-			
-			i.snapElements = [];
-			
-			$(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
-				var $t = $(this),
-				$o = $t.offset();
-				if(this !== i.element[0]) {
-					i.snapElements.push({
-						item: this,
-						width: $t.outerWidth(), height: $t.outerHeight(),
-						top: $o.top, left: $o.left
-					});
-				}
-			});
-			
-		},
-		drag: function(event, ui) {
-			
-			var ts, bs, ls, rs, l, r, t, b, i, first,
-			inst = $(this).data("ui-draggable"),
-			o = inst.options,
-			d = o.snapTolerance,
-			x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
-			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
-			
-			for (i = inst.snapElements.length - 1; i >= 0; i--){
-				
-				l = inst.snapElements[i].left;
-				r = l + inst.snapElements[i].width;
-				t = inst.snapElements[i].top;
-				b = t + inst.snapElements[i].height;
-				
-				if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
-					if(inst.snapElements[i].snapping) {
-						(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
-					}
-					inst.snapElements[i].snapping = false;
-					continue;
-				}
-				
-				if(o.snapMode !== "inner") {
-					ts = Math.abs(t - y2) <= d;
-					bs = Math.abs(b - y1) <= d;
-					ls = Math.abs(l - x2) <= d;
-					rs = Math.abs(r - x1) <= d;
-					if(ts) {
-						ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
-					}
-					if(bs) {
-						ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
-					}
-					if(ls) {
-						ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
-					}
-					if(rs) {
-						ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
-					}
-				}
-				
-				first = (ts || bs || ls || rs);
-				
-				if(o.snapMode !== "outer") {
-					ts = Math.abs(t - y1) <= d;
-					bs = Math.abs(b - y2) <= d;
-					ls = Math.abs(l - x1) <= d;
-					rs = Math.abs(r - x2) <= d;
-					if(ts) {
-						ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
-					}
-					if(bs) {
-						ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
-					}
-					if(ls) {
-						ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
-					}
-					if(rs) {
-						ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
-					}
-				}
-				
-				if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
-					(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
-				}
-				inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
-				
-			}
-			
-		}
-	});
-	
-	$.ui.plugin.add("draggable", "stack", {
-		start: function() {
-			var min,
-			o = this.data("ui-draggable").options,
-			group = $.makeArray($(o.stack)).sort(function(a,b) {
-				return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
-			});
-			
-			if (!group.length) { return; }
-			
-			min = parseInt($(group[0]).css("zIndex"), 10) || 0;
-			$(group).each(function(i) {
-				$(this).css("zIndex", min + i);
-			});
-			this.css("zIndex", (min + group.length));
-		}
-	});
-	
-	$.ui.plugin.add("draggable", "zIndex", {
-		start: function(event, ui) {
-			var t = $(ui.helper), o = $(this).data("ui-draggable").options;
-			if(t.css("zIndex")) {
-				o._zIndex = t.css("zIndex");
-			}
-			t.css("zIndex", o.zIndex);
-		},
-		stop: function(event, ui) {
-			var o = $(this).data("ui-draggable").options;
-			if(o._zIndex) {
-				$(ui.helper).css("zIndex", o._zIndex);
-			}
-		}
-	});
-	
-})(jQuery);
-(function( $, undefined ) {
-	
-	function isOverAxis( x, reference, size ) {
-		return ( x > reference ) && ( x < ( reference + size ) );
-	}
-	
-	$.widget("ui.droppable", {
-		version: "1.10.3",
-		widgetEventPrefix: "drop",
-		options: {
-			accept: "*",
-			activeClass: false,
-			addClasses: true,
-			greedy: false,
-			hoverClass: false,
-			scope: "default",
-			tolerance: "intersect",
-			
-			// callbacks
-			activate: null,
-			deactivate: null,
-			drop: null,
-			out: null,
-			over: null
-		},
-		_create: function() {
-			
-			var o = this.options,
-			accept = o.accept;
-			
-			this.isover = false;
-			this.isout = true;
-			
-			this.accept = $.isFunction(accept) ? accept : function(d) {
-				return d.is(accept);
-			};
-			
-			//Store the droppable's proportions
-			this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
-			
-			// Add the reference and positions to the manager
-			$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
-			$.ui.ddmanager.droppables[o.scope].push(this);
-			
-			(o.addClasses && this.element.addClass("ui-droppable"));
-			
-		},
-		
-		_destroy: function() {
-			var i = 0,
-			drop = $.ui.ddmanager.droppables[this.options.scope];
-			
-			for ( ; i < drop.length; i++ ) {
-				if ( drop[i] === this ) {
-					drop.splice(i, 1);
-				}
-			}
-			
-			this.element.removeClass("ui-droppable ui-droppable-disabled");
-		},
-		
-		_setOption: function(key, value) {
-			
-			if(key === "accept") {
-				this.accept = $.isFunction(value) ? value : function(d) {
-					return d.is(value);
-				};
-			}
-			$.Widget.prototype._setOption.apply(this, arguments);
-		},
-		
-		_activate: function(event) {
-			var draggable = $.ui.ddmanager.current;
-			if(this.options.activeClass) {
-				this.element.addClass(this.options.activeClass);
-			}
-			if(draggable){
-				this._trigger("activate", event, this.ui(draggable));
-			}
-		},
-		
-		_deactivate: function(event) {
-			var draggable = $.ui.ddmanager.current;
-			if(this.options.activeClass) {
-				this.element.removeClass(this.options.activeClass);
-			}
-			if(draggable){
-				this._trigger("deactivate", event, this.ui(draggable));
-			}
-		},
-		
-		_over: function(event) {
-			
-			var draggable = $.ui.ddmanager.current;
-			
-			// Bail if draggable and droppable are same element
-			if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
-				return;
-			}
-			
-			if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-				if(this.options.hoverClass) {
-					this.element.addClass(this.options.hoverClass);
-				}
-				this._trigger("over", event, this.ui(draggable));
-			}
-			
-		},
-		
-		_out: function(event) {
-			
-			var draggable = $.ui.ddmanager.current;
-			
-			// Bail if draggable and droppable are same element
-			if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
-				return;
-			}
-			
-			if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-				if(this.options.hoverClass) {
-					this.element.removeClass(this.options.hoverClass);
-				}
-				this._trigger("out", event, this.ui(draggable));
-			}
-			
-		},
-		
-		_drop: function(event,custom) {
-			
-			var draggable = custom || $.ui.ddmanager.current,
-			childrenIntersection = false;
-			
-			// Bail if draggable and droppable are same element
-			if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) {
-				return false;
-			}
-			
-			this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function() {
-				var inst = $.data(this, "ui-droppable");
-				if(
-				inst.options.greedy &&
-				!inst.options.disabled &&
-				inst.options.scope === draggable.options.scope &&
-				inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) &&
-				$.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
-				) { childrenIntersection = true; return false; }
-			});
-			if(childrenIntersection) {
-				return false;
-			}
-			
-			if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-				if(this.options.activeClass) {
-					this.element.removeClass(this.options.activeClass);
-				}
-				if(this.options.hoverClass) {
-					this.element.removeClass(this.options.hoverClass);
-				}
-				this._trigger("drop", event, this.ui(draggable));
-				return this.element;
-			}
-			
-			return false;
-			
-		},
-		
-		ui: function(c) {
-			return {
-				draggable: (c.currentItem || c.element),
-				helper: c.helper,
-				position: c.position,
-				offset: c.positionAbs
-			};
-		}
-		
-	});
-	
-	$.ui.intersect = function(draggable, droppable, toleranceMode) {
-		
-		if (!droppable.offset) {
-			return false;
-		}
-		
-		var draggableLeft, draggableTop,
-		x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
-		y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height,
-		l = droppable.offset.left, r = l + droppable.proportions.width,
-		t = droppable.offset.top, b = t + droppable.proportions.height;
-		
-		switch (toleranceMode) {
-			case "fit":
-			return (l <= x1 && x2 <= r && t <= y1 && y2 <= b);
-			case "intersect":
-			return (l < x1 + (draggable.helperProportions.width / 2) && // Right Half
-			x2 - (draggable.helperProportions.width / 2) < r && // Left Half
-			t < y1 + (draggable.helperProportions.height / 2) && // Bottom Half
-			y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
-			case "pointer":
-			draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left);
-			draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top);
-			return isOverAxis( draggableTop, t, droppable.proportions.height ) && isOverAxis( draggableLeft, l, droppable.proportions.width );
-			case "touch":
-			return (
-			(y1 >= t && y1 <= b) ||	// Top edge touching
-			(y2 >= t && y2 <= b) ||	// Bottom edge touching
-			(y1 < t && y2 > b)		// Surrounded vertically
-			) && (
-			(x1 >= l && x1 <= r) ||	// Left edge touching
-			(x2 >= l && x2 <= r) ||	// Right edge touching
-			(x1 < l && x2 > r)		// Surrounded horizontally
-			);
-			default:
-			return false;
-		}
-		
-	};
-	
-	/*
-	This manager tracks offsets of draggables and droppables
-	*/
-	$.ui.ddmanager = {
-		current: null,
-		droppables: { "default": [] },
-		prepareOffsets: function(t, event) {
-			
-			var i, j,
-			m = $.ui.ddmanager.droppables[t.options.scope] || [],
-			type = event ? event.type : null, // workaround for #2317
-			list = (t.currentItem || t.element).find(":data(ui-droppable)").addBack();
-			
-			droppablesLoop: for (i = 0; i < m.length; i++) {
-				
-				//No disabled and non-accepted
-				if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) {
-					continue;
-				}
-				
-				// Filter out elements in the current dragged item
-				for (j=0; j < list.length; j++) {
-					if(list[j] === m[i].element[0]) {
-						m[i].proportions.height = 0;
-						continue droppablesLoop;
-					}
-				}
-				
-				m[i].visible = m[i].element.css("display") !== "none";
-				if(!m[i].visible) {
-					continue;
-				}
-				
-				//Activate the droppable if used directly from draggables
-				if(type === "mousedown") {
-					m[i]._activate.call(m[i], event);
-				}
-				
-				m[i].offset = m[i].element.offset();
-				m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
-				
-			}
-			
-		},
-		drop: function(draggable, event) {
-			
-			var dropped = false;
-			// Create a copy of the droppables in case the list changes during the drop (#9116)
-			$.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function() {
-				
-				if(!this.options) {
-					return;
-				}
-				if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) {
-					dropped = this._drop.call(this, event) || dropped;
-				}
-				
-				if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-					this.isout = true;
-					this.isover = false;
-					this._deactivate.call(this, event);
-				}
-				
-			});
-			return dropped;
-			
-		},
-		dragStart: function( draggable, event ) {
-			//Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
-			draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
-				if( !draggable.options.refreshPositions ) {
-					$.ui.ddmanager.prepareOffsets( draggable, event );
-				}
-			});
-		},
-		drag: function(draggable, event) {
-			
-			//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
-			if(draggable.options.refreshPositions) {
-				$.ui.ddmanager.prepareOffsets(draggable, event);
-			}
-			
-			//Run through all droppables and check their positions based on specific tolerance options
-			$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
-				
-				if(this.options.disabled || this.greedyChild || !this.visible) {
-					return;
-				}
-				
-				var parentInstance, scope, parent,
-				intersects = $.ui.intersect(draggable, this, this.options.tolerance),
-				c = !intersects && this.isover ? "isout" : (intersects && !this.isover ? "isover" : null);
-				if(!c) {
-					return;
-				}
-				
-				if (this.options.greedy) {
-					// find droppable parents with same scope
-					scope = this.options.scope;
-					parent = this.element.parents(":data(ui-droppable)").filter(function () {
-						return $.data(this, "ui-droppable").options.scope === scope;
-					});
-					
-					if (parent.length) {
-						parentInstance = $.data(parent[0], "ui-droppable");
-						parentInstance.greedyChild = (c === "isover");
-					}
-				}
-				
-				// we just moved into a greedy child
-				if (parentInstance && c === "isover") {
-					parentInstance.isover = false;
-					parentInstance.isout = true;
-					parentInstance._out.call(parentInstance, event);
-				}
-				
-				this[c] = true;
-				this[c === "isout" ? "isover" : "isout"] = false;
-				this[c === "isover" ? "_over" : "_out"].call(this, event);
-				
-				// we just moved out of a greedy child
-				if (parentInstance && c === "isout") {
-					parentInstance.isout = false;
-					parentInstance.isover = true;
-					parentInstance._over.call(parentInstance, event);
-				}
-			});
-			
-		},
-		dragStop: function( draggable, event ) {
-			draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
-			//Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
-			if( !draggable.options.refreshPositions ) {
-				$.ui.ddmanager.prepareOffsets( draggable, event );
-			}
-		}
-	};
-	
-})(jQuery);
-(function( $, undefined ) {
-	
-	function num(v) {
-		return parseInt(v, 10) || 0;
-	}
-	
-	function isNumber(value) {
-		return !isNaN(parseInt(value, 10));
-	}
-	
-	$.widget("ui.resizable", $.ui.mouse, {
-		version: "1.10.3",
-		widgetEventPrefix: "resize",
-		options: {
-			alsoResize: false,
-			animate: false,
-			animateDuration: "slow",
-			animateEasing: "swing",
-			aspectRatio: false,
-			autoHide: false,
-			containment: false,
-			ghost: false,
-			grid: false,
-			handles: "e,s,se",
-			helper: false,
-			maxHeight: null,
-			maxWidth: null,
-			minHeight: 10,
-			minWidth: 10,
-			// See #7960
-			zIndex: 90,
-			
-			// callbacks
-			resize: null,
-			start: null,
-			stop: null
-		},
-		_create: function() {
-			
-			var n, i, handle, axis, hname,
-			that = this,
-			o = this.options;
-			this.element.addClass("ui-resizable");
-			
-			$.extend(this, {
-				_aspectRatio: !!(o.aspectRatio),
-				aspectRatio: o.aspectRatio,
-				originalElement: this.element,
-				_proportionallyResizeElements: [],
-				_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
-			});
-			
-			//Wrap the element if it cannot hold child nodes
-			if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
-				
-				//Create a wrapper element and set the wrapper to the new current internal element
-				this.element.wrap(
-				$("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
-					position: this.element.css("position"),
-					width: this.element.outerWidth(),
-					height: this.element.outerHeight(),
-					top: this.element.css("top"),
-					left: this.element.css("left")
-				})
-				);
-				
-				//Overwrite the original this.element
-				this.element = this.element.parent().data(
-				"ui-resizable", this.element.data("ui-resizable")
-				);
-				
-				this.elementIsWrapper = true;
-				
-				//Move margins to the wrapper
-				this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
-				this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
-				
-				//Prevent Safari textarea resize
-				this.originalResizeStyle = this.originalElement.css("resize");
-				this.originalElement.css("resize", "none");
-				
-				//Push the actual element to our proportionallyResize internal array
-				this._proportionallyResizeElements.push(this.originalElement.css({ position: "static", zoom: 1, display: "block" }));
-				
-				// avoid IE jump (hard set the margin)
-				this.originalElement.css({ margin: this.originalElement.css("margin") });
-				
-				// fix handlers offset
-				this._proportionallyResize();
-				
-			}
-			
-			this.handles = o.handles || (!$(".ui-resizable-handle", this.element).length ? "e,s,se" : { n: ".ui-resizable-n", e: ".ui-resizable-e", s: ".ui-resizable-s", w: ".ui-resizable-w", se: ".ui-resizable-se", sw: ".ui-resizable-sw", ne: ".ui-resizable-ne", nw: ".ui-resizable-nw" });
-			if(this.handles.constructor === String) {
-				
-				if ( this.handles === "all") {
-					this.handles = "n,e,s,w,se,sw,ne,nw";
-				}
-				
-				n = this.handles.split(",");
-				this.handles = {};
-				
-				for(i = 0; i < n.length; i++) {
-					
-					handle = $.trim(n[i]);
-					hname = "ui-resizable-"+handle;
-					axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
-					
-					// Apply zIndex to all handles - see #7960
-					axis.css({ zIndex: o.zIndex });
-					
-					//TODO : What's going on here?
-					if ("se" === handle) {
-						axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
-					}
-					
-					//Insert into internal handles object and append to element
-					this.handles[handle] = ".ui-resizable-"+handle;
-					this.element.append(axis);
-				}
-				
-			}
-			
-			this._renderAxis = function(target) {
-				
-				var i, axis, padPos, padWrapper;
-				
-				target = target || this.element;
-				
-				for(i in this.handles) {
-					
-					if(this.handles[i].constructor === String) {
-						this.handles[i] = $(this.handles[i], this.element).show();
-					}
-					
-					//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
-					if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
-						
-						axis = $(this.handles[i], this.element);
-						
-						//Checking the correct pad and border
-						padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
-						
-						//The padding type i have to apply...
-						padPos = [ "padding",
-						/ne|nw|n/.test(i) ? "Top" :
-						/se|sw|s/.test(i) ? "Bottom" :
-						/^e$/.test(i) ? "Right" : "Left" ].join("");
-						
-						target.css(padPos, padWrapper);
-						
-						this._proportionallyResize();
-						
-					}
-					
-					//TODO: What's that good for? There's not anything to be executed left
-					if(!$(this.handles[i]).length) {
-						continue;
-					}
-				}
-			};
-			
-			//TODO: make renderAxis a prototype function
-			this._renderAxis(this.element);
-			
-			this._handles = $(".ui-resizable-handle", this.element)
-			.disableSelection();
-			
-			//Matching axis name
-			this._handles.mouseover(function() {
-				if (!that.resizing) {
-					if (this.className) {
-						axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
-					}
-					//Axis, default = se
-					that.axis = axis && axis[1] ? axis[1] : "se";
-				}
-			});
-			
-			//If we want to auto hide the elements
-			if (o.autoHide) {
-				this._handles.hide();
-				$(this.element)
-				.addClass("ui-resizable-autohide")
-				.mouseenter(function() {
-					if (o.disabled) {
-						return;
-					}
-					$(this).removeClass("ui-resizable-autohide");
-					that._handles.show();
-				})
-				.mouseleave(function(){
-					if (o.disabled) {
-						return;
-					}
-					if (!that.resizing) {
-						$(this).addClass("ui-resizable-autohide");
-						that._handles.hide();
-					}
-				});
-			}
-			
-			//Initialize the mouse interaction
-			this._mouseInit();
-			
-		},
-		
-		_destroy: function() {
-			
-			this._mouseDestroy();
-			
-			var wrapper,
-			_destroy = function(exp) {
-				$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
-				.removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove();
-			};
-			
-			//TODO: Unwrap at same DOM position
-			if (this.elementIsWrapper) {
-				_destroy(this.element);
-				wrapper = this.element;
-				this.originalElement.css({
-					position: wrapper.css("position"),
-					width: wrapper.outerWidth(),
-					height: wrapper.outerHeight(),
-					top: wrapper.css("top"),
-					left: wrapper.css("left")
-				}).insertAfter( wrapper );
-				wrapper.remove();
-			}
-			
-			this.originalElement.css("resize", this.originalResizeStyle);
-			_destroy(this.originalElement);
-			
-			return this;
-		},
-		
-		_mouseCapture: function(event) {
-			var i, handle,
-			capture = false;
-			
-			for (i in this.handles) {
-				handle = $(this.handles[i])[0];
-				if (handle === event.target || $.contains(handle, event.target)) {
-					capture = true;
-				}
-			}
-			
-			return !this.options.disabled && capture;
-		},
-		
-		_mouseStart: function(event) {
-			
-			var curleft, curtop, cursor,
-			o = this.options,
-			iniPos = this.element.position(),
-			el = this.element;
-			
-			this.resizing = true;
-			
-			// bugfix for http://dev.jquery.com/ticket/1749
-			if ( (/absolute/).test( el.css("position") ) ) {
-				el.css({ position: "absolute", top: el.css("top"), left: el.css("left") });
-				} else if (el.is(".ui-draggable")) {
-				el.css({ position: "absolute", top: iniPos.top, left: iniPos.left });
-			}
-			
-			this._renderProxy();
-			
-			curleft = num(this.helper.css("left"));
-			curtop = num(this.helper.css("top"));
-			
-			if (o.containment) {
-				curleft += $(o.containment).scrollLeft() || 0;
-				curtop += $(o.containment).scrollTop() || 0;
-			}
-			
-			//Store needed variables
-			this.offset = this.helper.offset();
-			this.position = { left: curleft, top: curtop };
-			this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
-			this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
-			this.originalPosition = { left: curleft, top: curtop };
-			this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
-			this.originalMousePosition = { left: event.pageX, top: event.pageY };
-			
-			//Aspect Ratio
-			this.aspectRatio = (typeof o.aspectRatio === "number") ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
-			
-			cursor = $(".ui-resizable-" + this.axis).css("cursor");
-			$("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
-			
-			el.addClass("ui-resizable-resizing");
-			this._propagate("start", event);
-			return true;
-		},
-		
-		_mouseDrag: function(event) {
-			
-			//Increase performance, avoid regex
-			var data,
-			el = this.helper, props = {},
-			smp = this.originalMousePosition,
-			a = this.axis,
-			prevTop = this.position.top,
-			prevLeft = this.position.left,
-			prevWidth = this.size.width,
-			prevHeight = this.size.height,
-			dx = (event.pageX-smp.left)||0,
-			dy = (event.pageY-smp.top)||0,
-			trigger = this._change[a];
-			
-			if (!trigger) {
-				return false;
-			}
-			
-			// Calculate the attrs that will be change
-			data = trigger.apply(this, [event, dx, dy]);
-			
-			// Put this in the mouseDrag handler since the user can start pressing shift while resizing
-			this._updateVirtualBoundaries(event.shiftKey);
-			if (this._aspectRatio || event.shiftKey) {
-				data = this._updateRatio(data, event);
-			}
-			
-			data = this._respectSize(data, event);
-			
-			this._updateCache(data);
-			
-			// plugins callbacks need to be called first
-			this._propagate("resize", event);
-			
-			if (this.position.top !== prevTop) {
-				props.top = this.position.top + "px";
-			}
-			if (this.position.left !== prevLeft) {
-				props.left = this.position.left + "px";
-			}
-			if (this.size.width !== prevWidth) {
-				props.width = this.size.width + "px";
-			}
-			if (this.size.height !== prevHeight) {
-				props.height = this.size.height + "px";
-			}
-			el.css(props);
-			
-			if (!this._helper && this._proportionallyResizeElements.length) {
-				this._proportionallyResize();
-			}
-			
-			// Call the user callback if the element was resized
-			if ( ! $.isEmptyObject(props) ) {
-				this._trigger("resize", event, this.ui());
-			}
-			
-			return false;
-		},
-		
-		_mouseStop: function(event) {
-			
-			this.resizing = false;
-			var pr, ista, soffseth, soffsetw, s, left, top,
-			o = this.options, that = this;
-			
-			if(this._helper) {
-				
-				pr = this._proportionallyResizeElements;
-				ista = pr.length && (/textarea/i).test(pr[0].nodeName);
-				soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height;
-				soffsetw = ista ? 0 : that.sizeDiff.width;
-				
-				s = { width: (that.helper.width()  - soffsetw), height: (that.helper.height() - soffseth) };
-				left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null;
-				top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null;
-				
-				if (!o.animate) {
-					this.element.css($.extend(s, { top: top, left: left }));
-				}
-				
-				that.helper.height(that.size.height);
-				that.helper.width(that.size.width);
-				
-				if (this._helper && !o.animate) {
-					this._proportionallyResize();
-				}
-			}
-			
-			$("body").css("cursor", "auto");
-			
-			this.element.removeClass("ui-resizable-resizing");
-			
-			this._propagate("stop", event);
-			
-			if (this._helper) {
-				this.helper.remove();
-			}
-			
-			return false;
-			
-		},
-		
-		_updateVirtualBoundaries: function(forceAspectRatio) {
-			var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
-			o = this.options;
-			
-			b = {
-				minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
-				maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
-				minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
-				maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
-			};
-			
-			if(this._aspectRatio || forceAspectRatio) {
-				// We want to create an enclosing box whose aspect ration is the requested one
-				// First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
-				pMinWidth = b.minHeight * this.aspectRatio;
-				pMinHeight = b.minWidth / this.aspectRatio;
-				pMaxWidth = b.maxHeight * this.aspectRatio;
-				pMaxHeight = b.maxWidth / this.aspectRatio;
-				
-				if(pMinWidth > b.minWidth) {
-					b.minWidth = pMinWidth;
-				}
-				if(pMinHeight > b.minHeight) {
-					b.minHeight = pMinHeight;
-				}
-				if(pMaxWidth < b.maxWidth) {
-					b.maxWidth = pMaxWidth;
-				}
-				if(pMaxHeight < b.maxHeight) {
-					b.maxHeight = pMaxHeight;
-				}
-			}
-			this._vBoundaries = b;
-		},
-		
-		_updateCache: function(data) {
-			this.offset = this.helper.offset();
-			if (isNumber(data.left)) {
-				this.position.left = data.left;
-			}
-			if (isNumber(data.top)) {
-				this.position.top = data.top;
-			}
-			if (isNumber(data.height)) {
-				this.size.height = data.height;
-			}
-			if (isNumber(data.width)) {
-				this.size.width = data.width;
-			}
-		},
-		
-		_updateRatio: function( data ) {
-			
-			var cpos = this.position,
-			csize = this.size,
-			a = this.axis;
-			
-			if (isNumber(data.height)) {
-				data.width = (data.height * this.aspectRatio);
-				} else if (isNumber(data.width)) {
-				data.height = (data.width / this.aspectRatio);
-			}
-			
-			if (a === "sw") {
-				data.left = cpos.left + (csize.width - data.width);
-				data.top = null;
-			}
-			if (a === "nw") {
-				data.top = cpos.top + (csize.height - data.height);
-				data.left = cpos.left + (csize.width - data.width);
-			}
-			
-			return data;
-		},
-		
-		_respectSize: function( data ) {
-			
-			var o = this._vBoundaries,
-			a = this.axis,
-			ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
-			isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
-			dw = this.originalPosition.left + this.originalSize.width,
-			dh = this.position.top + this.size.height,
-			cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
-			if (isminw) {
-				data.width = o.minWidth;
-			}
-			if (isminh) {
-				data.height = o.minHeight;
-			}
-			if (ismaxw) {
-				data.width = o.maxWidth;
-			}
-			if (ismaxh) {
-				data.height = o.maxHeight;
-			}
-			
-			if (isminw && cw) {
-				data.left = dw - o.minWidth;
-			}
-			if (ismaxw && cw) {
-				data.left = dw - o.maxWidth;
-			}
-			if (isminh && ch) {
-				data.top = dh - o.minHeight;
-			}
-			if (ismaxh && ch) {
-				data.top = dh - o.maxHeight;
-			}
-			
-			// fixing jump error on top/left - bug #2330
-			if (!data.width && !data.height && !data.left && data.top) {
-				data.top = null;
-				} else if (!data.width && !data.height && !data.top && data.left) {
-				data.left = null;
-			}
-			
-			return data;
-		},
-		
-		_proportionallyResize: function() {
-			
-			if (!this._proportionallyResizeElements.length) {
-				return;
-			}
-			
-			var i, j, borders, paddings, prel,
-			element = this.helper || this.element;
-			
-			for ( i=0; i < this._proportionallyResizeElements.length; i++) {
-				
-				prel = this._proportionallyResizeElements[i];
-				
-				if (!this.borderDif) {
-					this.borderDif = [];
-					borders = [prel.css("borderTopWidth"), prel.css("borderRightWidth"), prel.css("borderBottomWidth"), prel.css("borderLeftWidth")];
-					paddings = [prel.css("paddingTop"), prel.css("paddingRight"), prel.css("paddingBottom"), prel.css("paddingLeft")];
-					
-					for ( j = 0; j < borders.length; j++ ) {
-						this.borderDif[ j ] = ( parseInt( borders[ j ], 10 ) || 0 ) + ( parseInt( paddings[ j ], 10 ) || 0 );
-					}
-				}
-				
-				prel.css({
-					height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
-					width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
-				});
-				
-			}
-			
-		},
-		
-		_renderProxy: function() {
-			
-			var el = this.element, o = this.options;
-			this.elementOffset = el.offset();
-			
-			if(this._helper) {
-				
-				this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
-				
-				this.helper.addClass(this._helper).css({
-					width: this.element.outerWidth() - 1,
-					height: this.element.outerHeight() - 1,
-					position: "absolute",
-					left: this.elementOffset.left +"px",
-					top: this.elementOffset.top +"px",
-					zIndex: ++o.zIndex //TODO: Don't modify option
-				});
-				
-				this.helper
-				.appendTo("body")
-				.disableSelection();
-				
-				} else {
-				this.helper = this.element;
-			}
-			
-		},
-		
-		_change: {
-			e: function(event, dx) {
-				return { width: this.originalSize.width + dx };
-			},
-			w: function(event, dx) {
-				var cs = this.originalSize, sp = this.originalPosition;
-				return { left: sp.left + dx, width: cs.width - dx };
-			},
-			n: function(event, dx, dy) {
-				var cs = this.originalSize, sp = this.originalPosition;
-				return { top: sp.top + dy, height: cs.height - dy };
-			},
-			s: function(event, dx, dy) {
-				return { height: this.originalSize.height + dy };
-			},
-			se: function(event, dx, dy) {
-				return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
-			},
-			sw: function(event, dx, dy) {
-				return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
-			},
-			ne: function(event, dx, dy) {
-				return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
-			},
-			nw: function(event, dx, dy) {
-				return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
-			}
-		},
-		
-		_propagate: function(n, event) {
-			$.ui.plugin.call(this, n, [event, this.ui()]);
-			(n !== "resize" && this._trigger(n, event, this.ui()));
-		},
-		
-		plugins: {},
-		
-		ui: function() {
-			return {
-				originalElement: this.originalElement,
-				element: this.element,
-				helper: this.helper,
-				position: this.position,
-				size: this.size,
-				originalSize: this.originalSize,
-				originalPosition: this.originalPosition
-			};
-		}
-		
-	});
-	
-	/*
-	* Resizable Extensions
-	*/
-	
-	$.ui.plugin.add("resizable", "animate", {
-		
-		stop: function( event ) {
-			var that = $(this).data("ui-resizable"),
-			o = that.options,
-			pr = that._proportionallyResizeElements,
-			ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-			soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height,
-			soffsetw = ista ? 0 : that.sizeDiff.width,
-			style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
-			left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null,
-			top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null;
-			
-			that.element.animate(
-			$.extend(style, top && left ? { top: top, left: left } : {}), {
-			duration: o.animateDuration,
-			easing: o.animateEasing,
-			step: function() {
-				
-				var data = {
-					width: parseInt(that.element.css("width"), 10),
-					height: parseInt(that.element.css("height"), 10),
-					top: parseInt(that.element.css("top"), 10),
-					left: parseInt(that.element.css("left"), 10)
-				};
-				
-				if (pr && pr.length) {
-					$(pr[0]).css({ width: data.width, height: data.height });
-				}
-				
-				// propagating resize, and updating values for each animation step
-				that._updateCache(data);
-				that._propagate("resize", event);
-				
-			}
-		}
-		);
-	}
-	
-});
-
-$.ui.plugin.add("resizable", "containment", {
-	
-	start: function() {
-		var element, p, co, ch, cw, width, height,
-		that = $(this).data("ui-resizable"),
-		o = that.options,
-		el = that.element,
-		oc = o.containment,
-		ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
-		
-		if (!ce) {
-			return;
-		}
-		
-		that.containerElement = $(ce);
-		
-		if (/document/.test(oc) || oc === document) {
-			that.containerOffset = { left: 0, top: 0 };
-			that.containerPosition = { left: 0, top: 0 };
-			
-			that.parentData = {
-				element: $(document), left: 0, top: 0,
-				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
-			};
-		}
-		
-		// i'm a node, so compute top, left, right, bottom
-		else {
-			element = $(ce);
-			p = [];
-			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
-			
-			that.containerOffset = element.offset();
-			that.containerPosition = element.position();
-			that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
-			
-			co = that.containerOffset;
-			ch = that.containerSize.height;
-			cw = that.containerSize.width;
-			width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw );
-			height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
-			
-			that.parentData = {
-				element: ce, left: co.left, top: co.top, width: width, height: height
-			};
-		}
-	},
-	
-	resize: function( event ) {
-		var woset, hoset, isParent, isOffsetRelative,
-		that = $(this).data("ui-resizable"),
-		o = that.options,
-		co = that.containerOffset, cp = that.position,
-		pRatio = that._aspectRatio || event.shiftKey,
-		cop = { top:0, left:0 }, ce = that.containerElement;
-		
-		if (ce[0] !== document && (/static/).test(ce.css("position"))) {
-			cop = co;
-		}
-		
-		if (cp.left < (that._helper ? co.left : 0)) {
-			that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));
-			if (pRatio) {
-				that.size.height = that.size.width / that.aspectRatio;
-			}
-			that.position.left = o.helper ? co.left : 0;
-		}
-		
-		if (cp.top < (that._helper ? co.top : 0)) {
-			that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);
-			if (pRatio) {
-				that.size.width = that.size.height * that.aspectRatio;
-			}
-			that.position.top = that._helper ? co.top : 0;
-		}
-		
-		that.offset.left = that.parentData.left+that.position.left;
-		that.offset.top = that.parentData.top+that.position.top;
-		
-		woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width );
-		hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );
-		
-		isParent = that.containerElement.get(0) === that.element.parent().get(0);
-		isOffsetRelative = /relative|absolute/.test(that.containerElement.css("position"));
-		
-		if(isParent && isOffsetRelative) {
-			woset -= that.parentData.left;
-		}
-		
-		if (woset + that.size.width >= that.parentData.width) {
-			that.size.width = that.parentData.width - woset;
-			if (pRatio) {
-				that.size.height = that.size.width / that.aspectRatio;
-			}
-		}
-		
-		if (hoset + that.size.height >= that.parentData.height) {
-			that.size.height = that.parentData.height - hoset;
-			if (pRatio) {
-				that.size.width = that.size.height * that.aspectRatio;
-			}
-		}
-	},
-	
-	stop: function(){
-		var that = $(this).data("ui-resizable"),
-		o = that.options,
-		co = that.containerOffset,
-		cop = that.containerPosition,
-		ce = that.containerElement,
-		helper = $(that.helper),
-		ho = helper.offset(),
-		w = helper.outerWidth() - that.sizeDiff.width,
-		h = helper.outerHeight() - that.sizeDiff.height;
-		
-		if (that._helper && !o.animate && (/relative/).test(ce.css("position"))) {
-			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
-		}
-		
-		if (that._helper && !o.animate && (/static/).test(ce.css("position"))) {
-			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
-		}
-		
-	}
-});
-
-$.ui.plugin.add("resizable", "alsoResize", {
-	
-	start: function () {
-		var that = $(this).data("ui-resizable"),
-		o = that.options,
-		_store = function (exp) {
-			$(exp).each(function() {
-				var el = $(this);
-				el.data("ui-resizable-alsoresize", {
-					width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
-					left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
-				});
-			});
-		};
-		
-		if (typeof(o.alsoResize) === "object" && !o.alsoResize.parentNode) {
-			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
-			else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
-			}else{
-			_store(o.alsoResize);
-		}
-	},
-	
-	resize: function (event, ui) {
-		var that = $(this).data("ui-resizable"),
-		o = that.options,
-		os = that.originalSize,
-		op = that.originalPosition,
-		delta = {
-			height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,
-			top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0
-		},
-		
-		_alsoResize = function (exp, c) {
-			$(exp).each(function() {
-				var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
-				css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ["width", "height"] : ["width", "height", "top", "left"];
-				
-				$.each(css, function (i, prop) {
-					var sum = (start[prop]||0) + (delta[prop]||0);
-					if (sum && sum >= 0) {
-						style[prop] = sum || null;
-					}
-				});
-				
-				el.css(style);
-			});
-		};
-		
-		if (typeof(o.alsoResize) === "object" && !o.alsoResize.nodeType) {
-			$.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
-			}else{
-			_alsoResize(o.alsoResize);
-		}
-	},
-	
-	stop: function () {
-		$(this).removeData("resizable-alsoresize");
-	}
-});
-
-$.ui.plugin.add("resizable", "ghost", {
-	
-	start: function() {
-		
-		var that = $(this).data("ui-resizable"), o = that.options, cs = that.size;
-		
-		that.ghost = that.originalElement.clone();
-		that.ghost
-		.css({ opacity: 0.25, display: "block", position: "relative", height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
-		.addClass("ui-resizable-ghost")
-		.addClass(typeof o.ghost === "string" ? o.ghost : "");
-		
-		that.ghost.appendTo(that.helper);
-		
-	},
-	
-	resize: function(){
-		var that = $(this).data("ui-resizable");
-		if (that.ghost) {
-			that.ghost.css({ position: "relative", height: that.size.height, width: that.size.width });
-		}
-	},
-	
-	stop: function() {
-		var that = $(this).data("ui-resizable");
-		if (that.ghost && that.helper) {
-			that.helper.get(0).removeChild(that.ghost.get(0));
-		}
-	}
-	
-});
-
-$.ui.plugin.add("resizable", "grid", {
-	
-	resize: function() {
-		var that = $(this).data("ui-resizable"),
-		o = that.options,
-		cs = that.size,
-		os = that.originalSize,
-		op = that.originalPosition,
-		a = that.axis,
-		grid = typeof o.grid === "number" ? [o.grid, o.grid] : o.grid,
-		gridX = (grid[0]||1),
-		gridY = (grid[1]||1),
-		ox = Math.round((cs.width - os.width) / gridX) * gridX,
-		oy = Math.round((cs.height - os.height) / gridY) * gridY,
-		newWidth = os.width + ox,
-		newHeight = os.height + oy,
-		isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
-		isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
-		isMinWidth = o.minWidth && (o.minWidth > newWidth),
-		isMinHeight = o.minHeight && (o.minHeight > newHeight);
-		
-		o.grid = grid;
-		
-		if (isMinWidth) {
-			newWidth = newWidth + gridX;
-		}
-		if (isMinHeight) {
-			newHeight = newHeight + gridY;
-		}
-		if (isMaxWidth) {
-			newWidth = newWidth - gridX;
-		}
-		if (isMaxHeight) {
-			newHeight = newHeight - gridY;
-		}
-		
-		if (/^(se|s|e)$/.test(a)) {
-			that.size.width = newWidth;
-			that.size.height = newHeight;
-			} else if (/^(ne)$/.test(a)) {
-			that.size.width = newWidth;
-			that.size.height = newHeight;
-			that.position.top = op.top - oy;
-			} else if (/^(sw)$/.test(a)) {
-			that.size.width = newWidth;
-			that.size.height = newHeight;
-			that.position.left = op.left - ox;
-			} else {
-			that.size.width = newWidth;
-			that.size.height = newHeight;
-			that.position.top = op.top - oy;
-			that.position.left = op.left - ox;
-		}
-	}
-	
-});
-
-})(jQuery);
-(function( $, undefined ) {
-
-$.widget("ui.selectable", $.ui.mouse, {
-	version: "1.10.3",
-	options: {
-		appendTo: "body",
-		autoRefresh: true,
-		distance: 0,
-		filter: "*",
-		tolerance: "touch",
-		
-		// callbacks
-		selected: null,
-		selecting: null,
-		start: null,
-		stop: null,
-		unselected: null,
-		unselecting: null
-	},
-	_create: function() {
-		var selectees,
-		that = this;
-		
-		this.element.addClass("ui-selectable");
-		
-		this.dragged = false;
-		
-		// cache selectee children based on filter
-		this.refresh = function() {
-			selectees = $(that.options.filter, that.element[0]);
-			selectees.addClass("ui-selectee");
-			selectees.each(function() {
-				var $this = $(this),
-				pos = $this.offset();
-				$.data(this, "selectable-item", {
-					element: this,
-					$element: $this,
-					left: pos.left,
-					top: pos.top,
-					right: pos.left + $this.outerWidth(),
-					bottom: pos.top + $this.outerHeight(),
-					startselected: false,
-					selected: $this.hasClass("ui-selected"),
-					selecting: $this.hasClass("ui-selecting"),
-					unselecting: $this.hasClass("ui-unselecting")
-				});
-			});
-		};
-		this.refresh();
-		
-		this.selectees = selectees.addClass("ui-selectee");
-		
-		this._mouseInit();
-		
-		this.helper = $("<div class='ui-selectable-helper'></div>");
-	},
-	
-	_destroy: function() {
-		this.selectees
-		.removeClass("ui-selectee")
-		.removeData("selectable-item");
-		this.element
-		.removeClass("ui-selectable ui-selectable-disabled");
-		this._mouseDestroy();
-	},
-	
-	_mouseStart: function(event) {
-		var that = this,
-		options = this.options;
-		
-		this.opos = [event.pageX, event.pageY];
-		
-		if (this.options.disabled) {
-			return;
-		}
-		
-		this.selectees = $(options.filter, this.element[0]);
-		
-		this._trigger("start", event);
-		
-		$(options.appendTo).append(this.helper);
-		// position helper (lasso)
-		this.helper.css({
-			"left": event.pageX,
-			"top": event.pageY,
-			"width": 0,
-			"height": 0
-		});
-		
-		if (options.autoRefresh) {
-			this.refresh();
-		}
-		
-		this.selectees.filter(".ui-selected").each(function() {
-			var selectee = $.data(this, "selectable-item");
-			selectee.startselected = true;
-			if (!event.metaKey && !event.ctrlKey) {
-				selectee.$element.removeClass("ui-selected");
-				selectee.selected = false;
-				selectee.$element.addClass("ui-unselecting");
-				selectee.unselecting = true;
-				// selectable UNSELECTING callback
-				that._trigger("unselecting", event, {
-					unselecting: selectee.element
-				});
-			}
-		});
-		
-		$(event.target).parents().addBack().each(function() {
-			var doSelect,
-			selectee = $.data(this, "selectable-item");
-			if (selectee) {
-				doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
-				selectee.$element
-				.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
-				.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
-				selectee.unselecting = !doSelect;
-				selectee.selecting = doSelect;
-				selectee.selected = doSelect;
-				// selectable (UN)SELECTING callback
-				if (doSelect) {
-					that._trigger("selecting", event, {
-						selecting: selectee.element
-					});
-					} else {
-					that._trigger("unselecting", event, {
-						unselecting: selectee.element
-					});
-				}
-				return false;
-			}
-		});
-		
-	},
-	
-	_mouseDrag: function(event) {
-		
-		this.dragged = true;
-		
-		if (this.options.disabled) {
-			return;
-		}
-		
-		var tmp,
-		that = this,
-		options = this.options,
-		x1 = this.opos[0],
-		y1 = this.opos[1],
-		x2 = event.pageX,
-		y2 = event.pageY;
-		
-		if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
-		if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
-		this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
-		
-		this.selectees.each(function() {
-			var selectee = $.data(this, "selectable-item"),
-			hit = false;
-			
-			//prevent helper from being selected if appendTo: selectable
-			if (!selectee || selectee.element === that.element[0]) {
-				return;
-			}
-			
-			if (options.tolerance === "touch") {
-				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
-				} else if (options.tolerance === "fit") {
-				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
-			}
-			
-			if (hit) {
-				// SELECT
-				if (selectee.selected) {
-					selectee.$element.removeClass("ui-selected");
-					selectee.selected = false;
-				}
-				if (selectee.unselecting) {
-					selectee.$element.removeClass("ui-unselecting");
-					selectee.unselecting = false;
-				}
-				if (!selectee.selecting) {
-					selectee.$element.addClass("ui-selecting");
-					selectee.selecting = true;
-					// selectable SELECTING callback
-					that._trigger("selecting", event, {
-						selecting: selectee.element
-					});
-				}
-				} else {
-				// UNSELECT
-				if (selectee.selecting) {
-					if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
-						selectee.$element.removeClass("ui-selecting");
-						selectee.selecting = false;
-						selectee.$element.addClass("ui-selected");
-						selectee.selected = true;
-						} else {
-						selectee.$element.removeClass("ui-selecting");
-						selectee.selecting = false;
-						if (selectee.startselected) {
-							selectee.$element.addClass("ui-unselecting");
-							selectee.unselecting = true;
-						}
-						// selectable UNSELECTING callback
-						that._trigger("unselecting", event, {
-							unselecting: selectee.element
-						});
-					}
-				}
-				if (selectee.selected) {
-					if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
-						selectee.$element.removeClass("ui-selected");
-						selectee.selected = false;
-						
-						selectee.$element.addClass("ui-unselecting");
-						selectee.unselecting = true;
-						// selectable UNSELECTING callback
-						that._trigger("unselecting", event, {
-							unselecting: selectee.element
-						});
-					}
-				}
-			}
-		});
-		
-		return false;
-	},
-	
-	_mouseStop: function(event) {
-		var that = this;
-		
-		this.dragged = false;
-		
-		$(".ui-unselecting", this.element[0]).each(function() {
-			var selectee = $.data(this, "selectable-item");
-			selectee.$element.removeClass("ui-unselecting");
-			selectee.unselecting = false;
-			selectee.startselected = false;
-			that._trigger("unselected", event, {
-				unselected: selectee.element
-			});
-		});
-		$(".ui-selecting", this.element[0]).each(function() {
-			var selectee = $.data(this, "selectable-item");
-			selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
-			selectee.selecting = false;
-			selectee.selected = true;
-			selectee.startselected = true;
-			that._trigger("selected", event, {
-				selected: selectee.element
-			});
-		});
-		this._trigger("stop", event);
-		
-		this.helper.remove();
-		
-		return false;
-	}
-	
-});
-
-})(jQuery);
-(function( $, undefined ) {
-
-/*jshint loopfunc: true */
-
-function isOverAxis( x, reference, size ) {
-	return ( x > reference ) && ( x < ( reference + size ) );
-}
-
-function isFloating(item) {
-	return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
-}
-
-$.widget("ui.sortable", $.ui.mouse, {
-	version: "1.10.3",
-	widgetEventPrefix: "sort",
-	ready: false,
-	options: {
-		appendTo: "parent",
-		axis: false,
-		connectWith: false,
-		containment: false,
-		cursor: "auto",
-		cursorAt: false,
-		dropOnEmpty: true,
-		forcePlaceholderSize: false,
-		forceHelperSize: false,
-		grid: false,
-		handle: false,
-		helper: "original",
-		items: "> *",
-		opacity: false,
-		placeholder: false,
-		revert: false,
-		scroll: true,
-		scrollSensitivity: 20,
-		scrollSpeed: 20,
-		scope: "default",
-		tolerance: "intersect",
-		zIndex: 1000,
-		
-		// callbacks
-		activate: null,
-		beforeStop: null,
-		change: null,
-		deactivate: null,
-		out: null,
-		over: null,
-		receive: null,
-		remove: null,
-		sort: null,
-		start: null,
-		stop: null,
-		update: null
-	},
-	_create: function() {
-		
-		var o = this.options;
-		this.containerCache = {};
-		this.element.addClass("ui-sortable");
-		
-		//Get the items
-		this.refresh();
-		
-		//Let's determine if the items are being displayed horizontally
-		this.floating = this.items.length ? o.axis === "x" || isFloating(this.items[0].item) : false;
-		
-		//Let's determine the parent's offset
-		this.offset = this.element.offset();
-		
-		//Initialize mouse events for interaction
-		this._mouseInit();
-		
-		//We're ready to go
-		this.ready = true;
-		
-	},
-	
-	_destroy: function() {
-		this.element
-		.removeClass("ui-sortable ui-sortable-disabled");
-		this._mouseDestroy();
-		
-		for ( var i = this.items.length - 1; i >= 0; i-- ) {
-			this.items[i].item.removeData(this.widgetName + "-item");
-		}
-		
-		return this;
-	},
-	
-	_setOption: function(key, value){
-		if ( key === "disabled" ) {
-			this.options[ key ] = value;
-			
-			this.widget().toggleClass( "ui-sortable-disabled", !!value );
-			} else {
-			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
-			$.Widget.prototype._setOption.apply(this, arguments);
-		}
-	},
-	
-	_mouseCapture: function(event, overrideHandle) {
-		var currentItem = null,
-		validHandle = false,
-		that = this;
-		
-		if (this.reverting) {
-			return false;
-		}
-		
-		if(this.options.disabled || this.options.type === "static") {
-			return false;
-		}
-		
-		//We have to refresh the items data once first
-		this._refreshItems(event);
-		
-		//Find out if the clicked node (or one of its parents) is a actual item in this.items
-		$(event.target).parents().each(function() {
-			if($.data(this, that.widgetName + "-item") === that) {
-				currentItem = $(this);
-				return false;
-			}
-		});
-		if($.data(event.target, that.widgetName + "-item") === that) {
-			currentItem = $(event.target);
-		}
-		
-		if(!currentItem) {
-			return false;
-		}
-		if(this.options.handle && !overrideHandle) {
-			$(this.options.handle, currentItem).find("*").addBack().each(function() {
-				if(this === event.target) {
-					validHandle = true;
-				}
-			});
-			if(!validHandle) {
-				return false;
-			}
-		}
-		
-		this.currentItem = currentItem;
-		this._removeCurrentsFromItems();
-		return true;
-		
-	},
-	
-	_mouseStart: function(event, overrideHandle, noActivation) {
-		
-		var i, body,
-		o = this.options;
-		
-		this.currentContainer = this;
-		
-		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
-		this.refreshPositions();
-		
-		//Create and append the visible helper
-		this.helper = this._createHelper(event);
-		
-		//Cache the helper size
-		this._cacheHelperProportions();
-		
-		/*
-		* - Position generation -
-		* This block generates everything position related - it's the core of draggables.
-		*/
-		
-		//Cache the margins of the original element
-		this._cacheMargins();
-		
-		//Get the next scrolling parent
-		this.scrollParent = this.helper.scrollParent();
-		
-		//The element's absolute position on the page minus margins
-		this.offset = this.currentItem.offset();
-		this.offset = {
-			top: this.offset.top - this.margins.top,
-			left: this.offset.left - this.margins.left
-		};
-		
-		$.extend(this.offset, {
-			click: { //Where the click happened, relative to the element
-				left: event.pageX - this.offset.left,
-				top: event.pageY - this.offset.top
-			},
-			parent: this._getParentOffset(),
-			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
-		});
-		
-		// Only after we got the offset, we can change the helper's position to absolute
-		// TODO: Still need to figure out a way to make relative sorting possible
-		this.helper.css("position", "absolute");
-		this.cssPosition = this.helper.css("position");
-		
-		//Generate the original position
-		this.originalPosition = this._generatePosition(event);
-		this.originalPageX = event.pageX;
-		this.originalPageY = event.pageY;
-		
-		//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
-		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
-		
-		//Cache the former DOM position
-		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
-		
-		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
-		if(this.helper[0] !== this.currentItem[0]) {
-			this.currentItem.hide();
-		}
-		
-		//Create the placeholder
-		this._createPlaceholder();
-		
-		//Set a containment if given in the options
-		if(o.containment) {
-			this._setContainment();
-		}
-		
-		if( o.cursor && o.cursor !== "auto" ) { // cursor option
-			body = this.document.find( "body" );
-			
-			// support: IE
-			this.storedCursor = body.css( "cursor" );
-			body.css( "cursor", o.cursor );
-			
-			this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
-		}
-		
-		if(o.opacity) { // opacity option
-			if (this.helper.css("opacity")) {
-				this._storedOpacity = this.helper.css("opacity");
-			}
-			this.helper.css("opacity", o.opacity);
-		}
-		
-		if(o.zIndex) { // zIndex option
-			if (this.helper.css("zIndex")) {
-				this._storedZIndex = this.helper.css("zIndex");
-			}
-			this.helper.css("zIndex", o.zIndex);
-		}
-		
-		//Prepare scrolling
-		if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
-			this.overflowOffset = this.scrollParent.offset();
-		}
-		
-		//Call callbacks
-		this._trigger("start", event, this._uiHash());
-		
-		//Recache the helper size
-		if(!this._preserveHelperProportions) {
-			this._cacheHelperProportions();
-		}
-		
-		
-		//Post "activate" events to possible containers
-		if( !noActivation ) {
-			for ( i = this.containers.length - 1; i >= 0; i-- ) {
-				this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
-			}
-		}
-		
-		//Prepare possible droppables
-		if($.ui.ddmanager) {
-			$.ui.ddmanager.current = this;
-		}
-		
-		if ($.ui.ddmanager && !o.dropBehaviour) {
-			$.ui.ddmanager.prepareOffsets(this, event);
-		}
-		
-		this.dragging = true;
-		
-		this.helper.addClass("ui-sortable-helper");
-		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-		return true;
-		
-	},
-	
-	_mouseDrag: function(event) {
-		var i, item, itemElement, intersection,
-		o = this.options,
-		scrolled = false;
-		
-		//Compute the helpers position
-		this.position = this._generatePosition(event);
-		this.positionAbs = this._convertPositionTo("absolute");
-		
-		if (!this.lastPositionAbs) {
-			this.lastPositionAbs = this.positionAbs;
-		}
-		
-		//Do scrolling
-		if(this.options.scroll) {
-			if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
-				
-				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
-					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
-					} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
-					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
-				}
-				
-				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
-					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
-					} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
-					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
-				}
-				
-				} else {
-				
-				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
-					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
-					} else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
-					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
-				}
-				
-				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
-					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
-					} else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
-					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
-				}
-				
-			}
-			
-			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
-				$.ui.ddmanager.prepareOffsets(this, event);
-			}
-		}
-		
-		//Regenerate the absolute position used for position checks
-		this.positionAbs = this._convertPositionTo("absolute");
-		
-		//Set the helper position
-		if(!this.options.axis || this.options.axis !== "y") {
-			this.helper[0].style.left = this.position.left+"px";
-		}
-		if(!this.options.axis || this.options.axis !== "x") {
-			this.helper[0].style.top = this.position.top+"px";
-		}
-		
-		//Rearrange
-		for (i = this.items.length - 1; i >= 0; i--) {
-			
-			//Cache variables and intersection, continue if no intersection
-			item = this.items[i];
-			itemElement = item.item[0];
-			intersection = this._intersectsWithPointer(item);
-			if (!intersection) {
-				continue;
-			}
-			
-			// Only put the placeholder inside the current Container, skip all
-			// items form other containers. This works because when moving
-			// an item from one container to another the
-			// currentContainer is switched before the placeholder is moved.
-			//
-			// Without this moving items in "sub-sortables" can cause the placeholder to jitter
-			// beetween the outer and inner container.
-			if (item.instance !== this.currentContainer) {
-				continue;
-			}
-			
-			// cannot intersect with itself
-			// no useless actions that have been done before
-			// no action if the item moved is the parent of the item checked
-			if (itemElement !== this.currentItem[0] &&
-			this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
-			!$.contains(this.placeholder[0], itemElement) &&
-			(this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
-			) {
-				
-				this.direction = intersection === 1 ? "down" : "up";
-				
-				if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
-					this._rearrange(event, item);
-					} else {
-					break;
-				}
-				
-				this._trigger("change", event, this._uiHash());
-				break;
-			}
-		}
-		
-		//Post events to containers
-		this._contactContainers(event);
-		
-		//Interconnect with droppables
-		if($.ui.ddmanager) {
-			$.ui.ddmanager.drag(this, event);
-		}
-		
-		//Call callbacks
-		this._trigger("sort", event, this._uiHash());
-		
-		this.lastPositionAbs = this.positionAbs;
-		return false;
-		
-	},
-	
-	_mouseStop: function(event, noPropagation) {
-		
-		if(!event) {
-			return;
-		}
-		
-		//If we are using droppables, inform the manager about the drop
-		if ($.ui.ddmanager && !this.options.dropBehaviour) {
-			$.ui.ddmanager.drop(this, event);
-		}
-		
-		if(this.options.revert) {
-			var that = this,
-			cur = this.placeholder.offset(),
-			axis = this.options.axis,
-			animation = {};
-			
-			if ( !axis || axis === "x" ) {
-				animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);
-			}
-			if ( !axis || axis === "y" ) {
-				animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);
-			}
-			this.reverting = true;
-			$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
-				that._clear(event);
-			});
-			} else {
-			this._clear(event, noPropagation);
-		}
-		
-		return false;
-		
-	},
-	
-	cancel: function() {
-		
-		if(this.dragging) {
-			
-			this._mouseUp({ target: null });
-			
-			if(this.options.helper === "original") {
-				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
-				} else {
-				this.currentItem.show();
-			}
-			
-			//Post deactivating events to containers
-			for (var i = this.containers.length - 1; i >= 0; i--){
-				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
-				if(this.containers[i].containerCache.over) {
-					this.containers[i]._trigger("out", null, this._uiHash(this));
-					this.containers[i].containerCache.over = 0;
-				}
-			}
-			
-		}
-		
-		if (this.placeholder) {
-			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
-			if(this.placeholder[0].parentNode) {
-				this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
-			}
-			if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
-				this.helper.remove();
-			}
-			
-			$.extend(this, {
-				helper: null,
-				dragging: false,
-				reverting: false,
-				_noFinalSort: null
-			});
-			
-			if(this.domPosition.prev) {
-				$(this.domPosition.prev).after(this.currentItem);
-				} else {
-				$(this.domPosition.parent).prepend(this.currentItem);
-			}
-		}
-		
-		return this;
-		
-	},
-	
-	serialize: function(o) {
-		
-		var items = this._getItemsAsjQuery(o && o.connected),
-		str = [];
-		o = o || {};
-		
-		$(items).each(function() {
-			var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
-			if (res) {
-				str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
-			}
-		});
-		
-		if(!str.length && o.key) {
-			str.push(o.key + "=");
-		}
-		
-		return str.join("&");
-		
-	},
-	
-	toArray: function(o) {
-		
-		var items = this._getItemsAsjQuery(o && o.connected),
-		ret = [];
-		
-		o = o || {};
-		
-		items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
-		return ret;
-		
-	},
-	
-	/* Be careful with the following core functions */
-	_intersectsWith: function(item) {
-		
-		var x1 = this.positionAbs.left,
-		x2 = x1 + this.helperProportions.width,
-		y1 = this.positionAbs.top,
-		y2 = y1 + this.helperProportions.height,
-		l = item.left,
-		r = l + item.width,
-		t = item.top,
-		b = t + item.height,
-		dyClick = this.offset.click.top,
-		dxClick = this.offset.click.left,
-		isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
-		isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
-		isOverElement = isOverElementHeight && isOverElementWidth;
-		
-		if ( this.options.tolerance === "pointer" ||
-		this.options.forcePointerForContainers ||
-		(this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
-		) {
-			return isOverElement;
-			} else {
-			
-			return (l < x1 + (this.helperProportions.width / 2) && // Right Half
-			x2 - (this.helperProportions.width / 2) < r && // Left Half
-			t < y1 + (this.helperProportions.height / 2) && // Bottom Half
-			y2 - (this.helperProportions.height / 2) < b ); // Top Half
-			
-		}
-	},
-	
-	_intersectsWithPointer: function(item) {
-		
-		var isOverElementHeight = (this.options.axis === "x") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
-		isOverElementWidth = (this.options.axis === "y") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
-		isOverElement = isOverElementHeight && isOverElementWidth,
-		verticalDirection = this._getDragVerticalDirection(),
-		horizontalDirection = this._getDragHorizontalDirection();
-		
-		if (!isOverElement) {
-			return false;
-		}
-		
-		return this.floating ?
-		( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
-		: ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
-		
-	},
-	
-	_intersectsWithSides: function(item) {
-		
-		var isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
-		isOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
-		verticalDirection = this._getDragVerticalDirection(),
-		horizontalDirection = this._getDragHorizontalDirection();
-		
-		if (this.floating && horizontalDirection) {
-			return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
-			} else {
-			return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
-		}
-		
-	},
-	
-	_getDragVerticalDirection: function() {
-		var delta = this.positionAbs.top - this.lastPositionAbs.top;
-		return delta !== 0 && (delta > 0 ? "down" : "up");
-	},
-	
-	_getDragHorizontalDirection: function() {
-		var delta = this.positionAbs.left - this.lastPositionAbs.left;
-		return delta !== 0 && (delta > 0 ? "right" : "left");
-	},
-	
-	refresh: function(event) {
-		this._refreshItems(event);
-		this.refreshPositions();
-		return this;
-	},
-	
-	_connectWith: function() {
-		var options = this.options;
-		return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
-	},
-	
-	_getItemsAsjQuery: function(connected) {
-		
-		var i, j, cur, inst,
-		items = [],
-		queries = [],
-		connectWith = this._connectWith();
-		
-		if(connectWith && connected) {
-			for (i = connectWith.length - 1; i >= 0; i--){
-				cur = $(connectWith[i]);
-				for ( j = cur.length - 1; j >= 0; j--){
-					inst = $.data(cur[j], this.widgetFullName);
-					if(inst && inst !== this && !inst.options.disabled) {
-						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
-					}
-				}
-			}
-		}
-		
-		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
-		
-		for (i = queries.length - 1; i >= 0; i--){
-			queries[i][0].each(function() {
-				items.push(this);
-			});
-		}
-		
-		return $(items);
-		
-	},
-	
-	_removeCurrentsFromItems: function() {
-		
-		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
-		
-		this.items = $.grep(this.items, function (item) {
-			for (var j=0; j < list.length; j++) {
-				if(list[j] === item.item[0]) {
-					return false;
-				}
-			}
-			return true;
-		});
-		
-	},
-	
-	_refreshItems: function(event) {
-		
-		this.items = [];
-		this.containers = [this];
-		
-		var i, j, cur, inst, targetData, _queries, item, queriesLength,
-		items = this.items,
-		queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
-		connectWith = this._connectWith();
-		
-		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
-			for (i = connectWith.length - 1; i >= 0; i--){
-				cur = $(connectWith[i]);
-				for (j = cur.length - 1; j >= 0; j--){
-					inst = $.data(cur[j], this.widgetFullName);
-					if(inst && inst !== this && !inst.options.disabled) {
-						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
-						this.containers.push(inst);
-					}
-				}
-			}
-		}
-		
-		for (i = queries.length - 1; i >= 0; i--) {
-			targetData = queries[i][1];
-			_queries = queries[i][0];
-			
-			for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
-				item = $(_queries[j]);
-				
-				item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
-				
-				items.push({
-					item: item,
-					instance: targetData,
-					width: 0, height: 0,
-					left: 0, top: 0
-				});
-			}
-		}
-		
-	},
-	
-	refreshPositions: function(fast) {
-		
-		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
-		if(this.offsetParent && this.helper) {
-			this.offset.parent = this._getParentOffset();
-		}
-		
-		var i, item, t, p;
-		
-		for (i = this.items.length - 1; i >= 0; i--){
-			item = this.items[i];
-			
-			//We ignore calculating positions of all connected containers when we're not over them
-			if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
-				continue;
-			}
-			
-			t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
-			
-			if (!fast) {
-				item.width = t.outerWidth();
-				item.height = t.outerHeight();
-			}
-			
-			p = t.offset();
-			item.left = p.left;
-			item.top = p.top;
-		}
-		
-		if(this.options.custom && this.options.custom.refreshContainers) {
-			this.options.custom.refreshContainers.call(this);
-			} else {
-			for (i = this.containers.length - 1; i >= 0; i--){
-				p = this.containers[i].element.offset();
-				this.containers[i].containerCache.left = p.left;
-				this.containers[i].containerCache.top = p.top;
-				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
-				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
-			}
-		}
-		
-		return this;
-	},
-	
-	_createPlaceholder: function(that) {
-		that = that || this;
-		var className,
-		o = that.options;
-		
-		if(!o.placeholder || o.placeholder.constructor === String) {
-			className = o.placeholder;
-			o.placeholder = {
-				element: function() {
-					
-					var nodeName = that.currentItem[0].nodeName.toLowerCase(),
-					element = $( "<" + nodeName + ">", that.document[0] )
-					.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
-					.removeClass("ui-sortable-helper");
-					
-					if ( nodeName === "tr" ) {
-						that.currentItem.children().each(function() {
-							$( "<td>&#160;</td>", that.document[0] )
-							.attr( "colspan", $( this ).attr( "colspan" ) || 1 )
-							.appendTo( element );
-						});
-						} else if ( nodeName === "img" ) {
-						element.attr( "src", that.currentItem.attr( "src" ) );
-					}
-					
-					if ( !className ) {
-						element.css( "visibility", "hidden" );
-					}
-					
-					return element;
-				},
-				update: function(container, p) {
-					
-					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
-					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
-					if(className && !o.forcePlaceholderSize) {
-						return;
-					}
-					
-					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
-					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
-					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
-				}
-			};
-		}
-		
-		//Create the placeholder
-		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
-		
-		//Append it after the actual current item
-		that.currentItem.after(that.placeholder);
-		
-		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
-		o.placeholder.update(that, that.placeholder);
-		
-	},
-	
-	_contactContainers: function(event) {
-		var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating,
-		innermostContainer = null,
-		innermostIndex = null;
-		
-		// get innermost container that intersects with item
-		for (i = this.containers.length - 1; i >= 0; i--) {
-			
-			// never consider a container that's located within the item itself
-			if($.contains(this.currentItem[0], this.containers[i].element[0])) {
-				continue;
-			}
-			
-			if(this._intersectsWith(this.containers[i].containerCache)) {
-				
-				// if we've already found a container and it's more "inner" than this, then continue
-				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
-					continue;
-				}
-				
-				innermostContainer = this.containers[i];
-				innermostIndex = i;
-				
-				} else {
-				// container doesn't intersect. trigger "out" event if necessary
-				if(this.containers[i].containerCache.over) {
-					this.containers[i]._trigger("out", event, this._uiHash(this));
-					this.containers[i].containerCache.over = 0;
-				}
-			}
-			
-		}
-		
-		// if no intersecting containers found, return
-		if(!innermostContainer) {
-			return;
-		}
-		
-		// move the item into the container if it's not there already
-		if(this.containers.length === 1) {
-			if (!this.containers[innermostIndex].containerCache.over) {
-				this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
-				this.containers[innermostIndex].containerCache.over = 1;
-			}
-			} else {
-			
-			//When entering a new container, we will find the item with the least distance and append our item near it
-			dist = 10000;
-			itemWithLeastDistance = null;
-			floating = innermostContainer.floating || isFloating(this.currentItem);
-			posProperty = floating ? "left" : "top";
-			sizeProperty = floating ? "width" : "height";
-			base = this.positionAbs[posProperty] + this.offset.click[posProperty];
-			for (j = this.items.length - 1; j >= 0; j--) {
-				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
-					continue;
-				}
-				if(this.items[j].item[0] === this.currentItem[0]) {
-					continue;
-				}
-				if (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) {
-					continue;
-				}
-				cur = this.items[j].item.offset()[posProperty];
-				nearBottom = false;
-				if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
-					nearBottom = true;
-					cur += this.items[j][sizeProperty];
-				}
-				
-				if(Math.abs(cur - base) < dist) {
-					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
-					this.direction = nearBottom ? "up": "down";
-				}
-			}
-			
-			//Check if dropOnEmpty is enabled
-			if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
-				return;
-			}
-			
-			if(this.currentContainer === this.containers[innermostIndex]) {
-				return;
-			}
-			
-			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
-			this._trigger("change", event, this._uiHash());
-			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
-			this.currentContainer = this.containers[innermostIndex];
-			
-			//Update the placeholder
-			this.options.placeholder.update(this.currentContainer, this.placeholder);
-			
-			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
-			this.containers[innermostIndex].containerCache.over = 1;
-		}
-		
-		
-	},
-	
-	_createHelper: function(event) {
-		
-		var o = this.options,
-		helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
-		
-		//Add the helper to the DOM if that didn't happen already
-		if(!helper.parents("body").length) {
-			$(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
-		}
-		
-		if(helper[0] === this.currentItem[0]) {
-			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
-		}
-		
-		if(!helper[0].style.width || o.forceHelperSize) {
-			helper.width(this.currentItem.width());
-		}
-		if(!helper[0].style.height || o.forceHelperSize) {
-			helper.height(this.currentItem.height());
-		}
-		
-		return helper;
-		
-	},
-	
-	_adjustOffsetFromHelper: function(obj) {
-		if (typeof obj === "string") {
-			obj = obj.split(" ");
-		}
-		if ($.isArray(obj)) {
-			obj = {left: +obj[0], top: +obj[1] || 0};
-		}
-		if ("left" in obj) {
-			this.offset.click.left = obj.left + this.margins.left;
-		}
-		if ("right" in obj) {
-			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
-		}
-		if ("top" in obj) {
-			this.offset.click.top = obj.top + this.margins.top;
-		}
-		if ("bottom" in obj) {
-			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
-		}
-	},
-	
-	_getParentOffset: function() {
-		
-		
-		//Get the offsetParent and cache its position
-		this.offsetParent = this.helper.offsetParent();
-		var po = this.offsetParent.offset();
-		
-		// This is a special case where we need to modify a offset calculated on start, since the following happened:
-		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
-		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
-		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-		if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
-			po.left += this.scrollParent.scrollLeft();
-			po.top += this.scrollParent.scrollTop();
-		}
-		
-		// This needs to be actually done for all browsers, since pageX/pageY includes this information
-		// with an ugly IE fix
-		if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
-			po = { top: 0, left: 0 };
-		}
-		
-		return {
-			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
-			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
-		};
-		
-	},
-	
-	_getRelativeOffset: function() {
-		
-		if(this.cssPosition === "relative") {
-			var p = this.currentItem.position();
-			return {
-				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
-				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
-			};
-			} else {
-			return { top: 0, left: 0 };
-		}
-		
-	},
-	
-	_cacheMargins: function() {
-		this.margins = {
-			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
-			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
-		};
-	},
-	
-	_cacheHelperProportions: function() {
-		this.helperProportions = {
-			width: this.helper.outerWidth(),
-			height: this.helper.outerHeight()
-		};
-	},
-	
-	_setContainment: function() {
-		
-		var ce, co, over,
-		o = this.options;
-		if(o.containment === "parent") {
-			o.containment = this.helper[0].parentNode;
-		}
-		if(o.containment === "document" || o.containment === "window") {
-			this.containment = [
-			0 - this.offset.relative.left - this.offset.parent.left,
-			0 - this.offset.relative.top - this.offset.parent.top,
-			$(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left,
-			($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
-			];
-		}
-		
-		if(!(/^(document|window|parent)$/).test(o.containment)) {
-			ce = $(o.containment)[0];
-			co = $(o.containment).offset();
-			over = ($(ce).css("overflow") !== "hidden");
-			
-			this.containment = [
-			co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
-			co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
-			co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
-			co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
-			];
-		}
-		
-	},
-	
-	_convertPositionTo: function(d, pos) {
-		
-		if(!pos) {
-			pos = this.position;
-		}
-		var mod = d === "absolute" ? 1 : -1,
-		scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
-		scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-		
-		return {
-			top: (
-			pos.top	+																// The absolute mouse position
-			this.offset.relative.top * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
-			this.offset.parent.top * mod -											// The offsetParent's offset without borders (offset + border)
-			( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
-			),
-			left: (
-			pos.left +																// The absolute mouse position
-			this.offset.relative.left * mod +										// Only for relative positioned nodes: Relative offset from element to offset parent
-			this.offset.parent.left * mod	-										// The offsetParent's offset without borders (offset + border)
-			( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
-			)
-		};
-		
-	},
-	
-	_generatePosition: function(event) {
-		
-		var top, left,
-		o = this.options,
-		pageX = event.pageX,
-		pageY = event.pageY,
-		scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-		
-		// This is another very weird special case that only happens for relative elements:
-		// 1. If the css position is relative
-		// 2. and the scroll parent is the document or similar to the offset parent
-		// we have to refresh the relative offset during the scroll so there are no jumps
-		if(this.cssPosition === "relative" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {
-			this.offset.relative = this._getRelativeOffset();
-		}
-		
-		/*
-		* - Position constraining -
-		* Constrain the position to a mix of grid, containment.
-		*/
-		
-		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
-			
-			if(this.containment) {
-				if(event.pageX - this.offset.click.left < this.containment[0]) {
-					pageX = this.containment[0] + this.offset.click.left;
-				}
-				if(event.pageY - this.offset.click.top < this.containment[1]) {
-					pageY = this.containment[1] + this.offset.click.top;
-				}
-				if(event.pageX - this.offset.click.left > this.containment[2]) {
-					pageX = this.containment[2] + this.offset.click.left;
-				}
-				if(event.pageY - this.offset.click.top > this.containment[3]) {
-					pageY = this.containment[3] + this.offset.click.top;
-				}
-			}
-			
-			if(o.grid) {
-				top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
-				pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-				
-				left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
-				pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
-			}
-			
-		}
-		
-		return {
-			top: (
-			pageY -																// The absolute mouse position
-			this.offset.click.top -													// Click offset (relative to the element)
-			this.offset.relative.top	-											// Only for relative positioned nodes: Relative offset from element to offset parent
-			this.offset.parent.top +												// The offsetParent's offset without borders (offset + border)
-			( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
-			),
-			left: (
-			pageX -																// The absolute mouse position
-			this.offset.click.left -												// Click offset (relative to the element)
-			this.offset.relative.left	-											// Only for relative positioned nodes: Relative offset from element to offset parent
-			this.offset.parent.left +												// The offsetParent's offset without borders (offset + border)
-			( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
-			)
-		};
-		
-	},
-	
-	_rearrange: function(event, i, a, hardRefresh) {
-		
-		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
-		
-		//Various things done here to improve the performance:
-		// 1. we create a setTimeout, that calls refreshPositions
-		// 2. on the instance, we have a counter variable, that get's higher after every append
-		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
-		// 4. this lets only the last addition to the timeout stack through
-		this.counter = this.counter ? ++this.counter : 1;
-		var counter = this.counter;
-		
-		this._delay(function() {
-			if(counter === this.counter) {
-				this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
-			}
-		});
-		
-	},
-	
-	_clear: function(event, noPropagation) {
-		
-		this.reverting = false;
-		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
-		// everything else normalized again
-		var i,
-		delayedTriggers = [];
-		
-		// We first have to update the dom position of the actual currentItem
-		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
-		if(!this._noFinalSort && this.currentItem.parent().length) {
-			this.placeholder.before(this.currentItem);
-		}
-		this._noFinalSort = null;
-		
-		if(this.helper[0] === this.currentItem[0]) {
-			for(i in this._storedCSS) {
-				if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
-					this._storedCSS[i] = "";
-				}
-			}
-			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
-			} else {
-			this.currentItem.show();
-		}
-		
-		if(this.fromOutside && !noPropagation) {
-			delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
-		}
-		if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
-			delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
-		}
-		
-		// Check if the items Container has Changed and trigger appropriate
-		// events.
-		if (this !== this.currentContainer) {
-			if(!noPropagation) {
-				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
-				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
-				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
-			}
-		}
-		
-		
-		//Post events to containers
-		for (i = this.containers.length - 1; i >= 0; i--){
-			if(!noPropagation) {
-				delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
-			}
-			if(this.containers[i].containerCache.over) {
-				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
-				this.containers[i].containerCache.over = 0;
-			}
-		}
-		
-		//Do what was originally in plugins
-		if ( this.storedCursor ) {
-			this.document.find( "body" ).css( "cursor", this.storedCursor );
-			this.storedStylesheet.remove();
-		}
-		if(this._storedOpacity) {
-			this.helper.css("opacity", this._storedOpacity);
-		}
-		if(this._storedZIndex) {
-			this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
-		}
-		
-		this.dragging = false;
-		if(this.cancelHelperRemoval) {
-			if(!noPropagation) {
-				this._trigger("beforeStop", event, this._uiHash());
-				for (i=0; i < delayedTriggers.length; i++) {
-					delayedTriggers[i].call(this, event);
-				} //Trigger all delayed events
-				this._trigger("stop", event, this._uiHash());
-			}
-			
-			this.fromOutside = false;
-			return false;
-		}
-		
-		if(!noPropagation) {
-			this._trigger("beforeStop", event, this._uiHash());
-		}
-		
-		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
-		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
-		
-		if(this.helper[0] !== this.currentItem[0]) {
-			this.helper.remove();
-		}
-		this.helper = null;
-		
-		if(!noPropagation) {
-			for (i=0; i < delayedTriggers.length; i++) {
-				delayedTriggers[i].call(this, event);
-			} //Trigger all delayed events
-			this._trigger("stop", event, this._uiHash());
-		}
-		
-		this.fromOutside = false;
-		return true;
-		
-	},
-	
-	_trigger: function() {
-		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
-			this.cancel();
-		}
-	},
-	
-	_uiHash: function(_inst) {
-		var inst = _inst || this;
-		return {
-			helper: inst.helper,
-			placeholder: inst.placeholder || $([]),
-			position: inst.position,
-			originalPosition: inst.originalPosition,
-			offset: inst.positionAbs,
-			item: inst.currentItem,
-			sender: _inst ? _inst.element : null
-		};
-	}
-	
-});
-
-})(jQuery);
-(function( $, undefined ) {
-
-var lastActive, startXPos, startYPos, clickDragged,
-baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
-stateClasses = "ui-state-hover ui-state-active ",
-typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
-formResetHandler = function() {
-	var form = $( this );
-	setTimeout(function() {
-		form.find( ":ui-button" ).button( "refresh" );
-	}, 1 );
-},
-radioGroup = function( radio ) {
-	var name = radio.name,
-	form = radio.form,
-	radios = $( [] );
-	if ( name ) {
-		name = name.replace( /'/g, "\\'" );
-		if ( form ) {
-			radios = $( form ).find( "[name='" + name + "']" );
-			} else {
-			radios = $( "[name='" + name + "']", radio.ownerDocument )
-			.filter(function() {
-				return !this.form;
-			});
-		}
-	}
-	return radios;
-};
-
-$.widget( "ui.button", {
-	version: "1.10.3",
-	defaultElement: "<button>",
-	options: {
-		disabled: null,
-		text: true,
-		label: null,
-		icons: {
-			primary: null,
-			secondary: null
-		}
-	},
-	_create: function() {
-		this.element.closest( "form" )
-		.unbind( "reset" + this.eventNamespace )
-		.bind( "reset" + this.eventNamespace, formResetHandler );
-		
-		if ( typeof this.options.disabled !== "boolean" ) {
-			this.options.disabled = !!this.element.prop( "disabled" );
-			} else {
-			this.element.prop( "disabled", this.options.disabled );
-		}
-		
-		this._determineButtonType();
-		this.hasTitle = !!this.buttonElement.attr( "title" );
-		
-		var that = this,
-		options = this.options,
-		toggleButton = this.type === "checkbox" || this.type === "radio",
-		activeClass = !toggleButton ? "ui-state-active" : "",
-		focusClass = "ui-state-focus";
-		
-		if ( options.label === null ) {
-			options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
-		}
-		
-		this._hoverable( this.buttonElement );
-		
-		this.buttonElement
-		.addClass( baseClasses )
-		.attr( "role", "button" )
-		.bind( "mouseenter" + this.eventNamespace, function() {
-			if ( options.disabled ) {
-				return;
-			}
-			if ( this === lastActive ) {
-				$( this ).addClass( "ui-state-active" );
-			}
-		})
-		.bind( "mouseleave" + this.eventNamespace, function() {
-			if ( options.disabled ) {
-				return;
-			}
-			$( this ).removeClass( activeClass );
-		})
-		.bind( "click" + this.eventNamespace, function( event ) {
-			if ( options.disabled ) {
-				event.preventDefault();
-				event.stopImmediatePropagation();
-			}
-		});
-		
-		this.element
-		.bind( "focus" + this.eventNamespace, function() {
-			// no need to check disabled, focus won't be triggered anyway
-			that.buttonElement.addClass( focusClass );
-		})
-		.bind( "blur" + this.eventNamespace, function() {
-			that.buttonElement.removeClass( focusClass );
-		});
-		
-		if ( toggleButton ) {
-			this.element.bind( "change" + this.eventNamespace, function() {
-				if ( clickDragged ) {
-					return;
-				}
-				that.refresh();
-			});
-			// if mouse moves between mousedown and mouseup (drag) set clickDragged flag
-			// prevents issue where button state changes but checkbox/radio checked state
-			// does not in Firefox (see ticket #6970)
-			this.buttonElement
-			.bind( "mousedown" + this.eventNamespace, function( event ) {
-				if ( options.disabled ) {
-					return;
-				}
-				clickDragged = false;
-				startXPos = event.pageX;
-				startYPos = event.pageY;
-			})
-			.bind( "mouseup" + this.eventNamespace, function( event ) {
-				if ( options.disabled ) {
-					return;
-				}
-				if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
-					clickDragged = true;
-				}
-			});
-		}
-		
-		if ( this.type === "checkbox" ) {
-			this.buttonElement.bind( "click" + this.eventNamespace, function() {
-				if ( options.disabled || clickDragged ) {
-					return false;
-				}
-			});
-			} else if ( this.type === "radio" ) {
-			this.buttonElement.bind( "click" + this.eventNamespace, function() {
-				if ( options.disabled || clickDragged ) {
-					return false;
-				}
-				$( this ).addClass( "ui-state-active" );
-				that.buttonElement.attr( "aria-pressed", "true" );
-				
-				var radio = that.element[ 0 ];
-				radioGroup( radio )
-				.not( radio )
-				.map(function() {
-					return $( this ).button( "widget" )[ 0 ];
-				})
-				.removeClass( "ui-state-active" )
-				.attr( "aria-pressed", "false" );
-			});
-			} else {
-			this.buttonElement
-			.bind( "mousedown" + this.eventNamespace, function() {
-				if ( options.disabled ) {
-					return false;
-				}
-				$( this ).addClass( "ui-state-active" );
-				lastActive = this;
-				that.document.one( "mouseup", function() {
-					lastActive = null;
-				});
-			})
-			.bind( "mouseup" + this.eventNamespace, function() {
-				if ( options.disabled ) {
-					return false;
-				}
-				$( this ).removeClass( "ui-state-active" );
-			})
-			.bind( "keydown" + this.eventNamespace, function(event) {
-				if ( options.disabled ) {
-					return false;
-				}
-				if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
-					$( this ).addClass( "ui-state-active" );
-				}
-			})
-			// see #8559, we bind to blur here in case the button element loses
-			// focus between keydown and keyup, it would be left in an "active" state
-			.bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
-				$( this ).removeClass( "ui-state-active" );
-			});
-			
-			if ( this.buttonElement.is("a") ) {
-				this.buttonElement.keyup(function(event) {
-					if ( event.keyCode === $.ui.keyCode.SPACE ) {
-						// TODO pass through original event correctly (just as 2nd argument doesn't work)
-						$( this ).click();
-					}
-				});
-			}
-		}
-		
-		// TODO: pull out $.Widget's handling for the disabled option into
-		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
-		// be overridden by individual plugins
-		this._setOption( "disabled", options.disabled );
-		this._resetButton();
-	},
-	
-	_determineButtonType: function() {
-		var ancestor, labelSelector, checked;
-		
-		if ( this.element.is("[type=checkbox]") ) {
-			this.type = "checkbox";
-			} else if ( this.element.is("[type=radio]") ) {
-			this.type = "radio";
-			} else if ( this.element.is("input") ) {
-			this.type = "input";
-			} else {
-			this.type = "button";
-		}
-		
-		if ( this.type === "checkbox" || this.type === "radio" ) {
-			// we don't search against the document in case the element
-			// is disconnected from the DOM
-			ancestor = this.element.parents().last();
-			labelSelector = "label[for='" + this.element.attr("id") + "']";
-			this.buttonElement = ancestor.find( labelSelector );
-			if ( !this.buttonElement.length ) {
-				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
-				this.buttonElement = ancestor.filter( labelSelector );
-				if ( !this.buttonElement.length ) {
-					this.buttonElement = ancestor.find( labelSelector );
-				}
-			}
-			this.element.addClass( "ui-helper-hidden-accessible" );
-			
-			checked = this.element.is( ":checked" );
-			if ( checked ) {
-				this.buttonElement.addClass( "ui-state-active" );
-			}
-			this.buttonElement.prop( "aria-pressed", checked );
-			} else {
-			this.buttonElement = this.element;
-		}
-	},
-	
-	widget: function() {
-		return this.buttonElement;
-	},
-	
-	_destroy: function() {
-		this.element
-		.removeClass( "ui-helper-hidden-accessible" );
-		this.buttonElement
-		.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
-		.removeAttr( "role" )
-		.removeAttr( "aria-pressed" )
-		.html( this.buttonElement.find(".ui-button-text").html() );
-		
-		if ( !this.hasTitle ) {
-			this.buttonElement.removeAttr( "title" );
-		}
-	},
-	
-	_setOption: function( key, value ) {
-		this._super( key, value );
-		if ( key === "disabled" ) {
-			if ( value ) {
-				this.element.prop( "disabled", true );
-				} else {
-				this.element.prop( "disabled", false );
-			}
-			return;
-		}
-		this._resetButton();
-	},
-	
-	refresh: function() {
-		//See #8237 & #8828
-		var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
-		
-		if ( isDisabled !== this.options.disabled ) {
-			this._setOption( "disabled", isDisabled );
-		}
-		if ( this.type === "radio" ) {
-			radioGroup( this.element[0] ).each(function() {
-				if ( $( this ).is( ":checked" ) ) {
-					$( this ).button( "widget" )
-					.addClass( "ui-state-active" )
-					.attr( "aria-pressed", "true" );
-					} else {
-					$( this ).button( "widget" )
-					.removeClass( "ui-state-active" )
-					.attr( "aria-pressed", "false" );
-				}
-			});
-			} else if ( this.type === "checkbox" ) {
-			if ( this.element.is( ":checked" ) ) {
-				this.buttonElement
-				.addClass( "ui-state-active" )
-				.attr( "aria-pressed", "true" );
-				} else {
-				this.buttonElement
-				.removeClass( "ui-state-active" )
-				.attr( "aria-pressed", "false" );
-			}
-		}
-	},
-	
-	_resetButton: function() {
-		if ( this.type === "input" ) {
-			if ( this.options.label ) {
-				this.element.val( this.options.label );
-			}
-			return;
-		}
-		var buttonElement = this.buttonElement.removeClass( typeClasses ),
-		buttonText = $( "<span></span>", this.document[0] )
-		.addClass( "ui-button-text" )
-		.html( this.options.label )
-		.appendTo( buttonElement.empty() )
-		.text(),
-		icons = this.options.icons,
-		multipleIcons = icons.primary && icons.secondary,
-		buttonClasses = [];
-		
-		if ( icons.primary || icons.secondary ) {
-			if ( this.options.text ) {
-				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
-			}
-			
-			if ( icons.primary ) {
-				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
-			}
-			
-			if ( icons.secondary ) {
-				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
-			}
-			
-			if ( !this.options.text ) {
-				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
-				
-				if ( !this.hasTitle ) {
-					buttonElement.attr( "title", $.trim( buttonText ) );
-				}
-			}
-			} else {
-			buttonClasses.push( "ui-button-text-only" );
-		}
-		buttonElement.addClass( buttonClasses.join( " " ) );
-	}
-});
-
-$.widget( "ui.buttonset", {
-	version: "1.10.3",
-	options: {
-		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
-	},
-	
-	_create: function() {
-		this.element.addClass( "ui-buttonset" );
-	},
-	
-	_init: function() {
-		this.refresh();
-	},
-	
-	_setOption: function( key, value ) {
-		if ( key === "disabled" ) {
-			this.buttons.button( "option", key, value );
-		}
-		
-		this._super( key, value );
-	},
-	
-	refresh: function() {
-		var rtl = this.element.css( "direction" ) === "rtl";
-		
-		this.buttons = this.element.find( this.options.items )
-		.filter( ":ui-button" )
-		.button( "refresh" )
-		.end()
-		.not( ":ui-button" )
-		.button()
-		.end()
-		.map(function() {
-			return $( this ).button( "widget" )[ 0 ];
-		})
-		.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
-		.filter( ":first" )
-		.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
-		.end()
-		.filter( ":last" )
-		.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
-		.end()
-		.end();
-	},
-	
-	_destroy: function() {
-		this.element.removeClass( "ui-buttonset" );
-		this.buttons
-		.map(function() {
-			return $( this ).button( "widget" )[ 0 ];
-		})
-		.removeClass( "ui-corner-left ui-corner-right" )
-		.end()
-		.button( "destroy" );
-	}
-});
-
-}( jQuery ) );
-(function( $, undefined ) {
-
-var sizeRelatedOptions = {
-	buttons: true,
-	height: true,
-	maxHeight: true,
-	maxWidth: true,
-	minHeight: true,
-	minWidth: true,
-	width: true
-},
-resizableRelatedOptions = {
-	maxHeight: true,
-	maxWidth: true,
-	minHeight: true,
-	minWidth: true
-};
-
-$.widget( "ui.dialog", {
-	version: "1.10.3",
-	options: {
-		appendTo: "body",
-		autoOpen: true,
-		buttons: [],
-		closeOnEscape: true,
-		closeText: "close",
-		dialogClass: "",
-		draggable: true,
-		hide: null,
-		height: "auto",
-		maxHeight: null,
-		maxWidth: null,
-		minHeight: 150,
-		minWidth: 150,
-		modal: false,
-		position: {
-			my: "center",
-			at: "center",
-			of: window,
-			collision: "fit",
-			// Ensure the titlebar is always visible
-			using: function( pos ) {
-				var topOffset = $( this ).css( pos ).offset().top;
-				if ( topOffset < 0 ) {
-					$( this ).css( "top", pos.top - topOffset );
-				}
-			}
-		},
-		resizable: true,
-		show: null,
-		title: null,
-		width: 300,
-		
-		// callbacks
-		beforeClose: null,
-		close: null,
-		drag: null,
-		dragStart: null,
-		dragStop: null,
-		focus: null,
-		open: null,
-		resize: null,
-		resizeStart: null,
-		resizeStop: null
-	},
-	
-	_create: function() {
-		this.originalCss = {
-			display: this.element[0].style.display,
-			width: this.element[0].style.width,
-			minHeight: this.element[0].style.minHeight,
-			maxHeight: this.element[0].style.maxHeight,
-			height: this.element[0].style.height
-		};
-		this.originalPosition = {
-			parent: this.element.parent(),
-			index: this.element.parent().children().index( this.element )
-		};
-		this.originalTitle = this.element.attr("title");
-		this.options.title = this.options.title || this.originalTitle;
-		
-		this._createWrapper();
-		
-		this.element
-		.show()
-		.removeAttr("title")
-		.addClass("ui-dialog-content ui-widget-content")
-		.appendTo( this.uiDialog );
-		
-		this._createTitlebar();
-		this._createButtonPane();
-		
-		if ( this.options.draggable && $.fn.draggable ) {
-			this._makeDraggable();
-		}
-		if ( this.options.resizable && $.fn.resizable ) {
-			this._makeResizable();
-		}
-		
-		this._isOpen = false;
-	},
-	
-	_init: function() {
-		if ( this.options.autoOpen ) {
-			this.open();
-		}
-	},
-	
-	_appendTo: function() {
-		var element = this.options.appendTo;
-		if ( element && (element.jquery || element.nodeType) ) {
-			return $( element );
-		}
-		return this.document.find( element || "body" ).eq( 0 );
-	},
-	
-	_destroy: function() {
-		var next,
-		originalPosition = this.originalPosition;
-		
-		this._destroyOverlay();
-		
-		this.element
-		.removeUniqueId()
-		.removeClass("ui-dialog-content ui-widget-content")
-		.css( this.originalCss )
-		// Without detaching first, the following becomes really slow
-		.detach();
-		
-		this.uiDialog.stop( true, true ).remove();
-		
-		if ( this.originalTitle ) {
-			this.element.attr( "title", this.originalTitle );
-		}
-		
-		next = originalPosition.parent.children().eq( originalPosition.index );
-		// Don't try to place the dialog next to itself (#8613)
-		if ( next.length && next[0] !== this.element[0] ) {
-			next.before( this.element );
-			} else {
-			originalPosition.parent.append( this.element );
-		}
-	},
-	
-	widget: function() {
-		return this.uiDialog;
-	},
-	
-	disable: $.noop,
-	enable: $.noop,
-	
-	close: function( event ) {
-		var that = this;
-		
-		if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
-			return;
-		}
-		
-		this._isOpen = false;
-		this._destroyOverlay();
-		
-		if ( !this.opener.filter(":focusable").focus().length ) {
-			// Hiding a focused element doesn't trigger blur in WebKit
-			// so in case we have nothing to focus on, explicitly blur the active element
-			// https://bugs.webkit.org/show_bug.cgi?id=47182
-			$( this.document[0].activeElement ).blur();
-		}
-		
-		this._hide( this.uiDialog, this.options.hide, function() {
-			that._trigger( "close", event );
-		});
-	},
-	
-	isOpen: function() {
-		return this._isOpen;
-	},
-	
-	moveToTop: function() {
-		this._moveToTop();
-	},
-	
-	_moveToTop: function( event, silent ) {
-		var moved = !!this.uiDialog.nextAll(":visible").insertBefore( this.uiDialog ).length;
-		if ( moved && !silent ) {
-			this._trigger( "focus", event );
-		}
-		return moved;
-	},
-	
-	open: function() {
-		var that = this;
-		if ( this._isOpen ) {
-			if ( this._moveToTop() ) {
-				this._focusTabbable();
-			}
-			return;
-		}
-		
-		this._isOpen = true;
-		this.opener = $( this.document[0].activeElement );
-		
-		this._size();
-		this._position();
-		this._createOverlay();
-		this._moveToTop( null, true );
-		this._show( this.uiDialog, this.options.show, function() {
-			that._focusTabbable();
-			that._trigger("focus");
-		});
-		
-		this._trigger("open");
-	},
-	
-	_focusTabbable: function() {
-		// Set focus to the first match:
-		// 1. First element inside the dialog matching [autofocus]
-		// 2. Tabbable element inside the content element
-		// 3. Tabbable element inside the buttonpane
-		// 4. The close button
-		// 5. The dialog itself
-		var hasFocus = this.element.find("[autofocus]");
-		if ( !hasFocus.length ) {
-			hasFocus = this.element.find(":tabbable");
-		}
-		if ( !hasFocus.length ) {
-			hasFocus = this.uiDialogButtonPane.find(":tabbable");
-		}
-		if ( !hasFocus.length ) {
-			hasFocus = this.uiDialogTitlebarClose.filter(":tabbable");
-		}
-		if ( !hasFocus.length ) {
-			hasFocus = this.uiDialog;
-		}
-		hasFocus.eq( 0 ).focus();
-	},
-	
-	_keepFocus: function( event ) {
-		function checkFocus() {
-			var activeElement = this.document[0].activeElement,
-			isActive = this.uiDialog[0] === activeElement ||
-			$.contains( this.uiDialog[0], activeElement );
-			if ( !isActive ) {
-				this._focusTabbable();
-			}
-		}
-		event.preventDefault();
-		checkFocus.call( this );
-		// support: IE
-		// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
-		// so we check again later
-		this._delay( checkFocus );
-	},
-	
-	_createWrapper: function() {
-		this.uiDialog = $("<div>")
-		.addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
-		this.options.dialogClass )
-		.hide()
-		.attr({
-			// Setting tabIndex makes the div focusable
-			tabIndex: -1,
-			role: "dialog"
-		})
-		.appendTo( this._appendTo() );
-		
-		this._on( this.uiDialog, {
-			keydown: function( event ) {
-				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-				event.keyCode === $.ui.keyCode.ESCAPE ) {
-					event.preventDefault();
-					this.close( event );
-					return;
-				}
-				
-				// prevent tabbing out of dialogs
-				if ( event.keyCode !== $.ui.keyCode.TAB ) {
-					return;
-				}
-				var tabbables = this.uiDialog.find(":tabbable"),
-				first = tabbables.filter(":first"),
-				last  = tabbables.filter(":last");
-				
-				if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
-					first.focus( 1 );
-					event.preventDefault();
-					} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
-					last.focus( 1 );
-					event.preventDefault();
-				}
-			},
-			mousedown: function( event ) {
-				if ( this._moveToTop( event ) ) {
-					this._focusTabbable();
-				}
-			}
-		});
-		
-		// We assume that any existing aria-describedby attribute means
-		// that the dialog content is marked up properly
-		// otherwise we brute force the content as the description
-		if ( !this.element.find("[aria-describedby]").length ) {
-			this.uiDialog.attr({
-				"aria-describedby": this.element.uniqueId().attr("id")
-			});
-		}
-	},
-	
-	_createTitlebar: function() {
-		var uiDialogTitle;
-		
-		this.uiDialogTitlebar = $("<div>")
-		.addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix")
-		.prependTo( this.uiDialog );
-		this._on( this.uiDialogTitlebar, {
-			mousedown: function( event ) {
-				// Don't prevent click on close button (#8838)
-				// Focusing a dialog that is partially scrolled out of view
-				// causes the browser to scroll it into view, preventing the click event
-				if ( !$( event.target ).closest(".ui-dialog-titlebar-close") ) {
-					// Dialog isn't getting focus when dragging (#8063)
-					this.uiDialog.focus();
-				}
-			}
-		});
-		
-		this.uiDialogTitlebarClose = $("<button></button>")
-		.button({
-			label: this.options.closeText,
-			icons: {
-				primary: "ui-icon-closethick"
-			},
-			text: false
-		})
-		.addClass("ui-dialog-titlebar-close")
-		.appendTo( this.uiDialogTitlebar );
-		this._on( this.uiDialogTitlebarClose, {
-			click: function( event ) {
-				event.preventDefault();
-				this.close( event );
-			}
-		});
-		
-		uiDialogTitle = $("<span>")
-		.uniqueId()
-		.addClass("ui-dialog-title")
-		.prependTo( this.uiDialogTitlebar );
-		this._title( uiDialogTitle );
-		
-		this.uiDialog.attr({
-			"aria-labelledby": uiDialogTitle.attr("id")
-		});
-	},
-	
-	_title: function( title ) {
-		if ( !this.options.title ) {
-			title.html("&#160;");
-		}
-		title.text( this.options.title );
-	},
-	
-	_createButtonPane: function() {
-		this.uiDialogButtonPane = $("<div>")
-		.addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");
-		
-		this.uiButtonSet = $("<div>")
-		.addClass("ui-dialog-buttonset")
-		.appendTo( this.uiDialogButtonPane );
-		
-		this._createButtons();
-	},
-	
-	_createButtons: function() {
-		var that = this,
-		buttons = this.options.buttons;
-		
-		// if we already have a button pane, remove it
-		this.uiDialogButtonPane.remove();
-		this.uiButtonSet.empty();
-		
-		if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
-			this.uiDialog.removeClass("ui-dialog-buttons");
-			return;
-		}
-		
-		$.each( buttons, function( name, props ) {
-			var click, buttonOptions;
-			props = $.isFunction( props ) ?
-			{ click: props, text: name } :
-			props;
-			// Default to a non-submitting button
-			props = $.extend( { type: "button" }, props );
-			// Change the context for the click callback to be the main element
-			click = props.click;
-			props.click = function() {
-				click.apply( that.element[0], arguments );
-			};
-			buttonOptions = {
-				icons: props.icons,
-				text: props.showText
-			};
-			delete props.icons;
-			delete props.showText;
-			$( "<button></button>", props )
-			.button( buttonOptions )
-			.appendTo( that.uiButtonSet );
-		});
-		this.uiDialog.addClass("ui-dialog-buttons");
-		this.uiDialogButtonPane.appendTo( this.uiDialog );
-	},
-	
-	_makeDraggable: function() {
-		var that = this,
-		options = this.options;
-		
-		function filteredUi( ui ) {
-			return {
-				position: ui.position,
-				offset: ui.offset
-			};
-		}
-		
-		this.uiDialog.draggable({
-			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
-			handle: ".ui-dialog-titlebar",
-			containment: "document",
-			start: function( event, ui ) {
-				$( this ).addClass("ui-dialog-dragging");
-				that._blockFrames();
-				that._trigger( "dragStart", event, filteredUi( ui ) );
-			},
-			drag: function( event, ui ) {
-				that._trigger( "drag", event, filteredUi( ui ) );
-			},
-			stop: function( event, ui ) {
-				options.position = [
-				ui.position.left - that.document.scrollLeft(),
-				ui.position.top - that.document.scrollTop()
-				];
-				$( this ).removeClass("ui-dialog-dragging");
-				that._unblockFrames();
-				that._trigger( "dragStop", event, filteredUi( ui ) );
-			}
-		});
-	},
-	
-	_makeResizable: function() {
-		var that = this,
-		options = this.options,
-		handles = options.resizable,
-		// .ui-resizable has position: relative defined in the stylesheet
-		// but dialogs have to use absolute or fixed positioning
-		position = this.uiDialog.css("position"),
-		resizeHandles = typeof handles === "string" ?
-		handles	:
-		"n,e,s,w,se,sw,ne,nw";
-		
-		function filteredUi( ui ) {
-			return {
-				originalPosition: ui.originalPosition,
-				originalSize: ui.originalSize,
-				position: ui.position,
-				size: ui.size
-			};
-		}
-		
-		this.uiDialog.resizable({
-			cancel: ".ui-dialog-content",
-			containment: "document",
-			alsoResize: this.element,
-			maxWidth: options.maxWidth,
-			maxHeight: options.maxHeight,
-			minWidth: options.minWidth,
-			minHeight: this._minHeight(),
-			handles: resizeHandles,
-			start: function( event, ui ) {
-				$( this ).addClass("ui-dialog-resizing");
-				that._blockFrames();
-				that._trigger( "resizeStart", event, filteredUi( ui ) );
-			},
-			resize: function( event, ui ) {
-				that._trigger( "resize", event, filteredUi( ui ) );
-			},
-			stop: function( event, ui ) {
-				options.height = $( this ).height();
-				options.width = $( this ).width();
-				$( this ).removeClass("ui-dialog-resizing");
-				that._unblockFrames();
-				that._trigger( "resizeStop", event, filteredUi( ui ) );
-			}
-		})
-		.css( "position", position );
-	},
-	
-	_minHeight: function() {
-		var options = this.options;
-		
-		return options.height === "auto" ?
-		options.minHeight :
-		Math.min( options.minHeight, options.height );
-	},
-	
-	_position: function() {
-		// Need to show the dialog to get the actual offset in the position plugin
-		var isVisible = this.uiDialog.is(":visible");
-		if ( !isVisible ) {
-			this.uiDialog.show();
-		}
-		this.uiDialog.position( this.options.position );
-		if ( !isVisible ) {
-			this.uiDialog.hide();
-		}
-	},
-	
-	_setOptions: function( options ) {
-		var that = this,
-		resize = false,
-		resizableOptions = {};
-		
-		$.each( options, function( key, value ) {
-			that._setOption( key, value );
-			
-			if ( key in sizeRelatedOptions ) {
-				resize = true;
-			}
-			if ( key in resizableRelatedOptions ) {
-				resizableOptions[ key ] = value;
-			}
-		});
-		
-		if ( resize ) {
-			this._size();
-			this._position();
-		}
-		if ( this.uiDialog.is(":data(ui-resizable)") ) {
-			this.uiDialog.resizable( "option", resizableOptions );
-		}
-	},
-	
-	_setOption: function( key, value ) {
-		/*jshint maxcomplexity:15*/
-		var isDraggable, isResizable,
-		uiDialog = this.uiDialog;
-		
-		if ( key === "dialogClass" ) {
-			uiDialog
-			.removeClass( this.options.dialogClass )
-			.addClass( value );
-		}
-		
-		if ( key === "disabled" ) {
-			return;
-		}
-		
-		this._super( key, value );
-		
-		if ( key === "appendTo" ) {
-			this.uiDialog.appendTo( this._appendTo() );
-		}
-		
-		if ( key === "buttons" ) {
-			this._createButtons();
-		}
-		
-		if ( key === "closeText" ) {
-			this.uiDialogTitlebarClose.button({
-				// Ensure that we always pass a string
-				label: "" + value
-			});
-		}
-		
-		if ( key === "draggable" ) {
-			isDraggable = uiDialog.is(":data(ui-draggable)");
-			if ( isDraggable && !value ) {
-				uiDialog.draggable("destroy");
-			}
-			
-			if ( !isDraggable && value ) {
-				this._makeDraggable();
-			}
-		}
-		
-		if ( key === "position" ) {
-			this._position();
-		}
-		
-		if ( key === "resizable" ) {
-			// currently resizable, becoming non-resizable
-			isResizable = uiDialog.is(":data(ui-resizable)");
-			if ( isResizable && !value ) {
-				uiDialog.resizable("destroy");
-			}
-			
-			// currently resizable, changing handles
-			if ( isResizable && typeof value === "string" ) {
-				uiDialog.resizable( "option", "handles", value );
-			}
-			
-			// currently non-resizable, becoming resizable
-			if ( !isResizable && value !== false ) {
-				this._makeResizable();
-			}
-		}
-		
-		if ( key === "title" ) {
-			this._title( this.uiDialogTitlebar.find(".ui-dialog-title") );
-		}
-	},
-	
-	_size: function() {
-		// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
-		// divs will both have width and height set, so we need to reset them
-		var nonContentHeight, minContentHeight, maxContentHeight,
-		options = this.options;
-		
-		// Reset content sizing
-		this.element.show().css({
-			width: "auto",
-			minHeight: 0,
-			maxHeight: "none",
-			height: 0
-		});
-		
-		if ( options.minWidth > options.width ) {
-			options.width = options.minWidth;
-		}
-		
-		// reset wrapper sizing
-		// determine the height of all the non-content elements
-		nonContentHeight = this.uiDialog.css({
-			height: "auto",
-			width: options.width
-		})
-		.outerHeight();
-		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
-		maxContentHeight = typeof options.maxHeight === "number" ?
-		Math.max( 0, options.maxHeight - nonContentHeight ) :
-		"none";
-		
-		if ( options.height === "auto" ) {
-			this.element.css({
-				minHeight: minContentHeight,
-				maxHeight: maxContentHeight,
-				height: "auto"
-			});
-			} else {
-			this.element.height( Math.max( 0, options.height - nonContentHeight ) );
-		}
-		
-		if (this.uiDialog.is(":data(ui-resizable)") ) {
-			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
-		}
-	},
-	
-	_blockFrames: function() {
-		this.iframeBlocks = this.document.find( "iframe" ).map(function() {
-			var iframe = $( this );
-			
-			return $( "<div>" )
-			.css({
-				position: "absolute",
-				width: iframe.outerWidth(),
-				height: iframe.outerHeight()
-			})
-			.appendTo( iframe.parent() )
-			.offset( iframe.offset() )[0];
-		});
-	},
-	
-	_unblockFrames: function() {
-		if ( this.iframeBlocks ) {
-			this.iframeBlocks.remove();
-			delete this.iframeBlocks;
-		}
-	},
-	
-	_allowInteraction: function( event ) {
-		if ( $( event.target ).closest(".ui-dialog").length ) {
-			return true;
-		}
-		
-		// TODO: Remove hack when datepicker implements
-		// the .ui-front logic (#8989)
-		return !!$( event.target ).closest(".ui-datepicker").length;
-	},
-	
-	_createOverlay: function() {
-		if ( !this.options.modal ) {
-			return;
-		}
-		
-		var that = this,
-		widgetFullName = this.widgetFullName;
-		if ( !$.ui.dialog.overlayInstances ) {
-			// Prevent use of anchors and inputs.
-			// We use a delay in case the overlay is created from an
-			// event that we're going to be cancelling. (#2804)
-			this._delay(function() {
-				// Handle .dialog().dialog("close") (#4065)
-				if ( $.ui.dialog.overlayInstances ) {
-					this.document.bind( "focusin.dialog", function( event ) {
-						if ( !that._allowInteraction( event ) ) {
-							event.preventDefault();
-							$(".ui-dialog:visible:last .ui-dialog-content")
-							.data( widgetFullName )._focusTabbable();
-						}
-					});
-				}
-			});
-		}
-		
-		this.overlay = $("<div>")
-		.addClass("ui-widget-overlay ui-front")
-		.appendTo( this._appendTo() );
-		this._on( this.overlay, {
-			mousedown: "_keepFocus"
-		});
-		$.ui.dialog.overlayInstances++;
-	},
-	
-	_destroyOverlay: function() {
-		if ( !this.options.modal ) {
-			return;
-		}
-		
-		if ( this.overlay ) {
-			$.ui.dialog.overlayInstances--;
-			
-			if ( !$.ui.dialog.overlayInstances ) {
-				this.document.unbind( "focusin.dialog" );
-			}
-			this.overlay.remove();
-			this.overlay = null;
-		}
-	}
-});
-
-$.ui.dialog.overlayInstances = 0;
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
-	// position option with array notation
-	// just override with old implementation
-	$.widget( "ui.dialog", $.ui.dialog, {
-		_position: function() {
-			var position = this.options.position,
-			myAt = [],
-			offset = [ 0, 0 ],
-			isVisible;
-			
-			if ( position ) {
-				if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
-					myAt = position.split ? position.split(" ") : [ position[0], position[1] ];
-					if ( myAt.length === 1 ) {
-						myAt[1] = myAt[0];
-					}
-					
-					$.each( [ "left", "top" ], function( i, offsetPosition ) {
-						if ( +myAt[ i ] === myAt[ i ] ) {
-							offset[ i ] = myAt[ i ];
-							myAt[ i ] = offsetPosition;
-						}
-					});
-					
-					position = {
-						my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
-						myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
-						at: myAt.join(" ")
-					};
-				}
-				
-				position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
-				} else {
-				position = $.ui.dialog.prototype.options.position;
-			}
-			
-			// need to show the dialog to get the actual offset in the position plugin
-			isVisible = this.uiDialog.is(":visible");
-			if ( !isVisible ) {
-				this.uiDialog.show();
-			}
-			this.uiDialog.position( position );
-			if ( !isVisible ) {
-				this.uiDialog.hide();
-			}
-		}
-	});
-}
-
-}( jQuery ) );
-(function($, undefined) {
-
-var dataSpace = "ui-effects-";
-
-$.effects = {
-	effect: {}
-};
-
-/*!
-* jQuery Color Animations v2.1.2
-* https://github.com/jquery/jquery-color
-*
-* Copyright 2013 jQuery Foundation and other contributors
-* Released under the MIT license.
-* http://jquery.org/license
-*
-* Date: Wed Jan 16 08:47:09 2013 -0600
-*/
-(function( jQuery, undefined ) {
-	
-	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
-	
-	// plusequals test for += 100 -= 100
-	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
-	// a set of RE's that can match strings and generate color tuples.
-	stringParsers = [{
-		re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
-		parse: function( execResult ) {
-			return [
-			execResult[ 1 ],
-			execResult[ 2 ],
-			execResult[ 3 ],
-			execResult[ 4 ]
-			];
-		}
-		}, {
-		re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
-		parse: function( execResult ) {
-			return [
-			execResult[ 1 ] * 2.55,
-			execResult[ 2 ] * 2.55,
-			execResult[ 3 ] * 2.55,
-			execResult[ 4 ]
-			];
-		}
-		}, {
-		// this regex ignores A-F because it's compared against an already lowercased string
-		re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
-		parse: function( execResult ) {
-			return [
-			parseInt( execResult[ 1 ], 16 ),
-			parseInt( execResult[ 2 ], 16 ),
-			parseInt( execResult[ 3 ], 16 )
-			];
-		}
-		}, {
-		// this regex ignores A-F because it's compared against an already lowercased string
-		re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
-		parse: function( execResult ) {
-			return [
-			parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
-			parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
-			parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
-			];
-		}
-		}, {
-		re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
-		space: "hsla",
-		parse: function( execResult ) {
-			return [
-			execResult[ 1 ],
-			execResult[ 2 ] / 100,
-			execResult[ 3 ] / 100,
-			execResult[ 4 ]
-			];
-		}
-	}],
-	
-	// jQuery.Color( )
-	color = jQuery.Color = function( color, green, blue, alpha ) {
-		return new jQuery.Color.fn.parse( color, green, blue, alpha );
-	},
-	spaces = {
-		rgba: {
-			props: {
-				red: {
-					idx: 0,
-					type: "byte"
-				},
-				green: {
-					idx: 1,
-					type: "byte"
-				},
-				blue: {
-					idx: 2,
-					type: "byte"
-				}
-			}
-		},
-		
-		hsla: {
-			props: {
-				hue: {
-					idx: 0,
-					type: "degrees"
-				},
-				saturation: {
-					idx: 1,
-					type: "percent"
-				},
-				lightness: {
-					idx: 2,
-					type: "percent"
-				}
-			}
-		}
-	},
-	propTypes = {
-		"byte": {
-			floor: true,
-			max: 255
-		},
-		"percent": {
-			max: 1
-		},
-		"degrees": {
-			mod: 360,
-			floor: true
-		}
-	},
-	support = color.support = {},
-	
-	// element for support tests
-	supportElem = jQuery( "<p>" )[ 0 ],
-	
-	// colors = jQuery.Color.names
-	colors,
-	
-	// local aliases of functions called often
-	each = jQuery.each;
-	
-	// determine rgba support immediately
-	supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
-	support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
-	
-	// define cache name and alpha properties
-	// for rgba and hsla spaces
-	each( spaces, function( spaceName, space ) {
-		space.cache = "_" + spaceName;
-		space.props.alpha = {
-			idx: 3,
-			type: "percent",
-			def: 1
-		};
-	});
-	
-	function clamp( value, prop, allowEmpty ) {
-		var type = propTypes[ prop.type ] || {};
-		
-		if ( value == null ) {
-			return (allowEmpty || !prop.def) ? null : prop.def;
-		}
-		
-		// ~~ is an short way of doing floor for positive numbers
-		value = type.floor ? ~~value : parseFloat( value );
-		
-		// IE will pass in empty strings as value for alpha,
-		// which will hit this case
-		if ( isNaN( value ) ) {
-			return prop.def;
-		}
-		
-		if ( type.mod ) {
-			// we add mod before modding to make sure that negatives values
-			// get converted properly: -10 -> 350
-			return (value + type.mod) % type.mod;
-		}
-		
-		// for now all property types without mod have min and max
-		return 0 > value ? 0 : type.max < value ? type.max : value;
-	}
-	
-	function stringParse( string ) {
-		var inst = color(),
-		rgba = inst._rgba = [];
-		
-		string = string.toLowerCase();
-		
-		each( stringParsers, function( i, parser ) {
-			var parsed,
-			match = parser.re.exec( string ),
-			values = match && parser.parse( match ),
-			spaceName = parser.space || "rgba";
-			
-			if ( values ) {
-				parsed = inst[ spaceName ]( values );
-				
-				// if this was an rgba parse the assignment might happen twice
-				// oh well....
-				inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
-				rgba = inst._rgba = parsed._rgba;
-				
-				// exit each( stringParsers ) here because we matched
-				return false;
-			}
-		});
-		
-		// Found a stringParser that handled it
-		if ( rgba.length ) {
-			
-			// if this came from a parsed string, force "transparent" when alpha is 0
-			// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
-			if ( rgba.join() === "0,0,0,0" ) {
-				jQuery.extend( rgba, colors.transparent );
-			}
-			return inst;
-		}
-		
-		// named colors
-		return colors[ string ];
-	}
-	
-	color.fn = jQuery.extend( color.prototype, {
-		parse: function( red, green, blue, alpha ) {
-			if ( red === undefined ) {
-				this._rgba = [ null, null, null, null ];
-				return this;
-			}
-			if ( red.jquery || red.nodeType ) {
-				red = jQuery( red ).css( green );
-				green = undefined;
-			}
-			
-			var inst = this,
-			type = jQuery.type( red ),
-			rgba = this._rgba = [];
-			
-			// more than 1 argument specified - assume ( red, green, blue, alpha )
-			if ( green !== undefined ) {
-				red = [ red, green, blue, alpha ];
-				type = "array";
-			}
-			
-			if ( type === "string" ) {
-				return this.parse( stringParse( red ) || colors._default );
-			}
-			
-			if ( type === "array" ) {
-				each( spaces.rgba.props, function( key, prop ) {
-					rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
-				});
-				return this;
-			}
-			
-			if ( type === "object" ) {
-				if ( red instanceof color ) {
-					each( spaces, function( spaceName, space ) {
-						if ( red[ space.cache ] ) {
-							inst[ space.cache ] = red[ space.cache ].slice();
-						}
-					});
-					} else {
-					each( spaces, function( spaceName, space ) {
-						var cache = space.cache;
-						each( space.props, function( key, prop ) {
-							
-							// if the cache doesn't exist, and we know how to convert
-							if ( !inst[ cache ] && space.to ) {
-								
-								// if the value was null, we don't need to copy it
-								// if the key was alpha, we don't need to copy it either
-								if ( key === "alpha" || red[ key ] == null ) {
-									return;
-								}
-								inst[ cache ] = space.to( inst._rgba );
-							}
-							
-							// this is the only case where we allow nulls for ALL properties.
-							// call clamp with alwaysAllowEmpty
-							inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
-						});
-						
-						// everything defined but alpha?
-						if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
-							// use the default of 1
-							inst[ cache ][ 3 ] = 1;
-							if ( space.from ) {
-								inst._rgba = space.from( inst[ cache ] );
-							}
-						}
-					});
-				}
-				return this;
-			}
-		},
-		is: function( compare ) {
-			var is = color( compare ),
-			same = true,
-			inst = this;
-			
-			each( spaces, function( _, space ) {
-				var localCache,
-				isCache = is[ space.cache ];
-				if (isCache) {
-					localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
-					each( space.props, function( _, prop ) {
-						if ( isCache[ prop.idx ] != null ) {
-							same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
-							return same;
-						}
-					});
-				}
-				return same;
-			});
-			return same;
-		},
-		_space: function() {
-			var used = [],
-			inst = this;
-			each( spaces, function( spaceName, space ) {
-				if ( inst[ space.cache ] ) {
-					used.push( spaceName );
-				}
-			});
-			return used.pop();
-		},
-		transition: function( other, distance ) {
-			var end = color( other ),
-			spaceName = end._space(),
-			space = spaces[ spaceName ],
-			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
-			start = startColor[ space.cache ] || space.to( startColor._rgba ),
-			result = start.slice();
-			
-			end = end[ space.cache ];
-			each( space.props, function( key, prop ) {
-				var index = prop.idx,
-				startValue = start[ index ],
-				endValue = end[ index ],
-				type = propTypes[ prop.type ] || {};
-				
-				// if null, don't override start value
-				if ( endValue === null ) {
-					return;
-				}
-				// if null - use end
-				if ( startValue === null ) {
-					result[ index ] = endValue;
-					} else {
-					if ( type.mod ) {
-						if ( endValue - startValue > type.mod / 2 ) {
-							startValue += type.mod;
-							} else if ( startValue - endValue > type.mod / 2 ) {
-							startValue -= type.mod;
-						}
-					}
-					result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
-				}
-			});
-			return this[ spaceName ]( result );
-		},
-		blend: function( opaque ) {
-			// if we are already opaque - return ourself
-			if ( this._rgba[ 3 ] === 1 ) {
-				return this;
-			}
-			
-			var rgb = this._rgba.slice(),
-			a = rgb.pop(),
-			blend = color( opaque )._rgba;
-			
-			return color( jQuery.map( rgb, function( v, i ) {
-				return ( 1 - a ) * blend[ i ] + a * v;
-			}));
-		},
-		toRgbaString: function() {
-			var prefix = "rgba(",
-			rgba = jQuery.map( this._rgba, function( v, i ) {
-				return v == null ? ( i > 2 ? 1 : 0 ) : v;
-			});
-			
-			if ( rgba[ 3 ] === 1 ) {
-				rgba.pop();
-				prefix = "rgb(";
-			}
-			
-			return prefix + rgba.join() + ")";
-		},
-		toHslaString: function() {
-			var prefix = "hsla(",
-			hsla = jQuery.map( this.hsla(), function( v, i ) {
-				if ( v == null ) {
-					v = i > 2 ? 1 : 0;
-				}
-				
-				// catch 1 and 2
-				if ( i && i < 3 ) {
-					v = Math.round( v * 100 ) + "%";
-				}
-				return v;
-			});
-			
-			if ( hsla[ 3 ] === 1 ) {
-				hsla.pop();
-				prefix = "hsl(";
-			}
-			return prefix + hsla.join() + ")";
-		},
-		toHexString: function( includeAlpha ) {
-			var rgba = this._rgba.slice(),
-			alpha = rgba.pop();
-			
-			if ( includeAlpha ) {
-				rgba.push( ~~( alpha * 255 ) );
-			}
-			
-			return "#" + jQuery.map( rgba, function( v ) {
-				
-				// default to 0 when nulls exist
-				v = ( v || 0 ).toString( 16 );
-				return v.length === 1 ? "0" + v : v;
-			}).join("");
-		},
-		toString: function() {
-			return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
-		}
-	});
-	color.fn.parse.prototype = color.fn;
-	
-	// hsla conversions adapted from:
-	// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
-	
-	function hue2rgb( p, q, h ) {
-		h = ( h + 1 ) % 1;
-		if ( h * 6 < 1 ) {
-			return p + (q - p) * h * 6;
-		}
-		if ( h * 2 < 1) {
-			return q;
-		}
-		if ( h * 3 < 2 ) {
-			return p + (q - p) * ((2/3) - h) * 6;
-		}
-		return p;
-	}
-	
-	spaces.hsla.to = function ( rgba ) {
-		if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
-			return [ null, null, null, rgba[ 3 ] ];
-		}
-		var r = rgba[ 0 ] / 255,
-		g = rgba[ 1 ] / 255,
-		b = rgba[ 2 ] / 255,
-		a = rgba[ 3 ],
-		max = Math.max( r, g, b ),
-		min = Math.min( r, g, b ),
-		diff = max - min,
-		add = max + min,
-		l = add * 0.5,
-		h, s;
-		
-		if ( min === max ) {
-			h = 0;
-			} else if ( r === max ) {
-			h = ( 60 * ( g - b ) / diff ) + 360;
-			} else if ( g === max ) {
-			h = ( 60 * ( b - r ) / diff ) + 120;
-			} else {
-			h = ( 60 * ( r - g ) / diff ) + 240;
-		}
-		
-		// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
-		// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
-		if ( diff === 0 ) {
-			s = 0;
-			} else if ( l <= 0.5 ) {
-			s = diff / add;
-			} else {
-			s = diff / ( 2 - add );
-		}
-		return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
-	};
-	
-	spaces.hsla.from = function ( hsla ) {
-		if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
-			return [ null, null, null, hsla[ 3 ] ];
-		}
-		var h = hsla[ 0 ] / 360,
-		s = hsla[ 1 ],
-		l = hsla[ 2 ],
-		a = hsla[ 3 ],
-		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
-		p = 2 * l - q;
-		
-		return [
-		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
-		Math.round( hue2rgb( p, q, h ) * 255 ),
-		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
-		a
-		];
-	};
-	
-	
-	each( spaces, function( spaceName, space ) {
-		var props = space.props,
-		cache = space.cache,
-		to = space.to,
-		from = space.from;
-		
-		// makes rgba() and hsla()
-		color.fn[ spaceName ] = function( value ) {
-			
-			// generate a cache for this space if it doesn't exist
-			if ( to && !this[ cache ] ) {
-				this[ cache ] = to( this._rgba );
-			}
-			if ( value === undefined ) {
-				return this[ cache ].slice();
-			}
-			
-			var ret,
-			type = jQuery.type( value ),
-			arr = ( type === "array" || type === "object" ) ? value : arguments,
-			local = this[ cache ].slice();
-			
-			each( props, function( key, prop ) {
-				var val = arr[ type === "object" ? key : prop.idx ];
-				if ( val == null ) {
-					val = local[ prop.idx ];
-				}
-				local[ prop.idx ] = clamp( val, prop );
-			});
-			
-			if ( from ) {
-				ret = color( from( local ) );
-				ret[ cache ] = local;
-				return ret;
-				} else {
-				return color( local );
-			}
-		};
-		
-		// makes red() green() blue() alpha() hue() saturation() lightness()
-		each( props, function( key, prop ) {
-			// alpha is included in more than one space
-			if ( color.fn[ key ] ) {
-				return;
-			}
-			color.fn[ key ] = function( value ) {
-				var vtype = jQuery.type( value ),
-				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
-				local = this[ fn ](),
-				cur = local[ prop.idx ],
-				match;
-				
-				if ( vtype === "undefined" ) {
-					return cur;
-				}
-				
-				if ( vtype === "function" ) {
-					value = value.call( this, cur );
-					vtype = jQuery.type( value );
-				}
-				if ( value == null && prop.empty ) {
-					return this;
-				}
-				if ( vtype === "string" ) {
-					match = rplusequals.exec( value );
-					if ( match ) {
-						value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
-					}
-				}
-				local[ prop.idx ] = value;
-				return this[ fn ]( local );
-			};
-		});
-	});
-	
-	// add cssHook and .fx.step function for each named hook.
-	// accept a space separated string of properties
-	color.hook = function( hook ) {
-		var hooks = hook.split( " " );
-		each( hooks, function( i, hook ) {
-			jQuery.cssHooks[ hook ] = {
-				set: function( elem, value ) {
-					var parsed, curElem,
-					backgroundColor = "";
-					
-					if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
-						value = color( parsed || value );
-						if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
-							curElem = hook === "backgroundColor" ? elem.parentNode : elem;
-							while (
-							(backgroundColor === "" || backgroundColor === "transparent") &&
-							curElem && curElem.style
-							) {
-								try {
-									backgroundColor = jQuery.css( curElem, "backgroundColor" );
-									curElem = curElem.parentNode;
-									} catch ( e ) {
-								}
-							}
-							
-							value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
-							backgroundColor :
-							"_default" );
-						}
-						
-						value = value.toRgbaString();
-					}
-					try {
-						elem.style[ hook ] = value;
-						} catch( e ) {
-						// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
-					}
-				}
-			};
-			jQuery.fx.step[ hook ] = function( fx ) {
-				if ( !fx.colorInit ) {
-					fx.start = color( fx.elem, hook );
-					fx.end = color( fx.end );
-					fx.colorInit = true;
-				}
-				jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
-			};
-		});
-		
-	};
-	
-	color.hook( stepHooks );
-	
-	jQuery.cssHooks.borderColor = {
-		expand: function( value ) {
-			var expanded = {};
-			
-			each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
-				expanded[ "border" + part + "Color" ] = value;
-			});
-			return expanded;
-		}
-	};
-	
-	// Basic color names only.
-	// Usage of any of the other color names requires adding yourself or including
-	// jquery.color.svg-names.js.
-	colors = jQuery.Color.names = {
-		// 4.1. Basic color keywords
-		aqua: "#00ffff",
-		black: "#000000",
-		blue: "#0000ff",
-		fuchsia: "#ff00ff",
-		gray: "#808080",
-		green: "#008000",
-		lime: "#00ff00",
-		maroon: "#800000",
-		navy: "#000080",
-		olive: "#808000",
-		purple: "#800080",
-		red: "#ff0000",
-		silver: "#c0c0c0",
-		teal: "#008080",
-		white: "#ffffff",
-		yellow: "#ffff00",
-		
-		// 4.2.3. "transparent" color keyword
-		transparent: [ null, null, null, 0 ],
-		
-		_default: "#ffffff"
-	};
-	
-})( jQuery );
-
-
-/******************************************************************************/
-/****************************** CLASS ANIMATIONS ******************************/
-/******************************************************************************/
-(function() {
-	
-	var classAnimationActions = [ "add", "remove", "toggle" ],
-	shorthandStyles = {
-		border: 1,
-		borderBottom: 1,
-		borderColor: 1,
-		borderLeft: 1,
-		borderRight: 1,
-		borderTop: 1,
-		borderWidth: 1,
-		margin: 1,
-		padding: 1
-	};
-	
-	$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
-		$.fx.step[ prop ] = function( fx ) {
-			if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
-				jQuery.style( fx.elem, prop, fx.end );
-				fx.setAttr = true;
-			}
-		};
-	});
-	
-	function getElementStyles( elem ) {
-		var key, len,
-		style = elem.ownerDocument.defaultView ?
-		elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
-		elem.currentStyle,
-		styles = {};
-		
-		if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
-			len = style.length;
-			while ( len-- ) {
-				key = style[ len ];
-				if ( typeof style[ key ] === "string" ) {
-					styles[ $.camelCase( key ) ] = style[ key ];
-				}
-			}
-			// support: Opera, IE <9
-			} else {
-			for ( key in style ) {
-				if ( typeof style[ key ] === "string" ) {
-					styles[ key ] = style[ key ];
-				}
-			}
-		}
-		
-		return styles;
-	}
-	
-	
-	function styleDifference( oldStyle, newStyle ) {
-		var diff = {},
-		name, value;
-		
-		for ( name in newStyle ) {
-			value = newStyle[ name ];
-			if ( oldStyle[ name ] !== value ) {
-				if ( !shorthandStyles[ name ] ) {
-					if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
-						diff[ name ] = value;
-					}
-				}
-			}
-		}
-		
-		return diff;
-	}
-	
-	// support: jQuery <1.8
-	if ( !$.fn.addBack ) {
-		$.fn.addBack = function( selector ) {
-			return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter( selector )
-			);
-		};
-	}
-	
-	$.effects.animateClass = function( value, duration, easing, callback ) {
-		var o = $.speed( duration, easing, callback );
-		
-		return this.queue( function() {
-			var animated = $( this ),
-			baseClass = animated.attr( "class" ) || "",
-			applyClassChange,
-			allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
-			
-			// map the animated objects to store the original styles.
-			allAnimations = allAnimations.map(function() {
-				var el = $( this );
-				return {
-					el: el,
-					start: getElementStyles( this )
-				};
-			});
-			
-			// apply class change
-			applyClassChange = function() {
-				$.each( classAnimationActions, function(i, action) {
-					if ( value[ action ] ) {
-						animated[ action + "Class" ]( value[ action ] );
-					}
-				});
-			};
-			applyClassChange();
-			
-			// map all animated objects again - calculate new styles and diff
-			allAnimations = allAnimations.map(function() {
-				this.end = getElementStyles( this.el[ 0 ] );
-				this.diff = styleDifference( this.start, this.end );
-				return this;
-			});
-			
-			// apply original class
-			animated.attr( "class", baseClass );
-			
-			// map all animated objects again - this time collecting a promise
-			allAnimations = allAnimations.map(function() {
-				var styleInfo = this,
-				dfd = $.Deferred(),
-				opts = $.extend({}, o, {
-				queue: false,
-				complete: function() {
-					dfd.resolve( styleInfo );
-				}
-			});
-			
-			this.el.animate( this.diff, opts );
-			return dfd.promise();
-		});
-		
-		// once all animations have completed:
-		$.when.apply( $, allAnimations.get() ).done(function() {
-			
-			// set the final class
-			applyClassChange();
-			
-			// for each animated element,
-			// clear all css properties that were animated
-			$.each( arguments, function() {
-				var el = this.el;
-				$.each( this.diff, function(key) {
-					el.css( key, "" );
-				});
-			});
-			
-			// this is guarnteed to be there if you use jQuery.speed()
-			// it also handles dequeuing the next anim...
-			o.complete.call( animated[ 0 ] );
-		});
-	});
-};
-
-$.fn.extend({
-	addClass: (function( orig ) {
-		return function( classNames, speed, easing, callback ) {
-			return speed ?
-			$.effects.animateClass.call( this,
-			{ add: classNames }, speed, easing, callback ) :
-			orig.apply( this, arguments );
-		};
-	})( $.fn.addClass ),
-	
-	removeClass: (function( orig ) {
-		return function( classNames, speed, easing, callback ) {
-			return arguments.length > 1 ?
-			$.effects.animateClass.call( this,
-			{ remove: classNames }, speed, easing, callback ) :
-			orig.apply( this, arguments );
-		};
-	})( $.fn.removeClass ),
-	
-	toggleClass: (function( orig ) {
-		return function( classNames, force, speed, easing, callback ) {
-			if ( typeof force === "boolean" || force === undefined ) {
-				if ( !speed ) {
-					// without speed parameter
-					return orig.apply( this, arguments );
-					} else {
-					return $.effects.animateClass.call( this,
-					(force ? { add: classNames } : { remove: classNames }),
-					speed, easing, callback );
-				}
-				} else {
-				// without force parameter
-				return $.effects.animateClass.call( this,
-				{ toggle: classNames }, force, speed, easing );
-			}
-		};
-	})( $.fn.toggleClass ),
-	
-	switchClass: function( remove, add, speed, easing, callback) {
-		return $.effects.animateClass.call( this, {
-			add: add,
-			remove: remove
-		}, speed, easing, callback );
-	}
-});
-
-})();
-
-/******************************************************************************/
-/*********************************** EFFECTS **********************************/
-/******************************************************************************/
-
-(function() {
-
-$.extend( $.effects, {
-	version: "1.10.3",
-	
-	// Saves a set of properties in a data storage
-	save: function( element, set ) {
-		for( var i=0; i < set.length; i++ ) {
-			if ( set[ i ] !== null ) {
-				element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
-			}
-		}
-	},
-	
-	// Restores a set of previously saved properties from a data storage
-	restore: function( element, set ) {
-		var val, i;
-		for( i=0; i < set.length; i++ ) {
-			if ( set[ i ] !== null ) {
-				val = element.data( dataSpace + set[ i ] );
-				// support: jQuery 1.6.2
-				// http://bugs.jquery.com/ticket/9917
-				// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
-				// We can't differentiate between "" and 0 here, so we just assume
-				// empty string since it's likely to be a more common value...
-				if ( val === undefined ) {
-					val = "";
-				}
-				element.css( set[ i ], val );
-			}
-		}
-	},
-	
-	setMode: function( el, mode ) {
-		if (mode === "toggle") {
-			mode = el.is( ":hidden" ) ? "show" : "hide";
-		}
-		return mode;
-	},
-	
-	// Translates a [top,left] array into a baseline value
-	// this should be a little more flexible in the future to handle a string & hash
-	getBaseline: function( origin, original ) {
-		var y, x;
-		switch ( origin[ 0 ] ) {
-			case "top": y = 0; break;
-			case "middle": y = 0.5; break;
-			case "bottom": y = 1; break;
-			default: y = origin[ 0 ] / original.height;
-		}
-		switch ( origin[ 1 ] ) {
-			case "left": x = 0; break;
-			case "center": x = 0.5; break;
-			case "right": x = 1; break;
-			default: x = origin[ 1 ] / original.width;
-		}
-		return {
-			x: x,
-			y: y
-		};
-	},
-	
-	// Wraps the element around a wrapper that copies position properties
-	createWrapper: function( element ) {
-		
-		// if the element is already wrapped, return it
-		if ( element.parent().is( ".ui-effects-wrapper" )) {
-			return element.parent();
-		}
-		
-		// wrap the element
-		var props = {
-			width: element.outerWidth(true),
-			height: element.outerHeight(true),
-			"float": element.css( "float" )
-		},
-		wrapper = $( "<div></div>" )
-		.addClass( "ui-effects-wrapper" )
-		.css({
-			fontSize: "100%",
-			background: "transparent",
-			border: "none",
-			margin: 0,
-			padding: 0
-		}),
-		// Store the size in case width/height are defined in % - Fixes #5245
-		size = {
-			width: element.width(),
-			height: element.height()
-		},
-		active = document.activeElement;
-		
-		// support: Firefox
-		// Firefox incorrectly exposes anonymous content
-		// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
-		try {
-			active.id;
-			} catch( e ) {
-			active = document.body;
-		}
-		
-		element.wrap( wrapper );
-		
-		// Fixes #7595 - Elements lose focus when wrapped.
-		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-			$( active ).focus();
-		}
-		
-		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
-		
-		// transfer positioning properties to the wrapper
-		if ( element.css( "position" ) === "static" ) {
-			wrapper.css({ position: "relative" });
-			element.css({ position: "relative" });
-			} else {
-			$.extend( props, {
-				position: element.css( "position" ),
-				zIndex: element.css( "z-index" )
-			});
-			$.each([ "top", "left", "bottom", "right" ], function(i, pos) {
-				props[ pos ] = element.css( pos );
-				if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
-					props[ pos ] = "auto";
-				}
-			});
-			element.css({
-				position: "relative",
-				top: 0,
-				left: 0,
-				right: "auto",
-				bottom: "auto"
-			});
-		}
-		element.css(size);
-		
-		return wrapper.css( props ).show();
-	},
-	
-	removeWrapper: function( element ) {
-		var active = document.activeElement;
-		
-		if ( element.parent().is( ".ui-effects-wrapper" ) ) {
-			element.parent().replaceWith( element );
-			
-			// Fixes #7595 - Elements lose focus when wrapped.
-			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-				$( active ).focus();
-			}
-		}
-		
-		
-		return element;
-	},
-	
-	setTransition: function( element, list, factor, value ) {
-		value = value || {};
-		$.each( list, function( i, x ) {
-			var unit = element.cssUnit( x );
-			if ( unit[ 0 ] > 0 ) {
-				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
-			}
-		});
-		return value;
-	}
-});
-
-// return an effect options object for the given parameters:
-function _normalizeArguments( effect, options, speed, callback ) {
-	
-	// allow passing all options as the first parameter
-	if ( $.isPlainObject( effect ) ) {
-		options = effect;
-		effect = effect.effect;
-	}
-	
-	// convert to an object
-	effect = { effect: effect };
-	
-	// catch (effect, null, ...)
-	if ( options == null ) {
-		options = {};
-	}
-	
-	// catch (effect, callback)
-	if ( $.isFunction( options ) ) {
-		callback = options;
-		speed = null;
-		options = {};
-	}
-	
-	// catch (effect, speed, ?)
-	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
-		callback = speed;
-		speed = options;
-		options = {};
-	}
-	
-	// catch (effect, options, callback)
-	if ( $.isFunction( speed ) ) {
-		callback = speed;
-		speed = null;
-	}
-	
-	// add options to effect
-	if ( options ) {
-		$.extend( effect, options );
-	}
-	
-	speed = speed || options.duration;
-	effect.duration = $.fx.off ? 0 :
-	typeof speed === "number" ? speed :
-	speed in $.fx.speeds ? $.fx.speeds[ speed ] :
-	$.fx.speeds._default;
-	
-	effect.complete = callback || options.complete;
-	
-	return effect;
-}
-
-function standardAnimationOption( option ) {
-	// Valid standard speeds (nothing, number, named speed)
-	if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
-		return true;
-	}
-	
-	// Invalid strings - treat as "normal" speed
-	if ( typeof option === "string" && !$.effects.effect[ option ] ) {
-		return true;
-	}
-	
-	// Complete callback
-	if ( $.isFunction( option ) ) {
-		return true;
-	}
-	
-	// Options hash (but not naming an effect)
-	if ( typeof option === "object" && !option.effect ) {
-		return true;
-	}
-	
-	// Didn't match any standard API
-	return false;
-}
-
-$.fn.extend({
-	effect: function( /* effect, options, speed, callback */ ) {
-		var args = _normalizeArguments.apply( this, arguments ),
-		mode = args.mode,
-		queue = args.queue,
-		effectMethod = $.effects.effect[ args.effect ];
-		
-		if ( $.fx.off || !effectMethod ) {
-			// delegate to the original method (e.g., .show()) if possible
-			if ( mode ) {
-				return this[ mode ]( args.duration, args.complete );
-				} else {
-				return this.each( function() {
-					if ( args.complete ) {
-						args.complete.call( this );
-					}
-				});
-			}
-		}
-		
-		function run( next ) {
-			var elem = $( this ),
-			complete = args.complete,
-			mode = args.mode;
-			
-			function done() {
-				if ( $.isFunction( complete ) ) {
-					complete.call( elem[0] );
-				}
-				if ( $.isFunction( next ) ) {
-					next();
-				}
-			}
-			
-			// If the element already has the correct final state, delegate to
-			// the core methods so the internal tracking of "olddisplay" works.
-			if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
-				elem[ mode ]();
-				done();
-				} else {
-				effectMethod.call( elem[0], args, done );
-			}
-		}
-		
-		return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
-	},
-	
-	show: (function( orig ) {
-		return function( option ) {
-			if ( standardAnimationOption( option ) ) {
-				return orig.apply( this, arguments );
-				} else {
-				var args = _normalizeArguments.apply( this, arguments );
-				args.mode = "show";
-				return this.effect.call( this, args );
-			}
-		};
-	})( $.fn.show ),
-	
-	hide: (function( orig ) {
-		return function( option ) {
-			if ( standardAnimationOption( option ) ) {
-				return orig.apply( this, arguments );
-				} else {
-				var args = _normalizeArguments.apply( this, arguments );
-				args.mode = "hide";
-				return this.effect.call( this, args );
-			}
-		};
-	})( $.fn.hide ),
-	
-	toggle: (function( orig ) {
-		return function( option ) {
-			if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
-				return orig.apply( this, arguments );
-				} else {
-				var args = _normalizeArguments.apply( this, arguments );
-				args.mode = "toggle";
-				return this.effect.call( this, args );
-			}
-		};
-	})( $.fn.toggle ),
-	
-	// helper functions
-	cssUnit: function(key) {
-		var style = this.css( key ),
-		val = [];
-		
-		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
-			if ( style.indexOf( unit ) > 0 ) {
-				val = [ parseFloat( style ), unit ];
-			}
-		});
-		return val;
-	}
-});
-
-})();
-
-/******************************************************************************/
-/*********************************** EASING ***********************************/
-/******************************************************************************/
-
-(function() {
-
-// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
-
-var baseEasings = {};
-
-$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
-	baseEasings[ name ] = function( p ) {
-		return Math.pow( p, i + 2 );
-	};
-});
-
-$.extend( baseEasings, {
-	Sine: function ( p ) {
-		return 1 - Math.cos( p * Math.PI / 2 );
-	},
-	Circ: function ( p ) {
-		return 1 - Math.sqrt( 1 - p * p );
-	},
-	Elastic: function( p ) {
-		return p === 0 || p === 1 ? p :
-		-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
-	},
-	Back: function( p ) {
-		return p * p * ( 3 * p - 2 );
-	},
-	Bounce: function ( p ) {
-		var pow2,
-		bounce = 4;
-		
-		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
-		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
-	}
-});
-
-$.each( baseEasings, function( name, easeIn ) {
-	$.easing[ "easeIn" + name ] = easeIn;
-	$.easing[ "easeOut" + name ] = function( p ) {
-		return 1 - easeIn( 1 - p );
-	};
-	$.easing[ "easeInOut" + name ] = function( p ) {
-		return p < 0.5 ?
-		easeIn( p * 2 ) / 2 :
-		1 - easeIn( p * -2 + 2 ) / 2;
-	};
-});
-
-})();
-
-})(jQuery);
\ No newline at end of file
diff --git a/sources/WebContent/old/js/libs/jquery.contextMenu.js b/sources/WebContent/old/js/libs/jquery.contextMenu.js
deleted file mode 100644
index fa732ec..0000000
--- a/sources/WebContent/old/js/libs/jquery.contextMenu.js
+++ /dev/null
@@ -1,227 +0,0 @@
-
-// jQuery Context Menu Plugin
-//
-// Version 1.01
-//
-// Cory S.N. LaViska
-// A Beautiful Site (http://abeautifulsite.net/)
-//
-// More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/
-//
-// Terms of Use
-//
-// This plugin is dual-licensed under the GNU General Public License
-//   and the MIT License and is copyright A Beautiful Site, LLC.
-//
-if(jQuery)( function() {
-	$.extend($.fn, {
-		
-		contextMenu: function(o, callback) {
-			// Defaults
-			if( o.menu == undefined ) return false;
-			if( o.inSpeed == undefined ) o.inSpeed = 150;
-			if( o.outSpeed == undefined ) o.outSpeed = 75;
-			// 0 needs to be -1 for expected results (no fade)
-			if( o.inSpeed == 0 ) o.inSpeed = -1;
-			if( o.outSpeed == 0 ) o.outSpeed = -1;
-			// Loop each context menu
-			$(this).each( function() {
-				var el = $(this);
-				var offset = $(el).offset();
-				// Add contextMenu class
-				$('#' + o.menu).addClass('contextMenu');
-				// Simulate a true right click
-				$(this).mousedown( function(e) {
-					var evt = e;
-					evt.stopPropagation();
-					$(this).mouseup( function(e) {
-						e.stopPropagation();
-						var srcElement = $(this);
-						$(this).unbind('mouseup');
-						if( evt.button == 2 ) {
-							// Hide context menus that may be showing
-							$(".contextMenu").hide();
-							// Get this context menu
-							var menu = $('#' + o.menu);
-							
-							if( $(el).hasClass('disabled') ) return false;
-							
-							// Detect mouse position
-							var d = {}, x, y;
-							if( self.innerHeight ) {
-								d.pageYOffset = self.pageYOffset;
-								d.pageXOffset = self.pageXOffset;
-								d.innerHeight = self.innerHeight;
-								d.innerWidth = self.innerWidth;
-							} else if( document.documentElement &&
-							document.documentElement.clientHeight ) {
-								d.pageYOffset = document.documentElement.scrollTop;
-								d.pageXOffset = document.documentElement.scrollLeft;
-								d.innerHeight = document.documentElement.clientHeight;
-								d.innerWidth = document.documentElement.clientWidth;
-								} else if( document.body ) {
-								d.pageYOffset = document.body.scrollTop;
-								d.pageXOffset = document.body.scrollLeft;
-								d.innerHeight = document.body.clientHeight;
-								d.innerWidth = document.body.clientWidth;
-							}
-							(e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft;
-							(e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop;
-							
-							// Show the menu
-							$(document).unbind('click');
-							$(menu).css({ top: y, left: x }).fadeIn(o.inSpeed);
-							// Hover events
-							$(menu).find('A:not(.cont_menu_group)').mouseover( function() {
-								$(menu).find('LI.hover').removeClass('hover');
-								$(this).parent().addClass('hover');
-								}).mouseout( function() {
-								$(menu).find('LI.hover').removeClass('hover');
-							});
-							
-							// Keyboard
-							$(document).keypress( function(e) {
-								switch( e.keyCode ) {
-									case 38: // up
-									if( $(menu).find('LI.hover').size() == 0 ) {
-										$(menu).find('LI:last').addClass('hover');
-										} else {
-										$(menu).find('LI.hover').removeClass('hover').prevAll('LI:not(.disabled)').eq(0).addClass('hover');
-										if( $(menu).find('LI.hover').size() == 0 ) $(menu).find('LI:last').addClass('hover');
-									}
-									break;
-									case 40: // down
-									if( $(menu).find('LI.hover').size() == 0 ) {
-										$(menu).find('LI:first').addClass('hover');
-										} else {
-										$(menu).find('LI.hover').removeClass('hover').nextAll('LI:not(.disabled)').eq(0).addClass('hover');
-										if( $(menu).find('LI.hover').size() == 0 ) $(menu).find('LI:first').addClass('hover');
-									}
-									break;
-									case 13: // enter
-									$(menu).find('LI.hover A').trigger('click');
-									break;
-									case 27: // esc
-									$(document).trigger('click');
-									break
-								}
-							});
-							
-							// When items are selected
-							$('#' + o.menu).find('A:not(.cont_menu_group)').unbind('click');
-							$('#' + o.menu).find('LI:not(.disabled) A:not(.cont_menu_group)').click( function() {
-								$(document).unbind('click').unbind('keypress');
-								
-								if ( ! $(this).hasClass('cont_menu_group') ) {
-									$(".contextMenu").hide();
-								}
-								
-								// Callback
-								if( callback ) callback( $(this).attr('href').substr(1), $(srcElement), {x: x - offset.left, y: y - offset.top, docX: x, docY: y} );
-								return false;
-							});
-							
-							// Hide bindings
-							setTimeout( function() { // Delay for Mozilla
-								$(document).click( function(event_arg) {
-									$(document).unbind('click').unbind('keypress');
-									var clicked_group_link = false;
-									var class_list = event_arg.target.classList;
-									$.each(class_list, function(index, value) {
-										console.log(value);
-										if ( value == 'cont_menu_group'){
-											clicked_group_link = true;
-										}
-									});
-									
-									if ( clicked_group_link == false ) {
-										$(menu).fadeOut(o.outSpeed);
-									}
-									return false;
-								});
-							}, 0);
-						}
-					});
-				});
-				
-				// Disable text selection
-				if( $.browser.mozilla ) {
-					$('#' + o.menu).each( function() { $(this).css({ 'MozUserSelect' : 'none' }); });
-					} else if( $.browser.msie ) {
-					$('#' + o.menu).each( function() { $(this).bind('selectstart.disableTextSelect', function() { return false; }); });
-					} else {
-					$('#' + o.menu).each(function() { $(this).bind('mousedown.disableTextSelect', function() { return false; }); });
-				}
-				// Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome)
-				$(el).add($('UL.contextMenu')).bind('contextmenu', function() { return false; });
-				
-			});
-			return $(this);
-		},
-		
-		// Disable context menu items on the fly
-		disableContextMenuItems: function(o) {
-			if( o == undefined ) {
-				// Disable all
-				$(this).find('LI').addClass('disabled');
-				return( $(this) );
-			}
-			$(this).each( function() {
-				if( o != undefined ) {
-					var d = o.split(',');
-					for( var i = 0; i < d.length; i++ ) {
-						$(this).find('A[href="' + d[i] + '"]').parent().addClass('disabled');
-						
-					}
-				}
-			});
-			return( $(this) );
-		},
-		
-		// Enable context menu items on the fly
-		enableContextMenuItems: function(o) {
-			if( o == undefined ) {
-				// Enable all
-				$(this).find('LI.disabled').removeClass('disabled');
-				return( $(this) );
-			}
-			$(this).each( function() {
-				if( o != undefined ) {
-					var d = o.split(',');
-					for( var i = 0; i < d.length; i++ ) {
-						$(this).find('A[href="' + d[i] + '"]').parent().removeClass('disabled');
-						
-					}
-				}
-			});
-			return( $(this) );
-		},
-		
-		// Disable context menu(s)
-		disableContextMenu: function() {
-			$(this).each( function() {
-				$(this).addClass('disabled');
-			});
-			return( $(this) );
-		},
-		
-		// Enable context menu(s)
-		enableContextMenu: function() {
-			$(this).each( function() {
-				$(this).removeClass('disabled');
-			});
-			return( $(this) );
-		},
-		
-		// Destroy context menu(s)
-		destroyContextMenu: function() {
-			// Destroy specified context menus
-			$(this).each( function() {
-				// Disable action
-				$(this).unbind('mousedown').unbind('mouseup');
-			});
-			return( $(this) );
-		}
-		
-	});
-})(jQuery);
\ No newline at end of file
diff --git a/sources/WebContent/old/js/libs/jquery.jstree.js b/sources/WebContent/old/js/libs/jquery.jstree.js
deleted file mode 100644
index 6dfabc6..0000000
--- a/sources/WebContent/old/js/libs/jquery.jstree.js
+++ /dev/null
@@ -1,4565 +0,0 @@
-
-/*
-* jsTree 1.0-rc3
-* http://jstree.com/
-*
-* Copyright (c) 2010 Ivan Bozhanov (vakata.com)
-*
-* Licensed same as jquery - under the terms of either the MIT License or the GPL Version 2 License
-*   http://www.opensource.org/licenses/mit-license.php
-*   http://www.gnu.org/licenses/gpl.html
-*
-* $Date: 2011-02-09 01:17:14 +0200 (ср, 09 февр 2011) $
-* $Revision: 236 $
-*/
-
-/*jslint browser: true, onevar: true, undef: true, bitwise: true, strict: true */
-/*global window : false, clearInterval: false, clearTimeout: false, document: false, setInterval: false, setTimeout: false, jQuery: false, navigator: false, XSLTProcessor: false, DOMParser: false, XMLSerializer: false, ActiveXObject: false */
-
-"use strict";
-
-// top wrapper to prevent multiple inclusion (is this OK?)
-(function () { if(jQuery && jQuery.jstree) { return; }
-var is_ie6 = false, is_ie7 = false, is_ff2 = false;
-
-/*
-* jsTree core
-*/
-(function ($) {
-	// Common functions not related to jsTree
-	// decided to move them to a `vakata` "namespace"
-	$.vakata = {};
-	// CSS related functions
-	$.vakata.css = {
-		get_css : function(rule_name, delete_flag, sheet) {
-			rule_name = rule_name.toLowerCase();
-			var css_rules = sheet.cssRules || sheet.rules,
-			j = 0;
-			do {
-				if(css_rules.length && j > css_rules.length + 5) { return false; }
-				if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) {
-					if(delete_flag === true) {
-						if(sheet.removeRule) { sheet.removeRule(j); }
-						if(sheet.deleteRule) { sheet.deleteRule(j); }
-						return true;
-					}
-					else { return css_rules[j]; }
-				}
-			}
-			while (css_rules[++j]);
-			return false;
-		},
-		add_css : function(rule_name, sheet) {
-			if($.jstree.css.get_css(rule_name, false, sheet)) { return false; }
-			if(sheet.insertRule) { sheet.insertRule(rule_name + ' { }', 0); } else { sheet.addRule(rule_name, null, 0); }
-			return $.vakata.css.get_css(rule_name);
-		},
-		remove_css : function(rule_name, sheet) {
-			return $.vakata.css.get_css(rule_name, true, sheet);
-		},
-		add_sheet : function(opts) {
-			var tmp = false, is_new = true;
-			if(opts.str) {
-				if(opts.title) { tmp = $("style[id='" + opts.title + "-stylesheet']")[0]; }
-				if(tmp) { is_new = false; }
-				else {
-					tmp = document.createElement("style");
-					tmp.setAttribute('type',"text/css");
-					if(opts.title) { tmp.setAttribute("id", opts.title + "-stylesheet"); }
-				}
-				if(tmp.styleSheet) {
-					if(is_new) {
-						document.getElementsByTagName("head")[0].appendChild(tmp);
-						tmp.styleSheet.cssText = opts.str;
-					}
-					else {
-						tmp.styleSheet.cssText = tmp.styleSheet.cssText + " " + opts.str;
-					}
-				}
-				else {
-					tmp.appendChild(document.createTextNode(opts.str));
-					document.getElementsByTagName("head")[0].appendChild(tmp);
-				}
-				return tmp.sheet || tmp.styleSheet;
-			}
-			if(opts.url) {
-				if(document.createStyleSheet) {
-					try { tmp = document.createStyleSheet(opts.url); } catch (e) { }
-				}
-				else {
-					tmp			= document.createElement('link');
-					tmp.rel		= 'stylesheet';
-					tmp.type	= 'text/css';
-					tmp.media	= "all";
-					tmp.href	= opts.url;
-					document.getElementsByTagName("head")[0].appendChild(tmp);
-					return tmp.styleSheet;
-				}
-			}
-		}
-	};
-	
-	// private variables
-	var instances = [],			// instance array (used by $.jstree.reference/create/focused)
-	focused_instance = -1,	// the index in the instance array of the currently focused instance
-	plugins = {},			// list of included plugins
-	prepared_move = {};		// for the move_node function
-	
-	// jQuery plugin wrapper (thanks to jquery UI widget function)
-	$.fn.jstree = function (settings) {
-		var isMethodCall = (typeof settings == 'string'), // is this a method call like $().jstree("open_node")
-		args = Array.prototype.slice.call(arguments, 1),
-		returnValue = this;
-		
-		// if a method call execute the method on all selected instances
-		if(isMethodCall) {
-			if(settings.substring(0, 1) == '_') { return returnValue; }
-			this.each(function() {
-				var instance = instances[$.data(this, "jstree_instance_id")],
-				methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance;
-				if(typeof methodValue !== "undefined" && (settings.indexOf("is_") === 0 || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; }
-			});
-		}
-		else {
-			this.each(function() {
-				// extend settings and allow for multiple hashes and $.data
-				var instance_id = $.data(this, "jstree_instance_id"),
-				a = [],
-				b = settings ? $.extend({}, true, settings) : {},
-				c = $(this),
-				s = false,
-				t = [];
-				a = a.concat(args);
-				if(c.data("jstree")) { a.push(c.data("jstree")); }
-				b = a.length ? $.extend.apply(null, [true, b].concat(a)) : b;
-				
-				// if an instance already exists, destroy it first
-				if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); }
-				// push a new empty object to the instances array
-				instance_id = parseInt(instances.push({}),10) - 1;
-				// store the jstree instance id to the container element
-				$.data(this, "jstree_instance_id", instance_id);
-				// clean up all plugins
-				b.plugins = $.isArray(b.plugins) ? b.plugins : $.jstree.defaults.plugins.slice();
-				b.plugins.unshift("core");
-				// only unique plugins
-				b.plugins = b.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
-				
-				// extend defaults with passed data
-				s = $.extend(true, {}, $.jstree.defaults, b);
-				s.plugins = b.plugins;
-				$.each(plugins, function (i, val) {
-					if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; }
-					else { t.push(i); }
-				});
-				s.plugins = t;
-				
-				// push the new object to the instances array (at the same time set the default classes to the container) and init
-				instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s);
-				// init all activated plugins for this instance
-				$.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; });
-				$.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } });
-				// initialize the instance
-				setTimeout(function() { if(instances[instance_id]) { instances[instance_id].init(); } }, 0);
-			});
-		}
-		// return the jquery selection (or if it was a method call that returned a value - the returned value)
-		return returnValue;
-	};
-	// object to store exposed functions and objects
-	$.jstree = {
-		defaults : {
-			plugins : []
-		},
-		_focused : function () { return instances[focused_instance] || null; },
-		_reference : function (needle) {
-			// get by instance id
-			if(instances[needle]) { return instances[needle]; }
-			// get by DOM (if still no luck - return null
-			var o = $(needle);
-			if(!o.length && typeof needle === "string") { o = $("#" + needle); }
-			if(!o.length) { return null; }
-			return instances[o.closest(".jstree").data("jstree_instance_id")] || null;
-		},
-		_instance : function (index, container, settings) {
-			// for plugins to store data in
-			this.data = { core : {} };
-			this.get_settings	= function () { return $.extend(true, {}, settings); };
-			this._get_settings	= function () { return settings; };
-			this.get_index		= function () { return index; };
-			this.get_container	= function () { return container; };
-			this.get_container_ul = function () { return container.children("ul:eq(0)"); };
-			this._set_settings	= function (s) {
-				settings = $.extend(true, {}, settings, s);
-			};
-		},
-		_fn : { },
-		plugin : function (pname, pdata) {
-			pdata = $.extend({}, {
-			__init		: $.noop,
-			__destroy	: $.noop,
-			_fn			: {},
-			defaults	: false
-		}, pdata);
-		plugins[pname] = pdata;
-		
-		$.jstree.defaults[pname] = pdata.defaults;
-		$.each(pdata._fn, function (i, val) {
-			val.plugin		= pname;
-			val.old			= $.jstree._fn[i];
-			$.jstree._fn[i] = function () {
-				var rslt,
-				func = val,
-				args = Array.prototype.slice.call(arguments),
-				evnt = new $.Event("before.jstree"),
-				rlbk = false;
-				
-				if(this.data.core.locked === true && i !== "unlock" && i !== "is_locked") { return; }
-				
-				// Check if function belongs to the included plugins of this instance
-				do {
-					if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; }
-					func = func.old;
-				} while(func);
-				if(!func) { return; }
-				
-				// context and function to trigger events, then finally call the function
-				if(i.indexOf("_") === 0) {
-					rslt = func.apply(this, args);
-				}
-				else {
-					rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args, "plugin" : func.plugin });
-					if(rslt === false) { return; }
-					if(typeof rslt !== "undefined") { args = rslt; }
-					
-					rslt = func.apply(
-					$.extend({}, this, {
-					__callback : function (data) {
-						this.get_container().triggerHandler( i + '.jstree', { "inst" : this, "args" : args, "rslt" : data, "rlbk" : rlbk });
-					},
-					__rollback : function () {
-						rlbk = this.get_rollback();
-						return rlbk;
-					},
-					__call_old : function (replace_arguments) {
-						return func.old.apply(this, (replace_arguments ? Array.prototype.slice.call(arguments, 1) : args ) );
-					}
-				}), args);
-			}
-			
-			// return the result
-			return rslt;
-		};
-		$.jstree._fn[i].old = val.old;
-		$.jstree._fn[i].plugin = pname;
-	});
-},
-rollback : function (rb) {
-	if(rb) {
-		if(!$.isArray(rb)) { rb = [ rb ]; }
-		$.each(rb, function (i, val) {
-			instances[val.i].set_rollback(val.h, val.d);
-		});
-	}
-}
-};
-// set the prototype for all instances
-$.jstree._fn = $.jstree._instance.prototype = {};
-
-// load the css when DOM is ready
-$(function() {
-// code is copied from jQuery ($.browser is deprecated + there is a bug in IE)
-var u = navigator.userAgent.toLowerCase(),
-v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
-css_string = '' +
-'.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' +
-'.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; min-width:18px; } ' +
-'.jstree-rtl li { margin-left:0; margin-right:18px; } ' +
-'.jstree > ul > li { margin-left:0px; } ' +
-'.jstree-rtl > ul > li { margin-right:0px; } ' +
-'.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' +
-'.jstree a { display:inline-block; line-height:16px; height:16px; color:black; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' +
-'.jstree a:focus { outline: none; } ' +
-'.jstree a > ins { height:16px; width:16px; } ' +
-'.jstree a > .jstree-icon { margin-right:3px; } ' +
-'.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' +
-'li.jstree-open > ul { display:block; } ' +
-'li.jstree-closed > ul { display:none; } ';
-// Correct IE 6 (does not support the > CSS selector)
-if(/msie/.test(u) && parseInt(v, 10) == 6) {
-	is_ie6 = true;
-	
-	// fix image flicker and lack of caching
-	try {
-		document.execCommand("BackgroundImageCache", false, true);
-		} catch (err) { }
-		
-		css_string += '' +
-		'.jstree li { height:18px; margin-left:0; margin-right:0; } ' +
-		'.jstree li li { margin-left:18px; } ' +
-		'.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' +
-		'li.jstree-open ul { display:block; } ' +
-		'li.jstree-closed ul { display:none !important; } ' +
-		'.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' +
-		'.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' +
-		'.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } ';
-	}
-	// Correct IE 7 (shifts anchor nodes onhover)
-	if(/msie/.test(u) && parseInt(v, 10) == 7) {
-		is_ie7 = true;
-		css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } ';
-	}
-	// correct ff2 lack of display:inline-block
-	if(!/compatible/.test(u) && /mozilla/.test(u) && parseFloat(v, 10) < 1.9) {
-		is_ff2 = true;
-		css_string += '' +
-		'.jstree ins { display:-moz-inline-box; } ' +
-		'.jstree li { line-height:12px; } ' + // WHY??
-		'.jstree a { display:-moz-inline-box; } ' +
-		'.jstree .jstree-no-icons .jstree-checkbox { display:-moz-inline-stack !important; } ';
-		/* this shouldn't be here as it is theme specific */
-	}
-	// the default stylesheet
-	$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-});
-
-// core functions (open, close, create, update, delete)
-$.jstree.plugin("core", {
-	__init : function () {
-		this.data.core.locked = false;
-		this.data.core.to_open = this.get_settings().core.initially_open;
-		this.data.core.to_load = this.get_settings().core.initially_load;
-	},
-	defaults : {
-		html_titles	: false,
-		animation	: 500,
-		initially_open : [],
-		initially_load : [],
-		open_parents : true,
-		notify_plugins : true,
-		rtl			: false,
-		load_open	: false,
-		strings		: {
-			loading		: "Loading ...",
-			new_node	: "New node",
-			multiple_selection : "Multiple selection"
-		}
-	},
-	_fn : {
-		init	: function () {
-			this.set_focus();
-			if(this._get_settings().core.rtl) {
-				this.get_container().addClass("jstree-rtl").css("direction", "rtl");
-			}
-			this.get_container().html("<ul><li class='jstree-last jstree-leaf'><ins>&#160;</ins><a class='jstree-loading' href='#'><ins class='jstree-icon'>&#160;</ins>" + this._get_string("loading") + "</a></li></ul>");
-			this.data.core.li_height = this.get_container_ul().find("li.jstree-closed, li.jstree-leaf").eq(0).height() || 18;
-			
-			this.get_container()
-			.delegate("li > ins", "click.jstree", $.proxy(function (event) {
-				var trgt = $(event.target);
-				// if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); }
-				this.toggle_node(trgt);
-			}, this))
-			.bind("mousedown.jstree", $.proxy(function () {
-				this.set_focus(); // This used to be setTimeout(set_focus,0) - why?
-			}, this))
-			.bind("dblclick.jstree", function (event) {
-				var sel;
-				if(document.selection && document.selection.empty) { document.selection.empty(); }
-				else {
-					if(window.getSelection) {
-						sel = window.getSelection();
-						try {
-							sel.removeAllRanges();
-							sel.collapse();
-							} catch (err) { }
-						}
-					}
-				});
-				if(this._get_settings().core.notify_plugins) {
-					this.get_container()
-					.bind("load_node.jstree", $.proxy(function (e, data) {
-						var o = this._get_node(data.rslt.obj),
-						t = this;
-						if(o === -1) { o = this.get_container_ul(); }
-						if(!o.length) { return; }
-						o.find("li").each(function () {
-							var th = $(this);
-							if(th.data("jstree")) {
-								$.each(th.data("jstree"), function (plugin, values) {
-									if(t.data[plugin] && $.isFunction(t["_" + plugin + "_notify"])) {
-										t["_" + plugin + "_notify"].call(t, th, values);
-									}
-								});
-							}
-						});
-					}, this));
-				}
-				if(this._get_settings().core.load_open) {
-					this.get_container()
-					.bind("load_node.jstree", $.proxy(function (e, data) {
-						var o = this._get_node(data.rslt.obj),
-						t = this;
-						if(o === -1) { o = this.get_container_ul(); }
-						if(!o.length) { return; }
-						o.find("li.jstree-open:not(:has(ul))").each(function () {
-							t.load_node(this, $.noop, $.noop);
-						});
-					}, this));
-				}
-				this.__callback();
-				this.load_node(-1, function () { this.loaded(); this.reload_nodes(); });
-			},
-			destroy	: function () {
-				var i,
-				n = this.get_index(),
-				s = this._get_settings(),
-				_this = this;
-				
-				$.each(s.plugins, function (i, val) {
-					try { plugins[val].__destroy.apply(_this); } catch(err) { }
-				});
-				this.__callback();
-				// set focus to another instance if this one is focused
-				if(this.is_focused()) {
-					for(i in instances) {
-						if(instances.hasOwnProperty(i) && i != n) {
-							instances[i].set_focus();
-							break;
-						}
-					}
-				}
-				// if no other instance found
-				if(n === focused_instance) { focused_instance = -1; }
-				// remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events
-				this.get_container()
-				.unbind(".jstree")
-				.undelegate(".jstree")
-				.removeData("jstree_instance_id")
-				.find("[class^='jstree']")
-				.addBack()
-				.attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });
-				$(document)
-				.unbind(".jstree-" + n)
-				.undelegate(".jstree-" + n);
-				// remove the actual data
-				instances[n] = null;
-				delete instances[n];
-			},
-			
-			_core_notify : function (n, data) {
-				if(data.opened) {
-					this.open_node(n, false, true);
-				}
-			},
-			
-			lock : function () {
-				this.data.core.locked = true;
-				this.get_container().children("ul").addClass("jstree-locked").css("opacity","0.7");
-				this.__callback({});
-			},
-			unlock : function () {
-				this.data.core.locked = false;
-				this.get_container().children("ul").removeClass("jstree-locked").css("opacity","1");
-				this.__callback({});
-			},
-			is_locked : function () { return this.data.core.locked; },
-			save_opened : function () {
-				var _this = this;
-				this.data.core.to_open = [];
-				this.get_container_ul().find("li.jstree-open").each(function () {
-					if(this.id) { _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); }
-				});
-				this.__callback(_this.data.core.to_open);
-			},
-			save_loaded : function () { },
-			reload_nodes : function (is_callback) {
-				var _this = this,
-				done = true,
-				current = [],
-				remaining = [];
-				if(!is_callback) {
-					this.data.core.reopen = false;
-					this.data.core.refreshing = true;
-					this.data.core.to_open = $.map($.makeArray(this.data.core.to_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
-					this.data.core.to_load = $.map($.makeArray(this.data.core.to_load), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
-					if(this.data.core.to_open.length) {
-						this.data.core.to_load = this.data.core.to_load.concat(this.data.core.to_open);
-					}
-				}
-				if(this.data.core.to_load.length) {
-					$.each(this.data.core.to_load, function (i, val) {
-						if(val == "#") { return true; }
-						if($(val).length) { current.push(val); }
-						else { remaining.push(val); }
-					});
-					if(current.length) {
-						this.data.core.to_load = remaining;
-						$.each(current, function (i, val) {
-							if(!_this._is_loaded(val)) {
-								_this.load_node(val, function () { _this.reload_nodes(true); }, function () { _this.reload_nodes(true); });
-								done = false;
-							}
-						});
-					}
-				}
-				if(this.data.core.to_open.length) {
-					$.each(this.data.core.to_open, function (i, val) {
-						_this.open_node(val, false, true);
-					});
-				}
-				if(done) {
-					// TODO: find a more elegant approach to syncronizing returning requests
-					if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); }
-					this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50);
-					this.data.core.refreshing = false;
-					this.reopen();
-				}
-			},
-			reopen : function () {
-				var _this = this;
-				if(this.data.core.to_open.length) {
-					$.each(this.data.core.to_open, function (i, val) {
-						_this.open_node(val, false, true);
-					});
-				}
-				this.__callback({});
-			},
-			refresh : function (obj) {
-				var _this = this;
-				this.save_opened();
-				if(!obj) { obj = -1; }
-				obj = this._get_node(obj);
-				if(!obj) { obj = -1; }
-				if(obj !== -1) { obj.children("UL").remove(); }
-				else { this.get_container_ul().empty(); }
-				this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes(); });
-			},
-			// Dummy function to fire after the first load (so that there is a jstree.loaded event)
-			loaded	: function () {
-				this.__callback();
-			},
-			// deal with focus
-			set_focus	: function () {
-				if(this.is_focused()) { return; }
-				var f = $.jstree._focused();
-				if(f) { f.unset_focus(); }
-				
-				this.get_container().addClass("jstree-focused");
-				focused_instance = this.get_index();
-				this.__callback();
-			},
-			is_focused	: function () {
-				return focused_instance == this.get_index();
-			},
-			unset_focus	: function () {
-				if(this.is_focused()) {
-					this.get_container().removeClass("jstree-focused");
-					focused_instance = -1;
-				}
-				this.__callback();
-			},
-			
-			// traverse
-			_get_node		: function (obj) {
-				var $obj = $(obj, this.get_container());
-				if($obj.is(".jstree") || obj == -1) { return -1; }
-				$obj = $obj.closest("li", this.get_container());
-				return $obj.length ? $obj : false;
-			},
-			_get_next		: function (obj, strict) {
-				obj = this._get_node(obj);
-				if(obj === -1) { return this.get_container().find("> ul > li:first-child"); }
-				if(!obj.length) { return false; }
-				if(strict) { return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; }
-				
-				if(obj.hasClass("jstree-open")) { return obj.find("li:eq(0)"); }
-				else if(obj.nextAll("li").size() > 0) { return obj.nextAll("li:eq(0)"); }
-				else { return obj.parentsUntil(".jstree","li").next("li").eq(0); }
-			},
-			_get_prev		: function (obj, strict) {
-				obj = this._get_node(obj);
-				if(obj === -1) { return this.get_container().find("> ul > li:last-child"); }
-				if(!obj.length) { return false; }
-				if(strict) { return (obj.prevAll("li").length > 0) ? obj.prevAll("li:eq(0)") : false; }
-				
-				if(obj.prev("li").length) {
-					obj = obj.prev("li").eq(0);
-					while(obj.hasClass("jstree-open")) { obj = obj.children("ul:eq(0)").children("li:last"); }
-					return obj;
-				}
-				else { var o = obj.parentsUntil(".jstree","li:eq(0)"); return o.length ? o : false; }
-			},
-			_get_parent		: function (obj) {
-				obj = this._get_node(obj);
-				if(obj == -1 || !obj.length) { return false; }
-				var o = obj.parentsUntil(".jstree", "li:eq(0)");
-				return o.length ? o : -1;
-			},
-			_get_children	: function (obj) {
-				obj = this._get_node(obj);
-				if(obj === -1) { return this.get_container().children("ul:eq(0)").children("li"); }
-				if(!obj.length) { return false; }
-				return obj.children("ul:eq(0)").children("li");
-			},
-			get_path		: function (obj, id_mode) {
-				var p = [],
-				_this = this;
-				obj = this._get_node(obj);
-				if(obj === -1 || !obj || !obj.length) { return false; }
-				obj.parentsUntil(".jstree", "li").each(function () {
-					p.push( id_mode ? this.id : _this.get_text(this) );
-				});
-				p.reverse();
-				p.push( id_mode ? obj.attr("id") : this.get_text(obj) );
-				return p;
-			},
-			
-			// string functions
-			_get_string : function (key) {
-				return this._get_settings().core.strings[key] || key;
-			},
-			
-			is_open		: function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); },
-			is_closed	: function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); },
-			is_leaf		: function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); },
-			correct_state	: function (obj) {
-				obj = this._get_node(obj);
-				if(!obj || obj === -1) { return false; }
-				obj.removeClass("jstree-closed jstree-open").addClass("jstree-leaf").children("ul").remove();
-				this.__callback({ "obj" : obj });
-			},
-			// open/close
-			open_node	: function (obj, callback, skip_animation) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				if(!obj.hasClass("jstree-closed")) { if(callback) { callback.call(); } return false; }
-				var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,
-				t = this;
-				if(!this._is_loaded(obj)) {
-					obj.children("a").addClass("jstree-loading");
-					this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback);
-				}
-				else {
-					if(this._get_settings().core.open_parents) {
-						obj.parentsUntil(".jstree",".jstree-closed").each(function () {
-							t.open_node(this, false, true);
-						});
-					}
-					if(s) { obj.children("ul").css("display","none"); }
-					obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading");
-					if(s) { obj.children("ul").stop(true, true).slideDown(s, function () { this.style.display = ""; t.after_open(obj); }); }
-					else { t.after_open(obj); }
-					this.__callback({ "obj" : obj });
-					if(callback) { callback.call(); }
-				}
-			},
-			after_open	: function (obj) { this.__callback({ "obj" : obj }); },
-			close_node	: function (obj, skip_animation) {
-				obj = this._get_node(obj);
-				var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,
-				t = this;
-				if(!obj.length || !obj.hasClass("jstree-open")) { return false; }
-				if(s) { obj.children("ul").attr("style","display:block !important"); }
-				obj.removeClass("jstree-open").addClass("jstree-closed");
-				if(s) { obj.children("ul").stop(true, true).slideUp(s, function () { this.style.display = ""; t.after_close(obj); }); }
-				else { t.after_close(obj); }
-				this.__callback({ "obj" : obj });
-			},
-			after_close	: function (obj) { this.__callback({ "obj" : obj }); },
-			toggle_node	: function (obj) {
-				obj = this._get_node(obj);
-				if(obj.hasClass("jstree-closed")) { return this.open_node(obj); }
-				if(obj.hasClass("jstree-open")) { return this.close_node(obj); }
-			},
-			open_all	: function (obj, do_animation, original_obj) {
-				obj = obj ? this._get_node(obj) : -1;
-				if(!obj || obj === -1) { obj = this.get_container_ul(); }
-				if(original_obj) {
-					obj = obj.find("li.jstree-closed");
-				}
-				else {
-					original_obj = obj;
-					if(obj.is(".jstree-closed")) { obj = obj.find("li.jstree-closed").addBack(); }
-					else { obj = obj.find("li.jstree-closed"); }
-				}
-				var _this = this;
-				obj.each(function () {
-					var __this = this;
-					if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, do_animation, original_obj); }, !do_animation); }
-					else { _this.open_node(this, false, !do_animation); }
-				});
-				// so that callback is fired AFTER all nodes are open
-				if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); }
-			},
-			close_all	: function (obj, do_animation) {
-				var _this = this;
-				obj = obj ? this._get_node(obj) : this.get_container();
-				if(!obj || obj === -1) { obj = this.get_container_ul(); }
-				obj.find("li.jstree-open").addBack().each(function () { _this.close_node(this, !do_animation); });
-				this.__callback({ "obj" : obj });
-			},
-			clean_node	: function (obj) {
-				obj = obj && obj != -1 ? $(obj) : this.get_container_ul();
-				obj = obj.is("li") ? obj.find("li").addBack() : obj.find("li");
-				obj.removeClass("jstree-last")
-				.filter("li:last-child").addClass("jstree-last").end()
-				.filter(":has(li)")
-				.not(".jstree-open").removeClass("jstree-leaf").addClass("jstree-closed");
-				obj.not(".jstree-open, .jstree-closed").addClass("jstree-leaf").children("ul").remove();
-				this.__callback({ "obj" : obj });
-			},
-			// rollback
-			get_rollback : function () {
-				this.__callback();
-				return { i : this.get_index(), h : this.get_container().children("ul").clone(true), d : this.data };
-			},
-			set_rollback : function (html, data) {
-				this.get_container().empty().append(html);
-				this.data = data;
-				this.__callback();
-			},
-			// Dummy functions to be overwritten by any datastore plugin included
-			load_node	: function (obj, s_call, e_call) { this.__callback({ "obj" : obj }); },
-			_is_loaded	: function (obj) { return true; },
-			
-			// Basic operations: create
-			create_node	: function (obj, position, js, callback, is_loaded) {
-				obj = this._get_node(obj);
-				position = typeof position === "undefined" ? "last" : position;
-				var d = $("<li />"),
-				s = this._get_settings().core,
-				tmp;
-				
-				if(obj !== -1 && !obj.length) { return false; }
-				if(!is_loaded && !this._is_loaded(obj)) { this.load_node(obj, function () { this.create_node(obj, position, js, callback, true); }); return false; }
-				
-				this.__rollback();
-				
-				if(typeof js === "string") { js = { "data" : js }; }
-				if(!js) { js = {}; }
-				if(js.attr) { d.attr(js.attr); }
-				if(js.metadata) { d.data(js.metadata); }
-				if(js.state) { d.addClass("jstree-" + js.state); }
-				if(!js.data) { js.data = this._get_string("new_node"); }
-				if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
-				$.each(js.data, function (i, m) {
-					tmp = $("<a />");
-					if($.isFunction(m)) { m = m.call(this, js); }
-					if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); }
-					else {
-						if(!m.attr) { m.attr = {}; }
-						if(!m.attr.href) { m.attr.href = '#'; }
-						tmp.attr(m.attr)[ s.html_titles ? "html" : "text" ](m.title);
-						if(m.language) { tmp.addClass(m.language); }
-					}
-					tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");
-					if(!m.icon && js.icon) { m.icon = js.icon; }
-					if(m.icon) {
-						if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
-						else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
-					}
-					d.append(tmp);
-				});
-				d.prepend("<ins class='jstree-icon'>&#160;</ins>");
-				if(obj === -1) {
-					obj = this.get_container();
-					if(position === "before") { position = "first"; }
-					if(position === "after") { position = "last"; }
-				}
-				switch(position) {
-					case "before": obj.before(d); tmp = this._get_parent(obj); break;
-					case "after" : obj.after(d);  tmp = this._get_parent(obj); break;
-					case "inside":
-					case "first" :
-					if(!obj.children("ul").length) { obj.append("<ul />"); }
-					obj.children("ul").prepend(d);
-					tmp = obj;
-					break;
-					case "last":
-					if(!obj.children("ul").length) { obj.append("<ul />"); }
-					obj.children("ul").append(d);
-					tmp = obj;
-					break;
-					default:
-					if(!obj.children("ul").length) { obj.append("<ul />"); }
-					if(!position) { position = 0; }
-					tmp = obj.children("ul").children("li").eq(position);
-					if(tmp.length) { tmp.before(d); }
-					else { obj.children("ul").append(d); }
-					tmp = obj;
-					break;
-				}
-				if(tmp === -1 || tmp.get(0) === this.get_container().get(0)) { tmp = -1; }
-				this.clean_node(tmp);
-				this.__callback({ "obj" : d, "parent" : tmp });
-				if(callback) { callback.call(this, d); }
-				return d;
-			},
-			// Basic operations: rename (deal with text)
-			get_text	: function (obj) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				var s = this._get_settings().core.html_titles;
-				obj = obj.children("a:eq(0)");
-				if(s) {
-					obj = obj.clone();
-					obj.children("INS").remove();
-					return obj.html();
-				}
-				else {
-					obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
-					return obj.nodeValue;
-				}
-			},
-			set_text	: function (obj, val) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				obj = obj.children("a:eq(0)");
-				if(this._get_settings().core.html_titles) {
-					var tmp = obj.children("INS").clone();
-					obj.html(val).prepend(tmp);
-					this.__callback({ "obj" : obj, "name" : val });
-					return true;
-				}
-				else {
-					obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
-					this.__callback({ "obj" : obj, "name" : val });
-					return (obj.nodeValue = val);
-				}
-			},
-			rename_node : function (obj, val) {
-				obj = this._get_node(obj);
-				this.__rollback();
-				if(obj && obj.length && this.set_text.apply(this, Array.prototype.slice.call(arguments))) { this.__callback({ "obj" : obj, "name" : val }); }
-			},
-			// Basic operations: deleting nodes
-			delete_node : function (obj) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				this.__rollback();
-				var p = this._get_parent(obj), prev = $([]), t = this;
-				obj.each(function () {
-					prev = prev.add(t._get_prev(this));
-				});
-				obj = obj.detach();
-				if(p !== -1 && p.find("> ul > li").length === 0) {
-					p.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");
-				}
-				this.clean_node(p);
-				this.__callback({ "obj" : obj, "prev" : prev, "parent" : p });
-				return obj;
-			},
-			prepare_move : function (o, r, pos, cb, is_cb) {
-				var p = {};
-				
-				p.ot = $.jstree._reference(o) || this;
-				p.o = p.ot._get_node(o);
-				p.r = r === - 1 ? -1 : this._get_node(r);
-				p.p = (typeof pos === "undefined" || pos === false) ? "last" : pos; // TODO: move to a setting
-				if(!is_cb && prepared_move.o && prepared_move.o[0] === p.o[0] && prepared_move.r[0] === p.r[0] && prepared_move.p === p.p) {
-					this.__callback(prepared_move);
-					if(cb) { cb.call(this, prepared_move); }
-					return;
-				}
-				p.ot = $.jstree._reference(p.o) || this;
-				p.rt = $.jstree._reference(p.r) || this; // r === -1 ? p.ot : $.jstree._reference(p.r) || this
-				if(p.r === -1 || !p.r) {
-					p.cr = -1;
-					switch(p.p) {
-						case "first":
-						case "before":
-						case "inside":
-						p.cp = 0;
-						break;
-						case "after":
-						case "last":
-						p.cp = p.rt.get_container().find(" > ul > li").length;
-						break;
-						default:
-						p.cp = p.p;
-						break;
-					}
-				}
-				else {
-					if(!/^(before|after)$/.test(p.p) && !this._is_loaded(p.r)) {
-						return this.load_node(p.r, function () { this.prepare_move(o, r, pos, cb, true); });
-					}
-					switch(p.p) {
-						case "before":
-						p.cp = p.r.index();
-						p.cr = p.rt._get_parent(p.r);
-						break;
-						case "after":
-						p.cp = p.r.index() + 1;
-						p.cr = p.rt._get_parent(p.r);
-						break;
-						case "inside":
-						case "first":
-						p.cp = 0;
-						p.cr = p.r;
-						break;
-						case "last":
-						p.cp = p.r.find(" > ul > li").length;
-						p.cr = p.r;
-						break;
-						default:
-						p.cp = p.p;
-						p.cr = p.r;
-						break;
-					}
-				}
-				p.np = p.cr == -1 ? p.rt.get_container() : p.cr;
-				p.op = p.ot._get_parent(p.o);
-				p.cop = p.o.index();
-				if(p.op === -1) { p.op = p.ot ? p.ot.get_container() : this.get_container(); }
-				if(!/^(before|after)$/.test(p.p) && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp++; }
-				//if(p.p === "before" && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp--; }
-				p.or = p.np.find(" > ul > li:nth-child(" + (p.cp + 1) + ")");
-				prepared_move = p;
-				this.__callback(prepared_move);
-				if(cb) { cb.call(this, prepared_move); }
-			},
-			check_move : function () {
-				var obj = prepared_move, ret = true, r = obj.r === -1 ? this.get_container() : obj.r;
-				if(!obj || !obj.o || obj.or[0] === obj.o[0]) { return false; }
-				if(!obj.cy) {
-					if(obj.op && obj.np && obj.op[0] === obj.np[0] && obj.cp - 1 === obj.o.index()) { return false; }
-					obj.o.each(function () {
-						if(r.parentsUntil(".jstree", "li").addBack().index(this) !== -1) { ret = false; return false; }
-					});
-				}
-				return ret;
-			},
-			move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
-				if(!is_prepared) {
-					return this.prepare_move(obj, ref, position, function (p) {
-						this.move_node(p, false, false, is_copy, true, skip_check);
-					});
-				}
-				if(is_copy) {
-					prepared_move.cy = true;
-				}
-				if(!skip_check && !this.check_move()) { return false; }
-				
-				this.__rollback();
-				var o = false;
-				if(is_copy) {
-					o = obj.o.clone(true);
-					o.find("*[id]").addBack().each(function () {
-						if(this.id) { this.id = "copy_" + this.id; }
-					});
-				}
-				else { o = obj.o; }
-				
-				if(obj.or.length) { obj.or.before(o); }
-				else {
-					if(!obj.np.children("ul").length) { $("<ul />").appendTo(obj.np); }
-					obj.np.children("ul:eq(0)").append(o);
-				}
-				
-				try {
-					obj.ot.clean_node(obj.op);
-					obj.rt.clean_node(obj.np);
-					if(!obj.op.find("> ul > li").length) {
-						obj.op.removeClass("jstree-open jstree-closed").addClass("jstree-leaf").children("ul").remove();
-					}
-					} catch (e) { }
-					
-					if(is_copy) {
-						prepared_move.cy = true;
-						prepared_move.oc = o;
-					}
-					this.__callback(prepared_move);
-					return prepared_move;
-				},
-				_get_move : function () { return prepared_move; }
-			}
-		});
-	})(jQuery);
-	//*/
-	
-	/*
-	* jsTree ui plugin
-	* This plugins handles selecting/deselecting/hovering/dehovering nodes
-	*/
-	(function ($) {
-		var scrollbar_width, e1, e2;
-		$(function() {
-			if (/msie/.test(navigator.userAgent.toLowerCase())) {
-				e1 = $('<textarea cols="10" rows="2"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');
-				e2 = $('<textarea cols="10" rows="2" style="overflow: hidden;"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');
-				scrollbar_width = e1.width() - e2.width();
-				e1.add(e2).remove();
-			}
-			else {
-				e1 = $('<div />').css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: 0 })
-				.prependTo('body').append('<div />').find('div').css({ width: '100%', height: 200 });
-				scrollbar_width = 100 - e1.width();
-				e1.parent().remove();
-			}
-		});
-		$.jstree.plugin("ui", {
-			__init : function () {
-				this.data.ui.selected = $();
-				this.data.ui.last_selected = false;
-				this.data.ui.hovered = null;
-				this.data.ui.to_select = this.get_settings().ui.initially_select;
-				
-				this.get_container()
-				.delegate("a", "click.jstree", $.proxy(function (event) {
-					event.preventDefault();
-					event.currentTarget.blur();
-					if(!$(event.currentTarget).hasClass("jstree-loading")) {
-						this.select_node(event.currentTarget, true, event);
-					}
-				}, this))
-				.delegate("a", "mouseenter.jstree", $.proxy(function (event) {
-					if(!$(event.currentTarget).hasClass("jstree-loading")) {
-						this.hover_node(event.target);
-					}
-				}, this))
-				.delegate("a", "mouseleave.jstree", $.proxy(function (event) {
-					if(!$(event.currentTarget).hasClass("jstree-loading")) {
-						this.dehover_node(event.target);
-					}
-				}, this))
-				.bind("reopen.jstree", $.proxy(function () {
-					this.reselect();
-				}, this))
-				.bind("get_rollback.jstree", $.proxy(function () {
-					this.dehover_node();
-					this.save_selected();
-				}, this))
-				.bind("set_rollback.jstree", $.proxy(function () {
-					this.reselect();
-				}, this))
-				.bind("close_node.jstree", $.proxy(function (event, data) {
-					var s = this._get_settings().ui,
-					obj = this._get_node(data.rslt.obj),
-					clk = (obj && obj.length) ? obj.children("ul").find("a.jstree-clicked") : $(),
-					_this = this;
-					if(s.selected_parent_close === false || !clk.length) { return; }
-					clk.each(function () {
-						_this.deselect_node(this);
-						if(s.selected_parent_close === "select_parent") { _this.select_node(obj); }
-					});
-				}, this))
-				.bind("delete_node.jstree", $.proxy(function (event, data) {
-					var s = this._get_settings().ui.select_prev_on_delete,
-					obj = this._get_node(data.rslt.obj),
-					clk = (obj && obj.length) ? obj.find("a.jstree-clicked") : [],
-					_this = this;
-					clk.each(function () { _this.deselect_node(this); });
-					if(s && clk.length) {
-						data.rslt.prev.each(function () {
-							if(this.parentNode) { _this.select_node(this); return false; /* if return false is removed all prev nodes will be selected */}
-						});
-					}
-				}, this))
-				.bind("move_node.jstree", $.proxy(function (event, data) {
-					if(data.rslt.cy) {
-						data.rslt.oc.find("a.jstree-clicked").removeClass("jstree-clicked");
-					}
-				}, this));
-			},
-			defaults : {
-				select_limit : -1, // 0, 1, 2 ... or -1 for unlimited
-				select_multiple_modifier : "ctrl", // on, or ctrl, shift, alt
-				select_range_modifier : "shift",
-				selected_parent_close : "select_parent", // false, "deselect", "select_parent"
-				selected_parent_open : true,
-				select_prev_on_delete : true,
-				disable_selecting_children : false,
-				initially_select : []
-			},
-			_fn : {
-				_get_node : function (obj, allow_multiple) {
-					if(typeof obj === "undefined" || obj === null) { return allow_multiple ? this.data.ui.selected : this.data.ui.last_selected; }
-					var $obj = $(obj, this.get_container());
-					if($obj.is(".jstree") || obj == -1) { return -1; }
-					$obj = $obj.closest("li", this.get_container());
-					return $obj.length ? $obj : false;
-				},
-				_ui_notify : function (n, data) {
-					if(data.selected) {
-						this.select_node(n, false);
-					}
-				},
-				save_selected : function () {
-					var _this = this;
-					this.data.ui.to_select = [];
-					this.data.ui.selected.each(function () { if(this.id) { _this.data.ui.to_select.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); } });
-					this.__callback(this.data.ui.to_select);
-				},
-				reselect : function () {
-					var _this = this,
-					s = this.data.ui.to_select;
-					s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
-					// this.deselect_all(); WHY deselect, breaks plugin state notifier?
-					$.each(s, function (i, val) { if(val && val !== "#") { _this.select_node(val); } });
-					this.data.ui.selected = this.data.ui.selected.filter(function () { return this.parentNode; });
-					this.__callback();
-				},
-				refresh : function (obj) {
-					this.save_selected();
-					return this.__call_old();
-				},
-				hover_node : function (obj) {
-					obj = this._get_node(obj);
-					if(!obj.length) { return false; }
-					//if(this.data.ui.hovered && obj.get(0) === this.data.ui.hovered.get(0)) { return; }
-					if(!obj.hasClass("jstree-hovered")) { this.dehover_node(); }
-					this.data.ui.hovered = obj.children("a").addClass("jstree-hovered").parent();
-					this._fix_scroll(obj);
-					this.__callback({ "obj" : obj });
-				},
-				dehover_node : function () {
-					var obj = this.data.ui.hovered, p;
-					if(!obj || !obj.length) { return false; }
-					p = obj.children("a").removeClass("jstree-hovered").parent();
-					if(this.data.ui.hovered[0] === p[0]) { this.data.ui.hovered = null; }
-					this.__callback({ "obj" : obj });
-				},
-				select_node : function (obj, check, e) {
-					obj = this._get_node(obj);
-					if(obj == -1 || !obj || !obj.length) { return false; }
-					var s = this._get_settings().ui,
-					is_multiple = (s.select_multiple_modifier == "on" || (s.select_multiple_modifier !== false && e && e[s.select_multiple_modifier + "Key"])),
-					is_range = (s.select_range_modifier !== false && e && e[s.select_range_modifier + "Key"] && this.data.ui.last_selected && this.data.ui.last_selected[0] !== obj[0] && this.data.ui.last_selected.parent()[0] === obj.parent()[0]),
-					is_selected = this.is_selected(obj),
-					proceed = true,
-					t = this;
-					if(check) {
-						if(s.disable_selecting_children && is_multiple &&
-						(
-						(obj.parentsUntil(".jstree","li").children("a.jstree-clicked").length) ||
-						(obj.children("ul").find("a.jstree-clicked:eq(0)").length)
-						)
-						) {
-							return false;
-						}
-						proceed = false;
-						switch(!0) {
-							case (is_range):
-							this.data.ui.last_selected.addClass("jstree-last-selected");
-							obj = obj[ obj.index() < this.data.ui.last_selected.index() ? "nextUntil" : "prevUntil" ](".jstree-last-selected").addBack();
-							if(s.select_limit == -1 || obj.length < s.select_limit) {
-								this.data.ui.last_selected.removeClass("jstree-last-selected");
-								this.data.ui.selected.each(function () {
-									if(this !== t.data.ui.last_selected[0]) { t.deselect_node(this); }
-								});
-								is_selected = false;
-								proceed = true;
-							}
-							else {
-								proceed = false;
-							}
-							break;
-							case (is_selected && !is_multiple):
-							this.deselect_all();
-							is_selected = false;
-							proceed = true;
-							break;
-							case (!is_selected && !is_multiple):
-							if(s.select_limit == -1 || s.select_limit > 0) {
-								this.deselect_all();
-								proceed = true;
-							}
-							break;
-							case (is_selected && is_multiple):
-							this.deselect_node(obj);
-							break;
-							case (!is_selected && is_multiple):
-							if(s.select_limit == -1 || this.data.ui.selected.length + 1 <= s.select_limit) {
-								proceed = true;
-							}
-							break;
-						}
-					}
-					if(proceed && !is_selected) {
-						if(!is_range) { this.data.ui.last_selected = obj; }
-						obj.children("a").addClass("jstree-clicked");
-						if(s.selected_parent_open) {
-							obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });
-						}
-						this.data.ui.selected = this.data.ui.selected.add(obj);
-						this._fix_scroll(obj.eq(0));
-						this.__callback({ "obj" : obj, "e" : e });
-					}
-				},
-				_fix_scroll : function (obj) {
-					var c = this.get_container()[0], t;
-					if(c.scrollHeight > c.offsetHeight) {
-						obj = this._get_node(obj);
-						if(!obj || obj === -1 || !obj.length || !obj.is(":visible")) { return; }
-						t = obj.offset().top - this.get_container().offset().top;
-						if(t < 0) {
-							c.scrollTop = c.scrollTop + t - 1;
-						}
-						if(t + this.data.core.li_height + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0) > c.offsetHeight) {
-							c.scrollTop = c.scrollTop + (t - c.offsetHeight + this.data.core.li_height + 1 + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0));
-						}
-					}
-				},
-				deselect_node : function (obj) {
-					obj = this._get_node(obj);
-					if(!obj.length) { return false; }
-					if(this.is_selected(obj)) {
-						obj.children("a").removeClass("jstree-clicked");
-						this.data.ui.selected = this.data.ui.selected.not(obj);
-						if(this.data.ui.last_selected.get(0) === obj.get(0)) { this.data.ui.last_selected = this.data.ui.selected.eq(0); }
-						this.__callback({ "obj" : obj });
-					}
-				},
-				toggle_select : function (obj) {
-					obj = this._get_node(obj);
-					if(!obj.length) { return false; }
-					if(this.is_selected(obj)) { this.deselect_node(obj); }
-					else { this.select_node(obj); }
-				},
-				is_selected : function (obj) { return this.data.ui.selected.index(this._get_node(obj)) >= 0; },
-				get_selected : function (context) {
-					return context ? $(context).find("a.jstree-clicked").parent() : this.data.ui.selected;
-				},
-				deselect_all : function (context) {
-					var ret = context ? $(context).find("a.jstree-clicked").parent() : this.get_container().find("a.jstree-clicked").parent();
-					ret.children("a.jstree-clicked").removeClass("jstree-clicked");
-					this.data.ui.selected = $([]);
-					this.data.ui.last_selected = false;
-					this.__callback({ "obj" : ret });
-				}
-			}
-		});
-		// include the selection plugin by default
-		$.jstree.defaults.plugins.push("ui");
-	})(jQuery);
-	//*/
-	
-	/*
-	* jsTree CRRM plugin
-	* Handles creating/renaming/removing/moving nodes by user interaction.
-	*/
-	(function ($) {
-		$.jstree.plugin("crrm", {
-			__init : function () {
-				this.get_container()
-				.bind("move_node.jstree", $.proxy(function (e, data) {
-					if(this._get_settings().crrm.move.open_onmove) {
-						var t = this;
-						data.rslt.np.parentsUntil(".jstree").addBack().filter(".jstree-closed").each(function () {
-							t.open_node(this, false, true);
-						});
-					}
-				}, this));
-			},
-			defaults : {
-				input_width_limit : 200,
-				move : {
-					always_copy			: false, // false, true or "multitree"
-					open_onmove			: true,
-					default_position	: "last",
-					check_move			: function (m) { return true; }
-				}
-			},
-			_fn : {
-				_show_input : function (obj, callback) {
-					obj = this._get_node(obj);
-					var rtl = this._get_settings().core.rtl,
-					w = this._get_settings().crrm.input_width_limit,
-					w1 = obj.children("ins").width(),
-					w2 = obj.find("> a:visible > ins").width() * obj.find("> a:visible > ins").length,
-					t = this.get_text(obj),
-					h1 = $("<div />", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"),
-					h2 = obj.css("position","relative").append(
-					$("<input />", {
-						"value" : t,
-						"class" : "jstree-rename-input",
-						// "size" : t.length,
-						"css" : {
-							"padding" : "0",
-							"border" : "1px solid silver",
-							"position" : "absolute",
-							"left"  : (rtl ? "auto" : (w1 + w2 + 4) + "px"),
-							"right" : (rtl ? (w1 + w2 + 4) + "px" : "auto"),
-							"top" : "0px",
-							"height" : (this.data.core.li_height - 2) + "px",
-							"lineHeight" : (this.data.core.li_height - 2) + "px",
-							"width" : "150px" // will be set a bit further down
-						},
-						"blur" : $.proxy(function () {
-							var i = obj.children(".jstree-rename-input"),
-							v = i.val();
-							if(v === "") { v = t; }
-							h1.remove();
-							i.remove(); // rollback purposes
-							this.set_text(obj,t); // rollback purposes
-							this.rename_node(obj, v);
-							callback.call(this, obj, v, t);
-							obj.css("position","");
-						}, this),
-						"keyup" : function (event) {
-							var key = event.keyCode || event.which;
-							if(key == 27) { this.value = t; this.blur(); return; }
-							else if(key == 13) { this.blur(); return; }
-							else {
-								h2.width(Math.min(h1.text("pW" + this.value).width(),w));
-							}
-						},
-						"keypress" : function(event) {
-							var key = event.keyCode || event.which;
-							if(key == 13) { return false; }
-						}
-					})
-					).children(".jstree-rename-input");
-					this.set_text(obj, "");
-					h1.css({
-						fontFamily		: h2.css('fontFamily')		|| '',
-						fontSize		: h2.css('fontSize')		|| '',
-						fontWeight		: h2.css('fontWeight')		|| '',
-						fontStyle		: h2.css('fontStyle')		|| '',
-						fontStretch		: h2.css('fontStretch')		|| '',
-						fontVariant		: h2.css('fontVariant')		|| '',
-						letterSpacing	: h2.css('letterSpacing')	|| '',
-						wordSpacing		: h2.css('wordSpacing')		|| ''
-					});
-					h2.width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();
-				},
-				rename : function (obj) {
-					obj = this._get_node(obj);
-					this.__rollback();
-					var f = this.__callback;
-					this._show_input(obj, function (obj, new_name, old_name) {
-						f.call(this, { "obj" : obj, "new_name" : new_name, "old_name" : old_name });
-					});
-				},
-				create : function (obj, position, js, callback, skip_rename) {
-					var t, _this = this;
-					obj = this._get_node(obj);
-					if(!obj) { obj = -1; }
-					this.__rollback();
-					t = this.create_node(obj, position, js, function (t) {
-						var p = this._get_parent(t),
-						pos = $(t).index();
-						if(callback) { callback.call(this, t); }
-						if(p.length && p.hasClass("jstree-closed")) { this.open_node(p, false, true); }
-						if(!skip_rename) {
-							this._show_input(t, function (obj, new_name, old_name) {
-								_this.__callback({ "obj" : obj, "name" : new_name, "parent" : p, "position" : pos });
-							});
-						}
-						else { _this.__callback({ "obj" : t, "name" : this.get_text(t), "parent" : p, "position" : pos }); }
-					});
-					return t;
-				},
-				remove : function (obj) {
-					obj = this._get_node(obj, true);
-					var p = this._get_parent(obj), prev = this._get_prev(obj);
-					this.__rollback();
-					obj = this.delete_node(obj);
-					if(obj !== false) { this.__callback({ "obj" : obj, "prev" : prev, "parent" : p }); }
-				},
-				check_move : function () {
-					if(!this.__call_old()) { return false; }
-					var s = this._get_settings().crrm.move;
-					if(!s.check_move.call(this, this._get_move())) { return false; }
-					return true;
-				},
-				move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
-					var s = this._get_settings().crrm.move;
-					if(!is_prepared) {
-						if(typeof position === "undefined") { position = s.default_position; }
-						if(position === "inside" && !s.default_position.match(/^(before|after)$/)) { position = s.default_position; }
-						return this.__call_old(true, obj, ref, position, is_copy, false, skip_check);
-					}
-					// if the move is already prepared
-					if(s.always_copy === true || (s.always_copy === "multitree" && obj.rt.get_index() !== obj.ot.get_index() )) {
-						is_copy = true;
-					}
-					this.__call_old(true, obj, ref, position, is_copy, true, skip_check);
-				},
-				
-				cut : function (obj) {
-					obj = this._get_node(obj, true);
-					if(!obj || !obj.length) { return false; }
-					this.data.crrm.cp_nodes = false;
-					this.data.crrm.ct_nodes = obj;
-					this.__callback({ "obj" : obj });
-				},
-				copy : function (obj) {
-					obj = this._get_node(obj, true);
-					if(!obj || !obj.length) { return false; }
-					this.data.crrm.ct_nodes = false;
-					this.data.crrm.cp_nodes = obj;
-					this.__callback({ "obj" : obj });
-				},
-				paste : function (obj) {
-					obj = this._get_node(obj);
-					if(!obj || !obj.length) { return false; }
-					var nodes = this.data.crrm.ct_nodes ? this.data.crrm.ct_nodes : this.data.crrm.cp_nodes;
-					if(!this.data.crrm.ct_nodes && !this.data.crrm.cp_nodes) { return false; }
-					if(this.data.crrm.ct_nodes) { this.move_node(this.data.crrm.ct_nodes, obj); this.data.crrm.ct_nodes = false; }
-					if(this.data.crrm.cp_nodes) { this.move_node(this.data.crrm.cp_nodes, obj, false, true); }
-					this.__callback({ "obj" : obj, "nodes" : nodes });
-				}
-			}
-		});
-		// include the crr plugin by default
-		// $.jstree.defaults.plugins.push("crrm");
-	})(jQuery);
-	//*/
-	
-	/*
-	* jsTree themes plugin
-	* Handles loading and setting themes, as well as detecting path to themes, etc.
-	*/
-	(function ($) {
-		var themes_loaded = [];
-		// this variable stores the path to the themes folder - if left as false - it will be autodetected
-		$.jstree._themes = false;
-		$.jstree.plugin("themes", {
-			__init : function () {
-				this.get_container()
-				.bind("init.jstree", $.proxy(function () {
-					var s = this._get_settings().themes;
-					this.data.themes.dots = s.dots;
-					this.data.themes.icons = s.icons;
-					this.set_theme(s.theme, s.url);
-				}, this))
-				.bind("loaded.jstree", $.proxy(function () {
-					// bound here too, as simple HTML tree's won't honor dots & icons otherwise
-					if(!this.data.themes.dots) { this.hide_dots(); }
-					else { this.show_dots(); }
-					if(!this.data.themes.icons) { this.hide_icons(); }
-					else { this.show_icons(); }
-				}, this));
-			},
-			defaults : {
-				theme : "default",
-				url : false,
-				dots : true,
-				icons : true
-			},
-			_fn : {
-				set_theme : function (theme_name, theme_url) {
-					if(!theme_name) { return false; }
-					if(!theme_url) { theme_url = $.jstree._themes + theme_name + '/style.css'; }
-					if($.inArray(theme_url, themes_loaded) == -1) {
-						$.vakata.css.add_sheet({ "url" : theme_url });
-						themes_loaded.push(theme_url);
-					}
-					if(this.data.themes.theme != theme_name) {
-						this.get_container().removeClass('jstree-' + this.data.themes.theme);
-						this.data.themes.theme = theme_name;
-					}
-					this.get_container().addClass('jstree-' + theme_name);
-					if(!this.data.themes.dots) { this.hide_dots(); }
-					else { this.show_dots(); }
-					if(!this.data.themes.icons) { this.hide_icons(); }
-					else { this.show_icons(); }
-					this.__callback();
-				},
-				get_theme	: function () { return this.data.themes.theme; },
-				
-				show_dots	: function () { this.data.themes.dots = true; this.get_container().children("ul").removeClass("jstree-no-dots"); },
-				hide_dots	: function () { this.data.themes.dots = false; this.get_container().children("ul").addClass("jstree-no-dots"); },
-				toggle_dots	: function () { if(this.data.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },
-				
-				show_icons	: function () { this.data.themes.icons = true; this.get_container().children("ul").removeClass("jstree-no-icons"); },
-				hide_icons	: function () { this.data.themes.icons = false; this.get_container().children("ul").addClass("jstree-no-icons"); },
-				toggle_icons: function () { if(this.data.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }
-			}
-		});
-		// autodetect themes path
-		$(function () {
-			if($.jstree._themes === false) {
-				$("script").each(function () {
-					if(this.src.toString().match(/jquery\.jstree[^\/]*?\.js(\?.*)?$/)) {
-						$.jstree._themes = this.src.toString().replace(/jquery\.jstree[^\/]*?\.js(\?.*)?$/, "") + 'themes/';
-						return false;
-					}
-				});
-			}
-			if($.jstree._themes === false) { $.jstree._themes = "themes/"; }
-		});
-		// include the themes plugin by default
-		$.jstree.defaults.plugins.push("themes");
-	})(jQuery);
-	//*/
-	
-	/*
-	* jsTree hotkeys plugin
-	* Enables keyboard navigation for all tree instances
-	* Depends on the jstree ui & jquery hotkeys plugins
-	*/
-	(function ($) {
-		var bound = [];
-		function exec(i, event) {
-			var f = $.jstree._focused(), tmp;
-			if(f && f.data && f.data.hotkeys && f.data.hotkeys.enabled) {
-				tmp = f._get_settings().hotkeys[i];
-				if(tmp) { return tmp.call(f, event); }
-			}
-		}
-		$.jstree.plugin("hotkeys", {
-			__init : function () {
-				if(typeof $.hotkeys === "undefined") { throw "jsTree hotkeys: jQuery hotkeys plugin not included."; }
-				if(!this.data.ui) { throw "jsTree hotkeys: jsTree UI plugin not included."; }
-				$.each(this._get_settings().hotkeys, function (i, v) {
-					if(v !== false && $.inArray(i, bound) == -1) {
-						$(document).bind("keydown", i, function (event) { return exec(i, event); });
-						bound.push(i);
-					}
-				});
-				this.get_container()
-				.bind("lock.jstree", $.proxy(function () {
-					if(this.data.hotkeys.enabled) { this.data.hotkeys.enabled = false; this.data.hotkeys.revert = true; }
-				}, this))
-				.bind("unlock.jstree", $.proxy(function () {
-					if(this.data.hotkeys.revert) { this.data.hotkeys.enabled = true; }
-				}, this));
-				this.enable_hotkeys();
-			},
-			defaults : {
-				"up" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-					this.hover_node(this._get_prev(o));
-					return false;
-				},
-				"ctrl+up" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-					this.hover_node(this._get_prev(o));
-					return false;
-				},
-				"shift+up" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-					this.hover_node(this._get_prev(o));
-					return false;
-				},
-				"down" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-					this.hover_node(this._get_next(o));
-					return false;
-				},
-				"ctrl+down" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-					this.hover_node(this._get_next(o));
-					return false;
-				},
-				"shift+down" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-					this.hover_node(this._get_next(o));
-					return false;
-				},
-				"left" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected;
-					if(o) {
-						if(o.hasClass("jstree-open")) { this.close_node(o); }
-						else { this.hover_node(this._get_prev(o)); }
-					}
-					return false;
-				},
-				"ctrl+left" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected;
-					if(o) {
-						if(o.hasClass("jstree-open")) { this.close_node(o); }
-						else { this.hover_node(this._get_prev(o)); }
-					}
-					return false;
-				},
-				"shift+left" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected;
-					if(o) {
-						if(o.hasClass("jstree-open")) { this.close_node(o); }
-						else { this.hover_node(this._get_prev(o)); }
-					}
-					return false;
-				},
-				"right" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected;
-					if(o && o.length) {
-						if(o.hasClass("jstree-closed")) { this.open_node(o); }
-						else { this.hover_node(this._get_next(o)); }
-					}
-					return false;
-				},
-				"ctrl+right" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected;
-					if(o && o.length) {
-						if(o.hasClass("jstree-closed")) { this.open_node(o); }
-						else { this.hover_node(this._get_next(o)); }
-					}
-					return false;
-				},
-				"shift+right" : function () {
-					var o = this.data.ui.hovered || this.data.ui.last_selected;
-					if(o && o.length) {
-						if(o.hasClass("jstree-closed")) { this.open_node(o); }
-						else { this.hover_node(this._get_next(o)); }
-					}
-					return false;
-				},
-				"space" : function () {
-					if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").click(); }
-					return false;
-				},
-				"ctrl+space" : function (event) {
-					event.type = "click";
-					if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); }
-					return false;
-				},
-				"shift+space" : function (event) {
-					event.type = "click";
-					if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); }
-					return false;
-				},
-				"f2" : function () { this.rename(this.data.ui.hovered || this.data.ui.last_selected); },
-				"del" : function () { this.remove(this.data.ui.hovered || this._get_node(null)); }
-			},
-			_fn : {
-				enable_hotkeys : function () {
-					this.data.hotkeys.enabled = true;
-				},
-				disable_hotkeys : function () {
-					this.data.hotkeys.enabled = false;
-				}
-			}
-		});
-	})(jQuery);
-	//*/
-	
-	/*
-	* jsTree JSON plugin
-	* The JSON data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
-	*/
-	(function ($) {
-		$.jstree.plugin("json_data", {
-			__init : function() {
-				var s = this._get_settings().json_data;
-				if(s.progressive_unload) {
-					this.get_container().bind("after_close.jstree", function (e, data) {
-						data.rslt.obj.children("ul").remove();
-					});
-				}
-			},
-			defaults : {
-				// `data` can be a function:
-				//  * accepts two arguments - node being loaded and a callback to pass the result to
-				//  * will be executed in the current tree's scope & ajax won't be supported
-				data : false,
-				ajax : false,
-				correct_state : true,
-				progressive_render : false,
-				progressive_unload : false
-			},
-			_fn : {
-				load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_json(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
-				_is_loaded : function (obj) {
-					var s = this._get_settings().json_data;
-					obj = this._get_node(obj);
-					return obj == -1 || !obj || (!s.ajax && !s.progressive_render && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").length > 0;
-				},
-				refresh : function (obj) {
-					obj = this._get_node(obj);
-					var s = this._get_settings().json_data;
-					if(obj && obj !== -1 && s.progressive_unload && ($.isFunction(s.data) || !!s.ajax)) {
-						obj.removeData("jstree_children");
-					}
-					return this.__call_old();
-				},
-				load_node_json : function (obj, s_call, e_call) {
-					var s = this.get_settings().json_data, d,
-					error_func = function () {},
-					success_func = function () {};
-					obj = this._get_node(obj);
-					
-					if(obj && obj !== -1 && (s.progressive_render || s.progressive_unload) && !obj.is(".jstree-open, .jstree-leaf") && obj.children("ul").children("li").length === 0 && obj.data("jstree_children")) {
-						d = this._parse_json(obj.data("jstree_children"), obj);
-						if(d) {
-							obj.append(d);
-							if(!s.progressive_unload) { obj.removeData("jstree_children"); }
-						}
-						this.clean_node(obj);
-						if(s_call) { s_call.call(this); }
-						return;
-					}
-					
-					if(obj && obj !== -1) {
-						if(obj.data("jstree_is_loading")) { return; }
-						else { obj.data("jstree_is_loading",true); }
-					}
-					switch(!0) {
-						case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
-						// function option added here for easier model integration (also supporting async - see callback)
-						case ($.isFunction(s.data)):
-						s.data.call(this, obj, $.proxy(function (d) {
-							d = this._parse_json(d, obj);
-							if(!d) {
-								if(obj === -1 || !obj) {
-									if(s.correct_state) { this.get_container().children("ul").empty(); }
-								}
-								else {
-									obj.children("a.jstree-loading").removeClass("jstree-loading");
-									obj.removeData("jstree_is_loading");
-									if(s.correct_state) { this.correct_state(obj); }
-								}
-								if(e_call) { e_call.call(this); }
-							}
-							else {
-								if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
-								else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree_is_loading"); }
-								this.clean_node(obj);
-								if(s_call) { s_call.call(this); }
-							}
-						}, this));
-						break;
-						case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
-						if(!obj || obj == -1) {
-							d = this._parse_json(s.data, obj);
-							if(d) {
-								this.get_container().children("ul").empty().append(d.children());
-								this.clean_node();
-							}
-							else {
-								if(s.correct_state) { this.get_container().children("ul").empty(); }
-							}
-						}
-						if(s_call) { s_call.call(this); }
-						break;
-						case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
-						error_func = function (x, t, e) {
-							var ef = this.get_settings().json_data.ajax.error;
-							if(ef) { ef.call(this, x, t, e); }
-							if(obj != -1 && obj.length) {
-								obj.children("a.jstree-loading").removeClass("jstree-loading");
-								obj.removeData("jstree_is_loading");
-								if(t === "success" && s.correct_state) { this.correct_state(obj); }
-							}
-							else {
-								if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
-							}
-							if(e_call) { e_call.call(this); }
-						};
-						success_func = function (d, t, x) {
-							var sf = this.get_settings().json_data.ajax.success;
-							if(sf) { d = sf.call(this,d,t,x) || d; }
-							if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "") || (!$.isArray(d) && !$.isPlainObject(d))) {
-								return error_func.call(this, x, t, "");
-							}
-							d = this._parse_json(d, obj);
-							if(d) {
-								if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
-								else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree_is_loading"); }
-								this.clean_node(obj);
-								if(s_call) { s_call.call(this); }
-							}
-							else {
-								if(obj === -1 || !obj) {
-									if(s.correct_state) {
-										this.get_container().children("ul").empty();
-										if(s_call) { s_call.call(this); }
-									}
-								}
-								else {
-									obj.children("a.jstree-loading").removeClass("jstree-loading");
-									obj.removeData("jstree_is_loading");
-									if(s.correct_state) {
-										this.correct_state(obj);
-										if(s_call) { s_call.call(this); }
-									}
-								}
-							}
-						};
-						s.ajax.context = this;
-						s.ajax.error = error_func;
-						s.ajax.success = success_func;
-						if(!s.ajax.dataType) { s.ajax.dataType = "json"; }
-						if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
-						if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
-						$.ajax(s.ajax);
-						break;
-					}
-				},
-				_parse_json : function (js, obj, is_callback) {
-					var d = false,
-					p = this._get_settings(),
-					s = p.json_data,
-					t = p.core.html_titles,
-					tmp, i, j, ul1, ul2;
-					
-					if(!js) { return d; }
-					if(s.progressive_unload && obj && obj !== -1) {
-						obj.data("jstree_children", d);
-					}
-					if($.isArray(js)) {
-						d = $('<ul>');
-						if(!js.length) { return false; }
-						for(i = 0, j = js.length; i < j; i++) {
-							tmp = this._parse_json(js[i], obj, true);
-							if(tmp.length) {
-								d = d.append(tmp);
-							}
-						}
-						d = d.children();
-					}
-					else {
-						if(typeof js == "string") { js = { data : js }; }
-						if(!js.data && js.data !== "") { return d; }
-						d = $("<li />");
-						if(js.attr) { d.attr(js.attr); }
-						if(js.metadata) { d.data(js.metadata); }
-						if(js.state) { d.addClass("jstree-" + js.state); }
-						if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
-						$.each(js.data, function (i, m) {
-							tmp = $("<a />");
-							if($.isFunction(m)) { m = m.call(this, js); }
-							if(typeof m == "string") { tmp.attr('href','#')[ t ? "html" : "text" ](m); }
-							else {
-								if(!m.attr) { m.attr = {}; }
-								if(!m.attr.href) { m.attr.href = '#'; }
-								tmp.attr(m.attr)[ t ? "html" : "text" ](m.title);
-								if(m.language) { tmp.addClass(m.language); }
-							}
-							tmp.prepend("<ins class='jstree-icon'>&#160;</ins>");
-							if(!m.icon && js.icon) { m.icon = js.icon; }
-							if(m.icon) {
-								if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
-								else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
-							}
-							d.append(tmp);
-						});
-						d.prepend("<ins class='jstree-icon'>&#160;</ins>");
-						if(js.children) {
-							if(s.progressive_render && js.state !== "open") {
-								d.addClass("jstree-closed").data("jstree_children", js.children);
-							}
-							else {
-								if(s.progressive_unload) { d.data("jstree_children", js.children); }
-								if($.isArray(js.children) && js.children.length) {
-									tmp = this._parse_json(js.children, obj, true);
-									if(tmp.length) {
-										ul2 = $("<ul />");
-										ul2.append(tmp);
-										d.append(ul2);
-									}
-								}
-							}
-						}
-					}
-					if(!is_callback) {
-						ul1 = $("<ul />");
-						ul1.append(d);
-						d = ul1;
-					}
-					return d;
-				},
-				get_json : function (obj, li_attr, a_attr, is_callback) {
-					var result = [],
-					s = this._get_settings(),
-					_this = this,
-					tmp1, tmp2, li, a, t, lang;
-					obj = this._get_node(obj);
-					if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
-					li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
-					if(!is_callback && this.data.types) { li_attr.push(s.types.type_attr); }
-					a_attr = $.isArray(a_attr) ? a_attr : [ ];
-					
-					obj.each(function () {
-						li = $(this);
-						tmp1 = { data : [] };
-						if(li_attr.length) { tmp1.attr = { }; }
-						$.each(li_attr, function (i, v) {
-							tmp2 = li.attr(v);
-							if(tmp2 && tmp2.length && tmp2.replace(/jstree[^ ]*/ig,'').length) {
-								tmp1.attr[v] = (" " + tmp2).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
-							}
-						});
-						if(li.hasClass("jstree-open")) { tmp1.state = "open"; }
-						if(li.hasClass("jstree-closed")) { tmp1.state = "closed"; }
-						if(li.data()) { tmp1.metadata = li.data(); }
-						a = li.children("a");
-						a.each(function () {
-							t = $(this);
-							if(
-							a_attr.length ||
-							$.inArray("languages", s.plugins) !== -1 ||
-							t.children("ins").get(0).style.backgroundImage.length ||
-							(t.children("ins").get(0).className && t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').length)
-							) {
-								lang = false;
-								if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {
-									$.each(s.languages, function (l, lv) {
-										if(t.hasClass(lv)) {
-											lang = lv;
-											return false;
-										}
-									});
-								}
-								tmp2 = { attr : { }, title : _this.get_text(t, lang) };
-								$.each(a_attr, function (k, z) {
-									tmp2.attr[z] = (" " + (t.attr(z) || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
-								});
-								if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {
-									$.each(s.languages, function (k, z) {
-										if(t.hasClass(z)) { tmp2.language = z; return true; }
-									});
-								}
-								if(t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
-									tmp2.icon = t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
-								}
-								if(t.children("ins").get(0).style.backgroundImage.length) {
-									tmp2.icon = t.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","");
-								}
-							}
-							else {
-								tmp2 = _this.get_text(t);
-							}
-							if(a.length > 1) { tmp1.data.push(tmp2); }
-							else { tmp1.data = tmp2; }
-						});
-						li = li.find("> ul > li");
-						if(li.length) { tmp1.children = _this.get_json(li, li_attr, a_attr, true); }
-						result.push(tmp1);
-					});
-					return result;
-				}
-			}
-		});
-	})(jQuery);
-	//*/
-	
-	/*
-	* jsTree languages plugin
-	* Adds support for multiple language versions in one tree
-	* This basically allows for many titles coexisting in one node, but only one of them being visible at any given time
-	* This is useful for maintaining the same structure in many languages (hence the name of the plugin)
-	*/
-	(function ($) {
-		var sh = false;
-		$.jstree.plugin("languages", {
-			__init : function () { this._load_css();  },
-			defaults : [],
-			_fn : {
-				set_lang : function (i) {
-					var langs = this._get_settings().languages,
-					st = false,
-					selector = ".jstree-" + this.get_index() + ' a';
-					if(!$.isArray(langs) || langs.length === 0) { return false; }
-					if($.inArray(i,langs) == -1) {
-						if(!!langs[i]) { i = langs[i]; }
-						else { return false; }
-					}
-					if(i == this.data.languages.current_language) { return true; }
-					st = $.vakata.css.get_css(selector + "." + this.data.languages.current_language, false, sh);
-					if(st !== false) { st.style.display = "none"; }
-					st = $.vakata.css.get_css(selector + "." + i, false, sh);
-					if(st !== false) { st.style.display = ""; }
-					this.data.languages.current_language = i;
-					this.__callback(i);
-					return true;
-				},
-				get_lang : function () {
-					return this.data.languages.current_language;
-				},
-				_get_string : function (key, lang) {
-					var langs = this._get_settings().languages,
-					s = this._get_settings().core.strings;
-					if($.isArray(langs) && langs.length) {
-						lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
-					}
-					if(s[lang] && s[lang][key]) { return s[lang][key]; }
-					if(s[key]) { return s[key]; }
-					return key;
-				},
-				get_text : function (obj, lang) {
-					obj = this._get_node(obj) || this.data.ui.last_selected;
-					if(!obj.size()) { return false; }
-					var langs = this._get_settings().languages,
-					s = this._get_settings().core.html_titles;
-					if($.isArray(langs) && langs.length) {
-						lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
-						obj = obj.children("a." + lang);
-					}
-					else { obj = obj.children("a:eq(0)"); }
-					if(s) {
-						obj = obj.clone();
-						obj.children("INS").remove();
-						return obj.html();
-					}
-					else {
-						obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
-						return obj.nodeValue;
-					}
-				},
-				set_text : function (obj, val, lang) {
-					obj = this._get_node(obj) || this.data.ui.last_selected;
-					if(!obj.size()) { return false; }
-					var langs = this._get_settings().languages,
-					s = this._get_settings().core.html_titles,
-					tmp;
-					if($.isArray(langs) && langs.length) {
-						lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
-						obj = obj.children("a." + lang);
-					}
-					else { obj = obj.children("a:eq(0)"); }
-					if(s) {
-						tmp = obj.children("INS").clone();
-						obj.html(val).prepend(tmp);
-						this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
-						return true;
-					}
-					else {
-						obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
-						this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
-						return (obj.nodeValue = val);
-					}
-				},
-				_load_css : function () {
-					var langs = this._get_settings().languages,
-					str = "/* languages css */",
-					selector = ".jstree-" + this.get_index() + ' a',
-					ln;
-					if($.isArray(langs) && langs.length) {
-						this.data.languages.current_language = langs[0];
-						for(ln = 0; ln < langs.length; ln++) {
-							str += selector + "." + langs[ln] + " {";
-								if(langs[ln] != this.data.languages.current_language) { str += " display:none; "; }
-							str += " } ";
-						}
-						sh = $.vakata.css.add_sheet({ 'str' : str, 'title' : "jstree-languages" });
-					}
-				},
-				create_node : function (obj, position, js, callback) {
-					var t = this.__call_old(true, obj, position, js, function (t) {
-						var langs = this._get_settings().languages,
-						a = t.children("a"),
-						ln;
-						if($.isArray(langs) && langs.length) {
-							for(ln = 0; ln < langs.length; ln++) {
-								if(!a.is("." + langs[ln])) {
-									t.append(a.eq(0).clone().removeClass(langs.join(" ")).addClass(langs[ln]));
-								}
-							}
-							a.not("." + langs.join(", .")).remove();
-						}
-						if(callback) { callback.call(this, t); }
-					});
-					return t;
-				}
-			}
-		});
-	})(jQuery);
-	//*/
-	
-	/*
-	* jsTree cookies plugin
-	* Stores the currently opened/selected nodes in a cookie and then restores them
-	* Depends on the jquery.cookie plugin
-	*/
-	(function ($) {
-		$.jstree.plugin("cookies", {
-			__init : function () {
-				if(typeof $.cookie === "undefined") { throw "jsTree cookie: jQuery cookie plugin not included."; }
-				
-				var s = this._get_settings().cookies,
-				tmp;
-				if(!!s.save_loaded) {
-					tmp = $.cookie(s.save_loaded);
-					if(tmp && tmp.length) { this.data.core.to_load = tmp.split(","); }
-				}
-				if(!!s.save_opened) {
-					tmp = $.cookie(s.save_opened);
-					if(tmp && tmp.length) { this.data.core.to_open = tmp.split(","); }
-				}
-				if(!!s.save_selected) {
-					tmp = $.cookie(s.save_selected);
-					if(tmp && tmp.length && this.data.ui) { this.data.ui.to_select = tmp.split(","); }
-				}
-				this.get_container()
-				.one( ( this.data.ui ? "reselect" : "reopen" ) + ".jstree", $.proxy(function () {
-					this.get_container()
-					.bind("open_node.jstree close_node.jstree select_node.jstree deselect_node.jstree", $.proxy(function (e) {
-						if(this._get_settings().cookies.auto_save) { this.save_cookie((e.handleObj.namespace + e.handleObj.type).replace("jstree","")); }
-					}, this));
-				}, this));
-			},
-			defaults : {
-				save_loaded		: "jstree_load",
-				save_opened		: "jstree_open",
-				save_selected	: "jstree_select",
-				auto_save		: true,
-				cookie_options	: {}
-			},
-			_fn : {
-				save_cookie : function (c) {
-					if(this.data.core.refreshing) { return; }
-					var s = this._get_settings().cookies;
-					if(!c) { // if called manually and not by event
-						if(s.save_loaded) {
-							this.save_loaded();
-							$.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options);
-						}
-						if(s.save_opened) {
-							this.save_opened();
-							$.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);
-						}
-						if(s.save_selected && this.data.ui) {
-							this.save_selected();
-							$.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);
-						}
-						return;
-					}
-					switch(c) {
-						case "open_node":
-						case "close_node":
-						if(!!s.save_opened) {
-							this.save_opened();
-							$.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);
-						}
-						if(!!s.save_loaded) {
-							this.save_loaded();
-							$.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options);
-						}
-						break;
-						case "select_node":
-						case "deselect_node":
-						if(!!s.save_selected && this.data.ui) {
-							this.save_selected();
-							$.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);
-						}
-						break;
-					}
-				}
-			}
-		});
-		// include cookies by default
-		// $.jstree.defaults.plugins.push("cookies");
-	})(jQuery);
-	//*/
-	
-	/*
-	* jsTree sort plugin
-	* Sorts items alphabetically (or using any other function)
-	*/
-	(function ($) {
-		$.jstree.plugin("sort", {
-			__init : function () {
-				this.get_container()
-				.bind("load_node.jstree", $.proxy(function (e, data) {
-					var obj = this._get_node(data.rslt.obj);
-					obj = obj === -1 ? this.get_container().children("ul") : obj.children("ul");
-					this.sort(obj);
-				}, this))
-				.bind("rename_node.jstree create_node.jstree create.jstree", $.proxy(function (e, data) {
-					this.sort(data.rslt.obj.parent());
-				}, this))
-				.bind("move_node.jstree", $.proxy(function (e, data) {
-					var m = data.rslt.np == -1 ? this.get_container() : data.rslt.np;
-					this.sort(m.children("ul"));
-				}, this));
-			},
-			defaults : function (a, b) { return this.get_text(a) > this.get_text(b) ? 1 : -1; },
-			_fn : {
-				sort : function (obj) {
-					var s = this._get_settings().sort,
-					t = this;
-					obj.append($.makeArray(obj.children("li")).sort($.proxy(s, t)));
-					obj.find("> li > ul").each(function() { t.sort($(this)); });
-					this.clean_node(obj);
-				}
-			}
-		});
-	})(jQuery);
-	//*/
-	
-	/*
-	* jsTree DND plugin
-	* Drag and drop plugin for moving/copying nodes
-	*/
-	(function ($) {
-		var o = false,
-		r = false,
-		m = false,
-		ml = false,
-		sli = false,
-		sti = false,
-		dir1 = false,
-		dir2 = false,
-		last_pos = false;
-		$.vakata.dnd = {
-			is_down : false,
-			is_drag : false,
-			helper : false,
-			scroll_spd : 10,
-			init_x : 0,
-			init_y : 0,
-			threshold : 5,
-			helper_left : 5,
-			helper_top : 10,
-			user_data : {},
-			
-			drag_start : function (e, data, html) {
-				if($.vakata.dnd.is_drag) { $.vakata.drag_stop({}); }
-				try {
-					e.currentTarget.unselectable = "on";
-					e.currentTarget.onselectstart = function() { return false; };
-					if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; }
-					} catch(err) { }
-					$.vakata.dnd.init_x = e.pageX;
-					$.vakata.dnd.init_y = e.pageY;
-					$.vakata.dnd.user_data = data;
-					$.vakata.dnd.is_down = true;
-					$.vakata.dnd.helper = $("<div id='vakata-dragged' />").html(html); //.fadeTo(10,0.25);
-					$(document).bind("mousemove", $.vakata.dnd.drag);
-					$(document).bind("mouseup", $.vakata.dnd.drag_stop);
-					return false;
-				},
-				drag : function (e) {
-					if(!$.vakata.dnd.is_down) { return; }
-					if(!$.vakata.dnd.is_drag) {
-						if(Math.abs(e.pageX - $.vakata.dnd.init_x) > 5 || Math.abs(e.pageY - $.vakata.dnd.init_y) > 5) {
-							$.vakata.dnd.helper.appendTo("body");
-							$.vakata.dnd.is_drag = true;
-							$(document).triggerHandler("drag_start.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
-						}
-						else { return; }
-					}
-					
-					// maybe use a scrolling parent element instead of document?
-					if(e.type === "mousemove") { // thought of adding scroll in order to move the helper, but mouse poisition is n/a
-						var d = $(document), t = d.scrollTop(), l = d.scrollLeft();
-						if(e.pageY - t < 20) {
-							if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
-							if(!sti) { dir1 = "up"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() - $.vakata.dnd.scroll_spd); }, 150); }
-						}
-						else {
-							if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
-						}
-						if($(window).height() - (e.pageY - t) < 20) {
-							if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
-							if(!sti) { dir1 = "down"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() + $.vakata.dnd.scroll_spd); }, 150); }
-						}
-						else {
-							if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
-						}
-						
-						if(e.pageX - l < 20) {
-							if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
-							if(!sli) { dir2 = "left"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() - $.vakata.dnd.scroll_spd); }, 150); }
-						}
-						else {
-							if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
-						}
-						if($(window).width() - (e.pageX - l) < 20) {
-							if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
-							if(!sli) { dir2 = "right"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() + $.vakata.dnd.scroll_spd); }, 150); }
-						}
-						else {
-							if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
-						}
-					}
-					
-					$.vakata.dnd.helper.css({ left : (e.pageX + $.vakata.dnd.helper_left) + "px", top : (e.pageY + $.vakata.dnd.helper_top) + "px" });
-					$(document).triggerHandler("drag.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
-				},
-				drag_stop : function (e) {
-					if(sli) { clearInterval(sli); }
-					if(sti) { clearInterval(sti); }
-					$(document).unbind("mousemove", $.vakata.dnd.drag);
-					$(document).unbind("mouseup", $.vakata.dnd.drag_stop);
-					$(document).triggerHandler("drag_stop.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
-					$.vakata.dnd.helper.remove();
-					$.vakata.dnd.init_x = 0;
-					$.vakata.dnd.init_y = 0;
-					$.vakata.dnd.user_data = {};
-					$.vakata.dnd.is_down = false;
-					$.vakata.dnd.is_drag = false;
-				}
-			};
-			$(function() {
-				var css_string = '#vakata-dragged { display:block; margin:0 0 0 0; padding:4px 4px 4px 24px; position:absolute; top:-2000px; line-height:16px; z-index:10000; } ';
-				$.vakata.css.add_sheet({ str : css_string, title : "vakata" });
-			});
-			
-			$.jstree.plugin("dnd", {
-				__init : function () {
-					this.data.dnd = {
-						active : false,
-						after : false,
-						inside : false,
-						before : false,
-						off : false,
-						prepared : false,
-						w : 0,
-						to1 : false,
-						to2 : false,
-						cof : false,
-						cw : false,
-						ch : false,
-						i1 : false,
-						i2 : false,
-						mto : false
-					};
-					this.get_container()
-					.bind("mouseenter.jstree", $.proxy(function (e) {
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-							if(this.data.themes) {
-								m.attr("class", "jstree-" + this.data.themes.theme);
-								if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
-								$.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
-							}
-							//if($(e.currentTarget).find("> ul > li").length === 0) {
-								if(e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree
-									var tr = $.jstree._reference(e.target), dc;
-									if(tr.data.dnd.foreign) {
-										dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
-										if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {
-											$.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
-										}
-									}
-									else {
-										tr.prepare_move(o, tr.get_container(), "last");
-										if(tr.check_move()) {
-											$.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
-										}
-									}
-								}
-							}
-						}, this))
-						.bind("mouseup.jstree", $.proxy(function (e) {
-							//if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && $(e.currentTarget).find("> ul > li").length === 0) {
-								if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree
-									var tr = $.jstree._reference(e.currentTarget), dc;
-									if(tr.data.dnd.foreign) {
-										dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
-										if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {
-											tr._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
-										}
-									}
-									else {
-										tr.move_node(o, tr.get_container(), "last", e[tr._get_settings().dnd.copy_modifier + "Key"]);
-									}
-								}
-							}, this))
-							.bind("mouseleave.jstree", $.proxy(function (e) {
-								if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {
-									return false;
-								}
-								if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-									if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-									if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-									if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
-									if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
-									if($.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {
-										$.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
-									}
-								}
-							}, this))
-							.bind("mousemove.jstree", $.proxy(function (e) {
-								if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-									var cnt = this.get_container()[0];
-									
-									// Horizontal scroll
-									if(e.pageX + 24 > this.data.dnd.cof.left + this.data.dnd.cw) {
-										if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-										this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft += $.vakata.dnd.scroll_spd; }, cnt), 100);
-									}
-									else if(e.pageX - 24 < this.data.dnd.cof.left) {
-										if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-										this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft -= $.vakata.dnd.scroll_spd; }, cnt), 100);
-									}
-									else {
-										if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-									}
-									
-									// Vertical scroll
-									if(e.pageY + 24 > this.data.dnd.cof.top + this.data.dnd.ch) {
-										if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-										this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop += $.vakata.dnd.scroll_spd; }, cnt), 100);
-									}
-									else if(e.pageY - 24 < this.data.dnd.cof.top) {
-										if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-										this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop -= $.vakata.dnd.scroll_spd; }, cnt), 100);
-									}
-									else {
-										if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-									}
-									
-								}
-							}, this))
-							.bind("scroll.jstree", $.proxy(function (e) {
-								if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && m && ml) {
-									m.hide();
-									ml.hide();
-								}
-							}, this))
-							.delegate("a", "mousedown.jstree", $.proxy(function (e) {
-								if(e.which === 1) {
-									this.start_drag(e.currentTarget, e);
-									return false;
-								}
-							}, this))
-							.delegate("a", "mouseenter.jstree", $.proxy(function (e) {
-								if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-									this.dnd_enter(e.currentTarget);
-								}
-							}, this))
-							.delegate("a", "mousemove.jstree", $.proxy(function (e) {
-								if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-									if(!r || !r.length || r.children("a")[0] !== e.currentTarget) {
-										this.dnd_enter(e.currentTarget);
-									}
-									if(typeof this.data.dnd.off.top === "undefined") { this.data.dnd.off = $(e.target).offset(); }
-									this.data.dnd.w = (e.pageY - (this.data.dnd.off.top || 0)) % this.data.core.li_height;
-									if(this.data.dnd.w < 0) { this.data.dnd.w += this.data.core.li_height; }
-									this.dnd_show();
-								}
-							}, this))
-							.delegate("a", "mouseleave.jstree", $.proxy(function (e) {
-								if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-									if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {
-										return false;
-									}
-									if(m) { m.hide(); }
-									if(ml) { ml.hide(); }
-									/*
-									var ec = $(e.currentTarget).closest("li"),
-									er = $(e.relatedTarget).closest("li");
-									if(er[0] !== ec.prev()[0] && er[0] !== ec.next()[0]) {
-										if(m) { m.hide(); }
-										if(ml) { ml.hide(); }
-									}
-									*/
-									this.data.dnd.mto = setTimeout(
-									(function (t) { return function () { t.dnd_leave(e); }; })(this),
-									0);
-								}
-							}, this))
-							.delegate("a", "mouseup.jstree", $.proxy(function (e) {
-								if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-									this.dnd_finish(e);
-								}
-							}, this));
-							
-							$(document)
-							.bind("drag_stop.vakata", $.proxy(function () {
-								if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
-								if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
-								if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-								if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-								this.data.dnd.after		= false;
-								this.data.dnd.before	= false;
-								this.data.dnd.inside	= false;
-								this.data.dnd.off		= false;
-								this.data.dnd.prepared	= false;
-								this.data.dnd.w			= false;
-								this.data.dnd.to1		= false;
-								this.data.dnd.to2		= false;
-								this.data.dnd.i1		= false;
-								this.data.dnd.i2		= false;
-								this.data.dnd.active	= false;
-								this.data.dnd.foreign	= false;
-								if(m) { m.css({ "top" : "-2000px" }); }
-								if(ml) { ml.css({ "top" : "-2000px" }); }
-							}, this))
-							.bind("drag_start.vakata", $.proxy(function (e, data) {
-								if(data.data.jstree) {
-									var et = $(data.event.target);
-									if(et.closest(".jstree").hasClass("jstree-" + this.get_index())) {
-										this.dnd_enter(et);
-									}
-								}
-							}, this));
-							/*
-							.bind("keydown.jstree-" + this.get_index() + " keyup.jstree-" + this.get_index(), $.proxy(function(e) {
-								if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && !this.data.dnd.foreign) {
-									var h = $.vakata.dnd.helper.children("ins");
-									if(e[this._get_settings().dnd.copy_modifier + "Key"] && h.hasClass("jstree-ok")) {
-										h.parent().html(h.parent().html().replace(/ \(Copy\)$/, "") + " (Copy)");
-									}
-									else {
-										h.parent().html(h.parent().html().replace(/ \(Copy\)$/, ""));
-									}
-								}
-							}, this)); */
-							
-							
-							
-							var s = this._get_settings().dnd;
-							if(s.drag_target) {
-								$(document)
-								.delegate(s.drag_target, "mousedown.jstree-" + this.get_index(), $.proxy(function (e) {
-									o = e.target;
-									$.vakata.dnd.drag_start(e, { jstree : true, obj : e.target }, "<ins class='jstree-icon'></ins>" + $(e.target).text() );
-									if(this.data.themes) {
-										if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }
-										if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
-										$.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
-									}
-									$.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
-									var cnt = this.get_container();
-									this.data.dnd.cof = cnt.offset();
-									this.data.dnd.cw = parseInt(cnt.width(),10);
-									this.data.dnd.ch = parseInt(cnt.height(),10);
-									this.data.dnd.foreign = true;
-									e.preventDefault();
-								}, this));
-							}
-							if(s.drop_target) {
-								$(document)
-								.delegate(s.drop_target, "mouseenter.jstree-" + this.get_index(), $.proxy(function (e) {
-									if(this.data.dnd.active && this._get_settings().dnd.drop_check.call(this, { "o" : o, "r" : $(e.target), "e" : e })) {
-									$.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
-								}
-							}, this))
-							.delegate(s.drop_target, "mouseleave.jstree-" + this.get_index(), $.proxy(function (e) {
-								if(this.data.dnd.active) {
-									$.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
-								}
-							}, this))
-							.delegate(s.drop_target, "mouseup.jstree-" + this.get_index(), $.proxy(function (e) {
-								if(this.data.dnd.active && $.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {
-									this._get_settings().dnd.drop_finish.call(this, { "o" : o, "r" : $(e.target), "e" : e });
-								}
-							}, this));
-						}
-					},
-					defaults : {
-						copy_modifier	: "ctrl",
-						check_timeout	: 100,
-						open_timeout	: 500,
-						drop_target		: ".jstree-drop",
-						drop_check		: function (data) { return true; },
-						drop_finish		: $.noop,
-						drag_target		: ".jstree-draggable",
-						drag_finish		: $.noop,
-						drag_check		: function (data) { return { after : false, before : false, inside : true }; }
-					},
-					_fn : {
-						dnd_prepare : function () {
-							if(!r || !r.length) { return; }
-							this.data.dnd.off = r.offset();
-							if(this._get_settings().core.rtl) {
-								this.data.dnd.off.right = this.data.dnd.off.left + r.width();
-							}
-							if(this.data.dnd.foreign) {
-								var a = this._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : r });
-								this.data.dnd.after = a.after;
-								this.data.dnd.before = a.before;
-								this.data.dnd.inside = a.inside;
-								this.data.dnd.prepared = true;
-								return this.dnd_show();
-							}
-							this.prepare_move(o, r, "before");
-							this.data.dnd.before = this.check_move();
-							this.prepare_move(o, r, "after");
-							this.data.dnd.after = this.check_move();
-							if(this._is_loaded(r)) {
-								this.prepare_move(o, r, "inside");
-								this.data.dnd.inside = this.check_move();
-							}
-							else {
-								this.data.dnd.inside = false;
-							}
-							this.data.dnd.prepared = true;
-							return this.dnd_show();
-						},
-						dnd_show : function () {
-							if(!this.data.dnd.prepared) { return; }
-							var o = ["before","inside","after"],
-							r = false,
-							rtl = this._get_settings().core.rtl,
-							pos;
-							if(this.data.dnd.w < this.data.core.li_height/3) { o = ["before","inside","after"]; }
-							else if(this.data.dnd.w <= this.data.core.li_height*2/3) {
-								o = this.data.dnd.w < this.data.core.li_height/2 ? ["inside","before","after"] : ["inside","after","before"];
-							}
-							else { o = ["after","inside","before"]; }
-							$.each(o, $.proxy(function (i, val) {
-								if(this.data.dnd[val]) {
-									$.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
-									r = val;
-									return false;
-								}
-							}, this));
-							if(r === false) { $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); }
-							
-							pos = rtl ? (this.data.dnd.off.right - 18) : (this.data.dnd.off.left + 10);
-							switch(r) {
-								case "before":
-								m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top - 6) + "px" }).show();
-								if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top - 1) + "px" }).show(); }
-								break;
-								case "after":
-								m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 6) + "px" }).show();
-								if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 1) + "px" }).show(); }
-								break;
-								case "inside":
-								m.css({ "left" : pos + ( rtl ? -4 : 4) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height/2 - 5) + "px" }).show();
-								if(ml) { ml.hide(); }
-								break;
-								default:
-								m.hide();
-								if(ml) { ml.hide(); }
-								break;
-							}
-							last_pos = r;
-							return r;
-						},
-						dnd_open : function () {
-							this.data.dnd.to2 = false;
-							this.open_node(r, $.proxy(this.dnd_prepare,this), true);
-						},
-						dnd_finish : function (e) {
-							if(this.data.dnd.foreign) {
-								if(this.data.dnd.after || this.data.dnd.before || this.data.dnd.inside) {
-									this._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : r, "p" : last_pos });
-								}
-							}
-							else {
-								this.dnd_prepare();
-								this.move_node(o, r, last_pos, e[this._get_settings().dnd.copy_modifier + "Key"]);
-							}
-							o = false;
-							r = false;
-							m.hide();
-							if(ml) { ml.hide(); }
-						},
-						dnd_enter : function (obj) {
-							if(this.data.dnd.mto) {
-								clearTimeout(this.data.dnd.mto);
-								this.data.dnd.mto = false;
-							}
-							var s = this._get_settings().dnd;
-							this.data.dnd.prepared = false;
-							r = this._get_node(obj);
-							if(s.check_timeout) {
-								// do the calculations after a minimal timeout (users tend to drag quickly to the desired location)
-								if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
-								this.data.dnd.to1 = setTimeout($.proxy(this.dnd_prepare, this), s.check_timeout);
-							}
-							else {
-								this.dnd_prepare();
-							}
-							if(s.open_timeout) {
-								if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
-								if(r && r.length && r.hasClass("jstree-closed")) {
-									// if the node is closed - open it, then recalculate
-									this.data.dnd.to2 = setTimeout($.proxy(this.dnd_open, this), s.open_timeout);
-								}
-							}
-							else {
-								if(r && r.length && r.hasClass("jstree-closed")) {
-									this.dnd_open();
-								}
-							}
-						},
-						dnd_leave : function (e) {
-							this.data.dnd.after		= false;
-							this.data.dnd.before	= false;
-							this.data.dnd.inside	= false;
-							$.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
-							m.hide();
-							if(ml) { ml.hide(); }
-							if(r && r[0] === e.target.parentNode) {
-								if(this.data.dnd.to1) {
-									clearTimeout(this.data.dnd.to1);
-									this.data.dnd.to1 = false;
-								}
-								if(this.data.dnd.to2) {
-									clearTimeout(this.data.dnd.to2);
-									this.data.dnd.to2 = false;
-								}
-							}
-						},
-						start_drag : function (obj, e) {
-							o = this._get_node(obj);
-							if(this.data.ui && this.is_selected(o)) { o = this._get_node(null, true); }
-							var dt = o.length > 1 ? this._get_string("multiple_selection") : this.get_text(o),
-							cnt = this.get_container();
-							if(!this._get_settings().core.html_titles) { dt = dt.replace(/</ig,"&lt;").replace(/>/ig,"&gt;"); }
-							$.vakata.dnd.drag_start(e, { jstree : true, obj : o }, "<ins class='jstree-icon'></ins>" + dt );
-							if(this.data.themes) {
-								if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }
-								if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
-								$.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
-							}
-							this.data.dnd.cof = cnt.offset();
-							this.data.dnd.cw = parseInt(cnt.width(),10);
-							this.data.dnd.ch = parseInt(cnt.height(),10);
-							this.data.dnd.active = true;
-						}
-					}
-				});
-				$(function() {
-					var css_string = '' +
-					'#vakata-dragged ins { display:block; text-decoration:none; width:16px; height:16px; margin:0 0 0 0; padding:0; position:absolute; top:4px; left:4px; ' +
-						' -moz-border-radius:4px; border-radius:4px; -webkit-border-radius:4px; ' +
-					'} ' +
-					'#vakata-dragged .jstree-ok { background:green; } ' +
-					'#vakata-dragged .jstree-invalid { background:red; } ' +
-					'#jstree-marker { padding:0; margin:0; font-size:12px; overflow:hidden; height:12px; width:8px; position:absolute; top:-30px; z-index:10001; background-repeat:no-repeat; display:none; background-color:transparent; text-shadow:1px 1px 1px white; color:black; line-height:10px; } ' +
-					'#jstree-marker-line { padding:0; margin:0; line-height:0%; font-size:1px; overflow:hidden; height:1px; width:100px; position:absolute; top:-30px; z-index:10000; background-repeat:no-repeat; display:none; background-color:#456c43; ' +
-						' cursor:pointer; border:1px solid #eeeeee; border-left:0; -moz-box-shadow: 0px 0px 2px #666; -webkit-box-shadow: 0px 0px 2px #666; box-shadow: 0px 0px 2px #666; ' +
-						' -moz-border-radius:1px; border-radius:1px; -webkit-border-radius:1px; ' +
-					'}' +
-					'';
-					$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-					m = $("<div />").attr({ id : "jstree-marker" }).hide().html("&raquo;")
-					.bind("mouseleave mouseenter", function (e) {
-						m.hide();
-						ml.hide();
-						e.preventDefault();
-						e.stopImmediatePropagation();
-						return false;
-					})
-					.appendTo("body");
-					ml = $("<div />").attr({ id : "jstree-marker-line" }).hide()
-					.bind("mouseup", function (e) {
-						if(r && r.length) {
-							r.children("a").trigger(e);
-							e.preventDefault();
-							e.stopImmediatePropagation();
-							return false;
-						}
-					})
-					.bind("mouseleave", function (e) {
-						var rt = $(e.relatedTarget);
-						if(rt.is(".jstree") || rt.closest(".jstree").length === 0) {
-							if(r && r.length) {
-								r.children("a").trigger(e);
-								m.hide();
-								ml.hide();
-								e.preventDefault();
-								e.stopImmediatePropagation();
-								return false;
-							}
-						}
-					})
-					.appendTo("body");
-					$(document).bind("drag_start.vakata", function (e, data) {
-						if(data.data.jstree) { m.show(); if(ml) { ml.show(); } }
-					});
-					$(document).bind("drag_stop.vakata", function (e, data) {
-						if(data.data.jstree) { m.hide(); if(ml) { ml.hide(); } }
-					});
-				});
-			})(jQuery);
-			//*/
-			
-			/*
-			* jsTree checkbox plugin
-			* Inserts checkboxes in front of every node
-			* Depends on the ui plugin
-			* DOES NOT WORK NICELY WITH MULTITREE DRAG'N'DROP
-			*/
-			(function ($) {
-				$.jstree.plugin("checkbox", {
-					__init : function () {
-						this.data.checkbox.noui = this._get_settings().checkbox.override_ui;
-						if(this.data.ui && this.data.checkbox.noui) {
-							this.select_node = this.deselect_node = this.deselect_all = $.noop;
-							this.get_selected = this.get_checked;
-						}
-						
-						this.get_container()
-						.bind("open_node.jstree create_node.jstree clean_node.jstree refresh.jstree", $.proxy(function (e, data) {
-							this._prepare_checkboxes(data.rslt.obj);
-						}, this))
-						.bind("loaded.jstree", $.proxy(function (e) {
-							this._prepare_checkboxes();
-						}, this))
-						.delegate( (this.data.ui && this.data.checkbox.noui ? "a" : "ins.jstree-checkbox") , "click.jstree", $.proxy(function (e) {
-							e.preventDefault();
-							if(this._get_node(e.target).hasClass("jstree-checked")) { this.uncheck_node(e.target); }
-							else { this.check_node(e.target); }
-							if(this.data.ui && this.data.checkbox.noui) {
-								this.save_selected();
-								if(this.data.cookies) { this.save_cookie("select_node"); }
-							}
-							else {
-								e.stopImmediatePropagation();
-								return false;
-							}
-						}, this));
-					},
-					defaults : {
-						override_ui : false,
-						two_state : false,
-						real_checkboxes : false,
-						checked_parent_open : true,
-						real_checkboxes_names : function (n) { return [ ("check_" + (n[0].id || Math.ceil(Math.random() * 10000))) , 1]; }
-					},
-					__destroy : function () {
-						this.get_container()
-						.find("input.jstree-real-checkbox").removeClass("jstree-real-checkbox").end()
-						.find("ins.jstree-checkbox").remove();
-					},
-					_fn : {
-						_checkbox_notify : function (n, data) {
-							if(data.checked) {
-								this.check_node(n, false);
-							}
-						},
-						_prepare_checkboxes : function (obj) {
-							obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);
-							if(obj === false) { return; } // added for removing root nodes
-							var c, _this = this, t, ts = this._get_settings().checkbox.two_state, rc = this._get_settings().checkbox.real_checkboxes, rcn = this._get_settings().checkbox.real_checkboxes_names;
-							obj.each(function () {
-								t = $(this);
-								c = t.is("li") && (t.hasClass("jstree-checked") || (rc && t.children(":checked").length)) ? "jstree-checked" : "jstree-unchecked";
-								t.find("li").addBack().each(function () {
-									var $t = $(this), nm;
-									$t.children("a" + (_this.data.languages ? "" : ":eq(0)") ).not(":has(.jstree-checkbox)").prepend("<ins class='jstree-checkbox'>&#160;</ins>").parent().not(".jstree-checked, .jstree-unchecked").addClass( ts ? "jstree-unchecked" : c );
-									if(rc) {
-										if(!$t.children(":checkbox").length) {
-											nm = rcn.call(_this, $t);
-											$t.prepend("<input type='checkbox' class='jstree-real-checkbox' id='" + nm[0] + "' name='" + nm[0] + "' value='" + nm[1] + "' />");
-										}
-										else {
-											$t.children(":checkbox").addClass("jstree-real-checkbox");
-										}
-									}
-									if(!ts) {
-										if(c === "jstree-checked" || $t.hasClass("jstree-checked") || $t.children(':checked').length) {
-											$t.find("li").addBack().addClass("jstree-checked").children(":checkbox").prop("checked", true);
-										}
-									}
-									else {
-										if($t.hasClass("jstree-checked") || $t.children(':checked').length) {
-											$t.addClass("jstree-checked").children(":checkbox").prop("checked", true);
-										}
-									}
-								});
-							});
-							if(!ts) {
-								obj.find(".jstree-checked").parent().parent().each(function () { _this._repair_state(this); });
-							}
-						},
-						change_state : function (obj, state) {
-							obj = this._get_node(obj);
-							var coll = false, rc = this._get_settings().checkbox.real_checkboxes;
-							if(!obj || obj === -1) { return false; }
-							state = (state === false || state === true) ? state : obj.hasClass("jstree-checked");
-							if(this._get_settings().checkbox.two_state) {
-								if(state) {
-									obj.removeClass("jstree-checked").addClass("jstree-unchecked");
-									if(rc) { obj.children(":checkbox").prop("checked", false); }
-								}
-								else {
-									obj.removeClass("jstree-unchecked").addClass("jstree-checked");
-									if(rc) { obj.children(":checkbox").prop("checked", true); }
-								}
-							}
-							else {
-								if(state) {
-									coll = obj.find("li").addBack();
-									if(!coll.filter(".jstree-checked, .jstree-undetermined").length) { return false; }
-									coll.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");
-									if(rc) { coll.children(":checkbox").prop("checked", false); }
-								}
-								else {
-									coll = obj.find("li").addBack();
-									if(!coll.filter(".jstree-unchecked, .jstree-undetermined").length) { return false; }
-									coll.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");
-									if(rc) { coll.children(":checkbox").prop("checked", true); }
-									if(this.data.ui) { this.data.ui.last_selected = obj; }
-									this.data.checkbox.last_selected = obj;
-								}
-								obj.parentsUntil(".jstree", "li").each(function () {
-									var $this = $(this);
-									if(state) {
-										if($this.children("ul").children("li.jstree-checked, li.jstree-undetermined").length) {
-											$this.parentsUntil(".jstree", "li").addBack().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
-											if(rc) { $this.parentsUntil(".jstree", "li").addBack().children(":checkbox").prop("checked", false); }
-											return false;
-										}
-										else {
-											$this.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");
-											if(rc) { $this.children(":checkbox").prop("checked", false); }
-										}
-									}
-									else {
-										if($this.children("ul").children("li.jstree-unchecked, li.jstree-undetermined").length) {
-											$this.parentsUntil(".jstree", "li").addBack().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
-											if(rc) { $this.parentsUntil(".jstree", "li").addBack().children(":checkbox").prop("checked", false); }
-											return false;
-										}
-										else {
-											$this.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");
-											if(rc) { $this.children(":checkbox").prop("checked", true); }
-										}
-									}
-								});
-							}
-							if(this.data.ui && this.data.checkbox.noui) { this.data.ui.selected = this.get_checked(); }
-							this.__callback(obj);
-							return true;
-						},
-						check_node : function (obj) {
-							if(this.change_state(obj, false)) {
-								obj = this._get_node(obj);
-								if(this._get_settings().checkbox.checked_parent_open) {
-									var t = this;
-									obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });
-								}
-								this.__callback({ "obj" : obj });
-							}
-						},
-						uncheck_node : function (obj) {
-							if(this.change_state(obj, true)) { this.__callback({ "obj" : this._get_node(obj) }); }
-						},
-						check_all : function () {
-							var _this = this,
-							coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");
-							coll.each(function () {
-								_this.change_state(this, false);
-							});
-							this.__callback();
-						},
-						uncheck_all : function () {
-							var _this = this,
-							coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");
-							coll.each(function () {
-								_this.change_state(this, true);
-							});
-							this.__callback();
-						},
-						
-						is_checked : function(obj) {
-							obj = this._get_node(obj);
-							return obj.length ? obj.is(".jstree-checked") : false;
-						},
-						get_checked : function (obj, get_all) {
-							obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
-							return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-checked") : obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked");
-						},
-						get_unchecked : function (obj, get_all) {
-							obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
-							return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-unchecked") : obj.find("> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked");
-						},
-						
-						show_checkboxes : function () { this.get_container().children("ul").removeClass("jstree-no-checkboxes"); },
-						hide_checkboxes : function () { this.get_container().children("ul").addClass("jstree-no-checkboxes"); },
-						
-						_repair_state : function (obj) {
-							obj = this._get_node(obj);
-							if(!obj.length) { return; }
-							if(this._get_settings().checkbox.two_state) {
-								obj.find('li').addBack().not('.jstree-checked').removeClass('jstree-undetermined').addClass('jstree-unchecked').children(':checkbox').prop('checked', true);
-								return;
-							}
-							var rc = this._get_settings().checkbox.real_checkboxes,
-							a = obj.find("> ul > .jstree-checked").length,
-							b = obj.find("> ul > .jstree-undetermined").length,
-							c = obj.find("> ul > li").length;
-							if(c === 0) { if(obj.hasClass("jstree-undetermined")) { this.change_state(obj, false); } }
-							else if(a === 0 && b === 0) { this.change_state(obj, true); }
-							else if(a === c) { this.change_state(obj, false); }
-							else {
-								obj.parentsUntil(".jstree","li").addBack().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
-								if(rc) { obj.parentsUntil(".jstree", "li").addBack().children(":checkbox").prop("checked", false); }
-							}
-						},
-						reselect : function () {
-							if(this.data.ui && this.data.checkbox.noui) {
-								var _this = this,
-								s = this.data.ui.to_select;
-								s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
-								this.deselect_all();
-								$.each(s, function (i, val) { _this.check_node(val); });
-								this.__callback();
-							}
-							else {
-								this.__call_old();
-							}
-						},
-						save_loaded : function () {
-							var _this = this;
-							this.data.core.to_load = [];
-							this.get_container_ul().find("li.jstree-closed.jstree-undetermined").each(function () {
-								if(this.id) { _this.data.core.to_load.push("#" + this.id); }
-							});
-						}
-					}
-				});
-				$(function() {
-					var css_string = '.jstree .jstree-real-checkbox { display:none; } ';
-					$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-				});
-			})(jQuery);
-			//*/
-			
-			/*
-			* jsTree XML plugin
-			* The XML data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
-			*/
-			(function ($) {
-				$.vakata.xslt = function (xml, xsl, callback) {
-					var r = false, p, q, s;
-					// IE9
-					if(r === false && window.ActiveXObject) {
-						try {
-							r = new ActiveXObject("Msxml2.XSLTemplate");
-							q = new ActiveXObject("Msxml2.DOMDocument");
-							q.loadXML(xml);
-							s = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
-							s.loadXML(xsl);
-							r.stylesheet = s;
-							p = r.createProcessor();
-							p.input = q;
-							p.transform();
-							r = p.output;
-						}
-						catch (e) { }
-					}
-					xml = $.parseXML(xml);
-					xsl = $.parseXML(xsl);
-					// FF, Chrome
-					if(r === false && typeof (XSLTProcessor) !== "undefined") {
-						p = new XSLTProcessor();
-						p.importStylesheet(xsl);
-						r = p.transformToFragment(xml, document);
-						r = $('<div />').append(r).html();
-					}
-					// OLD IE
-					if(r === false && typeof (xml.transformNode) !== "undefined") {
-						r = xml.transformNode(xsl);
-					}
-					callback.call(null, r);
-				};
-				var xsl = {
-					'nest' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
-					'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
-					'<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/html" />' +
-					'<xsl:template match="/">' +
-					'	<xsl:call-template name="nodes">' +
-					'		<xsl:with-param name="node" select="/root" />' +
-					'	</xsl:call-template>' +
-					'</xsl:template>' +
-					'<xsl:template name="nodes">' +
-					'	<xsl:param name="node" />' +
-					'	<ul>' +
-					'	<xsl:for-each select="$node/item">' +
-					'		<xsl:variable name="children" select="count(./item) &gt; 0" />' +
-					'		<li>' +
-					'			<xsl:attribute name="class">' +
-					'				<xsl:if test="position() = last()">jstree-last </xsl:if>' +
-					'				<xsl:choose>' +
-					'					<xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
-					'					<xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
-					'					<xsl:otherwise>jstree-leaf </xsl:otherwise>' +
-					'				</xsl:choose>' +
-					'				<xsl:value-of select="@class" />' +
-					'			</xsl:attribute>' +
-					'			<xsl:for-each select="@*">' +
-					'				<xsl:if test="name() != \'class\' and name() != \'state\' and name() != \'hasChildren\'">' +
-					'					<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
-					'				</xsl:if>' +
-					'			</xsl:for-each>' +
-					'	<ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' +
-					'			<xsl:for-each select="content/name">' +
-					'				<a>' +
-					'				<xsl:attribute name="href">' +
-					'					<xsl:choose>' +
-					'					<xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
-					'					<xsl:otherwise>#</xsl:otherwise>' +
-					'					</xsl:choose>' +
-					'				</xsl:attribute>' +
-					'				<xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
-					'				<xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
-					'				<xsl:for-each select="@*">' +
-					'					<xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
-					'						<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
-					'					</xsl:if>' +
-					'				</xsl:for-each>' +
-					'					<ins>' +
-					'						<xsl:attribute name="class">jstree-icon ' +
-					'							<xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
-					'						</xsl:attribute>' +
-					'						<xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
-					'						<xsl:text>&#xa0;</xsl:text>' +
-					'					</ins>' +
-					'					<xsl:copy-of select="./child::node()" />' +
-					'				</a>' +
-					'			</xsl:for-each>' +
-					'			<xsl:if test="$children or @hasChildren"><xsl:call-template name="nodes"><xsl:with-param name="node" select="current()" /></xsl:call-template></xsl:if>' +
-					'		</li>' +
-					'	</xsl:for-each>' +
-					'	</ul>' +
-					'</xsl:template>' +
-					'</xsl:stylesheet>',
-					
-					'flat' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
-					'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' +
-					'<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/xml" />' +
-					'<xsl:template match="/">' +
-					'	<ul>' +
-					'	<xsl:for-each select="//item[not(@parent_id) or @parent_id=0 or not(@parent_id = //item/@id)]">' + /* the last `or` may be removed */
-					'		<xsl:call-template name="nodes">' +
-					'			<xsl:with-param name="node" select="." />' +
-					'			<xsl:with-param name="is_last" select="number(position() = last())" />' +
-					'		</xsl:call-template>' +
-					'	</xsl:for-each>' +
-					'	</ul>' +
-					'</xsl:template>' +
-					'<xsl:template name="nodes">' +
-					'	<xsl:param name="node" />' +
-					'	<xsl:param name="is_last" />' +
-					'	<xsl:variable name="children" select="count(//item[@parent_id=$node/attribute::id]) &gt; 0" />' +
-					'	<li>' +
-					'	<xsl:attribute name="class">' +
-					'		<xsl:if test="$is_last = true()">jstree-last </xsl:if>' +
-					'		<xsl:choose>' +
-					'			<xsl:when test="@state = \'open\'">jstree-open </xsl:when>' +
-					'			<xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' +
-					'			<xsl:otherwise>jstree-leaf </xsl:otherwise>' +
-					'		</xsl:choose>' +
-					'		<xsl:value-of select="@class" />' +
-					'	</xsl:attribute>' +
-					'	<xsl:for-each select="@*">' +
-					'		<xsl:if test="name() != \'parent_id\' and name() != \'hasChildren\' and name() != \'class\' and name() != \'state\'">' +
-					'		<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
-					'		</xsl:if>' +
-					'	</xsl:for-each>' +
-					'	<ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' +
-					'	<xsl:for-each select="content/name">' +
-					'		<a>' +
-					'		<xsl:attribute name="href">' +
-					'			<xsl:choose>' +
-					'			<xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' +
-					'			<xsl:otherwise>#</xsl:otherwise>' +
-					'			</xsl:choose>' +
-					'		</xsl:attribute>' +
-					'		<xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' +
-					'		<xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' +
-					'		<xsl:for-each select="@*">' +
-					'			<xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' +
-					'				<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' +
-					'			</xsl:if>' +
-					'		</xsl:for-each>' +
-					'			<ins>' +
-					'				<xsl:attribute name="class">jstree-icon ' +
-					'					<xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' +
-					'				</xsl:attribute>' +
-					'				<xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' +
-					'				<xsl:text>&#xa0;</xsl:text>' +
-					'			</ins>' +
-					'			<xsl:copy-of select="./child::node()" />' +
-					'		</a>' +
-					'	</xsl:for-each>' +
-					'	<xsl:if test="$children">' +
-					'		<ul>' +
-					'		<xsl:for-each select="//item[@parent_id=$node/attribute::id]">' +
-					'			<xsl:call-template name="nodes">' +
-					'				<xsl:with-param name="node" select="." />' +
-					'				<xsl:with-param name="is_last" select="number(position() = last())" />' +
-					'			</xsl:call-template>' +
-					'		</xsl:for-each>' +
-					'		</ul>' +
-					'	</xsl:if>' +
-					'	</li>' +
-					'</xsl:template>' +
-					'</xsl:stylesheet>'
-				},
-				escape_xml = function(string) {
-					return string
-					.toString()
-					.replace(/&/g, '&amp;')
-					.replace(/</g, '&lt;')
-					.replace(/>/g, '&gt;')
-					.replace(/"/g, '&quot;')
-					.replace(/'/g, '&apos;');
-				};
-				$.jstree.plugin("xml_data", {
-					defaults : {
-						data : false,
-						ajax : false,
-						xsl : "flat",
-						clean_node : false,
-						correct_state : true,
-						get_skip_empty : false,
-						get_include_preamble : true
-					},
-					_fn : {
-						load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_xml(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
-						_is_loaded : function (obj) {
-							var s = this._get_settings().xml_data;
-							obj = this._get_node(obj);
-							return obj == -1 || !obj || (!s.ajax && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
-						},
-						load_node_xml : function (obj, s_call, e_call) {
-							var s = this.get_settings().xml_data,
-							error_func = function () {},
-							success_func = function () {};
-							
-							obj = this._get_node(obj);
-							if(obj && obj !== -1) {
-								if(obj.data("jstree_is_loading")) { return; }
-								else { obj.data("jstree_is_loading",true); }
-							}
-							switch(!0) {
-								case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
-								case ($.isFunction(s.data)):
-								s.data.call(this, obj, $.proxy(function (d) {
-									this.parse_xml(d, $.proxy(function (d) {
-										if(d) {
-											d = d.replace(/ ?xmlns="[^"]*"/ig, "");
-											if(d.length > 10) {
-												d = $(d);
-												if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
-												else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree_is_loading"); }
-												if(s.clean_node) { this.clean_node(obj); }
-												if(s_call) { s_call.call(this); }
-											}
-											else {
-												if(obj && obj !== -1) {
-													obj.children("a.jstree-loading").removeClass("jstree-loading");
-													obj.removeData("jstree_is_loading");
-													if(s.correct_state) {
-														this.correct_state(obj);
-														if(s_call) { s_call.call(this); }
-													}
-												}
-												else {
-													if(s.correct_state) {
-														this.get_container().children("ul").empty();
-														if(s_call) { s_call.call(this); }
-													}
-												}
-											}
-										}
-									}, this));
-								}, this));
-								break;
-								case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
-								if(!obj || obj == -1) {
-									this.parse_xml(s.data, $.proxy(function (d) {
-										if(d) {
-											d = d.replace(/ ?xmlns="[^"]*"/ig, "");
-											if(d.length > 10) {
-												d = $(d);
-												this.get_container().children("ul").empty().append(d.children());
-												if(s.clean_node) { this.clean_node(obj); }
-												if(s_call) { s_call.call(this); }
-											}
-										}
-										else {
-											if(s.correct_state) {
-												this.get_container().children("ul").empty();
-												if(s_call) { s_call.call(this); }
-											}
-										}
-									}, this));
-								}
-								break;
-								case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
-								error_func = function (x, t, e) {
-									var ef = this.get_settings().xml_data.ajax.error;
-									if(ef) { ef.call(this, x, t, e); }
-									if(obj !== -1 && obj.length) {
-										obj.children("a.jstree-loading").removeClass("jstree-loading");
-										obj.removeData("jstree_is_loading");
-										if(t === "success" && s.correct_state) { this.correct_state(obj); }
-									}
-									else {
-										if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
-									}
-									if(e_call) { e_call.call(this); }
-								};
-								success_func = function (d, t, x) {
-									d = x.responseText;
-									var sf = this.get_settings().xml_data.ajax.success;
-									if(sf) { d = sf.call(this,d,t,x) || d; }
-									if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {
-										return error_func.call(this, x, t, "");
-									}
-									this.parse_xml(d, $.proxy(function (d) {
-										if(d) {
-											d = d.replace(/ ?xmlns="[^"]*"/ig, "");
-											if(d.length > 10) {
-												d = $(d);
-												if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
-												else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree_is_loading"); }
-												if(s.clean_node) { this.clean_node(obj); }
-												if(s_call) { s_call.call(this); }
-											}
-											else {
-												if(obj && obj !== -1) {
-													obj.children("a.jstree-loading").removeClass("jstree-loading");
-													obj.removeData("jstree_is_loading");
-													if(s.correct_state) {
-														this.correct_state(obj);
-														if(s_call) { s_call.call(this); }
-													}
-												}
-												else {
-													if(s.correct_state) {
-														this.get_container().children("ul").empty();
-														if(s_call) { s_call.call(this); }
-													}
-												}
-											}
-										}
-									}, this));
-								};
-								s.ajax.context = this;
-								s.ajax.error = error_func;
-								s.ajax.success = success_func;
-								if(!s.ajax.dataType) { s.ajax.dataType = "xml"; }
-								if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
-								if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
-								$.ajax(s.ajax);
-								break;
-							}
-						},
-						parse_xml : function (xml, callback) {
-							var s = this._get_settings().xml_data;
-							$.vakata.xslt(xml, xsl[s.xsl], callback);
-						},
-						get_xml : function (tp, obj, li_attr, a_attr, is_callback) {
-							var result = "",
-							s = this._get_settings(),
-							_this = this,
-							tmp1, tmp2, li, a, lang;
-							if(!tp) { tp = "flat"; }
-							if(!is_callback) { is_callback = 0; }
-							obj = this._get_node(obj);
-							if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
-							li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
-							if(!is_callback && this.data.types && $.inArray(s.types.type_attr, li_attr) === -1) { li_attr.push(s.types.type_attr); }
-							
-							a_attr = $.isArray(a_attr) ? a_attr : [ ];
-							
-							if(!is_callback) {
-								if(s.xml_data.get_include_preamble) {
-									result += '<' + '?xml version="1.0" encoding="UTF-8"?' + '>';
-								}
-								result += "<root>";
-							}
-							obj.each(function () {
-								result += "<item";
-								li = $(this);
-								$.each(li_attr, function (i, v) {
-									var t = li.attr(v);
-									if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {
-										result += " " + v + "=\"" + escape_xml((" " + (t || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\"";
-									}
-								});
-								if(li.hasClass("jstree-open")) { result += " state=\"open\""; }
-								if(li.hasClass("jstree-closed")) { result += " state=\"closed\""; }
-								if(tp === "flat") { result += " parent_id=\"" + escape_xml(is_callback) + "\""; }
-								result += ">";
-								result += "<content>";
-								a = li.children("a");
-								a.each(function () {
-									tmp1 = $(this);
-									lang = false;
-									result += "<name";
-									if($.inArray("languages", s.plugins) !== -1) {
-										$.each(s.languages, function (k, z) {
-											if(tmp1.hasClass(z)) { result += " lang=\"" + escape_xml(z) + "\""; lang = z; return false; }
-										});
-									}
-									if(a_attr.length) {
-										$.each(a_attr, function (k, z) {
-											var t = tmp1.attr(z);
-											if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {
-												result += " " + z + "=\"" + escape_xml((" " + t || "").replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\"";
-											}
-										});
-									}
-									if(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
-										result += ' icon="' + escape_xml(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + '"';
-									}
-									if(tmp1.children("ins").get(0).style.backgroundImage.length) {
-										result += ' icon="' + escape_xml(tmp1.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","").replace(/'/ig,"").replace(/"/ig,"")) + '"';
-									}
-									result += ">";
-									result += "<![CDATA[" + _this.get_text(tmp1, lang) + "]]>";
-									result += "</name>";
-								});
-								result += "</content>";
-								tmp2 = li[0].id || true;
-								li = li.find("> ul > li");
-								if(li.length) { tmp2 = _this.get_xml(tp, li, li_attr, a_attr, tmp2); }
-								else { tmp2 = ""; }
-								if(tp == "nest") { result += tmp2; }
-								result += "</item>";
-								if(tp == "flat") { result += tmp2; }
-							});
-							if(!is_callback) { result += "</root>"; }
-							return result;
-						}
-					}
-				});
-			})(jQuery);
-			//*/
-			
-			/*
-			* jsTree search plugin
-			* Enables both sync and async search on the tree
-			* DOES NOT WORK WITH JSON PROGRESSIVE RENDER
-			*/
-			(function ($) {
-				if($().jquery.split('.')[1] >= 8) {
-					$.expr[':'].jstree_contains = $.expr.createPseudo(function(search) {
-						return function(a) {
-							return (a.textContent || a.innerText || "").toLowerCase().indexOf(search.toLowerCase())>=0;
-						};
-					});
-					$.expr[':'].jstree_title_contains = $.expr.createPseudo(function(search) {
-						return function(a) {
-							return (a.getAttribute("title") || "").toLowerCase().indexOf(search.toLowerCase())>=0;
-						};
-					});
-				}
-				else {
-					$.expr[':'].jstree_contains = function(a,i,m){
-						return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
-					};
-					$.expr[':'].jstree_title_contains = function(a,i,m) {
-						return (a.getAttribute("title") || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
-					};
-				}
-				$.jstree.plugin("search", {
-					__init : function () {
-						this.data.search.str = "";
-						this.data.search.result = $();
-						if(this._get_settings().search.show_only_matches) {
-							this.get_container()
-							.bind("search.jstree", function (e, data) {
-								$(this).children("ul").find("li").hide().removeClass("jstree-last");
-								data.rslt.nodes.parentsUntil(".jstree").addBack().show()
-								.filter("ul").each(function () { $(this).children("li:visible").eq(-1).addClass("jstree-last"); });
-							})
-							.bind("clear_search.jstree", function () {
-								$(this).children("ul").find("li").css("display","").end().end().jstree("clean_node", -1);
-							});
-						}
-					},
-					defaults : {
-						ajax : false,
-						search_method : "jstree_contains", // for case insensitive - jstree_contains
-						show_only_matches : false
-					},
-					_fn : {
-						search : function (str, skip_async) {
-							if($.trim(str) === "") { this.clear_search(); return; }
-							var s = this.get_settings().search,
-							t = this,
-							error_func = function () { },
-							success_func = function () { };
-							this.data.search.str = str;
-							
-							if(!skip_async && s.ajax !== false && this.get_container_ul().find("li.jstree-closed:not(:has(ul)):eq(0)").length > 0) {
-								this.search.supress_callback = true;
-								error_func = function () { };
-								success_func = function (d, t, x) {
-									var sf = this.get_settings().search.ajax.success;
-									if(sf) { d = sf.call(this,d,t,x) || d; }
-									this.data.search.to_open = d;
-									this._search_open();
-								};
-								s.ajax.context = this;
-								s.ajax.error = error_func;
-								s.ajax.success = success_func;
-								if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, str); }
-								if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, str); }
-								if(!s.ajax.data) { s.ajax.data = { "search_string" : str }; }
-								if(!s.ajax.dataType || /^json/.exec(s.ajax.dataType)) { s.ajax.dataType = "json"; }
-								$.ajax(s.ajax);
-								return;
-							}
-							if(this.data.search.result.length) { this.clear_search(); }
-							this.data.search.result = this.get_container().find("a" + (this.data.languages ? "." + this.get_lang() : "" ) + ":" + (s.search_method) + "(" + this.data.search.str + ")");
-							this.data.search.result.addClass("jstree-search").parent().parents(".jstree-closed").each(function () {
-								t.open_node(this, false, true);
-							});
-							this.__callback({ nodes : this.data.search.result, str : str });
-						},
-						clear_search : function (str) {
-							this.data.search.result.removeClass("jstree-search");
-							this.__callback(this.data.search.result);
-							this.data.search.result = $();
-						},
-						_search_open : function (is_callback) {
-							var _this = this,
-							done = true,
-							current = [],
-							remaining = [];
-							if(this.data.search.to_open.length) {
-								$.each(this.data.search.to_open, function (i, val) {
-									if(val == "#") { return true; }
-									if($(val).length && $(val).is(".jstree-closed")) { current.push(val); }
-									else { remaining.push(val); }
-								});
-								if(current.length) {
-									this.data.search.to_open = remaining;
-									$.each(current, function (i, val) {
-										_this.open_node(val, function () { _this._search_open(true); });
-									});
-									done = false;
-								}
-							}
-							if(done) { this.search(this.data.search.str, true); }
-						}
-					}
-				});
-			})(jQuery);
-			//*/
-			
-			/*
-			* jsTree contextmenu plugin
-			*/
-			(function ($) {
-				$.vakata.context = {
-					hide_on_mouseleave : false,
-					
-					cnt		: $("<div id='vakata-contextmenu' />"),
-					vis		: false,
-					tgt		: false,
-					par		: false,
-					func	: false,
-					data	: false,
-					rtl		: false,
-					show	: function (s, t, x, y, d, p, rtl) {
-						$.vakata.context.rtl = !!rtl;
-						var html = $.vakata.context.parse(s), h, w;
-						if(!html) { return; }
-						$.vakata.context.vis = true;
-						$.vakata.context.tgt = t;
-						$.vakata.context.par = p || t || null;
-						$.vakata.context.data = d || null;
-						$.vakata.context.cnt
-						.html(html)
-						.css({ "visibility" : "hidden", "display" : "block", "left" : 0, "top" : 0 });
-						
-						if($.vakata.context.hide_on_mouseleave) {
-							$.vakata.context.cnt
-							.one("mouseleave", function(e) { $.vakata.context.hide(); });
-						}
-						
-						h = $.vakata.context.cnt.height();
-						w = $.vakata.context.cnt.width();
-						if(x + w > $(document).width()) {
-							x = $(document).width() - (w + 5);
-							$.vakata.context.cnt.find("li > ul").addClass("right");
-						}
-						if(y + h > $(document).height()) {
-							y = y - (h + t[0].offsetHeight);
-							$.vakata.context.cnt.find("li > ul").addClass("bottom");
-						}
-						
-						$.vakata.context.cnt
-						.css({ "left" : x, "top" : y })
-						.find("li:has(ul)")
-						.bind("mouseenter", function (e) {
-							var w = $(document).width(),
-							h = $(document).height(),
-							ul = $(this).children("ul").show();
-							if(w !== $(document).width()) { ul.toggleClass("right"); }
-							if(h !== $(document).height()) { ul.toggleClass("bottom"); }
-						})
-						.bind("mouseleave", function (e) {
-							$(this).children("ul").hide();
-						})
-						.end()
-						.css({ "visibility" : "visible" })
-						.show();
-						$(document).triggerHandler("context_show.vakata");
-					},
-					hide	: function () {
-						$.vakata.context.vis = false;
-						$.vakata.context.cnt.attr("class","").css({ "visibility" : "hidden" });
-						$(document).triggerHandler("context_hide.vakata");
-					},
-					parse	: function (s, is_callback) {
-						if(!s) { return false; }
-						var str = "",
-						tmp = false,
-						was_sep = true;
-						if(!is_callback) { $.vakata.context.func = {}; }
-						str += "<ul>";
-						$.each(s, function (i, val) {
-							if(!val) { return true; }
-							$.vakata.context.func[i] = val.action;
-							if(!was_sep && val.separator_before) {
-								str += "<li class='vakata-separator vakata-separator-before'></li>";
-							}
-							was_sep = false;
-							str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
-							if(val.icon && val.icon.indexOf("/") === -1) { str += " class='" + val.icon + "' "; }
-							if(val.icon && val.icon.indexOf("/") !== -1) { str += " style='background:url(" + val.icon + ") center center no-repeat;' "; }
-							str += ">&#160;</ins><a href='#' rel='" + i + "'>";
-							if(val.submenu) {
-								str += "<span style='float:" + ($.vakata.context.rtl ? "left" : "right") + ";'>&raquo;</span>";
-							}
-							str += val.label + "</a>";
-							if(val.submenu) {
-								tmp = $.vakata.context.parse(val.submenu, true);
-								if(tmp) { str += tmp; }
-							}
-							str += "</li>";
-							if(val.separator_after) {
-								str += "<li class='vakata-separator vakata-separator-after'></li>";
-								was_sep = true;
-							}
-						});
-						str = str.replace(/<li class\='vakata-separator vakata-separator-after'\><\/li\>$/,"");
-						str += "</ul>";
-						$(document).triggerHandler("context_parse.vakata");
-						return str.length > 10 ? str : false;
-					},
-					exec	: function (i) {
-						if($.isFunction($.vakata.context.func[i])) {
-							// if is string - eval and call it!
-							$.vakata.context.func[i].call($.vakata.context.data, $.vakata.context.par);
-							return true;
-						}
-						else { return false; }
-					}
-				};
-				$(function () {
-					var css_string = '' +
-					'#vakata-contextmenu { display:block; visibility:hidden; left:0; top:-200px; position:absolute; margin:0; padding:0; min-width:180px; background:#ebebeb; border:1px solid silver; z-index:10000; *width:180px; } ' +
-					'#vakata-contextmenu ul { min-width:180px; *width:180px; } ' +
-					'#vakata-contextmenu ul, #vakata-contextmenu li { margin:0; padding:0; list-style-type:none; display:block; } ' +
-					'#vakata-contextmenu li { line-height:20px; min-height:20px; position:relative; padding:0px; } ' +
-					'#vakata-contextmenu li a { padding:1px 6px; line-height:17px; display:block; text-decoration:none; margin:1px 1px 0 1px; } ' +
-					'#vakata-contextmenu li ins { float:left; width:16px; height:16px; text-decoration:none; margin-right:2px; } ' +
-					'#vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background:gray; color:white; } ' +
-					'#vakata-contextmenu li ul { display:none; position:absolute; top:-2px; left:100%; background:#ebebeb; border:1px solid gray; } ' +
-					'#vakata-contextmenu .right { right:100%; left:auto; } ' +
-					'#vakata-contextmenu .bottom { bottom:-1px; top:auto; } ' +
-					'#vakata-contextmenu li.vakata-separator { min-height:0; height:1px; line-height:1px; font-size:1px; overflow:hidden; margin:0 2px; background:silver; /* border-top:1px solid #fefefe; */ padding:0; } ';
-					$.vakata.css.add_sheet({ str : css_string, title : "vakata" });
-					$.vakata.context.cnt
-					.delegate("a","click", function (e) { e.preventDefault(); })
-					.delegate("a","mouseup", function (e) {
-						if(!$(this).parent().hasClass("jstree-contextmenu-disabled") && $.vakata.context.exec($(this).attr("rel"))) {
-							$.vakata.context.hide();
-						}
-						else { $(this).blur(); }
-					})
-					.delegate("a","mouseover", function () {
-						$.vakata.context.cnt.find(".vakata-hover").removeClass("vakata-hover");
-					})
-					.appendTo("body");
-					$(document).bind("mousedown", function (e) { if($.vakata.context.vis && !$.contains($.vakata.context.cnt[0], e.target)) { $.vakata.context.hide(); } });
-					if(typeof $.hotkeys !== "undefined") {
-						$(document)
-						.bind("keydown", "up", function (e) {
-							if($.vakata.context.vis) {
-								var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").prevAll("li:not(.vakata-separator)").first();
-								if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").last(); }
-								o.addClass("vakata-hover");
-								e.stopImmediatePropagation();
-								e.preventDefault();
-							}
-						})
-						.bind("keydown", "down", function (e) {
-							if($.vakata.context.vis) {
-								var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").nextAll("li:not(.vakata-separator)").first();
-								if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").first(); }
-								o.addClass("vakata-hover");
-								e.stopImmediatePropagation();
-								e.preventDefault();
-							}
-						})
-						.bind("keydown", "right", function (e) {
-							if($.vakata.context.vis) {
-								$.vakata.context.cnt.find(".vakata-hover").children("ul").show().children("li:not(.vakata-separator)").removeClass("vakata-hover").first().addClass("vakata-hover");
-								e.stopImmediatePropagation();
-								e.preventDefault();
-							}
-						})
-						.bind("keydown", "left", function (e) {
-							if($.vakata.context.vis) {
-								$.vakata.context.cnt.find(".vakata-hover").children("ul").hide().children(".vakata-separator").removeClass("vakata-hover");
-								e.stopImmediatePropagation();
-								e.preventDefault();
-							}
-						})
-						.bind("keydown", "esc", function (e) {
-							$.vakata.context.hide();
-							e.preventDefault();
-						})
-						.bind("keydown", "space", function (e) {
-							$.vakata.context.cnt.find(".vakata-hover").last().children("a").click();
-							e.preventDefault();
-						});
-					}
-				});
-				
-				$.jstree.plugin("contextmenu", {
-					__init : function () {
-						this.get_container()
-						.delegate("a", "contextmenu.jstree", $.proxy(function (e) {
-							e.preventDefault();
-							if(!$(e.currentTarget).hasClass("jstree-loading")) {
-								this.show_contextmenu(e.currentTarget, e.pageX, e.pageY);
-							}
-						}, this))
-						.delegate("a", "click.jstree", $.proxy(function (e) {
-							if(this.data.contextmenu) {
-								$.vakata.context.hide();
-							}
-						}, this))
-						.bind("destroy.jstree", $.proxy(function () {
-							// TODO: move this to descruct method
-							if(this.data.contextmenu) {
-								$.vakata.context.hide();
-							}
-						}, this));
-						$(document).bind("context_hide.vakata", $.proxy(function () { this.data.contextmenu = false; }, this));
-					},
-					defaults : {
-						select_node : false, // requires UI plugin
-						show_at_node : true,
-						items : { // Could be a function that should return an object like this one
-							"create" : {
-								"separator_before"	: false,
-								"separator_after"	: true,
-								"label"				: "Create",
-								"action"			: function (obj) { this.create(obj); }
-							},
-							"rename" : {
-								"separator_before"	: false,
-								"separator_after"	: false,
-								"label"				: "Rename",
-								"action"			: function (obj) { this.rename(obj); }
-							},
-							"remove" : {
-								"separator_before"	: false,
-								"icon"				: false,
-								"separator_after"	: false,
-								"label"				: "Delete",
-								"action"			: function (obj) { if(this.is_selected(obj)) { this.remove(); } else { this.remove(obj); } }
-							},
-							"ccp" : {
-								"separator_before"	: true,
-								"icon"				: false,
-								"separator_after"	: false,
-								"label"				: "Edit",
-								"action"			: false,
-								"submenu" : {
-									"cut" : {
-										"separator_before"	: false,
-										"separator_after"	: false,
-										"label"				: "Cut",
-										"action"			: function (obj) { this.cut(obj); }
-									},
-									"copy" : {
-										"separator_before"	: false,
-										"icon"				: false,
-										"separator_after"	: false,
-										"label"				: "Copy",
-										"action"			: function (obj) { this.copy(obj); }
-									},
-									"paste" : {
-										"separator_before"	: false,
-										"icon"				: false,
-										"separator_after"	: false,
-										"label"				: "Paste",
-										"action"			: function (obj) { this.paste(obj); }
-									}
-								}
-							}
-						}
-					},
-					_fn : {
-						show_contextmenu : function (obj, x, y) {
-							obj = this._get_node(obj);
-							var s = this.get_settings().contextmenu,
-							a = obj.children("a:visible:eq(0)"),
-							o = false,
-							i = false;
-							if(s.select_node && this.data.ui && !this.is_selected(obj)) {
-								this.deselect_all();
-								this.select_node(obj, true);
-							}
-							if(s.show_at_node || typeof x === "undefined" || typeof y === "undefined") {
-								o = a.offset();
-								x = o.left;
-								y = o.top + this.data.core.li_height;
-							}
-							i = obj.data("jstree") && obj.data("jstree").contextmenu ? obj.data("jstree").contextmenu : s.items;
-							if($.isFunction(i)) { i = i.call(this, obj); }
-							this.data.contextmenu = true;
-							$.vakata.context.show(i, a, x, y, this, obj, this._get_settings().core.rtl);
-							if(this.data.themes) { $.vakata.context.cnt.attr("class", "jstree-" + this.data.themes.theme + "-context"); }
-						}
-					}
-				});
-			})(jQuery);
-			//*/
-			
-			/*
-			* jsTree types plugin
-			* Adds support types of nodes
-			* You can set an attribute on each li node, that represents its type.
-			* According to the type setting the node may get custom icon/validation rules
-			*/
-			(function ($) {
-				$.jstree.plugin("types", {
-					__init : function () {
-						var s = this._get_settings().types;
-						this.data.types.attach_to = [];
-						this.get_container()
-						.bind("init.jstree", $.proxy(function () {
-							var types = s.types,
-							attr  = s.type_attr,
-							icons_css = "",
-							_this = this;
-							
-							$.each(types, function (i, tp) {
-								$.each(tp, function (k, v) {
-									if(!/^(max_depth|max_children|icon|valid_children)$/.test(k)) { _this.data.types.attach_to.push(k); }
-								});
-								if(!tp.icon) { return true; }
-								if( tp.icon.image || tp.icon.position) {
-									if(i == "default")	{ icons_css += '.jstree-' + _this.get_index() + ' a > .jstree-icon { '; }
-									else				{ icons_css += '.jstree-' + _this.get_index() + ' li[' + attr + '="' + i + '"] > a > .jstree-icon { '; }
-									if(tp.icon.image)	{ icons_css += ' background-image:url(' + tp.icon.image + '); '; }
-									if(tp.icon.position){ icons_css += ' background-position:' + tp.icon.position + '; '; }
-									else				{ icons_css += ' background-position:0 0; '; }
-								icons_css += '} ';
-							}
-						});
-						if(icons_css !== "") { $.vakata.css.add_sheet({ 'str' : icons_css, title : "jstree-types" }); }
-					}, this))
-					.bind("before.jstree", $.proxy(function (e, data) {
-						var s, t,
-						o = this._get_settings().types.use_data ? this._get_node(data.args[0]) : false,
-						d = o && o !== -1 && o.length ? o.data("jstree") : false;
-						if(d && d.types && d.types[data.func] === false) { e.stopImmediatePropagation(); return false; }
-						if($.inArray(data.func, this.data.types.attach_to) !== -1) {
-							if(!data.args[0] || (!data.args[0].tagName && !data.args[0].jquery)) { return; }
-							s = this._get_settings().types.types;
-							t = this._get_type(data.args[0]);
-							if(
-							(
-							(s[t] && typeof s[t][data.func] !== "undefined") ||
-							(s["default"] && typeof s["default"][data.func] !== "undefined")
-							) && this._check(data.func, data.args[0]) === false
-							) {
-								e.stopImmediatePropagation();
-								return false;
-							}
-						}
-					}, this));
-					if(is_ie6) {
-						this.get_container()
-						.bind("load_node.jstree set_type.jstree", $.proxy(function (e, data) {
-							var r = data && data.rslt && data.rslt.obj && data.rslt.obj !== -1 ? this._get_node(data.rslt.obj).parent() : this.get_container_ul(),
-							c = false,
-							s = this._get_settings().types;
-							$.each(s.types, function (i, tp) {
-								if(tp.icon && (tp.icon.image || tp.icon.position)) {
-									c = i === "default" ? r.find("li > a > .jstree-icon") : r.find("li[" + s.type_attr + "='" + i + "'] > a > .jstree-icon");
-									if(tp.icon.image) { c.css("backgroundImage","url(" + tp.icon.image + ")"); }
-									c.css("backgroundPosition", tp.icon.position || "0 0");
-								}
-							});
-						}, this));
-					}
-				},
-				defaults : {
-					// defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking)
-					max_children		: -1,
-					// defines the maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking)
-					max_depth			: -1,
-					// defines valid node types for the root nodes
-					valid_children		: "all",
-					
-					// whether to use $.data
-					use_data : false,
-					// where is the type stores (the rel attribute of the LI element)
-					type_attr : "rel",
-					// a list of types
-					types : {
-						// the default type
-						"default" : {
-							"max_children"	: -1,
-							"max_depth"		: -1,
-							"valid_children": "all"
-							
-							// Bound functions - you can bind any other function here (using boolean or function)
-							//"select_node"	: true
-						}
-					}
-				},
-				_fn : {
-					_types_notify : function (n, data) {
-						if(data.type && this._get_settings().types.use_data) {
-							this.set_type(data.type, n);
-						}
-					},
-					_get_type : function (obj) {
-						obj = this._get_node(obj);
-						return (!obj || !obj.length) ? false : obj.attr(this._get_settings().types.type_attr) || "default";
-					},
-					set_type : function (str, obj) {
-						obj = this._get_node(obj);
-						var ret = (!obj.length || !str) ? false : obj.attr(this._get_settings().types.type_attr, str);
-						if(ret) { this.__callback({ obj : obj, type : str}); }
-						return ret;
-					},
-					_check : function (rule, obj, opts) {
-						obj = this._get_node(obj);
-						var v = false, t = this._get_type(obj), d = 0, _this = this, s = this._get_settings().types, data = false;
-						if(obj === -1) {
-							if(!!s[rule]) { v = s[rule]; }
-							else { return; }
-						}
-						else {
-							if(t === false) { return; }
-							data = s.use_data ? obj.data("jstree") : false;
-							if(data && data.types && typeof data.types[rule] !== "undefined") { v = data.types[rule]; }
-							else if(!!s.types[t] && typeof s.types[t][rule] !== "undefined") { v = s.types[t][rule]; }
-							else if(!!s.types["default"] && typeof s.types["default"][rule] !== "undefined") { v = s.types["default"][rule]; }
-						}
-						if($.isFunction(v)) { v = v.call(this, obj); }
-						if(rule === "max_depth" && obj !== -1 && opts !== false && s.max_depth !== -2 && v !== 0) {
-							// also include the node itself - otherwise if root node it is not checked
-							obj.children("a:eq(0)").parentsUntil(".jstree","li").each(function (i) {
-								// check if current depth already exceeds global tree depth
-								if(s.max_depth !== -1 && s.max_depth - (i + 1) <= 0) { v = 0; return false; }
-								d = (i === 0) ? v : _this._check(rule, this, false);
-								// check if current node max depth is already matched or exceeded
-								if(d !== -1 && d - (i + 1) <= 0) { v = 0; return false; }
-								// otherwise - set the max depth to the current value minus current depth
-								if(d >= 0 && (d - (i + 1) < v || v < 0) ) { v = d - (i + 1); }
-								// if the global tree depth exists and it minus the nodes calculated so far is less than `v` or `v` is unlimited
-								if(s.max_depth >= 0 && (s.max_depth - (i + 1) < v || v < 0) ) { v = s.max_depth - (i + 1); }
-							});
-						}
-						return v;
-					},
-					check_move : function () {
-						if(!this.__call_old()) { return false; }
-						var m  = this._get_move(),
-						s  = m.rt._get_settings().types,
-						mc = m.rt._check("max_children", m.cr),
-						md = m.rt._check("max_depth", m.cr),
-						vc = m.rt._check("valid_children", m.cr),
-						ch = 0, d = 1, t;
-						
-						if(vc === "none") { return false; }
-						if($.isArray(vc) && m.ot && m.ot._get_type) {
-							m.o.each(function () {
-								if($.inArray(m.ot._get_type(this), vc) === -1) { d = false; return false; }
-							});
-							if(d === false) { return false; }
-						}
-						if(s.max_children !== -2 && mc !== -1) {
-							ch = m.cr === -1 ? this.get_container().find("> ul > li").not(m.o).length : m.cr.find("> ul > li").not(m.o).length;
-							if(ch + m.o.length > mc) { return false; }
-						}
-						if(s.max_depth !== -2 && md !== -1) {
-							d = 0;
-							if(md === 0) { return false; }
-							if(typeof m.o.d === "undefined") {
-								// TODO: deal with progressive rendering and async when checking max_depth (how to know the depth of the moved node)
-								t = m.o;
-								while(t.length > 0) {
-									t = t.find("> ul > li");
-									d ++;
-								}
-								m.o.d = d;
-							}
-							if(md - m.o.d < 0) { return false; }
-						}
-						return true;
-					},
-					create_node : function (obj, position, js, callback, is_loaded, skip_check) {
-						if(!skip_check && (is_loaded || this._is_loaded(obj))) {
-							var p  = (typeof position == "string" && position.match(/^before|after$/i) && obj !== -1) ? this._get_parent(obj) : this._get_node(obj),
-							s  = this._get_settings().types,
-							mc = this._check("max_children", p),
-							md = this._check("max_depth", p),
-							vc = this._check("valid_children", p),
-							ch;
-							if(typeof js === "string") { js = { data : js }; }
-							if(!js) { js = {}; }
-							if(vc === "none") { return false; }
-							if($.isArray(vc)) {
-								if(!js.attr || !js.attr[s.type_attr]) {
-									if(!js.attr) { js.attr = {}; }
-									js.attr[s.type_attr] = vc[0];
-								}
-								else {
-									if($.inArray(js.attr[s.type_attr], vc) === -1) { return false; }
-								}
-							}
-							if(s.max_children !== -2 && mc !== -1) {
-								ch = p === -1 ? this.get_container().find("> ul > li").length : p.find("> ul > li").length;
-								if(ch + 1 > mc) { return false; }
-							}
-							if(s.max_depth !== -2 && md !== -1 && (md - 1) < 0) { return false; }
-						}
-						return this.__call_old(true, obj, position, js, callback, is_loaded, skip_check);
-					}
-				}
-			});
-		})(jQuery);
-		//*/
-		
-		/*
-		* jsTree HTML plugin
-		* The HTML data store. Datastores are build by replacing the `load_node` and `_is_loaded` functions.
-		*/
-		(function ($) {
-			$.jstree.plugin("html_data", {
-				__init : function () {
-					// this used to use html() and clean the whitespace, but this way any attached data was lost
-					this.data.html_data.original_container_html = this.get_container().find(" > ul > li").clone(true);
-					// remove white space from LI node - otherwise nodes appear a bit to the right
-					this.data.html_data.original_container_html.find("li").addBack().contents().filter(function() { return this.nodeType == 3; }).remove();
-				},
-				defaults : {
-					data : false,
-					ajax : false,
-					correct_state : true
-				},
-				_fn : {
-					load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_html(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
-					_is_loaded : function (obj) {
-						obj = this._get_node(obj);
-						return obj == -1 || !obj || (!this._get_settings().html_data.ajax && !$.isFunction(this._get_settings().html_data.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
-					},
-					load_node_html : function (obj, s_call, e_call) {
-						var d,
-						s = this.get_settings().html_data,
-						error_func = function () {},
-						success_func = function () {};
-						obj = this._get_node(obj);
-						if(obj && obj !== -1) {
-							if(obj.data("jstree_is_loading")) { return; }
-							else { obj.data("jstree_is_loading",true); }
-						}
-						switch(!0) {
-							case ($.isFunction(s.data)):
-							s.data.call(this, obj, $.proxy(function (d) {
-								if(d && d !== "" && d.toString && d.toString().replace(/^[\s\n]+$/,"") !== "") {
-									d = $(d);
-									if(!d.is("ul")) { d = $("<ul />").append(d); }
-									if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }
-									else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree_is_loading"); }
-									this.clean_node(obj);
-									if(s_call) { s_call.call(this); }
-								}
-								else {
-									if(obj && obj !== -1) {
-										obj.children("a.jstree-loading").removeClass("jstree-loading");
-										obj.removeData("jstree_is_loading");
-										if(s.correct_state) {
-											this.correct_state(obj);
-											if(s_call) { s_call.call(this); }
-										}
-									}
-									else {
-										if(s.correct_state) {
-											this.get_container().children("ul").empty();
-											if(s_call) { s_call.call(this); }
-										}
-									}
-								}
-							}, this));
-							break;
-							case (!s.data && !s.ajax):
-							if(!obj || obj == -1) {
-								this.get_container()
-								.children("ul").empty()
-								.append(this.data.html_data.original_container_html)
-								.find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()
-								.filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
-								this.clean_node();
-							}
-							if(s_call) { s_call.call(this); }
-							break;
-							case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
-							if(!obj || obj == -1) {
-								d = $(s.data);
-								if(!d.is("ul")) { d = $("<ul />").append(d); }
-								this.get_container()
-								.children("ul").empty().append(d.children())
-								.find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end()
-								.filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
-								this.clean_node();
-							}
-							if(s_call) { s_call.call(this); }
-							break;
-							case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
-							obj = this._get_node(obj);
-							error_func = function (x, t, e) {
-								var ef = this.get_settings().html_data.ajax.error;
-								if(ef) { ef.call(this, x, t, e); }
-								if(obj != -1 && obj.length) {
-									obj.children("a.jstree-loading").removeClass("jstree-loading");
-									obj.removeData("jstree_is_loading");
-									if(t === "success" && s.correct_state) { this.correct_state(obj); }
-								}
-								else {
-									if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
-								}
-								if(e_call) { e_call.call(this); }
-							};
-							success_func = function (d, t, x) {
-								var sf = this.get_settings().html_data.ajax.success;
-								if(sf) { d = sf.call(this,d,t,x) || d; }
-								if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {
-									return error_func.call(this, x, t, "");
-								}
-								if(d) {
-									d = $(d);
-									if(!d.is("ul")) { d = $("<ul />").append(d); }
-									if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }
-									else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'>&#160;</ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree_is_loading"); }
-									this.clean_node(obj);
-									if(s_call) { s_call.call(this); }
-								}
-								else {
-									if(obj && obj !== -1) {
-										obj.children("a.jstree-loading").removeClass("jstree-loading");
-										obj.removeData("jstree_is_loading");
-										if(s.correct_state) {
-											this.correct_state(obj);
-											if(s_call) { s_call.call(this); }
-										}
-									}
-									else {
-										if(s.correct_state) {
-											this.get_container().children("ul").empty();
-											if(s_call) { s_call.call(this); }
-										}
-									}
-								}
-							};
-							s.ajax.context = this;
-							s.ajax.error = error_func;
-							s.ajax.success = success_func;
-							if(!s.ajax.dataType) { s.ajax.dataType = "html"; }
-							if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
-							if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
-							$.ajax(s.ajax);
-							break;
-						}
-					}
-				}
-			});
-			// include the HTML data plugin by default
-			$.jstree.defaults.plugins.push("html_data");
-		})(jQuery);
-		//*/
-		
-		/*
-		* jsTree themeroller plugin
-		* Adds support for jQuery UI themes. Include this at the end of your plugins list, also make sure "themes" is not included.
-		*/
-		(function ($) {
-			$.jstree.plugin("themeroller", {
-				__init : function () {
-					var s = this._get_settings().themeroller;
-					this.get_container()
-					.addClass("ui-widget-content")
-					.addClass("jstree-themeroller")
-					.delegate("a","mouseenter.jstree", function (e) {
-						if(!$(e.currentTarget).hasClass("jstree-loading")) {
-							$(this).addClass(s.item_h);
-						}
-					})
-					.delegate("a","mouseleave.jstree", function () {
-						$(this).removeClass(s.item_h);
-					})
-					.bind("init.jstree", $.proxy(function (e, data) {
-						data.inst.get_container().find("> ul > li > .jstree-loading > ins").addClass("ui-icon-refresh");
-						this._themeroller(data.inst.get_container().find("> ul > li"));
-					}, this))
-					.bind("open_node.jstree create_node.jstree", $.proxy(function (e, data) {
-						this._themeroller(data.rslt.obj);
-					}, this))
-					.bind("loaded.jstree refresh.jstree", $.proxy(function (e) {
-						this._themeroller();
-					}, this))
-					.bind("close_node.jstree", $.proxy(function (e, data) {
-						this._themeroller(data.rslt.obj);
-					}, this))
-					.bind("delete_node.jstree", $.proxy(function (e, data) {
-						this._themeroller(data.rslt.parent);
-					}, this))
-					.bind("correct_state.jstree", $.proxy(function (e, data) {
-						data.rslt.obj
-						.children("ins.jstree-icon").removeClass(s.opened + " " + s.closed + " ui-icon").end()
-						.find("> a > ins.ui-icon")
-						.filter(function() {
-							return this.className.toString()
-							.replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
-							.indexOf("ui-icon-") === -1;
-						}).removeClass(s.item_open + " " + s.item_clsd).addClass(s.item_leaf || "jstree-no-icon");
-					}, this))
-					.bind("select_node.jstree", $.proxy(function (e, data) {
-						data.rslt.obj.children("a").addClass(s.item_a);
-					}, this))
-					.bind("deselect_node.jstree deselect_all.jstree", $.proxy(function (e, data) {
-						this.get_container()
-						.find("a." + s.item_a).removeClass(s.item_a).end()
-						.find("a.jstree-clicked").addClass(s.item_a);
-					}, this))
-					.bind("dehover_node.jstree", $.proxy(function (e, data) {
-						data.rslt.obj.children("a").removeClass(s.item_h);
-					}, this))
-					.bind("hover_node.jstree", $.proxy(function (e, data) {
-						this.get_container()
-						.find("a." + s.item_h).not(data.rslt.obj).removeClass(s.item_h);
-						data.rslt.obj.children("a").addClass(s.item_h);
-					}, this))
-					.bind("move_node.jstree", $.proxy(function (e, data) {
-						this._themeroller(data.rslt.o);
-						this._themeroller(data.rslt.op);
-					}, this));
-				},
-				__destroy : function () {
-					var s = this._get_settings().themeroller,
-					c = [ "ui-icon" ];
-					$.each(s, function (i, v) {
-						v = v.split(" ");
-						if(v.length) { c = c.concat(v); }
-					});
-					this.get_container()
-					.removeClass("ui-widget-content")
-					.find("." + c.join(", .")).removeClass(c.join(" "));
-				},
-				_fn : {
-					_themeroller : function (obj) {
-						var s = this._get_settings().themeroller;
-						obj = (!obj || obj == -1) ? this.get_container_ul() : this._get_node(obj);
-						obj = (!obj || obj == -1) ? this.get_container_ul() : obj.parent();
-						obj
-						.find("li.jstree-closed")
-						.children("ins.jstree-icon").removeClass(s.opened).addClass("ui-icon " + s.closed).end()
-						.children("a").addClass(s.item)
-						.children("ins.jstree-icon").addClass("ui-icon")
-						.filter(function() {
-							return this.className.toString()
-							.replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
-							.indexOf("ui-icon-") === -1;
-						}).removeClass(s.item_leaf + " " + s.item_open).addClass(s.item_clsd || "jstree-no-icon")
-						.end()
-						.end()
-						.end()
-						.end()
-						.find("li.jstree-open")
-						.children("ins.jstree-icon").removeClass(s.closed).addClass("ui-icon " + s.opened).end()
-						.children("a").addClass(s.item)
-						.children("ins.jstree-icon").addClass("ui-icon")
-						.filter(function() {
-							return this.className.toString()
-							.replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
-							.indexOf("ui-icon-") === -1;
-						}).removeClass(s.item_leaf + " " + s.item_clsd).addClass(s.item_open || "jstree-no-icon")
-						.end()
-						.end()
-						.end()
-						.end()
-						.find("li.jstree-leaf")
-						.children("ins.jstree-icon").removeClass(s.closed + " ui-icon " + s.opened).end()
-						.children("a").addClass(s.item)
-						.children("ins.jstree-icon").addClass("ui-icon")
-						.filter(function() {
-							return this.className.toString()
-							.replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
-							.indexOf("ui-icon-") === -1;
-						}).removeClass(s.item_clsd + " " + s.item_open).addClass(s.item_leaf || "jstree-no-icon");
-					}
-				},
-				defaults : {
-					"opened"	: "ui-icon-triangle-1-se",
-					"closed"	: "ui-icon-triangle-1-e",
-					"item"		: "ui-state-default",
-					"item_h"	: "ui-state-hover",
-					"item_a"	: "ui-state-active",
-					"item_open"	: "ui-icon-folder-open",
-					"item_clsd"	: "ui-icon-folder-collapsed",
-					"item_leaf"	: "ui-icon-document"
-				}
-			});
-			$(function() {
-				var css_string = '' +
-				'.jstree-themeroller .ui-icon { overflow:visible; } ' +
-				'.jstree-themeroller a { padding:0 2px; } ' +
-				'.jstree-themeroller .jstree-no-icon { display:none; }';
-				$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-			});
-		})(jQuery);
-		//*/
-		
-		/*
-		* jsTree unique plugin
-		* Forces different names amongst siblings (still a bit experimental)
-		* NOTE: does not check language versions (it will not be possible to have nodes with the same title, even in different languages)
-		*/
-		(function ($) {
-			$.jstree.plugin("unique", {
-				__init : function () {
-					this.get_container()
-					.bind("before.jstree", $.proxy(function (e, data) {
-						var nms = [], res = true, p, t;
-						if(data.func == "move_node") {
-							// obj, ref, position, is_copy, is_prepared, skip_check
-							if(data.args[4] === true) {
-								if(data.args[0].o && data.args[0].o.length) {
-									data.args[0].o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
-									res = this._check_unique(nms, data.args[0].np.find("> ul > li").not(data.args[0].o), "move_node");
-								}
-							}
-						}
-						if(data.func == "create_node") {
-							// obj, position, js, callback, is_loaded
-							if(data.args[4] || this._is_loaded(data.args[0])) {
-								p = this._get_node(data.args[0]);
-								if(data.args[1] && (data.args[1] === "before" || data.args[1] === "after")) {
-									p = this._get_parent(data.args[0]);
-									if(!p || p === -1) { p = this.get_container(); }
-								}
-								if(typeof data.args[2] === "string") { nms.push(data.args[2]); }
-								else if(!data.args[2] || !data.args[2].data) { nms.push(this._get_string("new_node")); }
-								else { nms.push(data.args[2].data); }
-								res = this._check_unique(nms, p.find("> ul > li"), "create_node");
-							}
-						}
-						if(data.func == "rename_node") {
-							// obj, val
-							nms.push(data.args[1]);
-							t = this._get_node(data.args[0]);
-							p = this._get_parent(t);
-							if(!p || p === -1) { p = this.get_container(); }
-							res = this._check_unique(nms, p.find("> ul > li").not(t), "rename_node");
-						}
-						if(!res) {
-							e.stopPropagation();
-							return false;
-						}
-					}, this));
-				},
-				defaults : {
-					error_callback : $.noop
-				},
-				_fn : {
-					_check_unique : function (nms, p, func) {
-						var cnms = [], ok = true;
-						p.children("a").each(function () { cnms.push($(this).text().replace(/^\s+/g,"")); });
-						if(!cnms.length || !nms.length) { return true; }
-						$.each(nms, function (i, v) {
-							if($.inArray(v, cnms) !== -1) {
-								ok = false;
-								return false;
-							}
-						});
-						if(!ok) {
-							this._get_settings().unique.error_callback.call(null, nms, p, func);
-						}
-						return ok;
-					},
-					check_move : function () {
-						if(!this.__call_old()) { return false; }
-						var p = this._get_move(), nms = [];
-						if(p.o && p.o.length) {
-							p.o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
-							return this._check_unique(nms, p.np.find("> ul > li").not(p.o), "check_move");
-						}
-						return true;
-					}
-				}
-			});
-		})(jQuery);
-		//*/
-		
-		/*
-		* jsTree wholerow plugin
-		* Makes select and hover work on the entire width of the node
-		* MAY BE HEAVY IN LARGE DOM
-		*/
-		(function ($) {
-			$.jstree.plugin("wholerow", {
-				__init : function () {
-					if(!this.data.ui) { throw "jsTree wholerow: jsTree UI plugin not included."; }
-					this.data.wholerow.html = false;
-					this.data.wholerow.to = false;
-					this.get_container()
-					.bind("init.jstree", $.proxy(function (e, data) {
-						this._get_settings().core.animation = 0;
-					}, this))
-					.bind("open_node.jstree create_node.jstree clean_node.jstree loaded.jstree", $.proxy(function (e, data) {
-						this._prepare_wholerow_span( data && data.rslt && data.rslt.obj ? data.rslt.obj : -1 );
-					}, this))
-					.bind("search.jstree clear_search.jstree reopen.jstree after_open.jstree after_close.jstree create_node.jstree delete_node.jstree clean_node.jstree", $.proxy(function (e, data) {
-						if(this.data.to) { clearTimeout(this.data.to); }
-						this.data.to = setTimeout( (function (t, o) { return function() { t._prepare_wholerow_ul(o); }; })(this,  data && data.rslt && data.rslt.obj ? data.rslt.obj : -1), 0);
-					}, this))
-					.bind("deselect_all.jstree", $.proxy(function (e, data) {
-						this.get_container().find(" > .jstree-wholerow .jstree-clicked").removeClass("jstree-clicked " + (this.data.themeroller ? this._get_settings().themeroller.item_a : "" ));
-					}, this))
-					.bind("select_node.jstree deselect_node.jstree ", $.proxy(function (e, data) {
-						data.rslt.obj.each(function () {
-							var ref = data.inst.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt((($(this).offset().top - data.inst.get_container().offset().top + data.inst.get_container()[0].scrollTop) / data.inst.data.core.li_height),10)) + ")");
-							// ref.children("a")[e.type === "select_node" ? "addClass" : "removeClass"]("jstree-clicked");
-							ref.children("a").attr("class",data.rslt.obj.children("a").attr("class"));
-						});
-					}, this))
-					.bind("hover_node.jstree dehover_node.jstree", $.proxy(function (e, data) {
-						this.get_container().find(" > .jstree-wholerow .jstree-hovered").removeClass("jstree-hovered " + (this.data.themeroller ? this._get_settings().themeroller.item_h : "" ));
-						if(e.type === "hover_node") {
-							var ref = this.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt(((data.rslt.obj.offset().top - this.get_container().offset().top + this.get_container()[0].scrollTop) / this.data.core.li_height),10)) + ")");
-							// ref.children("a").addClass("jstree-hovered");
-							ref.children("a").attr("class",data.rslt.obj.children(".jstree-hovered").attr("class"));
-						}
-					}, this))
-					.delegate(".jstree-wholerow-span, ins.jstree-icon, li", "click.jstree", function (e) {
-						var n = $(e.currentTarget);
-						if(e.target.tagName === "A" || (e.target.tagName === "INS" && n.closest("li").is(".jstree-open, .jstree-closed"))) { return; }
-						n.closest("li").children("a:visible:eq(0)").click();
-						e.stopImmediatePropagation();
-					})
-					.delegate("li", "mouseover.jstree", $.proxy(function (e) {
-						e.stopImmediatePropagation();
-						if($(e.currentTarget).children(".jstree-hovered, .jstree-clicked").length) { return false; }
-						this.hover_node(e.currentTarget);
-						return false;
-					}, this))
-					.delegate("li", "mouseleave.jstree", $.proxy(function (e) {
-						if($(e.currentTarget).children("a").hasClass("jstree-hovered").length) { return; }
-						this.dehover_node(e.currentTarget);
-					}, this));
-					if(is_ie7 || is_ie6) {
-						$.vakata.css.add_sheet({ str : ".jstree-" + this.get_index() + " { position:relative; } ", title : "jstree" });
-					}
-				},
-				defaults : {
-				},
-				__destroy : function () {
-					this.get_container().children(".jstree-wholerow").remove();
-					this.get_container().find(".jstree-wholerow-span").remove();
-				},
-				_fn : {
-					_prepare_wholerow_span : function (obj) {
-						obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);
-						if(obj === false) { return; } // added for removing root nodes
-						obj.each(function () {
-							$(this).find("li").addBack().each(function () {
-								var $t = $(this);
-								if($t.children(".jstree-wholerow-span").length) { return true; }
-								$t.prepend("<span class='jstree-wholerow-span' style='width:" + ($t.parentsUntil(".jstree","li").length * 18) + "px;'>&#160;</span>");
-							});
-						});
-					},
-					_prepare_wholerow_ul : function () {
-						var o = this.get_container().children("ul").eq(0), h = o.html();
-						o.addClass("jstree-wholerow-real");
-						if(this.data.wholerow.last_html !== h) {
-							this.data.wholerow.last_html = h;
-							this.get_container().children(".jstree-wholerow").remove();
-							this.get_container().append(
-							o.clone().removeClass("jstree-wholerow-real")
-							.wrapAll("<div class='jstree-wholerow' />").parent()
-							.width(o.parent()[0].scrollWidth)
-							.css("top", (o.height() + ( is_ie7 ? 5 : 0)) * -1 )
-							.find("li[id]").each(function () { this.removeAttribute("id"); }).end()
-							);
-						}
-					}
-				}
-			});
-			$(function() {
-				var css_string = '' +
-				'.jstree .jstree-wholerow-real { position:relative; z-index:1; } ' +
-				'.jstree .jstree-wholerow-real li { cursor:pointer; } ' +
-				'.jstree .jstree-wholerow-real a { border-left-color:transparent !important; border-right-color:transparent !important; } ' +
-				'.jstree .jstree-wholerow { position:relative; z-index:0; height:0; } ' +
-				'.jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { width:100%; } ' +
-				'.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li, .jstree .jstree-wholerow a { margin:0 !important; padding:0 !important; } ' +
-				'.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { background:transparent !important; }' +
-				'.jstree .jstree-wholerow ins, .jstree .jstree-wholerow span, .jstree .jstree-wholerow input { display:none !important; }' +
-				'.jstree .jstree-wholerow a, .jstree .jstree-wholerow a:hover { text-indent:-9999px; !important; width:100%; padding:0 !important; border-right-width:0px !important; border-left-width:0px !important; } ' +
-				'.jstree .jstree-wholerow-span { position:absolute; left:0; margin:0px; padding:0; height:18px; border-width:0; padding:0; z-index:0; }';
-				if(is_ff2) {
-					css_string += '' +
-					'.jstree .jstree-wholerow a { display:block; height:18px; margin:0; padding:0; border:0; } ' +
-					'.jstree .jstree-wholerow-real a { border-color:transparent !important; } ';
-				}
-				if(is_ie7 || is_ie6) {
-					css_string += '' +
-					'.jstree .jstree-wholerow, .jstree .jstree-wholerow li, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow a { margin:0; padding:0; line-height:18px; } ' +
-					'.jstree .jstree-wholerow a { display:block; height:18px; line-height:18px; overflow:hidden; } ';
-				}
-				$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-			});
-		})(jQuery);
-		//*/
-		
-		/*
-		* jsTree model plugin
-		* This plugin gets jstree to use a class model to retrieve data, creating great dynamism
-		*/
-		(function ($) {
-			var nodeInterface = ["getChildren","getChildrenCount","getAttr","getName","getProps"],
-			validateInterface = function(obj, inter) {
-				var valid = true;
-				obj = obj || {};
-				inter = [].concat(inter);
-				$.each(inter, function (i, v) {
-					if(!$.isFunction(obj[v])) { valid = false; return false; }
-				});
-				return valid;
-			};
-			$.jstree.plugin("model", {
-				__init : function () {
-					if(!this.data.json_data) { throw "jsTree model: jsTree json_data plugin not included."; }
-					this._get_settings().json_data.data = function (n, b) {
-						var obj = (n == -1) ? this._get_settings().model.object : n.data("jstree_model");
-						if(!validateInterface(obj, nodeInterface)) { return b.call(null, false); }
-						if(this._get_settings().model.async) {
-							obj.getChildren($.proxy(function (data) {
-								this.model_done(data, b);
-							}, this));
-						}
-						else {
-							this.model_done(obj.getChildren(), b);
-						}
-					};
-				},
-				defaults : {
-					object : false,
-					id_prefix : false,
-					async : false
-				},
-				_fn : {
-					model_done : function (data, callback) {
-						var ret = [],
-						s = this._get_settings(),
-						_this = this;
-						
-						if(!$.isArray(data)) { data = [data]; }
-						$.each(data, function (i, nd) {
-							var r = nd.getProps() || {};
-							r.attr = nd.getAttr() || {};
-							if(nd.getChildrenCount()) { r.state = "closed"; }
-							r.data = nd.getName();
-							if(!$.isArray(r.data)) { r.data = [r.data]; }
-							if(_this.data.types && $.isFunction(nd.getType)) {
-								r.attr[s.types.type_attr] = nd.getType();
-							}
-							if(r.attr.id && s.model.id_prefix) { r.attr.id = s.model.id_prefix + r.attr.id; }
-							if(!r.metadata) { r.metadata = { }; }
-							r.metadata.jstree_model = nd;
-							ret.push(r);
-						});
-						callback.call(null, ret);
-					}
-				}
-			});
-		})(jQuery);
-		//*/
-		
-	})();
\ No newline at end of file
diff --git a/sources/WebContent/old/js/libs/jquery.qtip.js b/sources/WebContent/old/js/libs/jquery.qtip.js
deleted file mode 100644
index 529b149..0000000
--- a/sources/WebContent/old/js/libs/jquery.qtip.js
+++ /dev/null
@@ -1,3293 +0,0 @@
-
-/*
-* qTip2 - Pretty powerful tooltips - v2.2.0
-* http://qtip2.com
-*
-* Copyright (c) 2014 Craig Michael Thompson
-* Released under the MIT, GPL licenses
-* http://jquery.org/license
-*
-* Date: Sat Mar 15 2014 09:24 EDT-0400
-* Plugins: tips viewport imagemap svg modal
-* Styles: basic css3
-*/
-/*global window: false, jQuery: false, console: false, define: false */
-
-/* Cache window, document, undefined */
-(function( window, document, undefined ) {
-	
-	// Uses AMD or browser globals to create a jQuery plugin.
-	(function( factory ) {
-		"use strict";
-		if(typeof define === 'function' && define.amd) {
-			define(['jquery'], factory);
-		}
-		else if(jQuery && !jQuery.fn.qtip) {
-			factory(jQuery);
-		}
-	}
-	(function($) {
-		"use strict"; // Enable ECMAScript "strict" operation for this function. See more: http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
-		
-// Munge the primitives - Paul Irish tip
-		var TRUE = true,
-		FALSE = false,
-		NULL = null,
-		
-		// Common variables
-		X = 'x', Y = 'y',
-		WIDTH = 'width',
-		HEIGHT = 'height',
-		
-		// Positioning sides
-		TOP = 'top',
-		LEFT = 'left',
-		BOTTOM = 'bottom',
-		RIGHT = 'right',
-		CENTER = 'center',
-		
-		// Position adjustment types
-		FLIP = 'flip',
-		FLIPINVERT = 'flipinvert',
-		SHIFT = 'shift',
-		
-		// Shortcut vars
-		QTIP, PROTOTYPE, CORNER, CHECKS,
-		PLUGINS = {},
-		NAMESPACE = 'qtip',
-		ATTR_HAS = 'data-hasqtip',
-		ATTR_ID = 'data-qtip-id',
-		WIDGET = ['ui-widget', 'ui-tooltip'],
-		SELECTOR = '.'+NAMESPACE,
-		INACTIVE_EVENTS = 'click dblclick mousedown mouseup mousemove mouseleave mouseenter'.split(' '),
-		
-		CLASS_FIXED = NAMESPACE+'-fixed',
-		CLASS_DEFAULT = NAMESPACE + '-default',
-		CLASS_FOCUS = NAMESPACE + '-focus',
-		CLASS_HOVER = NAMESPACE + '-hover',
-		CLASS_DISABLED = NAMESPACE+'-disabled',
-		
-		replaceSuffix = '_replacedByqTip',
-		oldtitle = 'oldtitle',
-		trackingBound,
-		
-		// Browser detection
-		BROWSER = {
-			/*
-			* IE version detection
-			*
-			* Adapted from: http://ajaxian.com/archives/attack-of-the-ie-conditional-comment
-			* Credit to James Padolsey for the original implemntation!
-			*/
-			ie: (function(){
-				var v = 3, div = document.createElement('div');
-				while ((div.innerHTML = '<!--[if gt IE '+(++v)+']><i></i><![endif]-->')) {
-					if(!div.getElementsByTagName('i')[0]) { break; }
-				}
-				return v > 4 ? v : NaN;
-			}()),
-			
-			/*
-			* iOS version detection
-			*/
-			iOS: parseFloat(
-			('' + (/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0,''])[1])
-			.replace('undefined', '3_2').replace('_', '.').replace('_', '')
-			) || FALSE
-		};
-		
-function QTip(target, options, id, attr) {
-			// Elements and ID
-			this.id = id;
-			this.target = target;
-			this.tooltip = NULL;
-			this.elements = { target: target };
-			
-			// Internal constructs
-			this._id = NAMESPACE + '-' + id;
-			this.timers = { img: {} };
-			this.options = options;
-			this.plugins = {};
-			
-			// Cache object
-			this.cache = {
-				event: {},
-				target: $(),
-				disabled: FALSE,
-				attr: attr,
-				onTooltip: FALSE,
-				lastClass: ''
-			};
-			
-			// Set the initial flags
-			this.rendered = this.destroyed = this.disabled = this.waiting =
-			this.hiddenDuringWait = this.positioning = this.triggering = FALSE;
-		}
-		PROTOTYPE = QTip.prototype;
-		
-		PROTOTYPE._when = function(deferreds) {
-			return $.when.apply($, deferreds);
-		};
-		
-		PROTOTYPE.render = function(show) {
-			if(this.rendered || this.destroyed) { return this; } // If tooltip has already been rendered, exit
-			
-			var self = this,
-			options = this.options,
-			cache = this.cache,
-			elements = this.elements,
-			text = options.content.text,
-			title = options.content.title,
-			button = options.content.button,
-			posOptions = options.position,
-			namespace = '.'+this._id+' ',
-			deferreds = [],
-			tooltip;
-			
-			// Add ARIA attributes to target
-			$.attr(this.target[0], 'aria-describedby', this._id);
-			
-			// Create tooltip element
-			this.tooltip = elements.tooltip = tooltip = $('<div/>', {
-				'id': this._id,
-				'class': [ NAMESPACE, CLASS_DEFAULT, options.style.classes, NAMESPACE + '-pos-' + options.position.my.abbrev() ].join(' '),
-				'width': options.style.width || '',
-				'height': options.style.height || '',
-				'tracking': posOptions.target === 'mouse' && posOptions.adjust.mouse,
-				
-				/* ARIA specific attributes */
-				'role': 'alert',
-				'aria-live': 'polite',
-				'aria-atomic': FALSE,
-				'aria-describedby': this._id + '-content',
-				'aria-hidden': TRUE
-			})
-			.toggleClass(CLASS_DISABLED, this.disabled)
-			.attr(ATTR_ID, this.id)
-			.data(NAMESPACE, this)
-			.appendTo(posOptions.container)
-			.append(
-			// Create content element
-			elements.content = $('<div />', {
-				'class': NAMESPACE + '-content',
-				'id': this._id + '-content',
-				'aria-atomic': TRUE
-			})
-			);
-			
-			// Set rendered flag and prevent redundant reposition calls for now
-			this.rendered = -1;
-			this.positioning = TRUE;
-			
-			// Create title...
-			if(title) {
-				this._createTitle();
-				
-				// Update title only if its not a callback (called in toggle if so)
-				if(!$.isFunction(title)) {
-					deferreds.push( this._updateTitle(title, FALSE) );
-				}
-			}
-			
-			// Create button
-			if(button) { this._createButton(); }
-			
-			// Set proper rendered flag and update content if not a callback function (called in toggle)
-			if(!$.isFunction(text)) {
-				deferreds.push( this._updateContent(text, FALSE) );
-			}
-			this.rendered = TRUE;
-			
-			// Setup widget classes
-			this._setWidget();
-			
-			// Initialize 'render' plugins
-			$.each(PLUGINS, function(name) {
-				var instance;
-				if(this.initialize === 'render' && (instance = this(self))) {
-					self.plugins[name] = instance;
-				}
-			});
-			
-			// Unassign initial events and assign proper events
-			this._unassignEvents();
-			this._assignEvents();
-			
-			// When deferreds have completed
-			this._when(deferreds).then(function() {
-				// tooltiprender event
-				self._trigger('render');
-				
-				// Reset flags
-				self.positioning = FALSE;
-				
-				// Show tooltip if not hidden during wait period
-				if(!self.hiddenDuringWait && (options.show.ready || show)) {
-					self.toggle(TRUE, cache.event, FALSE);
-				}
-				self.hiddenDuringWait = FALSE;
-			});
-			
-			// Expose API
-			QTIP.api[this.id] = this;
-			
-			return this;
-		};
-		
-		PROTOTYPE.destroy = function(immediate) {
-			// Set flag the signify destroy is taking place to plugins
-			// and ensure it only gets destroyed once!
-			if(this.destroyed) { return this.target; }
-			
-			function process() {
-				if(this.destroyed) { return; }
-				this.destroyed = TRUE;
-				
-				var target = this.target,
-				title = target.attr(oldtitle);
-				
-				// Destroy tooltip if rendered
-				if(this.rendered) {
-					this.tooltip.stop(1,0).find('*').remove().end().remove();
-				}
-				
-				// Destroy all plugins
-				$.each(this.plugins, function(name) {
-					this.destroy && this.destroy();
-				});
-				
-				// Clear timers and remove bound events
-				clearTimeout(this.timers.show);
-				clearTimeout(this.timers.hide);
-				this._unassignEvents();
-				
-				// Remove api object and ARIA attributes
-				target.removeData(NAMESPACE)
-				.removeAttr(ATTR_ID)
-				.removeAttr(ATTR_HAS)
-				.removeAttr('aria-describedby');
-				
-				// Reset old title attribute if removed
-				if(this.options.suppress && title) {
-					target.attr('title', title).removeAttr(oldtitle);
-				}
-				
-				// Remove qTip events associated with this API
-				this._unbind(target);
-				
-				// Remove ID from used id objects, and delete object references
-				// for better garbage collection and leak protection
-				this.options = this.elements = this.cache = this.timers =
-				this.plugins = this.mouse = NULL;
-				
-				// Delete epoxsed API object
-				delete QTIP.api[this.id];
-			}
-			
-			// If an immediate destory is needed
-			if((immediate !== TRUE || this.triggering === 'hide') && this.rendered) {
-				this.tooltip.one('tooltiphidden', $.proxy(process, this));
-				!this.triggering && this.hide();
-			}
-			
-			// If we're not in the process of hiding... process
-			else { process.call(this); }
-			
-			return this.target;
-		};
-		
-function invalidOpt(a) {
-			return a === NULL || $.type(a) !== 'object';
-		}
-		
-		function invalidContent(c) {
-			return !( $.isFunction(c) || (c && c.attr) || c.length || ($.type(c) === 'object' && (c.jquery || c.then) ));
-		}
-		
-		// Option object sanitizer
-		function sanitizeOptions(opts) {
-			var content, text, ajax, once;
-			
-			if(invalidOpt(opts)) { return FALSE; }
-			
-			if(invalidOpt(opts.metadata)) {
-				opts.metadata = { type: opts.metadata };
-			}
-			
-			if('content' in opts) {
-				content = opts.content;
-				
-				if(invalidOpt(content) || content.jquery || content.done) {
-					content = opts.content = {
-						text: (text = invalidContent(content) ? FALSE : content)
-					};
-				}
-				else { text = content.text; }
-				
-				// DEPRECATED - Old content.ajax plugin functionality
-				// Converts it into the proper Deferred syntax
-				if('ajax' in content) {
-					ajax = content.ajax;
-					once = ajax && ajax.once !== FALSE;
-					delete content.ajax;
-					
-					content.text = function(event, api) {
-						var loading = text || $(this).attr(api.options.content.attr) || 'Loading...',
-						
-						deferred = $.ajax(
-						$.extend({}, ajax, { context: api })
-						)
-						.then(ajax.success, NULL, ajax.error)
-						.then(function(content) {
-							if(content && once) { api.set('content.text', content); }
-							return content;
-						},
-						function(xhr, status, error) {
-							if(api.destroyed || xhr.status === 0) { return; }
-							api.set('content.text', status + ': ' + error);
-						});
-						
-						return !once ? (api.set('content.text', loading), deferred) : loading;
-					};
-				}
-				
-				if('title' in content) {
-					if(!invalidOpt(content.title)) {
-						content.button = content.title.button;
-						content.title = content.title.text;
-					}
-					
-					if(invalidContent(content.title || FALSE)) {
-						content.title = FALSE;
-					}
-				}
-			}
-			
-			if('position' in opts && invalidOpt(opts.position)) {
-				opts.position = { my: opts.position, at: opts.position };
-			}
-			
-			if('show' in opts && invalidOpt(opts.show)) {
-				opts.show = opts.show.jquery ? { target: opts.show } :
-				opts.show === TRUE ? { ready: TRUE } : { event: opts.show };
-			}
-			
-			if('hide' in opts && invalidOpt(opts.hide)) {
-				opts.hide = opts.hide.jquery ? { target: opts.hide } : { event: opts.hide };
-			}
-			
-			if('style' in opts && invalidOpt(opts.style)) {
-				opts.style = { classes: opts.style };
-			}
-			
-			// Sanitize plugin options
-			$.each(PLUGINS, function() {
-				this.sanitize && this.sanitize(opts);
-			});
-			
-			return opts;
-		}
-		
-		// Setup builtin .set() option checks
-		CHECKS = PROTOTYPE.checks = {
-			builtin: {
-				// Core checks
-				'^id$': function(obj, o, v, prev) {
-					var id = v === TRUE ? QTIP.nextid : v,
-					new_id = NAMESPACE + '-' + id;
-					
-					if(id !== FALSE && id.length > 0 && !$('#'+new_id).length) {
-						this._id = new_id;
-						
-						if(this.rendered) {
-							this.tooltip[0].id = this._id;
-							this.elements.content[0].id = this._id + '-content';
-							this.elements.title[0].id = this._id + '-title';
-						}
-					}
-					else { obj[o] = prev; }
-				},
-				'^prerender': function(obj, o, v) {
-					v && !this.rendered && this.render(this.options.show.ready);
-				},
-				
-				// Content checks
-				'^content.text$': function(obj, o, v) {
-					this._updateContent(v);
-				},
-				'^content.attr$': function(obj, o, v, prev) {
-					if(this.options.content.text === this.target.attr(prev)) {
-						this._updateContent( this.target.attr(v) );
-					}
-				},
-				'^content.title$': function(obj, o, v) {
-					// Remove title if content is null
-					if(!v) { return this._removeTitle(); }
-					
-					// If title isn't already created, create it now and update
-					v && !this.elements.title && this._createTitle();
-					this._updateTitle(v);
-				},
-				'^content.button$': function(obj, o, v) {
-					this._updateButton(v);
-				},
-				'^content.title.(text|button)$': function(obj, o, v) {
-					this.set('content.'+o, v); // Backwards title.text/button compat
-				},
-				
-				// Position checks
-				'^position.(my|at)$': function(obj, o, v){
-					'string' === typeof v && (obj[o] = new CORNER(v, o === 'at'));
-				},
-				'^position.container$': function(obj, o, v){
-					this.rendered && this.tooltip.appendTo(v);
-				},
-				
-				// Show checks
-				'^show.ready$': function(obj, o, v) {
-					v && (!this.rendered && this.render(TRUE) || this.toggle(TRUE));
-				},
-				
-				// Style checks
-				'^style.classes$': function(obj, o, v, p) {
-					this.rendered && this.tooltip.removeClass(p).addClass(v);
-				},
-				'^style.(width|height)': function(obj, o, v) {
-					this.rendered && this.tooltip.css(o, v);
-				},
-				'^style.widget|content.title': function() {
-					this.rendered && this._setWidget();
-				},
-				'^style.def': function(obj, o, v) {
-					this.rendered && this.tooltip.toggleClass(CLASS_DEFAULT, !!v);
-				},
-				
-				// Events check
-				'^events.(render|show|move|hide|focus|blur)$': function(obj, o, v) {
-					this.rendered && this.tooltip[($.isFunction(v) ? '' : 'un') + 'bind']('tooltip'+o, v);
-				},
-				
-				// Properties which require event reassignment
-				'^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)': function() {
-					if(!this.rendered) { return; }
-					
-					// Set tracking flag
-					var posOptions = this.options.position;
-					this.tooltip.attr('tracking', posOptions.target === 'mouse' && posOptions.adjust.mouse);
-					
-					// Reassign events
-					this._unassignEvents();
-					this._assignEvents();
-				}
-			}
-		};
-		
-		// Dot notation converter
-		function convertNotation(options, notation) {
-			var i = 0, obj, option = options,
-			
-			// Split notation into array
-			levels = notation.split('.');
-			
-			// Loop through
-			while( option = option[ levels[i++] ] ) {
-				if(i < levels.length) { obj = option; }
-			}
-			
-			return [obj || options, levels.pop()];
-		}
-		
-		PROTOTYPE.get = function(notation) {
-			if(this.destroyed) { return this; }
-			
-			var o = convertNotation(this.options, notation.toLowerCase()),
-			result = o[0][ o[1] ];
-			
-			return result.precedance ? result.string() : result;
-		};
-		
-		function setCallback(notation, args) {
-			var category, rule, match;
-			
-			for(category in this.checks) {
-				for(rule in this.checks[category]) {
-					if(match = (new RegExp(rule, 'i')).exec(notation)) {
-						args.push(match);
-						
-						if(category === 'builtin' || this.plugins[category]) {
-							this.checks[category][rule].apply(
-							this.plugins[category] || this, args
-							);
-						}
-					}
-				}
-			}
-		}
-		
-		var rmove = /^position\.(my|at|adjust|target|container|viewport)|style|content|show\.ready/i,
-		rrender = /^prerender|show\.ready/i;
-		
-		PROTOTYPE.set = function(option, value) {
-			if(this.destroyed) { return this; }
-			
-			var rendered = this.rendered,
-			reposition = FALSE,
-			options = this.options,
-			checks = this.checks,
-			name;
-			
-			// Convert singular option/value pair into object form
-			if('string' === typeof option) {
-				name = option; option = {}; option[name] = value;
-			}
-			else { option = $.extend({}, option); }
-			
-			// Set all of the defined options to their new values
-			$.each(option, function(notation, value) {
-				if(rendered && rrender.test(notation)) {
-					delete option[notation]; return;
-				}
-				
-				// Set new obj value
-				var obj = convertNotation(options, notation.toLowerCase()), previous;
-				previous = obj[0][ obj[1] ];
-				obj[0][ obj[1] ] = value && value.nodeType ? $(value) : value;
-				
-				// Also check if we need to reposition
-				reposition = rmove.test(notation) || reposition;
-				
-				// Set the new params for the callback
-				option[notation] = [obj[0], obj[1], value, previous];
-			});
-			
-			// Re-sanitize options
-			sanitizeOptions(options);
-			
-			/*
-			* Execute any valid callbacks for the set options
-			* Also set positioning flag so we don't get loads of redundant repositioning calls.
-			*/
-			this.positioning = TRUE;
-			$.each(option, $.proxy(setCallback, this));
-			this.positioning = FALSE;
-			
-			// Update position if needed
-			if(this.rendered && this.tooltip[0].offsetWidth > 0 && reposition) {
-				this.reposition( options.position.target === 'mouse' ? NULL : this.cache.event );
-			}
-			
-			return this;
-		};
-		
-PROTOTYPE._update = function (content, element, reposition) {
-			var self = this,
-			cache = this.cache;
-			
-			// Make sure tooltip is rendered and content is defined. If not return
-			if(!this.rendered || !content) { return FALSE; }
-			
-			// Use function to parse content
-			if($.isFunction(content)) {
-				content = content.call(this.elements.target, cache.event, this) || '';
-			}
-			
-			// Handle deferred content
-			if($.isFunction(content.then)) {
-				cache.waiting = TRUE;
-				return content.then(function(c) {
-					cache.waiting = FALSE;
-					return self._update(c, element);
-					}, NULL, function(e) {
-					return self._update(e, element);
-				});
-			}
-			
-			// If content is null... return false
-			if(content === FALSE || (!content && content !== '')) { return FALSE; }
-			
-			// Append new content if its a DOM array and show it if hidden
-			if(content.jquery && content.length > 0) {
-				element.empty().append(
-				content.css({ display: 'block', visibility: 'visible' })
-				);
-			}
-			
-			// Content is a regular string, insert the new content
-			else { element.html(content); }
-			
-			// Wait for content to be loaded, and reposition
-			return this._waitForContent(element).then(function(images) {
-				if(images.images && images.images.length && self.rendered && self.tooltip[0].offsetWidth > 0) {
-					self.reposition(cache.event, !images.length);
-				}
-			});
-		};
-		
-		PROTOTYPE._waitForContent = function(element) {
-			var cache = this.cache;
-			
-			// Set flag
-			cache.waiting = TRUE;
-			
-			// If imagesLoaded is included, ensure images have loaded and return promise
-			return ( $.fn.imagesLoaded ? element.imagesLoaded() : $.Deferred().resolve([]) )
-			.done(function() { cache.waiting = FALSE; })
-			.promise();
-		};
-		
-		PROTOTYPE._updateContent = function(content, reposition) {
-			this._update(content, this.elements.content, reposition);
-		};
-		
-		PROTOTYPE._updateTitle = function(content, reposition) {
-			if(this._update(content, this.elements.title, reposition) === FALSE) {
-				this._removeTitle(FALSE);
-			}
-		};
-		
-		PROTOTYPE._createTitle = function()		{
-			var elements = this.elements,
-			id = this._id+'-title';
-			
-			// Destroy previous title element, if present
-			if(elements.titlebar) { this._removeTitle(); }
-			
-			// Create title bar and title elements
-			elements.titlebar = $('<div />', {
-				'class': NAMESPACE + '-titlebar ' + (this.options.style.widget ? createWidgetClass('header') : '')
-			})
-			.append(
-			elements.title = $('<div />', {
-				'id': id,
-				'class': NAMESPACE + '-title',
-				'aria-atomic': TRUE
-			})
-			)
-			.insertBefore(elements.content)
-			
-			// Button-specific events
-			.delegate('.qtip-close', 'mousedown keydown mouseup keyup mouseout', function(event) {
-				$(this).toggleClass('ui-state-active ui-state-focus', event.type.substr(-4) === 'down');
-			})
-			.delegate('.qtip-close', 'mouseover mouseout', function(event){
-				$(this).toggleClass('ui-state-hover', event.type === 'mouseover');
-			});
-			
-			// Create button if enabled
-			if(this.options.content.button) { this._createButton(); }
-		};
-		
-		PROTOTYPE._removeTitle = function(reposition)		{
-			var elements = this.elements;
-			
-			if(elements.title) {
-				elements.titlebar.remove();
-				elements.titlebar = elements.title = elements.button = NULL;
-				
-				// Reposition if enabled
-				if(reposition !== FALSE) { this.reposition(); }
-			}
-		};
-		
-PROTOTYPE.reposition = function (event, effect) {
-			if(!this.rendered || this.positioning || this.destroyed) { return this; }
-			
-			// Set positioning flag
-			this.positioning = TRUE;
-			
-			var cache = this.cache,
-			tooltip = this.tooltip,
-			posOptions = this.options.position,
-			target = posOptions.target,
-			my = posOptions.my,
-			at = posOptions.at,
-			viewport = posOptions.viewport,
-			container = posOptions.container,
-			adjust = posOptions.adjust,
-			method = adjust.method.split(' '),
-			tooltipWidth = tooltip.outerWidth(FALSE),
-			tooltipHeight = tooltip.outerHeight(FALSE),
-			targetWidth = 0,
-			targetHeight = 0,
-			type = tooltip.css('position'),
-			position = { left: 0, top: 0 },
-			visible = tooltip[0].offsetWidth > 0,
-			isScroll = event && event.type === 'scroll',
-			win = $(window),
-			doc = container[0].ownerDocument,
-			mouse = this.mouse,
-			pluginCalculations, offset;
-			
-			// Check if absolute position was passed
-			if($.isArray(target) && target.length === 2) {
-				// Force left top and set position
-				at = { x: LEFT, y: TOP };
-				position = { left: target[0], top: target[1] };
-			}
-			
-			// Check if mouse was the target
-			else if(target === 'mouse') {
-				// Force left top to allow flipping
-				at = { x: LEFT, y: TOP };
-				
-				// Use the cached mouse coordinates if available, or passed event has no coordinates
-				if(mouse && mouse.pageX && (adjust.mouse || !event || !event.pageX) ) {
-					event = mouse;
-				}
-				
-				// If the passed event has no coordinates (such as a scroll event)
-				else if(!event || !event.pageX) {
-					// Use the mouse origin that caused the show event, if distance hiding is enabled
-					if((!adjust.mouse || this.options.show.distance) && cache.origin && cache.origin.pageX) {
-						event =  cache.origin;
-					}
-					
-					// Use cached event for resize/scroll events
-					else if(!event || (event && (event.type === 'resize' || event.type === 'scroll'))) {
-						event = cache.event;
-					}
-				}
-				
-				// Calculate body and container offset and take them into account below
-				if(type !== 'static') { position = container.offset(); }
-				if(doc.body.offsetWidth !== (window.innerWidth || doc.documentElement.clientWidth)) {
-					offset = $(document.body).offset();
-				}
-				
-				// Use event coordinates for position
-				position = {
-					left: event.pageX - position.left + (offset && offset.left || 0),
-					top: event.pageY - position.top + (offset && offset.top || 0)
-				};
-				
-				// Scroll events are a pain, some browsers
-				if(adjust.mouse && isScroll && mouse) {
-					position.left -= (mouse.scrollX || 0) - win.scrollLeft();
-					position.top -= (mouse.scrollY || 0) - win.scrollTop();
-				}
-			}
-			
-			// Target wasn't mouse or absolute...
-			else {
-				// Check if event targetting is being used
-				if(target === 'event') {
-					if(event && event.target && event.type !== 'scroll' && event.type !== 'resize') {
-						cache.target = $(event.target);
-					}
-					else if(!event.target) {
-						cache.target = this.elements.target;
-					}
-				}
-				else if(target !== 'event'){
-					cache.target = $(target.jquery ? target : this.elements.target);
-				}
-				target = cache.target;
-				
-				// Parse the target into a jQuery object and make sure there's an element present
-				target = $(target).eq(0);
-				if(target.length === 0) { return this; }
-				
-				// Check if window or document is the target
-				else if(target[0] === document || target[0] === window) {
-					targetWidth = BROWSER.iOS ? window.innerWidth : target.width();
-					targetHeight = BROWSER.iOS ? window.innerHeight : target.height();
-					
-					if(target[0] === window) {
-						position = {
-							top: (viewport || target).scrollTop(),
-							left: (viewport || target).scrollLeft()
-						};
-					}
-				}
-				
-				// Check if the target is an <AREA> element
-				else if(PLUGINS.imagemap && target.is('area')) {
-					pluginCalculations = PLUGINS.imagemap(this, target, at, PLUGINS.viewport ? method : FALSE);
-				}
-				
-				// Check if the target is an SVG element
-				else if(PLUGINS.svg && target && target[0].ownerSVGElement) {
-					pluginCalculations = PLUGINS.svg(this, target, at, PLUGINS.viewport ? method : FALSE);
-				}
-				
-				// Otherwise use regular jQuery methods
-				else {
-					targetWidth = target.outerWidth(FALSE);
-					targetHeight = target.outerHeight(FALSE);
-					position = target.offset();
-				}
-				
-				// Parse returned plugin values into proper variables
-				if(pluginCalculations) {
-					targetWidth = pluginCalculations.width;
-					targetHeight = pluginCalculations.height;
-					offset = pluginCalculations.offset;
-					position = pluginCalculations.position;
-				}
-				
-				// Adjust position to take into account offset parents
-				position = this.reposition.offset(target, position, container);
-				
-				// Adjust for position.fixed tooltips (and also iOS scroll bug in v3.2-4.0 & v4.3-4.3.2)
-				if((BROWSER.iOS > 3.1 && BROWSER.iOS < 4.1) ||
-				(BROWSER.iOS >= 4.3 && BROWSER.iOS < 4.33) ||
-				(!BROWSER.iOS && type === 'fixed')
-				){
-					position.left -= win.scrollLeft();
-					position.top -= win.scrollTop();
-				}
-				
-				// Adjust position relative to target
-				if(!pluginCalculations || (pluginCalculations && pluginCalculations.adjustable !== FALSE)) {
-					position.left += at.x === RIGHT ? targetWidth : at.x === CENTER ? targetWidth / 2 : 0;
-					position.top += at.y === BOTTOM ? targetHeight : at.y === CENTER ? targetHeight / 2 : 0;
-				}
-			}
-			
-			// Adjust position relative to tooltip
-			position.left += adjust.x + (my.x === RIGHT ? -tooltipWidth : my.x === CENTER ? -tooltipWidth / 2 : 0);
-			position.top += adjust.y + (my.y === BOTTOM ? -tooltipHeight : my.y === CENTER ? -tooltipHeight / 2 : 0);
-			
-			// Use viewport adjustment plugin if enabled
-			if(PLUGINS.viewport) {
-				position.adjusted = PLUGINS.viewport(
-				this, position, posOptions, targetWidth, targetHeight, tooltipWidth, tooltipHeight
-				);
-				
-				// Apply offsets supplied by positioning plugin (if used)
-				if(offset && position.adjusted.left) { position.left += offset.left; }
-				if(offset && position.adjusted.top) {  position.top += offset.top; }
-			}
-			
-			// Viewport adjustment is disabled, set values to zero
-			else { position.adjusted = { left: 0, top: 0 }; }
-			
-			// tooltipmove event
-			if(!this._trigger('move', [position, viewport.elem || viewport], event)) { return this; }
-			delete position.adjusted;
-			
-			// If effect is disabled, target it mouse, no animation is defined or positioning gives NaN out, set CSS directly
-			if(effect === FALSE || !visible || isNaN(position.left) || isNaN(position.top) || target === 'mouse' || !$.isFunction(posOptions.effect)) {
-				tooltip.css(position);
-			}
-			
-			// Use custom function if provided
-			else if($.isFunction(posOptions.effect)) {
-				posOptions.effect.call(tooltip, this, $.extend({}, position));
-				tooltip.queue(function(next) {
-					// Reset attributes to avoid cross-browser rendering bugs
-					$(this).css({ opacity: '', height: '' });
-					if(BROWSER.ie) { this.style.removeAttribute('filter'); }
-					
-					next();
-				});
-			}
-			
-			// Set positioning flag
-			this.positioning = FALSE;
-			
-			return this;
-		};
-		
-		// Custom (more correct for qTip!) offset calculator
-		PROTOTYPE.reposition.offset = function(elem, pos, container) {
-			if(!container[0]) { return pos; }
-			
-			var ownerDocument = $(elem[0].ownerDocument),
-			quirks = !!BROWSER.ie && document.compatMode !== 'CSS1Compat',
-			parent = container[0],
-			scrolled, position, parentOffset, overflow;
-			
-			function scroll(e, i) {
-				pos.left += i * e.scrollLeft();
-				pos.top += i * e.scrollTop();
-			}
-			
-			// Compensate for non-static containers offset
-			do {
-				if((position = $.css(parent, 'position')) !== 'static') {
-					if(position === 'fixed') {
-						parentOffset = parent.getBoundingClientRect();
-						scroll(ownerDocument, -1);
-					}
-					else {
-						parentOffset = $(parent).position();
-						parentOffset.left += (parseFloat($.css(parent, 'borderLeftWidth')) || 0);
-						parentOffset.top += (parseFloat($.css(parent, 'borderTopWidth')) || 0);
-					}
-					
-					pos.left -= parentOffset.left + (parseFloat($.css(parent, 'marginLeft')) || 0);
-					pos.top -= parentOffset.top + (parseFloat($.css(parent, 'marginTop')) || 0);
-					
-					// If this is the first parent element with an overflow of "scroll" or "auto", store it
-					if(!scrolled && (overflow = $.css(parent, 'overflow')) !== 'hidden' && overflow !== 'visible') { scrolled = $(parent); }
-				}
-			}
-			while((parent = parent.offsetParent));
-			
-			// Compensate for containers scroll if it also has an offsetParent (or in IE quirks mode)
-			if(scrolled && (scrolled[0] !== ownerDocument[0] || quirks)) {
-				scroll(scrolled, 1);
-			}
-			
-			return pos;
-		};
-		
-		// Corner class
-		var C = (CORNER = PROTOTYPE.reposition.Corner = function(corner, forceY) {
-			corner = ('' + corner).replace(/([A-Z])/, ' $1').replace(/middle/gi, CENTER).toLowerCase();
-			this.x = (corner.match(/left|right/i) || corner.match(/center/) || ['inherit'])[0].toLowerCase();
-			this.y = (corner.match(/top|bottom|center/i) || ['inherit'])[0].toLowerCase();
-			this.forceY = !!forceY;
-			
-			var f = corner.charAt(0);
-			this.precedance = (f === 't' || f === 'b' ? Y : X);
-		}).prototype;
-		
-		C.invert = function(z, center) {
-			this[z] = this[z] === LEFT ? RIGHT : this[z] === RIGHT ? LEFT : center || this[z];
-		};
-		
-		C.string = function() {
-			var x = this.x, y = this.y;
-			return x === y ? x : this.precedance === Y || (this.forceY && y !== 'center') ? y+' '+x : x+' '+y;
-		};
-		
-		C.abbrev = function() {
-			var result = this.string().split(' ');
-			return result[0].charAt(0) + (result[1] && result[1].charAt(0) || '');
-		};
-		
-		C.clone = function() {
-			return new CORNER( this.string(), this.forceY );
-		};
-		PROTOTYPE.toggle = function(state, event) {
-			var cache = this.cache,
-			options = this.options,
-			tooltip = this.tooltip;
-			
-			// Try to prevent flickering when tooltip overlaps show element
-			if(event) {
-				if((/over|enter/).test(event.type) && (/out|leave/).test(cache.event.type) &&
-				options.show.target.add(event.target).length === options.show.target.length &&
-				tooltip.has(event.relatedTarget).length) {
-					return this;
-				}
-				
-				// Cache event
-				cache.event = cloneEvent(event);
-			}
-			
-			// If we're currently waiting and we've just hidden... stop it
-			this.waiting && !state && (this.hiddenDuringWait = TRUE);
-			
-			// Render the tooltip if showing and it isn't already
-			if(!this.rendered) { return state ? this.render(1) : this; }
-			else if(this.destroyed || this.disabled) { return this; }
-			
-			var type = state ? 'show' : 'hide',
-			opts = this.options[type],
-			otherOpts = this.options[ !state ? 'show' : 'hide' ],
-			posOptions = this.options.position,
-			contentOptions = this.options.content,
-			width = this.tooltip.css('width'),
-			visible = this.tooltip.is(':visible'),
-			animate = state || opts.target.length === 1,
-			sameTarget = !event || opts.target.length < 2 || cache.target[0] === event.target,
-			identicalState, allow, showEvent, delay, after;
-			
-			// Detect state if valid one isn't provided
-			if((typeof state).search('boolean|number')) { state = !visible; }
-			
-			// Check if the tooltip is in an identical state to the new would-be state
-			identicalState = !tooltip.is(':animated') && visible === state && sameTarget;
-			
-			// Fire tooltip(show/hide) event and check if destroyed
-			allow = !identicalState ? !!this._trigger(type, [90]) : NULL;
-			
-			// Check to make sure the tooltip wasn't destroyed in the callback
-			if(this.destroyed) { return this; }
-			
-			// If the user didn't stop the method prematurely and we're showing the tooltip, focus it
-			if(allow !== FALSE && state) { this.focus(event); }
-			
-			// If the state hasn't changed or the user stopped it, return early
-			if(!allow || identicalState) { return this; }
-			
-			// Set ARIA hidden attribute
-			$.attr(tooltip[0], 'aria-hidden', !!!state);
-			
-			// Execute state specific properties
-			if(state) {
-				// Store show origin coordinates
-				cache.origin = cloneEvent(this.mouse);
-				
-				// Update tooltip content & title if it's a dynamic function
-				if($.isFunction(contentOptions.text)) { this._updateContent(contentOptions.text, FALSE); }
-				if($.isFunction(contentOptions.title)) { this._updateTitle(contentOptions.title, FALSE); }
-				
-				// Cache mousemove events for positioning purposes (if not already tracking)
-				if(!trackingBound && posOptions.target === 'mouse' && posOptions.adjust.mouse) {
-					$(document).bind('mousemove.'+NAMESPACE, this._storeMouse);
-					trackingBound = TRUE;
-				}
-				
-				// Update the tooltip position (set width first to prevent viewport/max-width issues)
-				if(!width) { tooltip.css('width', tooltip.outerWidth(FALSE)); }
-				this.reposition(event, arguments[2]);
-				if(!width) { tooltip.css('width', ''); }
-				
-				// Hide other tooltips if tooltip is solo
-				if(!!opts.solo) {
-					(typeof opts.solo === 'string' ? $(opts.solo) : $(SELECTOR, opts.solo))
-					.not(tooltip).not(opts.target).qtip('hide', $.Event('tooltipsolo'));
-				}
-			}
-			else {
-				// Clear show timer if we're hiding
-				clearTimeout(this.timers.show);
-				
-				// Remove cached origin on hide
-				delete cache.origin;
-				
-				// Remove mouse tracking event if not needed (all tracking qTips are hidden)
-				if(trackingBound && !$(SELECTOR+'[tracking="true"]:visible', opts.solo).not(tooltip).length) {
-					$(document).unbind('mousemove.'+NAMESPACE);
-					trackingBound = FALSE;
-				}
-				
-				// Blur the tooltip
-				this.blur(event);
-			}
-			
-			// Define post-animation, state specific properties
-			after = $.proxy(function() {
-				if(state) {
-					// Prevent antialias from disappearing in IE by removing filter
-					if(BROWSER.ie) { tooltip[0].style.removeAttribute('filter'); }
-					
-					// Remove overflow setting to prevent tip bugs
-					tooltip.css('overflow', '');
-					
-					// Autofocus elements if enabled
-					if('string' === typeof opts.autofocus) {
-						$(this.options.show.autofocus, tooltip).focus();
-					}
-					
-					// If set, hide tooltip when inactive for delay period
-					this.options.show.target.trigger('qtip-'+this.id+'-inactive');
-				}
-				else {
-					// Reset CSS states
-					tooltip.css({
-						display: '',
-						visibility: '',
-						opacity: '',
-						left: '',
-						top: ''
-					});
-				}
-				
-				// tooltipvisible/tooltiphidden events
-				this._trigger(state ? 'visible' : 'hidden');
-			}, this);
-			
-			// If no effect type is supplied, use a simple toggle
-			if(opts.effect === FALSE || animate === FALSE) {
-				tooltip[ type ]();
-				after();
-			}
-			
-			// Use custom function if provided
-			else if($.isFunction(opts.effect)) {
-				tooltip.stop(1, 1);
-				opts.effect.call(tooltip, this);
-				tooltip.queue('fx', function(n) {
-					after(); n();
-				});
-			}
-			
-			// Use basic fade function by default
-			else { tooltip.fadeTo(90, state ? 1 : 0, after); }
-			
-			// If inactive hide method is set, active it
-			if(state) { opts.target.trigger('qtip-'+this.id+'-inactive'); }
-			
-			return this;
-		};
-		
-		PROTOTYPE.show = function(event) { return this.toggle(TRUE, event); };
-		
-		PROTOTYPE.hide = function(event) { return this.toggle(FALSE, event); };
-		
-PROTOTYPE.focus = function (event) {
-			if(!this.rendered || this.destroyed) { return this; }
-			
-			var qtips = $(SELECTOR),
-			tooltip = this.tooltip,
-			curIndex = parseInt(tooltip[0].style.zIndex, 10),
-			newIndex = QTIP.zindex + qtips.length,
-			focusedElem;
-			
-			// Only update the z-index if it has changed and tooltip is not already focused
-			if(!tooltip.hasClass(CLASS_FOCUS)) {
-				// tooltipfocus event
-				if(this._trigger('focus', [newIndex], event)) {
-					// Only update z-index's if they've changed
-					if(curIndex !== newIndex) {
-						// Reduce our z-index's and keep them properly ordered
-						qtips.each(function() {
-							if(this.style.zIndex > curIndex) {
-								this.style.zIndex = this.style.zIndex - 1;
-							}
-						});
-						
-						// Fire blur event for focused tooltip
-						qtips.filter('.' + CLASS_FOCUS).qtip('blur', event);
-					}
-					
-					// Set the new z-index
-					tooltip.addClass(CLASS_FOCUS)[0].style.zIndex = newIndex;
-				}
-			}
-			
-			return this;
-		};
-		
-		PROTOTYPE.blur = function(event) {
-			if(!this.rendered || this.destroyed) { return this; }
-			
-			// Set focused status to FALSE
-			this.tooltip.removeClass(CLASS_FOCUS);
-			
-			// tooltipblur event
-			this._trigger('blur', [ this.tooltip.css('zIndex') ], event);
-			
-			return this;
-		};
-		
-PROTOTYPE.disable = function (state) {
-			if(this.destroyed) { return this; }
-			
-			// If 'toggle' is passed, toggle the current state
-			if(state === 'toggle') {
-				state = !(this.rendered ? this.tooltip.hasClass(CLASS_DISABLED) : this.disabled);
-			}
-			
-			// Disable if no state passed
-			else if('boolean' !== typeof state) {
-				state = TRUE;
-			}
-			
-			if(this.rendered) {
-				this.tooltip.toggleClass(CLASS_DISABLED, state)
-				.attr('aria-disabled', state);
-			}
-			
-			this.disabled = !!state;
-			
-			return this;
-		};
-		
-		PROTOTYPE.enable = function() { return this.disable(FALSE); };
-		
-PROTOTYPE._createButton = function () {
-			var self = this,
-			elements = this.elements,
-			tooltip = elements.tooltip,
-			button = this.options.content.button,
-			isString = typeof button === 'string',
-			close = isString ? button : 'Close tooltip';
-			
-			if(elements.button) { elements.button.remove(); }
-			
-			// Use custom button if one was supplied by user, else use default
-			if(button.jquery) {
-				elements.button = button;
-			}
-			else {
-				elements.button = $('<a />', {
-					'class': 'qtip-close ' + (this.options.style.widget ? '' : NAMESPACE+'-icon'),
-					'title': close,
-					'aria-label': close
-				})
-				.prepend(
-				$('<span />', {
-					'class': 'ui-icon ui-icon-close',
-					'html': '&times;'
-				})
-				);
-			}
-			
-			// Create button and setup attributes
-			elements.button.appendTo(elements.titlebar || tooltip)
-			.attr('role', 'button')
-			.click(function(event) {
-				if(!tooltip.hasClass(CLASS_DISABLED)) { self.hide(event); }
-				return FALSE;
-			});
-		};
-		
-		PROTOTYPE._updateButton = function(button)		{
-			// Make sure tooltip is rendered and if not, return
-			if(!this.rendered) { return FALSE; }
-			
-			var elem = this.elements.button;
-			if(button) { this._createButton(); }
-			else { elem.remove(); }
-		};
-		
-// Widget class creator
-		function createWidgetClass(cls) {
-			return WIDGET.concat('').join(cls ? '-'+cls+' ' : ' ');
-		}
-		
-		// Widget class setter method
-		PROTOTYPE._setWidget = function()		{
-			var on = this.options.style.widget,
-			elements = this.elements,
-			tooltip = elements.tooltip,
-			disabled = tooltip.hasClass(CLASS_DISABLED);
-			
-			tooltip.removeClass(CLASS_DISABLED);
-			CLASS_DISABLED = on ? 'ui-state-disabled' : 'qtip-disabled';
-			tooltip.toggleClass(CLASS_DISABLED, disabled);
-			
-			tooltip.toggleClass('ui-helper-reset '+createWidgetClass(), on).toggleClass(CLASS_DEFAULT, this.options.style.def && !on);
-			
-			if(elements.content) {
-				elements.content.toggleClass( createWidgetClass('content'), on);
-			}
-			if(elements.titlebar) {
-				elements.titlebar.toggleClass( createWidgetClass('header'), on);
-			}
-			if(elements.button) {
-				elements.button.toggleClass(NAMESPACE+'-icon', !on);
-			}
-		};
-		function cloneEvent(event) {
-			return event && {
-				type: event.type,
-				pageX: event.pageX,
-				pageY: event.pageY,
-				target: event.target,
-				relatedTarget: event.relatedTarget,
-				scrollX: event.scrollX || window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft,
-				scrollY: event.scrollY || window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop
-				} || {};
-			}
-			
-			function delay(callback, duration) {
-				// If tooltip has displayed, start hide timer
-				if(duration > 0) {
-					return setTimeout(
-					$.proxy(callback, this), duration
-					);
-				}
-				else{ callback.call(this); }
-			}
-			
-			function showMethod(event) {
-				if(this.tooltip.hasClass(CLASS_DISABLED)) { return FALSE; }
-				
-				// Clear hide timers
-				clearTimeout(this.timers.show);
-				clearTimeout(this.timers.hide);
-				
-				// Start show timer
-				this.timers.show = delay.call(this,
-				function() { this.toggle(TRUE, event); },
-				this.options.show.delay
-				);
-			}
-			
-			function hideMethod(event) {
-				if(this.tooltip.hasClass(CLASS_DISABLED)) { return FALSE; }
-				
-				// Check if new target was actually the tooltip element
-				var relatedTarget = $(event.relatedTarget),
-				ontoTooltip = relatedTarget.closest(SELECTOR)[0] === this.tooltip[0],
-				ontoTarget = relatedTarget[0] === this.options.show.target[0];
-				
-				// Clear timers and stop animation queue
-				clearTimeout(this.timers.show);
-				clearTimeout(this.timers.hide);
-				
-				// Prevent hiding if tooltip is fixed and event target is the tooltip.
-				// Or if mouse positioning is enabled and cursor momentarily overlaps
-				if(this !== relatedTarget[0] &&
-				(this.options.position.target === 'mouse' && ontoTooltip) ||
-				(this.options.hide.fixed && (
-				(/mouse(out|leave|move)/).test(event.type) && (ontoTooltip || ontoTarget))
-				))				{
-					try {
-						event.preventDefault();
-						event.stopImmediatePropagation();
-						} catch(e) {}
-						
-						return;
-					}
-					
-					// If tooltip has displayed, start hide timer
-					this.timers.hide = delay.call(this,
-					function() { this.toggle(FALSE, event); },
-					this.options.hide.delay,
-					this
-					);
-				}
-				
-				function inactiveMethod(event) {
-					if(this.tooltip.hasClass(CLASS_DISABLED) || !this.options.hide.inactive) { return FALSE; }
-					
-					// Clear timer
-					clearTimeout(this.timers.inactive);
-					
-					this.timers.inactive = delay.call(this,
-					function(){ this.hide(event); },
-					this.options.hide.inactive
-					);
-				}
-				
-				function repositionMethod(event) {
-					if(this.rendered && this.tooltip[0].offsetWidth > 0) { this.reposition(event); }
-				}
-				
-				// Store mouse coordinates
-				PROTOTYPE._storeMouse = function(event) {
-					(this.mouse = cloneEvent(event)).type = 'mousemove';
-				};
-				
-				// Bind events
-				PROTOTYPE._bind = function(targets, events, method, suffix, context) {
-					var ns = '.' + this._id + (suffix ? '-'+suffix : '');
-					events.length && $(targets).bind(
-					(events.split ? events : events.join(ns + ' ')) + ns,
-					$.proxy(method, context || this)
-					);
-				};
-				PROTOTYPE._unbind = function(targets, suffix) {
-					$(targets).unbind('.' + this._id + (suffix ? '-'+suffix : ''));
-				};
-				
-				// Apply common event handlers using delegate (avoids excessive .bind calls!)
-				var ns = '.'+NAMESPACE;
-				function delegate(selector, events, method) {
-					$(document.body).delegate(selector,
-					(events.split ? events : events.join(ns + ' ')) + ns,
-					function() {
-						var api = QTIP.api[ $.attr(this, ATTR_ID) ];
-						api && !api.disabled && method.apply(api, arguments);
-					}
-					);
-				}
-				
-				$(function() {
-					delegate(SELECTOR, ['mouseenter', 'mouseleave'], function(event) {
-						var state = event.type === 'mouseenter',
-						tooltip = $(event.currentTarget),
-						target = $(event.relatedTarget || event.target),
-						options = this.options;
-						
-						// On mouseenter...
-						if(state) {
-							// Focus the tooltip on mouseenter (z-index stacking)
-							this.focus(event);
-							
-							// Clear hide timer on tooltip hover to prevent it from closing
-							tooltip.hasClass(CLASS_FIXED) && !tooltip.hasClass(CLASS_DISABLED) && clearTimeout(this.timers.hide);
-						}
-						
-						// On mouseleave...
-						else {
-							// Hide when we leave the tooltip and not onto the show target (if a hide event is set)
-							if(options.position.target === 'mouse' && options.hide.event &&
-							options.show.target && !target.closest(options.show.target[0]).length) {
-								this.hide(event);
-							}
-						}
-						
-						// Add hover class
-						tooltip.toggleClass(CLASS_HOVER, state);
-					});
-					
-					// Define events which reset the 'inactive' event handler
-					delegate('['+ATTR_ID+']', INACTIVE_EVENTS, inactiveMethod);
-				});
-				
-				// Event trigger
-				PROTOTYPE._trigger = function(type, args, event) {
-					var callback = $.Event('tooltip'+type);
-					callback.originalEvent = (event && $.extend({}, event)) || this.cache.event || NULL;
-					
-					this.triggering = type;
-					this.tooltip.trigger(callback, [this].concat(args || []));
-					this.triggering = FALSE;
-					
-					return !callback.isDefaultPrevented();
-				};
-				
-				PROTOTYPE._bindEvents = function(showEvents, hideEvents, showTarget, hideTarget, showMethod, hideMethod) {
-					// If hide and show targets are the same...
-					if(hideTarget.add(showTarget).length === hideTarget.length) {
-						var toggleEvents = [];
-						
-						// Filter identical show/hide events
-						hideEvents = $.map(hideEvents, function(type) {
-							var showIndex = $.inArray(type, showEvents);
-							
-							// Both events are identical, remove from both hide and show events
-							// and append to toggleEvents
-							if(showIndex > -1) {
-								toggleEvents.push( showEvents.splice( showIndex, 1 )[0] );
-								return;
-							}
-							
-							return type;
-						});
-						
-						// Toggle events are special case of identical show/hide events, which happen in sequence
-						toggleEvents.length && this._bind(showTarget, toggleEvents, function(event) {
-							var state = this.rendered ? this.tooltip[0].offsetWidth > 0 : false;
-							(state ? hideMethod : showMethod).call(this, event);
-						});
-					}
-					
-					// Apply show/hide/toggle events
-					this._bind(showTarget, showEvents, showMethod);
-					this._bind(hideTarget, hideEvents, hideMethod);
-				};
-				
-				PROTOTYPE._assignInitialEvents = function(event) {
-					var options = this.options,
-					showTarget = options.show.target,
-					hideTarget = options.hide.target,
-					showEvents = options.show.event ? $.trim('' + options.show.event).split(' ') : [],
-					hideEvents = options.hide.event ? $.trim('' + options.hide.event).split(' ') : [];
-					
-					/*
-					* Make sure hoverIntent functions properly by using mouseleave as a hide event if
-					* mouseenter/mouseout is used for show.event, even if it isn't in the users options.
-					*/
-					if(/mouse(over|enter)/i.test(options.show.event) && !/mouse(out|leave)/i.test(options.hide.event)) {
-						hideEvents.push('mouseleave');
-					}
-					
-					/*
-					* Also make sure initial mouse targetting works correctly by caching mousemove coords
-					* on show targets before the tooltip has rendered. Also set onTarget when triggered to
-					* keep mouse tracking working.
-					*/
-					this._bind(showTarget, 'mousemove', function(event) {
-						this._storeMouse(event);
-						this.cache.onTarget = TRUE;
-					});
-					
-					// Define hoverIntent function
-					function hoverIntent(event) {
-						// Only continue if tooltip isn't disabled
-						if(this.disabled || this.destroyed) { return FALSE; }
-						
-						// Cache the event data
-						this.cache.event = cloneEvent(event);
-						this.cache.target = event ? $(event.target) : [undefined];
-						
-						// Start the event sequence
-						clearTimeout(this.timers.show);
-						this.timers.show = delay.call(this,
-						function() { this.render(typeof event === 'object' || options.show.ready); },
-						options.show.delay
-						);
-					}
-					
-					// Filter and bind events
-					this._bindEvents(showEvents, hideEvents, showTarget, hideTarget, hoverIntent, function() {
-						clearTimeout(this.timers.show);
-					});
-					
-					// Prerendering is enabled, create tooltip now
-					if(options.show.ready || options.prerender) { hoverIntent.call(this, event); }
-				};
-				
-				// Event assignment method
-				PROTOTYPE._assignEvents = function() {
-					var self = this,
-					options = this.options,
-					posOptions = options.position,
-					
-					tooltip = this.tooltip,
-					showTarget = options.show.target,
-					hideTarget = options.hide.target,
-					containerTarget = posOptions.container,
-					viewportTarget = posOptions.viewport,
-					documentTarget = $(document),
-					bodyTarget = $(document.body),
-					windowTarget = $(window),
-					
-					showEvents = options.show.event ? $.trim('' + options.show.event).split(' ') : [],
-					hideEvents = options.hide.event ? $.trim('' + options.hide.event).split(' ') : [];
-					
-					
-					// Assign passed event callbacks
-					$.each(options.events, function(name, callback) {
-						self._bind(tooltip, name === 'toggle' ? ['tooltipshow','tooltiphide'] : ['tooltip'+name], callback, null, tooltip);
-					});
-					
-					// Hide tooltips when leaving current window/frame (but not select/option elements)
-					if(/mouse(out|leave)/i.test(options.hide.event) && options.hide.leave === 'window') {
-						this._bind(documentTarget, ['mouseout', 'blur'], function(event) {
-							if(!/select|option/.test(event.target.nodeName) && !event.relatedTarget) {
-								this.hide(event);
-							}
-						});
-					}
-					
-					// Enable hide.fixed by adding appropriate class
-					if(options.hide.fixed) {
-						hideTarget = hideTarget.add( tooltip.addClass(CLASS_FIXED) );
-					}
-					
-					/*
-					* Make sure hoverIntent functions properly by using mouseleave to clear show timer if
-					* mouseenter/mouseout is used for show.event, even if it isn't in the users options.
-					*/
-					else if(/mouse(over|enter)/i.test(options.show.event)) {
-						this._bind(hideTarget, 'mouseleave', function() {
-							clearTimeout(this.timers.show);
-						});
-					}
-					
-					// Hide tooltip on document mousedown if unfocus events are enabled
-					if(('' + options.hide.event).indexOf('unfocus') > -1) {
-						this._bind(containerTarget.closest('html'), ['mousedown', 'touchstart'], function(event) {
-							var elem = $(event.target),
-							enabled = this.rendered && !this.tooltip.hasClass(CLASS_DISABLED) && this.tooltip[0].offsetWidth > 0,
-							isAncestor = elem.parents(SELECTOR).filter(this.tooltip[0]).length > 0;
-							
-							if(elem[0] !== this.target[0] && elem[0] !== this.tooltip[0] && !isAncestor &&
-							!this.target.has(elem[0]).length && enabled
-							) {
-								this.hide(event);
-							}
-						});
-					}
-					
-					// Check if the tooltip hides when inactive
-					if('number' === typeof options.hide.inactive) {
-						// Bind inactive method to show target(s) as a custom event
-						this._bind(showTarget, 'qtip-'+this.id+'-inactive', inactiveMethod);
-						
-						// Define events which reset the 'inactive' event handler
-						this._bind(hideTarget.add(tooltip), QTIP.inactiveEvents, inactiveMethod, '-inactive');
-					}
-					
-					// Filter and bind events
-					this._bindEvents(showEvents, hideEvents, showTarget, hideTarget, showMethod, hideMethod);
-					
-					// Mouse movement bindings
-					this._bind(showTarget.add(tooltip), 'mousemove', function(event) {
-						// Check if the tooltip hides when mouse is moved a certain distance
-						if('number' === typeof options.hide.distance) {
-							var origin = this.cache.origin || {},
-							limit = this.options.hide.distance,
-							abs = Math.abs;
-							
-							// Check if the movement has gone beyond the limit, and hide it if so
-							if(abs(event.pageX - origin.pageX) >= limit || abs(event.pageY - origin.pageY) >= limit) {
-								this.hide(event);
-							}
-						}
-						
-						// Cache mousemove coords on show targets
-						this._storeMouse(event);
-					});
-					
-					// Mouse positioning events
-					if(posOptions.target === 'mouse') {
-						// If mouse adjustment is on...
-						if(posOptions.adjust.mouse) {
-							// Apply a mouseleave event so we don't get problems with overlapping
-							if(options.hide.event) {
-								// Track if we're on the target or not
-								this._bind(showTarget, ['mouseenter', 'mouseleave'], function(event) {
-									this.cache.onTarget = event.type === 'mouseenter';
-								});
-							}
-							
-							// Update tooltip position on mousemove
-							this._bind(documentTarget, 'mousemove', function(event) {
-								// Update the tooltip position only if the tooltip is visible and adjustment is enabled
-								if(this.rendered && this.cache.onTarget && !this.tooltip.hasClass(CLASS_DISABLED) && this.tooltip[0].offsetWidth > 0) {
-									this.reposition(event);
-								}
-							});
-						}
-					}
-					
-					// Adjust positions of the tooltip on window resize if enabled
-					if(posOptions.adjust.resize || viewportTarget.length) {
-						this._bind( $.event.special.resize ? viewportTarget : windowTarget, 'resize', repositionMethod );
-					}
-					
-					// Adjust tooltip position on scroll of the window or viewport element if present
-					if(posOptions.adjust.scroll) {
-						this._bind( windowTarget.add(posOptions.container), 'scroll', repositionMethod );
-					}
-				};
-				
-				// Un-assignment method
-				PROTOTYPE._unassignEvents = function() {
-					var targets = [
-					this.options.show.target[0],
-					this.options.hide.target[0],
-					this.rendered && this.tooltip[0],
-					this.options.position.container[0],
-					this.options.position.viewport[0],
-					this.options.position.container.closest('html')[0], // unfocus
-					window,
-					document
-					];
-					
-					this._unbind($([]).pushStack( $.grep(targets, function(i) {
-						return typeof i === 'object';
-					})));
-				};
-		
-// Initialization method
-		function init(elem, id, opts) {
-					var obj, posOptions, attr, config, title,
-					
-					// Setup element references
-					docBody = $(document.body),
-					
-					// Use document body instead of document element if needed
-					newTarget = elem[0] === document ? docBody : elem,
-					
-					// Grab metadata from element if plugin is present
-					metadata = (elem.metadata) ? elem.metadata(opts.metadata) : NULL,
-					
-					// If metadata type if HTML5, grab 'name' from the object instead, or use the regular data object otherwise
-					metadata5 = opts.metadata.type === 'html5' && metadata ? metadata[opts.metadata.name] : NULL,
-					
-					// Grab data from metadata.name (or data-qtipopts as fallback) using .data() method,
-					html5 = elem.data(opts.metadata.name || 'qtipopts');
-					
-					// If we don't get an object returned attempt to parse it manualyl without parseJSON
-					try { html5 = typeof html5 === 'string' ? $.parseJSON(html5) : html5; } catch(e) {}
-					
-					// Merge in and sanitize metadata
-					config = $.extend(TRUE, {}, QTIP.defaults, opts,
-					typeof html5 === 'object' ? sanitizeOptions(html5) : NULL,
-					sanitizeOptions(metadata5 || metadata));
-					
-					// Re-grab our positioning options now we've merged our metadata and set id to passed value
-					posOptions = config.position;
-					config.id = id;
-					
-					// Setup missing content if none is detected
-					if('boolean' === typeof config.content.text) {
-						attr = elem.attr(config.content.attr);
-						
-						// Grab from supplied attribute if available
-						if(config.content.attr !== FALSE && attr) { config.content.text = attr; }
-						
-						// No valid content was found, abort render
-						else { return FALSE; }
-					}
-					
-					// Setup target options
-					if(!posOptions.container.length) { posOptions.container = docBody; }
-					if(posOptions.target === FALSE) { posOptions.target = newTarget; }
-					if(config.show.target === FALSE) { config.show.target = newTarget; }
-					if(config.show.solo === TRUE) { config.show.solo = posOptions.container.closest('body'); }
-					if(config.hide.target === FALSE) { config.hide.target = newTarget; }
-					if(config.position.viewport === TRUE) { config.position.viewport = posOptions.container; }
-					
-					// Ensure we only use a single container
-					posOptions.container = posOptions.container.eq(0);
-					
-					// Convert position corner values into x and y strings
-					posOptions.at = new CORNER(posOptions.at, TRUE);
-					posOptions.my = new CORNER(posOptions.my);
-					
-					// Destroy previous tooltip if overwrite is enabled, or skip element if not
-					if(elem.data(NAMESPACE)) {
-						if(config.overwrite) {
-							elem.qtip('destroy', true);
-						}
-						else if(config.overwrite === FALSE) {
-							return FALSE;
-						}
-					}
-					
-					// Add has-qtip attribute
-					elem.attr(ATTR_HAS, id);
-					
-					// Remove title attribute and store it if present
-					if(config.suppress && (title = elem.attr('title'))) {
-						// Final attr call fixes event delegatiom and IE default tooltip showing problem
-						elem.removeAttr('title').attr(oldtitle, title).attr('title', '');
-					}
-					
-					// Initialize the tooltip and add API reference
-					obj = new QTip(elem, config, id, !!attr);
-					elem.data(NAMESPACE, obj);
-					
-					// Catch remove/removeqtip events on target element to destroy redundant tooltip
-					elem.one('remove.qtip-'+id+' removeqtip.qtip-'+id, function() {
-						var api; if((api = $(this).data(NAMESPACE))) { api.destroy(true); }
-					});
-					
-					return obj;
-				}
-				
-				// jQuery $.fn extension method
-				QTIP = $.fn.qtip = function(options, notation, newValue)				{
-					var command = ('' + options).toLowerCase(), // Parse command
-					returned = NULL,
-					args = $.makeArray(arguments).slice(1),
-					event = args[args.length - 1],
-					opts = this[0] ? $.data(this[0], NAMESPACE) : NULL;
-					
-					// Check for API request
-					if((!arguments.length && opts) || command === 'api') {
-						return opts;
-					}
-					
-					// Execute API command if present
-					else if('string' === typeof options) {
-						this.each(function() {
-							var api = $.data(this, NAMESPACE);
-							if(!api) { return TRUE; }
-							
-							// Cache the event if possible
-							if(event && event.timeStamp) { api.cache.event = event; }
-							
-							// Check for specific API commands
-							if(notation && (command === 'option' || command === 'options')) {
-								if(newValue !== undefined || $.isPlainObject(notation)) {
-									api.set(notation, newValue);
-								}
-								else {
-									returned = api.get(notation);
-									return FALSE;
-								}
-							}
-							
-							// Execute API command
-							else if(api[command]) {
-								api[command].apply(api, args);
-							}
-						});
-						
-						return returned !== NULL ? returned : this;
-					}
-					
-					// No API commands. validate provided options and setup qTips
-					else if('object' === typeof options || !arguments.length) {
-						// Sanitize options first
-						opts = sanitizeOptions($.extend(TRUE, {}, options));
-						
-						return this.each(function(i) {
-							var api, id;
-							
-							// Find next available ID, or use custom ID if provided
-							id = $.isArray(opts.id) ? opts.id[i] : opts.id;
-							id = !id || id === FALSE || id.length < 1 || QTIP.api[id] ? QTIP.nextid++ : id;
-							
-							// Initialize the qTip and re-grab newly sanitized options
-							api = init($(this), id, opts);
-							if(api === FALSE) { return TRUE; }
-							else { QTIP.api[id] = api; }
-							
-							// Initialize plugins
-							$.each(PLUGINS, function() {
-								if(this.initialize === 'initialize') { this(api); }
-							});
-							
-							// Assign initial pre-render events
-							api._assignInitialEvents(event);
-						});
-					}
-				};
-				
-				// Expose class
-				$.qtip = QTip;
-				
-				// Populated in render method
-				QTIP.api = {};
-		$.each({
-			/* Allow other plugins to successfully retrieve the title of an element with a qTip applied */
-					attr: function(attr, val) {
-						if(this.length) {
-							var self = this[0],
-							title = 'title',
-							api = $.data(self, 'qtip');
-							
-							if(attr === title && api && 'object' === typeof api && api.options.suppress) {
-								if(arguments.length < 2) {
-									return $.attr(self, oldtitle);
-								}
-								
-								// If qTip is rendered and title was originally used as content, update it
-								if(api && api.options.content.attr === title && api.cache.attr) {
-									api.set('content.text', val);
-								}
-								
-								// Use the regular attr method to set, then cache the result
-								return this.attr(oldtitle, val);
-							}
-						}
-						
-						return $.fn['attr'+replaceSuffix].apply(this, arguments);
-					},
-					
-					/* Allow clone to correctly retrieve cached title attributes */
-					clone: function(keepData) {
-						var titles = $([]), title = 'title',
-						
-						// Clone our element using the real clone method
-						elems = $.fn['clone'+replaceSuffix].apply(this, arguments);
-						
-						// Grab all elements with an oldtitle set, and change it to regular title attribute, if keepData is false
-						if(!keepData) {
-							elems.filter('['+oldtitle+']').attr('title', function() {
-								return $.attr(this, oldtitle);
-							})
-							.removeAttr(oldtitle);
-						}
-						
-						return elems;
-					}
-					}, function(name, func) {
-					if(!func || $.fn[name+replaceSuffix]) { return TRUE; }
-					
-					var old = $.fn[name+replaceSuffix] = $.fn[name];
-					$.fn[name] = function() {
-						return func.apply(this, arguments) || old.apply(this, arguments);
-					};
-				});
-				
-				/* Fire off 'removeqtip' handler in $.cleanData if jQuery UI not present (it already does similar).
-				* This snippet is taken directly from jQuery UI source code found here:
-				*     http://code.jquery.com/ui/jquery-ui-git.js
-				*/
-				if(!$.ui) {
-					$['cleanData'+replaceSuffix] = $.cleanData;
-					$.cleanData = function( elems ) {
-						for(var i = 0, elem; (elem = $( elems[i] )).length; i++) {
-							if(elem.attr(ATTR_HAS)) {
-								try { elem.triggerHandler('removeqtip'); }
-								catch( e ) {}
-							}
-						}
-						$['cleanData'+replaceSuffix].apply(this, arguments);
-					};
-				}
-		
-// qTip version
-		QTIP.version = '2.2.0';
-				
-				// Base ID for all qTips
-				QTIP.nextid = 0;
-				
-				// Inactive events array
-				QTIP.inactiveEvents = INACTIVE_EVENTS;
-				
-				// Base z-index for all qTips
-				QTIP.zindex = 15000;
-				
-				// Define configuration defaults
-				QTIP.defaults = {
-					prerender: FALSE,
-					id: FALSE,
-					overwrite: TRUE,
-					suppress: TRUE,
-					content: {
-						text: TRUE,
-						attr: 'title',
-						title: FALSE,
-						button: FALSE
-					},
-					position: {
-						my: 'top left',
-						at: 'bottom right',
-						target: FALSE,
-						container: FALSE,
-						viewport: FALSE,
-						adjust: {
-							x: 0, y: 0,
-							mouse: TRUE,
-							scroll: TRUE,
-							resize: TRUE,
-							method: 'flipinvert flipinvert'
-						},
-						effect: function(api, pos, viewport) {
-							$(this).animate(pos, {
-								duration: 200,
-								queue: FALSE
-							});
-						}
-					},
-					show: {
-						target: FALSE,
-						event: 'mouseenter',
-						effect: TRUE,
-						delay: 90,
-						solo: FALSE,
-						ready: FALSE,
-						autofocus: FALSE
-					},
-					hide: {
-						target: FALSE,
-						event: 'mouseleave',
-						effect: TRUE,
-						delay: 0,
-						fixed: FALSE,
-						inactive: FALSE,
-						leave: 'window',
-						distance: FALSE
-					},
-					style: {
-						classes: '',
-						widget: FALSE,
-						width: FALSE,
-						height: FALSE,
-						def: TRUE
-					},
-					events: {
-						render: NULL,
-						move: NULL,
-						show: NULL,
-						hide: NULL,
-						toggle: NULL,
-						visible: NULL,
-						hidden: NULL,
-						focus: NULL,
-						blur: NULL
-					}
-				};
-		
-var TIP,
-		// .bind()/.on() namespace
-				TIPNS = '.qtip-tip',
-				
-				// Common CSS strings
-				MARGIN = 'margin',
-				BORDER = 'border',
-				COLOR = 'color',
-				BG_COLOR = 'background-color',
-				TRANSPARENT = 'transparent',
-				IMPORTANT = ' !important',
-				
-				// Check if the browser supports <canvas/> elements
-				HASCANVAS = !!document.createElement('canvas').getContext,
-				
-				// Invalid colour values used in parseColours()
-				INVALID = /rgba?\(0, 0, 0(, 0)?\)|transparent|#123456/i;
-				
-				// Camel-case method, taken from jQuery source
-				// http://code.jquery.com/jquery-1.8.0.js
-				function camel(s) { return s.charAt(0).toUpperCase() + s.slice(1); }
-				
-				/*
-				* Modified from Modernizr's testPropsAll()
-				* http://modernizr.com/downloads/modernizr-latest.js
-				*/
-				var cssProps = {}, cssPrefixes = ["Webkit", "O", "Moz", "ms"];
-				function vendorCss(elem, prop) {
-					var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
-					props = (prop + ' ' + cssPrefixes.join(ucProp + ' ') + ucProp).split(' '),
-					cur, val, i = 0;
-					
-					// If the property has already been mapped...
-					if(cssProps[prop]) { return elem.css(cssProps[prop]); }
-					
-					while((cur = props[i++])) {
-						if((val = elem.css(cur)) !== undefined) {
-							return cssProps[prop] = cur, val;
-						}
-					}
-				}
-				
-				// Parse a given elements CSS property into an int
-				function intCss(elem, prop) {
-					return Math.ceil(parseFloat(vendorCss(elem, prop)));
-				}
-				
-				
-				// VML creation (for IE only)
-				if(!HASCANVAS) {
-					var createVML = function(tag, props, style) {
-						return '<qtipvml:'+tag+' xmlns="urn:schemas-microsoft.com:vml" class="qtip-vml" '+(props||'')+
-						' style="behavior: url(#default#VML); '+(style||'')+ '" />';
-					};
-				}
-				
-				// Canvas only definitions
-				else {
-					var PIXEL_RATIO = window.devicePixelRatio || 1,
-					BACKING_STORE_RATIO = (function() {
-						var context = document.createElement('canvas').getContext('2d');
-						return context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio ||
-						context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || 1;
-					}()),
-					SCALE = PIXEL_RATIO / BACKING_STORE_RATIO;
-				}
-				
-				
-				function Tip(qtip, options) {
-					this._ns = 'tip';
-					this.options = options;
-					this.offset = options.offset;
-					this.size = [ options.width, options.height ];
-					
-					// Initialize
-					this.init( (this.qtip = qtip) );
-				}
-				
-				$.extend(Tip.prototype, {
-					init: function(qtip) {
-						var context, tip;
-						
-						// Create tip element and prepend to the tooltip
-						tip = this.element = qtip.elements.tip = $('<div />', { 'class': NAMESPACE+'-tip' }).prependTo(qtip.tooltip);
-						
-						// Create tip drawing element(s)
-						if(HASCANVAS) {
-							// save() as soon as we create the canvas element so FF2 doesn't bork on our first restore()!
-							context = $('<canvas />').appendTo(this.element)[0].getContext('2d');
-							
-							// Setup constant parameters
-							context.lineJoin = 'miter';
-							context.miterLimit = 100000;
-							context.save();
-						}
-						else {
-							context = createVML('shape', 'coordorigin="0,0"', 'position:absolute;');
-							this.element.html(context + context);
-							
-							// Prevent mousing down on the tip since it causes problems with .live() handling in IE due to VML
-							qtip._bind( $('*', tip).add(tip), ['click', 'mousedown'], function(event) { event.stopPropagation(); }, this._ns);
-						}
-						
-						// Bind update events
-						qtip._bind(qtip.tooltip, 'tooltipmove', this.reposition, this._ns, this);
-						
-						// Create it
-						this.create();
-					},
-					
-					_swapDimensions: function() {
-						this.size[0] = this.options.height;
-						this.size[1] = this.options.width;
-					},
-					_resetDimensions: function() {
-						this.size[0] = this.options.width;
-						this.size[1] = this.options.height;
-					},
-					
-					_useTitle: function(corner) {
-						var titlebar = this.qtip.elements.titlebar;
-						return titlebar && (
-						corner.y === TOP || (corner.y === CENTER && this.element.position().top + (this.size[1] / 2) + this.options.offset < titlebar.outerHeight(TRUE))
-						);
-					},
-					
-					_parseCorner: function(corner) {
-						var my = this.qtip.options.position.my;
-						
-						// Detect corner and mimic properties
-						if(corner === FALSE || my === FALSE) {
-							corner = FALSE;
-						}
-						else if(corner === TRUE) {
-							corner = new CORNER( my.string() );
-						}
-						else if(!corner.string) {
-							corner = new CORNER(corner);
-							corner.fixed = TRUE;
-						}
-						
-						return corner;
-					},
-					
-					_parseWidth: function(corner, side, use) {
-						var elements = this.qtip.elements,
-						prop = BORDER + camel(side) + 'Width';
-						
-						return (use ? intCss(use, prop) : (
-						intCss(elements.content, prop) ||
-						intCss(this._useTitle(corner) && elements.titlebar || elements.content, prop) ||
-						intCss(elements.tooltip, prop)
-						)) || 0;
-					},
-					
-					_parseRadius: function(corner) {
-						var elements = this.qtip.elements,
-						prop = BORDER + camel(corner.y) + camel(corner.x) + 'Radius';
-						
-						return BROWSER.ie < 9 ? 0 :
-						intCss(this._useTitle(corner) && elements.titlebar || elements.content, prop) ||
-						intCss(elements.tooltip, prop) || 0;
-					},
-					
-					_invalidColour: function(elem, prop, compare) {
-						var val = elem.css(prop);
-						return !val || (compare && val === elem.css(compare)) || INVALID.test(val) ? FALSE : val;
-					},
-					
-					_parseColours: function(corner) {
-						var elements = this.qtip.elements,
-						tip = this.element.css('cssText', ''),
-						borderSide = BORDER + camel(corner[ corner.precedance ]) + camel(COLOR),
-						colorElem = this._useTitle(corner) && elements.titlebar || elements.content,
-						css = this._invalidColour, color = [];
-						
-						// Attempt to detect the background colour from various elements, left-to-right precedance
-						color[0] = css(tip, BG_COLOR) || css(colorElem, BG_COLOR) || css(elements.content, BG_COLOR) ||
-						css(elements.tooltip, BG_COLOR) || tip.css(BG_COLOR);
-						
-						// Attempt to detect the correct border side colour from various elements, left-to-right precedance
-						color[1] = css(tip, borderSide, COLOR) || css(colorElem, borderSide, COLOR) ||
-						css(elements.content, borderSide, COLOR) || css(elements.tooltip, borderSide, COLOR) || elements.tooltip.css(borderSide);
-						
-						// Reset background and border colours
-						$('*', tip).add(tip).css('cssText', BG_COLOR+':'+TRANSPARENT+IMPORTANT+';'+BORDER+':0'+IMPORTANT+';');
-						
-						return color;
-					},
-					
-					_calculateSize: function(corner) {
-						var y = corner.precedance === Y,
-						width = this.options['width'],
-						height = this.options['height'],
-						isCenter = corner.abbrev() === 'c',
-						base = (y ? width: height) * (isCenter ? 0.5 : 1),
-						pow = Math.pow,
-						round = Math.round,
-						bigHyp, ratio, result,
-						
-						smallHyp = Math.sqrt( pow(base, 2) + pow(height, 2) ),
-						hyp = [ (this.border / base) * smallHyp, (this.border / height) * smallHyp ];
-						
-						hyp[2] = Math.sqrt( pow(hyp[0], 2) - pow(this.border, 2) );
-						hyp[3] = Math.sqrt( pow(hyp[1], 2) - pow(this.border, 2) );
-						
-						bigHyp = smallHyp + hyp[2] + hyp[3] + (isCenter ? 0 : hyp[0]);
-						ratio = bigHyp / smallHyp;
-						
-						result = [ round(ratio * width), round(ratio * height) ];
-						return y ? result : result.reverse();
-					},
-					
-					// Tip coordinates calculator
-					_calculateTip: function(corner, size, scale) {
-						scale = scale || 1;
-						size = size || this.size;
-						
-						var width = size[0] * scale,
-						height = size[1] * scale,
-						width2 = Math.ceil(width / 2), height2 = Math.ceil(height / 2),
-						
-						// Define tip coordinates in terms of height and width values
-						tips = {
-							br:	[0,0,		width,height,	width,0],
-							bl:	[0,0,		width,0,		0,height],
-							tr:	[0,height,	width,0,		width,height],
-							tl:	[0,0,		0,height,		width,height],
-							tc:	[0,height,	width2,0,		width,height],
-							bc:	[0,0,		width,0,		width2,height],
-							rc:	[0,0,		width,height2,	0,height],
-							lc:	[width,0,	width,height,	0,height2]
-						};
-						
-						// Set common side shapes
-						tips.lt = tips.br; tips.rt = tips.bl;
-						tips.lb = tips.tr; tips.rb = tips.tl;
-						
-						return tips[ corner.abbrev() ];
-					},
-					
-					// Tip coordinates drawer (canvas)
-					_drawCoords: function(context, coords) {
-						context.beginPath();
-						context.moveTo(coords[0], coords[1]);
-						context.lineTo(coords[2], coords[3]);
-						context.lineTo(coords[4], coords[5]);
-						context.closePath();
-					},
-					
-					create: function() {
-						// Determine tip corner
-						var c = this.corner = (HASCANVAS || BROWSER.ie) && this._parseCorner(this.options.corner);
-						
-						// If we have a tip corner...
-						if( (this.enabled = !!this.corner && this.corner.abbrev() !== 'c') ) {
-							// Cache it
-							this.qtip.cache.corner = c.clone();
-							
-							// Create it
-							this.update();
-						}
-						
-						// Toggle tip element
-						this.element.toggle(this.enabled);
-						
-						return this.corner;
-					},
-					
-					update: function(corner, position) {
-						if(!this.enabled) { return this; }
-						
-						var elements = this.qtip.elements,
-						tip = this.element,
-						inner = tip.children(),
-						options = this.options,
-						curSize = this.size,
-						mimic = options.mimic,
-						round = Math.round,
-						color, precedance, context,
-						coords, bigCoords, translate, newSize, border, BACKING_STORE_RATIO;
-						
-						// Re-determine tip if not already set
-						if(!corner) { corner = this.qtip.cache.corner || this.corner; }
-						
-						// Use corner property if we detect an invalid mimic value
-						if(mimic === FALSE) { mimic = corner; }
-						
-						// Otherwise inherit mimic properties from the corner object as necessary
-						else {
-							mimic = new CORNER(mimic);
-							mimic.precedance = corner.precedance;
-							
-							if(mimic.x === 'inherit') { mimic.x = corner.x; }
-							else if(mimic.y === 'inherit') { mimic.y = corner.y; }
-							else if(mimic.x === mimic.y) {
-								mimic[ corner.precedance ] = corner[ corner.precedance ];
-							}
-						}
-						precedance = mimic.precedance;
-						
-						// Ensure the tip width.height are relative to the tip position
-						if(corner.precedance === X) { this._swapDimensions(); }
-						else { this._resetDimensions(); }
-						
-						// Update our colours
-						color = this.color = this._parseColours(corner);
-						
-						// Detect border width, taking into account colours
-						if(color[1] !== TRANSPARENT) {
-							// Grab border width
-							border = this.border = this._parseWidth(corner, corner[corner.precedance]);
-							
-							// If border width isn't zero, use border color as fill if it's not invalid (1.0 style tips)
-							if(options.border && border < 1 && !INVALID.test(color[1])) { color[0] = color[1]; }
-							
-							// Set border width (use detected border width if options.border is true)
-							this.border = border = options.border !== TRUE ? options.border : border;
-						}
-						
-						// Border colour was invalid, set border to zero
-						else { this.border = border = 0; }
-						
-						// Determine tip size
-						newSize = this.size = this._calculateSize(corner);
-						tip.css({
-							width: newSize[0],
-							height: newSize[1],
-							lineHeight: newSize[1]+'px'
-						});
-						
-						// Calculate tip translation
-						if(corner.precedance === Y) {
-							translate = [
-							round(mimic.x === LEFT ? border : mimic.x === RIGHT ? newSize[0] - curSize[0] - border : (newSize[0] - curSize[0]) / 2),
-							round(mimic.y === TOP ? newSize[1] - curSize[1] : 0)
-							];
-						}
-						else {
-							translate = [
-							round(mimic.x === LEFT ? newSize[0] - curSize[0] : 0),
-							round(mimic.y === TOP ? border : mimic.y === BOTTOM ? newSize[1] - curSize[1] - border : (newSize[1] - curSize[1]) / 2)
-							];
-						}
-						
-						// Canvas drawing implementation
-						if(HASCANVAS) {
-							// Grab canvas context and clear/save it
-							context = inner[0].getContext('2d');
-							context.restore(); context.save();
-							context.clearRect(0,0,6000,6000);
-							
-							// Calculate coordinates
-							coords = this._calculateTip(mimic, curSize, SCALE);
-							bigCoords = this._calculateTip(mimic, this.size, SCALE);
-							
-							// Set the canvas size using calculated size
-							inner.attr(WIDTH, newSize[0] * SCALE).attr(HEIGHT, newSize[1] * SCALE);
-							inner.css(WIDTH, newSize[0]).css(HEIGHT, newSize[1]);
-							
-							// Draw the outer-stroke tip
-							this._drawCoords(context, bigCoords);
-							context.fillStyle = color[1];
-							context.fill();
-							
-							// Draw the actual tip
-							context.translate(translate[0] * SCALE, translate[1] * SCALE);
-							this._drawCoords(context, coords);
-							context.fillStyle = color[0];
-							context.fill();
-						}
-						
-						// VML (IE Proprietary implementation)
-						else {
-							// Calculate coordinates
-							coords = this._calculateTip(mimic);
-							
-							// Setup coordinates string
-							coords = 'm' + coords[0] + ',' + coords[1] + ' l' + coords[2] +
-							',' + coords[3] + ' ' + coords[4] + ',' + coords[5] + ' xe';
-							
-							// Setup VML-specific offset for pixel-perfection
-							translate[2] = border && /^(r|b)/i.test(corner.string()) ?
-							BROWSER.ie === 8 ? 2 : 1 : 0;
-							
-							// Set initial CSS
-							inner.css({
-								coordsize: (newSize[0]+border) + ' ' + (newSize[1]+border),
-								antialias: ''+(mimic.string().indexOf(CENTER) > -1),
-								left: translate[0] - (translate[2] * Number(precedance === X)),
-								top: translate[1] - (translate[2] * Number(precedance === Y)),
-								width: newSize[0] + border,
-								height: newSize[1] + border
-							})
-							.each(function(i) {
-								var $this = $(this);
-								
-								// Set shape specific attributes
-								$this[ $this.prop ? 'prop' : 'attr' ]({
-									coordsize: (newSize[0]+border) + ' ' + (newSize[1]+border),
-									path: coords,
-									fillcolor: color[0],
-									filled: !!i,
-									stroked: !i
-								})
-								.toggle(!!(border || i));
-								
-								// Check if border is enabled and add stroke element
-								!i && $this.html( createVML(
-								'stroke', 'weight="'+(border*2)+'px" color="'+color[1]+'" miterlimit="1000" joinstyle="miter"'
-								) );
-							});
-						}
-						
-						// Opera bug #357 - Incorrect tip position
-						// https://github.com/Craga89/qTip2/issues/367
-						window.opera && setTimeout(function() {
-							elements.tip.css({
-								display: 'inline-block',
-								visibility: 'visible'
-							});
-						}, 1);
-						
-						// Position if needed
-						if(position !== FALSE) { this.calculate(corner, newSize); }
-					},
-					
-					calculate: function(corner, size) {
-						if(!this.enabled) { return FALSE; }
-						
-						var self = this,
-						elements = this.qtip.elements,
-						tip = this.element,
-						userOffset = this.options.offset,
-						isWidget = elements.tooltip.hasClass('ui-widget'),
-						position = {  },
-						precedance, corners;
-						
-						// Inherit corner if not provided
-						corner = corner || this.corner;
-						precedance = corner.precedance;
-						
-						// Determine which tip dimension to use for adjustment
-						size = size || this._calculateSize(corner);
-						
-						// Setup corners and offset array
-						corners = [ corner.x, corner.y ];
-						if(precedance === X) { corners.reverse(); }
-						
-						// Calculate tip position
-						$.each(corners, function(i, side) {
-							var b, bc, br;
-							
-							if(side === CENTER) {
-								b = precedance === Y ? LEFT : TOP;
-								position[ b ] = '50%';
-								position[MARGIN+'-' + b] = -Math.round(size[ precedance === Y ? 0 : 1 ] / 2) + userOffset;
-							}
-							else {
-								b = self._parseWidth(corner, side, elements.tooltip);
-								bc = self._parseWidth(corner, side, elements.content);
-								br = self._parseRadius(corner);
-								
-								position[ side ] = Math.max(-self.border, i ? bc : (userOffset + (br > b ? br : -b)));
-							}
-						});
-						
-						// Adjust for tip size
-						position[ corner[precedance] ] -= size[ precedance === X ? 0 : 1 ];
-						
-						// Set and return new position
-						tip.css({ margin: '', top: '', bottom: '', left: '', right: '' }).css(position);
-						return position;
-					},
-					
-					reposition: function(event, api, pos, viewport) {
-						if(!this.enabled) { return; }
-						
-						var cache = api.cache,
-						newCorner = this.corner.clone(),
-						adjust = pos.adjusted,
-						method = api.options.position.adjust.method.split(' '),
-						horizontal = method[0],
-						vertical = method[1] || method[0],
-						shift = { left: FALSE, top: FALSE, x: 0, y: 0 },
-						offset, css = {}, props;
-						
-						function shiftflip(direction, precedance, popposite, side, opposite) {
-							// Horizontal - Shift or flip method
-							if(direction === SHIFT && newCorner.precedance === precedance && adjust[side] && newCorner[popposite] !== CENTER) {
-								newCorner.precedance = newCorner.precedance === X ? Y : X;
-							}
-							else if(direction !== SHIFT && adjust[side]){
-								newCorner[precedance] = newCorner[precedance] === CENTER ?
-								(adjust[side] > 0 ? side : opposite) : (newCorner[precedance] === side ? opposite : side);
-							}
-						}
-						
-						function shiftonly(xy, side, opposite) {
-							if(newCorner[xy] === CENTER) {
-								css[MARGIN+'-'+side] = shift[xy] = offset[MARGIN+'-'+side] - adjust[side];
-							}
-							else {
-								props = offset[opposite] !== undefined ?
-								[ adjust[side], -offset[side] ] : [ -adjust[side], offset[side] ];
-								
-								if( (shift[xy] = Math.max(props[0], props[1])) > props[0] ) {
-									pos[side] -= adjust[side];
-									shift[side] = FALSE;
-								}
-								
-								css[ offset[opposite] !== undefined ? opposite : side ] = shift[xy];
-							}
-						}
-						
-						// If our tip position isn't fixed e.g. doesn't adjust with viewport...
-						if(this.corner.fixed !== TRUE) {
-							// Perform shift/flip adjustments
-							shiftflip(horizontal, X, Y, LEFT, RIGHT);
-							shiftflip(vertical, Y, X, TOP, BOTTOM);
-							
-							// Update and redraw the tip if needed (check cached details of last drawn tip)
-							if(newCorner.string() !== cache.corner.string() && (cache.cornerTop !== adjust.top || cache.cornerLeft !== adjust.left)) {
-								this.update(newCorner, FALSE);
-							}
-						}
-						
-						// Setup tip offset properties
-						offset = this.calculate(newCorner);
-						
-						// Readjust offset object to make it left/top
-						if(offset.right !== undefined) { offset.left = -offset.right; }
-						if(offset.bottom !== undefined) { offset.top = -offset.bottom; }
-						offset.user = this.offset;
-						
-						// Perform shift adjustments
-						if(shift.left = (horizontal === SHIFT && !!adjust.left)) { shiftonly(X, LEFT, RIGHT); }
-						if(shift.top = (vertical === SHIFT && !!adjust.top)) { shiftonly(Y, TOP, BOTTOM); }
-						
-						/*
-						* If the tip is adjusted in both dimensions, or in a
-						* direction that would cause it to be anywhere but the
-						* outer border, hide it!
-						*/
-						this.element.css(css).toggle(
-						!((shift.x && shift.y) || (newCorner.x === CENTER && shift.y) || (newCorner.y === CENTER && shift.x))
-						);
-						
-						// Adjust position to accomodate tip dimensions
-						pos.left -= offset.left.charAt ? offset.user :
-						horizontal !== SHIFT || shift.top || !shift.left && !shift.top ? offset.left + this.border : 0;
-						pos.top -= offset.top.charAt ? offset.user :
-						vertical !== SHIFT || shift.left || !shift.left && !shift.top ? offset.top + this.border : 0;
-						
-						// Cache details
-						cache.cornerLeft = adjust.left; cache.cornerTop = adjust.top;
-						cache.corner = newCorner.clone();
-					},
-					
-					destroy: function() {
-						// Unbind events
-						this.qtip._unbind(this.qtip.tooltip, this._ns);
-						
-						// Remove the tip element(s)
-						if(this.qtip.elements.tip) {
-							this.qtip.elements.tip.find('*')
-							.remove().end().remove();
-						}
-					}
-				});
-				
-				TIP = PLUGINS.tip = function(api) {
-					return new Tip(api, api.options.style.tip);
-				};
-				
-				// Initialize tip on render
-				TIP.initialize = 'render';
-				
-				// Setup plugin sanitization options
-				TIP.sanitize = function(options) {
-					if(options.style && 'tip' in options.style) {
-						var opts = options.style.tip;
-						if(typeof opts !== 'object') { opts = options.style.tip = { corner: opts }; }
-						if(!(/string|boolean/i).test(typeof opts.corner)) { opts.corner = TRUE; }
-					}
-				};
-				
-				// Add new option checks for the plugin
-				CHECKS.tip = {
-					'^position.my|style.tip.(corner|mimic|border)$': function() {
-						// Make sure a tip can be drawn
-						this.create();
-						
-						// Reposition the tooltip
-						this.qtip.reposition();
-					},
-					'^style.tip.(height|width)$': function(obj) {
-						// Re-set dimensions and redraw the tip
-						this.size = [ obj.width, obj.height ];
-						this.update();
-						
-						// Reposition the tooltip
-						this.qtip.reposition();
-					},
-					'^content.title|style.(classes|widget)$': function() {
-						this.update();
-					}
-				};
-				
-				// Extend original qTip defaults
-				$.extend(TRUE, QTIP.defaults, {
-					style: {
-						tip: {
-							corner: TRUE,
-							mimic: FALSE,
-							width: 6,
-							height: 6,
-							border: TRUE,
-							offset: 0
-						}
-					}
-				});
-		
-PLUGINS.viewport = function (api, position, posOptions, targetWidth, targetHeight, elemWidth, elemHeight) {
-			var target = posOptions.target,
-					tooltip = api.elements.tooltip,
-					my = posOptions.my,
-					at = posOptions.at,
-					adjust = posOptions.adjust,
-					method = adjust.method.split(' '),
-					methodX = method[0],
-					methodY = method[1] || method[0],
-					viewport = posOptions.viewport,
-					container = posOptions.container,
-					cache = api.cache,
-					adjusted = { left: 0, top: 0 },
-					fixed, newMy, newClass, containerOffset, containerStatic,
-					viewportWidth, viewportHeight, viewportScroll, viewportOffset;
-					
-					// If viewport is not a jQuery element, or it's the window/document, or no adjustment method is used... return
-					if(!viewport.jquery || target[0] === window || target[0] === document.body || adjust.method === 'none') {
-						return adjusted;
-					}
-					
-					// Cach container details
-					containerOffset = container.offset() || adjusted;
-					containerStatic = container.css('position') === 'static';
-					
-					// Cache our viewport details
-					fixed = tooltip.css('position') === 'fixed';
-					viewportWidth = viewport[0] === window ? viewport.width() : viewport.outerWidth(FALSE);
-					viewportHeight = viewport[0] === window ? viewport.height() : viewport.outerHeight(FALSE);
-					viewportScroll = { left: fixed ? 0 : viewport.scrollLeft(), top: fixed ? 0 : viewport.scrollTop() };
-					viewportOffset = viewport.offset() || adjusted;
-					
-					// Generic calculation method
-					function calculate(side, otherSide, type, adjust, side1, side2, lengthName, targetLength, elemLength) {
-						var initialPos = position[side1],
-						mySide = my[side],
-						atSide = at[side],
-						isShift = type === SHIFT,
-						myLength = mySide === side1 ? elemLength : mySide === side2 ? -elemLength : -elemLength / 2,
-						atLength = atSide === side1 ? targetLength : atSide === side2 ? -targetLength : -targetLength / 2,
-						sideOffset = viewportScroll[side1] + viewportOffset[side1] - (containerStatic ? 0 : containerOffset[side1]),
-						overflow1 = sideOffset - initialPos,
-						overflow2 = initialPos + elemLength - (lengthName === WIDTH ? viewportWidth : viewportHeight) - sideOffset,
-						offset = myLength - (my.precedance === side || mySide === my[otherSide] ? atLength : 0) - (atSide === CENTER ? targetLength / 2 : 0);
-						
-						// shift
-						if(isShift) {
-							offset = (mySide === side1 ? 1 : -1) * myLength;
-							
-							// Adjust position but keep it within viewport dimensions
-							position[side1] += overflow1 > 0 ? overflow1 : overflow2 > 0 ? -overflow2 : 0;
-							position[side1] = Math.max(
-							-containerOffset[side1] + viewportOffset[side1],
-							initialPos - offset,
-							Math.min(
-							Math.max(
-							-containerOffset[side1] + viewportOffset[side1] + (lengthName === WIDTH ? viewportWidth : viewportHeight),
-							initialPos + offset
-							),
-							position[side1],
-							
-							// Make sure we don't adjust complete off the element when using 'center'
-							mySide === 'center' ? initialPos - myLength : 1E9
-							)
-							);
-							
-						}
-						
-						// flip/flipinvert
-						else {
-							// Update adjustment amount depending on if using flipinvert or flip
-							adjust *= (type === FLIPINVERT ? 2 : 0);
-							
-							// Check for overflow on the left/top
-							if(overflow1 > 0 && (mySide !== side1 || overflow2 > 0)) {
-								position[side1] -= offset + adjust;
-								newMy.invert(side, side1);
-							}
-							
-							// Check for overflow on the bottom/right
-							else if(overflow2 > 0 && (mySide !== side2 || overflow1 > 0)  ) {
-								position[side1] -= (mySide === CENTER ? -offset : offset) + adjust;
-								newMy.invert(side, side2);
-							}
-							
-							// Make sure we haven't made things worse with the adjustment and reset if so
-							if(position[side1] < viewportScroll && -position[side1] > overflow2) {
-								position[side1] = initialPos; newMy = my.clone();
-							}
-						}
-						
-						return position[side1] - initialPos;
-					}
-					
-					// Set newMy if using flip or flipinvert methods
-					if(methodX !== 'shift' || methodY !== 'shift') { newMy = my.clone(); }
-					
-					// Adjust position based onviewport and adjustment options
-					adjusted = {
-						left: methodX !== 'none' ? calculate( X, Y, methodX, adjust.x, LEFT, RIGHT, WIDTH, targetWidth, elemWidth ) : 0,
-						top: methodY !== 'none' ? calculate( Y, X, methodY, adjust.y, TOP, BOTTOM, HEIGHT, targetHeight, elemHeight ) : 0
-					};
-					
-					// Set tooltip position class if it's changed
-					if(newMy && cache.lastClass !== (newClass = NAMESPACE + '-pos-' + newMy.abbrev())) {
-						tooltip.removeClass(api.cache.lastClass).addClass( (api.cache.lastClass = newClass) );
-					}
-					
-					return adjusted;
-				};
-		PLUGINS.polys = {
-			// POLY area coordinate calculator
-					//	Special thanks to Ed Cradock for helping out with this.
-					//	Uses a binary search algorithm to find suitable coordinates.
-					polygon: function(baseCoords, corner) {
-						var result = {
-							width: 0, height: 0,
-							position: {
-								top: 1e10, right: 0,
-								bottom: 0, left: 1e10
-							},
-							adjustable: FALSE
-						},
-						i = 0, next,
-						coords = [],
-						compareX = 1, compareY = 1,
-						realX = 0, realY = 0,
-						newWidth, newHeight;
-						
-						// First pass, sanitize coords and determine outer edges
-						i = baseCoords.length; while(i--) {
-							next = [ parseInt(baseCoords[--i], 10), parseInt(baseCoords[i+1], 10) ];
-							
-							if(next[0] > result.position.right){ result.position.right = next[0]; }
-							if(next[0] < result.position.left){ result.position.left = next[0]; }
-							if(next[1] > result.position.bottom){ result.position.bottom = next[1]; }
-							if(next[1] < result.position.top){ result.position.top = next[1]; }
-							
-							coords.push(next);
-						}
-						
-						// Calculate height and width from outer edges
-						newWidth = result.width = Math.abs(result.position.right - result.position.left);
-						newHeight = result.height = Math.abs(result.position.bottom - result.position.top);
-						
-						// If it's the center corner...
-						if(corner.abbrev() === 'c') {
-							result.position = {
-								left: result.position.left + (result.width / 2),
-								top: result.position.top + (result.height / 2)
-							};
-						}
-						else {
-							// Second pass, use a binary search algorithm to locate most suitable coordinate
-							while(newWidth > 0 && newHeight > 0 && compareX > 0 && compareY > 0)								{
-								newWidth = Math.floor(newWidth / 2);
-								newHeight = Math.floor(newHeight / 2);
-								
-								if(corner.x === LEFT){ compareX = newWidth; }
-								else if(corner.x === RIGHT){ compareX = result.width - newWidth; }
-								else{ compareX += Math.floor(newWidth / 2); }
-								
-								if(corner.y === TOP){ compareY = newHeight; }
-								else if(corner.y === BOTTOM){ compareY = result.height - newHeight; }
-								else{ compareY += Math.floor(newHeight / 2); }
-								
-								i = coords.length; while(i--)									{
-									if(coords.length < 2){ break; }
-									
-									realX = coords[i][0] - result.position.left;
-									realY = coords[i][1] - result.position.top;
-									
-									if((corner.x === LEFT && realX >= compareX) ||
-									(corner.x === RIGHT && realX <= compareX) ||
-									(corner.x === CENTER && (realX < compareX || realX > (result.width - compareX))) ||
-									(corner.y === TOP && realY >= compareY) ||
-									(corner.y === BOTTOM && realY <= compareY) ||
-									(corner.y === CENTER && (realY < compareY || realY > (result.height - compareY)))) {
-										coords.splice(i, 1);
-									}
-								}
-							}
-							result.position = { left: coords[0][0], top: coords[0][1] };
-						}
-						
-						return result;
-					},
-					
-					rect: function(ax, ay, bx, by) {
-						return {
-							width: Math.abs(bx - ax),
-							height: Math.abs(by - ay),
-							position: {
-								left: Math.min(ax, bx),
-								top: Math.min(ay, by)
-							}
-						};
-					},
-					
-					_angles: {
-						tc: 3 / 2, tr: 7 / 4, tl: 5 / 4,
-						bc: 1 / 2, br: 1 / 4, bl: 3 / 4,
-						rc: 2, lc: 1, c: 0
-					},
-					ellipse: function(cx, cy, rx, ry, corner) {
-						var c = PLUGINS.polys._angles[ corner.abbrev() ],
-						rxc = c === 0 ? 0 : rx * Math.cos( c * Math.PI ),
-						rys = ry * Math.sin( c * Math.PI );
-						
-						return {
-							width: (rx * 2) - Math.abs(rxc),
-							height: (ry * 2) - Math.abs(rys),
-							position: {
-								left: cx + rxc,
-								top: cy + rys
-							},
-							adjustable: FALSE
-						};
-					},
-					circle: function(cx, cy, r, corner) {
-						return PLUGINS.polys.ellipse(cx, cy, r, r, corner);
-					}
-		};
-		PLUGINS.imagemap = function (api, area, corner, adjustMethod) {
-			if(!area.jquery) { area = $(area); }
-					
-					var shape = area.attr('shape').toLowerCase().replace('poly', 'polygon'),
-					image = $('img[usemap="#'+area.parent('map').attr('name')+'"]'),
-					coordsString = $.trim(area.attr('coords')),
-					coordsArray = coordsString.replace(/,$/, '').split(','),
-					imageOffset, coords, i, next, result, len;
-					
-					// If we can't find the image using the map...
-					if(!image.length) { return FALSE; }
-					
-					// Pass coordinates string if polygon
-					if(shape === 'polygon') {
-						result = PLUGINS.polys.polygon(coordsArray, corner);
-					}
-					
-					// Otherwise parse the coordinates and pass them as arguments
-					else if(PLUGINS.polys[shape]) {
-						for(i = -1, len = coordsArray.length, coords = []; ++i < len;) {
-							coords.push( parseInt(coordsArray[i], 10) );
-						}
-						
-						result = PLUGINS.polys[shape].apply(
-						this, coords.concat(corner)
-						);
-					}
-					
-					// If no shapre calculation method was found, return false
-					else { return FALSE; }
-					
-					// Make sure we account for padding and borders on the image
-					imageOffset = image.offset();
-					imageOffset.left += Math.ceil((image.outerWidth(FALSE) - image.width()) / 2);
-					imageOffset.top += Math.ceil((image.outerHeight(FALSE) - image.height()) / 2);
-					
-					// Add image position to offset coordinates
-					result.position.left += imageOffset.left;
-					result.position.top += imageOffset.top;
-					
-					return result;
-		};
-		PLUGINS.svg = function (api, svg, corner) {
-			var doc = $(document),
-					elem = svg[0],
-					root = $(elem.ownerSVGElement),
-					xScale = 1, yScale = 1,
-					complex = true,
-					rootWidth, rootHeight,
-					mtx, transformed, viewBox,
-					len, next, i, points,
-					result, position, dimensions;
-					
-					// Ascend the parentNode chain until we find an element with getBBox()
-					while(!elem.getBBox) { elem = elem.parentNode; }
-					if(!elem.getBBox || !elem.parentNode) { return FALSE; }
-					
-					// Determine dimensions where possible
-					rootWidth = root.attr('width') || root.width() || parseInt(root.css('width'), 10);
-					rootHeight = root.attr('height') || root.height() || parseInt(root.css('height'), 10);
-					
-					// Add stroke characteristics to scaling
-					var strokeWidth2 = (parseInt(svg.css('stroke-width'), 10) || 0) / 2;
-					if(strokeWidth2) {
-						xScale += strokeWidth2 / rootWidth;
-						yScale += strokeWidth2 / rootHeight;
-					}
-					
-					// Determine which shape calculation to use
-					switch(elem.nodeName) {
-						case 'ellipse':
-						case 'circle':
-						result = PLUGINS.polys.ellipse(
-						elem.cx.baseVal.value,
-						elem.cy.baseVal.value,
-						(elem.rx || elem.r).baseVal.value + strokeWidth2,
-						(elem.ry || elem.r).baseVal.value + strokeWidth2,
-						corner
-						);
-						break;
-						
-						case 'line':
-						case 'polygon':
-						case 'polyline':
-						// Determine points object (line has none, so mimic using array)
-						points = elem.points || [
-						{ x: elem.x1.baseVal.value, y: elem.y1.baseVal.value },
-						{ x: elem.x2.baseVal.value, y: elem.y2.baseVal.value }
-						];
-						
-						for(result = [], i = -1, len = points.numberOfItems || points.length; ++i < len;) {
-							next = points.getItem ? points.getItem(i) : points[i];
-							result.push.apply(result, [next.x, next.y]);
-						}
-						
-						result = PLUGINS.polys.polygon(result, corner);
-						break;
-						
-						// Unknown shape or rectangle? Use bounding box
-						default:
-						result = elem.getBoundingClientRect();
-						result = {
-							width: result.width, height: result.height,
-							position: {
-								left: result.left,
-								top: result.top
-							}
-						};
-						complex = false;
-						break;
-					}
-					
-					// Shortcut assignments
-					position = result.position;
-					root = root[0];
-					
-					// If the shape was complex (i.e. not using bounding box calculations)
-					if(complex) {
-						// Convert position into a pixel value
-						if(root.createSVGPoint) {
-							mtx = elem.getScreenCTM();
-							points = root.createSVGPoint();
-							
-							points.x = position.left;
-							points.y = position.top;
-							transformed = points.matrixTransform( mtx );
-							position.left = transformed.x;
-							position.top = transformed.y;
-						}
-						
-						// Calculate viewBox characteristics
-						if(root.viewBox && (viewBox = root.viewBox.baseVal) && viewBox.width && viewBox.height) {
-							xScale *= rootWidth / viewBox.width;
-							yScale *= rootHeight / viewBox.height;
-						}
-					}
-					
-					// Adjust by scroll offset
-					position.left += doc.scrollLeft();
-					position.top += doc.scrollTop();
-					
-					return result;
-		};
-		var MODAL, OVERLAY,
-			MODALCLASS = 'qtip-modal',
-				MODALSELECTOR = '.'+MODALCLASS;
-				
-				OVERLAY = function()				{
-					var self = this,
-					focusableElems = {},
-					current, onLast,
-					prevState, elem;
-					
-					// Modified code from jQuery UI 1.10.0 source
-					// http://code.jquery.com/ui/1.10.0/jquery-ui.js
-					function focusable(element) {
-						// Use the defined focusable checker when possible
-						if($.expr[':'].focusable) { return $.expr[':'].focusable; }
-						
-						var isTabIndexNotNaN = !isNaN($.attr(element, 'tabindex')),
-						nodeName = element.nodeName && element.nodeName.toLowerCase(),
-						map, mapName, img;
-						
-						if('area' === nodeName) {
-							map = element.parentNode;
-							mapName = map.name;
-							if(!element.href || !mapName || map.nodeName.toLowerCase() !== 'map') {
-								return false;
-							}
-							img = $('img[usemap=#' + mapName + ']')[0];
-							return !!img && img.is(':visible');
-						}
-						return (/input|select|textarea|button|object/.test( nodeName ) ?
-						!element.disabled :
-						'a' === nodeName ?
-						element.href || isTabIndexNotNaN :
-						isTabIndexNotNaN
-						);
-					}
-					
-					// Focus inputs using cached focusable elements (see update())
-					function focusInputs(blurElems) {
-						// Blurring body element in IE causes window.open windows to unfocus!
-						if(focusableElems.length < 1 && blurElems.length) { blurElems.not('body').blur(); }
-						
-						// Focus the inputs
-						else { focusableElems.first().focus(); }
-					}
-					
-					// Steal focus from elements outside tooltip
-					function stealFocus(event) {
-						if(!elem.is(':visible')) { return; }
-						
-						var target = $(event.target),
-						tooltip = current.tooltip,
-						container = target.closest(SELECTOR),
-						targetOnTop;
-						
-						// Determine if input container target is above this
-						targetOnTop = container.length < 1 ? FALSE :
-						(parseInt(container[0].style.zIndex, 10) > parseInt(tooltip[0].style.zIndex, 10));
-						
-						// If we're showing a modal, but focus has landed on an input below
-						// this modal, divert focus to the first visible input in this modal
-						// or if we can't find one... the tooltip itself
-						if(!targetOnTop && target.closest(SELECTOR)[0] !== tooltip[0]) {
-							focusInputs(target);
-						}
-						
-						// Detect when we leave the last focusable element...
-						onLast = event.target === focusableElems[focusableElems.length - 1];
-					}
-					
-					$.extend(self, {
-						init: function() {
-							// Create document overlay
-							elem = self.elem = $('<div />', {
-								id: 'qtip-overlay',
-								html: '<div></div>',
-								mousedown: function() { return FALSE; }
-							})
-							.hide();
-							
-							// Make sure we can't focus anything outside the tooltip
-							$(document.body).bind('focusin'+MODALSELECTOR, stealFocus);
-							
-							// Apply keyboard "Escape key" close handler
-							$(document).bind('keydown'+MODALSELECTOR, function(event) {
-								if(current && current.options.show.modal.escape && event.keyCode === 27) {
-									current.hide(event);
-								}
-							});
-							
-							// Apply click handler for blur option
-							elem.bind('click'+MODALSELECTOR, function(event) {
-								if(current && current.options.show.modal.blur) {
-									current.hide(event);
-								}
-							});
-							
-							return self;
-						},
-						
-						update: function(api) {
-							// Update current API reference
-							current = api;
-							
-							// Update focusable elements if enabled
-							if(api.options.show.modal.stealfocus !== FALSE) {
-								focusableElems = api.tooltip.find('*').filter(function() {
-									return focusable(this);
-								});
-							}
-							else { focusableElems = []; }
-						},
-						
-						toggle: function(api, state, duration) {
-							var docBody = $(document.body),
-							tooltip = api.tooltip,
-							options = api.options.show.modal,
-							effect = options.effect,
-							type = state ? 'show': 'hide',
-							visible = elem.is(':visible'),
-							visibleModals = $(MODALSELECTOR).filter(':visible:not(:animated)').not(tooltip),
-							zindex;
-							
-							// Set active tooltip API reference
-							self.update(api);
-							
-							// If the modal can steal the focus...
-							// Blur the current item and focus anything in the modal we an
-							if(state && options.stealfocus !== FALSE) {
-								focusInputs( $(':focus') );
-							}
-							
-							// Toggle backdrop cursor style on show
-							elem.toggleClass('blurs', options.blur);
-							
-							// Append to body on show
-							if(state) {
-								elem.appendTo(document.body);
-							}
-							
-							// Prevent modal from conflicting with show.solo, and don't hide backdrop is other modals are visible
-							if((elem.is(':animated') && visible === state && prevState !== FALSE) || (!state && visibleModals.length)) {
-								return self;
-							}
-							
-							// Stop all animations
-							elem.stop(TRUE, FALSE);
-							
-							// Use custom function if provided
-							if($.isFunction(effect)) {
-								effect.call(elem, state);
-							}
-							
-							// If no effect type is supplied, use a simple toggle
-							else if(effect === FALSE) {
-								elem[ type ]();
-							}
-							
-							// Use basic fade function
-							else {
-								elem.fadeTo( parseInt(duration, 10) || 90, state ? 1 : 0, function() {
-									if(!state) { elem.hide(); }
-								});
-							}
-							
-							// Reset position and detach from body on hide
-							if(!state) {
-								elem.queue(function(next) {
-									elem.css({ left: '', top: '' });
-									if(!$(MODALSELECTOR).length) { elem.detach(); }
-									next();
-								});
-							}
-							
-							// Cache the state
-							prevState = state;
-							
-							// If the tooltip is destroyed, set reference to null
-							if(current.destroyed) { current = NULL; }
-							
-							return self;
-						}
-					});
-					
-					self.init();
-				};
-				OVERLAY = new OVERLAY();
-				
-				function Modal(api, options) {
-					this.options = options;
-					this._ns = '-modal';
-					
-					this.init( (this.qtip = api) );
-				}
-				
-				$.extend(Modal.prototype, {
-					init: function(qtip) {
-						var tooltip = qtip.tooltip;
-						
-						// If modal is disabled... return
-						if(!this.options.on) { return this; }
-						
-						// Set overlay reference
-						qtip.elements.overlay = OVERLAY.elem;
-						
-						// Add unique attribute so we can grab modal tooltips easily via a SELECTOR, and set z-index
-						tooltip.addClass(MODALCLASS).css('z-index', QTIP.modal_zindex + $(MODALSELECTOR).length);
-						
-						// Apply our show/hide/focus modal events
-						qtip._bind(tooltip, ['tooltipshow', 'tooltiphide'], function(event, api, duration) {
-							var oEvent = event.originalEvent;
-							
-							// Make sure mouseout doesn't trigger a hide when showing the modal and mousing onto backdrop
-							if(event.target === tooltip[0]) {
-								if(oEvent && event.type === 'tooltiphide' && /mouse(leave|enter)/.test(oEvent.type) && $(oEvent.relatedTarget).closest(OVERLAY.elem[0]).length) {
-									try { event.preventDefault(); } catch(e) {}
-								}
-								else if(!oEvent || (oEvent && oEvent.type !== 'tooltipsolo')) {
-									this.toggle(event, event.type === 'tooltipshow', duration);
-								}
-							}
-						}, this._ns, this);
-						
-						// Adjust modal z-index on tooltip focus
-						qtip._bind(tooltip, 'tooltipfocus', function(event, api) {
-							// If focus was cancelled before it reached us, don't do anything
-							if(event.isDefaultPrevented() || event.target !== tooltip[0]) { return; }
-							
-							var qtips = $(MODALSELECTOR),
-							
-							// Keep the modal's lower than other, regular qtips
-							newIndex = QTIP.modal_zindex + qtips.length,
-							curIndex = parseInt(tooltip[0].style.zIndex, 10);
-							
-							// Set overlay z-index
-							OVERLAY.elem[0].style.zIndex = newIndex - 1;
-							
-							// Reduce modal z-index's and keep them properly ordered
-							qtips.each(function() {
-								if(this.style.zIndex > curIndex) {
-									this.style.zIndex -= 1;
-								}
-							});
-							
-							// Fire blur event for focused tooltip
-							qtips.filter('.' + CLASS_FOCUS).qtip('blur', event.originalEvent);
-							
-							// Set the new z-index
-							tooltip.addClass(CLASS_FOCUS)[0].style.zIndex = newIndex;
-							
-							// Set current
-							OVERLAY.update(api);
-							
-							// Prevent default handling
-							try { event.preventDefault(); } catch(e) {}
-						}, this._ns, this);
-						
-						// Focus any other visible modals when this one hides
-						qtip._bind(tooltip, 'tooltiphide', function(event) {
-							if(event.target === tooltip[0]) {
-								$(MODALSELECTOR).filter(':visible').not(tooltip).last().qtip('focus', event);
-							}
-						}, this._ns, this);
-					},
-					
-					toggle: function(event, state, duration) {
-						// Make sure default event hasn't been prevented
-						if(event && event.isDefaultPrevented()) { return this; }
-						
-						// Toggle it
-						OVERLAY.toggle(this.qtip, !!state, duration);
-					},
-					
-					destroy: function() {
-						// Remove modal class
-						this.qtip.tooltip.removeClass(MODALCLASS);
-						
-						// Remove bound events
-						this.qtip._unbind(this.qtip.tooltip, this._ns);
-						
-						// Delete element reference
-						OVERLAY.toggle(this.qtip, FALSE);
-						delete this.qtip.elements.overlay;
-					}
-				});
-				
-				
-				MODAL = PLUGINS.modal = function(api) {
-					return new Modal(api, api.options.show.modal);
-				};
-				
-				// Setup sanitiztion rules
-				MODAL.sanitize = function(opts) {
-					if(opts.show) {
-						if(typeof opts.show.modal !== 'object') { opts.show.modal = { on: !!opts.show.modal }; }
-						else if(typeof opts.show.modal.on === 'undefined') { opts.show.modal.on = TRUE; }
-					}
-				};
-				
-				// Base z-index for all modal tooltips (use qTip core z-index as a base)
-				QTIP.modal_zindex = QTIP.zindex - 200;
-				
-				// Plugin needs to be initialized on render
-				MODAL.initialize = 'render';
-				
-				// Setup option set checks
-				CHECKS.modal = {
-					'^show.modal.(on|blur)$': function() {
-						// Initialise
-						this.destroy();
-						this.init();
-						
-						// Show the modal if not visible already and tooltip is visible
-						this.qtip.elems.overlay.toggle(
-						this.qtip.tooltip[0].offsetWidth > 0
-						);
-					}
-				};
-				
-				// Extend original api defaults
-				$.extend(TRUE, QTIP.defaults, {
-					show: {
-						modal: {
-							on: FALSE,
-							effect: TRUE,
-							blur: TRUE,
-							stealfocus: TRUE,
-							escape: TRUE
-						}
-					}
-				});
-	}));
-}( window, document ));
-		
-		
\ No newline at end of file
diff --git a/sources/WebContent/old/js/libs/readme.txt b/sources/WebContent/old/js/libs/readme.txt
deleted file mode 100644
index 0333aee..0000000
--- a/sources/WebContent/old/js/libs/readme.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-- jquery-1.8.3.js               jQuery 1.8.3
-- jquery-ui-1.10.3.custom.js    jQuery UI 1.10.3
-- jquery.contextMenu.js         jQuery Context Menu Plugin 1.01 (kontextové menu)
-- jquery.jstree.js              jQuery jsTree plugin 1.0-rc3 (zobrazení stromových struktur)
-- jquery.qtip.js                jQuery qTip plugin 2.2.0 (bublinové titulky)
-- saveSvgAsPng.js               https://github.com/exupero/saveSvgAsPng (uloží obsah SVG jako PNG obrázek)
-- spin.js                       https://github.com/fgnass/spin.js v1.2.5 (zobrazí loading animaci)
\ No newline at end of file
diff --git a/sources/WebContent/old/js/libs/saveSvgAsPng.js b/sources/WebContent/old/js/libs/saveSvgAsPng.js
deleted file mode 100644
index e5d1877..0000000
--- a/sources/WebContent/old/js/libs/saveSvgAsPng.js
+++ /dev/null
@@ -1,177 +0,0 @@
-
-/*
-
-The MIT License (MIT)
-
-Copyright (c) 2014 Eric Shull
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-*/
-
-(function () {
-	var out$ = typeof exports != 'undefined' && exports || this;
-	
-	var doctype = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">';
-	
-	function isExternal(url) {
-		return url && url.lastIndexOf('http', 0) == 0 && url.lastIndexOf(window.location.host) == -1;
-	}
-	
-	function inlineImages(el, callback) {
-		var images = el.querySelectorAll('image');
-		var left = images.length;
-		if (left == 0) {
-			callback();
-		}
-		for (var i = 0; i < images.length; i++) {
-			(function (image) {
-				var href = image.getAttribute('xlink:href');
-				if (href) {
-					if (isExternal(href.value)) {
-						console.warn("Cannot render embedded images linking to external hosts: " + href.value);
-						return;
-					}
-				}
-				var canvas = document.createElement('canvas');
-				var ctx = canvas.getContext('2d');
-				var img = new Image();
-				href = href || image.getAttribute('href');
-				img.src = href;
-				img.onload = function () {
-					canvas.width = img.width;
-					canvas.height = img.height;
-					ctx.drawImage(img, 0, 0);
-					image.setAttribute('xlink:href', canvas.toDataURL('image/png'));
-					left--;
-					if (left == 0) {
-						callback();
-					}
-				}
-				img.onerror = function () {
-					console.log("Could not load " + href);
-					left--;
-					if (left == 0) {
-						callback();
-					}
-				}
-			})(images[i]);
-		}
-	}
-	
-	function styles(el, selectorRemap) {
-		var css = "";
-		var sheets = document.styleSheets;
-		for (var i = 0; i < sheets.length; i++) {
-			if (isExternal(sheets[i].href)) {
-				console.warn("Cannot include styles from other hosts: " + sheets[i].href);
-				continue;
-			}
-			var rules = sheets[i].cssRules;
-			if (rules != null) {
-				for (var j = 0; j < rules.length; j++) {
-					var rule = rules[j];
-					if (typeof (rule.style) != "undefined") {
-						var match = null;
-						try {
-							match = el.querySelector(rule.selectorText);
-							} catch (err) {
-							console.warn('Invalid CSS selector "' + rule.selectorText + '"', err);
-						}
-						if (match) {
-							var selector = selectorRemap ? selectorRemap(rule.selectorText) : rule.selectorText;
-							css += selector + " { " + rule.style.cssText + " }\n";
-							} else if (rule.cssText.match(/^@font-face/)) {
-							css += rule.cssText + '\n';
-						}
-					}
-				}
-			}
-		}
-		return css;
-	}
-	
-	out$.svgAsDataUri = function (el, options, cb) {
-		options = options || {};
-		options.scale = options.scale || 1;
-		var xmlns = "http://www.w3.org/2000/xmlns/";
-		
-		inlineImages(el, function () {
-			var outer = document.createElement("div");
-			var clone = el.cloneNode(true);
-			var width, height;
-			if (el.tagName == 'svg') {
-				width = parseInt(clone.getAttribute('width') || clone.style.width || out$.getComputedStyle(el).getPropertyValue('width'));
-				height = parseInt(clone.getAttribute('height') || clone.style.height || out$.getComputedStyle(el).getPropertyValue('height'));
-				} else {
-				var box = el.getBBox();
-				width = box.x + box.width;
-				height = box.y + box.height;
-				clone.setAttribute('transform', clone.getAttribute('transform').replace(/translate\(.*?\)/, ''));
-				
-				var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
-				svg.appendChild(clone)
-				clone = svg;
-			}
-			
-			clone.setAttribute("version", "1.1");
-			clone.setAttributeNS(xmlns, "xmlns", "http://www.w3.org/2000/svg");
-			clone.setAttributeNS(xmlns, "xmlns:xlink", "http://www.w3.org/1999/xlink");
-			clone.setAttribute("width", width * options.scale);
-			clone.setAttribute("height", height * options.scale);
-			clone.setAttribute("viewBox", "0 0 " + width + " " + height);
-			outer.appendChild(clone);
-			
-			var css = styles(el, options.selectorRemap);
-			var s = document.createElement('style');
-			s.setAttribute('type', 'text/css');
-			s.innerHTML = "<![CDATA[\n" + css + "\n]]>";
-			var defs = document.createElement('defs');
-			defs.appendChild(s);
-			clone.insertBefore(defs, clone.firstChild);
-			
-			var svg = doctype + outer.innerHTML;
-			var uri = 'data:image/svg+xml;base64,' + window.btoa(unescape(encodeURIComponent(svg)));
-			if (cb) {
-				cb(uri);
-			}
-		});
-	}
-	
-	out$.saveSvgAsPng = function (el, name, options) {
-		options = options || {};
-		out$.svgAsDataUri(el, options, function (uri) {
-			var image = new Image();
-			image.src = uri;
-			image.onload = function () {
-				var canvas = document.createElement('canvas');
-				canvas.width = image.width;
-				canvas.height = image.height;
-				var context = canvas.getContext('2d');
-				context.drawImage(image, 0, 0);
-				
-				var a = document.createElement('a');
-				a.download = name;
-				a.href = canvas.toDataURL('image/png');
-				document.body.appendChild(a);
-				a.click();
-			}
-		});
-	}
-})();
\ No newline at end of file
diff --git a/sources/WebContent/old/js/libs/spin.js b/sources/WebContent/old/js/libs/spin.js
deleted file mode 100644
index 5c6b572..0000000
--- a/sources/WebContent/old/js/libs/spin.js
+++ /dev/null
@@ -1,307 +0,0 @@
-
-//github.com/fgnass/spin.js#v1.2.5
-(function(window, document, undefined) {
-	
-	/**
-	* Copyright (c) 2011 Felix Gnass [fgnass at neteye dot de]
-	* Licensed under the MIT license
-	*/
-	
-	var prefixes = ['webkit', 'Moz', 'ms', 'O']; /* Vendor prefixes */
-	var animations = {}; /* Animation rules keyed by their name */
-	var useCssAnimations;
-	
-	/**
-	* Utility function to create elements. If no tag name is given,
-	* a DIV is created. Optionally properties can be passed.
-	*/
-	function createEl(tag, prop) {
-		var el = document.createElement(tag || 'div');
-		var n;
-		
-		for(n in prop) {
-			el[n] = prop[n];
-		}
-		return el;
-	}
-	
-	/**
-	* Appends children and returns the parent.
-	*/
-	function ins(parent /* child1, child2, ...*/) {
-		for (var i=1, n=arguments.length; i<n; i++) {
-			parent.appendChild(arguments[i]);
-		}
-		return parent;
-	}
-	
-	/**
-	* Insert a new stylesheet to hold the @keyframe or VML rules.
-	*/
-	var sheet = function() {
-		var el = createEl('style');
-		ins(document.getElementsByTagName('head')[0], el);
-		return el.sheet || el.styleSheet;
-	}();
-	
-	/**
-	* Creates an opacity keyframe animation rule and returns its name.
-	* Since most mobile Webkits have timing issues with animation-delay,
-	* we create separate rules for each line/segment.
-	*/
-	function addAnimation(alpha, trail, i, lines) {
-		var name = ['opacity', trail, ~~(alpha*100), i, lines].join('-');
-		var start = 0.01 + i/lines*100;
-		var z = Math.max(1-(1-alpha)/trail*(100-start) , alpha);
-		var prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase();
-		var pre = prefix && '-'+prefix+'-' || '';
-		
-		if (!animations[name]) {
-			sheet.insertRule(
-			'@' + pre + 'keyframes ' + name + '{' +
-				'0%{opacity:'+z+'}' +
-				start + '%{opacity:'+ alpha + '}' +
-				(start+0.01) + '%{opacity:1}' +
-				(start+trail)%100 + '%{opacity:'+ alpha + '}' +
-				'100%{opacity:'+ z + '}' +
-			'}', 0);
-			animations[name] = 1;
-		}
-		return name;
-	}
-	
-	/**
-	* Tries various vendor prefixes and returns the first supported property.
-	**/
-	function vendor(el, prop) {
-		var s = el.style;
-		var pp;
-		var i;
-		
-		if(s[prop] !== undefined) return prop;
-		prop = prop.charAt(0).toUpperCase() + prop.slice(1);
-		for(i=0; i<prefixes.length; i++) {
-			pp = prefixes[i]+prop;
-			if(s[pp] !== undefined) return pp;
-		}
-	}
-	
-	/**
-	* Sets multiple style properties at once.
-	*/
-	function css(el, prop) {
-		for (var n in prop) {
-			el.style[vendor(el, n)||n] = prop[n];
-		}
-		return el;
-	}
-	
-	/**
-	* Fills in default values.
-	*/
-	function merge(obj) {
-		for (var i=1; i < arguments.length; i++) {
-			var def = arguments[i];
-			for (var n in def) {
-				if (obj[n] === undefined) obj[n] = def[n];
-			}
-		}
-		return obj;
-	}
-	
-	/**
-	* Returns the absolute page-offset of the given element.
-	*/
-	function pos(el) {
-		var o = {x:el.offsetLeft, y:el.offsetTop};
-		while((el = el.offsetParent)) {
-			o.x+=el.offsetLeft;
-			o.y+=el.offsetTop;
-		}
-		return o;
-	}
-	
-	var defaults = {
-		lines: 12,            // The number of lines to draw
-		length: 7,            // The length of each line
-		width: 5,             // The line thickness
-		radius: 10,           // The radius of the inner circle
-		rotate: 0,            // rotation offset
-		color: '#000',        // #rgb or #rrggbb
-		speed: 1,             // Rounds per second
-		trail: 100,           // Afterglow percentage
-		opacity: 1/4,         // Opacity of the lines
-		fps: 20,              // Frames per second when using setTimeout()
-		zIndex: 2e9,          // Use a high z-index by default
-		className: 'spinner', // CSS class to assign to the element
-		top: 'auto',          // center vertically
-		left: 'auto'          // center horizontally
-	};
-	
-	/** The constructor */
-	var Spinner = function Spinner(o) {
-		if (!this.spin) return new Spinner(o);
-		this.opts = merge(o || {}, Spinner.defaults, defaults);
-	};
-	
-	Spinner.defaults = {};
-	merge(Spinner.prototype, {
-		spin: function(target) {
-			this.stop();
-			var self = this;
-			var o = self.opts;
-			var el = self.el = css(createEl(0, {className: o.className}), {position: 'relative', zIndex: o.zIndex});
-			var mid = o.radius+o.length+o.width;
-			var ep; // element position
-			var tp; // target position
-			
-			if (target) {
-				target.insertBefore(el, target.firstChild||null);
-				tp = pos(target);
-				ep = pos(el);
-				css(el, {
-					left: (o.left == 'auto' ? tp.x-ep.x + (target.offsetWidth >> 1) : o.left+mid) + 'px',
-					top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : o.top+mid)  + 'px'
-				});
-			}
-			
-			el.setAttribute('aria-role', 'progressbar');
-			self.lines(el, self.opts);
-			
-			if (!useCssAnimations) {
-				// No CSS animation support, use setTimeout() instead
-				var i = 0;
-				var fps = o.fps;
-				var f = fps/o.speed;
-				var ostep = (1-o.opacity)/(f*o.trail / 100);
-				var astep = f/o.lines;
-				
-				!function anim() {
-					i++;
-					for (var s=o.lines; s; s--) {
-						var alpha = Math.max(1-(i+s*astep)%f * ostep, o.opacity);
-						self.opacity(el, o.lines-s, alpha, o);
-					}
-					self.timeout = self.el && setTimeout(anim, ~~(1000/fps));
-				}();
-			}
-			return self;
-		},
-		stop: function() {
-			var el = this.el;
-			if (el) {
-				clearTimeout(this.timeout);
-				if (el.parentNode) el.parentNode.removeChild(el);
-				this.el = undefined;
-			}
-			return this;
-		},
-		lines: function(el, o) {
-			var i = 0;
-			var seg;
-			
-			function fill(color, shadow) {
-				return css(createEl(), {
-					position: 'absolute',
-					width: (o.length+o.width) + 'px',
-					height: o.width + 'px',
-					background: color,
-					boxShadow: shadow,
-					transformOrigin: 'left',
-					transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)',
-					borderRadius: (o.width>>1) + 'px'
-				});
-			}
-			for (; i < o.lines; i++) {
-				seg = css(createEl(), {
-					position: 'absolute',
-					top: 1+~(o.width/2) + 'px',
-					transform: o.hwaccel ? 'translate3d(0,0,0)' : '',
-					opacity: o.opacity,
-					animation: useCssAnimations && addAnimation(o.opacity, o.trail, i, o.lines) + ' ' + 1/o.speed + 's linear infinite'
-				});
-				if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'}));
-				ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)')));
-			}
-			return el;
-		},
-		opacity: function(el, i, val) {
-			if (i < el.childNodes.length) el.childNodes[i].style.opacity = val;
-		}
-	});
-	
-	/////////////////////////////////////////////////////////////////////////
-	// VML rendering for IE
-	/////////////////////////////////////////////////////////////////////////
-	
-	/**
-	* Check and init VML support
-	*/
-	!function() {
-		
-		function vml(tag, attr) {
-			return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr);
-		}
-		
-		var s = css(createEl('group'), {behavior: 'url(#default#VML)'});
-		
-		if (!vendor(s, 'transform') && s.adj) {
-			
-			// VML support detected. Insert CSS rule ...
-			sheet.addRule('.spin-vml', 'behavior:url(#default#VML)');
-			
-			Spinner.prototype.lines = function(el, o) {
-				var r = o.length+o.width;
-				var s = 2*r;
-				
-				function grp() {
-					return css(vml('group', {coordsize: s +' '+s, coordorigin: -r +' '+-r}), {width: s, height: s});
-				}
-				
-				var margin = -(o.width+o.length)*2+'px';
-				var g = css(grp(), {position: 'absolute', top: margin, left: margin});
-				
-				var i;
-				
-				function seg(i, dx, filter) {
-					ins(g,
-					ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}),
-					ins(css(vml('roundrect', {arcsize: 1}), {
-					width: r,
-					height: o.width,
-					left: o.radius,
-					top: -o.width>>1,
-					filter: filter
-				}),
-				vml('fill', {color: o.color, opacity: o.opacity}),
-				vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change
-				)
-				)
-				);
-			}
-			
-			if (o.shadow) {
-				for (i = 1; i <= o.lines; i++) {
-					seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)');
-				}
-			}
-			for (i = 1; i <= o.lines; i++) seg(i);
-			return ins(el, g);
-		};
-		Spinner.prototype.opacity = function(el, i, val, o) {
-			var c = el.firstChild;
-			o = o.shadow && o.lines || 0;
-			if (c && i+o < c.childNodes.length) {
-				c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild;
-				if (c) c.opacity = val;
-			}
-		};
-	}
-	else {
-		useCssAnimations = vendor(s, 'animation');
-	}
-}();
-
-window.Spinner = Spinner;
-
-})(window, document);
\ No newline at end of file
diff --git a/sources/WebContent/old/js/loader.js b/sources/WebContent/old/js/loader.js
deleted file mode 100644
index 3e5051c..0000000
--- a/sources/WebContent/old/js/loader.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Loader animation displayed when running some expensive operation.
- * 
- * @param {*object} options 
- */
-function Loader(options) {
-	var defaultOptions = {
-		lines: 17, // The number of lines to draw
-		length: 21, // The length of each line
-		width: 8, // The line thickness
-		radius: 40, // The radius of the inner circle
-		rotate: 0, // The rotation offset
-		color: '#000', // #rgb or #rrggbb
-		speed: 1.2, // Rounds per second
-		trail: 58, // Afterglow percentage
-		shadow: true, // Whether to render a shadow
-		hwaccel: true, // Whether to use hardware acceleration
-		className: 'spinner', // The CSS class to assign to the spinner
-		zIndex: 2e9 // The z-index (defaults to 2000000000)
-	};
-
-	var opts = $.extend(defaultOptions, options);
-
-	/**
-	 * Spin jQuery plugin.
-	 */
-	$.fn.spin = function(opts) {
-		this.each(function() {
-			var $this = $(this),
-			data = $this.data();
-			
-			if (data.spinner) {
-				data.spinner.stop();
-				delete data.spinner;
-			}
-
-			if (opts !== false) {
-				data.spinner = new Spinner($.extend({
-					color: $this.css('color')
-				}, opts)).spin(this);
-			}
-		});
-		return this;
-	};
-
-	/**
-	* Enables loader.
-	*/
-	this.enable = function() {
-		$('#loader').show();
-		$('#spinLoader').spin(opts);
-	};
-
-	/**
-	* Disables loader.
-	*/
-	this.disable = function() {
-		$('#loader').hide();
-		$('#spinLoader').spin(false);
-	};
-}
diff --git a/sources/WebContent/old/js/mark.js b/sources/WebContent/old/js/mark.js
deleted file mode 100644
index 9c8427f..0000000
--- a/sources/WebContent/old/js/mark.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Represents one mark.
- * @param symbol symbol with char and color
- * @param id ID of mark
- * @param selector selector of vertex
-*/
-function Mark(symbol, id, selector) {
-	this.symbol = symbol;
-	this.id = id;
-	this.$vertexSelector = selector;
-}
diff --git a/sources/WebContent/old/js/markSymbol.js b/sources/WebContent/old/js/markSymbol.js
deleted file mode 100644
index 716c9cc..0000000
--- a/sources/WebContent/old/js/markSymbol.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
-* This class represents creation of symbols.
-*/
-function MarkSymbol() {
-	var CONST_MARK_SYMBOLS = ["☺", "☻", "♥", "♦", "♣", "♠", "♫", "☼", "►", "◄",
-	"▲", "▼", "■", "▬", "░", "▒", "↕", "↑", "↓", "→", "←", "↔", "╣", "╩", "╠",
-	"╚", "╝", "║", "╔", "╦", "═", "╬", "╗", "┴", "┬", "∟", "┌", "├", "┤",
-	"⌂", "+", "-", "*", "÷", "×", "=", "±", "Ø", "~", "«", "»", "¤", "¶", "§",
-	"‼", "!", "#", "$", "%", "&", "@", "A", "B", "C", "D", "E", "F", "G", "H",
-	"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
-	"X", "Y", "Z",   "©", "®", "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ",
-	"λ", "μ", "ν", "ξ", "π", "ρ", "σ", "τ", "υ", "φ", "χ", "ψ", "ω", "Ω", "Φ",
-	"Σ", "Λ", "Δ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
-	
-	var CONST_MARK_COLORS = ["#DC143C", "#B23AEE", "#63B8FF", "#3D9140", "#B3EE3A",
-	"#FFD700", "#B7B7B7", "#FF8000"];
-
-	var removeMarkSymbolMap = [];
-	var symbolIndex = -1;
-	var colorIndex = -1;
-	var startColorIndex = 0;
-
-	/**
-	* Returns symbol with unique char and color.
-	*/
-	this.getMarkSymbol = function() {
-		if (removeMarkSymbolMap.length > 0) {
-			//vyjme a vrati prvni prvek pole
-			return removeMarkSymbolMap.shift();
-		}
-		
-		symbolIndex++;
-		colorIndex++;
-		
-		if (colorIndex == CONST_MARK_COLORS.length) {
-			colorIndex = 0;
-		}
-		
-		if (symbolIndex == CONST_MARK_SYMBOLS.length) {
-			if (startColorIndex == CONST_MARK_COLORS.length) {
-				startColorIndex = 0;
-			}
-			
-			symbolIndex = 0;
-			startColorIndex++;
-			colorIndex = startColorIndex;
-		}
-		
-		return [CONST_MARK_SYMBOLS[symbolIndex], CONST_MARK_COLORS[colorIndex]];
-	};
-
-	/**
-	 * Save removed symbol (char + color) to the list of removes symbols.
-	 *
-	 * @param symbol symbol to be removed
-	 */
-	this.removeSymbol = function(symbol) {
-		removeMarkSymbolMap.push(symbol);
-	};
-}
diff --git a/sources/WebContent/old/js/offScreenKiv.js b/sources/WebContent/old/js/offScreenKiv.js
deleted file mode 100644
index f0a1465..0000000
--- a/sources/WebContent/old/js/offScreenKiv.js
+++ /dev/null
@@ -1,2462 +0,0 @@
-/**
- * Object responsible for handling SeCo panel.
- */
-var OffScreenKiv = {
-	markSymbol: new MarkSymbol(),
-	vertexSearchHighlighting: {},
-	groupManager: new GroupManager(),
-	
-	init: function(){
-		this.showVertexInRightPanel = this.showVertexInRightPanel.bind(this);
-		this.showVertexInGraph = this.showVertexInGraph.bind(this);
-		this.notHighlightNeighbour = this.notHighlightNeighbour.bind(this);
-		this.highlightAllNeighbour = this.highlightAllNeighbour.bind(this);
-		this.highlightProvidedEvent = this.highlightProvidedEvent.bind(this);
-		this.highlightRequiredEvent = this.highlightRequiredEvent.bind(this);
-		this.showVertexIcons = this.showVertexIcons.bind(this);
-		this.hideVertexIcons = this.hideVertexIcons.bind(this);
-		this.showGroupIcons = this.showGroupIcons.bind(this);
-		this.hideGroupIcons = this.hideGroupIcons.bind(this);
-
-		this.deleteItemFromGroupEvent = this.deleteItemFromGroupEvent.bind(this);
-		this.groupHighlightProvided = this.groupHighlightProvided.bind(this);
-		this.groupDisHighlightProvided = this.groupDisHighlightProvided.bind(this);
-		this.groupHighlightRequired = this.groupHighlightRequired.bind(this);
-		this.groupDisHighlightRequired = this.groupDisHighlightRequired.bind(this);
-		this.groupHighlightRequiredAndProvided = this.groupHighlightRequiredAndProvided.bind(this);
-		this.groupDisHighlightRequiredAndProvided = this.groupDisHighlightRequiredAndProvided.bind(this);
-		this.search = this.search.bind(this);
-		this.deselectHighlightSearchedVertices = this.deselectHighlightSearchedVertices.bind(this);
-
-		this.excludeVerticesWithMostEdges = this.excludeVerticesWithMostEdges.bind(this);
-		this.excludeVerticesWithMostEdgesToGroup = this.excludeVerticesWithMostEdgesToGroup.bind(this);
-		
-		this.includeUnconItem = this.includeUnconItem.bind(this);
-		this.includeUncon = this.includeUncon.bind(this);
-		this.deleteUncon = this.deleteUncon.bind(this);		
-
-		this.parseTransform = this.parseTransform.bind(this);
-
-		this.proposeChanges = this.proposeChanges.bind(this);
-	},
-
-	/**
-	 * Includes the component with passed ID to the diagram area.
-	 * 
-	 * @param id the component identifier
-	 */
-	includeUnconnectedComponent: function(id) {
-		var list = GraphManager.unconList;
-		var i = list.indexOf(id);
-
-		list.splice(i, 1);
-
-		$('#vertex'+ id)[0].classList.add('vertex--unconnected');
-		$('#vertex'+ id).show();
-
-		$('#liuc'+ id).hide();
-	},
-	
-	/**
-	* Includes all unconnected components in the diagram area.
-	*/	
-	includeUncon: function() {
-		var list = GraphManager.unconList;
-		
-		// cancel highlight
-		ViewportManager.highlightVertex = null;
-		
-		//ukaze v grafu a odstrani ze seznamu
-		for (var i = list.length-1; i >= 0; i--) {
-			this.includeUnconnectedComponent(list[i]);
-		}
-	},
-	
-	/**
-	 * Includes a single unconnected component in the diagram area.
-	 */
-	includeUnconItem: function(e) {
-		var vertexId = $(e.target.parentElement).data('id');
-
-		this.includeUnconnectedComponent(vertexId);
-	},
-	
-	/**
-	* Removes unconnected components from the diagram area.
-	*/	
-	deleteUncon: function() {
-		var list = GraphManager.unconList;
-		var vertices = GraphManager.graph.vertices;
-		
-		// pridani nepropojenych do seznamu
-		for (var i = 0; i < vertices.length; i++) {
-			var vertex = vertices[i];
-			
-			// test existence sousedu a viditelnosti
-			if (vertex.edges.length === 0 && $('#vertex'+ vertex.id)[0].isVisible()) {
-				var j = list.length;
-				list[j] = vertex.id;
-			}
-		}
-		
-		// schova v grafu
-		for (var i = 0; i < list.length; i++){
-			$('#vertex'+ list[i]).hide();
-			$('#liuc'+ list[i]).show();
-		}
-	},
-
-	/**
-	 * Sorts components excluded to SeCo.
-	 */
-	sortComponents: function(e) {
-		e.preventDefault();
-
-		var components;
-		switch ($(this).attr('id')) {
-			case 'sortComponents_name_asc':
-				components = $('#excludedComponents .component').sort(OffScreenKiv.sortByComponentName);
-				break;
-			case 'sortComponents_name_desc':
-				components = $('#excludedComponents .component').sort(OffScreenKiv.sortByComponentName).get().reverse();
-				break;
-			case 'sortComponents_count_asc':
-				components = $('#excludedComponents .component').sort(OffScreenKiv.sortByComponentCount);
-				break;
-			case 'sortComponents_count_desc':
-				components = $('#excludedComponents .component').sort(OffScreenKiv.sortByComponentCount).get().reverse();
-				break;
-		}
-
-		$('#excludedComponents').append(components);
-
-		$('.sort-button').removeClass('active');
-		$(this).addClass('active');
-	},
-	
-	/**
-	 * Perfoms the actual sorting by component name in ascending order.
-	 */
-	sortByComponentName: function(a, b) {
-		var $_a_item = $(a).find('g[id^="detailVertex"] text');
-		var $_b_item = $(b).find('g[id^="detailVertex"] text');
-		
-		var a_item_text = '';
-		var b_item_text = '';
-		
-		if ($_a_item.length > 0) {
-			a_item_text = $_a_item.text().toLowerCase();
-		} else {
-			a_item_text = $(a).find('ul li:first p').text().toLowerCase();
-		}
-		
-		if ($_b_item.length > 0) {
-			b_item_text = $_b_item.text().toLowerCase();
-		} else {
-			b_item_text = $(b).find('ul li:first p').text().toLowerCase();
-		}
-		
-		return a_item_text > b_item_text ? 1 : -1;
-	},
-	
-	/**
-	 * Perfoms the actual sorting by count of components in ascending order.
-	 */
-	sortByComponentCount: function(a, b) {
-		var $_a_item = $(a).find('g[id^="detailVertex"] text');
-		var $_b_item = $(b).find('g[id^="detailVertex"] text');
-		
-		var a_count_comp = 1;
-		var b_count_comp = 1;
-		
-		if ($_a_item.length > 0) {
-			a_count_comp = 1;
-		} else {
-			a_count_comp = $(a).find('ul li').length;
-		}
-		
-		if ($_b_item.length > 0) {
-			b_count_comp = 1;
-		} else {
-			b_count_comp = $(b).find('ul li').length;
-		}
-		
-		return a_count_comp > b_count_comp ? 1 : -1;
-	},	
-	
-	/**
-	* Includes all components in the graph.
-	*/
-	includeAllComponents: function(e){
-		e.preventDefault();
-
-		//show component in graph
-		$('#excludedComponents .component').each(function() {
-			if (this.classList.contains('vertex')) {
-				OffScreenKiv.showVertexInGraph(findId(this));
-			} else if (this.classList.contains('group_vertices')) {
-				OffScreenKiv.showGroupInGraph(findId(this));
-			}
-		});
-
-		$('#includeAllComponents').hide();
-	},
-
-	/**
-	 * Hides include all components button if there are no components or groups displayed in SeCo.
-	 */
-	hideIncludeAllComponentsButton: function(){
-		if ($('#excludedComponents .component').length === 0) {
-			$('#includeAllComponents').hide();
-		}
-	},
-
-	/**
-	* This method ensures display icon at the vertex neighbors
-	*/
-	showIcons: function(vertex) {
-		for (var i = 0; i < vertex.edges.length; i++) {
-			var targetVertex = this.getEdgeOtherSide(vertex.edges[i], vertex);
-			// var markId = vertex.id + 'mark' + targetVertex.id;
-			var markId = 'mark' + vertex.symbol[0]+ vertex.symbol[1];
-			if (!targetVertex.gridMark.existMark(markId)) {
-				var mark = new Mark(vertex.symbol, markId, targetVertex.$selector);
-				targetVertex.gridMark.addMark(markId, mark);
-			}
-		}
-	},
-	
-	/**
-	* This method ensures disappearance of icon at the vertex neighbors
-	*/
-	hideIcons: function(vertex){
-		for (var i = 0; i < vertex.edges.length; i++) {
-			var targetVertex = this.getEdgeOtherSide(vertex.edges[i], vertex);
-			var markId = 'mark' + vertex.symbol[0]+ vertex.symbol[1];
-
-			if (targetVertex.gridMark.existMark(markId)) {
-				targetVertex.gridMark.removeMark(markId);
-			}
-		}
-	},
-	
-	/**
-	* Event calls action  showIcons after click to given element.
-	* Parameters: e - event
-	*/
-	showVertexIcons: function(e) {
-		var id = findId(e.target);
-		var vertex  = GraphManager.graph.vertices[id - 1];
-		var color = vertex.symbol[1];
-		var buttonElement = $(e.target);
-
-		this.showIcons(vertex);
-
-		buttonElement.attr('class', 'button c' + color.substring(1, color.length));
-		buttonElement.unbind('click');
-		buttonElement.click(this.hideVertexIcons);
-	},
-	
-	/**
-	* Event calls action  hideIcons after click to given element.
-	* Parameters: e - event
-	*/
-	hideVertexIcons: function(e) {
-		var id = findId(e.target);
-		var vertex  = GraphManager.graph.vertices[id - 1];
-		var buttonElement = $(e.target);
-		
-		this.hideIcons(vertex);
-		
-		buttonElement.attr('class', 'button buttonClassic');
-		buttonElement.unbind('click');
-		buttonElement.click(this.showVertexIcons);
-	},
-	
-	/**
-	* Event calls action  showIcons after click to given element.
-	* It ensures to display icon at all vertex neighbors in group.
-	* Parameters: e - event
-	*/
-	showGroupIcons: function(e){
-		var idGroup = findId(e.target);
-		var group = this.groupManager.getGroup(idGroup);
-		var firstRun = true;
-		var symbol;
-		var buttonElement = $(e.target);
-
-		for (var key in group.items.getAll()) {
-			if (firstRun) {
-				symbol = group.items.get(key).symbol;
-				firstRun = false;
-				buttonElement.attr('class', "button c" + symbol[1].substring(1, symbol[1].length));
-			}
-			this.showIcons(group.items.get(key));
-		}
-
-		buttonElement.unbind('click', this.showGroupIcons);
-		buttonElement.click(this.hideGroupIcons);
-	},
-	
-	/**
-	* Event calls action  hideIcons after click to given element.
-	* It ensures to disappearance icon at all vertex neighbors in group.
-	* Parameters: e - event
-	*/
-	hideGroupIcons: function(e) {
-		var idGroup = findId(e.target);
-		var group = this.groupManager.getGroup(idGroup);
-		var buttonElement = $(e.target);
-
-		for (var key in group.items.getAll()) {
-			this.hideIcons(group.items.get(key));
-		}
-		
-		buttonElement.attr('class', 'button buttonClassic');
-		buttonElement.unbind('click', this.hideGroupIcons);
-		buttonElement.click(this.showGroupIcons);
-	},
-	
-	/**
-	*
-	* Detect and make opaque the unconnected vertices according to #1751. Detect while removing a vertex from diagram.
-	*
-	* @param vertex
-	*/
-	detectAndSetUnconnectedInGraph : function(vertex) {
-		for (var i = 0; i < vertex.edges.length; i++) {
-			var neighbour = null;
-			var adjacent = null;
-			
-			var visibleAdjacentsCount = 0;
-			
-			if (vertex.edges[i].from == vertex) {
-				neighbour = vertex.edges[i].to;
-			} else {
-				neighbour = vertex.edges[i].from;
-			}
-			
-			var styleNeighbour = neighbour.$selector.attr('style');
-			
-			if (!/display: none/.test(styleNeighbour)) {
-				for (var j = 0; j < neighbour.edges.length; j++) {
-					if (neighbour.edges[j].from == neighbour) {
-						adjacent = neighbour.edges[j].to;
-					} else {
-						adjacent = neighbour.edges[j].from;
-					}
-					
-					// not count the edge to the vertex being removed
-					if (adjacent == vertex || adjacent == neighbour) {
-						continue;
-					}
-					
-					var styleAdj = adjacent.$selector.attr('style');
-					
-					if (/display: none/.test(styleAdj)) {
-						continue;
-					}
-					
-					visibleAdjacentsCount++;
-				}
-
-				if (visibleAdjacentsCount === 0) {
-					neighbour.$selector[0].classList.add('vertex--unconnected');
-					neighbour.leftAlone = true;
-				}
-			}
-		}
-	},
-	
-	/**
-	*
-	* Detect and make reset the opacity the previously unconnected vertices according to #1751. Detect while adding a vertex back to diagram.
-	*
-	* @param vertex
-	*/
-	detectAndResetReconnectedInGraph : function(vertex) {
-		var visibleAdjacentsCount = 0;
-
-		for (var i = 0; i < vertex.edges.length; i++) {
-			var neighbour = null;
-			
-			if (vertex.edges[i].from == vertex) {
-				neighbour = vertex.edges[i].to;
-			} else {
-				neighbour = vertex.edges[i].from;
-			}
-
-			// set proper opacity
-			if (neighbour.leftAlone && !neighbour.excluded) {
-				// not greyed-out by highlighing
-				if (!neighbour.dimmed) {
-					neighbour.$selector[0].classList.remove('vertex--unconnected');
-				} else { // greyed-out by highlighting
-					neighbour.$selector[0].classList.add('vertex--dimmed');
-				}
-				
-				neighbour.leftAlone = false;
-			}
-
-			// got a neighbour in graph
-			if (!neighbour.excluded) {
-				visibleAdjacentsCount++;
-			}
-		}
-
-		// make visible if got a neighbour
-		if (visibleAdjacentsCount > 0) {
-			if (!vertex.dimmed) {
-				vertex.$selector[0].classList.remove('vertex--unconnected');
-			} else {
-				vertex.$selector[0].classList.add('vertex--dimmed');
-			}
-		} else { // is alone after returning to graph
-			vertex.$selector[0].classList.add('vertex--unconnected');
-			vertex.leftAlone = true;
-		}
-	},
-	
-	/**
-	* Counts dependencies of vertex with other vertices.
-	* Parameters: vertex - vertex
-	*/
-	countDependence: function(vertex){
-		var countFrom = 0;
-		var countTo = 0;
-		
-		if(!GraphManager.isEfpGraph) {
-			countFrom = vertex.exportedPackages.length;
-			countTo = vertex.importedPackages.length;
-		} else { // legacy method - for efp graphs
-			for (var i = 0; i < vertex.edges.length;i++) {
-				if (vertex.id == vertex.edges[i].from.id) {
-					countFrom++;
-				}
-			}
-			
-			countTo = vertex.edges.length - countFrom;
-		}
-		
-		return {
-			countFrom: countFrom,
-			countTo: countTo
-		};
-	},
-
-	/**
-	* Counts dependencies of grouped vertices with other vertices outside the group.
-	*
-	* @param idGroup
-	*/
-	countDependenceGroup: function(idGroup){
-		var countFrom = 0;
-		var countTo = 0;
-		
-		var group = this.groupManager.getGroup(idGroup);
-		var vertexList = group.items.getAll();
-		
-		// iterate over vertices
-		$.each(vertexList, function(key, vertex){
-			for (var j = 0; j < vertex.edges.length; j++){
-				var toEndOk = true, fromEndOk = true;
-				
-				if (vertex.id == vertex.edges[j].from.id) {
-					//check if the TO end of the found edge is NOT in this group too
-					$.each(vertexList, function(key, otherEndVertex) {
-						if (otherEndVertex.id == vertex.edges[j].to.id) {
-							toEndOk = false;
-							
-							return false;
-						}
-					});
-					
-					// increase if OK
-					if (toEndOk) {
-						countFrom++;
-					}
-				}
-				
-				if (vertex.id == vertex.edges[j].to.id) {
-					//check if the FROM end of the found edge is NOT in this group too
-					$.each(vertexList, function(key, otherEndVertex) {
-						if (otherEndVertex.id == vertex.edges[j].from.id) {
-							fromEndOk = false;
-							
-							return false;
-						}
-					});
-					
-					// increase if OK
-					if (fromEndOk) {
-						countTo++;
-					}
-				}
-			}
-		});
-		
-		return {
-			countFrom: countFrom,
-			countTo: countTo
-		};
-	},
-
-	isOnOneSideOfEdge: function(vertex, edge) {
-		return (edge.to.id == vertex.id) || (edge.from.id != vertex.id);
-	},
-
-	getEdgeOtherSide: function(edge, vertex) {
-		return (edge.to.id != vertex.id) ? edge.to : edge.from;
-	},
-
-	/**
-	 * Creates all elements representing the vertex in SeCo and binds click callbacks.
-	 * 
-	 * @param vertex the vertex
-	 */
-	createVertexDetail: function(vertex) {
-		$('#excludedComponents').append('<div class="component vertex" id="component' + vertex.id + '" data-id="' + vertex.id + '"></div>');
-
-		var componentElement = $('#component' + vertex.id);
-		componentElement.append(SvgFactory.createVertexDetail(vertex));
-		componentElement.append('<div class="control-buttons"></div>');
-		
-		var buttonsElement = componentElement.children('.control-buttons');
-		buttonsElement.append('<div class="button buttonClassic" id="showIcons' + vertex.id +'">' + vertex.symbol[0] + '</div>');
-		if (vertex.name !== 'NOT_FOUND') {
-			buttonsElement.append('<div class="button buttonClassic" id="change' + vertex.id +'">'+
-								  		'<img class="buttonImage" src="images/tochange/tochange-trans.gif" alt="change" title="Send component to change">'+
-								  '</div>');
-		}
-		buttonsElement.append('<div class="button buttonClassic" id="remove' + vertex.id +'"><img src="images/button_cancel.png" alt="remove" title="remove"/></div>');
-		
-		// registration of event
-		$('#showIcons' + vertex.id).click(this.showVertexIcons);
-		$('#change' + vertex.id).click(OffScreenKiv.changeComponent);
-		$('#postpone' + vertex.id).click(OffScreenKiv.postponeComponent);
-		$('#remove' + vertex.id).click(function(e) {
-			OffScreenKiv.showVertexInGraph(vertex.id);
-		});
-
-		configurationVertexDetailTooltip('#detailVertex' + vertex.id);
-
-		// assigning actions to parts of detail
-		$('#detailVertex' + vertex.id).click(ViewportManager.highlightClckdVertexSeCo);
-		$('#provided' + vertex.id).click(ViewportManager.highlightProvGraphSeCo);
-		$('#required' + vertex.id).click(ViewportManager.highlightReqGraphSeCo);
-	},
-	
-	/**
-	* Create detail of removed vertex from graph and registers all events.
-	* Parameters: e - event
-	*/
-	showVertexInRightPanel: function(e) {
-		if (e.which != 1) return;
-
-		var id = findId(e.target);
-		var vertex = GraphManager.graph.vertices[id - 1];
-		vertex.symbol = OffScreenKiv.markSymbol.getMarkSymbol();
-		
-		// according to #1751
-		this.detectAndSetUnconnectedInGraph(vertex);
-		
-		vertex.excluded = true;
-		
-		this.hideEdges(vertex);
-		vertex.$selector.hide();
-		
-		this.addItemToContextMenu(vertex.symbol, vertex.id, vertex.name);
-
-		this.createVertexDetail(vertex);
-
-		$('#includeAllComponents').show();
-
-		// Excludes from graph with the correct highlight color
-		$('#detailVertex' + vertex.id).attr('class', vertex.$selector.attr('class'));
-		
-		// handle search highlight vertieces
-		if (this.vertexSearchHighlighting[vertex.symbolicName] !== undefined) {
-			var secoVertex = $('#detailVertex' + (vertex.id));
-			secoVertex[0].classList.add('vertex--searched');
-			
-			this.vertexSearchHighlighting['detailVertex' + (vertex.id)] = secoVertex;
-		}
-	},
-	
-	/**
-	* Display vertex and its edges in graph.
-	*/
-	showVertexInGraph: function(id) {
-		var vertex  = GraphManager.graph.vertices[id - 1];
-		
-		vertex.$selector.show();
-		
-		for (var i = 0; i <  vertex.edges.length; i++){
-			if (vertex.edges[i].to.id != vertex.id &&
-				(vertex.edges[i].to.$selector[0].isVisible() ||
-					($('#rightPanel #li'+vertex.edges[i].to.id).length == 1 && $('#rightPanel #li'+ vertex.edges[i].to.id).is(':visible') === false)
-				)
-			) {
-				vertex.edges[i].$selector.show();
-			}
-			
-			if (vertex.edges[i].from.id != vertex.id &&
-				(vertex.edges[i].from.$selector[0].isVisible() ||
-					($('#rightPanel #li'+vertex.edges[i].to.id).length == 1 && $('#rightPanel #li'+ vertex.edges[i].from.id).is(':visible') === false)
-				)
-			) {
-				vertex.edges[i].$selector.show();
-			}
-		}
-		
-		$("#detailVertex" + vertex.id).qtip('destroy');
-		for (var j = 0; j < vertex.edges.length; j++) {
-			var targetVertex = this.getEdgeOtherSide(vertex.edges[j], vertex);
-			var markId = 'mark' + vertex.symbol[0]+ vertex.symbol[1];
-
-			if (targetVertex.gridMark.existMark(markId)) {
-				targetVertex.gridMark.removeMark(markId);
-			}
-		}
-
-		$('#component' + vertex.id).remove();
-		$('#proposed' + vertex.id).remove();
-
-		vertex.excluded = false;
-		this.markSymbol.removeSymbol(vertex.symbol);
-		var itemId = vertex.symbol[1].substring(1) + vertex.symbol[0];
-		this.deleteItemFromContextMenu(itemId);
-
-		this.hideIncludeAllComponentsButton();
-		
-		// check if opacity needs to be reset
-		this.detectAndResetReconnectedInGraph(vertex);
-	},
-
-	/**
-	 * Shows component and in the propose-change list in SeCo.
-	 */
-	changeComponent: function(e){
-		if (e.which != 1) return;
-
-		var id = findId(e.target);
-		var vertex = GraphManager.graph.vertices[id - 1];
-		vertex.symbol = OffScreenKiv.markSymbol.getMarkSymbol();
-		
-		$('#component' + vertex.id).remove();
-		$('#rightPanel .to-change-components').append('<div class="component vertex" id="component' + vertex.id + '" data-id="' + vertex.id + '"></div>');
-
-		var componentElement = $('#component' + vertex.id);
-		componentElement.append(SvgFactory.createVertexDetail(vertex));
-		componentElement.append('<div class="control-buttons"></div>');
-		componentElement.append('<div class="compatibility-list">' + getTooltipEdge(vertex.id) + '</div>');
-		
-		var buttonsElement = componentElement.children('.control-buttons');
-		if (vertex.name !== 'NOT_FOUND') {
-			buttonsElement.append('<div class="button buttonClassic" id="postpone' + vertex.id +'">'+
-								  		'<img class="buttonImage" src="images/tochange/postpone-trans.gif" alt="Postpone" title="Postpone component change">'+
-								  '</div>');
-		}
-		buttonsElement.append('<div class="button buttonClassic" id="remove' + vertex.id +'"><img src="images/button_cancel.png" alt="remove" title="remove"/></div>');
-
-		// registration of event
-		$('#postpone' + vertex.id).click(function(e) {
-			OffScreenKiv.postponeComponent(e);
-		});
-		$('#remove' + vertex.id).click(function(e) {
-			OffScreenKiv.showVertexInGraph(vertex.id);
-		});
-
-		/*
-		$('#rightPanel').append('<div class="component" id="proposed' + vertex.id + '">');
-
-		$('#proposed' + vertex.id).append('<hr class="verticalSeparator clean"/>');
-		$('#proposed' + vertex.id).append('<h5 class="text">Proposed</h5>');
-		$('#proposed' + vertex.id).append(SvgFactory.createVertexDetail(vertex));
-
-		$('#proposed' + vertex.id).append('<div id ="proposedCb' + vertex.id + '" class="controlButton">');
-		//todo change to IMG
-		$('#proposedCb' + vertex.id).append('<div class="button buttonClassic" id="ok' + vertex.id +'" disabled>\n\
-			<img src="images/efp_qtip/OK.png" alt="confirm" title="confirm"/></div>');
-		$('#proposedCb' + vertex.id).append('<div class="button buttonClassic" id="db' + vertex.id +'" disabled>\n\
-			<img src="images/button_cancel.png" alt="remove" title="remove"/></div>');
-		$('#proposed' + vertex.id).append('</div><br class="clean"/>');
-		$('#proposed' + vertex.id).append('<hr class="verticalSeparator clean"/>');
-		$('#rightPanel').append('</div>');
-		*/
-
-		setUpTooltipList(componentElement.find('#edgeTooltipListDiv' + (id - 1)));
-	},
-
-	/**
-	 * Shows component and in the postponed list in SeCo.
-	 */
-	postponeComponent: function(e) {
-		if (e.which != 1) return;
-
-		var id = findId(e.target);
-		var vertex = GraphManager.graph.vertices[id - 1];
-		vertex.symbol = OffScreenKiv.markSymbol.getMarkSymbol();
-		
-		$('#component' + vertex.id).remove();
-		$('#rightPanel .postponed-components').append('<div class="component vertex" id="component' + vertex.id + '" data-id="' + vertex.id + '"></div>');
-
-		var componentElement = $('#component' + vertex.id);
-		componentElement.append(SvgFactory.createVertexDetail(vertex));
-		componentElement.append('<div class="control-buttons"></div>');
-		
-		var buttonsElement = componentElement.children('.control-buttons');
-		if (vertex.name !== 'NOT_FOUND') {
-			buttonsElement.append('<div class="button buttonClassic" id="change' + vertex.id +'">'+
-								  		'<img class="buttonImage" src="images/tochange/tochange-trans.gif" alt="ToChange" title="Send component to change">'+
-									'</div>');
-		}
-		buttonsElement.append('<div class="button buttonClassic" id="remove' + vertex.id +'"><img src="images/button_cancel.png" alt="remove" title="remove"/></div>');
-
-		// registration of event
-		$('#change' + vertex.id).click(function(e) {
-			OffScreenKiv.changeComponent(e);
-		});
-		$('#remove' + vertex.id).click(function(e) {
-			OffScreenKiv.showVertexInGraph(vertex.id);
-		});
-	},
-
-	/**
-	 * Send changes to crce
-	 */
-	proposeChanges: function(e) {
-		var javaClasses = {
-			boolean: 'java.lang.Boolean',
-			string: 'java.lang.String',
-			list: 'java.util.List',
-			set: 'java.util.Set',
-		};
-
-		var crceClasses = {
-			package: 'crce.api.java.package',
-			class: 'crce.api.java.class',
-			method: 'crce.api.java.method',
-			property: 'crce.api.java.property',
-		};
-
-		var ns = '';	// http://relisa.kiv.zcu.cz
-		var xsi = 'http://www.w3.org/2001/XMLSchema-instance';
-		var xsd = 'crce.xsd';
-
-		var xmlDocument;
-		var xmlSerializer = new XMLSerializer();
-		var requirementsCounter;
-
-		var toChangeComponents = $('#toChangeComps > .vertex');
-		var changedComponentsCounter = 0;
-
-		if (toChangeComponents.length > 0) {
-			changeComponent(toChangeComponents[changedComponentsCounter]);
-		}
-
-		function appendRequirementsTree(element, node) {
-			var type = node.desc.type;
-
-			if (typeof type === 'undefined') {
-				node.subtree.forEach(function(node) {
-					appendRequirementsTree(element, node);
-				});
-
-			} else {
-				// add package for classes
-				if (type === 'class') {
-					var packageRequirementEl = xmlDocument.createElementNS(ns, 'requirement');
-					packageRequirementEl.setAttribute('uuid', requirementsCounter++);
-					packageRequirementEl.setAttribute('namespace', crceClasses['package']);
-
-					var packageAttributeEl = xmlDocument.createElementNS(ns, 'attribute');
-					packageAttributeEl.setAttribute('name', 'name');
-					packageAttributeEl.setAttribute('type', javaClasses.string);
-					packageAttributeEl.setAttribute('value', node.desc.details.package);
-
-					packageRequirementEl.appendChild(packageAttributeEl);
-
-					delete node.desc.details.package;
-				}
-
-				var requirementEl = xmlDocument.createElementNS(ns, 'requirement');
-				requirementEl.setAttribute('uuid', requirementsCounter++);
-				requirementEl.setAttribute('namespace', crceClasses[type]);
-
-				// attributes
-				var details = node.desc.details;
-				for (var key in details) {
-					if (!details.hasOwnProperty(key)) continue;
-
-					var value = details[key];
-
-					var attributeType;
-					switch (typeof value) {
-						case 'boolean':
-							attributeType = javaClasses.boolean;
-							break;
-						case 'object':
-							if (value.constructor.name === 'Array') {
-								attributeType = javaClasses.list;
-								break;
-							}
-						default:
-							attributeType = javaClasses.string;
-					}
-
-					var attributeEl = xmlDocument.createElementNS(ns, 'attribute');
-					attributeEl.setAttribute('name', key);
-					attributeEl.setAttribute('type', attributeType);
-					attributeEl.setAttribute('value', value);
-		
-					requirementEl.appendChild(attributeEl);
-				}
-
-				// children
-				node.subtree.forEach(function(node) {
-					appendRequirementsTree(requirementEl, node);
-				});
-
-				// add package for classes
-				if (type === 'class') {
-					packageRequirementEl.appendChild(requirementEl);
-					element.appendChild(packageRequirementEl);
-				} else {
-					element.appendChild(requirementEl);
-				}
-			}
-		}
-
-		function changeComponent(component) {
-			app.loader.enable();
-
-			var id = findId(component);
-			var vertex = GraphManager.graph.vertices[id - 1];
-
-			// initialize requirements XML to be send to CRCE
-			xmlDocument = document.implementation.createDocument(ns, 'requirements', null);
-			//xmlDocument.documentElement.setAttributeNS(xsi, 'xsi:schemaLocation', ns + ' ' + xsd);
-
-			requirementsCounter = 0;
-
-			// construct functionality requirements tree
-			vertex.edges.forEach(function(edge) {
-				//var compatibilityInfo = JSON.parse(edge.compInfoJSON);
-
-				// TODO: mocked compatibility info
-				var compatibilityInfo = [
-					{
-						"details": {
-							"abstract": false,
-							"annotation": false,
-							"final": false,
-							"static": false,
-							"name": "Dashboard",
-							"package": "cz.zcu.kiv.osgi.demo.parking.dashboard",
-							"enum": false,
-							"interface": false
-						},
-						"causedBy": "cz.zcu.kiv.osgi.demo.parking.dashboard.DashboardActivator",
-						"type": "class",
-						"incomps": [
-							{
-								"subtree": [
-									{
-										"subtree": [],
-										"desc": {
-											"isIncompCause": false,
-											"propertyName": "Fields",
-											"contentCode": "cmp.child.fields",
-											"level": 1,
-											"name": "Fields"
-										}
-									}, {
-										"subtree": [{
-											"subtree": [],
-											"desc": {
-												"difference": "DEL",
-												"isIncompCause": true,
-												"propertyName": "Method",
-												"contentCode": "cmp.child.method",
-												"level": 2,
-												"details": {
-													"abstract": false,
-													"final": false,
-													"exceptions": [],
-													"static": false,
-													"synchronized": false,
-													"name": "clear",
-													"paramTypes": [],
-													"returnType": "void",
-													"constructor": false
-												},
-												"incompName": "<span class='entity'>M<\/span> void clear() is missing -> REFACTOR",
-												"name": "M void clear()",
-												"strategy": "REFACTOR",
-												"type": "method"
-											}
-										}],
-										"desc": {
-											"isIncompCause": false,
-											"propertyName": "Methods",
-											"contentCode": "cmp.child.methods",
-											"level": 1,
-											"name": "Methods"
-										}
-									}, {
-										"subtree": [],
-										"desc": {
-											"isIncompCause": false,
-											"propertyName": "Constructors",
-											"contentCode": "cmp.child.constructors",
-											"level": 1,
-											"name": "Constructors"
-										}
-									}
-								],
-								"desc": {
-									"isIncompCause": false,
-									"propertyName": "Class",
-									"contentCode": "cmp.child.class",
-									"level": 0,
-									"details": {
-										"name": "LaneStatistics",
-										"abstract": false,
-										"annotation": false,
-										"final": false,
-										"static": false,
-										"package": "cz.zcu.kiv.osgi.demo.parking.lane.statistics",
-										"enum": false,
-										"interface": false
-									},
-									"name": "Class: cz.zcu.kiv.osgi.demo.parking.lane.statistics.ILaneStatistics",
-									"type": "class"
-								}
-							}
-						]
-					}
-				];
-
-				compatibilityInfo.forEach(function(component) {
-					component.incomps.forEach(function(node) {
-						appendRequirementsTree(xmlDocument.documentElement, node);
-					});
-				});
-			});
-
-			// get components related to the one being changed
-			var relatedJars = [];
-
-			vertex.edges.forEach(function(edge) {
-				// store related jars
-				relatedJars.push(edge.from.name);
-				relatedJars.push(edge.to.name);
-			});
-
-			relatedJars = relatedJars.filter(function(jarName) {
-				return jarName !== 'NOT_FOUND' && jarName !== vertex.name;
-			});
-
-			// trigger change
-			$.ajax({
-				type: 'POST',	// jQuery docs tells to use "method" but it doesn't work and always sends GET -> use "type" instead
-				url: 'http://localhost:8081/rest/v2/metadata/catalogue/',
-				data: xmlSerializer.serializeToString(xmlDocument),
-				contentType: 'application/xml',
-				timeout: 180 * 1000,	// in milliseconds
-			}).then(function(data, textStatus, jqXHR) {
-				app.loader.disable();
-
-				var proposals = [];
-
-				var resources = data.childNodes[0];
-				resources.childNodes.forEach(function(resource) {
-					var proposal = {
-						crceUuid: resource.getAttribute('uuid'),
-					};
-
-					var capability = resource.childNodes[0];
-					capability.childNodes.forEach(function(attribute) {
-						if (['name', 'version'].includes(attribute.getAttribute('name'))) {
-							proposal[attribute.getAttribute('name')] = attribute.getAttribute('value');
-						}
-					});
-
-					proposals.push(proposal);
-				});
-
-				$(component).prepend('<h5>Current change</h5>');
-				$(component).addClass('active');
-
-				var proposedList = $('<ul id="proposed"></ul>');
-				$(component).append(proposedList);
-
-				for (var i = 0; i < proposals.length; i++) {
-					proposal = proposals[i];
-
-					var maven = proposal.name.split('.');
-					proposedList.append('<li><span class="download-component-link" data-uuid="' + proposal.crceUuid + '">' + proposal.name + ' ' + proposal.version + '</span><a href="https://mvnrepository.com/artifact/' + maven[0] + '/' + maven[1] + '/' + proposal.version + '" target="_blank">Maven</a></li>');
-				}
-
-				$('.download-component-link').click(function(e) {
-					app.loader.enable();
-
-					var uuid = $(this).data('uuid');
-
-					return $.ajax({
-						type: 'POST',
-						url: 'api/download-component?uuid=' + encodeURIComponent(uuid),
-						timeout: 180 * 1000,	// in milliseconds
-					}).done(function(data, textStatus, jqXHR) {
-						relatedJars.push(data.jarName);
-
-						return $.ajax({
-							type: 'GET',
-							url: 'graph-data?jarNames=' + encodeURIComponent(relatedJars.join(',')),
-							timeout: 180 * 1000,	// in milliseconds
-						}).done(function(data, textStatus, jqXHR) {
-							GraphManager.graph = data;
-
-							GraphManager.buildGraph();
-							ViewportManager.revive();
-						});	
-					});
-				});
-
-			}).fail(function(jqXHR, textStatus, errorThrown) {
-				console.info('Server failed:');
-				console.log(errorThrown);
-			});
-		}
-	},
-	
-	/**
-	* Hides vertex edges
-	* @param vertex 	vertex whose edges will be hidden
-	*/
-	hideEdges: function(vertex){
-		for (var i = 0; i < vertex.edges.length; i++) {
-			vertex.edges[i].$selector.hide();
-		}
-
-		$('[data-from-id='+ vertex.id +']').each(function(){
-			$(this).hide();
-		});
-	},
-	
-	/**
-	* Adds item to context menu.
-	* Parameters: symbol - symbol which will be in context menu.
-	*             vertexId - id of vertex which is linked with item of context menu.
-	*/
-	addItemToContextMenu: function(symbol, vertexId, vertexName){
-		var color = symbol[1].substring(1);
-		var itemId = color + symbol[0];
-		$('#myMenu').append('<li id="' + itemId + '"  data-vertexId="' + vertexId + '"><a href="#' + itemId +
-		'" class="component_color"><img class="imgContextMenu" src="images/'+color +'.png" alt="'+color+'"/>' + symbol[0] +
-		'</a><a class="cont_menu_group" href="#" onclick="OffScreenKiv.showDescription(\''+itemId+'\'); return false;">[+]</a><span class="contextMenuDescription" id="contMenu_'+vertexId+'" style="display:none">' + vertexName + '</span>'+
-		'<span class="cleaner"></span></li>');
-		
-		// $('#myMenu li#'+itemId+' .cont_menu_group').unbind('mousedown').unbind('mouseup');
-		
-	},
-
-	showDescription: function (itemId) {
-		if ($('#myMenu li#'+itemId+' .contextMenuDescription:hidden').length) {
-			$('#myMenu li#'+itemId+' .contextMenuDescription').show();
-			$('#myMenu li#'+itemId+' a.cont_menu_group').text('[-]');
-		} else {
-			$('#myMenu li#'+itemId+' .contextMenuDescription').hide();
-			$('#myMenu li#'+itemId+' a.cont_menu_group').text('[+]');
-		}
-		
-		// set css height of li#idGroup by count li elements
-		/*
-		var count_in_li = $('#myMenu li#' + itemId + ' .contextMenuDescription').length;
-		$('#myMenu li#' + itemId).css('height', (22 + (count_in_li * 16)) + 'px'); */
-		
-		var count_in_li = $('#myMenu li#' + itemId + ' .contextMenuDescription:not(:hidden)').length;
-		$('#myMenu li#' + itemId).css('height', (22 + (count_in_li * 16)) + 'px');
-		$('#myMenu li#' + itemId).show();
-	},
-
-	/**
-	* Delete item from context menu.
-	* Parameters: groupID - id item from context menu which will be deleted.
-	*/
-	deleteItemFromContextMenu: function(groupID){
-		$('#' + groupID).remove();
-	},
-	
-	/**
-	* Check and set highlighting when grouping vertices.
-	* @param vertex
-	*/
-	checkHighlightingAtGrouping: function(vertex){
-		var $groupedVertex = $('#li' + (vertex.id));
-		if ($("#vertex" + (vertex.id) + "[class~='colorHighProvB']").length) {
-			$groupedVertex.attr('style', 'background-color: #5896FF');
-		}
-		
-		if ($("#vertex" + (vertex.id) + "[class~='colorHighReqR']").length) {
-			$groupedVertex.attr('style', 'background-color: red');
-		}
-	},
-	
-	/**
-	* Adds vertex to group.
-	* Parameters: action - id of element from context menu
-	*             element - id vertex element
-	*/
-	addVertexToGroup: function(action, element) {
-		var id = element.data('id');
-		var idGroup = action;
-
-		var vertex = GraphManager.graph.vertices[id - 1];
-		vertex.$selector.hide();
-
-		this.hideEdges(vertex);
-		
-		// detect if removing the vertex causes some unconnection(s)
-		this.detectAndSetUnconnectedInGraph(vertex);
-		
-		var group = null;
-		var defaultVertex = GraphManager.graph.vertices[$("#" + idGroup).attr('data-vertexId')-1];
-		defaultVertex.excluded = true;
-		vertex.symbol = defaultVertex.symbol;
-		var color = defaultVertex.symbol[1];
-		var isSetClassOnButton = $('#b' + defaultVertex.id).hasClass('c' + color.substring(1, color.length));
-		
-		if (!this.groupManager.existGroup(idGroup)) {
-			$('#component' + defaultVertex.id).remove();
-			group = new Group(defaultVertex.symbol, idGroup);
-			group.addToGroup(defaultVertex.id, defaultVertex);
-			group.addProvidedPackage(defaultVertex.exportedPackages);
-			group.addRequiredPackage(defaultVertex.importedPackages);
-			group.addProvidedPackage(vertex.exportedPackages);
-			group.addRequiredPackage(vertex.importedPackages);
-			this.createGroup(group, defaultVertex, vertex);
-			this.groupManager.addGroupToList(idGroup, group);
-			
-		} else {
-			group = this.groupManager.getGroup(idGroup);
-			group.addProvidedPackage(vertex.exportedPackages);
-			group.addRequiredPackage(vertex.importedPackages);
-			$('#ul' + idGroup).append('<li id="li' + vertex.id + '"><p data-vertexId="' + vertex.id + '" data-title="' + vertex.name + '">' + vertex.name + '</p><img class="deleteItemGroup" id="li_del_' + vertex.id  + '" alt="delete" src="images/button_cancel.png"/></li>');
-			configurationVertexDetailTooltip('#li' + vertex.id + " p");
-			
-			// add highlighting possiblity
-			$('#li' + vertex.id + ' p').click(ViewportManager.highlightClckdVertexGroupSeCo);
-			
-			// highlight the newly added vertex if already highlight in move area
-			this.checkHighlightingAtGrouping(vertex);
-			
-			// highlight the newly added vertex if searched
-			if (this.vertexSearchHighlighting[vertex.symbolicName] !== undefined) {
-				this.highlightSearchedVertexInGroup(vertex);
-			}
-		}		
-
-		var is_in_group = false;
-		$.each(group.items.getAll(), function(index, value) {
-			if ( value.id  == vertex.id) {
-				is_in_group = true;
-			}
-		});
-		
-		
-		if (is_in_group === false) {
-			var style_display = ' style="display:none" ';
-			if ( $('#myMenu li#' + idGroup + ' .contextMenuDescription:not(:hidden)').length ) {
-				$('#myMenu li#' + idGroup + ' .contextMenuDescription:last').after('<span class="contextMenuDescription b" id="contMenu_'+vertex.id+'" >'+vertex.name+'</span>');
-			}else{
-				$('#myMenu li#' + idGroup + ' .contextMenuDescription:last').after('<span class="contextMenuDescription b" id="contMenu_'+vertex.id+'" '+style_display+'>'+vertex.name+'</span>');
-			}
-			
-		}
-		
-		//set css height of li#idGroup by count li elements
-		var count_in_li = $('#myMenu li#' + idGroup + ' .contextMenuDescription:not(:hidden)').length;
-		$('#myMenu li#' + idGroup).css('height', (22 + (count_in_li * 16)) + 'px');
-		
-		vertex.excluded = true;
-		group.addToGroup(vertex.id, vertex);
-		
-		
-		
-		$('.deleteItemGroup').unbind('click',this.deleteItemFromGroupEvent);
-		$('.deleteItemGroup').click(this.deleteItemFromGroupEvent);
-		
-		if (group.getGroupItemsLength() > 2) {
-			this.editHeightOfGroup(group);
-		}
-		this.updateCountOfProvidedAndRequired(group);
-		var buttonGroupId = $("#b" + idGroup);
-		
-		if (isSetClassOnButton) {
-			this.showIcons(vertex);
-			buttonGroupId.attr('class', 'button c'+idGroup.substring(0,idGroup.length-1));
-			buttonGroupId.unbind('click');
-			buttonGroupId.click(this.hideIconsAllItemGroup);
-		}
-		
-		if ($("#b" + idGroup).hasClass("c"+idGroup.substring(0,idGroup.length-1))) {
-			this.showIcons(vertex);
-		}
-		
-		$('#gr' + group.idGroup).click(this.groupHighlightRequiredAndProvided);
-		$('#provided' + group.idGroup).click(this.groupHighlightProvided);
-		$('#required' + group.idGroup).click(this.groupHighlightRequired);
-		
-		$(".contextMenu").hide();
-		// $(".contextMenuDescription").hide();
-		
-		// kontrola, zda je skupina komponent zobrazena v grafu
-		//  -> pokud ano zobrazit hrany vedouci z komponenty, ktera byla pridana do grafu
-		
-		if ($('g#gv_'+group.idGroup).length > 0) {
-			//show all edges removed vertex from group.
-			//TODO: nastavit správnou pozici komponenty
-			
-			for (var i = 0; i <  vertex.edges.length; i++) {
-				if (vertex.edges[i].to.id != vertex.id && (
-						vertex.edges[i].to.$selector[0].isVisible() ||
-						($('#rightPanel #li'+vertex.edges[i].to.id).length == 1 && $('#rightPanel #li'+vertex.edges[i].to.id).is(':visible') === false)
-					)
-				){
-					vertex.edges[i].$selector.show();
-				}
-				
-				if (vertex.edges[i].from.id != vertex.id && (
-						vertex.edges[i].from.$selector[0].isVisible() ||
-						($('#rightPanel #li'+vertex.edges[i].to.id).length == 1 && $('#rightPanel #li'+vertex.edges[i].from.id).is(':visible') === false)
-					)
-				) {
-					vertex.edges[i].$selector.show();
-				}
-
-				vertex.edges[i].to.$selector.attr('class','node vertex colorNormal');
-				vertex.edges[i].from.$selector.attr('class','node vertex colorNormal');
-			}
-			
-			var coords  = getCoordinates($('#gv_'+ idGroup )[0].getAttribute('transform'));
-			posX = coords.x;
-			posY = coords.y;
-			
-			posX_reset = posX;
-			
-			//nastavení pozice prvků
-			id_vert =vertex.id;
-			
-			
-			var newX;
-			var newY;
-			
-			var lollipop;
-			posX = posX_reset;
-			posX = parseFloat(posX);
-			
-			//posun pozice, aby byla komponenta vycentrovana
-			hidden_component_width = $('g#vertex' + id_vert + ' rect').attr('width');
-			
-			if (group.decompose) {
-				$('#gv_'+ idGroup).children(' rect').attr('height',group.items.size() * 34 + 55);
-				posY = parseFloat(posY) + group.items.size() * 26 +34;
-				
-				$item = $('g#vertex' + id_vert);
-				
-				moveElementTopSVG("graph", 'vertex' + id_vert);
-				$item.show();
-			} else {
-				posY = parseFloat(posY);
-			}
-			
-			//vystredeni na stred
-			posX = posX  - (hidden_component_width/2) + 40;
-			
-			group.items.get(id_vert).x = posX;
-			group.items.get(id_vert).y = posY ;
-			
-			
-			$item.attr('transform', 'translate('+ posX +', '+ posY +')');
-			$item.trigger('click', {
-				move_edges: true,
-			});
-			
-			for (var i = 0; i< group.items.get(id_vert).edges.length; i++) {
-				var edge = group.items.get(id_vert).edges[i];
-				var sizeOfRectFrom = getSizeOfRectangle(edge.from.name);
-				var sizeOfRectTo = getSizeOfRectangle(edge.to.name);
-
-				if (edge.from.id == id_vert) {
-					newX = group.items.get(id_vert).edges[i].to.x + sizeOfRectTo/2;
-					newY = group.items.get(id_vert).edges[i].to.y + 13;
-					lollipop = getLollipopPosition(posX + sizeOfRectFrom/2, posY +13 , newX, newY);
-					
-					edge.$selector.children("line").attr('x1', posX + sizeOfRectFrom/2);
-					edge.$selector.children("line").attr('y1', posY + 13);
-					edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-					
-					ViewportManager.preventTickRotation(edge, lollipop);
-					ViewportManager.preventCrossRotation(edge, lollipop);
-					
-					//hrana k vrcholu se zobrazi pouze pokud je vrchol zobrazen
-					if ($('#vertex'+ edge.to.id )[0].isVisible() ||
-						($('#rightPanel li#li'+edge.to.id).is(':visible') === false && $('#rightPanel li#li'+edge.to.id).length > 0)
-					) {
-						edge.$selector.show();
-					}
-
-				} else {
-					newX = group.items.get(id_vert).edges[i].from.x + sizeOfRectFrom/2;
-					newY = group.items.get(id_vert).edges[i].from.y + 13;
-					lollipop = getLollipopPosition(newX, newY, posX + sizeOfRectTo/2, posY + 13);
-					
-					edge.$selector.children("line").attr('x2', posX + sizeOfRectTo/2);
-					edge.$selector.children("line").attr('y2', posY + 13);
-					edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-					
-					ViewportManager.preventTickRotation(edge, lollipop);
-					ViewportManager.preventCrossRotation(edge, lollipop);
-					
-					//hrana k vrcholu se zobrazi pouze pokud je vrchol zobrazen
-					if ($('#vertex'+ edge.from.id )[0].isVisible() ||
-						($('#rightPanel #li'+edge.from.id).is(':visible') === false && $('#rightPanel li#li'+edge.from.id).length > 0)
-					) {
-						edge.$selector.show();
-					}
-				}
-			}
-		}
-	},
-	
-	/**
-	* Event, which ensures deleting of vertex from group and modified all highlighting.
-	*/
-	deleteItemFromGroupEvent: function(e){
-		var liItem = e.target.parentElement;
-		var groupIdUl = liItem.parentElement.id;
-		var itemId = liItem.id;
-		$("#" + itemId + " p").qtip('destroy');
-		$('#' + itemId).remove();
-		var vertex = GraphManager.graph.vertices[(getIndexFromId(itemId, 2)-1)];
-		
-		var groupId = $('#' + groupIdUl).attr('data-groupId');
-		var group = this.groupManager.getGroup(groupId);
-		
-		if ($("#b" + groupId).hasClass("c"+groupId.substring(0,groupId.length-1))) {
-			for (var key in group.items.getAll()) {
-				this.hideIconEvent(group.items.get(key));
-			}
-		}
-		
-		
-		$('#myMenu li#' + groupId + ' #contMenu_'+vertex.id).remove();
-		//set css height of li#idGroup by count li elements
-		var count_in_li = $('#myMenu li#' + groupId + ' .contextMenuDescription:not(:hidden)').length;
-		$('#myMenu li#' + groupId).css('height', (22 + (count_in_li * 16)) + 'px');
-		
-		vertex.excluded = false;
-		var lengthGroup = group.items.size();
-		group.removeFromGroup(vertex.id);
-		if ($("#b" + groupId).hasClass("c"+groupId.substring(0,groupId.length-1))) {
-			for (var key1 in group.items.getAll()) {
-				this.showIcons(group.items.get(key1));
-				
-			}
-		}
-		lengthGroup = group.items.size();
-		group.deleteProvidedPackage(vertex.exportedPackages);
-		group.deleteRequiredPackage(vertex.importedPackages);
-		this.updateCountOfProvidedAndRequired(group);
-		
-		if (lengthGroup >= 2) { 
-			this.editHeightOfGroup(group);
-		}
-		
-		//if length of group is 0, removed all html and svg elements linked with given group.
-		if (lengthGroup <= 0) {
-			$('#group' + groupId).remove();
-			this.groupManager.removeGroupFromList(groupId);
-			this.deleteItemFromContextMenu(groupId);
-			this.markSymbol.removeSymbol([groupId.substring(groupId.length-1),("#"+groupId.substring(0, groupId.length-1))]);
-		}
-		
-		vertex.$selector.show();
-		
-		//show all edges removed vertex from group.
-		for (var i = 0; i <  vertex.edges.length; i++) {
-			if (vertex.edges[i].to.id != vertex.id && vertex.edges[i].to.$selector[0].isVisible()) {
-				vertex.edges[i].$selector.show();
-			}
-			if (vertex.edges[i].from.id != vertex.id && vertex.edges[i].from.$selector[0].isVisible()) {
-				vertex.edges[i].$selector.show();
-			}
-			/*
-			vertex.edges[i].to.$selector.attr('class','node vertex colorNormal');
-			vertex.edges[i].from.$selector.attr('class','node vertex colorNormal');
-			*/
-		}
-
-		this.hideIncludeAllComponentsButton();
-		
-		// check if opacity needs to be reset
-		this.detectAndResetReconnectedInGraph(vertex);
-	},
-	
-	/**
-	 * Creates all elements representing the group in SeCo and binds click callbacks.
-	 * 
-	 * @param group the group
-	 * @param symbol the symbol of the group
-	 */
-	createGroupDetail: function(group, symbol) {
-		$('#rightPanel').append('<div class="component group_vertices" id="group' + group.idGroup + '" data-id="' + group.idGroup + '"></div>');
-
-		var componentElement = $('#group' + group.idGroup);
-		componentElement.append('<div class="group-label"><strong>G: </strong><span id="label' + group.idGroup + '">Group</span></div>');
-		componentElement.append(SvgFactory.createGroupDetail(group));
-		componentElement.append('<ul data-groupID="' + group.idGroup + '" id="ul' + group.idGroup + '"></ul>');
-		componentElement.append('<div class="control-buttons"></div>');
-		
-		var buttonsElement = componentElement.children('.control-buttons');
-		buttonsElement.append('<div class="button buttonClassic" id="showIcons' + group.idGroup +'">' + symbol[0] + '</div>');
-		
-		// set click handler for group renaming
-		$('#label' + group.idGroup).click(function() {
-			$('#dialog').data('group', group)
-				.data('groupLabel', $('#label' + group.idGroup))
-				.data('isSvgElement', false)
-				.dialog('open');
-		});
-
-		// set click handler for showing group items
-		$('#showIcons' + group.idGroup).click(this.showGroupIcons);
-	},
-	
-	/**
-	* Creates all elements which represent given group and adds passed vertices to the group.
-	* Parameters: group - group
-	*             defaultVertex - first vertex which will be added to the group
-	*             vertex - second vertex
-	*/
-	createGroup: function(group, defaultVertex, vertex) {
-		this.createGroupDetail(group, defaultVertex.symbol);
-
-		$('#ul' + group.idGroup).append('<li id="li' + defaultVertex.id + '"><p  data-vertexId="' + defaultVertex.id + '" data-title="' + defaultVertex.name + '">' + defaultVertex.name + '</p><img class="deleteItemGroup" id="li_del_' + defaultVertex.id  + '" alt="delete" src="images/button_cancel.png"/></li>');
-		$('#ul' + group.idGroup).append('<li id="li' + vertex.id + '"><p data-vertexId="' + vertex.id + '" data-title="' + vertex.name + '">' + vertex.name + '</p><img class="deleteItemGroup" id="li_del_' + vertex.id  + '" alt="delete" src="images/button_cancel.png"/></li>');
-
-		configurationVertexDetailTooltip('#li' + defaultVertex.id + " p");
-		configurationVertexDetailTooltip('#li' + vertex.id + " p");
-		
-		// add highlight
-		$('#li' + defaultVertex.id + ' p').click(ViewportManager.highlightClckdVertexGroupSeCo);
-		$('#li' + vertex.id + ' p').click(ViewportManager.highlightClckdVertexGroupSeCo);
-		
-		// highlight the newly added vertices if already highlight in the move area
-		this.checkHighlightingAtGrouping(vertex);
-		this.checkHighlightingAtGrouping(defaultVertex);
-		
-		// highlight the default vertex if searched
-		if (this.vertexSearchHighlighting[defaultVertex.symbolicName] !== undefined) {
-			this.highlightSearchedVertexInGroup(defaultVertex);
-		}
-		
-		// highlight the newly added vertex if searched
-		if (this.vertexSearchHighlighting[vertex.symbolicName] !== undefined) {
-			this.highlightSearchedVertexInGroup(vertex);
-		}
-	},
-
-	/**
-	 * Zobrazeni skupiny komponent v pravem sloupci.
-	 */
-	showGroupInRightPanel: function(group_name){
-		// remove possible transformations
-		$('#required' + group_name).removeAttr('transform');
-		$('#provided' + group_name).removeAttr('transform');
-
-		// hide decomposed-spreat vertices
-		$('ul[data-groupid=' + group_name + '] li').each(function() {
-			id_vert = $(this).find('p').attr('data-vertexid');
-
-			$('g#vertex' + id_vert).hide();
-		});
-
-		// set proper label
-		var selected_group = this.groupManager.getGroup(group_name);
-		$('#rightPanel #group' + group_name + ' #label' + group_name).html(selected_group.label);
-
-		$('#rightPanel #group'+group_name).show();
-
-		//odstraneni skupiny komponent
-		$('#graph #gv_'+group_name).remove();
-
-		//skryti
-		group2 = this.groupManager.getGroup(group_name);
-
-		$('ul[data-groupid=' + group_name + '] li').each(function() {
-			id_vert = $(this).find('p').attr('data-vertexid');
-
-			for(var i = 0; i< group2.items.get(id_vert).edges.length; i++){
-				var edge = group2.items.get(id_vert).edges[i];
-
-				if(edge.from.id == id_vert){
-					edge.$selector.hide();
-				} else {
-					edge.$selector.hide();
-				}
-			}
-		});
-
-		// check if opacity needs to be set to unconnected - for vertices grouped in the group
-		var vertexList = selected_group.items.getAll();
-
-		// iterate through the object filled with vertices
-		$.each(vertexList, function(key, value){
-			// vertex is not excluded anymore
-			value.excluded = true;
-
-			OffScreenKiv.detectAndSetUnconnectedInGraph(value);
-		});
-
-		$('#includeAllComponents').show();
-	},
-	
-	/**
-	 * Called when group's left arrow icon is clicked in SeCo to display the group in the diagram area.
-	 * 
-	 * @param  idGroup	identifier of a group
-	 */
-	showGroupInGraph: function(idGroup){
-		var graph = $('#graph')[0];
-		
-		var group = this.groupManager.getGroup(idGroup);
-		var svg = SvgFactory.createGroup(group);
-		
-		// add to the main graph svg
-		graph.appendChild(svg);
-
-		// drag only by rectangle or the symbol
-		var groupElement = $('#gv_' + idGroup + ' > rect, #symbol' + idGroup + ', #labelTextElement' + idGroup);
-		groupElement.mousedown(group.idGroup, ViewportManager.groupVertexMousedownHandler);
-		groupElement.mouseup(ViewportManager.viewportEndDraggingHandler);
-		
-		// bind lollipop highlighting
-		$('#provided' + idGroup).click(OffScreenKiv.groupHighlightProvided);
-		$('#required' + idGroup).click(OffScreenKiv.groupHighlightRequired);
-
-		// bind label change that doesn't click if dragged
-		var flag;
-		$('#labelTextElement' + idGroup + ', #symbol' + idGroup).mousedown(function(){
-			flag = 0;
-		});
-		$('#labelTextElement' + idGroup + ', #symbol' + idGroup).mousemove(function(){
-			flag = 1;
-		});
-		$('#labelTextElement' + idGroup + ', #symbol' + idGroup).mouseup(function(){
-			if (flag == 0) {
-				$('#dialog').data('group', group)
-				.data('groupLabel', $('#label' + group.idGroup))
-				.data('isSvgElement', true)
-				.dialog('open');
-			}
-		});
-
-		this.moveElementAfter(svg, group.idGroup);
-		
-		// update the numbers in lollis
-		this.updateCountOfProvidedAndRequired(group);
-		
-		// check if opacity needs to be reset - for vertices grouped in the group
-		var vertexList = group.items.getAll();
-		
-		// iterate through the object filled with vertices
-		$.each(vertexList, function(key, value){
-			// vertex has became excluded from the diagram area
-			value.excluded = false;
-			
-			OffScreenKiv.detectAndResetReconnectedInGraph(value);
-		});
-	},
-	
-	/**
-	 * Moves group element in DOM after it is created to have right z-index.
-	 */
-	moveElementAfter: function(group_elm, group_name){
-		var coords = getCoordinates(group_elm.getAttribute('transform'));
-		posX = coords.x;
-		posY = coords.y;
-		
-		posX_reset = posX;
-		
-		group2 = this.groupManager.getGroup(group_name);
-		group2.x = posX;
-		group2.y = posY;
-
-		id_vert = 0;
-		
-		$('ul[data-groupid=' + group_name + '] li').each(function() {
-			id_vert = $(this).find('p').attr('data-vertexid');
-			
-			var newX;
-			var newY;
-			
-			var lollipop;
-			posX = posX_reset;
-			posX = parseFloat(posX);
-			posY = parseFloat(posY);
-			
-			//posun pozice, aby byla komponenta vycentrovana
-			hidden_component_width = $('g#vertex' + id_vert + ' rect').attr('width');
-			
-			//vystredeni na stred
-			posX = posX  - (hidden_component_width/2) + 40;
-			
-			group2.items.get(id_vert).x = posX;
-			group2.items.get(id_vert).y = posY;
-
-			$vertexentTarget = $('g#vertex' + id_vert);
-			$vertexentTarget.attr('transform', 'translate('+posX+','+posY+')');
-			$vertexentTarget.trigger('click',{move_edges:true});
-			
-			for(var i = 0; i< group2.items.get(id_vert).edges.length; i++){
-				var edge = group2.items.get(id_vert).edges[i];
-				var sizeOfRectFrom = getSizeOfRectangle(edge.from.name);
-				var sizeOfRectTo = getSizeOfRectangle(edge.to.name);
-				
-				if (edge.from.id == id_vert) {
-					newX = group2.items.get(id_vert).edges[i].to.x + sizeOfRectTo/2;
-					newY = group2.items.get(id_vert).edges[i].to.y + 13;
-					lollipop = getLollipopPosition(posX + sizeOfRectFrom/2, posY +13 , newX, newY);
-					
-					edge.$selector.children("line").attr('x1', posX + sizeOfRectFrom/2);
-					edge.$selector.children("line").attr('y1', posY + 13);
-					edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-					
-					ViewportManager.preventTickRotation(edge, lollipop);
-					ViewportManager.preventCrossRotation(edge, lollipop);
-					
-					//hrana k vrcholu se zobrazi pouze pokud je vrchol zobrazen
-					if ($('#vertex'+ edge.to.id)[0].isVisible() ||
-						($('#rightPanel li#li'+edge.to.id).is(':visible') === false && $('#rightPanel li#li'+edge.to.id).length > 0)
-					) {
-						edge.$selector.show();
-					}
-					
-				} else {
-					newX = group2.items.get(id_vert).edges[i].from.x + sizeOfRectFrom/2;
-					newY = group2.items.get(id_vert).edges[i].from.y + 13;
-					lollipop = getLollipopPosition(newX, newY, posX + sizeOfRectTo/2, posY + 13);
-					
-					edge.$selector.children("line").attr('x2', posX + sizeOfRectTo/2);
-					edge.$selector.children("line").attr('y2', posY + 13);
-					edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-					
-					ViewportManager.preventTickRotation(edge, lollipop);
-					ViewportManager.preventCrossRotation(edge, lollipop);
-					
-					//hrana k vrcholu se zobrazi pouze pokud je vrchol zobrazen
-					if ($('g#vertex'+ edge.from.id)[0].isVisible() || 
-						($('#rightPanel #li'+edge.from.id).is(':visible') === false && $('#rightPanel li#li'+edge.from.id).length > 0)
-					) {
-						edge.$selector.show();
-					}
-				}
-			}
-			
-			
-			//skryti komponenty
-			$vertexentTarget.hide();
-		});
-		
-		$('#rightPanel div#group' + group_name).hide();
-		
-		// set it as decomposed initially
-		group2.decompose = false;
-	},
-
-	/**
-	 * Displays a group of components as a detached viewport in the diagram area.
-	 *
-	 * @param  idGroup 		ID of the group
-	 */
-	showGroupInViewport: function(idGroup) {
-		$('#gv_'+ idGroup).remove();
-
-		var groupViewport = $('#groupViewport_'+ idGroup);
-
-		if (groupViewport.length !== 0) {
-			groupViewport.show();
-			return;
-		}
-
-		var group = this.groupManager.getGroup(idGroup);
-		group.decompose = true;
-
-		// positions
-		var coords = {
-			x: stringToFloat(group.x),
-			y: stringToFloat(group.y) + 5,
-		};
-
-		var width = 600;
-		var height = 300;
-
-		// move other nodes to make space for viewport
-		var boundaries = {
-			top: coords.y,
-			bottom: coords.y + height,
-			left: coords.x,
-			right: coords.x + width,
-		};
-
-		ViewportManager.moveNodes(boundaries);
-
-		// add to the main graph svg
-		$('#graph .edges').after(SvgFactory.createGroupViewport(group, coords));
-
-	
-		 // bind drag
-		 var viewportElement = $('#graph #groupViewport_' + idGroup + ' .handle');
-		 viewportElement.mousedown(idGroup, ViewportManager.viewportMousedownHandler);
-		 viewportElement.mouseup(ViewportManager.viewportEndDraggingHandler);
-		 
-
-		// bind label change
-		$('#labelTextElement' + idGroup).click(function(){
-			$('#dialog').data('group', group)
-				.data('groupLabel', $('#label' + group.idGroup))
-				.data('isSvgElement', true)
-				.dialog('open');
-		});
-
-
-		// remove edges
-		$('ul[data-groupid=' + idGroup + '] li').each(function() {
-			vertexId = $(this).find('p').attr('data-vertexid');
-			for (var i = 0; i < group.items.get(vertexId).edges.length; i++) {
-				var edge = group.items.get(vertexId).edges[i];
-
-				if (edge.from.id == vertexId) {
-					edge.$selector.hide();
-				} else {
-					edge.$selector.hide();
-				}
-			}
-		});
-
-		// iterate through the object filled with vertices
-		$.each(group.items.getAll(), function(key, value){
-			// vertex is not excluded anymore
-			value.excluded = true;
-
-			OffScreenKiv.detectAndSetUnconnectedInGraph(value);
-		});
-	},
-
-	/**
-	 *  Nifty little snippet to parse the transform attribute into usable a format
-	 *  @param transformString		Value of the transform attribute
-	 */
-	
-	parseTransform: function(transformString)
-	{
-		
-		var b={};
-		for (var i in transformString = String(transformString).match(/(\w+\((\-?\d+\.?\d*e?\-?\d*,?)+\))+/g))
-		{
-			var c = String(transformString[i]).match(/[\w\.\-]+/g);
-			b[c.shift()] = c;
-		}
-		return b;
-		
-	},
-
-	/**
-	 * Hides the detached viewport of a group displayed in graph and displays it as a simple group node instead.
-	 * @param  idGroup 		ID of the group
-	 */
-	hideGroupViewport: function(idGroup) {
-		//$('#gv_'+ idGroup).show();
-		
-		var group = this.groupManager.getGroup(idGroup);
-
-		var viewportTransform = $('#groupViewport_' + idGroup + ' > .viewportTransform');
-		var coords  = getCoordinates(viewportTransform[0].getAttribute('transform'));
-
-		group.x = coords.x;
-		group.y = coords.y - 5;
-
-		this.showGroupInGraph(idGroup);
-
-		var groupViewport = $('#groupViewport_'+ idGroup);	
-		if (groupViewport.length) {
-			groupViewport.remove();
-			$('.edge-viewport-out').remove();
-			return;
-		}
-	},
-
-	/**
-	 * Odstraneni vsech komponent ze skupiny
-	 * @param idGroup 	ID of the group
-	 */
-	removeAllComponentFromGroup: function(idGroup){
-		//show group of components in graph
-		$('#rightPanel #group'+ idGroup +' .deleteItemGroup').each(function() {
-			$(this).trigger('click');
-		});
-
-		var group = $('#gv_'+ idGroup);
-		if (group.length) {
-			group.remove();
-		}
-
-		var viewport = $('#groupViewport_'+ idGroup);
-		if (viewport.length) {
-			viewport.remove();
-			$('.edge-viewport-out').remove();
-			return;
-		}
-	},
-
-	/**
-	 * Count height of group in dependency of count of item in group.
-	 * Parameters: group - group
-	 */
-	countHeightOfGroup: function(group){
-		var heightOneItem = 17;
-		var height = heightOneItem*group.getGroupItemsLength();
-		return height;
-	},
-
-	/**
-	 * Edit height of group in dependency of count of item in group.
-	 * Parameters: group - group
-	 */
-	editHeightOfGroup: function(group){
-		var height = this.countHeightOfGroup(group);
-		var svg_new_height = height;
-		var new_height = height;
-		if ( svg_new_height < 60 ) {
-			svg_new_height = 70;
-			new_height = 56;
-		} else {
-			svg_new_height += 18;
-		}
-		$("#svgGroup" + group.idGroup).attr('height', svg_new_height);
-		$("#gr" + group.idGroup).children('rect').attr('height', new_height);
-	},
-
-	/**
-	 * Update count of provided end required packages.
-	 */
-	updateCountOfProvidedAndRequired: function(group){
-		var dependence = null;
-		var provided = 0, required = 0;
-
-		if(!GraphManager.isEfpGraph){ // legacy method
-			provided = group.providedPackage.size();
-			required = group.requiredPackage.size();
-		} else { // count real dependancies for EFP graphs
-			dependence = this.countDependenceGroup(group.idGroup);
-
-			provided = dependence.countFrom;
-			required = dependence.countTo;
-		}
-
-		$("#provided" + group.idGroup).children('text').text(provided);
-		$("#required" + group.idGroup).children('text').text(required);
-	},
-
-	/*
-	* Cancels highlighting of provided neighbours of given vertex.
-	* Parameters: vertex - vertex
-	*             id - id of element on which was be clicked
-	*/
-	disHighlightProvided: function(parentId, vertex){
-		for (var i = 0; i < vertex.edges.length; i++) {
-			var edgeId = vertex.edges[i].to.id;
-			
-			$('#detailVertex' + (edgeId)).attr('class', 'detail colorNormal');
-		}
-		
-		$('#' + parentId).attr('class', 'whiteColor');
-		for (var k = 0; k < vertex.edges.length; k++) {
-			vertex.edges[k].to.$selector.attr('class', 'node vertex colorNormal');
-		}
-	},
-	
-	
-	/**
-	* Highlights of provided neighbour of given vertex.
-	* Parameters: vertex - vertex
-	*             id - id of element on which was be clicked
-	*/
-	highlightProvided:function(parentId, vertex){
-		var idd = getIndexFromId(parentId, 8) - 1;
-		
-		for (var i = 0; i < vertex.edges.length; i++) {
-			var edgeId = vertex.edges[i].to.id;
-			
-			$('#detailVertex' + (edgeId)).attr('class', 'detail colorHighlightProvided');
-			$('#detailVertex' + (idd+1)).attr('class', 'detail colorNormal');
-		}
-		
-		$('#' + parentId).attr('class', 'colorHighlightProvided');
-		this.deselectHighlightSearchedVertices();
-		for (var i = 0; i < vertex.edges.length; i++) {
-			vertex.edges[i].to.$selector.attr('class', 'node vertex colorHighlightProvided');
-		}
-	},
-	
-	/**
-	* Cancels highlighting of required neighbour of given vertex.
-	* Parameters: vertex - vertex
-	*             id - id of element on which was be clicked
-	*/
-	disHighlightRequired: function(id, vertex){
-		for (var i = 0; i < vertex.edges.length; i++) {
-			var edgeId = vertex.edges[i].from.id;
-			
-			$('#detailVertex' + (edgeId)).attr('class', 'detail colorNormal');
-		}
-
-		$('#' + id).attr('class', 'whiteColor');
-		for (var l = 0; l < vertex.edges.length; l++) {
-			vertex.edges[l].from.$selector.attr('class', 'node vertex colorNormal');
-		}
-	},
-	
-	/**
-	* Highlights of required neighbour of given vertex.
-	* Parameters: vertex - vertex
-	*             id - id of element on which was be clicked
-	*/
-	highlightRequired:function(parentId, vertex){
-		var idd = getIndexFromId(parentId, 8) - 1;
-		
-		for (var i = 0; i < vertex.edges.length; i++) {
-			var edgeId = vertex.edges[i].from.id;
-			
-			$('#detailVertex' + (edgeId)).attr('class', 'detail colorHighlightRequired');
-			$('#detailVertex' + (idd+1)).attr('class', 'detail colorNormal');
-		}
-		
-		
-		$('#' + parentId).attr('class', 'colorHighlightRequired'); // tohle je zvyrazneni lizatka
-		this.deselectHighlightSearchedVertices();
-		for (var j = 0; j < vertex.edges.length; j++) {
-			vertex.edges[j].from.$selector.attr('class', 'node vertex colorHighlightRequired');
-		}
-	},
-	
-	/**
-	* Event calls action  disHighlightProvided or highlightProvided depending on what element was clicked.
-	* Parameters: e - event
-	*/
-	highlightProvidedEvent: function(e){
-		var parentId = e.target.parentElement.id;
-		var id = getIndexFromId(parentId, 8) - 1;
-		var vertex  = GraphManager.graph.vertices[id];
-		this.deselectHighlightSearchedVertices();
-		
-		if ($('#' + parentId).attr('class') != 'whiteColor') {
-			this.disHighlightProvided(parentId, vertex);
-		} else {
-			this.highlightProvided(parentId, vertex);
-		}
-		
-		if (($('#provided' + (id+1)).attr('class') != 'whiteColor') && ($('#required' + (id+1)).attr('class') != 'whiteColor')) {
-			$('#detailVertex' + (id+1)).unbind('click');
-			$('#detailVertex' + (id+1)).click(this.notHighlightNeighbour);
-		} else {
-			$('#detailVertex' + (id+1)).unbind('click');
-			$('#detailVertex' + (id+1)).click(this.highlightAllNeighbour);
-		}
-	},
-	
-	/**
-	* Event calls action  disHighlightRequired or highlightRequired depending on what element was clicked.
-	* Parameters: e - event
-	*/
-	highlightRequiredEvent: function(e){
-		var parentId = e.target.parentElement.id;
-		var id = getIndexFromId(parentId, 8) - 1;
-		var vertex  = GraphManager.graph.vertices[id];
-		
-		if ($('#' + parentId).attr('class') != 'whiteColor') {
-			this.disHighlightRequired(parentId, vertex);
-		}else {
-			this.highlightRequired(parentId, vertex);
-		}
-		
-		if (($('#provided' + (id+1)).attr('class') != 'whiteColor') && ($('#required' + (id+1)).attr('class') != 'whiteColor')) {
-			$('#detailVertex' + (id+1)).unbind('click');
-			$('#detailVertex' + (id+1)).click(this.notHighlightNeighbour);
-		} else {
-			$('#detailVertex' + (id+1)).unbind('click');
-			$('#detailVertex' + (id+1)).click(this.highlightAllNeighbour);
-		}
-	},
-	
-	/**
-	* Cancels all highlighting of neigbour given vertex.
-	* Parameters: vertex - vertex
-	*             id - id of element on which was be clicked
-	*/
-	disHighlihgtAll: function(id, vertex){
-		for(var i = 0; i < vertex.edges.length; i++){
-			var edgeFrom = vertex.edges[i].from;
-			var edgeTo = vertex.edges[i].to;
-			
-			$('#detailVertex' + (edgeFrom.id)).attr('class', 'detail colorNormal');
-			$('#detailVertex' + (edgeTo.id)).attr('class', 'detail colorNormal');
-			
-			edgeFrom.$selector.attr('class', 'node vertex colorNormal');
-			edgeTo.$selector.attr('class', 'node vertex colorNormal');
-
-			if (vertex.id === edgeFrom.id) {
-				vertex.edges[i].$selector.css('stroke', '');
-			} else if (vertex.id === edgeTo.id) {
-				vertex.edges[i].$selector.css('stroke', '');
-			}
-		}
-
-		$('#provided'+ id).attr('class', 'whiteColor');
-		$('#required'+ id).attr('class', 'whiteColor');
-	},
-	
-	/**
-	* Event calls action  disHighlihgtAll after click to given element.
-	* Parameters: e - event
-	*/
-	notHighlightNeighbour: function(e){
-		var id = getIndexFromId(e.target.parentElement.id, 12) - 1;
-		var vertex  = GraphManager.graph.vertices[id];
-		
-		this.disHighlihgtAll((id+1), vertex);
-		$('#' + e.target.parentElement.id).unbind('click', this.notHighlightNeighbour);
-		$('#' + e.target.parentElement.id).click(this.highlightAllNeighbour);
-	},
-	
-	/**
-	* Highlights all neigbours given vertex.
-	* Parameters: vertex - vertex
-	*             id - id of element on which was be clicked
-	*/
-	highlihgtAll: function(id, vertex) {
-		this.deselectHighlightSearchedVertices();
-		
-		for (var i = 0; i < vertex.edges.length; i++){
-			var edgeFrom = vertex.edges[i].from;
-			var edgeTo = vertex.edges[i].to;
-			
-			$('#detailVertex' + (edgeFrom.id)).attr('class', 'detail colorHighlightRequired');
-			$('#detailVertex' + (edgeTo.id)).attr('class', 'detail colorHighlightProvided');
-			$('#detailVertex' + (id)).attr('class', 'detail colorNormal');
-			
-			edgeFrom.$selector.attr('class', 'node vertex colorHighlightRequired');
-			edgeTo.$selector.attr('class', 'node vertex colorHighlightProvided');
-
-			if (vertex.id === edgeFrom.id) {
-				vertex.edges[i].$selector[0].classList.remove('edge--dimmed');
-			} else if (vertex.id === edgeTo.id) {
-				vertex.edges[i].$selector[0].classList.remove('edge--dimmed');
-			}
-		}
-
-		$('#provided'+ id).attr('class', 'colorHighlightProvided');
-		$('#required'+ id).attr('class', 'colorHighlightRequired');
-	},
-	
-	/**
-	* Event calls action  highlihgtAll after click to given element.
-	* Parameters: e - event
-	*/
-	highlightAllNeighbour: function(e){
-		var id = getIndexFromId(e.target.parentElement.id, 12) - 1;
-		var vertex  = GraphManager.graph.vertices[id];
-		this.highlihgtAll((id+1), vertex);
-		
-		$('#' + e.target.parentElement.id).unbind('click', this.highlightAllNeighbour);
-		$('#' + e.target.parentElement.id).click(this.notHighlightNeighbour);
-	},
-
-	/**
-	 * Cancels highlighting of all neighbors (provided) of vertex in group.
-	 * Parameters: e - event
-	 */
-	groupDisHighlightProvided: function(e){
-		var providedElement = e.target.parentElement.id;
-
-		var id = findId(e.target);
-		var group = this.groupManager.getGroup(id);
-
-		for (var key in group.items) {
-			if (group.items.contains(key)) {
-				this.disHighlightProvided(providedElement, group.items.get(key));
-			}
-		}
-
-		$('#' + providedElement).unbind('click', this.groupDisHightlightProvided);
-		$('#' + providedElement).click(this.groupHighlightProvided);
-
-		if (($('#provided' + id).attr('class') != 'whiteColor') && ($('#required' + id).attr('class') != 'whiteColor')) {
-			$('#gr' + id).unbind('click',this.groupHighlightRequiredAndProvided);
-			$('#gr' + id).click(this.groupDisHighlightRequiredAndProvided);
-		} else {
-			$('#gr' + id).unbind('click', this.groupDisHighlightRequiredAndProvided);
-			$('#gr' + id).click(this.groupHighlightRequiredAndProvided);
-		}
-	},
-
-	/**
-	 * Highlights  all neighbors (provided) of vertex in group.
-	 * Parameters: e - event
-	 */
-	groupHighlightProvided: function(e){
-		var providedElement = e.target.parentElement.id;
-
-		var id = findId(e.target);
-		var group = this.groupManager.getGroup(id);
-
-		for (var key in group.items) {
-			if (group.items.contains(key)) {
-				this.highlightProvided(providedElement, group.items.get(key));
-			}
-		}
-
-		$('#' + providedElement).unbind('click',this.groupHighlightProvided);
-		$('#' + providedElement).click(this.groupDisHighlightProvided);
-
-		if (($('#provided' + id).attr('class') != 'whiteColor') && ($('#required' + id).attr('class') != 'whiteColor')) {
-			$('#gr' + id).unbind('click',this.groupHighlightRequiredAndProvided);
-			$('#gr' + id).click(this.groupDisHighlightRequiredAndProvided);
-		} else {
-			$('#gr' + id).unbind('click', this.groupDisHighlightRequiredAndProvided);
-			$('#gr' + id).click(this.groupHighlightRequiredAndProvided);
-		}
-	},
-
-
-	/**
-	 * Cancels highlighting of all neighbors (required) of vertex in group.
-	 * Parameters: e - event
-	 */
-	groupDisHighlightRequired: function(e){
-		var providedElement = e.target.parentElement.id;
-
-		var id = findId(e.target);
-		var group = this.groupManager.getGroup(id);
-
-		for (var key in group.items) {
-			if (group.items.contains(key)) {
-				this.disHighlightRequired(providedElement, group.items.get(key));
-			}
-		}
-
-		$('#' + providedElement).unbind('click', this.groupDisHightlightRequired);
-		$('#' + providedElement).click(this.groupHighlightRequired);
-
-		if (($('#provided' + id).attr('class') != 'whiteColor') && ($('#required' + id).attr('class') != 'whiteColor')) {
-			$('#gr' + id).unbind('click',this.groupHighlightRequiredAndProvided);
-			$('#gr' + id).click(this.groupDisHighlightRequiredAndProvided);
-		} else {
-			$('#gr' + id).unbind('click', this.groupDisHighlightRequiredAndProvided);
-			$('#gr' + id).click(this.groupHighlightRequiredAndProvided);
-		}
-	},
-
-	/**
-	 * Highlights  all neighbors (required) of vertex in group.
-	 * Parameters: e - event
-	 */
-	groupHighlightRequired: function(e){
-		var providedElement = e.target.parentElement.id;
-
-		var id = findId(e.target);
-		var group = this.groupManager.getGroup(id);
-
-		for (var key in group.items) {
-			if (group.items.contains(key)) {
-				this.highlightRequired(providedElement, group.items.get(key));
-			}
-		}
-
-		$('#' + providedElement).unbind('click',this.groupHighlightRequired);
-		$('#' + providedElement).click(this.groupDisHighlightRequired);
-
-		if (($('#provided' + id).attr('class') != 'whiteColor') && ($('#required' + id).attr('class') != 'whiteColor')) {
-			$('#gr' + id).unbind('click',this.groupHighlightRequiredAndProvided);
-			$('#gr' + id).click(this.groupDisHighlightRequiredAndProvided);
-		} else {
-			$('#gr' + id).unbind('click', this.groupDisHighlightRequiredAndProvided);
-			$('#gr' + id).click(this.groupHighlightRequiredAndProvided);
-		}
-	},
-
-	/**
-	 * Highlights required and provided components of a group in SeCo or viewport by its ID.
-	 * @param  id 		the group identifier
-	 */
-	groupHighlight: function(id) {
-		var group = this.groupManager.getGroup(id);
-
-		for (var key in group.items) {
-			if (group.items.contains(key)) {
-				this.highlihgtAll(id, group.items.get(key));
-			}
-		}
-
-		$('#required' + id).unbind('click',this.groupHighlightRequired);
-		$('#required' + id).click(this.groupDisHighlightRequired);
-		$('#provided' + id).unbind('click',this.groupHighlightProvided);
-		$('#provided' + id).click(this.groupDisHighlightProvided);
-	},
-
-	/**
-	 * Dishighlights required and provided components of a group in SeCo or viewport by its ID.
-	 * @param  id 		the group identifier
-	 */
-	groupDisHighlight: function(id) {
-		var group = this.groupManager.getGroup(id);
-
-		for (var key in group.items) {
-			if (group.items.contains(key)) {
-				this.disHighlihgtAll(id, group.items.get(key));
-			}
-		}
-
-		$('#required' + id).unbind('click',this.groupDisHighlightRequired);
-		$('#required' + id).click(this.groupHighlightRequired);
-		$('#provided' + id).unbind('click',this.groupDisHighlightProvided);
-		$('#provided' + id).click(this.groupHighlightProvided);
-	},
-
-	/**
-	 * Highlights  all neighbors of vertex in group.
-	 * Parameters: e - event
-	 */
-	groupHighlightRequiredAndProvided: function(e) {
-		var providedElement = e.target.parentElement.id;
-		var id = findId(e.target);
-
-		$('#' + providedElement).unbind('click', this.groupHighlightRequiredAndProvided);
-		$('#' + providedElement).click(this.groupDisHighlightRequiredAndProvided);
-
-		this.groupHighlight(id);
-	},
-
-	/**
-	 * Cancels highlighting of all neighbors of vertex in group.
-	 * Parameters: e - event
-	 */
-	groupDisHighlightRequiredAndProvided: function(e){
-		var providedElement = e.target.parentElement.id;
-		var id = findId(e.target);
-
-		$('#' + providedElement).unbind('click', this.groupDisHighlightRequiredAndProvided);
-		$('#' + providedElement).click(this.groupHighlightRequiredAndProvided);
-
-		this.groupDisHighlight(id);
-	},
-
-	/**
-	 * Cancels highlighting of all group related lollipops.
-	 */
-	groupDisHighlightAllLollipops: function(){
-		$('.colorHighlightProvided:not(.vertex), .colorHighlightRequired:not(.vertex)').attr('class', 'whiteColor');
-	},
-
-	/**
-	 * Cancels highlighting of vertices which were searched.
-	 */
-	deselectHighlightSearchedVertices: function(){
-		for (var key in this.vertexSearchHighlighting) {
-			this.vertexSearchHighlighting[key][0].classList.remove('vertex--searched');
-
-			delete this.vertexSearchHighlighting[key];
-		}
-
-		$('#countOfFinded').text(0);
-	},
-
-	/**
-	 * Highlights the searched vertex in group.
-	 */
-	highlightSearchedVertexInGroup: function(vertex) {
-		// set background of <p> in <li>
-		var $selector = $('#li' + (vertex.id) + ' p');
-		$selector[0].classList.add('vertex--searched');
-
-		this.vertexSearchHighlighting['li' + (vertex.id)] = $selector;
-	},
-
-	/**
-	 * Highlights all vertex if their name contains searched string.
-	 */
-	search: function(){
-		var vertices = GraphManager.graph.vertices;
-		var text = $("#searchText").val();
-		this.deselectHighlightSearchedVertices();
-
-		// handle empty search string - tool tip
-		if (text === ""){
-			$("#searchText").qtip({
-				content: {
-					text: "Please fill out this field."
-				},
-				style: {
-					classes: "ui-tooltip-yellow ui-tooltip-rounded ui-tooltip-shadow"
-				}
-			}).qtip("show");
-
-			$(window).mousemove(function(){
-				setTimeout(OffScreenKiv.hideTooltip, 2000);
-				$(this).unbind("mousemove");
-			});
-			return;
-		}
-
-		var countOfFound = 0;
-
-		for (var i = 0; i < vertices.length; i++) {
-			if (vertices[i].name.toLowerCase().indexOf(text.toLowerCase()) >= 0) {
-				$(vertices[i].$selector)[0].classList.add('vertex--searched');
-				this.vertexSearchHighlighting[vertices[i].symbolicName] = vertices[i].$selector;
-				countOfFound++;
-
-				// handle SeCo panel - w/o unconnected
-				if (vertices[i].excluded === true) {
-					var $selector = $('#detailVertex' + (vertices[i].id));
-
-					if ($selector.length) { // is not grouped
-						$selector[0].classList.add('vertex--searched');
-
-						this.vertexSearchHighlighting['detailVertex' + (vertices[i].id)] = $selector;
-					} else { // is grouped
-						this.highlightSearchedVertexInGroup(vertices[i]);
-					}
-				}
-
-				// handle unconnected
-				if (vertices[i].edges.length === 0) {
-					// show the list if hidden
-					if ($('#unconComps').is(':hidden')) {
-						$('#unconComps').show();
-					}
-
-					var $selector = $('#liuc' + (vertices[i].id) + ' p');
-					$selector[0].classList.add('vertex--searched');
-
-					this.vertexSearchHighlighting['liuc' + (vertices[i].id)] = $selector;
-				}
-			}
-		}
-
-		$("#countOfFinded").html(countOfFound);
-	},
-
-	/**
-	 * Hide tooltip of search textfield.
-	 */
-	hideTooltip: function(){
-		$("#searchText").qtip("hide");
-		$("#searchText").qtip("destroy");
-	},
-
-	/**
-	 * TODO could be merged with the "excludeVerticesWithMostEdgesToGroup" function
-	 * Excludes vertices whith the most edges from graph to the right panel.
-	 */
-	excludeVerticesWithMostEdges: function() {
-		var vertices = GraphManager.graph.vertices;
-		var sortedMappingToVertex = new Array(vertices.length);
-
-		for (var j = 0; j < vertices.length; j++) {
-			sortedMappingToVertex[j] = j;
-		}
-
-		sortedMappingToVertex.sort(function(a, b) {
-			if(vertices[a].edges.length > vertices[b].edges.length){
-				return -1;
-			}
-			if(vertices[a].edges.length == vertices[b].edges.length){
-				return 0;
-			}
-			return 1;
-		});
-
-		var countExcludedVertices = Math.round(sortedMappingToVertex.length*0.15);
-		var vertex;
-		if (countExcludedVertices >= 1) {
-			$('input[name="actionMove"]:eq("move")').click();
-		}
-
-		for (var i = 0; i < countExcludedVertices; i++) {
-			vertex = vertices[sortedMappingToVertex[i]];
-
-			if (!vertex.excluded) {
-				var e = jQuery.Event('mousedown');
-				e.which = 1;
-				e.target = vertex.$selector[0];
-				this.showVertexInRightPanel(e);
-			}
-		}
-	},
-
-	/**
-	 * Merge vertices whith the most edges to one group and excludes them from graph to the right panel.
-	 */
-	excludeVerticesWithMostEdgesToGroup: function() {
-		var vertices = GraphManager.graph.vertices;
-		var sortedMappingToVertex = new Array(vertices.length);
-
-		for (var j = 0; j < vertices.length; j++) {
-			sortedMappingToVertex[j] = j;
-		}
-
-		sortedMappingToVertex.sort(function(a, b) {
-			if (vertices[a].edges.length > vertices[b].edges.length) {
-				return -1;
-			}
-			if (vertices[a].edges.length == vertices[b].edges.length) {
-				return 0;
-			}
-			return 1;
-		});
-
-		var countExcludedVertices = Math.round(sortedMappingToVertex.length*0.15);
-		var vertex;
-		if (countExcludedVertices >= 1) {
-			$('input[name="actionMove"]:eq("move")').click();
-		}
-
-		var symbol = this.markSymbol.getMarkSymbol();
-		var group;
-		var idGroup;
-
-		for (var i = 0; i < countExcludedVertices; i++) {
-			vertex = vertices[sortedMappingToVertex[i]];
-
-			if (!vertex.excluded) {
-				vertex.symbol = symbol;
-				idGroup = symbol[1].substring(1, symbol[1].length) + symbol[0];
-
-				if (i === 0) {
-					this.addItemToContextMenu(symbol, vertex.id, vertex.name);
-					group = new Group(vertex.symbol, idGroup);
-					this.groupManager.addGroupToList(idGroup, group);
-					this.createGroupDetail(group, vertex.symbol);
-				}
-
-				this.addVertexToGroup(idGroup, $("#vertex"+ vertex.id));
-			}
-		}
-
-		$('#includeAllComponents').show();
-	}
-};
\ No newline at end of file
diff --git a/sources/WebContent/old/js/svgFactory.js b/sources/WebContent/old/js/svgFactory.js
deleted file mode 100644
index dd371a0..0000000
--- a/sources/WebContent/old/js/svgFactory.js
+++ /dev/null
@@ -1,1052 +0,0 @@
-/**
- * Factory creating all SVG elements used by the application.
- */
-var SvgFactory = {
-	/* jshint multistr: true */
-
-	ns_str: 'http://www.w3.org/2000/svg',	
-	efpMinIntDiameter : null,
-	efpMaxIntDiameter : null,
-	composedGroupInitialWidth: 186,
-
-	/**
-	 * Creates element for image of interfaces.
-	 *
-	 * @param size size
-	 * @param vertexId vertex ID
-	 * @returns {string} String with part of svg
-	 */
-	createInterface: function(size, vertexId) {
-		return '<g class="interface" data-vertexId="' + vertexId + '" transform="translate(8,6)">\
-			<rect width="10" height="15" x="0" y="0"/>\
-			<rect width="6" height="3" x="-3" y="3"/>\
-			<rect width="6" height="3" x="-3" y="9"/>\
-			</g>';
-	},
-
-	/**
-	 * Creates element for edge displayed in diagram area.
-	 */
-	createEdge: function(edge, isEfpGraph) {
-		var svg;
-		var sizeOfRectFrom = getSizeOfRectangle(edge.from.name),
-			sizeOfRectTo = getSizeOfRectangle(edge.to.name),
-			lollipop = getLollipopPosition(edge.from.x + sizeOfRectFrom / 2, edge.from.y + 13, edge.to.x + sizeOfRectTo / 2, edge.to.y + 13);
-		
-		svg = '<g class="edge" id="e' + edge.id + '">\
-			<line x1="' + (edge.from.x + sizeOfRectFrom / 2) + '" y1="' + (edge.from.y + 13) + '" x2="' + (edge.to.x + sizeOfRectTo / 2) + '" y2="' + (edge.to.y + 13) + '" stroke="white" stroke-width="5"/>\
-			<line x1="'+ (edge.from.x + sizeOfRectFrom / 2) + '" y1="' + (edge.from.y + 13) + '" x2="'+ (edge.to.x + sizeOfRectTo / 2) + '" y2="' + (edge.to.y + 13) + '" stroke-width="1"/>\
-			<g class="lollipop" data-edgeId="' + edge.id + '" transform="rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ')\
-			translate('+ lollipop.x + ',' + lollipop.y  + ')">\
-			<path class="SamplePath" d="M0,';
-
-		// EFP graph should have paths based on settings
-		if (isEfpGraph) {
-			var yDistance = this.efpMinIntDiameter / 2 + 4;
-			// X distance of half-circle's "draggers" should be equal to 2/3 of circle diameter (eg. circle diametr=24, draggers=16)
-			var xDistance = yDistance * 4 / 3;
-
-			svg += -yDistance + ' C' + xDistance + ',' + -yDistance + ' ' + xDistance + ',' + yDistance + ' 0,' + yDistance + '"/>';
-		} else {
-			svg += '-12 C16,-12 16,12 0,12"/>';
-		}
-
-		svg += '<circle cx="0" cy="0" r="';
-
-		// EFP graph should have circles based on settings
-		if (isEfpGraph) {
-			// r = d/2
-			svg += this.efpMinIntDiameter / 2;
-		} else {
-			svg += 8;
-		}
-		svg += '" />';
-
-		// LM: fajfka/kriz - nekompatibilni komponenty
-		if (edge.isCompatible) {
-			svg += '<line class="lollipop-tick" x1="6" y1="-4" x2="-4" y2="6" transform="rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)" id="lollipop-tick_a_' + edge.id + '"></line>';
-			svg += '<line class="lollipop-tick" x1="-5" y1="-3" x2="-4" y2="5"  transform="rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)" id="lollipop-tick_b_' + edge.id + '"></line>';
-		} else {
-			svg += '<line class="lollipop-cross" x1="-5" y1="-5" x2="5" y2="5" transform="rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)" id="lollipop-cross_a_' + edge.id + '"></line>';
-			svg += '<line class="lollipop-cross" x1="-5" y1="5" x2="5" y2="-5" transform="rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)" id="lollipop-cross_b_' + edge.id + '"></line>';
-		}
-
-		// add EFP failure mark to edge if needed
-		if (GraphManager.isEfpGraph && !edge.edgeStatusOk) {
-			svg += '<line x1="'+ -4 +'" y1="' + -4 + '" x2="' + 4 + '" y2="' + 4 + '"\
-				transform="rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)" class="lollipop-line' + edge.id + '" stroke="red" />\
-				<line x1="'+ -4 +'" y1="' + 4 + '" x2="' + 4 + '" y2="' + -4 + '"\
-				transform="rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)" class="lollipop-line' + edge.id + '" stroke="red" />';
-		}
-
-		svg += '</g></g>';
-
-		return svg;
-	},
-
-	/**
-	 * Creates element for vertex displayed in diagram area.
-	 */
-	createVertex: function(vertex) {
-		var svg;
-
-		svg = '<g class="node vertex colorNormal" id="vertex' + vertex.id + '" data-id="'+ vertex.id +'" transform="translate(' + vertex.x + ',' + vertex.y + ')">\
-			<rect width="' + (vertex.size + 20) + '" height="26" />\
-			<text x="' + vertex.size / 2 + '" y="13">' + vertex.name + '</text>';
-
-		svg += this.createInterface(vertex.size, vertex.id);
-
-		// pridani malych ctvercu vpravo
-		svg += '<g id="rectTop'+ vertex.id +'" transform="translate('+ (vertex.size - 25) +', 0)" stroke-width="1">\
-			<g id="lolGL'+ vertex.id +'" class="whiteColor" transform="translate(17,44) rotate(90,0,0) scale(0.8)">\
-			<line x1="-25" y1="5" x2="-30" y2="5" stroke="black"/>\
-			<path class="SamplePath" d="M-42,-5 C-27,-5 -27,15 -42,15" stroke="black" />\
-			</g>\
-			<text id="rectTopText'+ vertex.id +'" x="13" y="12"></text>\
-			</g>';
-
-		svg += '<g id="rectBot'+ vertex.id +'" transform="translate('+ (vertex.size - 5) +', 0)" stroke-width="1">\
-			<g id="lolGP'+ vertex.id +'" class="whiteColor" transform="translate(38, 45) rotate(90,0,0) scale(0.8)">\
-			<line x1="-25" y1="31" x2="-30" y2="31" stroke="black"/>\
-			<circle cx="-42" cy="31" r="11" stroke="black" /> \
-			</g>\
-			<text id="rectBotText'+ vertex.id +'" x="13" y="12"></text>\
-			</g>';
-
-		svg += '</g>';
-
-		return svg;
-	},
-
-	/**
-	 * Creates element for group displayed in diagram area.
-	 */
-	createGroup: function(group) {
-		var svg_w = $('#svg1').width();
-		var svg_h_scroll_top = $('#viewport').scrollTop();
-		var viewport_h =  $('#viewport').height();
-		var svg_w_scroll_left = $('#viewport').scrollLeft() * -1; // musi se vynasobit -1 protoze vraci zapornou pozici
-		var viewport_w =  $('#viewport').width();
-		
-		// positions
-		var rand_x = Math.floor((Math.random()*200) - 100);
-		var rand_y = Math.floor((Math.random()*200) - 100);
-		
-		var pos_x = group.x;
-		var pos_y = group.y;
-		
-		// wrapper
-		var svg_elm_g = document.createElementNS(this.ns_str, 'g');
-		if (pos_x && pos_y) {
-			svg_elm_g.setAttributeNS(null, 'transform', 'translate('+ pos_x +','+ pos_y+')');
-		} else {
-			var translate_x = (svg_w - (svg_w_scroll_left  + viewport_w/2 ) - rand_x);
-			var translate_y = (svg_h_scroll_top + viewport_h/2 - rand_y);
-			svg_elm_g.setAttributeNS(null, 'transform', 'translate(' + translate_x + ',' + translate_y + ')');
-		}
-		
-		svg_elm_g.setAttributeNS(null, 'class', 'node group_vertices');
-		svg_elm_g.setAttributeNS(null, 'id', 'gv_' + group.idGroup);
-		svg_elm_g.setAttributeNS(null, 'data-id', group.idGroup);
-		
-		var rect_width = this.composedGroupInitialWidth;
-		
-		// rectangle
-		var svg_elm_rect = document.createElementNS(this.ns_str, 'rect');
-		svg_elm_rect.setAttributeNS(null,'height', 50);
-		svg_elm_rect.setAttributeNS(null,'width', rect_width);
-		svg_elm_rect.setAttributeNS(null,'stroke','black');
-		svg_elm_rect.setAttributeNS(null,'fill', $('#rect' + group.idGroup).attr('fill')); // keep the SeCo group's color
-		svg_elm_g.appendChild(svg_elm_rect);
-		
-		// group symbol
-		var svg_elm_text = document.createElementNS(this.ns_str, 'text');
-		svg_elm_text.setAttributeNS(null,'x', rect_width/2);
-		svg_elm_text.setAttributeNS(null,'y', 38);
-		svg_elm_text.setAttributeNS(null,'class', 'group-symbol');
-		svg_elm_text.setAttributeNS(null,'id', 'symbol' + group.idGroup);
-		
-		var innerText = document.createTextNode(group.groupSymbol[0]);
-		svg_elm_text.appendChild(innerText);
-
-		svg_elm_g.appendChild(svg_elm_text);
-		
-		// group name
-		var svg_elm_label = document.createElementNS(this.ns_str, 'text');
-		svg_elm_label.setAttributeNS(null,'x', rect_width/2);
-		svg_elm_label.setAttributeNS(null,'y', 35);
-		svg_elm_label.setAttributeNS(null,'class', 'group-label');
-		svg_elm_label.setAttributeNS(null,'id', 'labelTextElement' + group.idGroup);
-		svg_elm_label.setAttributeNS(null,'display', 'none');
-		
-		var groupLabel = document.createTextNode(group.label);
-		svg_elm_label.appendChild(groupLabel);
-		
-		svg_elm_g.appendChild(svg_elm_label);
-
-		if (group.label == "Group") {
-			
-			svg_elm_text.setAttributeNS(null,'x', 20);
-			svg_elm_text.setAttributeNS(null,'y', 20);
-			svg_elm_text.setAttributeNS(null,'class', 'group-symbol group-symbol-big');
-
-		} else {
-
-			svg_elm_label.setAttributeNS(null,'display', '');
-		}
-
-
-
-		// required lollipop
-		var svg_elm_req = document.createElementNS(this.ns_str, 'g');
-		svg_elm_req.setAttributeNS(null,'id', 'required' + group.idGroup);
-		
-		if ($('#required' + group.idGroup).attr('class') == 'colorHighlightRequired') {
-			svg_elm_req.setAttributeNS(null,'class', 'colorHighlightRequired');
-		} else {
-			svg_elm_req.setAttributeNS(null,'class', 'whiteColor');
-		}
-		
-		var svg_elm_req_line = document.createElementNS(this.ns_str, 'line');
-		svg_elm_req_line.setAttributeNS(null,'x1', rect_width - 31);
-		svg_elm_req_line.setAttributeNS(null,'y1', '21');
-		svg_elm_req_line.setAttributeNS(null,'x2', rect_width - 31);
-		svg_elm_req_line.setAttributeNS(null,'y2', '27');
-		svg_elm_req_line.setAttributeNS(null,'stroke', 'black');
-		
-		var svg_elm_req_path = document.createElementNS(this.ns_str, 'path');
-		svg_elm_req_path.setAttributeNS(null,'class', 'SamplePath');
-		svg_elm_req_path.setAttributeNS(null,'d', 'M146,12 C146,24 164,24 164,12');
-		svg_elm_req_path.setAttributeNS(null,'stroke', 'black');
-		
-		var svg_elm_req_text = document.createElementNS(this.ns_str, 'text');
-		svg_elm_req_text.setAttributeNS(null,'id', 'lolipC');
-		svg_elm_req_text.setAttributeNS(null,'x', rect_width - 31);
-		svg_elm_req_text.setAttributeNS(null,'y', '12');
-		svg_elm_req_text.setAttributeNS(null,'text-anchor', 'middle');
-		svg_elm_req_text.setAttributeNS(null,'fill', 'black');
-		svg_elm_req_text.setAttributeNS(null,'dominant-baseline', 'central');
-		svg_elm_req_text.setAttributeNS(null,'font-size', '11');
-		
-		var svg_elm_req_text_inner = document.createTextNode(group.requiredPackage.size());
-		
-		svg_elm_req_text.appendChild(svg_elm_req_text_inner);
-		
-		svg_elm_req.appendChild(svg_elm_req_line);
-		svg_elm_req.appendChild(svg_elm_req_path);
-		svg_elm_req.appendChild(svg_elm_req_text);
-
-
-		// provided lollipop
-		var svg_elm_prov = document.createElementNS(this.ns_str, 'g');
-		svg_elm_prov.setAttributeNS(null,'id', 'provided' + group.idGroup);
-		
-		if ($('#provided' + group.idGroup).attr('class') == 'colorHighlightProvided') {
-			svg_elm_prov.setAttributeNS(null,'class', 'colorHighlightProvided');
-		} else {
-			svg_elm_prov.setAttributeNS(null,'class', 'whiteColor');
-		}
-		
-		var svg_elm_prov_line = document.createElementNS(this.ns_str, 'line');
-		svg_elm_prov_line.setAttributeNS(null,'x1', rect_width - 11);
-		svg_elm_prov_line.setAttributeNS(null,'y1', '21');
-		svg_elm_prov_line.setAttributeNS(null,'x2', rect_width - 11);
-		svg_elm_prov_line.setAttributeNS(null,'y2', '27');
-		svg_elm_prov_line.setAttributeNS(null,'stroke', 'black');
-		
-		var svg_elm_prov_circle = document.createElementNS(this.ns_str, 'circle');
-		svg_elm_prov_circle.setAttributeNS(null,'cx', rect_width - 11);
-		svg_elm_prov_circle.setAttributeNS(null,'cy', '12');
-		svg_elm_prov_circle.setAttributeNS(null,'r', '9');
-		svg_elm_prov_circle.setAttributeNS(null,'stroke', 'black');
-		
-		var svg_elm_prov_text = document.createElementNS(this.ns_str, 'text');
-		svg_elm_prov_text.setAttributeNS(null,'id', 'lolipD');
-		svg_elm_prov_text.setAttributeNS(null,'x', rect_width - 11);
-		svg_elm_prov_text.setAttributeNS(null,'y', '12');
-		svg_elm_prov_text.setAttributeNS(null,'text-anchor', 'middle');
-		svg_elm_prov_text.setAttributeNS(null,'fill', 'black');
-		svg_elm_prov_text.setAttributeNS(null,'dominant-baseline', 'central');
-		svg_elm_prov_text.setAttributeNS(null,'font-size', '11');
-		
-		var svg_elm_prov_text_inner = document.createTextNode(group.providedPackage.size());
-		
-		svg_elm_prov_text.appendChild(svg_elm_prov_text_inner);
-		
-		svg_elm_prov.appendChild(svg_elm_prov_line);
-		svg_elm_prov.appendChild(svg_elm_prov_circle);
-		svg_elm_prov.appendChild(svg_elm_prov_text);
-		
-		// add both lollipops to group
-		svg_elm_g.appendChild(svg_elm_req);
-		svg_elm_g.appendChild(svg_elm_prov);
-
-
-		// decompose group into detached viewport link
-		var svg_elm_ab2 = document.createElementNS(this.ns_str, 'a');
-		svg_elm_ab2.setAttributeNS(this.ns_str,'xlink:href', '#');
-		svg_elm_ab2.setAttributeNS(null, 'onclick', 'OffScreenKiv.showGroupInViewport("' + group.idGroup + '"); return false;');
-		
-		var svg_elm_r_inner_a2 = document.createElementNS(this.ns_str, 'rect');
-		svg_elm_r_inner_a2.setAttributeNS(null,'rx', 4);
-		svg_elm_r_inner_a2.setAttributeNS(null,'ry', 4);
-		svg_elm_r_inner_a2.setAttributeNS(null,'x', rect_width - 86);
-		svg_elm_r_inner_a2.setAttributeNS(null,'y', 4);
-		svg_elm_r_inner_a2.setAttributeNS(null,'height', 14);
-		svg_elm_r_inner_a2.setAttributeNS(null,'width', 14);
-		svg_elm_r_inner_a2.setAttributeNS(null,'stroke','black');
-		svg_elm_r_inner_a2.setAttributeNS(null,'fill','#FFFFFF');
-		
-		//  čára v plus směr: -
-		var svg_elm_l1_inner_a2 = document.createElementNS(this.ns_str, 'line');
-		svg_elm_l1_inner_a2.setAttributeNS(null,'x1', rect_width - 86 + 2);
-		svg_elm_l1_inner_a2.setAttributeNS(null,'y1', 11);
-		svg_elm_l1_inner_a2.setAttributeNS(null,'x2', rect_width - 86 + 12);
-		svg_elm_l1_inner_a2.setAttributeNS(null,'y2', 11);
-		svg_elm_l1_inner_a2.setAttributeNS(null,'height', 14);
-		svg_elm_l1_inner_a2.setAttributeNS(null,'width', 14);
-		svg_elm_l1_inner_a2.setAttributeNS(null,'style','stroke:#000000;stroke-width:2;');
-		
-		// čára v plus směr: |
-		var svg_elm_l2_inner_a2 = document.createElementNS(this.ns_str, 'line');
-		svg_elm_l2_inner_a2.setAttributeNS(null,'x1', rect_width - 86 + 7);
-		svg_elm_l2_inner_a2.setAttributeNS(null,'y1', 6);
-		svg_elm_l2_inner_a2.setAttributeNS(null,'x2', rect_width - 86 + 7);
-		svg_elm_l2_inner_a2.setAttributeNS(null,'y2', 16);
-		svg_elm_l2_inner_a2.setAttributeNS(null,'height', 14);
-		svg_elm_l2_inner_a2.setAttributeNS(null,'width', 14);
-		svg_elm_l2_inner_a2.setAttributeNS(null,'style','stroke:#000000;stroke-width:2;');
-		
-		svg_elm_ab2.appendChild(svg_elm_r_inner_a2);
-		svg_elm_ab2.appendChild(svg_elm_l1_inner_a2);
-		svg_elm_ab2.appendChild(svg_elm_l2_inner_a2);
-		
-		svg_elm_g.appendChild(svg_elm_ab2);
-
-
-		// remove all components from group link
-		var svg_elm_ab = document.createElementNS(this.ns_str, 'a');
-		svg_elm_ab.setAttributeNS(this.ns_str,'xlink:href', '#');
-		svg_elm_ab.setAttributeNS(null, 'onclick', 'OffScreenKiv.removeAllComponentFromGroup("'+ group.idGroup +'"); return false;');
-		
-		var svg_elm_r_inner_a = document.createElementNS(this.ns_str, 'rect');
-		svg_elm_r_inner_a.setAttributeNS(null,'rx', 4);
-		svg_elm_r_inner_a.setAttributeNS(null,'ry', 4);
-		svg_elm_r_inner_a.setAttributeNS(null,'x', rect_width - 66);
-		svg_elm_r_inner_a.setAttributeNS(null,'y', 4);
-		svg_elm_r_inner_a.setAttributeNS(null,'height', 14);
-		svg_elm_r_inner_a.setAttributeNS(null,'width', 14);
-		svg_elm_r_inner_a.setAttributeNS(null,'stroke','black');
-		svg_elm_r_inner_a.setAttributeNS(null,'fill','#FFFFFF');
-		
-		var svg_elm_l1_inner_a = document.createElementNS(this.ns_str, 'line');
-		svg_elm_l1_inner_a.setAttributeNS(null,'x1', rect_width - 66 + 4);
-		svg_elm_l1_inner_a.setAttributeNS(null,'y1', 8);
-		svg_elm_l1_inner_a.setAttributeNS(null,'x2', rect_width - 66 + 11);
-		svg_elm_l1_inner_a.setAttributeNS(null,'y2', 15);
-		svg_elm_l1_inner_a.setAttributeNS(null,'height', 14);
-		svg_elm_l1_inner_a.setAttributeNS(null,'width', 14);
-		svg_elm_l1_inner_a.setAttributeNS(null,'style','stroke:#CA0000;stroke-width:2;');
-		
-		var svg_elm_l2_inner_a = document.createElementNS(this.ns_str, 'line');
-		svg_elm_l2_inner_a.setAttributeNS(null,'x1', rect_width - 66 + 11);
-		svg_elm_l2_inner_a.setAttributeNS(null,'y1', 8);
-		svg_elm_l2_inner_a.setAttributeNS(null,'x2', rect_width - 66 + 4);
-		svg_elm_l2_inner_a.setAttributeNS(null,'y2', 15);
-		svg_elm_l2_inner_a.setAttributeNS(null,'height', 14);
-		svg_elm_l2_inner_a.setAttributeNS(null,'width', 14);
-		svg_elm_l2_inner_a.setAttributeNS(null,'style','stroke:#CA0000;stroke-width:2;');
-		
-		svg_elm_ab.appendChild(svg_elm_r_inner_a);
-		svg_elm_ab.appendChild(svg_elm_l1_inner_a);
-		svg_elm_ab.appendChild(svg_elm_l2_inner_a);
-		
-		svg_elm_g.appendChild(svg_elm_ab);
-
-		return svg_elm_g;
-	},
-
-	/**
-	 * Creates element for group displayed in diagram area as detached viewport.
-	 */
-	createGroupViewport: function(group, coords, dependencies) {
-		var width = 600;
-		var height = 300;
-		var paddingHorizontal = 60;
-		var paddingVertical = 10;
-		var headerWidth = 200;
-		var groupFill = $('#rect' + group.idGroup).attr('fill');
-
-		// wrapper
-		var wrapper = createSvgElement('g', {
-			'class': 'node group_viewport',
-			'id': 'groupViewport_' + group.idGroup,
-			'data-groupId': group.idGroup,
-		});
-
-
-		var inner1 = createSvgElement('g', {
-			'transform': 'translate(' + coords.x + ',' + coords.y + ')',			
-		});
-
-		// inner silver rectangle
-		inner1.appendChild(createSvgElement('rect', {
-			'width': width,
-			'height': height,
-			'class': 'handle',
-			'fill': '#EEE',
-		}));
-
-		// inner viewport area
-		inner1.appendChild(createSvgElement('rect', {
-			'width': width - (2 * paddingHorizontal),
-			'height': height - (2 * paddingVertical),
-			'x': paddingHorizontal,
-			'y': paddingVertical,
-			'fill': '#FFF',
-		}));
-
-		// header
-		var size = getSizeOfRectangle(group.idGroup);
-
-		var header = createSvgElement('g', {
-			'class': 'handle',
-			'transform': 'translate(0, -5)',
-		});
-
-		header.appendChild(createSvgElement('rect', {
-			'height': 25,
-			'width': headerWidth,
-			'fill': groupFill,
-		}));
-
-		// group name
-		var label = createSvgElement('text', {
-			'x': 40,
-			'y': 11,
-			'class': 'group-label',
-			'id': 'labelTextElement' + group.idGroup,
-		});
-		label.appendChild(document.createTextNode(group.label));
-
-		header.appendChild(label);
-
-		// hide detached viewport link
-		var hideLink = document.createElementNS(this.ns_str, 'a');
-		hideLink.setAttributeNS(this.ns_str,'xlink:href', '#');
-		hideLink.setAttributeNS(null, 'onclick', 'OffScreenKiv.hideGroupViewport("' + group.idGroup + '"); return false;');
-
-		// icon
-		var hideLink_1 = document.createElementNS(this.ns_str, 'rect');
-		hideLink_1.setAttributeNS(null, 'rx', 4);
-		hideLink_1.setAttributeNS(null, 'ry', 4);
-		hideLink_1.setAttributeNS(null, 'x', size + 10);
-		hideLink_1.setAttributeNS(null, 'y', 5);
-		hideLink_1.setAttributeNS(null, 'height', 14);
-		hideLink_1.setAttributeNS(null, 'width', 14);
-		hideLink_1.setAttributeNS(null, 'stroke', 'black');
-		hideLink_1.setAttributeNS(null, 'fill', '#FFFFFF');
-
-		var hideLink_2 = document.createElementNS(this.ns_str, 'line');
-		hideLink_2.setAttributeNS(null, 'x1', size + 10 + 2);
-		hideLink_2.setAttributeNS(null, 'y1', 15);
-		hideLink_2.setAttributeNS(null, 'x2', size + 10 + 12);
-		hideLink_2.setAttributeNS(null, 'y2', 15);
-		hideLink_2.setAttributeNS(null, 'stroke', 'black');
-		hideLink_2.setAttributeNS(null, 'class', 'compose');
-		hideLink_2.setAttributeNS(null, 'style', 'stroke-width:2;');
-
-		hideLink.appendChild(hideLink_1);
-		hideLink.appendChild(hideLink_2);
-
-		header.appendChild(hideLink);
-
-
-		// remove all components from group link
-		var removeLink = document.createElementNS(this.ns_str, 'a');
-		removeLink.setAttributeNS(this.ns_str,'xlink:href', '#');
-		removeLink.setAttributeNS(null, 'onclick', 'OffScreenKiv.removeAllComponentFromGroup("' + group.idGroup + '"); return false;');
-
-		var removeLink_1 = document.createElementNS(this.ns_str, 'rect');
-		removeLink_1.setAttributeNS(null, 'rx', 4);
-		removeLink_1.setAttributeNS(null, 'ry', 4);
-		removeLink_1.setAttributeNS(null, 'x', size + 10 + 20);
-		removeLink_1.setAttributeNS(null, 'y', 5);
-		removeLink_1.setAttributeNS(null, 'height', 14);
-		removeLink_1.setAttributeNS(null, 'width', 14);
-		removeLink_1.setAttributeNS(null, 'stroke', 'black');
-		removeLink_1.setAttributeNS(null, 'fill', '#FFFFFF');
-
-		var removeLink_2 = document.createElementNS(this.ns_str, 'line');
-		removeLink_2.setAttributeNS(null, 'x1', size + 10 + 23);
-		removeLink_2.setAttributeNS(null, 'y1', 9);
-		removeLink_2.setAttributeNS(null, 'x2', size + 10 + 31);
-		removeLink_2.setAttributeNS(null, 'y2', 16);
-		removeLink_2.setAttributeNS(null, 'height', 14);
-		removeLink_2.setAttributeNS(null, 'width', 14);
-		removeLink_2.setAttributeNS(null, 'style', 'stroke:#CA0000;stroke-width:2;');
-
-		var removeLink_3 = document.createElementNS(this.ns_str, 'line');
-		removeLink_3.setAttributeNS(null, 'x1', size + 10 + 23);
-		removeLink_3.setAttributeNS(null, 'y1', 16);
-		removeLink_3.setAttributeNS(null, 'x2', size + 10 + 31);
-		removeLink_3.setAttributeNS(null, 'y2', 9);
-		removeLink_3.setAttributeNS(null, 'height', 14);
-		removeLink_3.setAttributeNS(null, 'width', 14);
-		removeLink_3.setAttributeNS(null, 'style', 'stroke:#CA0000;stroke-width:2;');
-
-		removeLink.appendChild(removeLink_1);
-		removeLink.appendChild(removeLink_2);
-		removeLink.appendChild(removeLink_3);
-
-		header.appendChild(removeLink);
-
-		inner1.appendChild(header);
-
-
-		var inner2 = createSvgElement('g', {
-			'class': 'viewportTransform',
-			'transform': 'translate(' + coords.x + ',' + coords.y + ')',			
-		});
-
-		// add components
-		var edgesIn = {};
-		var edgesOut = {};
-		var edgesOuter = {};
-
-		var edgesOutElements = [];
-
-		var vertexId;
-		var vertex;
-		var edgeId;
-		var edge;
-		var g;
-
-		for (vertexId in group.items.getAll()) {
-			vertex = group.items.get(vertexId);
-
-			vertex.x = paddingHorizontal + Math.random() * (width - (2 * paddingHorizontal) - vertex.size);
-			vertex.y = paddingVertical + Math.random() * (height - (2 * paddingVertical) - 20);
-
-			// handle edges
-			for (i = 0; i < vertex.edges.length; i++) {
-				edge = vertex.edges[i];
-
-				// edge between two nodes of the group
-				if ((edge.from.id != vertex.id && group.items.contains(edge.from.id)) ||
-					(edge.to.id != vertex.id && group.items.contains(edge.to.id))
-				) {
-					if (edgesIn.hasOwnProperty(edge.id)) continue;
-
-					edgesIn[edge.id] = edge;
-
-					// edge leads outside of the group
-				} else {
-					if (edgesOut.hasOwnProperty(edge.id)) continue;
-
-					edgesOut[edge.id] = edge;
-				}
-			}
-		}
-
-		for (edgeId in edgesOut) {
-			edge = edgesOut[edgeId];
-
-			var isRequired = group.items.contains(edge.from.id);
-
-			var vertexFrom,
-				vertexTo;
-
-			if (isRequired) {
-				vertexFrom = edge.from;
-				vertexTo = edge.to;
-			} else {
-				vertexFrom = edge.to;
-				vertexTo = edge.from;
-			}
-
-			var edgeOuter;
-			if (edgesOuter.hasOwnProperty(vertexFrom.id)) {
-				edgeOuter = edgesOuter[vertexFrom.id];
-			} else {
-				edgeOuter = {
-					from: vertexFrom,
-					dependencies: OffScreenKiv.countDependence(vertexFrom),
-					requiredComponents: [],
-					providedComponents: [],
-				};
-
-				edgesOuter[vertexFrom.id] = edgeOuter;
-			}
-
-			if (isRequired) {
-				edgeOuter.requiredComponents.push(edge.to);
-			} else {
-				edgeOuter.providedComponents.push(edge.from);
-			}
-		}
-
-		// draw edges
-		for (edgeId in edgesIn) {
-			edge = edgesIn[edgeId];
-
-			var sizeOfRectFrom = edge.from.size;
-			var sizeOfRectTo = edge.to.size;
-
-			g = createSvgElement('g', {
-				class: 'egde',
-				id: 'e' + edge.id,
-			});
-
-			g.appendChild(createSvgElement('line', {
-				x1: edge.from.x + sizeOfRectFrom/2,
-				y1: edge.from.y + 13,
-				x2: edge.to.x + sizeOfRectTo/2,
-				y2: edge.to.y + 13,
-				stroke: 'white',
-				'stroke-width': 5,
-			}));
-			g.appendChild(createSvgElement('line', {
-				x1: edge.from.x + sizeOfRectFrom/2,
-				y1: edge.from.y + 13,
-				x2: edge.to.x + sizeOfRectTo/2,
-				y2: edge.to.y + 13,
-				'stroke-width': 1,
-			}));
-
-			// lollipop
-			var lollipop = getLollipopPosition(edge.from.x + sizeOfRectFrom/2, edge.from.y + 13, edge.to.x + sizeOfRectTo/2, edge.to.y + 13);
-			var icon = createSvgElement('g', {
-				class: 'lollipop',
-				'data-edgeId': edge.id,
-				transform: 'translate(' + lollipop.x + ',' + lollipop.y + ') rotate(' + lollipop.angle  + ')',
-				fill: 'white',
-			});
-
-			icon.appendChild(createSvgElement('path', {
-				class: 'SamplePath',
-				d: 'M0,-12 C16,-12 16,12 0,12',
-			}));
-			icon.appendChild(createSvgElement('circle', {
-				cx: 0,
-				cy: 0,
-				r: 8,
-			}));
-			if (edge.isCompatible) {
-				icon.appendChild(createSvgElement('line', {
-					class: 'lollipop-tick',
-					id: 'lollipop-tick_a_' + edge.id,
-					x1: 6,
-					y1: -4,
-					x2: -4,
-					y2: 6,
-					transform: 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)',
-				}));
-				icon.appendChild(createSvgElement('line', {
-					class: 'lollipop-tick',
-					id: 'lollipop-tick_b_' + edge.id,
-					x1: -5,
-					y1: -3,
-					x2: -4,
-					y2: 5,
-					transform: 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)',
-				}));
-
-			} else {
-				icon.appendChild(createSvgElement('line', {
-					class: 'lollipop-cross',
-					x1: -5,
-					y1: -5,
-					x2: 5,
-					y2: 5,
-					transform: 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)',
-				}));
-				icon.appendChild(createSvgElement('line', {
-					class: 'lollipop-cross',
-					x1: -5,
-					y1: 5,
-					x2: 5,
-					y2: -5,
-					transform: 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)',
-				}));
-			}
-
-			g.appendChild(icon);
-
-			inner2.appendChild(g);
-		}
-
-		for (edgeId in edgesOuter) {
-			edge = edgesOuter[edgeId];
-
-			// get coordinates
-			var left = (edge.from.x + edge.from.size / 2) < (width / 2);
-			var x = edge.from.x + edge.from.size / 2;
-			var y = edge.from.y;
-			var x2 = left ? (paddingHorizontal / 2) : (width - (paddingHorizontal / 2));
-			var x2_1 = left ? x2 + 15 : x2 - 15;
-			var x2_2 = left ? x2 - 15 : x2 + 15;
-
-			// required
-			(function(edgeId){
-				var inEdge = createSvgElement('g', {
-					class: 'egde edge-viewport-in',
-				});
-
-				inEdge.appendChild(createSvgElement('line', {
-					x1: x,
-					y1: y + 5,
-					x2: x2_1,
-					y2: y - 5,
-					stroke: 'white',
-					'stroke-width': 5,
-				}));
-				inEdge.appendChild(createSvgElement('line', {
-					x1: x,
-					y1: y + 5,
-					x2: x2_1,
-					y2: y - 5,
-					'stroke-width': 1,
-				}));
-
-				// line connecting lollipop and proxy counter
-				inEdge.appendChild(createSvgElement('line', {
-					x1: x2_1,
-					y1: (y - 5),
-					x2: x2_2,
-					y2: (y - 5),
-					'stroke-width': 1,
-				}));
-
-				// lollipop
-				var lollipop = createSvgElement('g', {
-					class: 'lollipop whiteColor',
-					transform: 'translate(' + x2_1 + ',' + (y - 5)  + ')',
-				});
-
-				var path = left ? 'M0,-12 C-16,-12 -16,12 0,12' : 'M0,-12 C16,-12 16,12 0,12';
-				lollipop.appendChild(createSvgElement('path', {
-					d: path,
-				}));
-				lollipop.appendChild(createSvgElement('circle', {
-					cx: 0,
-					cy: 0,
-					r: 8,
-				}));
-
-				var providedText = createSvgElement('text', {
-					'class': 'lollipop-required',
-				});
-				providedText.appendChild(document.createTextNode(edge.dependencies.countFrom));
-
-				lollipop.appendChild(providedText);
-
-				inEdge.appendChild(lollipop);
-
-				// proxy counter
-				var proxyCounter = createSvgElement('g', {
-					class: 'proxy-counter whiteColor',
-					transform: 'translate('+ x2_2 +', '+ (y - 5) +')',
-				});
-
-				proxyCounter.appendChild(createSvgElement('rect', {
-					x: -10,
-					y: -10,
-					width: 20,
-					height: 20,
-					rx: 5,
-					ry: 5,
-				}));
-
-				var componentsCountText = createSvgElement('text', {
-					'class': 'counter-required',
-				});
-				componentsCountText.appendChild(document.createTextNode(edge.requiredComponents.length));
-				proxyCounter.appendChild(componentsCountText);
-
-				$(proxyCounter).click(function(e){
-					$('.edge-required-'+ edgeId).toggle();
-				});
-
-				inEdge.appendChild(proxyCounter);
-
-
-				inner2.appendChild(inEdge);
-
-
-				for (var i = 0; i < edge.requiredComponents.length; i++) {
-					var vertex = edge.requiredComponents[i];
-
-					var outEdge = createSvgElement('g', {
-						'class': 'egde edge-viewport-out edge-required-'+ edgeId,
-						'data-from-id': vertex.id,
-					});
-
-					outEdge.appendChild(createSvgElement('line', {
-						x1: coords.x + x2_2,
-						y1: coords.y + y - 5,
-						x2: vertex.x + (vertex.size / 2),
-						y2: vertex.y + 13,
-						stroke: 'white',
-						'stroke-width': 5,
-					}));
-					outEdge.appendChild(createSvgElement('line', {
-						x1: coords.x + x2_2,
-						y1: coords.y + y - 5,
-						x2: vertex.x + (vertex.size / 2),
-						y2: vertex.y + 13,
-						'stroke-width': 1,
-					}));
-
-					edgesOutElements.push(outEdge);
-				}
-			})(edgeId);
-
-			// provided
-			(function(edgeId){
-				var inEdge = createSvgElement('g', {
-					class: 'egde edge-viewport-in',
-				});
-
-				inEdge.appendChild(createSvgElement('line', {
-					x1: x,
-					y1: y + 15,
-					x2: x2_1,
-					y2: y + 25,
-					stroke: 'white',
-					'stroke-width': 5,
-				}));
-				inEdge.appendChild(createSvgElement('line', {
-					x1: x,
-					y1: y + 15,
-					x2: x2_1,
-					y2: y + 25,
-					'stroke-width': 1,
-				}));
-
-				// line connecting lollipop and proxy counter
-				inEdge.appendChild(createSvgElement('line', {
-					x1: x2_1,
-					y1: (y + 25),
-					x2: x2_2,
-					y2: (y + 25),
-					'stroke-width': 1,
-				}));
-
-				// lollipop
-				var lollipop = createSvgElement('g', {
-					class: 'lollipop whiteColor',
-					transform: 'translate(' + (left ? x2_1 - 3 : x2_1 + 3) + ',' + (y + 25)  + ')',
-				});
-
-				var path = left ? 'M0,-12 C16,-12 16,12 0,12' : 'M0,-12 C-16,-12 -16,12 0,12';
-				lollipop.appendChild(createSvgElement('path', {
-					d: path,
-				}));
-				lollipop.appendChild(createSvgElement('circle', {
-					cx: 0,
-					cy: 0,
-					r: 8,
-				}));
-
-				var requiredText = createSvgElement('text', {
-					'class': 'lollipop-provided',
-				});
-				requiredText.appendChild(document.createTextNode(edge.dependencies.countTo));
-				lollipop.appendChild(requiredText);
-
-				inEdge.appendChild(lollipop);
-
-				// proxy counter
-				var proxyCounter = createSvgElement('g', {
-					class: 'proxy-counter whiteColor',
-					transform: 'translate('+ x2_2 +', '+ (y + 25) +')',
-				});
-
-				proxyCounter.appendChild(createSvgElement('rect', {
-					x: -10,
-					y: -10,
-					width: 20,
-					height: 20,
-					rx: 5,
-					ry: 5,
-				}));
-
-				var componentsCountText = createSvgElement('text', {
-					'class': 'counter-provided',
-				});
-				componentsCountText.appendChild(document.createTextNode(edge.providedComponents.length));
-				proxyCounter.appendChild(componentsCountText);
-
-				$(proxyCounter).click(function(e){
-					$('.edge-provided-'+ edgeId).toggle();
-				});
-
-				inEdge.appendChild(proxyCounter);
-
-				inner2.appendChild(inEdge);
-
-
-				for (var i = 0; i < edge.providedComponents.length; i++) {
-					var vertex = edge.providedComponents[i];
-
-					var outEdge = createSvgElement('g', {
-						'class': 'egde edge-viewport-out edge-provided-'+ edgeId,
-						'data-from-id': vertex.id,
-					});
-
-					outEdge.appendChild(createSvgElement('line', {
-						x1: coords.x + x2_2,
-						y1: coords.y + y + 25,
-						x2: vertex.x + (vertex.size / 2),
-						y2: vertex.y + 13,
-						stroke: 'white',
-						'stroke-width': 5,
-					}));
-					outEdge.appendChild(createSvgElement('line', {
-						x1: coords.x + x2_2,
-						y1: coords.y + y + 25,
-						x2: vertex.x + (vertex.size / 2),
-						y2: vertex.y + 13,
-						'stroke-width': 1,
-					}));
-
-					edgesOutElements.push(outEdge);
-				}
-			})(edgeId);
-		}
-
-		// draw vertices
-		for (vertexId in group.items.getAll()) {
-			vertex = group.items.get(vertexId);
-
-			g = createSvgElement('g', {
-				class: 'node vertex colorNormal',
-				id : 'vertex'+ vertex.id,
-				transform: 'translate('+ vertex.x +','+ vertex.y +')',
-			});
-
-			g.appendChild(createSvgElement('rect', {
-				width: vertex.size + 20,
-				height: 26,
-			}));
-
-			var text = createSvgElement('text', {
-				x: vertex.size / 2,
-				y: 13,
-				'text-anchor': 'middle',
-				'dominant-baseline': 'baseline',
-			});
-			text.appendChild(document.createTextNode(vertex.name));
-			g.appendChild(text);
-
-			var interface = createSvgElement('g', {
-				'data-vertexId': vertex.id,
-				transform: 'translate(8,6)',
-			});
-			interface.appendChild(createSvgElement('rect', {
-				width: 10,
-				height: 15,
-				x: 0,
-				y: 0,
-			}));
-			interface.appendChild(createSvgElement('rect', {
-				width: 6,
-				height: 3,
-				x: -3,
-				y: 3,
-			}));
-			interface.appendChild(createSvgElement('rect', {
-				width: 6,
-				height: 3,
-				x: -3,
-				y: 9,
-			}));
-			g.appendChild(interface);
-
-			inner2.appendChild(g);
-		}
-
-		
-		// put it all together
-		wrapper.appendChild(inner1);
-
-		for (var i = 0; i < edgesOutElements.length; i++) {
-			wrapper.appendChild(edgesOutElements[i]);
-		}
-
-		wrapper.appendChild(inner2);
-
-		return wrapper;
-	},
-
-	/**
-	 * Creates SVG element for vertex displayed in SeCo.
-	 */
-	createVertexDetail: function(vertex) {
-		var name,
-			dependencies = OffScreenKiv.countDependence(vertex),
-			svg;
-
-		if (vertex.name.length > 30) {
-			name = vertex.name.substring(0, 27) + '...';
-		} else {
-			name = vertex.name;
-		}
-		
-		svg = '<svg id="d' + vertex.id + '" xmlns="http://www.w3.org/2000/svg" version="1.1" width="272" height="60">';
-		svg += '<g transform="translate(60,10)" class="colorNormal vertex" id="component' + vertex.id + '">\
-			<g class="detail colorNormal" id="detailVertex' + vertex.id + '" data-vertexId="' + vertex.id + '">\
-			<rect height="40" width="220" y="0" x="-10" />\
-			<text y="20" x="-5">' + name + '</text>\
-			</g>';
-		svg += '<g id="required' + vertex.id + '" class="whiteColor">\
-			<line x1="-10" y1="5" x2="-30" y2="5" stroke="black"/>\
-			<path class="SamplePath" d="M-42,-5 C-27,-5 -27,15 -42,15" stroke="black" />\
-			<text id="lolipA" x="-42" y="5">' + dependencies.countTo + '</text>\
-			</g>';
-		svg += '<g id="provided' + vertex.id + '" class="whiteColor">\
-			<line x1="-10" y1="35" x2="-30" y2="35" stroke="black"/>\
-			<circle cx="-42" cy="35" r="11" stroke="black" /> \
-			<text id="lolipB" x="-42" y="35">' + dependencies.countFrom + '</text>\
-			</g>';
-		svg += '</g>';
-		svg += '</svg>';
-		
-		return svg;        
-	},
-
-	createGroupDetail: function(group) {
-		var svg;
-
-		svg = '<svg id="svgGroup' + group.idGroup + '" xmlns="http://www.w3.org/2000/svg" version="1.1" width="73" height="57" xmlns:xlink="http://www.w3.org/1999/xlink">';
-		svg += '<g id="gr' + group.idGroup + '" class="vertex colorNormal" transform="translate(60,10)">\
-			<rect id="rect'+ group.idGroup +'" ry="4" rx="4" height="56" width="20" y="0" x="-10" fill="' + group.groupSymbol[1] + '" stroke="black"/>\
-			<text class="group-symbol" y="12" x="0" fill="black" stroke="none">' + group.groupSymbol[0] +'</text>';
-		svg += '<a xlink:href="#" onclick="OffScreenKiv.showGroupInGraph(\''+ group.idGroup +'\'); return false;">\
-			<rect y="21" x="-7" width="14" height="14" style="fill:rgb(255,255,255);stroke-width:1;stroke:rgb(0,0,0)"/>\
-			<line x1="-5" y1="28" x2="2" y2="24" style="stroke:rgb(33,33,33);stroke-width:2" />\
-			<line x1="-5" y1="28" x2="2" y2="32" style="stroke:rgb(33,33,33);stroke-width:2" />\
-			<line x1="-5" y1="28" x2="5" y2="28" style="stroke:rgb(33,33,3);stroke-width:2" />\
-			</a>';
-		svg += '<a xlink:href="#" onclick="OffScreenKiv.removeAllComponentFromGroup(\''+ group.idGroup +'\'); return false;">\
-			<rect y="38" x="-7" width="14" height="14" style="fill:rgb(255,255,255);stroke-width:1;stroke:rgb(0,0,0)"/>\
-			<line x1="-4" y1="41" x2="4" y2="49" style="stroke:rgb(202,0,0);stroke-width:2" />\
-			<line x1="-4" y1="49" x2="4" y2="41" style="stroke:rgb(202,0,0);stroke-width:2" />\
-			</a>';
-		svg += '<g id="required' + group.idGroup + '" class="whiteColor">\
-			<line x1="-10" y1="5" x2="-30" y2="5" stroke="black"/>\
-			<path class="SamplePath" d="M-42,-5 C-27,-5 -27,15 -42,15" stroke="black" />\
-			<text id="lolipC" x="-42" y="5" fill="black">' + group.requiredPackage.size() + '</text>\
-			</g>';
-		svg += '<g id="provided' + group.idGroup + '" class="whiteColor">\
-			<line x1="-10" y1="31" x2="-30" y2="31" stroke="black"/>\
-			<circle cx="-42" cy="31" r="11" stroke="black" /> \
-			<text id="lolipD" x="-42" y="31" fill="black">' + group.providedPackage.size() + '</text>\
-			</g>';
-		svg += '</g>';
-
-		return svg;
-	}
-
-};
\ No newline at end of file
diff --git a/sources/WebContent/old/js/tooltips.js b/sources/WebContent/old/js/tooltips.js
deleted file mode 100644
index 750bdf2..0000000
--- a/sources/WebContent/old/js/tooltips.js
+++ /dev/null
@@ -1,459 +0,0 @@
-var compatibilityTooltip = "";
-
-/**
- * Configuration of detail vertex tooltip (setting style).
- *
- * @param selectorString selector as string
- */
-function configurationVertexDetailTooltip(selectorString) {
-	$(selectorString).each(function() {
-		$(this).qtip({
-			show : {
-				solo : true,
-				delay : 1000 // display after a 1sec hover
-			},
-			hide : {
-				event : 'click'
-			},
-			content : {
-				text : getTooltipVertex(stringToInt($(this).attr("data-vertexId"))),
-				title : {
-					text : getSymbolicName(stringToInt($(this).attr("data-vertexId"))),
-					button : 'Close'
-				}
-			},
-			position : {
-				my : "top right",
-				at : "bottom right",
-				adjust : {
-					y : 2
-				}
-				// ,viewport: $("#viewport")
-			},
-			style : {
-				tip : {
-					corner : 'top right'
-				},
-				classes : "qtip-green qtip-rounded qtip-shadow"
-			}
-		});
-	});
-}
-
-/**
- * Configuration of vertex tooltip (setting style).
- *
- * @param selectorString selector as String
- */
-function configurationVertexTooltip(selectorString) {
-	$(selectorString).each(function() {
-		$(this).qtip({
-			show: {
-				solo : true,
-				delay : 0,
-				event : 'click'
-			},
-			hide: {
-				when: 'mouseout',
-				fixed: true
-			},
-			content: {
-				text : getTooltipVertex(stringToInt($(this).attr("data-vertexId"))),
-				title : {
-					text : getSymbolicName(stringToInt($(this).attr("data-vertexId"))),
-					button : 'Close'
-				}
-			},
-			position : {
-				my : "top center",
-				at : "bottom center",
-				adjust : {
-					x : 2
-				}
-			},
-			style : {
-				tip : {
-					corner : 'top center'
-				},
-				classes : "qtip-green qtip-rounded qtip-shadow"
-			}
-		});
-	});
-}
-
-/**
- * Configuration of edge tooltip (setting style).
- *
- * @param selectorString selector as String
- */
-function configurationEdgeTooltip(selectorString) {
-	$(selectorString).each(function() {
-		$(this).qtip({
-			show: {
-				solo: true,
-				delay: 0,
-				event: 'click'
-			},
-			hide: {
-				when: 'mouseout',
-				fixed: true
-			},
-			content: {
-				text: getTooltipEdge(stringToInt($(this).attr("data-edgeId"))),
-				title: {
-					text: getEdgeTipTitle(),
-					button: 'Close',
-				}
-			},
-			position: {
-				//target: 'mouse',//[$(selectorString).offset().left, $(selectorString).offset().top],
-				my: 'top left', // forces clicked thing to top left relatively to the top left corner of the tip-box
-				at: 'top left',
-				container: $("#content"),
-				adjust: {
-					x: 15,
-					y: 140,
-					mouse: false
-				}
-				//,viewport : $("#viewport") // source of a horrible BUGFEST... - loudilj
-			},
-			style: {
-				classes: getTooltipEdgeClasses()
-			},
-			events: {
-				visible: function (event, api) {
-					if (GraphManager.isEfpGraph || GraphManager.isCompatibilityGraph) {
-						// set up the jsTree instead of plain list for EFP graphs
-						setUpTooltipList($(this).find('ul').parent());
-					}
-				}
-			}
-		});
-	});
-}
-
-/**
- * Return tooltip fo vertex wiht given id.
- *
- * @param id id of vertex
- * @returns {string} tooltip text
- */
-function getTooltipVertex(id) {
-	var tooltip = "<div><ul class='tooltip_vertex_left'>",
-		exportedPackages = getExportedPackages(id),
-		importedPackages = getImportedPackages(id);
-	
-	if (!GraphManager.isEfpGraph) {
-		tooltip += "<li class='tooltip_import_package'>" + "Import packages:" + "</li>";
-	} else {
-		tooltip += "<li class='tooltip_import_package'>" + "Import features:" + "</li>";
-	}
-
-	for (var i = 0; i < importedPackages.length; i++) {
-		tooltip += "<li>" + importedPackages[i] + "</li>";
-	}
-	
-	tooltip += "</ul><ul class='tooltip_vertex_right'>";
-	
-	if (!GraphManager.isEfpGraph) {
-		tooltip += "<li class='tooltip_export_package'>" + "Export packages:" + "</li>";
-	} else {
-		tooltip += "<li class='tooltip_export_package'>" + "Export features:" + "</li>";
-	}
-	
-	for (var j = 0; j < exportedPackages.length; j++) {
-		tooltip += "<li>" + exportedPackages[j] + "</li>";
-	}
-	tooltip += "</ul><br class='clean'/></div>";
-	
-	return tooltip;
-}
-
-/**
- * Set tooltip to edge.
- *
- * @param id id of edge
- * @returns {string} tooltip of edge with given id.
- */
-function getTooltipEdge(id) {
-	var tooltip = "<div id='edgeTooltipListDiv" + (id - 1) + "'><ul id='edgeTooltipList" + (id - 1) + "'>",
-		i;
-	
-	if (GraphManager.isCompatibilityGraph) {
-		var edge = GraphManager.graph.edges[(id - 1)];
-		if (edge.hasOwnProperty('compInfoJSON')) {
-			tooltip += getCompatibilityInfo(JSON.parse(edge.compInfoJSON));
-		}
-	} else if (!GraphManager.isEfpGraph) { // EFP graph or not
-		var connectionList = getConnections(id);
-		
-		if (connectionList.length === 0) {
-			tooltip += "<li>No packages</li>";
-		}
-		for (i = 0; i < connectionList.length; i++) {
-			tooltip += "<li>" + connectionList[i] + "</li>";
-		}
-	} else {
-		var features = GraphManager.graph.edges[(id - 1)].features;
-		
-		// sort features by name
-		features.sort(function (a, b) {
-			var nameA = a.name.toLowerCase(), nameB = b.name.toLowerCase();
-			
-			if (nameA < nameB) { //sort string ascending
-				return -1;
-			}
-			
-			if (nameA > nameB) {
-				return 1;
-			}
-			
-			//default return value (no sorting)
-			return 0;
-		});
-		
-		for (i = 0; i < features.length; i++) {
-			var featureIcon, efpIcon;
-			
-			if (features[i].featureStatus == "OK") {
-				featureIcon = "OK.png";
-			} else {
-				featureIcon = "ERROR.png";
-			}
-			
-			tooltip += "<li><a href='#' class='featureListItem'>";
-			
-			// add icon if there are any EFPs
-			if (features[i].efps.length !== 0) {
-				tooltip += "</img src='images/efp_qtip/" + featureIcon + "' alt='" + features[i].featureStatus + "'>";
-			}
-			
-			tooltip += features[i].name + "</a>";
-			
-			// no EFPs on this feature
-			if (features[i].efps.length === 0) {
-				tooltip += "</li>";
-				continue;
-			}
-			
-			tooltip += "<ul>";
-			
-			// sort efps by name
-			features[i].efps.sort(function(a, b) {
-				var nameA = a.efpName.toLowerCase(),
-					nameB = b.efpName.toLowerCase();
-				
-				if (nameA < nameB) { //sort string ascending
-					return -1;
-				}
-				
-				if (nameA > nameB) {
-					return 1;
-				}
-				
-				//default return value (no sorting)
-				return 0;
-			});
-			
-			// all efps
-			for (var j = 0; j < features[i].efps.length; j++) {
-				if (features[i].efps[j].comparisonStatus == "OK") {
-					efpIcon = "OK.png";
-				} else {
-					efpIcon = "ERROR.png";
-				}
-				
-				tooltip += "<li><a href='#'></img src='images/efp_qtip/" + efpIcon + "' alt='" + features[i].efps[j].comparisonStatus + "'>" + features[i].efps[j].efpName + "</a>";
-				
-				var leftEfpValue = features[i].efps[j].leftEfpValue;
-				if (!leftEfpValue) {
-					leftEfpValue = 'No value';
-				}
-				
-				var rightEfpValue = features[i].efps[j].rightEfpValue;
-				if (!rightEfpValue) {
-					rightEfpValue = 'No value';
-				}
-				
-				tooltip += "<ul><li><a href='#'><span class='efpListLabel'></span> " + getTypeClassName(features[i].efps[j].typeName) + ", <span class='efpListLabel'></span> </img src='images/efp_qtip/required.png' alt='required'>" + leftEfpValue + ", </img src='images/efp_qtip/provided.png' alt='provided'>" + rightEfpValue + "</a></li></ul></li>";
-			}
-			tooltip += "</ul></li>";
-		}
-	}
-	tooltip += "</ul></div>";
-	
-	return tooltip;
-}
-
-/**
- * Return the class name from full type name - cut the pkg path out.
- *
- * @param typeFullName full type name
- * @returns {string} type name without .pkg
- */
-function getTypeClassName(typeFullName) {
-	return typeFullName.substring(typeFullName.lastIndexOf(".") + 1);
-}
-
-/**
- * Return symbolic name of vertex with given id.
- *
- * @param idVertex id of vertex
- * @returns {*}  symbolic name of vertex
- */
-function getSymbolicName(idVertex) {
-	return GraphManager.graph.vertices[idVertex - 1].symbolicName;
-}
-
-/**
- * Get title for edge tooltip
- *
- * @returns {*} title for edge tooltip.
- */
-function getEdgeTipTitle() {
-	var title = 'Involved ';
-	
-	if (!GraphManager.isEfpGraph) {
-		title += 'packages';
-	} else {
-		title += 'features';
-	}
-	
-	if (GraphManager.isCompatibilityGraph) {
-		return 'Incompatibility Details';
-	}
-
-	return title;
-}
-
-/**
- * Adds special class for EFP graphs in order to display lists properly.
- *
- * @returns {string} edge tooltip classes
- */
-function getTooltipEdgeClasses() {
-	var classes = "qtip-green qtip-rounded qtip-shadow";
-	
-	if (GraphManager.isEfpGraph) {
-		classes += " ui-tooltip-with-efp";
-	}
-	
-	if (GraphManager.isCompatibilityGraph) {
-		classes += " qtip_width_setting";
-	}
-	
-	return classes;
-}
-
-/**
-*
-* Sets jsTree to tooltip's content.
-*
-* @param list list of the desired qtip.
-*/
-function setUpTooltipList(list) {
-	list.jstree({
-		core : {
-			"animation" : 25
-		},
-		themes : {
-			"theme" : "classic",
-			"dots" : true,
-			"icons" : false
-		},
-		plugins : [ "themes", "html_data" ]
-	});
-}
-
-/**
- * Return exported packages one vertex.
- *
- * @param idVertex id of vertex for which wil be returned exported packages
- * @returns {*}exported package
- */
-function getExportedPackages(idVertex) {
-	return GraphManager.graph.vertices[(idVertex - 1)].exportedPackages;
-}
-
-/**
- * Return imported packages one vertex.
- *
- * @param idVertex id of vertex for which wil be return imported packages
- * @returns {*}imported packages
- */
-function getImportedPackages(idVertex) {
-	return GraphManager.graph.vertices[(idVertex - 1)].importedPackages;
-}
-
-/**
- * Return package that are connected two vertices.
- * 
- * @param idEdge edge ID
- * @returns {*} package connecting two vertices
- */
-function getConnections(idEdge) {
-	return GraphManager.graph.edges[(idEdge - 1)].packageConnections;
-}
-
-/**
- * Return HTML for incompatibility tooltip
- * 
- * @param compatibilityInfo tooltip data
- * @returns {string} HTML with incompability tooltip
- */
-function getCompatibilityInfo(compatibilityInfo) {
-	compatibilityTooltip = "";
-	for (var i = 0; i < compatibilityInfo.length; i++) {
-		var cause = compatibilityInfo[i];
-
-		compatibilityTooltip += "<li><strong>" + cause.causedBy + "</strong><ul>";
-		for (var j = 0; j < cause.incomps.length; j++) {
-			if (cause.incomps[j] &&  cause.incomps[j].subtree.length) {
-				parseCompatibilityInfo(cause.incomps[j]);
-			}
-		}
-		compatibilityTooltip += "</ul></li>";
-	}
-	compatibilityTooltip += "";
-
-	return compatibilityTooltip;
-}
-
-/**
- * Traverses incompatibility JSON object and creates HTML nested list
- * 
- * @param data data to be parsed
- */
-function parseCompatibilityInfo(data) {
-	if (data.desc.isIncompCause) {
-		compatibilityTooltip += "<li><strong class=\"incomp\">" + data.desc.incompName + "</strong>";
-		compatibilityTooltip += "<ul class=\"compatibility-list\">";
-		
-		if (data.desc.difference != "DEL") {
-			compatibilityTooltip += "<li><span><img src=\"images/efp_qtip/provided.png\"> <span class=\"second\">" + data.desc.objectNameSecond + "</span></span></li>";
-			compatibilityTooltip += "<li><span><img src=\"images/efp_qtip/required.png\"> <span class=\"first\">" + data.desc.objectNameFirst + "</span></span></li>";
-		}
-		compatibilityTooltip += "</ul>";
-	} else {
-		if (data.desc.level > 0) {
-			compatibilityTooltip += "<li><strong>" + data.desc.name + "</strong>";
-		}
-	}
-	
-	if (data.subtree.length) {
-		if (data.desc.level > 0) {
-			compatibilityTooltip += "<ul class=\"compatibility-list\">";
-		}
-		for (var i = 0; i < data.subtree.length; i++) {
-			if (data.subtree[i].subtree.length || data.subtree[i].desc.isIncompCause) {
-				parseCompatibilityInfo(data.subtree[i]);
-			}
-		}
-		if (data.desc.level > 0) {
-			compatibilityTooltip += "</ul>";
-		}
-	}
-	if (data.desc.level > 0) {
-		compatibilityTooltip += "</li>";
-	}
-}
\ No newline at end of file
diff --git a/sources/WebContent/old/js/user.js b/sources/WebContent/old/js/user.js
deleted file mode 100644
index b59fb6a..0000000
--- a/sources/WebContent/old/js/user.js
+++ /dev/null
@@ -1,42 +0,0 @@
-
-/**
-* Funkce odesle registracni formular
-*/
-function send_register() {
-
-	// var viewport_html = $('#viewport').html();
-	// var rightpanel_html = $('#rightPanel').html();
-	
-	$.post('api/register', { user_name:  $('#user_name').val(),
-		user_email: $('#user_email').val(),
-		user_nick: $('#user_nick').val(),
-		user_password: $('#user_password').val(),
-		user_password_2: $('#user_password_2').val()},
-	function(data){
-		if (data.ok != null && data.ok == "ok"){
-			$('.register_popup .err_msg').html("");
-			$('.register_popup .err_msg').hide();
-			
-			$('.register_popup').hide();
-			$('.login_popup').show();
-			var user_login_name = $('#user_nick').val();
-			clear_register_form();
-			$('.login_popup .not_msg').html("User registered.<br />Please login.");
-			$('#login_name').val(user_login_name);
-			
-			}else if (data.err != null){
-			$('.register_popup .err_msg').html(data.err.replace(/\./g,".<br />"));
-		}
-	});
-}
-
-/**
- * Vycisti registracni formular
- */
-function clear_register_form(){
-	$('#user_name').val('');
-	$('#user_email').val('');
-	$('#user_nick').val('');
-	$('#user_password').val('');
-	$('#user_password_2').val('');
-}
\ No newline at end of file
diff --git a/sources/WebContent/old/js/util.js b/sources/WebContent/old/js/util.js
deleted file mode 100644
index 70a9660..0000000
--- a/sources/WebContent/old/js/util.js
+++ /dev/null
@@ -1,230 +0,0 @@
-/**
-* Function set height of elements #content,#proposal,#rightPanel
-*/
-function setHeight() {
-	var headerHeight = $('#header').height() + $('#navigation').height() + 5;	/* magic 5, dunno where it comes from */
-	var contentHeight = $(window).height() - headerHeight;
-	
-	$('#viewport').height(contentHeight);
-	$('#rightPanel').height(contentHeight - 40); /* 40px is the sidebar-navbar */
-}
-
-/**
-* Convert radian to degrees.
-*
-* @param radian - radian which will be converted
-*/
-function radianToDegrees(radian){
-	return radian*(180.0/Math.PI);
-}
-
-/**
-* Return position and direction of lollipop.
-*
-* @param x1 - x coordinate of the first point
-* @param y1 - y coordinate of the first point
-* @param x2 - x coordinate of the second point
-* @param y2 - y coordinate of the second point
-*/
-function getLollipopPosition(x1, y1, x2, y2){
-	var lollipop = {},
-		vector1 = {};
-
-	vector1.x = x2 - x1;
-	vector1.y = y2 - y1;
-	
-	var lengthX = vector1.x*0.25,
-		lengthY = vector1.y*0.25;
-
-	lollipop.x = (x1 + lengthX);
-	lollipop.y = (y1 + lengthY);
-	//    lollipop.x = (x1 + x2)/2;
-	//    lollipop.y = (y1 + y2)/2;
-	
-	lollipop.angle = -radianToDegrees(Math.atan2(vector1.x, vector1.y))+90;
-
-	return lollipop;
-}
-
-/**
-* Return id, which is parsed from string.
-*
-* @param idStr string which will be parsed
-* @param indexFrom index
-* @returns {Number} ID in int form
-*/
-function getIndexFromId(idStr, indexFrom){
-	return parseInt(idStr.substr(indexFrom));
-}
-
-/**
- * Remove item from array
- *
- * @param array array from which will be removed
- * @param myKey item which will be removed
- * @returns {ArrayBuffer|Array.<T>|*|string|Blob} Array without removed item
- */
-function removeItem(array,myKey) {
-	var i = 0;
-
-	for (var key in array){
-		if (array.hasOwnProperty(key)) {
-			if (key == myKey) {
-				var del = array.slice(i, 1);
-				return del;
-			}
-		}
-		i++;
-	}
-}
-
-/**
-* Create svg element.
- *
-* @param tag type of element (circle, rect, ...)
-* @param attrs attributes of element
-* @returns {Element} svg element.
-*/
-function createSvgElement(tag, attrs) {
-	var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
-	for (var k in attrs) {
-		el.setAttribute(k, attrs[k]);
-	}
-	return el;
-}
-
-/**
-* Compute size of rectangle on the basic count of chars.7
- *
-* @param name name
-* @returns {number} size of rectangle
-*/
-function getSizeOfRectangle(name){
-	return name.length * 8 + 35;
-}
-
-/**
- * Cut two last character from string.
- *
- * @param string string which will be cutted.
- * @returns {*} cutted string.
- */
-function cutTwoLastCharacters(string){
-	return string.substring(0,string.length-2);
-}
-
-/**
- * Parse string to int.
- *
- * @param string string which will be converted to int
- * @returns {Number} int
- */
-function stringToInt(string){
-	return parseInt(string);
-}
-
-/**
- * Parse string to float.
- *
- * @param string string which will be converted to float
- * @returns {Number} float
- */
-function stringToFloat(string){
-	return parseFloat(string);
-}
-
-/**
- * Set size of svg element.
- *
- * @param bbox bounding box of svg element
- */
-function setSizeSvg(bbox){
-	$("#svg1").css('width', bbox.width);
-	$("#svg1").css('height', bbox.height);
-}
-
-/**
- * Set position of svg element with id #graph.
- *
- * @param x x axe position
- * @param y y axe position
- */
-function setPositionSvg(x, y){
-	$("#graph").attr('transform', 'translate('+ (-x) + ", " + (-y) + ')');
-}
-
-/** 
- * Extract coordinates from string stored in transform attribute.
- *
- * @param  transform	string contained in the attribute
- * @return object with x and y coordinates
- */
-function getCoordinates(transform) {
-	var parts  = /translate\(\s*([^\s,)]+)[ ,]([^\s,)]+)/.exec(transform);
-
-	return {
-		x: stringToFloat(parts[1]),
-		y: stringToFloat(parts[2]),
-	};
-}
-
-/**
- * Finds identifier of the component.
- * 
- * @param {any} element
- * @returns
- */
-function findId(element) {
-	while (element.getAttribute('data-id') === null) {
-		element = element.parentElement;
-	}
-
-	return element.getAttribute('data-id');
-}
-
-/**
- * Move element to SVG
- *
- * @param id_parent_element parent element
- * @param id_element_to_move where to move element
- */
-function moveElementTopSVG(id_parent_element, id_element_to_move){
-	var graph_elmnt = document.getElementById(id_parent_element),
-		item = document.getElementById(id_element_to_move);
-
-	graph_elmnt.removeChild(item);
-	graph_elmnt.appendChild(item);
-}
-
-var TimeBarrier = {
-	lastTime: 0,
-	CONST_WAITING_TIME: 50,
-	
-	wait: function(){
-		var currentTime = new Date().getTime();
-		
-		if ((currentTime - this.lastTime) > this.CONST_WAITING_TIME){
-			this.lastTime = new Date().getTime();
-			return false;
-		}
-		return true;
-	}
-};
-
-/**
- * Usage:
- * - for plain JS DOM element:		element.isVisible()
- * - for jQuery-wrapped element:	element[0].isVisible()
- * 
- * @returns true if SVG element is visible, otherwise false
- */
-SVGElement.prototype.isVisible = function() {
-	return $(this).css('display') !== 'none';
-};
-
-/**
- * @returns true if SVG element is not visible, otherwise false
- */
-SVGElement.prototype.isHidden = function() {
-	return $(this).css('display') === 'none';
-};
diff --git a/sources/WebContent/old/js/viewportManager.js b/sources/WebContent/old/js/viewportManager.js
deleted file mode 100644
index ff94721..0000000
--- a/sources/WebContent/old/js/viewportManager.js
+++ /dev/null
@@ -1,1463 +0,0 @@
-/**
-* Ensures drag and drop of elements in graph.
-*/
-var ViewportManager = {
-	CONST_EXPAND_ZONE_SIZE : 20,
-	leftMouseButtonDown : false,
-	$currentTarget : null,
-	current : null,
-	$svg : null,
-	offsetX : 0,
-	offsetY : 0,
-	vertices : null,
-	highlightEdge : null,
-	highlightVertex : null,
-	highlightVertexProv: null,
-	highlightVertexReq: null,
-	highlightGroup : null,
-	zoom : new Zoom(),
-	clickedPosX : 0,
-	clickedPosY : 0,
-	oscarMike : false,		// differs between mouseMove and plain mouseDown to control node highlighting
-	lastColor : null,
-	
-	/**
-	 * Initialization
-	 */
-	init: function() {
-		this.highlightReqGraph = this.highlightReqGraph.bind(this);
-		this.highlightProvGraph = this.highlightProvGraph.bind(this);
-		this.highlightClckdVertexSeCo = this.highlightClckdVertexSeCo.bind(this);
-		this.highlightReqGraphSeCo = this.highlightReqGraphSeCo.bind(this);
-		this.highlightProvGraphSeCo = this.highlightProvGraphSeCo.bind(this);
-
-		this.vertexMousedownHandler = this.vertexMousedownHandler.bind(this);
-		this.groupVertexMousedownHandler = this.groupVertexMousedownHandler.bind(this);
-		this.viewportMousedownHandler = this.viewportMousedownHandler.bind(this);
-		this.viewportMousemoveHandler = this.viewportMousemoveHandler.bind(this);
-		this.viewportEndDraggingHandler = this.viewportEndDraggingHandler.bind(this);
-		this.edgeMousedownHandler = this.edgeMousedownHandler.bind(this);
-
-		this.revive = this.revive.bind(this);
-		this.addContextMenu = this.addContextMenu.bind(this);
-
-		Dialog.setDialog();
-	},
-	
-	/**
-	* Initial registration events on elements of graph.
-	*/
-	revive: function() {
-		this.$svg = $('#svg1');
-		
-		// nastavovani clicku
-		$('#showUnconnected').click(OffScreenKiv.includeUncon);
-		$('#hideUnconnected').click(OffScreenKiv.deleteUncon);
-
-		$('#postponed').click(function(e){
-			$('#postponedComps').toggle();
-		});
-		$('#toChange').click(function(e){
-			$('#toChangeComps').toggle();
-		});
-		$('#unconnected').click(function(e){
-			$('#unconComps').toggle();
-		});
-		$('#incompatible').click(function(e){
-			$('#allIncomps').toggle();
-		});
-
-		$('#proposeChanges').click(OffScreenKiv.proposeChanges);
-		
-		var i;
-		for (i = 0; i < GraphManager.unconList.length; i++) {
-			$('#liuc_del_'+GraphManager.unconList[i]).click(OffScreenKiv.includeUnconItem);
-		}
-		
-		for (i = 0; i < GraphManager.graph.vertices.length; i++) {
-			var vertex = GraphManager.graph.vertices[i];
-			vertex.$selector = $('#vertex' + vertex.id);
-
-			vertex.$selector.mousedown(vertex, this.vertexMousedownHandler);
-			vertex.$selector.mouseup(this.viewportEndDraggingHandler);
-			
-			$('#rectTop'+vertex.id).click(ViewportManager.highlightReqGraph);
-			$('#rectBot'+vertex.id).click(ViewportManager.highlightProvGraph);
-		}
-		
-		for (var j = 0; j < GraphManager.graph.edges.length; j++) {
-			var edge = GraphManager.graph.edges[j];
-			var idEdge = '#e' + edge.id;
-			edge.$selector = $(idEdge);
-			edge.$selector.click(this.edgeMousedownHandler);
-		}
-		
-		this.$svg.mousemove(this.viewportMousemoveHandler);
-		this.$svg.bind('dragstart', function(event) {
-			event.preventDefault();
-		});
-		
-		/**
-		* EFP diagram only.
-		*/
-		if (GraphManager.isEfpGraph) {
-			// init EFP selecting mechanics
-			EFPs.init(GraphManager.graph);
-			
-			// set listener onChange of the slector
-			$('#EFPselector').change(function(){
-				EFPs.recalculate(this);
-			});
-		}
-
-		// hack na vystredeni grafu
-		ViewportManager.zoom.zoomOut();
-	},
-
-
-	/**
-	 * Handles mousedown event on vertex displayed in graph.
-	 * @param  e 	event descriptor, contains vertex object in e.data property
-	 */
-	vertexMousedownHandler: function(e) {
-		var action = $("input[name='actionMove']:checked").val();
-		var vertex = e.data;
-
-		if (action == 'move'){
-			this.highlightVertexHandler(e);
-		} else if (action == 'exclude') {
-			OffScreenKiv.showVertexInRightPanel(e);
-		}
-	},
-
-	/**
-	 * Handles mousedown event on group of vertices displayed in graph.
-	 * @param  e 	event descriptor, contains group ID in e.data property
-	 */
-	groupVertexMousedownHandler: function(e) {
-		var action = $("input[name='actionMove']:checked").val();
-		var idGroup = e.data;
-
-		if (action == 'move'){
-			this.highlightGroupVerticesHandler(e);
-		} else if (action == 'exclude') {
-			OffScreenKiv.showGroupInRightPanel(idGroup);
-		}
-	},
-
-	/**
-	 * Handles mousedown event on a detached viewport of a group displayed in graph.
-	 * @param  e 	event descriptor, contains group ID in e.data property
-	 */
-	viewportMousedownHandler: function(e) {
-		this.highlightViewportHandler(e);
-	},
-
-
-	outOffSeCoReqEdge: function (secoVertex){
-		var graph = $('#svg1 #graph')[0];
-		var panel = $('#rightPanel')[0];
-		var viewport = $("#viewport");
-		var required = $('#required' + secoVertex.id);
-
-		var inEdge = createSvgElement('g', {
-			class: 'egde edge-to-seco',
-			style: 'inline',
-			id: 'secoEdge' + secoVertex.id,
-		});
-
-		for (var i=0;i<secoVertex.edges.length;i++) {
-			if (secoVertex.edges[i].from !== secoVertex) {
-				inEdge.appendChild(createSvgElement('line', {
-					x1: viewport[0].clientWidth,
-					y1: panel.lastElementChild.offsetTop,
-					x2: secoVertex.edges[i].from.x,
-					y2: secoVertex.edges[i].from.y,
-					'stroke-width': 1,
-					stroke: 'red'
-				}));
-			}
-		}
-		graph.appendChild(inEdge);
-	},
-
-	outOffSeCoProvEdge: function (secoVertex){
-		var graph = $('#svg1 #graph')[0];
-		var panel = $('#rightPanel')[0];
-		var viewport = $("#viewport");
-
-		var inEdge = createSvgElement('g', {
-			class: 'egde edge-to-seco',
-			style: 'inline',
-			id: 'secoEdge' + secoVertex.id,
-		});
-
-		for (var i=0;i<secoVertex.edges.length;i++) {
-			if(secoVertex.edges[i].to !== secoVertex){
-				inEdge.appendChild(createSvgElement('line', {
-					x1: viewport[0].clientWidth,
-					y1: panel.lastElementChild.offsetTop + panel.clientHeight,
-					x2: secoVertex.edges[i].to.x,
-					y2: secoVertex.edges[i].to.y,
-					'stroke-width': 1,
-					stroke: 'blue'
-				}));
-			}
-		}
-		graph.appendChild(inEdge);
-	},
-
-	clearOutOfSecoEdges: function (secoVertex) {
-		$('#secoEdge' + secoVertex.id).remove();
-	},
-	
-	/**
-	*  Highlight required (clicked in graph)
-	*/
-	highlightReqGraph: function(e) {
-		var id = findId(e.target);
-		var vertex = GraphManager.graph.vertices[id - 1];
-		
-		// Dishighlights one edge
-		this.deleteBorder();
-		this.highlightEdge = null;
-		
-		this.disableHighlightEdges();
-		
-		if (vertex != this.highlightVertexReq) {
-			this.dimAll();
-			
-			this.highlightVertexReq = vertex;
-			this.highlightVertex = vertex;
-			
-			$('#rectTop'+vertex.id).css('stroke','red');
-			$('#lolGL'+vertex.id).attr('class', 'detail colorHighReqR');
-			
-			vertex.$selector.attr('class', 'node vertex colorNormal');
-			vertex.$selector.css('stroke-width', '3');
-			vertex.$selector.css('stroke','red');
-			
-			if (!vertex.leftAlone) {
-				vertex.$selector[0].classList.remove('vertex--dimmed');
-			}
-			
-			vertex.dimmed = false;
-			
-			// highlight required
-			for (var i = 0; i < vertex.edges.length; i++) {
-				var cedge = vertex.edges[i];
-				
-				if (cedge.to == vertex) {
-					cedge.from.$selector.attr('class', 'node vertex colorHighReqR');
-					
-					if (!cedge.from.leftAlone) {
-						cedge.from.$selector[0].classList.remove('vertex--dimmed');
-					}
-					
-					vertex.dimmed = false;
-					
-					cedge.$selector.css('stroke', 'red');
-					cedge.$selector[0].classList.remove('edge--dimmed');
-				}
-			}
-			
-			// Highlights connected vertices in the SeCo panel
-			for ( var i = 0; i < vertex.edges.length; i++) {
-				var edgeIdFrom = vertex.edges[i].from.id;
-				
-				$('#detailVertex' + (edgeIdFrom)).attr('class', 'detail colorHighReqR');
-				$('#li'+edgeIdFrom).attr('style', 'background-color: red');
-			}
-		} else {
-			this.highlightVertexReq = null;
-			this.highlightVertex = null;
-		}
-		
-		this.highlightVertexProv = null;
-	},
-
-	/**
-	*  Highlight required (clicked in SeCo)
-	*/
-	highlightReqGraphSeCo: function(e) {
-		var id = findId(e.target);
-		var vertex = GraphManager.graph.vertices[id - 1];
-		
-		// Dishighlights one edge
-		this.deleteBorder();
-		this.highlightEdge = null;
-		
-		this.disableHighlightEdges();
-		
-		if (vertex != this.highlightVertexReq) {
-			//this.outOffSeCoReqEdge(vertex);
-			this.dimAll();
-			
-			this.highlightVertexReq = vertex;
-			this.highlightVertex = vertex;
-			
-			$('#rectTop'+vertex.id).css('stroke','red');
-			$('#lolGL'+vertex.id).attr('class', 'detail colorHighReqR');
-			$('#required'+vertex.id).attr('class', 'colorHighReqR');
-			
-			vertex.$selector.attr('class', 'node vertex colorNormal');
-			vertex.$selector.css('stroke-width', '3');
-			vertex.$selector.css('stroke','red');
-			
-			if (!vertex.leftAlone) {
-				vertex.$selector[0].classList.remove('vertex--dimmed');
-			}
-			
-			vertex.dimmed = false;
-			
-			// highlight required
-			for (var i = 0; i < vertex.edges.length; i++) {
-				var cedge = vertex.edges[i];
-				
-				if (cedge.to == vertex) {
-					cedge.from.$selector.attr('class', 'node vertex colorHighReqR');
-					
-					if(!cedge.from.leftAlone) {
-						cedge.from.$selector[0].classList.remove('vertex--dimmed');
-					}
-					
-					vertex.dimmed = false;
-					
-					cedge.$selector.css('stroke', 'red');
-					cedge.$selector[0].classList.remove('edge--dimmed');
-				}
-			}
-			
-			// Highlights connected vertices in the SeCo panel
-			for (var i = 0; i < vertex.edges.length; i++) {
-				var edgeIdFrom = vertex.edges[i].from.id;
-				
-				$('#detailVertex' + (edgeIdFrom)).attr('class', 'detail colorHighReqR');
-				$('#li'+edgeIdFrom).attr('style', 'background-color: red');
-			}
-			$('#detailVertex'+id).attr('class', 'detail colorNormal');
-
-		} else {
-			this.clearOutOfSecoEdges(vertex);
-			this.highlightVertexReq = null;
-			this.highlightVertex = null;
-		}
-		
-		this.highlightVertexProv = null;
-	},
-	
-	/**
-	*  Highlight provided (clicked in graph)
-	*/
-	highlightProvGraph: function(e) {
-		var id = findId(e.target);
-		var vertex = GraphManager.graph.vertices[id - 1];
-		
-		// Dishighlights one edge
-		this.deleteBorder();
-		this.highlightEdge = null;
-		
-		this.disableHighlightEdges();
-		
-		if (vertex != this.highlightVertexProv){
-			this.dimAll();
-			this.highlightVertexProv = vertex;
-			this.highlightVertex = vertex;
-			
-			$('#rectBot'+vertex.id).css('stroke','red');
-			$('#lolGP'+vertex.id).attr('class', 'detail colorHighProvB');
-			
-			vertex.$selector.attr('class', 'node vertex colorNormal');
-			vertex.$selector.css('stroke-width', '3');
-			vertex.$selector.css('stroke','red');
-			
-			if (!vertex.leftAlone) {
-				vertex.$selector[0].classList.remove('vertex--dimmed');
-			}
-			
-			vertex.dimmed = false;
-			
-			// highlight provided
-			for ( var i = 0; i < vertex.edges.length; i++) {
-				var cedge = vertex.edges[i];
-				
-				if (cedge.from == vertex) {
-					cedge.to.$selector.attr('class', 'node vertex colorHighProvB');
-					
-					if (!cedge.to.leftAlone) {
-						cedge.to.$selector[0].classList.remove('vertex--dimmed');
-					}
-					
-					vertex.dimmed = false;
-					
-					cedge.$selector.css('stroke', 'blue');
-					cedge.$selector[0].classList.remove('edge--dimmed');
-				}
-			}
-			
-			// Highlights connected vertices (provided) in the SeCo panel
-			for ( var i = 0; i < vertex.edges.length; i++) {
-				var edgeIdTo = vertex.edges[i].to.id;
-				
-				$('#detailVertex' + (edgeIdTo)).attr('class', 'detail colorHighProvB');
-				$('#li'+edgeIdTo).attr('style', 'background-color: #5896ff');
-			}
-		}
-		else{
-			this.highlightVertexProv = null;
-			this.highlightVertex = null;
-		}
-		
-		this.highlightVertexReq = null;
-		
-	},
-	
-	/**
-	* Highlight provided (clicked in SeCo)
-	*/
-	highlightProvGraphSeCo: function(e) {
-		var id = findId(e.target);
-		var vertex = GraphManager.graph.vertices[id - 1];
-
-		// Dishighlights one edge
-		this.deleteBorder();
-		this.highlightEdge = null;
-		
-		this.disableHighlightEdges();		
-
-		if (vertex != this.highlightVertexProv){
-			//this.outOffSeCoProvEdge(vertex);
-			this.dimAll();
-			this.highlightVertexProv = vertex;
-			this.highlightVertex = vertex;
-			
-			$('#rectBot'+vertex.id).css('stroke','red');
-			$('#lolGP'+vertex.id).attr('class', 'detail colorHighProvB');
-			$('#provided'+vertex.id).attr('class', 'colorHighProvB');
-			
-			vertex.$selector.attr('class', 'node vertex colorNormal');
-			vertex.$selector.css('stroke-width', '3');
-			vertex.$selector.css('stroke','red');
-			
-			if (!vertex.leftAlone) {
-				vertex.$selector[0].classList.remove('vertex--dimmed');
-			}
-			
-			vertex.dimmed = false;
-			
-			// highlight provided
-			for (var i = 0; i < vertex.edges.length; i++) {
-				var cedge = vertex.edges[i];
-				
-				if (cedge.from == vertex) {
-					cedge.to.$selector.attr('class', 'node vertex colorHighProvB');
-					
-					if (!cedge.to.leftAlone) {
-						cedge.to.$selector[0].classList.remove('vertex--dimmed');
-					}
-					
-					vertex.dimmed = false;
-					
-					cedge.$selector.css('stroke', 'blue');
-					cedge.$selector[0].classList.remove('edge--dimmed');
-				}
-			}
-			
-			// Highlights connected vertices (provided) in the SeCo panel
-			for (var i = 0; i < vertex.edges.length; i++) {
-				var edgeIdTo = vertex.edges[i].to.id;
-				
-				$('#detailVertex' + (edgeIdTo)).attr('class', 'detail colorHighProvB');
-				$('#li'+edgeIdTo).attr('style', 'background-color: #5896ff');
-				
-				
-			}
-			$('#detailVertex'+id).attr('class', 'detail colorNormal');
-
-		} else {
-			this.clearOutOfSecoEdges(vertex);
-			this.highlightVertexProv = null;
-			this.highlightVertex = null;
-		}
-		
-		this.highlightVertexReq = null;
-		
-	},
-	
-	/**
-	* Highlights vertices and edges connected to selected vertex
-	*/
-	highlightClckdVertex : function(vertex) {
-		// Dishighlights one edge
-		this.deleteBorder();
-		this.highlightEdge = null;
-
-		this.disableHighlightEdges();
-		OffScreenKiv.groupDisHighlightAllLollipops();
-		
-		// Highlights the selected vertex and edges connected to it
-		if (this.highlightVertex != vertex || vertex == this.highlightVertexProv || vertex == this.highlightVertexReq) {
-			this.highlightVertex = vertex;
-			this.highlightVertexProv = null;
-			this.highlightVertexReq = null;
-			
-			this.dimAll();
-			vertex.dimmed = false;
-			
-			if (!vertex.leftAlone) {
-				vertex.$selector[0].classList.remove('vertex--dimmed');
-			}
-
-			vertex.$selector.css('stroke', 'red');
-			vertex.$selector.css('stroke-width', '3');
-			
-			$('#lolGL'+vertex.id).attr('class', 'detail colorHighReqR');
-			$('#lolGP'+vertex.id).attr('class', 'detail colorHighProvB');
-			
-			// Highlights connected vertices and edges
-			for (var i = 0; i < vertex.edges.length; i++) {
-				var cedge = vertex.edges[i];
-				var idTo = cedge.to.id;
-				var idFrom = cedge.from.id;
-				
-				var groupList = OffScreenKiv.groupManager.getAll();
-				for (var key in groupList) {
-					var group = groupList[key];
-					var verList = group.items.getAll();
-
-					for (var ver in verList) {
-						var groupElement = $('#gv_'+ group.idGroup);
-						if (groupElement.length > 0) {
-							groupElement[0].classList.remove('group_vertices--dimmed');
-						}
-
-						if (ver == idTo) {
-							$('#li'+ ver).attr('style', 'background-color: #5896ff');
-						} else if (ver == idFrom) {
-							$('#li'+ ver).attr('style', 'background-color: red');
-						}
-					}
-				}
-				
-				if (cedge.to == vertex) {
-					cedge.$selector.css('stroke', 'red');
-					cedge.$selector[0].classList.remove('edge--dimmed');
-					
-					if (!cedge.from.leftAlone) {
-						cedge.from.$selector[0].classList.remove('vertex--dimmed');
-					}
-					
-					cedge.from.dimmed = false;
-					cedge.from.$selector.attr('class', 'node vertex colorHighReqR');
-					
-				} else {
-					cedge.$selector.css('stroke', 'blue');
-					cedge.$selector[0].classList.remove('edge--dimmed');
-					
-					if (!cedge.to.leftAlone) {
-						cedge.to.$selector[0].classList.remove('vertex--dimmed');
-					}
-					
-					cedge.to.dimmed = false;
-					cedge.to.$selector.attr('class', 'node vertex colorHighProvB');
-				}
-			}
-			
-			// Highlights connected vertices in the SeCo panel
-			for ( var i = 0; i < vertex.edges.length; i++) {
-				var edgeIdFrom = vertex.edges[i].from.id;
-				var edgeIdTo = vertex.edges[i].to.id;
-
-				$('#detailVertex' + (edgeIdFrom)).attr('class', 'detail colorHighReqR');
-				$('#detailVertex' + (edgeIdTo)).attr('class', 'detail colorHighProvB');
-			}
-
-		} else {
-			this.highlightVertex = null;
-		}
-	},
-	
-	/**
-	* Highlights vertices and edges connected to vertex selected in SeCo panel
-	*/
-	highlightClckdVertexSeCo : function(e) {
-		// Dishighlights one edge
-		this.deleteBorder();
-		this.highlightEdge = null;
-		
-		this.disableHighlightEdges();
-		
-		var id = findId(e.target);
-		var vertex = GraphManager.graph.vertices[id - 1];
-
-		//this.outOffSeCoReqEdge(vertex);
-		//this.outOffSeCoProvEdge(vertex);
-		
-		this.highlightClckdVertexProceed(vertex, null);
-	},
-
-	/**
-	 * Highlights vertices connected to grouped vertex
-	 * 
-	 * @param  group 	group object in graph
-	 */
-	highlightClckdVertexGroup : function(group) {
-		// Dishighlights one edge
-		this.deleteBorder();
-		this.highlightEdge = null;
-
-		this.disableHighlightEdges();
-
-		// Highlights the selected group and vertices connected to it
-		if (this.highlightGroup === null || this.highlightGroup.id != group.id) {
-			this.highlightGroup = group;
-
-			this.dimAll();
-			group.dimmed = false;
-
-			group.$selector[0].classList.remove('group_vertices--dimmed');
-			
-			group.$selector.children('rect').css('stroke', 'red');
-			group.$selector.children('rect').css('stroke-width', '3');
-
-			OffScreenKiv.groupHighlight(group.id);
-
-			// highlights connected edges
-			var group2 = OffScreenKiv.groupManager.getGroup(group.id);
-
-			var i;
-
-			for (i in group2.items.getAll()) {
-				if (group2.items.contains(i) === false) continue;
-
-				var vertex = group2.items.get(i);
-
-				for (i = 0; i < vertex.edges.length; i++) {
-					var edge = vertex.edges[i];
-
-					$('#vertex'+ edge.from.id)[0].classList.remove('vertex--dimmed');
-					$('#vertex'+ edge.to.id)[0].classList.remove('vertex--dimmed');
-				}
-			}
-
-		} else {
-			OffScreenKiv.groupDisHighlight(group.id);
-
-			this.highlightGroup = null;
-		}
-	},
-	
-	/**
-	* Triggers highlighting of vertices and edges connected to grouped vertex selected in SeCo panel
-	*
-	* @param e
-	*/
-	highlightClckdVertexGroupSeCo : function(e) {
-		// Dishighlights one edge
-		ViewportManager.deleteBorder();
-		ViewportManager.highlightEdge = null;
-		
-		ViewportManager.disableHighlightEdges();
-
-		var vertexName = e.target.parentElement.id;
-		var vertexId = parseInt(vertexName.substr(2));
-		
-		var vertex = GraphManager.graph.vertices[vertexId-1];
-		
-		var groupName = e.target.parentElement.parentElement.id;
-		var groupId = groupName.substr(2);
-		
-		ViewportManager.highlightClckdVertexProceed(vertex, groupId);
-	},
-	
-	/**
-	* Performs the highlighting actions themselves.
-	*
-	* @param vertex
-	* @param inGroup
-	*/
-	highlightClckdVertexProceed : function(vertex, inGroup) {
-		// Highlights the selected vertex and edges connected to it
-		if (this.highlightVertex != vertex || vertex == this.highlightVertexProv || vertex == this.highlightVertexReq) {
-			this.dimAll();
-			
-			this.highlightVertex = vertex;
-			this.highlightVertexProv = null;
-			this.highlightVertexReq = null;
-			
-			vertex.$selector.css('stroke', 'red');
-			vertex.$selector.css('stroke-width', '3');
-			
-			if (!vertex.leftAlone) {
-				vertex.$selector[0].classList.remove('vertex--dimmed');
-			}
-			
-			vertex.dimmed = false;
-			
-			$('#lolGL'+vertex.id).attr('class', 'detail colorHighReqR');
-			$('#lolGP'+vertex.id).attr('class', 'detail colorHighProvB');
-			$('#required'+vertex.id).attr('class', 'colorHighReqR');
-			$('#provided'+vertex.id).attr('class', 'colorHighProvB');
-			
-			// Highlights connected vertices and edges
-			for ( var i = 0; i < vertex.edges.length; i++) {
-				var cedge = vertex.edges[i];
-				var idTo = cedge.to.id;
-				var idFrom = cedge.from.id;
-				
-				var groupList = OffScreenKiv.groupManager.getAll();
-				for (var key in groupList) {
-					var currGroup = OffScreenKiv.groupManager.getGroup(key);
-					var verList = currGroup.items.getAll();
-					
-					for (var ver in verList) {
-						// dont highlight itself in group
-						if (ver == vertex.id && inGroup !== null) continue;
-						
-						if (ver == idTo) {
-							$('#li'+ ver).attr('style', 'background-color: #5896FF');
-						} else if (ver == idFrom) {
-							$('#li'+ ver).attr('style', 'background-color: red');
-						}
-					}
-				}
-				
-				// highligh border for itself
-				if (inGroup !== null) {
-					$('#li' + vertex.id).css('border', '2px solid red');
-					$('#required' + inGroup).attr('class', 'colorHighReqR');
-					$('#provided' + inGroup).attr('class', 'colorHighProvB');
-				}
-				
-				if (cedge.to == vertex) {
-					cedge.from.$selector.attr('class', 'node vertex colorHighReqR');
-					
-					if (!cedge.from.leftAlone) {
-						cedge.from.$selector[0].classList.remove('vertex--dimmed');
-					}
-					
-					cedge.from.dimmed = false;
-					
-					cedge.$selector.css('stroke', 'red');
-					cedge.$selector[0].classList.remove('edge--dimmed');
-
-				} else {
-					cedge.$selector.css('stroke', 'blue');
-					cedge.$selector[0].classList.remove('edge--dimmed');
-					
-					if (!cedge.to.leftAlone) {
-						cedge.to.$selector[0].classList.remove('vertex--dimmed');
-					}
-					
-					cedge.to.dimmed = false;
-					
-					cedge.to.$selector.attr('class', 'node vertex colorHighProvB');
-				}
-			}
-			
-			// Highlights connected vertices in the SeCo panel
-			for (var i = 0; i < vertex.edges.length; i++) {
-				var edgeIdFrom = vertex.edges[i].from.id;
-				var edgeIdTo = vertex.edges[i].to.id;
-
-				$('#detailVertex' + (edgeIdFrom)).attr('class', 'detail colorHighReqR');
-				$('#detailVertex' + (edgeIdTo)).attr('class', 'detail colorHighProvB');
-			}
-			$('#detailVertex'+ vertex.id).attr('class', 'detail colorNormal');
-
-		} else {
-			this.clearOutOfSecoEdges(vertex);
-			this.highlightVertex = null;
-		}
-	},
-	
-	/**
-	 * Dims the vertices
-	 */
-	dimAll: function(){
-		var i;
-
-		// dim vertices
-		for (i = 0; i < GraphManager.graph.vertices.length; i++) {
-			var vertex = GraphManager.graph.vertices[i];
-			
-			if (!vertex.leftAlone) {
-				$('#vertex'+vertex.id)[0].classList.add('vertex--dimmed');
-			}
-			
-			vertex.dimmed = true;
-		}
-		
-		// dim edges
-		for (i = 0; i < GraphManager.graph.edges.length; i++) {
-			var edge = GraphManager.graph.edges[i];
-			
-			edge.$selector[0].classList.add('edge--dimmed');
-		}
-
-		// dim groups
-		var groupList = OffScreenKiv.groupManager.getAll();
-		for (var groupId in groupList) {
-			var group = $('#gv_'+ groupId);
-
-			if (group.length > 0) {
-				group[0].classList.add('group_vertices--dimmed');
-			}
-		}
-	},
-
-	/**
-	* Disables highlighting of edges and vertices connected to the last selected node
-	*/
-	disableHighlightEdges : function() {
-		var node;
-
-		if (this.highlightVertex !== null) {
-			node = this.highlightVertex;
-		} else if (this.highlightGroup !== null) {
-			node = this.highlightGroup;
-		} else {
-			return;
-		}
-
-		if (node.$selector === undefined) return;
-
-		var classes = node.$selector[0].classList;
-
-		if (classes.contains('vertex')) {
-			this.disHighlightVertex(this.highlightVertex);
-
-		} else if (classes.contains('group_vertices')) {
-			this.disHighlightGroup(this.highlightGroup);
-		}
-
-
-		for (var i = 0; i < GraphManager.graph.vertices.length; i++){
-			var vertex = GraphManager.graph.vertices[i];
-			
-			$('#vertex'+vertex.id).attr('class', 'node vertex colorNormal');
-			
-			if (!vertex.leftAlone) {
-				$('#vertex'+vertex.id)[0].classList.remove('vertex--dimmed');
-				
-				vertex.dimmed = false;
-			}
-		}
-		
-		for (var i = 0; i < GraphManager.graph.edges.length; i++){
-			var edge = GraphManager.graph.edges[i];
-			
-			edge.$selector[0].classList.remove('edge--dimmed');
-		}
-	},
-
-	disHighlightVertex : function(vertex) {
-		vertex.$selector.css('stroke', '');
-		vertex.$selector.css('stroke-width', 1);
-
-		var idSelected = vertex.id;
-		
-		if (this.highlightVertex.leftAlone) {
-			this.highlightVertex.$selector[0].classList.add('vertex--unconnected');
-		}
-		
-		$('#rectTop'+idSelected).css('stroke', '');
-		$('#rectBot'+idSelected).css('stroke', '');
-		
-		$('#lolGL'+idSelected).attr('class', 'whiteColor');
-		$('#lolGP'+idSelected).attr('class', 'whiteColor');
-		
-		$('#provided'+idSelected).attr('class', 'whiteColor');
-		$('#required'+idSelected).attr('class', 'whiteColor');
-		
-		for (var i = 0; i < this.highlightVertex.edges.length; i++) {
-			var cedge = this.highlightVertex.edges[i];
-			
-			cedge.to.$selector.attr('class', 'node vertex colorNormal');
-			cedge.from.$selector.attr('class', 'node vertex colorNormal');
-			cedge.$selector.css('stroke', '');
-		}
-		
-		// Disables highlight in seco
-		for (var i = 0; i < this.highlightVertex.edges.length; i++) {
-			var edgeIdFrom = this.highlightVertex.edges[i].from.id;
-			var edgeIdTo = this.highlightVertex.edges[i].to.id;
-
-			$('#detailVertex' + (edgeIdFrom)).attr('class', 'detail colorNormal');
-			$('#detailVertex' + (edgeIdTo)).attr('class', 'detail colorNormal');
-			// $('#detailVertex' + (idd+1)).attr('class', 'detail colorNormal');
-		}
-		
-		var groupList = OffScreenKiv.groupManager.getAll();
-		for (var key in groupList) {
-			var currGroup = OffScreenKiv.groupManager.getGroup(key);
-			var verList = currGroup.items.getAll();
-			
-			// Disables highlight of groups in SeCo
-			for (var ver in verList) {
-				$('#li'+ver).attr('style', 'background-color: white');
-				$('#li'+ver).attr('style', 'background-color: white');
-			}
-			
-			$('#required' + currGroup.idGroup).attr('class', 'whiteColor');
-			$('#provided' + currGroup.idGroup).attr('class', 'whiteColor');
-
-			// disable highlight of groups in graph area
-			var groupNode = $('#gv_' + currGroup.idGroup);
-			if (groupNode.length > 0) {
-				groupNode[0].classList.remove('group_vertices--dimmed');
-			}
-		}
-	},
-
-	disHighlightGroup : function(group) {
-		group.$selector.children('rect').css('stroke', '');
-		group.$selector.children('rect').css('stroke-width', 1);
-	},
-	
-	/**
-	* Highlights node from graph, which is chosen.
-	*/
-	highlight : function(node) {
-		if (node.$selector === undefined) return;
-
-		this.oscarMike = false;
-		this.lastColor = node.$selector.attr('class');
-
-		node.dimmed = false;
-		node.$selector[0].classList.add('colorHighlight');
-	},
-	
-	/**
-	* Cancels highlighting of node after finish move.
-	*/
-	disableHighlight : function(node) {
-		if (node.$selector === undefined) return;
-
-		node.$selector.attr('class', this.lastColor);
-	},
-
-	/**
-	* Registretes event after mouseUp and mouseLeave, set current position of
-	* mouse cursor after click to mouse button.
-	*/
-	highlightVertexHandler: function(e) {
-		e.stopPropagation();
-		
-		var node = e.target.parentElement;
-		
-		if (node.classList.contains('vertex')) {
-			var id = $(node).data('id');
-
-			this.current = GraphManager.graph.vertices[id - 1];
-			this.$currentTarget = this.current.$selector;
-
-		} else {
-			return;
-		}
-
-		this.offsetX = e.pageX;
-		this.offsetY = e.pageY;
-		
-		if (e.which == 1) {
-			this.clickedPosX = e.pageX;
-			this.clickedPosY = e.pageY;
-			this.leftMouseButtonDown = true;
-
-			this.current.$selector.mouseup(this.viewportEndDraggingHandler);
-			this.$svg.mouseleave(this.viewportEndDraggingHandler);
-			this.$svg.mouseup(this.viewportEndDraggingHandler);
-
-			this.highlight(this.current);
-		}
-	},
-
-	/**
-	* Registrates event after mouseUp and mouseLeave, set current position of
-	* mouse cursor after click to mouse button.
-	*/
-	highlightGroupVerticesHandler: function(e) {
-		e.stopPropagation();
-		
-		var node = e.target.parentElement;
-		var idGroup = e.data;
-
-		if (node.classList.contains('group_vertices')) {
-			var coords  = getCoordinates(node.getAttribute('transform'));
-
-			this.current = {
-				$selector: $('#gv_'+ idGroup),
-				dimmed: false,
-				edges: [],
-				id: idGroup,
-				x: coords.x,
-				y: coords.y,
-			};
-			this.$currentTarget = this.current.$selector;
-
-		} else {
-			if (node.id === '') {
-				node = node.parentElement;
-			}
-
-			this.$currentTarget = this.current.$selector;
-		}
-		
-		this.offsetX = e.pageX;
-		this.offsetY = e.pageY;
-		
-		if (e.which == 1) {
-			this.clickedPosX = e.pageX;
-			this.clickedPosY = e.pageY;
-			this.leftMouseButtonDown = true;
-
-			this.current.$selector.mouseup(this.viewportEndDraggingHandler);
-			this.$svg.mouseleave(this.viewportEndDraggingHandler);
-			this.$svg.mouseup(this.viewportEndDraggingHandler);
-
-			this.highlight(this.current);
-		}
-	},
-
-	/**
-	 * Registrates event after mouseUp and mouseLeave, set current position of
-	 * mouse cursor after click to mouse button.
-	 */
-	highlightViewportHandler: function(e) {
-		e.stopPropagation();
-		
-		var idGroup = e.data;		
-
-		var viewportTransform = $('#groupViewport_' + idGroup + ' > .viewportTransform');
-
-		var coords  = getCoordinates(viewportTransform[0].getAttribute('transform'));
-
-		this.current = {
-			$selector: viewportTransform,
-			edges: [],
-			id: idGroup,
-			x: coords.x,
-			y: coords.y,
-		};
-		this.$currentTarget = this.current.$selector;
-
-		this.offsetX = e.pageX;
-		this.offsetY = e.pageY;
-		
-		if (e.which == 1) {
-			this.clickedPosX = e.pageX;
-			this.clickedPosY = e.pageY;
-			this.leftMouseButtonDown = true;
-
-			this.$svg.mouseleave(this.viewportEndDraggingHandler);
-			this.$svg.mouseup(this.viewportEndDraggingHandler);
-
-			this.highlight(this.current);
-		}
-	},
-	
-	/**
-	* Ensures move of elements in graph.
-	*/
-	viewportMousemoveHandler: function (e) {
-		if (this.leftMouseButtonDown === false) return;
-
-		if (TimeBarrier.wait()) return;
-
-		var diffX = this.offsetX - e.pageX;
-		var diffY = this.offsetY - e.pageY;
-			
-		if (diffX === 0 && diffY === 0) return;
-
-		this.current.x = this.current.x - diffX / this.zoom.currentZoom;
-		this.current.y = this.current.y - diffY / this.zoom.currentZoom;
-		this.moveNode(diffX, diffY);
-
-		this.offsetX = e.pageX;
-		this.offsetY = e.pageY;
-	},
-
-	/**
-	 * Moves node that is currently stored in this.current (respectively this.$currentTarget) including its edges.
-	 */
-	moveNode: function(diffX, diffY) {
-
-		this.$currentTarget.attr('transform', 'translate('+ this.current.x +','+ this.current.y +')');
-
-		var classes = this.$currentTarget[0].classList;
-
-		if (classes.contains('vertex')) {
-			this.oscarMike = true;
-
-			var newX;
-			var newY;
-			var lollipop;
-
-			// posouvani a rotace car
-			if (this.current.edges !== null) {
-				for (var i = 0; i< this.current.edges.length; i++) {
-					var edge = this.current.edges[i];
-					var sizeOfRectFrom = getSizeOfRectangle(edge.from.name);
-					var sizeOfRectTo = getSizeOfRectangle(edge.to.name);
-
-					if (edge.from.id == this.current.id) {
-						newX = this.current.edges[i].to.x + sizeOfRectTo/2;
-						newY = this.current.edges[i].to.y + 13;
-						lollipop = getLollipopPosition(this.current.x + sizeOfRectFrom/2, this.current.y +13 , newX, newY);
-						
-						edge.$selector.children("line").attr('x1', this.current.x + sizeOfRectFrom/2);
-						edge.$selector.children("line").attr('y1', this.current.y + 13);
-						edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-						
-						this.preventTickRotation(edge, lollipop);
-						this.preventCrossRotation(edge, lollipop);
-					} else {
-						newX = this.current.edges[i].from.x + sizeOfRectFrom/2;
-						newY = this.current.edges[i].from.y + 13;
-						lollipop = getLollipopPosition(newX, newY, this.current.x + sizeOfRectTo/2, this.current.y + 13);
-						
-						edge.$selector.children("line").attr('x2', this.current.x + sizeOfRectTo/2);
-						edge.$selector.children("line").attr('y2', this.current.y + 13);
-						edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-						
-						this.preventTickRotation(edge, lollipop);
-						this.preventCrossRotation(edge, lollipop);
-					}
-				}
-			}
-
-			var vertex = this.current;
-			$('[data-from-id='+ this.current.id +']').each(function(){
-				var sizeOfRectFrom = getSizeOfRectangle(vertex.name);
-
-				$(this).children('line').attr('x2', vertex.x + sizeOfRectFrom/2);
-				$(this).children('line').attr('y2', vertex.y + 13);
-			});
-
-		} else if (classes.contains('group_vertices')) {
-			this.oscarMike = true;
-
-			posX = this.current.x;
-			posY = this.current.y;
-			
-			var group2 = OffScreenKiv.groupManager.getGroup(this.current.id);
-
-			group2.x = posX;
-			group2.y = posY;
-			
-			// nastavení pozice prvků
-			id_vert = 0;
-			
-			posX_reset = posX;
-			
-			$.each(group.items.getAll(), function(index, value) {
-				id_vert = index;
-				//get current vertex
-				
-				var newX;
-				var newY;
-				
-				var lollipop;
-				posX = posX_reset;
-				//  posX = posX_reset;
-				//  posX = parseFloat(posX);
-				//  posY = parseFloat(posY);
-				
-				//posun pozice, aby byla komponenta vycentrovana
-				hidden_component_width = $('g#vertex' + id_vert + ' rect').attr('width');
-
-				//vystredeni na stred
-				posX = posX  - (hidden_component_width/2) + 40;
-				
-				group2.items.get(id_vert).x = posX;
-				group2.items.get(id_vert).y = posY;
-				
-				$currentTarget = $('g#vertex' + id_vert);
-				
-				$currentTarget.attr('transform', 'translate('+posX+','+posY+')');
-
-				$currentTarget.trigger('click',{move_edges:true});
-
-				for (var i = 0; i< group2.items.get(id_vert).edges.length; i++){
-					var edge = group2.items.get(id_vert).edges[i];
-					var sizeOfRectFrom = getSizeOfRectangle(edge.from.name);
-					var sizeOfRectTo = getSizeOfRectangle(edge.to.name);
-
-					if (edge.from.id == id_vert){
-						newX = group2.items.get(id_vert).edges[i].to.x + sizeOfRectTo/2;
-						newY = group2.items.get(id_vert).edges[i].to.y + 13;
-						lollipop = getLollipopPosition(posX + sizeOfRectFrom/2, posY +13 , newX, newY);
-						
-						edge.$selector.children("line").attr('x1', posX + sizeOfRectFrom/2);
-						edge.$selector.children("line").attr('y1', posY + 13);
-						edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-						
-						ViewportManager.preventTickRotation(edge, lollipop);
-						ViewportManager.preventCrossRotation(edge, lollipop);
-					} else {
-						newX = group2.items.get(id_vert).edges[i].from.x + sizeOfRectFrom/2;
-						newY = group2.items.get(id_vert).edges[i].from.y + 13;
-						lollipop = getLollipopPosition(newX, newY, posX + sizeOfRectTo/2, posY + 13);
-						
-						edge.$selector.children("line").attr('x2', posX + sizeOfRectTo/2);
-						edge.$selector.children("line").attr('y2', posY + 13);
-						edge.$selector.children("g").attr('transform', 'rotate(' + lollipop.angle + ',' + lollipop.x + ',' + lollipop.y  + ') translate('+ lollipop.x + ',' + lollipop.y  + ')');
-						
-						ViewportManager.preventTickRotation(edge, lollipop);
-						ViewportManager.preventCrossRotation(edge, lollipop);
-					}
-				}
-			});
-		} else if (classes.contains('viewportTransform')) {
-			this.oscarMike = true;
-
-			posX = this.current.x;
-			posY = this.current.y;
-			
-			var group2 = OffScreenKiv.groupManager.getGroup(this.current.id);
-
-			// iterate through all vertices in the group
-			for (id_vert in group2.items.getAll()) {
-				var edgeSelector = $('.edge-required-' + id_vert + ' > line');
-
-				$('.edge-required-' + id_vert + ' > line').each(function(i, obj) {
-					var x = $(obj).attr('x1');
-					var y = $(obj).attr('y1');
-
-					$(obj).attr('x1', x - diffX);
-					$(obj).attr('y1', y - diffY);
-				});
-
-				$('.edge-provided-' + id_vert + ' > line').each(function(i, obj) {
-					var x = $(obj).attr('x1');
-					var y = $(obj).attr('y1');
-
-					$(obj).attr('x1', x - diffX);
-					$(obj).attr('y1', y - diffY);
-				});
-
-/*
-				for (id in edgeSelector) {
-
-					var xx = edgeSelector[id];
-					var yy = edgeSelector[id];
-
-					var x = xx.x1.baseVal.value;
-					var y = xx.y1.baseVal.value;
-
-					edgeSelector[id].$selector.attr('x1', x - diffX);
-					edgeSelector[id].$selector.attr('y1', y - diffX);
-
-				}
-*/
-			}
-
-			var a = 5;
-		}
-	},
-
-	/**
-	 * Moves nodes visible in graph to make space for area defined by its boundaries.
-	 *
-	 * @param  boundaries 	boundaries of the area
-	 */
-	moveNodes: function(boundaries) {
-		var width = boundaries.right - boundaries.left,
-			height = boundaries.bottom - boundaries.top;
-
-		var center = {
-			x: boundaries.left + (width / 2),
-			y: boundaries.top + (height / 2),
-		};
-
-		$('#graph .node').each(function(){
-			var element = $(this);
-
-			if (element[0].isHidden()) return;
-
-			var boundingRect = element[0].getBoundingClientRect();
-
-			var coords = getCoordinates(element.attr('transform')),
-				elementWidth = boundingRect.width / ViewportManager.zoom.currentZoom,
-				elementHeight = boundingRect.height / ViewportManager.zoom.currentZoom;
-
-			if ((coords.x + elementWidth < boundaries.left || coords.x > boundaries.right) || (coords.y + elementHeight < boundaries.top || coords.y > boundaries.bottom)) return;
-
-			var elementCenter = {
-				x: coords.x + (elementWidth / 2),
-				y: coords.y + (elementHeight / 2),
-			};
-
-			var diff = {
-				x: elementCenter.x - center.x,
-				y: elementCenter.y - center.y,
-			};
-
-			var classes = element[0].classList;
-			var id = element.data('id');
-
-			if (classes.contains('vertex')) {
-				ViewportManager.current = GraphManager.graph.vertices[id - 1];
-
-			} else if (classes.contains('group_vertices')) {
-				ViewportManager.current = {
-					$selector: element,
-					dimmed: false,
-					edges: [],
-					id: id,
-					x: coords.x,
-					y: coords.y,
-				};
-			}
-
-			/**
-			 * mechanism to move vertices in the direction and distance they have from the viewport center at the moment
-			 * - vertices close to the viewport center stay close to the viewport and vice versa
-			 * - vertices that are top-left from the viewport center stay top-left, they are just further
-			 */
-			ViewportManager.current.x += (diff.x < 0 ? -1 : 1) * (1 + Math.random() * Math.abs(diff.x) / (width / 2)) * (width / 2);
-			ViewportManager.current.y += (diff.y < 0 ? -1 : 1) * (1 + Math.random() * Math.abs(diff.y) / (height / 2)) * (height / 2);
-
-			ViewportManager.$currentTarget = element;
-
-			ViewportManager.moveNode();
-		});
-	},
-	
-	/**
-	* Event which will be executed after mouseup.
-	* Cancels hihghlighting of a node that was moved.
-	*/
-	viewportEndDraggingHandler: function (e) {
-		// Highlighting connected vertices only on click (not on drag)
-		if (this.oscarMike === false && this.offsetX !== 0 && this.current.$selector) {
-			var classes = this.current.$selector[0].classList;
-
-			if (classes.contains('vertex')) {
-				this.highlightClckdVertex(this.current);
-			} else if (classes.contains('group_vertices')) {
-				this.highlightClckdVertexGroup(this.current);
-			}
-		}
-
-		if (this.leftMouseButtonDown) {
-			this.leftMouseButtonDown = false;
-			this.offsetX = 0;
-			this.offsetY = 0;
-			
-			this.disableHighlight(this.current);
-			this.$svg.unbind('mouseup');
-			
-			if (OffScreenKiv.vertexSearchHighlighting[this.current.symbolicName] !== undefined) {
-				this.current.$selector[0].classList.add('vertex--searched');
-			}
-			
-			this.$svg.mouseleave(function(){
-				// do nothing
-			});
-		}
-	},
-
-	/**
-	* Prevent the tick from rotating with the lollipop.
-	*
-	* @param edge
-	* @param lollipop
-	*/
-	preventTickRotation: function(edge, lollipop) {
-		// prevent the tick from being rotated
-		var tick = document.getElementById('lollipop-tick' + edge.id);
-		if(tick !== null) {
-			tick.setAttribute('transform', 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)');
-		}
-		
-		var crossA = document.getElementById('lollipop-cross_a_' + edge.id);
-		var crossB = document.getElementById('lollipop-cross_b_' + edge.id);
-		if(crossA !== null) {
-			crossA.setAttribute('transform', 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)');
-		}
-		if(crossB !== null) {
-			crossB.setAttribute('transform', 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)');
-		}
-		
-		var tickA = document.getElementById('lollipop-tick_a_' + edge.id);
-		var tickB = document.getElementById('lollipop-tick_b_' + edge.id);
-		if(tickA !== null) {
-			tickA.setAttribute('transform', 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)');
-		}
-		if(tickB !== null) {
-			tickB.setAttribute('transform', 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)');
-		}
-	},
-	
-	/**
-	* Prevent the error cross from rotating with the lollipop.
-	*
-	* @param edge
-	* @param lollipop
-	*/
-	preventCrossRotation: function(edge, lollipop) {
-		// prevent the cross from being rotated
-		var lines = document.getElementsByClassName('lollipop-line' + edge.id);
-		
-		if (lines.length !== 0) {
-			lines[0].setAttribute('transform', 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)');
-			lines[1].setAttribute('transform', 'rotate(' + (-lollipop.angle) + ',0,0) translate(0,0)');
-		}
-	},
-	
-	/**
-	* Highlights the edge that was clicked
-	*/
-	edgeMousedownHandler: function(e){
-		this.deleteBorder();
-		
-		// disables highlited edges connected to last clicked vertex
-		this.disableHighlightEdges();
-		this.highlightVertex = null;
-		this.highlightGroup = null;
-		
-		var id = getIndexFromId(e.target.parentElement.parentElement.id, 1)-1;
-		var edge = GraphManager.graph.edges[id];
-
-		if (this.highlightEdge != edge) {
-			this.highlightEdge = edge;
-			edge.from.$selector.css('stroke', 'red');
-			edge.to.$selector.css('stroke', 'red');
-			edge.$selector.css('stroke', 'red');
-
-		} else {
-			this.highlightEdge = null;
-		}
-	},
-	
-	/**
-	* Stop highlighting edge.
-	*/
-	deleteBorder: function(){
-		if (this.highlightEdge !== null) {
-			this.highlightEdge.from.$selector.css('stroke', '');
-			this.highlightEdge.to.$selector.css('stroke', '');
-			this.highlightEdge.$selector.css('stroke', '');
-		}
-	},
-	
-	/**
-	* Add context menu to html.
-	*/
-	addContextMenu: function(id){
-		$(id).contextMenu({
-			menu: 'myMenu',
-		},
-		function(action, el, pos) {
-			OffScreenKiv.addVertexToGroup(action, el);
-		});
-	},
-	
-	/**
-	* Remove context menu from selector.
-	*/
-	removeContextMenu: function(id){
-		$(id).destroyContextMenu();
-	}
-};
\ No newline at end of file
diff --git a/sources/WebContent/old/js/zoom.js b/sources/WebContent/old/js/zoom.js
deleted file mode 100644
index 39aa43c..0000000
--- a/sources/WebContent/old/js/zoom.js
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * The class which ensures zoom.
- */
-function Zoom() {
-	var CONST_ZOOM_VALUES = [10, 25, 40, 50, 60, 70, 80, 90, 100, 125, 150, 200, 300, 400, 500];
-
-	this.currentZoom = 1;
-	this.currentZoomIndex = CONST_ZOOM_VALUES.indexOf(100);
-
-	var mouseX = 0;
-	var mouseY = 0;
-
-	$(document).mousemove(function(e) {
-		mouseX = e.pageX;
-		mouseY = e.pageY - 100; //odecteni horniho okraje od viewportu
-	});
-
-	/**
-	 * Gets zoom step (no per cent).
-	 *
-	 * @param zoomStepInPercent zoom step in per cent
-	 * @returns {number} zoom step
-	 */
-	function getZoomStep(zoomStepInPercent) {
-		return zoomStepInPercent/100.0;
-	}
-	
-	/**
-	* This method ensures zoom in.
-	*/
-	this.zoomIn = function() {
-		if (this.currentZoomIndex >= (CONST_ZOOM_VALUES.length - 1)) return;
-		
-		var viewport_pos_top_bef_zoom = $('#viewport').scrollTop(),//pozice odshora
-			viewport_pos_left_bef_zoom = $('#viewport').scrollLeft(),//pozice odshora
-			svg_width_bef = $('#svg1').width(),//pozice odshora
-			svg_height_bef = $('#svg1').height();//pozice odshora
-		
-		
-		$("#zoomOut").removeAttr("disabled");
-		$("#zoomOut img").attr("src", "images/zoom_out.png");
-		this.currentZoomIndex++;
-
-		var zoomStepInPercent = CONST_ZOOM_VALUES[this.currentZoomIndex];
-		this.currentZoom = getZoomStep(zoomStepInPercent);
-
-		var graph = $("#graph");
-		graph.attr('transform', 'scale('+ this.currentZoom + ')');
-		
-		GraphManager.setSizeOfSvg();
-		graph.attr('transform', 'scale('+ this.currentZoom + ') ' +  GraphManager.centerGraphInViewport(this.currentZoom));
-		$("#zoomValue").html(CONST_ZOOM_VALUES[this.currentZoomIndex] + "%");
-
-		var viewport_pos_top_after_zoom = $('#viewport').scrollTop(),    //pozice odshora
-			viewport_pos_left_after_zoom = $('#viewport').scrollLeft();  //pozice odshora
-
-		//pokud se rozsiruje #svg1
-		if ( viewport_pos_top_bef_zoom != viewport_pos_top_after_zoom ) {
-			var svg_height_after = $('#svg1').height(),//pozice odshora
-				new_viewport_top = (mouseY + viewport_pos_top_bef_zoom ) / svg_height_bef;
-			
-			new_viewport_top = (new_viewport_top * svg_height_after) - mouseY ;
-			
-			var diff_konst = 0;
-			if (mouseX < ($('#viewport').height() / 2) ){
-				diff_konst = diff_konst * -1;
-			}
-			$('#viewport').scrollTop( (new_viewport_top)  + diff_konst * new_viewport_top);
-		}
-		
-		if ( viewport_pos_left_bef_zoom != viewport_pos_left_after_zoom ) {
-			var viewport_width = $('#viewport').width(),
-				svg_width_after = $('#svg1').width();//pozice odshora
-			
-			viewport_pos_left_bef_zoom *= -1;
-			var new_viewport_left = (viewport_width - mouseX + viewport_pos_left_bef_zoom ) / svg_width_bef;
-			
-			new_viewport_left = (new_viewport_left * svg_width_after) - (viewport_width - mouseX);
-			
-			var diff_konst = 0;
-			if (mouseY < ($('#viewport').width() / 2) ){
-				diff_konst = diff_konst * -1;
-			}
-			new_viewport_left *=-1;
-			$('#viewport').scrollLeft( new_viewport_left  - (diff_konst * new_viewport_left));
-		}
-		
-		if (this.currentZoomIndex >= (CONST_ZOOM_VALUES.length - 1)) {
-			$("#zoomIn").attr("disabled", "disabled");
-			$("#zoomIn img").attr("src", "images/zoom_in_disabled.png");
-		}
-	};
-	
-	/**
-	* This method ensures zoom out.
-	*/
-	this.zoomOut = function() {
-		if (this.currentZoomIndex <= 0) return;
-
-		var viewport_pos_top_bef_zoom = $('#viewport').scrollTop(),//pozice odshora
-			viewport_pos_left_bef_zoom = $('#viewport').scrollLeft(),//pozice odshora
-			svg_width_bef = $('#svg1').width(),//pozice odshora
-			svg_height_bef = $('#svg1').height();//pozice odshora
-		
-		
-		$("#zoomIn").removeAttr("disabled");
-		$("#zoomIn img").attr("src", "images/zoom_in.png");
-		this.currentZoomIndex--;
-
-		var zoomStepInPercent = CONST_ZOOM_VALUES[this.currentZoomIndex];
-		this.currentZoom = getZoomStep(zoomStepInPercent);
-		
-		var graph = $("#graph");
-		graph.attr('transform', 'scale('+ this.currentZoom + ')');
-		
-		GraphManager.setSizeOfSvg();
-
-		graph.attr('transform', 'scale('+ this.currentZoom + ') ' +  GraphManager.centerGraphInViewport(this.currentZoom));
-		$("#zoomValue").html(CONST_ZOOM_VALUES[this.currentZoomIndex] + "%");
-
-		var viewport_pos_top_after_zoom = $('#viewport').scrollTop(),    //pozice odshora
-			viewport_pos_left_after_zoom = $('#viewport').scrollLeft();  //pozice odshora
-
-		if ( viewport_pos_top_bef_zoom != viewport_pos_top_after_zoom ) {
-			
-			var svg_height_after = $('#svg1').height(),//pozice odshora
-				new_viewport_top = (mouseY + viewport_pos_top_bef_zoom ) / svg_height_bef;
-			
-			new_viewport_top = (new_viewport_top * svg_height_after) - mouseY;
-			
-			$('#viewport').scrollTop( new_viewport_top );
-		}
-		
-		if ( viewport_pos_left_bef_zoom != viewport_pos_left_after_zoom ) {
-			var viewport_width = $('#viewport').width(),
-				svg_width_after = $('#svg1').width();//šířka
-			
-			viewport_pos_left_bef_zoom *= -1;
-			var new_viewport_left = (viewport_width - mouseX + viewport_pos_left_bef_zoom ) / svg_width_bef;
-			
-			new_viewport_left = (new_viewport_left * svg_width_after) - (viewport_width - mouseX);
-			
-			$('#viewport').scrollLeft( new_viewport_left * -1 );
-		}
-		
-		if (this.currentZoomIndex <= 0) {
-			$("#zoomOut").attr("disabled", "disabled");
-			$("#zoomOut img").attr("src", "images/zoom_out_disabled.png");
-		}
-	};
-}
diff --git a/sources/WebContent/old/styles/basic.css b/sources/WebContent/old/styles/basic.css
deleted file mode 100644
index 069fc4c..0000000
--- a/sources/WebContent/old/styles/basic.css
+++ /dev/null
@@ -1,917 +0,0 @@
-/* 
-	Document   : basic
-	Created on : 19.2.2012, 11:25:14
-	Author     : Jindra Pavlíková
-	Description:
-		Purpose of the stylesheet follows.
-*/
-html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, br, blockquote, 
-pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, 
-strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details,
-figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, 
-mark, audio, video {
-	margin:0;
-	padding:0;
-	border:0;
-	outline:0;
-}
-
-hr {
-	color: black;
-	margin: 5px;
-	border: 0;
-	border-bottom: 1px solid black;
-}
-
-body {
-	background: #e8f4ff;
-	font-family: sans-serif;
-
-}
-
-h5 {
-	margin-bottom: 10px;
-}
-
-.clean {
-	clear: both;
-}
-
-.btn {
-	cursor: pointer;
-}
-
-.imgDelete {
-	padding: 2px 5px;
-	width: 16px;
-	height: 16px;
-	float: right;
-}
-
-.verticalSeparator {
-	border: none;
-	border-top: 1px #0B548A dashed;
-	margin: 15px 0;
-}
-
-/* required/provided counters */
-
-#lolipA,
-#lolipB,
-#lolipC,
-#lolipD {
-	text-anchor: middle;
-	font-size: 8pt;
-}
-
-#lolipC,
-#lolipD {
-	stroke: none;
-	cursor: default;
-}
-
-/* qTip */
-
-.qtip_width_setting {
-	max-width: 1200px !important;
-	min-width: 0px !important;
-}
-
-/******************************************************************************
- * LOADER
- *****************************************************************************/
-
-.loader {
-	display: none;
-	position: absolute;
-	z-index: 2;
-	width: 100%;
-	height: 100%;
-	opacity: 0.8;
-	background: black;
-}
-
-.loader-content {
-	position: relative;
-	top: 50%;
-	width: 200px;
-	height: 200px;
-	margin: 0 auto;
-	margin-top: -100px;
-	background: #5d5d5d;
-	-webkit-border-radius: 10px;
-	-moz-border-radius: 10px;
-	border-radius: 10px;
-}
-
-.loader-content p {
-	text-align: center; 
-	margin-top: 5px;
-	margin-bottom: 10px;
-	opacity: 1;
-}
-
-/******************************************************************************
- * HEADER
- *****************************************************************************/
-
-.header {
-	width: 100%;
-	line-height: 60px;
-	vertical-align: middle;
-	background: #f0f9ff; /* Old browsers */
-	background: -moz-linear-gradient(top,  #f0f9ff 0%, #cbebff 47%, #a1dbff 100%); /* FF3.6+ */
-	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f0f9ff), color-stop(47%,#cbebff), color-stop(100%,#a1dbff)); /* Chrome,Safari4+ */
-	background: -webkit-linear-gradient(top,  #f0f9ff 0%,#cbebff 47%,#a1dbff 100%); /* Chrome10+,Safari5.1+ */
-	background: -o-linear-gradient(top,  #f0f9ff 0%,#cbebff 47%,#a1dbff 100%); /* Opera 11.10+ */
-	background: -ms-linear-gradient(top,  #f0f9ff 0%,#cbebff 47%,#a1dbff 100%); /* IE10+ */
-	background: linear-gradient(top,  #f0f9ff 0%,#cbebff 47%,#a1dbff 100%); /* W3C */
-	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f0f9ff', endColorstr='#a1dbff',GradientType=0 ); /* IE6-9 */
-}
-
-.header-logo {
-	float: left;
-	margin: 0px 20px;
-	margin-top: 5px;
-	width: 100px;
-	height: 48px;
-}
-
-.header-title {
-	margin-left: 60px;
-}
-
-.header .err_msg,
-.header .not_msg {
-	line-height: 16px;
-}
-
-.header .err_msg {
-	color: #FF0000;
-}
-.header .not_msg {
-	color: #009900;
-}
-
-/* login and register links */
-
-.header .login_box {
-	float: right;
-	position: absolute;
-	right: 25px;
-	top: 0px;
-	font-weight: bold;	
-}
-
-.header .login_box a {
-	color: #0B548A;
-	font-size: 14px;
-}
-
-.header .login_box a:hover {
-	text-decoration: none;
-}
-
-/* login popup */
-
-.header .login_popup {
-	display: none;
-	position: absolute;
-	right: 4px;
-	top: 45px;
-	z-index: 999;
-	padding: 10px 20px;
-	border: 1px solid #999;
-	background: #fff;
-	font-size: 13px;
-	font-weight: normal;
-	line-height: 35px;
-}
-
-.header .login_popup td {
-	height: 35px;
-}
-.header .login_popup input {
-	margin-left: 15px;
-}
-
-.header .login_popup input[type=text],
-.header .login_popup input[type=password] {
-	width: 150px;
-}
-
-/* register popup */
-
-.header .register_popup {
-	display: none;
-	position: absolute;
-	right: 4px;
-	top: 45px;
-	z-index: 999;
-	padding: 10px 20px;
-	border: 1px solid #999;
-	background: #fff;
-	font-size: 13px;
-	font-weight: normal;
-	line-height: 30px;
-}
-
-/******************************************************************************
- * NAVIGATION BAR
- *****************************************************************************/
-
-.navbar {
-	background: #1e5799; /* Old browsers */
-	background: -moz-linear-gradient(top,  #1e5799 0%, #7db9e8 100%); /* FF3.6+ */
-	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#1e5799), color-stop(100%,#7db9e8)); /* Chrome,Safari4+ */
-	background: -webkit-linear-gradient(top,  #1e5799 0%,#7db9e8 100%); /* Chrome10+,Safari5.1+ */
-	background: -o-linear-gradient(top,  #1e5799 0%,#7db9e8 100%); /* Opera 11.10+ */
-	background: -ms-linear-gradient(top,  #1e5799 0%,#7db9e8 100%); /* IE10+ */
-	background: linear-gradient(top,  #1e5799 0%,#7db9e8 100%); /* W3C */
-	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=0 ); /* IE6-9 */
-	font-weight: bold;
-	font-size: 11pt;
-	color: #cceefc;
-}
-
-.navbar > ul {
-	list-style: none;
-	white-space: nowrap;
-	overflow-x: auto;
-}
-
-.navbar > ul > li {
-	display: inline-block;
-	margin-right: 5px;
-	margin-left: 5px;
-}
-
-.navbar li a {
-	color: #cfeafe;
-	margin-right: 5px;
-	margin-left: 5px;
-}
-
-.navbar li a:hover {
-	color: #977aeb;
-}
-
-.navbar-separator {
-	display: inline-block;
-	height: 25px;
-	border: none;
-	border-left: 1px solid #cceefc;
-	margin-left: 5px;
-	margin-right: 5px;
-	line-height: 40px;
-	vertical-align: middle;
-}
-
-.navbar-image {
-	display: inline-block;
-	margin: 0px 5px;
-	vertical-align: middle;
-}
-
-.navbar .btn {
-	display: inline-block;
-	border: none;
-	background: none;
-	vertical-align: middle;
-}
-
-.navbar .btn-block {
-	display: inline-block;
-	width: 38px;
-	height: 38px;
-}
-
-/* zoom */
-
-.navbar .zoom-value {
-	display: inline-block;
-	width: 38px;
-	font-weight: bold;
-}
-
-/* search */
-
-.navbar .search-text {
-	display: inline-block;
-	vertical-align: middle;
-}
-
-.navbar .search-count {
-	display: inline-block;
-	min-width: 30px;
-	font-weight: bold;
-}
-
-.navbar .search-count:hover {
-	color: orange;
-	cursor: pointer;
-}
-
-/* back to upload */
-
-.navbar .btn.back-to-upload {
-	background: url("./../images/icon_back.png") no-repeat scroll 0px 2px transparent;
-}
-
-.navbar .btn.back-to-upload:hover {
-	color: #1F5899;
-}
-
-/* diagram actions */
-
-.navbar .btn.view-save-diagram {
-	background: url("./../images/icon_save.png") no-repeat scroll 0px 2px transparent;
-}
-
-.navbar .btn.view-refresh-diagram {
-	background: url("./../images/icon_refresh.png") no-repeat scroll 0px 2px transparent;
-}
-
-.navbar .btn.view-refresh-reset-diagram {
-	background: url("./../images/icon_refresh_reset.png") no-repeat scroll 0px 2px transparent;
-}
-
-/* EFP selector */
-
-.navbar .EFP-selector .option_default {
-	font-style: italic;
-}
-
-/******************************************************************************
- * CONTENT
- *****************************************************************************/
-
-.content {
-	position: relative;
-	display: flex;
-	text-align: center;
-}
-
-.content .viewport {
-	flex-grow: 1;
-	box-sizing: border-box;
-	border-right: 1px solid #e8f4ff;
-	background: white;
-	direction: rtl;
-	overflow: scroll;
-	text-align: left;
-}
-
-.content .viewport .zoom-help {
-	display: none;
-	position: absolute;
-	left: 30px;
-	top: 15px;
-}
-
-.content .viewport > svg {
-	direction: ltr;
-}
-
-.content .graph {
-	stroke: black;
-}
-
-.node,
-.vertex {
-	stroke: black;
-	anchor: middle;
-}
-
-.node text,
-.vertex text {
-	stroke: none;
-	fill: black;
-	font-size: 14px;
-	font-family: sans-serif;
-	dominant-baseline: central;
-	/* unselectable */
-	-webkit-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-}
-
-.group-label {
-	stroke: none;
-	font-weight: bold;
-	cursor: text;
-}
-
-.group-symbol {
-	font-size: 30px !important;
-	fill: black;
-}
-
-.group-symbol-big {
-	font-size: 40px !important;
-}
-
-.content .viewport .vertex text,
-.content .viewport .group_vertices text,
-.content .viewport .group_viewport text {
-	text-anchor: middle;
-}
-
-.content .viewport .vertex text {
-	cursor: default;
-}
-
-.content .sidebar .group-symbol {
-	text-anchor: middle;
-}
-
-.vertex .interface {
-	fill: white;
-	stroke: black;
-	stroke-width: 1px;
-}
-
-.group_viewport .edge-viewport-out {
-	display: none;
-}
-
-.group_vertices a,
-.group_viewport a {
-	cursor: pointer;
-}
-
-.group_viewport .proxy-counter {
-	cursor: pointer;
-}
-
-.edge .lollipop {
-	stroke-width: 2;
-	fill: white;
-}
-
-.edge .lollipop-cross {
-	stroke:rgb(255,0,0);
-	stroke-width: 2;
-	transform: scale(0.8,0.8);
-	-ms-transform: scale(0.8,0.8); /* IE 9 */
-	-webkit-transform: scale(0.8,0.8); /* Safari and Chrome */
-	-o-transform: scale(0.8,0.8); /* Opera */
-	-moz-transform: scale(0.8,0.8); /* Firefox */
-}
-
-.edge .lollipop-tick {
-	stroke:rgb(0,255,0);
-	stroke-width: 2;
-}
-
-.lollipop-required,
-.lollipop-provided,
-.counter-required,
-.counter-provided {
-	text-anchor: middle;
-	stroke: none;
-	fill: black;
-	dominant-baseline: central;
-	font-size: 12px;
-}
-
-/* context menu */
-
-.content .contextMenu .component_color img {
-	float: right;
-	margin-top: 3px;
-	text-align: right;
-}
-
-.content .contextMenu .contextMenuDescription {
-	float: right;
-}
-
-.content .contextMenu .cont_menu_group {
-	float: right;
-	display: block;
-	margin-left: 10px;
-	margin-right: 120px;
-	margin-top: 4px;
-	width: 20px;
-	font-size: 12px;	
-}
-
-/* colors */
-
-.color-blue {
-	color: #0b548a;
-}
-
-.whiteColor {
-	fill: white;
-}
-
-.colorNormal {
-	fill: #cfeafe;
-}
-
-.colorHighlight{
-	fill: yellow;
-}
-
-.colorHighlightProvided,
-.colorHighProvB {
-	fill: #5896FF;
-}
-
-.colorHighlightRequired,
-.colorHighReqR {
-	fill: red;
-}
-
-.vertex--unconnected {
-	opacity: 0.2;
-}
-
-.vertex--searched {
-	fill: orange;
-	background-color: orange;   /* the element is not always SVG */
-}
-
-.vertex--dimmed,
-.edge--dimmed,
-.group_vertices--dimmed {
-	opacity: 0.5;
-}
-
-.edge--provided {
-	stroke: blue;
-}
-
-.edge--required {
-	stroke: red;
-}
-
-/******************************************************************************
- * SIDEBAR (SeCo, secondary content)
- *****************************************************************************/
-
-.sidebar {
-	position: relative;
-	box-sizing: border-box;
-	text-align: left;
-	margin-top: 40px;
-	flex-basis: 350px;
-	flex-grow: 0;
-	flex-shrink: 0;
-	overflow-y: scroll;
-	background: white;
-	white-space: nowrap;
-}
-
-.sidebar img {
-	width: 12px;
-	height: 12px;
-}
-
-.sidebar li {
-	list-style: none;
-	font-size: 10pt;
-}
-
-.sidebar li p {
-	float:left;
-	width: 162px;
-	white-space: nowrap;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-
-.sidebar li img {
-	margin-left: 5px;
-	width: 12px;
-	height: 12px;
-	cursor: pointer;
-}
-
-.sidebar-navbar {
-	box-sizing: border-box;
-	position: fixed;
-	width: 100%;
-	margin-top: -40px;
-	padding: 10px;
-	background-color: #FFF;
-}
-
-.sidebar .components-box {
-	padding: 10px;
-	border-top: 1px #0B548A dashed;
-}
-
-/* buttons */
-
-.sidebar .control-buttons {
-	float: right;
-	margin-right: 10px;
-}
-
-.sidebar .button {
-	width: 24px;
-	height: 12px;
-	margin: 2px;
-	margin-left: 4px;
-	padding-bottom: 3px;
-	border: 1px solid gray;
-	border-radius: 4px;
-	-moz-border-radius: 4px;  /*Firefox 3.6 and earlier */
-	font-size: 10pt;
-	text-align: center;
-	cursor: pointer;
-}
-
-.sidebar .button.buttonClassic {
-	background: rgb(173,206,247); /* Old browsers */
-	background: -moz-linear-gradient(top, rgba(173,206,247,1) 0%, rgba(225,236,247,1) 50%, rgba(173,206,247,1) 100%); /* FF3.6+ */
-	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(173,206,247,1)), color-stop(50%,rgba(225,236,247,1)), color-stop(100%,rgba(173,206,247,1))); /* Chrome,Safari4+ */
-	background: -webkit-linear-gradient(top, rgba(173,206,247,1) 0%,rgba(225,236,247,1) 50%,rgba(173,206,247,1) 100%); /* Chrome10+,Safari5.1+ */
-	background: -o-linear-gradient(top, rgba(173,206,247,1) 0%,rgba(225,236,247,1) 50%,rgba(173,206,247,1) 100%); /* Opera 11.10+ */
-	background: -ms-linear-gradient(top, rgba(173,206,247,1) 0%,rgba(225,236,247,1) 50%,rgba(173,206,247,1) 100%); /* IE10+ */
-	background: linear-gradient(top, rgba(173,206,247,1) 0%,rgba(225,236,247,1) 50%,rgba(173,206,247,1) 100%); /* W3C */
-}
-
-.sidebar .button[disabled] {
-	cursor: not-allowed;
-}
-
-.sidebar a.button[disabled] {
-	pointer-events: none;
-}
-
-/* components counter */
-
-.sidebar .components-count {
-	position: fixed;
-	bottom: 0;
-	font-size: 10px;
-	padding: 0 15px;
-}
-
-/* unconnected components list */
-
-.sidebar .unconnected-components {
-	display: none;
-}
-
-/* incompatible components list */
-
-.sidebar .incompatible-components {
-}
-
-.sidebar .incompatible-components > h5 {
-	color: red;
-}
-
-/* excluded components list */
-
-.sidebar .excluded-components .btn-group {
-	margin-bottom: 10px;
-}
-
-.sidebar .excluded-components .sort-button {
-	font-size: 10px;
-	color: #444;
-	padding: 3px 6px;
-	background: none;
-	border: 0;
-	outline: 0;
-}
-
-.sidebar .excluded-components .sort-button:hover {
-	text-decoration: underline;
-}
-
-.sidebar .excluded-components .sort-button.active {
-	text-decoration: underline;
-	color: #000;
-}
-
-.sidebar .excluded-components .sort-button .sort-icon {
-	color: #555;
-	font-size: 8px;
-}
-
-.sidebar .excluded-components .sort-button.active .sort-icon {
-	color: #000;
-}
-
-.sidebar .excluded-components .include-components-button {
-	float: right;
-	display: none;
-	position: relative;
-	top: 5px;
-	background: none;
-	border: 0;
-	outline: 0;
-}
-
-.sidebar .buttonImage {
-	margin-top: 10%;
-	flex-shrink: 0;
-	min-width: 65%;
-	min-height: 100%    
-}
-
-/* excluded components */
-
-.sidebar .component::after {
-	display: block;
-	content: "";
-	clear: both;
-}
-
-.sidebar .component > svg {
-	min-height: 70px;
-}
-
-.sidebar .component > .compatibility-list {
-	cursor: default;
-	/* unselectable */
-	-webkit-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-}
-
-.sidebar .group-label {
-	font-size: 10pt;
-	font-family: sans-serif;
-	margin-left: 16px;
-}
-
-.sidebar .group-label strong {
-	font-weight: bold;
-	cursor: default;
-	/* unselectable */
-	-webkit-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-}
-
-/* to change components */
-
-#proposeChanges {
-	margin-bottom: 10px;
-}
-
-.sidebar .to-change-components .active {
-	background-color: #faff70;
-	/* background-color: #83f776; */
-}
-
-/******************************************************************************
- * UPLOAD COMPONENTS PAGE
- * TODO refactor
- *****************************************************************************/
-
-#uploadComponent {
-	display: inline-block;
-	min-height: 150px;
-	margin: auto;
-	margin-top: 20px;
-	background: #CFEAFE;
-	padding: 10px;
-	box-shadow: 10px 10px 5px #888888;
-	text-align: center;
-}
-
-#uploadComponent ul {
-	display: inline-block;
-	text-align: left;
-}
-
-#uploadComponent form {
-	text-align: center;
-}
-
-#uploadedComponent {
-	margin: 5px 10px 10px 10px;
-	list-style: none;
-	list-style-position: inside;
-}
-
-#uploadedComponent li {
-	padding: 2px 5px;
-	min-width: 450px;
-}
-
-#uploadedComponent li:nth-child(2n-1){
-	background:#e0dfdf;
-}
-
-#uploadedComponent li:nth-child(2n){
-	background:#f5f4f4;
-}
-
-#deleteAll {
-	margin-bottom: 20px;
-}
-
-
-#input_diagram_name{
-
-	width: 100px;
-}
-
-/*#chooseFramework {
-	width: 300px;
-	height: 150px;
-	line-height: 150px;
-	margin: auto;
-	margin-top: 100px;
-	background: #CFEAFE;
-	box-shadow: 10px 10px 5px #888888;
-}*/
-/*
-#chooseFramework form {
-	vertical-align: middle;
-	text-align: center;
-}*/
-
-#framework {
-	width: 240px;
-}
-
-.formButton {
-	width: 240px;
-}
-
-.load {
-	position: relative;
-	left: 30px;
-	width: 90px;
-}
-
-.file_input_textbox {
-	height: 20px;
-	width: 150px;
-	float: left;
-}
-
-.file_input_div {
-	position: relative;
-	float: left;
-	width: 95px;
-	height: 26px;
-	overflow: hidden;
-}
-
-.file_input_hidden {
-	position: absolute;
-	right: 0px;
-	top: 0px;
-	cursor: pointer;
-	opacity: 0;
-	filter: alpha(opacity=0);
-	-ms-filter: "alpha(opacity=0)";
-	-khtml-opacity: 0;
-	-moz-opacity: 0;
-}
-
-.errorMessage {
-	width: 510px;
-	margin: auto;
-	margin-top: 50px;
-	background: #F28E8E;
-	padding: 5px;
-	box-shadow: 10px 10px 5px #888888;
-	text-align: left;
-}
-
-/* logged-in user menu */
-
-#logged_user_menu {
-	width: 200px; 
-	padding: 20px 10px;
-	float:left; 
-	background: #CFEAFE;
-	text-align:left;
-}
-#logged_user_menu h3 {
-	font-weight: bold;
-	font-size: 15px;
-}
-#logged_user_menu ul {
-	list-style-type: none;
-	padding-left: 10px;
-	line-height: 25px;
-}
-#logged_user_menu a {
-	color: #0B548A;
-}
-#logged_user_menu a:hover {
-	text-decoration:none;
-}
-
-#diagram_id_new a{
-	padding-left: 18px;
-	background: url("./../images/icon_new_diagram.png") no-repeat scroll 0px 2px transparent;
-}
\ No newline at end of file
diff --git a/sources/WebContent/old/styles/dialog.css b/sources/WebContent/old/styles/dialog.css
deleted file mode 100644
index 231bfbd..0000000
--- a/sources/WebContent/old/styles/dialog.css
+++ /dev/null
@@ -1,55 +0,0 @@
-.ui-dialog-content p {
-	cursor: default;
-    -webkit-touch-callout: none;
-	-webkit-user-select: none;
-	-khtml-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-}
-
-.ui-dialog-title {
-	cursor: default;
-    -webkit-touch-callout: none;
-	-webkit-user-select: none;
-	-khtml-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-}
-
-.ui-dialog-titlebar {
-	background: #f0f9ff; /* Old browsers */
-    background: -moz-linear-gradient(top,  #f0f9ff 0%, #cbebff 47%, #a1dbff 100%); /* FF3.6+ */
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f0f9ff), color-stop(47%,#cbebff), color-stop(100%,#a1dbff)); /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top,  #f0f9ff 0%,#cbebff 47%,#a1dbff 100%); /* Chrome10+,Safari5.1+ */
-    background: -o-linear-gradient(top,  #f0f9ff 0%,#cbebff 47%,#a1dbff 100%); /* Opera 11.10+ */
-    background: -ms-linear-gradient(top,  #f0f9ff 0%,#cbebff 47%,#a1dbff 100%); /* IE10+ */
-    background: linear-gradient(top,  #f0f9ff 0%,#cbebff 47%,#a1dbff 100%); /* W3C */
-    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f0f9ff', endColorstr='#a1dbff',GradientType=0 ); /* IE6-9 */
-}
-
-.ui-dialog  {
-	font-family: sans-serif;
-}
-
-.ui-button-text {
-	color: black;
-}
-
-#clearNameButton:hover {
-	border: 1px solid #999999;
-	background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
-	font-weight: normal;
-	color: #212121;
-}
-
-.ui-dialog input[type="text"] {
-	margin-bottom: 0.5em;
-	margin-top: 0.5em;
-}
-
-.ui-widget-overlay {
-	opacity: 0.8;
-    background: black;
-}
\ No newline at end of file
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/animated-overlay.gif b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/animated-overlay.gif
deleted file mode 100644
index d441f75..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/animated-overlay.gif and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100644
index c09235f..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
deleted file mode 100644
index d29011d..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
deleted file mode 100644
index 1558bea..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644
index 0359b12..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_75_dadada_1x400.png
deleted file mode 100644
index 4fce6c4..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_75_dadada_1x400.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
deleted file mode 100644
index 5299b5a..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100644
index 398c56a..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
deleted file mode 100644
index d819aa5..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_222222_256x240.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_222222_256x240.png
deleted file mode 100644
index c1cb117..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_222222_256x240.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_2e83ff_256x240.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644
index 84b601b..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_2e83ff_256x240.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_454545_256x240.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_454545_256x240.png
deleted file mode 100644
index b6db1ac..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_454545_256x240.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_888888_256x240.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_888888_256x240.png
deleted file mode 100644
index feea0e2..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_888888_256x240.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_cd0a0a_256x240.png b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_cd0a0a_256x240.png
deleted file mode 100644
index ed5b6b0..0000000
Binary files a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/images/ui-icons_cd0a0a_256x240.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/jquery-ui-1.10.3.custom.css b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/jquery-ui-1.10.3.custom.css
deleted file mode 100644
index 52d9c67..0000000
--- a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/jquery-ui-1.10.3.custom.css
+++ /dev/null
@@ -1,717 +0,0 @@
-/*! jQuery UI - v1.10.3 - 2013-12-10
-* http://jqueryui.com
-* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.button.css, jquery.ui.dialog.css, jquery.ui.theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
-* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
-	display: none;
-}
-.ui-helper-hidden-accessible {
-	border: 0;
-	clip: rect(0 0 0 0);
-	height: 1px;
-	margin: -1px;
-	overflow: hidden;
-	padding: 0;
-	position: absolute;
-	width: 1px;
-}
-.ui-helper-reset {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	outline: 0;
-	line-height: 1.3;
-	text-decoration: none;
-	font-size: 100%;
-	list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
-	content: "";
-	display: table;
-	border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
-	clear: both;
-}
-.ui-helper-clearfix {
-	min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
-	width: 100%;
-	height: 100%;
-	top: 0;
-	left: 0;
-	position: absolute;
-	opacity: 0;
-	filter:Alpha(Opacity=0);
-}
-
-.ui-front {
-	z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
-	cursor: default !important;
-}
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
-	display: block;
-	text-indent: -99999px;
-	overflow: hidden;
-	background-repeat: no-repeat;
-}
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
-	position: fixed;
-	top: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
-}
-.ui-resizable {
-	position: relative;
-}
-.ui-resizable-handle {
-	position: absolute;
-	font-size: 0.1px;
-	display: block;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
-	display: none;
-}
-.ui-resizable-n {
-	cursor: n-resize;
-	height: 7px;
-	width: 100%;
-	top: -5px;
-	left: 0;
-}
-.ui-resizable-s {
-	cursor: s-resize;
-	height: 7px;
-	width: 100%;
-	bottom: -5px;
-	left: 0;
-}
-.ui-resizable-e {
-	cursor: e-resize;
-	width: 7px;
-	right: -5px;
-	top: 0;
-	height: 100%;
-}
-.ui-resizable-w {
-	cursor: w-resize;
-	width: 7px;
-	left: -5px;
-	top: 0;
-	height: 100%;
-}
-.ui-resizable-se {
-	cursor: se-resize;
-	width: 12px;
-	height: 12px;
-	right: 1px;
-	bottom: 1px;
-}
-.ui-resizable-sw {
-	cursor: sw-resize;
-	width: 9px;
-	height: 9px;
-	left: -5px;
-	bottom: -5px;
-}
-.ui-resizable-nw {
-	cursor: nw-resize;
-	width: 9px;
-	height: 9px;
-	left: -5px;
-	top: -5px;
-}
-.ui-resizable-ne {
-	cursor: ne-resize;
-	width: 9px;
-	height: 9px;
-	right: -5px;
-	top: -5px;
-}
-.ui-selectable-helper {
-	position: absolute;
-	z-index: 100;
-	border: 1px dotted black;
-}
-.ui-button {
-	display: inline-block;
-	position: relative;
-	padding: 0;
-	line-height: normal;
-	margin-right: .1em;
-	cursor: pointer;
-	vertical-align: middle;
-	text-align: center;
-	overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
-	text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
-	width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
-	width: 2.4em;
-}
-.ui-button-icons-only {
-	width: 3.4em;
-}
-button.ui-button-icons-only {
-	width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
-	display: block;
-	line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
-	padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
-	padding: .4em;
-	text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-	padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-	padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
-	padding-left: 2.1em;
-	padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
-	padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
-	position: absolute;
-	top: 50%;
-	margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
-	left: 50%;
-	margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
-	left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-	right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
-	margin-right: 7px;
-}
-.ui-buttonset .ui-button {
-	margin-left: 0;
-	margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
-	border: 0;
-	padding: 0;
-}
-.ui-dialog {
-	position: absolute;
-	top: 0;
-	left: 0;
-	padding: .2em;
-	outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
-	padding: .4em 1em;
-	position: relative;
-}
-.ui-dialog .ui-dialog-title {
-	float: left;
-	margin: .1em 0;
-	white-space: nowrap;
-	width: 90%;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
-	position: absolute;
-	right: .3em;
-	top: 50%;
-	width: 21px;
-	margin: -10px 0 0 0;
-	padding: 1px;
-	height: 20px;
-}
-.ui-dialog .ui-dialog-content {
-	position: relative;
-	border: 0;
-	padding: .5em 1em;
-	background: none;
-	overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
-	text-align: left;
-	border-width: 1px 0 0 0;
-	background-image: none;
-	margin-top: .5em;
-	padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
-	float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
-	margin: .5em .4em .5em 0;
-	cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
-	width: 12px;
-	height: 12px;
-	right: -5px;
-	bottom: -5px;
-	background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
-	cursor: move;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
-	font-family: Verdana,Arial,sans-serif;
-	font-size: 0.8em;
-}
-.ui-widget .ui-widget {
-	font-size: 0.7em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
-	font-family: Verdana,Arial,sans-serif;
-	font-size: 1em;
-}
-.ui-widget-content {
-	border: 1px solid #aaaaaa;
-	background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;
-	color: #222222;
-}
-.ui-widget-content a {
-	color: #222222;
-}
-.ui-widget-header {
-	border: 1px solid #aaaaaa;
-	background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
-	color: #222222;
-	font-weight: bold;
-}
-.ui-widget-header a {
-	color: #222222;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
-	border: 1px solid #d3d3d3;
-	background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
-	font-weight: normal;
-	color: #555555;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
-	color: #555555;
-	text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
-	border: 1px solid #999999;
-	background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
-	font-weight: normal;
-	color: #212121;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited {
-	color: #212121;
-	text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
-	border: 1px solid #aaaaaa;
-	background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
-	font-weight: normal;
-	color: #212121;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
-	color: #212121;
-	text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
-	border: 1px solid #fcefa1;
-	background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;
-	color: #363636;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
-	color: #363636;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
-	border: 1px solid #cd0a0a;
-	background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;
-	color: #cd0a0a;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
-	color: #cd0a0a;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
-	color: #cd0a0a;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
-	font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
-	opacity: .7;
-	filter:Alpha(Opacity=70);
-	font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
-	opacity: .35;
-	filter:Alpha(Opacity=35);
-	background-image: none;
-}
-.ui-state-disabled .ui-icon {
-	filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
-	width: 16px;
-	height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
-	background-image: url(images/ui-icons_222222_256x240.png);
-}
-.ui-widget-header .ui-icon {
-	background-image: url(images/ui-icons_222222_256x240.png);
-}
-.ui-state-default .ui-icon {
-	background-image: url(images/ui-icons_888888_256x240.png);
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
-	background-image: url(images/ui-icons_454545_256x240.png);
-}
-.ui-state-active .ui-icon {
-	background-image: url(images/ui-icons_454545_256x240.png);
-}
-.ui-state-highlight .ui-icon {
-	background-image: url(images/ui-icons_2e83ff_256x240.png);
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
-	background-image: url(images/ui-icons_cd0a0a_256x240.png);
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
-	border-top-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
-	border-top-right-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
-	border-bottom-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
-	border-bottom-right-radius: 4px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
-	background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
-	opacity: .3;
-	filter: Alpha(Opacity=30);
-}
-.ui-widget-shadow {
-	margin: -8px 0 0 -8px;
-	padding: 8px;
-	background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
-	opacity: .3;
-	filter: Alpha(Opacity=30);
-	border-radius: 8px;
-}
diff --git a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/jquery-ui-1.10.3.custom.min.css b/sources/WebContent/old/styles/libs/jquery-ui/smoothness/jquery-ui-1.10.3.custom.min.css
deleted file mode 100644
index 27a1cb7..0000000
--- a/sources/WebContent/old/styles/libs/jquery-ui/smoothness/jquery-ui-1.10.3.custom.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.10.3 - 2013-12-10
-* http://jqueryui.com
-* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.button.css, jquery.ui.dialog.css, jquery.ui.theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
-* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
\ No newline at end of file
diff --git a/sources/WebContent/old/styles/libs/jquery.contextMenu.css b/sources/WebContent/old/styles/libs/jquery.contextMenu.css
deleted file mode 100644
index db51252..0000000
--- a/sources/WebContent/old/styles/libs/jquery.contextMenu.css
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Generic context menu styles */
-.contextMenu {
-	position: absolute;
-	/*width: 120px;*/
-	width: 200px;
-	z-index: 99999;
-	border: solid 1px #CCC;
-	background: #EEE;
-	padding: 0px;
-	margin: 0px;
-	display: none;
-}
-
-.contextMenu LI {
-	list-style: none;
-	padding: 0px;
-	margin: 0px;
-	min-height: 22px;
-}
-
-.contextMenu A.component_color {
-	color: #333;
-	text-decoration: none;
-	display: block;
-	line-height: 20px;
-	height: 20px;
-	background-position: 6px center;
-	background-repeat: no-repeat;
-	outline: none;
-	padding: 1px 5px;
-	padding-left: 5px;
-	/*padding-left: 28px;*/
-	float:left;
-	width: 40px;
-}
-
-.contextMenu LI.hover A:not(.cont_menu_group) {
-	color: #FFF;
-	background-color: #3399FF;
-}
-
-.contextMenu LI.disabled A {
-	color: #AAA;
-	cursor: default;
-}
-
-.contextMenu LI.hover.disabled A {
-	background-color: transparent;
-}
-
-.contextMenu LI.separator {
-	border-top: solid 1px #CCC;
-}
-
-/*
-	Adding Icons
-	
-	You can add icons to the context menu by adding
-	classes to the respective LI element(s)
-*/
-
-.contextMenu LI.edit A { background-image: url(images/page_white_edit.png); }
-.contextMenu LI.cut A { background-image: url(images/cut.png); }
-.contextMenu LI.copy A { background-image: url(images/page_white_copy.png); }
-.contextMenu LI.paste A { background-image: url(images/page_white_paste.png); }
-.contextMenu LI.delete A { background-image: url(images/page_white_delete.png); }
-.contextMenu LI.quit A { background-image: url(images/door.png); }
-
-.contextMenuDescription { font-size: 11px; display:block; float:left; width: 185px; padding-left: 8px}
-.cleaner{display:block; float: left; clear:both;}
diff --git a/sources/WebContent/old/styles/libs/jquery.qtip.css b/sources/WebContent/old/styles/libs/jquery.qtip.css
deleted file mode 100644
index e87c889..0000000
--- a/sources/WebContent/old/styles/libs/jquery.qtip.css
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * qTip2 - Pretty powerful tooltips - v2.2.0
- * http://qtip2.com
- *
- * Copyright (c) 2014 Craig Michael Thompson
- * Released under the MIT, GPL licenses
- * http://jquery.org/license
- *
- * Date: Sat Mar 15 2014 09:24 EDT-0400
- * Plugins: tips viewport imagemap svg modal
- * Styles: basic css3
- */
-.qtip{
-	position: fixed;
-	left: -28000px;
-	top: -28000px;
-	display: none;
-
-	/*max-width: 280px;
-	min-width: 50px;*/
-	
-	font-size: 10.5px;
-	line-height: 12px;
-
-	direction: ltr;
-
-	box-shadow: none;
-	padding: 0;
-}
-
-	.qtip-content{
-		position: relative;
-		padding: 5px 9px;
-		overflow: hidden;
-
-		text-align: left;
-		word-wrap: break-word;
-	}
-
-	.qtip-titlebar{
-		position: relative;
-		padding: 5px 35px 5px 10px;
-		overflow: hidden;
-
-		border-width: 0 0 1px;
-		font-weight: bold;
-	}
-
-	.qtip-titlebar + .qtip-content{ border-top-width: 0 !important; }
-
-	/* Default close button class */
-	.qtip-close{
-		position: absolute;
-		right: -9px; top: -9px;
-
-		cursor: pointer;
-		outline: medium none;
-
-		border-width: 1px;
-		border-style: solid;
-		border-color: transparent;
-	}
-
-		.qtip-titlebar .qtip-close{
-			right: 4px; top: 50%;
-			margin-top: -9px;
-		}
-	
-		* html .qtip-titlebar .qtip-close{ top: 16px; } /* IE fix */
-
-		.qtip-titlebar .ui-icon,
-		.qtip-icon .ui-icon{
-			display: block;
-			text-indent: -1000em;
-			direction: ltr;
-		}
-
-		.qtip-icon, .qtip-icon .ui-icon{
-			-moz-border-radius: 3px;
-			-webkit-border-radius: 3px;
-			border-radius: 3px;
-			text-decoration: none;
-		}
-
-			.qtip-icon .ui-icon{
-				width: 18px;
-				height: 14px;
-
-				line-height: 14px;
-				text-align: center;
-				text-indent: 0;
-				font: normal bold 10px/13px Tahoma,sans-serif;
-
-				color: inherit;
-				background: transparent none no-repeat -100em -100em;
-			}
-
-/* Applied to 'focused' tooltips e.g. most recently displayed/interacted with */
-.qtip-focus{}
-
-/* Applied on hover of tooltips i.e. added/removed on mouseenter/mouseleave respectively */
-.qtip-hover{}
-
-/* Default tooltip style */
-.qtip-default{
-	border-width: 1px;
-	border-style: solid;
-	border-color: #F1D031;
-
-	background-color: #FFFFA3;
-	color: #555;
-}
-
-	.qtip-default .qtip-titlebar{
-		background-color: #FFEF93;
-	}
-
-	.qtip-default .qtip-icon{
-		border-color: #CCC;
-		background: #F1F1F1;
-		color: #777;
-	}
-	
-	.qtip-default .qtip-titlebar .qtip-close{
-		border-color: #AAA;
-		color: #111;
-	}
-
-
-
-/*! Light tooltip style */
-.qtip-light{
-	background-color: white;
-	border-color: #E2E2E2;
-	color: #454545;
-}
-
-	.qtip-light .qtip-titlebar{
-		background-color: #f1f1f1;
-	}
-
-
-/*! Dark tooltip style */
-.qtip-dark{
-	background-color: #505050;
-	border-color: #303030;
-	color: #f3f3f3;
-}
-
-	.qtip-dark .qtip-titlebar{
-		background-color: #404040;
-	}
-
-	.qtip-dark .qtip-icon{
-		border-color: #444;
-	}
-
-	.qtip-dark .qtip-titlebar .ui-state-hover{
-		border-color: #303030;
-	}
-
-
-/*! Cream tooltip style */
-.qtip-cream{
-	background-color: #FBF7AA;
-	border-color: #F9E98E;
-	color: #A27D35;
-}
-
-	.qtip-cream .qtip-titlebar{
-		background-color: #F0DE7D;
-	}
-
-	.qtip-cream .qtip-close .qtip-icon{
-		background-position: -82px 0;
-	}
-
-
-/*! Red tooltip style */
-.qtip-red{
-	background-color: #F78B83;
-	border-color: #D95252;
-	color: #912323;
-}
-
-	.qtip-red .qtip-titlebar{
-		background-color: #F06D65;
-	}
-
-	.qtip-red .qtip-close .qtip-icon{
-		background-position: -102px 0;
-	}
-
-	.qtip-red .qtip-icon{
-		border-color: #D95252;
-	}
-
-	.qtip-red .qtip-titlebar .ui-state-hover{
-		border-color: #D95252;
-	}
-
-
-/*! Green tooltip style */
-.qtip-green{
-	background-color: #CAED9E;
-	border-color: #90D93F;
-	color: #3F6219;
-}
-
-	.qtip-green .qtip-titlebar{
-		background-color: #B0DE78;
-	}
-
-	.qtip-green .qtip-close .qtip-icon{
-		background-position: -42px 0;
-	}
-
-
-/*! Blue tooltip style */
-.qtip-blue{
-	background-color: #E5F6FE;
-	border-color: #ADD9ED;
-	color: #5E99BD;
-}
-
-	.qtip-blue .qtip-titlebar{
-		background-color: #D0E9F5;
-	}
-
-	.qtip-blue .qtip-close .qtip-icon{
-		background-position: -2px 0;
-	}
-
-
-
-.qtip-shadow{
-	-webkit-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);
-	-moz-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);
-	box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);
-}
-
-/* Add rounded corners to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE9+, Safari 2+ */
-.qtip-rounded,
-.qtip-tipsy,
-.qtip-bootstrap{
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-	border-radius: 5px;
-}
-
-.qtip-rounded .qtip-titlebar{
-	-moz-border-radius: 4px 4px 0 0;
-	-webkit-border-radius: 4px 4px 0 0;
-	border-radius: 4px 4px 0 0;
-}
-
-/* Youtube tooltip style */
-.qtip-youtube{
-	-moz-border-radius: 2px;
-	-webkit-border-radius: 2px;
-	border-radius: 2px;
-	
-	-webkit-box-shadow: 0 0 3px #333;
-	-moz-box-shadow: 0 0 3px #333;
-	box-shadow: 0 0 3px #333;
-
-	color: white;
-	border-width: 0;
-
-	background: #4A4A4A;
-	background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,black));
-	background-image: -webkit-linear-gradient(top,#4A4A4A 0,black 100%);
-	background-image: -moz-linear-gradient(top,#4A4A4A 0,black 100%);
-	background-image: -ms-linear-gradient(top,#4A4A4A 0,black 100%);
-	background-image: -o-linear-gradient(top,#4A4A4A 0,black 100%);
-}
-
-	.qtip-youtube .qtip-titlebar{
-		background-color: #4A4A4A;
-		background-color: rgba(0,0,0,0);
-	}
-	
-	.qtip-youtube .qtip-content{
-		padding: .75em;
-		font: 12px arial,sans-serif;
-		
-		filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);
-		-ms-filter: "progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);";
-	}
-
-	.qtip-youtube .qtip-icon{
-		border-color: #222;
-	}
-
-	.qtip-youtube .qtip-titlebar .ui-state-hover{
-		border-color: #303030;
-	}
-
-
-/* jQuery TOOLS Tooltip style */
-.qtip-jtools{
-	background: #232323;
-	background: rgba(0, 0, 0, 0.7);
-	background-image: -webkit-gradient(linear, left top, left bottom, from(#717171), to(#232323));
-	background-image: -moz-linear-gradient(top, #717171, #232323);
-	background-image: -webkit-linear-gradient(top, #717171, #232323);
-	background-image: -ms-linear-gradient(top, #717171, #232323);
-	background-image: -o-linear-gradient(top, #717171, #232323);
-
-	border: 2px solid #ddd;
-	border: 2px solid rgba(241,241,241,1);
-
-	-moz-border-radius: 2px;
-	-webkit-border-radius: 2px;
-	border-radius: 2px;
-
-	-webkit-box-shadow: 0 0 12px #333;
-	-moz-box-shadow: 0 0 12px #333;
-	box-shadow: 0 0 12px #333;
-}
-
-	/* IE Specific */
-	.qtip-jtools .qtip-titlebar{
-		background-color: transparent;
-		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A);
-		-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)";
-	}
-	.qtip-jtools .qtip-content{
-		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323);
-		-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)";
-	}
-
-	.qtip-jtools .qtip-titlebar,
-	.qtip-jtools .qtip-content{
-		background: transparent;
-		color: white;
-		border: 0 dashed transparent;
-	}
-
-	.qtip-jtools .qtip-icon{
-		border-color: #555;
-	}
-
-	.qtip-jtools .qtip-titlebar .ui-state-hover{
-		border-color: #333;
-	}
-
-
-/* Cluetip style */
-.qtip-cluetip{
-	-webkit-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
-	-moz-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
-	box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
-
-	background-color: #D9D9C2;
-	color: #111;
-	border: 0 dashed transparent;
-}
-
-	.qtip-cluetip .qtip-titlebar{
-		background-color: #87876A;
-		color: white;
-		border: 0 dashed transparent;
-	}
-	
-	.qtip-cluetip .qtip-icon{
-		border-color: #808064;
-	}
-	
-	.qtip-cluetip .qtip-titlebar .ui-state-hover{
-		border-color: #696952;
-		color: #696952;
-	}
-
-
-/* Tipsy style */
-.qtip-tipsy{
-	background: black;
-	background: rgba(0, 0, 0, .87);
-
-	color: white;
-	border: 0 solid transparent;
-
-	font-size: 11px;
-	font-family: 'Lucida Grande', sans-serif;
-	font-weight: bold;
-	line-height: 16px;
-	text-shadow: 0 1px black;
-}
-
-	.qtip-tipsy .qtip-titlebar{
-		padding: 6px 35px 0 10px;
-		background-color: transparent;
-	}
-
-	.qtip-tipsy .qtip-content{
-		padding: 6px 10px;
-	}
-	
-	.qtip-tipsy .qtip-icon{
-		border-color: #222;
-		text-shadow: none;
-	}
-
-	.qtip-tipsy .qtip-titlebar .ui-state-hover{
-		border-color: #303030;
-	}
-
-
-/* Tipped style */
-.qtip-tipped{
-	border: 3px solid #959FA9;
-
-	-moz-border-radius: 3px;
-	-webkit-border-radius: 3px;
-	border-radius: 3px;
-
-	background-color: #F9F9F9;
-	color: #454545;
-
-	font-weight: normal;
-	font-family: serif;
-}
-
-	.qtip-tipped .qtip-titlebar{
-		border-bottom-width: 0;
-
-		color: white;
-		background: #3A79B8;
-		background-image: -webkit-gradient(linear, left top, left bottom, from(#3A79B8), to(#2E629D));
-		background-image: -webkit-linear-gradient(top, #3A79B8, #2E629D);
-		background-image: -moz-linear-gradient(top, #3A79B8, #2E629D);
-		background-image: -ms-linear-gradient(top, #3A79B8, #2E629D);
-		background-image: -o-linear-gradient(top, #3A79B8, #2E629D);
-		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D);
-		-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)";
-	}
-
-	.qtip-tipped .qtip-icon{
-		border: 2px solid #285589;
-		background: #285589;
-	}
-
-		.qtip-tipped .qtip-icon .ui-icon{
-			background-color: #FBFBFB;
-			color: #555;
-		}
-
-
-/**
- * Twitter Bootstrap style.
- *
- * Tested with IE 8, IE 9, Chrome 18, Firefox 9, Opera 11.
- * Does not work with IE 7.
- */
-.qtip-bootstrap{
-	/** Taken from Bootstrap body */
-	font-size: 14px;
-	line-height: 20px;
-	color: #333333;
-
-	/** Taken from Bootstrap .popover */
-	padding: 1px;
-	background-color: #ffffff;
-	border: 1px solid #ccc;
-	border: 1px solid rgba(0, 0, 0, 0.2);
-	-webkit-border-radius: 6px;
-	-moz-border-radius: 6px;
-	border-radius: 6px;
-	-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-	-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-	box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-	-webkit-background-clip: padding-box;
-	-moz-background-clip: padding;
-	background-clip: padding-box;
-}
-
-	.qtip-bootstrap .qtip-titlebar{
-		/** Taken from Bootstrap .popover-title */
-		padding: 8px 14px;
-		margin: 0;
-		font-size: 14px;
-		font-weight: normal;
-		line-height: 18px;
-		background-color: #f7f7f7;
-		border-bottom: 1px solid #ebebeb;
-		-webkit-border-radius: 5px 5px 0 0;
-		-moz-border-radius: 5px 5px 0 0;
-		border-radius: 5px 5px 0 0;
-	}
-
-		.qtip-bootstrap .qtip-titlebar .qtip-close{
-			/**
-			 * Overrides qTip2:
-			 * .qtip-titlebar .qtip-close{
-			 *   [...]
-			 *   right: 4px;
-			 *   top: 50%;
-			 *   [...]
-			 *   border-style: solid;
-			 * }
-			 */
-			right: 11px;
-			top: 45%;
-			border-style: none;
-		}
-
-	.qtip-bootstrap .qtip-content{
-		/** Taken from Bootstrap .popover-content */
-		padding: 9px 14px;
-	}
-
-	.qtip-bootstrap .qtip-icon{
-		/**
-		 * Overrides qTip2:
-		 * .qtip-default .qtip-icon {
-		 *   border-color: #CCC;
-		 *   background: #F1F1F1;
-		 *   color: #777;
-		 * }
-		 */
-		background: transparent;
-	}
-
-		.qtip-bootstrap .qtip-icon .ui-icon{
-			/**
-			 * Overrides qTip2:
-			 * .qtip-icon .ui-icon{
-			 *   width: 18px;
-			 *   height: 14px;
-			 * }
-			 */
-			width: auto;
-			height: auto;
-
-			/* Taken from Bootstrap .close */
-			float: right;
-			font-size: 20px;
-			font-weight: bold;
-			line-height: 18px;
-			color: #000000;
-			text-shadow: 0 1px 0 #ffffff;
-			opacity: 0.2;
-			filter: alpha(opacity=20);
-		}
-
-		.qtip-bootstrap .qtip-icon .ui-icon:hover{
-			/* Taken from Bootstrap .close:hover */
-			color: #000000;
-			text-decoration: none;
-			cursor: pointer;
-			opacity: 0.4;
-			filter: alpha(opacity=40);
-		}
-
-
-/* IE9 fix - removes all filters */
-.qtip:not(.ie9haxors) div.qtip-content,
-.qtip:not(.ie9haxors) div.qtip-titlebar{
-	filter: none;
-	-ms-filter: none;
-}
-
-
-
-.qtip .qtip-tip{
-	margin: 0 auto;
-	overflow: hidden;
-	z-index: 10;
-	
-}
-
-	/* Opera bug #357 - Incorrect tip position
-	https://github.com/Craga89/qTip2/issues/367 */
-	x:-o-prefocus, .qtip .qtip-tip{
-		visibility: hidden;
-	}
-
-	.qtip .qtip-tip,
-	.qtip .qtip-tip .qtip-vml,
-	.qtip .qtip-tip canvas{
-		position: absolute;
-
-		color: #123456;
-		background: transparent;
-		border: 0 dashed transparent;
-	}
-	
-	.qtip .qtip-tip canvas{ top: 0; left: 0; }
-
-	.qtip .qtip-tip .qtip-vml{
-		behavior: url(#default#VML);
-		display: inline-block;
-		visibility: visible;
-	}
-
-#qtip-overlay{
-	position: fixed;
-	left: 0; top: 0;
-	width: 100%; height: 100%;
-}
-
-	/* Applied to modals with show.modal.blur set to true */
-	#qtip-overlay.blurs{ cursor: pointer; }
-
-	/* Change opacity of overlay here */
-	#qtip-overlay div{
-		position: absolute;
-		left: 0; top: 0;
-		width: 100%; height: 100%;
-
-		background-color: black;
-
-		opacity: 0.7;
-		filter:alpha(opacity=70);
-		-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
-	}
-
diff --git a/sources/WebContent/old/styles/libs/jstree/themes/classic/d.gif b/sources/WebContent/old/styles/libs/jstree/themes/classic/d.gif
deleted file mode 100644
index 6eb0004..0000000
Binary files a/sources/WebContent/old/styles/libs/jstree/themes/classic/d.gif and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jstree/themes/classic/d.png b/sources/WebContent/old/styles/libs/jstree/themes/classic/d.png
deleted file mode 100644
index 275daec..0000000
Binary files a/sources/WebContent/old/styles/libs/jstree/themes/classic/d.png and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jstree/themes/classic/dot_for_ie.gif b/sources/WebContent/old/styles/libs/jstree/themes/classic/dot_for_ie.gif
deleted file mode 100644
index c0cc5fd..0000000
Binary files a/sources/WebContent/old/styles/libs/jstree/themes/classic/dot_for_ie.gif and /dev/null differ
diff --git a/sources/WebContent/old/styles/libs/jstree/themes/classic/style.css b/sources/WebContent/old/styles/libs/jstree/themes/classic/style.css
deleted file mode 100644
index 0351b4c..0000000
--- a/sources/WebContent/old/styles/libs/jstree/themes/classic/style.css
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * jsTree classic theme 1.0
- * Supported features: dots/no-dots, icons/no-icons, focused, loading
- * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search
- */
-
-.jstree-classic li, 
-.jstree-classic ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; }
-.jstree-classic li { background-position:-90px 0; background-repeat:repeat-y;  }
-.jstree-classic li.jstree-last { background:transparent; }
-.jstree-classic .jstree-open > ins { background-position:-72px 0; }
-.jstree-classic .jstree-closed > ins { background-position:-54px 0; }
-.jstree-classic .jstree-leaf > ins { background-position:-36px 0; }
-
-.jstree-classic .jstree-hovered { background:#e7f4f9; border:1px solid #e7f4f9; padding:0 2px 0 1px; }
-.jstree-classic .jstree-clicked { background:navy; border:1px solid navy; padding:0 2px 0 1px; color:white; }
-.jstree-classic a .jstree-icon { background-position:-56px -19px; }
-.jstree-classic .jstree-open > a .jstree-icon { background-position:-56px -36px; }
-.jstree-classic a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; }
-
-.jstree-classic.jstree-focused { background:white; }
-
-.jstree-classic .jstree-no-dots li, 
-.jstree-classic .jstree-no-dots .jstree-leaf > ins { background:transparent; }
-.jstree-classic .jstree-no-dots .jstree-open > ins { background-position:-18px 0; }
-.jstree-classic .jstree-no-dots .jstree-closed > ins { background-position:0 0; }
-
-.jstree-classic .jstree-no-icons a .jstree-icon { display:none; }
-
-.jstree-classic .jstree-search { font-style:italic; }
-
-.jstree-classic .jstree-no-icons .jstree-checkbox { display:inline-block; }
-.jstree-classic .jstree-no-checkboxes .jstree-checkbox { display:none !important; }
-.jstree-classic .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; }
-.jstree-classic .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; }
-.jstree-classic .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; }
-.jstree-classic .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; }
-.jstree-classic .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; }
-.jstree-classic .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; }
-
-#vakata-dragged.jstree-classic ins { background:transparent !important; }
-#vakata-dragged.jstree-classic .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; }
-#vakata-dragged.jstree-classic .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; }
-#jstree-marker.jstree-classic { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; }
-
-.jstree-classic a.jstree-search { color:aqua; }
-.jstree-classic .jstree-locked a { color:silver; cursor:default; }
-
-#vakata-contextmenu.jstree-classic-context, 
-#vakata-contextmenu.jstree-classic-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; }
-#vakata-contextmenu.jstree-classic-context li { }
-#vakata-contextmenu.jstree-classic-context a { color:black; }
-#vakata-contextmenu.jstree-classic-context a:hover, 
-#vakata-contextmenu.jstree-classic-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; }
-#vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a, 
-#vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; }
-#vakata-contextmenu.jstree-classic-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; }
-#vakata-contextmenu.jstree-classic-context li ul { margin-left:-4px; }
-
-/* IE6 BEGIN */
-.jstree-classic li, 
-.jstree-classic ins,
-#vakata-dragged.jstree-classic .jstree-invalid, 
-#vakata-dragged.jstree-classic .jstree-ok, 
-#jstree-marker.jstree-classic { _background-image:url("d.gif"); }
-.jstree-classic .jstree-open ins { _background-position:-72px 0; }
-.jstree-classic .jstree-closed ins { _background-position:-54px 0; }
-.jstree-classic .jstree-leaf ins { _background-position:-36px 0; }
-.jstree-classic .jstree-open a ins.jstree-icon { _background-position:-56px -36px; }
-.jstree-classic .jstree-closed a ins.jstree-icon { _background-position:-56px -19px; }
-.jstree-classic .jstree-leaf a ins.jstree-icon { _background-position:-56px -19px; }
-#vakata-contextmenu.jstree-classic-context ins { _display:none; }
-#vakata-contextmenu.jstree-classic-context li { _zoom:1; }
-.jstree-classic .jstree-undetermined a .jstree-checkbox { _background-position:-20px -19px; }
-.jstree-classic .jstree-checked a .jstree-checkbox { _background-position:-38px -19px; }
-.jstree-classic .jstree-unchecked a .jstree-checkbox { _background-position:-2px -19px; }
-/* IE6 END */
\ No newline at end of file
diff --git a/sources/WebContent/old/styles/libs/jstree/themes/classic/throbber.gif b/sources/WebContent/old/styles/libs/jstree/themes/classic/throbber.gif
deleted file mode 100644
index 5b33f7e..0000000
Binary files a/sources/WebContent/old/styles/libs/jstree/themes/classic/throbber.gif and /dev/null differ
diff --git a/sources/WebContent/old/styles/tooltip.css b/sources/WebContent/old/styles/tooltip.css
deleted file mode 100644
index 593f61b..0000000
--- a/sources/WebContent/old/styles/tooltip.css
+++ /dev/null
@@ -1,63 +0,0 @@
-/* 
-    Document   : tooltip
-    Created on : 20.4.2012, 1:27:56
-    Author     : Jindra Pavl�kov� <jindra.pav2@seznam.cz>
-    Description:
-        Purpose of the stylesheet follows.
-*/
-
-.qtip-green{
-    font-family: sans-serif;
-    font-size: 10pt;
-}
-
-.qtip-green .qtip-content {
-    padding: 10px;
-    border-width: 2px;
-}
-
-.qtip-green .qtip-content ul {
-    padding: 0px;
-    margin: 0px 10px 0px 10px !important;
-    list-style-position: inside;
-}
-.qtip-green .qtip-content ul li{
-    margin: 0px;
-    padding: 0px;
-    margin-bottom: 5px;
-   /* max-width: 500px;*/
-   /*    list-style-position: inside;*/
-}
-
-.compatibility-list li {
-    white-space: nowrap;
-}
-
-.qtip-green .qtip-content ul.tooltip_vertex_left{
-    float: left;
-}
-
-.qtip-green .qtip-content ul.tooltip_vertex_right{
-    float: left;
-    margin-left: 20px;
-}
-
-.qtip-green .qtip-content li.tooltip_export_package {
-    margin-left: -10px;
-    font-weight: bold;
-    list-style-type: none;
-}
-.qtip-green .qtip-content li.tooltip_import_package {
-    margin-left: -10px;
-    font-weight: bold;
-    list-style-type: none;
-}
-
-.qtip-content img {
-	margin-right: 3px;
-}
-
-/*.qtip-green ul {
-    overflow: scroll;
-    max-height: 200px;
-}*/
\ No newline at end of file
diff --git a/sources/WebContent/old/styles/tree.css b/sources/WebContent/old/styles/tree.css
deleted file mode 100644
index 3a89369..0000000
--- a/sources/WebContent/old/styles/tree.css
+++ /dev/null
@@ -1,35 +0,0 @@
-/* 
-    Document   : tree
-    Created on : 2.12.2013
-    Author     : Jiri Loudil
-    Description:
-        Purpose of the stylesheet follows.
-*/
-
-.jstree-classic { 
-	background-color: #CAED9E !important;
-}
-
-.ui-tooltip-with-efp ul ul {
-	/* hack for indention of efp leaves w/o jstree*/
-    padding-left : 4em !important;
-    margin-left : 0 !important;
-}
-
-.jstree ul ul {
-	/* hack for indention of efp leaves with jstree */
-    padding-left : 1em !important;
-    margin-left : 0 !important;
-}
-
-.featureListItem {
-	font-weight: bold;
-}
-
-.efpListLabel {
-	font-weight: bold;
-}
-
-.jstree a {
-	color: #3F6219 !important;
-}
\ No newline at end of file
