[3829] trunk/htdocs/system: trunk merge from tags_as_terms branch, and this time I think it worked.

0 views
Skip to first unread message

svn-N...@habariproject.org

unread,
Nov 24, 2009, 11:45:08 PM11/24/09
to habar...@googlegroups.com
Revision
3829
Author
mikelietz
Date
2009-11-25 04:45:07 +0000 (Wed, 25 Nov 2009)

Log Message

trunk merge from tags_as_terms branch, and this time I think it worked. r3758:HEAD

Modified Paths

Added Paths

Removed Paths

Property Changed

Diff

Deleted: trunk/htdocs/system/admin/css/admin.css (3828 => 3829)


--- trunk/htdocs/system/admin/css/admin.css	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/admin/css/admin.css	2009-11-25 04:45:07 UTC (rev 3829)
@@ -1,2655 +0,0 @@
-/*
- * Name: Habari Admin Stylesheet
- * Author: Habari Community
- * License: Apache License 2.0
- */
-
-/*- RESET, courtesy of http://www.blueprintcss.org/ */
-html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
-table {border-collapse:separate;border-spacing:0;}
-caption, th, td {text-align:left;font-weight:normal;}
-table, td, th {vertical-align:middle;}
-fieldset {padding:1.4em;margin:1em 0 1.5em 0;border:1px solid #ccc;}
-
-/*- THE BASICS */
-
-html {
-	overflow-y: scroll; /* To prevent 'popping' */
-}
-
-body {
-	background-color: #f0f0f0;
-	color: #000;
-	font-size: 75%;
-	font-family: "Helvetica Neue", Helvetica, "Lucida Grande", Arial, Verdana, Sans-Serif;
-}
-
-a img {
-	border: none;
-}
-
-
-/*- OPACITY PERCENTAGES */
-.opa0 { opacity: 0; }
-.opa10 { opacity: .10; }
-.opa15 { opacity: .15; }
-.opa20 { opacity: .20; }
-.opa25 { opacity: .25; }
-.opa30 { opacity: .30; }
-.opa35 { opacity: .35; }
-.opa40 { opacity: .40; }
-.opa45 { opacity: .45; }
-.opa50 { opacity: .50; }
-.opa55 { opacity: .55; }
-.opa60 { opacity: .60; }
-.opa65 { opacity: .65; }
-.opa70 { opacity: .70; }
-.opa75 { opacity: .75; }
-.opa80 { opacity: .80; }
-.opa85 { opacity: .85; }
-.opa90 { opacity: .90; }
-.opa95 { opacity: .95; }
-.opa100 { opacity: 1; }
-
-
-/*- WIDTH PERCENTAGES */
-
-.pct5, .pct10, .pct15, .pct20, .pct25, .pct30, .pct35, .pct40, .pct45, .pct50, .pct55, .pct60, .pct65, .pct70, .pct75, .pct80, .pct85, .pct90, .pct95, .pct100 {
-	float: left;
-}
-.pct5 { width: 5%; }
-.pct10 { width: 10%; }
-.pct15 { width: 15%; }
-.pct20 { width: 20%; }
-.pct25 { width: 25%; }
-.pct30 { width: 30%; }
-.pct35 { width: 35%; }
-.pct40 { width: 40%; }
-.pct45 { width: 45%; }
-.pct50 { width: 50%; }
-.pct55 { width: 55%; }
-.pct60 { width: 60%; }
-.pct65 { width: 65%; }
-.pct70 { width: 70%; }
-.pct75 { width: 75%; }
-.pct80 { width: 80%; }
-.pct85 { width: 85%; }
-.pct90 { width: 90%; }
-.pct95 { width: 95%; }
-.pct100 { width: 100%; }
-
-.error {
-	color: #FF4500;
-}
-
-
-/*- THE MENUBAR */
-
-#menubar {
-	background: #1a1a1a;
-	position: fixed;
-	width: 100%;
-	height: 32px;
-	top: 0;
-	left: 0;
-	z-index: 1000;
-	opacity: 1; /* was .98 - see issue #588 */
-}
-
-#menubar a {
-	color: #fff;
-	outline: none;
-}
-
-#site {
-	position: absolute;
-	top: 5px;
-	right: 20px;
-	font: 18px 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
-	line-height: 22px;
-}
-
-
-/*- THE MENU */
-
-#menu {
-	position: fixed;
-	top: 0;
-	left: 0;
-	width: 180px;
-	padding: 5px 0 0;
-	margin-left: 5px;
-	height: 27px;
-}
-
-#menu a:hover, #menu a {
-	text-decoration: none;
-}
-
-#menu a .hotkey {
-	display:none;
-	color: #777;
-	position: absolute;
-	top: 0;
-	right: 30px;
-	width: 15px;
-	text-align: center;
-}
-
-#menu a .hotkey.enabled {
-	display: block;
-}
-
-#menubutton {
-	font-size: 12px;
-	position: absolute;
-	width: 100%;
-	height: 22px;
-	background: #2b2b2b;
-	border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-}
-
-#menubutton a {
-	line-height: 22px;
-	display: block;
-	padding: 0 30px 0 10px;
-	background: url(../images/arrowdown.png) 160px center no-repeat;
-}
-
-#menubutton a:first-letter {
-	text-transform: uppercase;
-}
-
-#menu #menulist ul {
-	background: #2b2b2b;
-	border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	padding: 5px 0;
-	opacity: 1; /* was .99 - see issue #588 */
-	display: none;
-	box-shadow: 0px 2px 20px #111;
-	-webkit-box-shadow: 0px 2px 20px #111;
-	-moz-box-shadow: 0px 2px 20px #111;
-	list-style-type: none;
-	list-style-position: outside;
-	margin-bottom: 0;
-	top: -5px;
-	z-index: -1; /* Even with the main menu (its parent), so shadows don't get messed up */
-}
-
-#menu #menulist > ul {
-	position: absolute;
-	top: 28px;
-	width: 100%;
-}
-
-#menu.hovering #menulist, #menu.hovering #menulist > ul, #menu:hover #menulist > ul, #menu:hover #menulist > ul li.submenu:hover ul.submenu, #menu.hovering #menulist > ul li.submenu.carrot ul.submenu {
-	display: block;
-}
-
-#menu.hovering #menulist li li, #menu:hover #menulist li li {
-	display: none;
-}
-
-#menu:hover #menulist li:hover li, #menu #menulist li.carrot li {
-	display: block;
-}
-
-#menu #menulist li ul {
-	position: absolute;
-	left: 100%;
-	top: 0;
-	width: 100%;
-	background: #2b2b2b;
-	border-bottom-left-radius: 0;
-	border-top-left-radius: 0;
-	-moz-border-radius-topleft: 0;
-	-moz-border-radius-bottomleft: 0;
-	-webkit-border-bottom-left-radius: 0;
-	-webkit-border-top-left-radius: 0;
-	padding-top:0;
-	padding-bottom:0;
-}
-
-#menulist li {
-	position: relative;
-	background: #2b2b2b;
-	font-size: 11px;
-	line-height: 25px;
-}
-
-#menulist li a {
-	display: block;
-	padding: 0 45px 0 20px;
-	height: 25px;
-	white-space: nowrap;
-	text-overflow: ellipsis;
-	overflow: hidden;
-}
-
-#menulist li.submenu a.top {
-	background: url('../images/arrowright.png') 163px center no-repeat;
-}
-
-#menulist li.submenu li:first-child, #menulist li.submenu li:first-child a {
-	border-top-right-radius: 5px;
-	-moz-border-radius-topright: 5px;
-	-webkit-border-top-right-radius: 5px;
-}
-
-#menulist li.submenu li:last-child, #menulist li.submenu li:last-child a {
-	border-bottom-right-radius: 5px;
-	-moz-border-radius-bottomright: 5px;
-	-webkit-border-bottom-right-radius: 5px;
-}
-
-#menulist li.carrot a.top, #menulist li:hover a.top, #menulist li a:hover, #menulist li li.carrot a {
-	background-color: #444;
-}
-
-#menulist li.selected a {
-	background: url('../images/currentpageindicator.png') 8px center no-repeat;
-}
-
-#menulist li.selected a:hover, #menulist li.selected.carrot a {
-	background: #444 url('../images/currentpageindicator.png') 8px center no-repeat;
-}
-
-#menulist li#link-tags, #menulist li#link-logs {
-	padding-bottom: 5px;
-}
-
-#menulist li#link-dashboard, #menulist li#link-logout {
-	border-top: 1px solid #444;
-	padding-top: 5px;
-}
-
-#menulist li#link-dashboard .hotkey, #menulist li#link-logout .hotkey {
-	top: 6px;
-}
-
-
-/* DROPBUTTONS */
-
-#page .dropbutton {
-	float: right;
-	min-width: 8em;
-	max-width: 16em;
-	white-space: nowrap;
-	background: #333;
-	border-radius: 3px;
-	-webkit-border-radius: 3px;
-	-moz-border-radius: 3px;
-	font-size: 9px;
-	list-style: none outside;
-	margin: 0 0 0 10px;
-	position: absolute;
-/*	top: 10px;*/
-	right: 40px;
-}
-
-#page .dropbutton:hover {
-	z-index: 1000;
-}
-
-#page .dropbutton * {
-	cursor: pointer;
-}
-
-#page .dropbutton.alert {
-/*	background: #FF4500; */
-	background: #AA0000;
-}
-
-#page .comments-action.dropbutton{
-	right:170px;
-}
-#page .comments-action.dropbutton.alert {
-/*	background: #FF4500; */
-	background: #AA0000;
-	right:40px;
-}
-
-#page .dropbutton li {
-	padding: 0 5px;
-	display: none;
-}
-
-#page .dropbutton li.first-child {
-	display: block;
-}
-
-#page .dropbutton:hover li,
-#page .dropbutton.hovering li {
-	display: block;
-}
-
-#page .dropbutton a, #page .dropbutton button, #page .dropbutton input {
-	color: white;
-	font-weight: normal;
-	display: block;
-	padding-right: 20px;
-	line-height: 16px;
-	text-overflow: ellipsis;
-	overflow: hidden;
-	font-size: 9px;
-	font-family: 'Helvetica Neue', Helvetica, 'Lucida Grande', Arial, Verdana, Sans-Serif;
-	padding-left: 0px;
-	outline: none;
-}
-
-#page .dropbutton button {
-	border: none;
-	background: none;
-	font-size: 9px;
-	font-family: 'Helvetica Neue', Helvetica, 'Lucida Grande', Arial, Verdana, Sans-Serif;
-	padding: 0px;
-	height: auto;
-}
-
-#page .dropbutton li.first-child {
-	border-top-right-radius: 3px;
-	border-top-left-radius: 3px;
-	-webkit-border-top-right-radius: 3px;
-	-webkit-border-top-left-radius: 3px;
-	-moz-border-radius-topright: 3px;
-	-moz-border-radius-topleft: 3px;
-}
-
-#page .dropbutton li.last-child {
-	border-bottom-right-radius: 3px;
-	border-bottom-left-radius: 3px;
-	-webkit-border-bottom-right-radius: 3px;
-	-webkit-border-bottom-left-radius: 3px;
-	-moz-border-radius-bottomright: 3px;
-	-moz-border-radius-bottomleft: 3px;
-}
-
-#page .dropbutton li:hover {
-	background: #555;
-}
-
-#page .dropbutton li.first-child a {
-	/* Add dropdown indicator to first child */
-	background: url(../images/arrowdown.png) right 6px no-repeat;
-	border-top-right-radius: 3px;
-	border-top-left-radius: 3px;
-	-webkit-border-top-right-radius: 3px;
-	-webkit-border-top-left-radius: 3px;
-	-moz-border-radius-topright: 3px;
-	-moz-border-radius-topleft: 3px;
-}
-
-#page .dropbutton li.first-child.last-child a {
-	/* No dropdown indicator if only one <li> */
-	background: none;
-	padding-right: 0;
-}
-
-
-/*- GENERAL STRUCTURE & STYLING */
-
-#page {
-	margin-top: 50px;
-}
-
-#page .container {
-/*	width: 70%;
-	min-width: 750px;
-	max-width: 900px;*/
-	width: 750px;
-	margin: 10px auto;
-	padding: 15px 40px;
-	background: #fafafa;
-	border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	box-shadow: 0px 1px 15px #ddd;
-	-webkit-box-shadow: 0px 1px 15px #ddd;
-	-moz-box-shadow: 0px 1px 15px #ddd;
-	border: 1px solid #e7e7e7;
-}
-
-#page .container.transparent {
-	background: transparent;
-	border: none;
-	padding-top: 0;
-	padding-bottom: 0;
-	box-shadow: none;
-	-webkit-box-shadow: none;
-	-moz-box-shadow: none;
-}
-
-#page .container h2 {
-	font: 1.6em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
-	color: #333;
-	text-transform: capitalize;
-}
-
-#page .container h3 {
-	font-size: 1.2em;
-	color: #333;
-}
-
-#page .container h3 a {
-	font-weight: bold;
-}
-
-#page input[type=button], #page input[type=submit], #page button {
-	padding: 2px 4px 2px 4px;
-	cursor: pointer;
-	border-radius: 9px;
-	-webkit-border-radius: 9px;		/* Webkit only supports up to 9px at present */
-	-moz-border-radius: 9px;
-	font-size: 10px;
-	background: transparent url('../images/button_background.png') repeat-x;
-	border: 1px solid #b3b3b3;
-}
-
-#page input[type=button]:hover, #page input[type=submit]:hover, #page button:hover {
-	border: 1px solid #555;
-	background-position: 0 -30px;
-}
-
-.item {
-	position: relative;
-	padding: 10px 0 10px;
-	border-bottom: 1px solid #eee;
-	margin-left: -40px;
-	padding-left: 40px;
-	margin-right: -40px;
-	padding-right: 40px;
-}
-
-.item.selected {
-	background-color:#fffde2;
-}
-
-.item.hide {
-	display: none;
-}
-
-.item.last-child {
-	border: none;
-}
-
-.item .head {
-	margin-bottom: 5px;
-	font-size: 1.1em;
-}
-
-.item .head a {
-	font-weight: bold;
-	color: #333;
-}
-
-span.dim {
-	font-weight: normal;
-	color: #555;
-}
-
-.item .description, .item .content, .item .type {
-	color: #555;
-	overflow-x: auto;
-}
-
-a, a:visited, a:hover {
-	color: #333;
-	text-decoration: none;
-}
-
-a:hover {
-	text-decoration: underline;
-}
-
-#page .dropbutton a {
-	text-decoration: none;
-}
-
-#page .dropbutton a.active, #pluginconfigure a {
-	text-decoration: underline;
-}
-#page .dropbutton a.active,
-#page .dropbutton.hovering li.first-child a.active {
-	background: url('../images/currentpageindicator.png') right center no-repeat;
-}
-
-
-.border {
-	border: 1px solid #bbb;
-	margin: 0;
-}
-
-.minor, .minor a {
-	font-size: 11px;
-	font-weight: normal;
-}
-
-a.minor {
-	color: #999;
-	padding-left: 5px;
-}
-
-.or, .conjunction {
-	font-size: 1.3em;
-	line-height: 16px;
-	color: #aaa;
-	text-align: center;
-}
-
-.selectedtext {
-	color: #999;
-	margin-left: 10px;
-	top: 0;
-}
-
-ul {
-	list-style-type: none;
-	list-style-position: outside;
-	margin: 0;
-	padding: 0;
-}
-
-#spinner {
-	position: fixed;
-	top: 40px;
-	right: 8px;
-	z-index: 100;
-}
-
-/*- FORMS */
-
-input, textarea {
-	color: #333;
-}
-
-textarea {
-	width: 100%;
-	line-height: 1.3em;
-}
-
-select {
-	width: 98%;
-}
-
-label.abovecontent {
-	font-size: 9px;
-	line-height: 10px;
-	background: #d4d4d4;
-	padding: 1px 10px 2px;
-	color: #444;
-	font-weight: normal;
-	border-top-left-radius: 5px;
-	border-top-right-radius: 5px;
-	-webkit-border-top-left-radius: 5px;
-	-webkit-border-top-right-radius: 5px;
-	-moz-border-radius-topleft: 5px;
-	-moz-border-radius-topright: 5px;
-	position: absolute;
-	margin-top: -13px;
-	margin-left: 5px;
-	z-index: 2;
-}
-
-label.overcontent {
-	font-weight: normal;
-	position: absolute;
-	width: auto;
-	cursor: text;
-	box-shadow: none;
-	-webkit-box-shadow: none;
-	-moz-box-shadow: none;
-}
-
-p:hover > label.abovecontent {
-	display: block;
-}
-
-/*-- FORM BUTTONS  */
-
-.button, #save input, button {
-	min-width: 110px;
-	margin-left: 10px;
-	float: right;
-}
-
-body.page-comments .button{
-	float:none;
-}
-
-.button.delete, .formcontrol.delete input {
-	float: left;
-	}
-
-.button#delete {
-	float: left;
-	margin-left: 0;
-	margin-right: 10px;
-}
-
-.button.submit {
-	float: left;
-	margin-left: 10px;
-	margin-right: 0;
-}
-
-.comments .button.delete {
-	float: none;
-}
-
-.comments .buttons {
-	float: right;
-}
-
-.button.publish {
-	font-weight: bold;
-}
-
-.buttons .formcontrol {
-	display: inline;
-}
-
-
-/*- CREATE */
-#page .create {
-	margin-top: 70px;
-}
-
-#page .create .container > p {
-	margin: 0;
-}
-
-.create input.text, .create textarea, .create label.overcontent {
-	font-family: 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Helvetica, Arial, Sans-Serif;
-	padding: 3px 5px;
-	margin: 0 0 0 -6px;
-	width: 100%;
-	border-radius: 3px;
-	-webkit-border-radius: 3px;
-	-moz-border-radius: 3px;
-}
-
-.create label.overcontent {
-	text-transform: lowercase;
-	color: #aeaeae;
-	width: 759px;
-}
-
-create input.text, .create label.overcontent {
-	font-size: 1.1em;
-}
-
-.create input.text.important, .create label.important.overcontent {
-	font-size: 1.7em;
-}
-
-.create input.text:focus {
-	color: #222;
-}
-
-body.page-publish .buttons input {
-	float: right;
-}
-
-.create textarea {
-	padding: 5px;
-	font-size: 14px;
-}
-
-.create label.textarea.overcontent {
-	padding: 5px;
-}
-
-.grip {
-	height: 10px;
-	cursor: row-resize;
-	background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAADCAYAAAAuu3lbAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACRJREFUeNpivHLlyn+GUYABGP//Hw0XbIDl6tWroyGDBQAEGADRQAn91uPxnQAAAABJRU5ErkJggg==') center center no-repeat; /* Double line 'grip' */
-}
-
-#tags_list ul {
-	text-align: left;
-	margin-right: 50px;
-	margin-left: 10px;
-	}
-
-#tags_list ul li {
-	font-family: "Arial", san-serif;
-	font-size: 0.8em;
-	display: inline;
-	line-height: 2.0em;
-	padding: 3px;
-	color: #ccc;
-	cursor: pointer;
-	}
-
-#tags_list ul li.clicked {
-	background: #000;
-	}
-
-.viewpost {
-	float: right;
-}
-
-
-/*- MEDIA SILOS */
-
-.mediasplitter {
-	border-bottom: 1px solid white;
-}
-
-.mediasplitter .splitterinside {
-	padding: 13px 0px 0px;
-	color: #848484;
-	padding: 0;
-	background: #262626;
-	height: 240px;
-}
-
-.mediasplitter td {
-	padding: 0;
-}
-
-#mediatabs a {
-	background: no-repeat 5% 50%;
-}
-
-#mediatabs.iconify a {
-	width: 30px;
-	background-position: 50% 50%;
-	text-indent: -10000px;
-}
-
-#mediatabs.iconify li.ui-tabs-selected a {
-	width: 110px;
-	text-indent: 0;
-	background-position: 5% 50%;
-}
-
-/* -- TOOLBAR */
-
-.media_controls {
-	background: #474747 url('../images/shadow-heavy-top.png') top repeat-x;
-	padding: 15px 5px 5px;
-	height: 25px;
-}
-
-.media_controls a {
-	color: white;
-	text-decoration: none;
-}
-
-.media_controls ul {
-	position: absolute;
-	top: 18px;
-	left: 10px;
-}
-
-.media_controls li {
-	list-style: none;
-	margin-right: 15px;
-	display: block;
-	float: left;
-}
-
-.media_controls input[type=search] {
-	width: 270px;
-	margin-left: 5px;
-}
-
-.media_controls .upload {
-	position: absolute;
-	top: 16px;
-	right: 10px;
-}
-
-.media_controls .upload input[type=file] {
-	margin-right: 5px;
-	color: #888;
-}
-
-/* -- MEDIA BROWSER */
-
-.media_browser {
-	height: 195px;
-	overflow-x: scroll;
-	overflow-y: hidden;
-	position: relative;
-	background: url('../images/shadow-light-top.png') top right repeat-x; /* Drop shadow */
-}
-
-/* -- MEDIA DIRECTORIES */
-
-.media_dirlevel {
-	float: left;
-	height: inherit;
-	overflow-y: auto;
-	overflow-x: hidden;
-	background: url('../images/shadow-light-left.png') repeat-y;
-	height: 180px;
-	border-right: 1px solid #333;
-}
-
-.media_dirlevel ul {
-	max-width: 250px;
-	list-style-position: outside;
-	list-style-type: none;
-}
-
-.media_dirlevel:first-child {
-	background: #262626;
-}
-
-.media_dirlevel li {
-	min-width: 70px;
-	background: url(../images/arrowright.png) right center no-repeat;
-	cursor: pointer;
-	color: #888;
-	padding: 0px 15px 0px 10px;
-	font: 11px/20px 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
-	white-space: nowrap;
-	text-overflow: ellipsis;
-	overflow: hidden;
-}
-
-.media_dirlevel li:first-child {
-	margin-top: 1px;
-}
-
-.media_dirlevel li:hover, .media_dirlevel li.active {
-	background: #333 url(../images/arrowright.png) right center no-repeat;
-}
-
-.media_dirlevel li.active {
-	color: white;
-}
-
-
-/* -- MEDIA LISTING */
-
-.mediaphotos {
-	display: table;
-}
-
-.mediaphotos > ul {
-	display: table-row;
-}
-
-.mediaphotos > ul li {
-	display: table-cell;
-	font-size: 0.8em;
-	overflow: hidden;
-	border-right: 1px solid #303030;
-	padding: 0 10px;
-	min-width: 30px;
-	position: relative;
-}
-
-.mediaphotos > ul li.first {
-	background: url('../images/shadow-light-left.png') left repeat-y;
-}
-
-.mediaphotos > ul li.end {
-	border: none;
-	font-size: 3em;
-	line-height: 10px;
-	vertical-align: middle;
-	white-space: nowrap;
-	color: #444;
-	height: 180px;
-	width: 100px;
-	background: url('../images/shadow-light-left.png') left repeat-y}
-
-.mediaphotos > ul li:hover {
-	background: #111;
-}
-
-.mediaphotos > ul li.end:hover {
-	background: url('../images/shadow-light-left.png') left repeat-y}
-
-.mediaphotos li.media .foroutput {
-	display: none;
-}
-
-.mediaphotos li.media .mediatitle {
-	line-height: 35px;
-	white-space: nowrap;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-
-.mediaphotos li.media .mediatitle:after { /* Helps Safari if there is no title */
-	-webk-content: '\000001';
-}
-
-.mediaphotos li.media .medialink {
-	background: url('../images/medialink.png') no-repeat;
-	width: 10px;
-	height: 9px;
-	text-indent: -3000px;
-	margin-top: 12px;
-	float: right;
-}
-
-.mediaphotos li.media img {
-	margin: 0 0 -3px;
-	height: 100px;
-	border: 1px solid #fff;
-	cursor: pointer;
-	max-width: 300px;
-	min-width: 30px;
-}
-
-.mediaphotos li.media:last-child img {
-	border-left: 1px solid white;
-}
-
-.mediaphotos li.media img.loading {
-	border-color: #333;
-	width: 100%;
-	background: #303030;
-}
-
-.mediaphotos li.media .mediastats {
-	padding-left: 5px;
-	height: 42px;
-}
-
-.media_panel {
-	min-height: 200px;
-	margin: 10px;
-}
-
-.media_panel #submit
-{
-	margin: 10px auto;
-}
-
-.media_panel p
-{
-	padding: 5px 0px;
-}
-
-.media_panel #simple_upload_frame
-{
-	display:none;
-}
-
-/*-- MEDIA ACTION DROPBUTTONS */
-
-.mediaactions.dropbutton {
-	position: relative !important; 
-	right: 0px !important; 
-	min-width: 100% !important;  
-	opacity: .8;
-}
-
-.mediastats {
-	display: none;
-}
-
-
-/*-- VIDDLER SILO */
-
-.viddler_recorder_container {
-	text-align: center;
-	padding: 15px 0;
-	background: url('../images/shadow-light-top.png') top right repeat-x; /* Drop shadow */
-}
-
-
-/*- DASHBOARD */
-
-#page .dashboardinfo {
-	padding: 5px 0 0;
-	background: none;
-	color: #444;
-	font: 1.4em/1.4em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
-	text-align: center;
-}
-
-#page .dashboardinfo p {
-	margin-bottom: 15px;
-}
-
-#page .dashboardinfo a {
-	font-weight: bold;
-	color: #444;
-}
-
-#page .dashboard {
-	min-width: 820px;
-	max-width: 920px;
-	width: 80%;
-	background: none;
-	padding: 0;
-	margin-top: 0;
-	margin-bottom: 0;
-}
-
-.dashboard .module {
-	position: relative;
-	float: left;
-	width: 50%;
-	height: 260px;
-}
-
-.dashboard .module.add-item-module {
-	height: 65px;
-}
-
-.dashboard .module .modulecore,
-.dashboard .module .optionswindow {
-	height: 195px;
-	margin: 5px;
-	padding: 45px 0px 10px;
-	position: relative;
-	overflow: hidden;
-	background: #fafafa;
-	border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	box-shadow: 0px 1px 15px #ddd;
-	-webkit-box-shadow: 0px 1px 15px #ddd;
-	-moz-box-shadow: 0px 1px 15px #ddd;
-	border: 1px solid #E7E7E7;
-}
-
-.dashboard .module .handle {
-	background: url('../images/dashboardhandle.png') center center no-repeat;
-	position: absolute;
-	top: 16px;
-	left: 5%;
-	height: 20px;
-	width: 90%;
-	z-index: 90;
-	cursor: move;
-}
-
-.dashboard .module h2 {
-	z-index: 100;
-	background: url('../images/dashboardh2bg.png') right center no-repeat;
-	padding-right: 10px;
-	position: absolute;
-	top: 15px;
-	left: 20px;
-	font-size: 1.5em;
-	line-height: 22px;
-}
-
-.dashboard .item {
-	line-height: 24px;
-	border-bottom: 1px solid #e9e9e9;
-	color: #666;
-	width: 94%;
-	padding: 0 3%;
-	margin: 0;
-}
-
-.dashboard .item.last-child {
-	border: none;
-}
-
-.dashboard .item a {
-	color: #555;
-	font-weight: bold;
-}
-
-.dashboard .item span {
-	float: left;
-	white-space: nowrap;
-	text-overflow: ellipsis;
-	overflow: hidden;
-}
-
-.dashboard .item span.author {
-	font-size: .8em;
-}
-
-.dashboard .item span.author span {
-	margin-left: 5px;
-}
-
-.dashboard .item span.comments {
-	text-align: right;
-}
-
-.dashboard .module.add-item-module .modulecore {
-	height: 0px;
-}
-
-.dashboard .module.add-item-module h2, .dashboard .module.add-item-module form {
-	position: absolute;
-	top: 16px;
-}
-
-.dashboard .module.add-item-module form {
-	left: 120px;
-}
-
-.dashboard .module.add-item-module select {
-	width: 230px;
-}
-.dashboard .module.add-item-module .formcontrol {
-	display: inline;
-}
-
-.dashboard .modulecore ul li {
-	list-style-type: none;
-	clear: both;
-}
-
-.dashboard .module .close {
-	position: absolute;
-	top: 7px;
-	left: 7px;
-	height: 16px;
-	width: 16px;
-	background: url('../images/closebutton.png') center center no-repeat;
-	cursor: pointer;
-	z-index: 110;
-}
-
-.dashboard .module .options {
-	position: absolute;
-	top: 7px;
-	right: 7px;
-	height: 16px;
-	width: 16px;
-	background: url('../images/moduleoptions.png') center center no-repeat;
-	cursor: pointer;
-	z-index: 110;
-}
-
-.dashboard .module .optionswindow {
-	z-index: 100;
-	height: 195px;
-	background: #111;
-	color: #555;
-	display: none;
-}
-
-.dashboard .module.viewingoptions .optionswindow {
-	display: block;
-}
-
-.dashboard .module.viewingoptions .modulecore {
-	display: none;
-}
-
-.dashboard .optionscontent {
-	overflow-y: auto;
-	overflow-x: hidden;
-	height: 175px;
-	padding: 10px;
-}
-
-.dashboard .optionscontent p {
-	padding-bottom: 10px;
-}
-
-.dashboard .optionscontent p.buttons {
-	margin-top: 25px;
-	text-align: right;
-}
-
-.dashboard .optionscontent label {
-	text-align: right;
-	padding-right: 5%;
-}
-
-.dashboard .module.viewingoptions .handle {
-	opacity: .3;
-}
-
-#page .dashboard .module.viewingoptions .optionswindow h2 {
-	background: url('../images/dashboardh2bgdark.png') right center no-repeat;
-	color: #eee;
-}
-
-
-/*-- DASHBOARD - LATEST COMMENTS MODULE */
-.dashboard .latest-comments-module .item {
-
-}
-
-.dashboard .latest-comments-module .item > span {
-	float: left;
-}
-
-.dashboard .latest-comments-module .titleanddate {
-	margin-top: 5px;
-	line-height: 16px;
-	color: #999;
-}
-
-.dashboard .latest-comments-module ul {
-	margin-bottom: 5px;
-	line-height: 13px;
-	white-space: nowrap;
-	text-overflow: ellipsis;
-	overflow: hidden;
-}
-
-.dashboard .latest-comments-module ul.commentauthors li {
-	display: inline;
-}
-
-.dashboard .latest-comments-module ul li:after {
-	content: ', ';
-}
-
-.dashboard .latest-comments-module ul li.last-child:after {
-	content: '';
-}
-
-.dashboard .latest-comments-module .commentauthors a:hover {
-	opacity: 1;
-}
-
-.dashboard .latest-comments-module .item span.comments {
-	float: right;
-}
-
-.dashboard .latest-comments-module .comments {
-	line-height: 34px;
-	font-size: 24px;
-}
-
-/* Dashmodules Tables */
-
-.modules table	{
-	width: 100%;
-}
-
-.modules table th {
-	padding-left: 15px;
-}
-
-.modules table th, .modules table td {
-	border-bottom: 1px solid #e9e9e9;
-}
-
-tr.status_item {
-	color: #666;
-	line-height: 24px;
-}
-
-#dash_status .label {
-	width: 75%;
-	color: #555;
-	font-weight: bold;
-}
-
-
-
-/* LOGS PAGE */
-
-body.page-logs .time, body.page-logs .user, body.page-logs .ip, body.page-logs .module, body.page-logs .severity {
-	white-space: nowrap;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-
-body.page-logs .item select {
-	margin-right: 10px;
-}
-
-body.page-logs .item {
-	padding: 3px 0 3px 2px;
-}
-
-body.page-logs .item input[type=checkbox] {
-	margin-left: 10px;
-}
-
-body.page-logs .item .message {
-	cursor: help;
-}
-
-body.page-logs .item .more, body.page-logs .item.expanded .less {
-	display: none;
-}
-
-body.page-logs .item.expanded .more {
-	display: block;
-}
-
-
-/*- USERS & GROUPS PAGES */
-
-body.page-users .navigation {
-	margin-bottom: 20px;
-}
-
-body.page-users .container.users {
-	padding-top: 10px;
-	padding-bottom: 10px;
-}
-
-body.page-users .item .user {
-	font-size: 1.3em;
-	line-height: 16px;
-	font-weight: bold;
-}
-
-body.page-users .item .user a {
-	color: #444;
-}
-
-body.page-groups .allgroups .users, body.page-users .item .aka, body.page-users .item .userlogin {
-	color: #999;
-}
-
-body.page-users .item .aka, body.page-users .item .userlogin {
-	font-size: 11px;
-}
-
-body.page-users .item strong {
-	color: #777;
-	padding: 0 2px;
-}
-
-body.page-users .item span {
-	white-space: nowrap;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-
-body.page-users .addnewuser {
-	position: relative;
-	border-top-left-radius: 5px;
-	border-top-right-radius: 5px;
-	-moz-border-radius-topright: 5px;
-	-moz-border-radius-topleft: 5px;
-	-webkit-border-top-left-radius: 5px;
-	-webkit-border-top-right-radius: 5px;
-	background: #f3f3f3;
-	margin: -10px -40px 0 -40px;
-	padding: 16px 40px 15px 80px;
-}
-
-.addnewuser input[type=text], .addnewuser input[type=password] {
-	margin-right: 5px;
-	margin-left: -5px;
-	margin-top: -1px;
-	padding: 3px;
-	width: 140px;
-}
-
-.addnewuser label.overcontent {
-	margin: 1px 0 0 1px;
-	color: #ccc;
-}
-
-.addnewuser input[type=submit] {
-	min-width: 100px;
-}
-
-.reassign {
-	color: #999;
-	float: right;
-}
-
-.reassign select#reassign {
-	margin: 0 10px;
-}
-
-.reassign input {
-	margin-left: 10px;
-	min-width: 110px;
-}
-
-
-/*-- USER */
-
-body.page-user .userstats, body.page-group .groupstats {
-	font: 1.5em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
-	text-align: center;
-	color: #333;
-	padding: 10px;
-}
-
-body.page-user #apply {
-	float: right;
-}
-
-/*-- GROUPS */
-body.page-groups .allgroups .users strong, body.page-groups .allgroups .users strong a {
-	color:#444;
-}
-
-body.page-groups .container.addgroup .item.submit input {
-	margin-left:10px;
-}
-
-/*-- GROUP */
-body.page-group .container.groupmembers a.user {
-	margin-right:1em;
-	padding-right:14px;
-	line-height:14px;
-	background:url('../images/closebutton.png') no-repeat right center;
-}
-
-body.page-group .container.groupmembers a.user:hover, body.page-group .container.groupmembers #currentusers a.user:focus {
-	background-image:url('../images/minusbutton.png');
-}
-
-body.page-group .container.groupmembers a.user.template, body.page-group .container.groupmembers #currentusers a.user .id {
-	display:none;
-}
-
-body.page-group .container.groupacl h3 {
-	margin-bottom: 1.2em;
-}
-
-/*- OPTIONS PAGE */
-
-body.page-options .item {
-	padding-top: 2px;
-	padding-bottom: 2px;
-}
-
-
-/*- NAVIGATION */
-
-.navigation span > * {
-	width: 100%;
-}
-
-.navigation .or {
-	font-size: 2em;
-	line-height: 18px;
-}
-
-
-/*- PLUGINS PAGE */
-
-.plugins p a {
-	text-decoration: underline;
-}
-
-.plugins .item {
-	padding-left: 40px;
-	padding-right: 40px;
-}
-
-.plugins .item:hover {
-	background: #dfdfdf;
-}
-
-.plugins .head {
-	margin: 0;
-	font-size: 1.1em;
-}
-
-.plugins .description {
-	margin: 0;
-	width: 80%;
-}
-
-.plugins .item a.help, .plugins .item a.help.active:hover {
-	text-indent: -10000px;
-	background: transparent url('../images/help_icon.png') scroll no-repeat;
-	width: 15px;
-	height: 15px;
-	display: inline-block;
-	outline: none;
-}
-
-.plugins .item a.help:hover, .plugins .item a.help.active {
-	background-image: url('../images/help_icon_over.png');
-}
-
-.plugins #pluginconfigure, .plugins .pluginhelp {
-	clear: both;
-	float: left;
-	width: 100%;
-}
-
-.plugins #pluginconfigure form, #pluginconfigure .help, .plugins .pluginhelp .help {
-	background-color: #f8f8f8;
-	border: #bbb 1px solid;
-	padding: 12px;
-	margin-top:3px;
-	margin-bottom: 5px;
-	border-radius: 5px;
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-}
-
-.plugins .pluginhelp {
-	display: none;
-}
-
-.plugins .pluginhelp.active {
-	display: block;
-}
-
-.plugins #pluginconfigure select {
-	width: 30%;
-}
-
-#pluginconfigure .formcontrol {
-	padding: 6px 0;
-}
-
-#pluginconfigure .formui input, #pluginconfigure .formui select {
-	margin-left: 8px;
-}
-
-/*-- PLUGINS HELP */
-.pluginhelp .help {
-	line-height: 1.5em;
-}
-
-.pluginhelp .help p {
-	margin-bottom: 5px;
-}
-
-.pluginhelp .help h3 {
-	margin-top: 10px;
-	margin-bottom: 5px;
-	font-size: 160%;
-	font-weight: bold;
-}
-
-.pluginhelp .help h4 {
-	margin-top: 7px;
-	margin-bottom: 3px;
-	font-size: 110%;
-	font-style: italic;
-}
-
-.pluginhelp .help code {
-	font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
-	white-space: pre;
-	padding: 0.25em 0.5em 0;
-	background-color: #e3e3e3;
-}
-
-.pluginhelp .help code.block {
-	display: block;
-}
-
-.pluginhelp p.warning {
-	padding-left: 20px;
-	background: url('../images/warning.png') no-repeat left center;
-	color: #FF4500;
-}
-
-.pluginhelp .help em {
-	font-style: italic;
-}
-
-.pluginhelp .help strong {
-	font-weight: bold;
-}
-
-.pluginhelp .help a, .pluginhelp .help a:visited {
-	color: #555;
-	text-decoration: underline;
-}
-
-.pluginhelp .help a:hover, .pluginhelp .help a:focus {
-	color: #000;
-}
-
-.pluginhelp .help ol, .pluginhelp .help ul {
-	margin: 5px 20px;
-}
-
-.pluginhelp .help ol, .pluginhelp .help ul ol {
-	list-style: decimal;
-}
-
-.pluginhelp .help ol ol {
-	list-style: lower-latin;
-}
-
-.pluginhelp .help ul, .pluginhelp .help ol ul {
-	list-style: disc;
-}
-
-.pluginhelp .help ul ul {
-	list-style: circle;
-}
-
-.pluginhelp .help ol ol, .pluginhelp .help ul ul, .pluginhelp .help ul ol, .pluginhelp .help ol ul {
-	margin-top: 0;
-	margin-bottom: 0;
-}
-
-/*- THEMES PAGE */
-
-body.page-themes .head {
-	margin: 10px 0 15px;
-}
-
-body.page-themes #page .dropbutton {
-	top: 20px;
-}
-
-body.page-themes .thumb img {
-	float: left;
-	margin: 0 0 10px 0;
-	padding: 4px;
-	width: 200px;
-	display: block;
-	overflow: hidden;
-	background: #f2f2f2;
-	border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	border: 1px solid #e7e7e7;
-}
-
-.thumb, .description {
-	float: left;
-}
-
-.thumb * {
-	width: 125px;
-}
-
-.thumb .empty {
-	background: #eee;
-	text-align: center;
-	line-height: 125px;
-	height: 125px;
-	color: #aaa;
-	font-size: .9em;
-	border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-}
-
-#themeconfigure {
-	clear: both;
-	background: #f4f4f4;
-	margin: 0 -40px;
-	padding: 20px 40px;
-	border-bottom: 1px solid #ddd;
-	border-top: 1px solid #ddd;
-}
-
-#themeconfigure form {
-	background-color: #f8f8f8;
-	border: #bbb 1px solid;
-	padding: 12px;
-	margin-bottom: 5px;
-	border-radius: 5px;
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-}
-
-.uploadpackage h2 {
-	float: left;
-	margin: 0;
-}
-
-.uploadform {
-	float: right;
-}
-
-#block_add {
-	float: left;
-	width: 66%;
-	border-right: 1px solid #666666;
-}
-
-#scope_container {
-	float: left;
-	color: white;
-	padding-left: 10px;
-	width: 30%;
-}
-
-#page #scope_container h3 {
-	color: white;
-}
-
-#block_instances {
-	height: 200px;
-}
-
-.area_drop {
-	padding-bottom: 1em;
-}
-
-.area_drop.drop_area_active {
-	border: 1px dotted #444444;
-}
-
-.area_drop.drop_area_hover,
-.block_drop {
-	background-color: #222222;
-	width: 100%;
-	height: 1em;
-}
-
-.area_block {
-	cursor: n-resize;
-}
-
-/*- OPTIONS PAGE */
-
-body.page-options .container .item {
-	line-height: 34px;
-}
-
-body.page-options #title {
-	line-height: 40px;
-}
-
-body.page-options #title input {
-	font-size: 2em;
-	padding: 2px 0 2px 2px;
-	margin: 0;
-}
-
-.container .item label {
-	font-weight: normal;
-	margin-left: 10px;
-	color: #555;
-}
-
-.container .item span.helptext {
-	color: #888;
-	font-size: 11px;
-}
-
-.container.settings input[type=text], .container.settings input[type=password] {
-	width: 95%;
-	color: #444;
-}
-
-.container input.big, .container .item.big input {
-	font-size: 1.8em;
-}
-
-.container .item.big label {
-	font-size:1.5em;
-	line-height:1.2em;
-}
-
-.humanepathspreview {
-	font-family: 'Courier New';
-	margin-top: -15px
-}
-
-.humanepathslegend {
-	font: 1em/1.5em 'Courier New';
-}
-
-.savebutton {
-	width: 100px;
-	float: right;
-}
-
-
-/*- MANAGE PAGE (ENTRIES/PAGES/COMMENTS/TAGS) */
-
-.container .item:hover {
-	background: #f3f3f3;
-}
-
-.container .item.selected:hover {
-	background: #faf8dd;
-}
-
-body.page-Manage .item .head > span {
-	white-space: nowrap;
-	line-height: 20px;
-}
-
-body.page-Manage .item.deleted {
-	border-left: 3px solid #f8595f;
-	border-right: 3px solid #f8595f;
-}
-
-body.page-Manage .item .title {
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-
-body.page-Manage .item .title input.checkbox {
-	margin-right: 10px;
-}
-
-body.page-Manage .selectedtext.none {
-	margin: 0 20px 0 10px;
-}
-
-body.page-Manage .actiondropdown {
-	width: 110px;
-	margin-right: 5px;
-}
-
-body.page-Manage .state {
-	text-transform: capitalize;
-}
-
-/*
-.special_search {
-	padding: 3px 0 5px;
-}
-
-.special_search	 a {
-	color: #666;
-}
-*/
-
-.message.none p {
-	text-align: center;
-	margin: 0;
-	font-size: 1.2em;
-	color: #666;
-}
-
-.item.controls {
-	padding-top: 0;
-}
-
-
-/*- MANAGE COMMENTS PAGE */
-
-#comments .item.spam {
-	border-left: 3px solid #f8595f;
-	border-right: 3px solid #f8595f;
-}
-
-#comments .item.unapproved {
-	border-left: 3px solid #fcd915;
-	border-right: 3px solid #fcd915;
-}
-
-#comments .item p.comment-type {
-	font-size: 11px;
-	text-transform: capitalize;
-	font-weight: bold;
-	padding-top: 5px;
-}
-
-.controls select {
-	width: 120px;
-	margin-right: 5px;
-}
-
-.authorinfo {
-	overflow: hidden;
-}
-
-.authorinfo .empty {
-	font-style: italic;
-}
-
-.authorinfo .keyval .label, .authorinfo .keyval strong {
-	float: left;
-}
-
-.authorinfo .keyval .label {
-	width: 60%;
-}
-
-.authorinfo .keyval strong {
-	width: 40%;
-}
-
-.authorinfo .spam strong {
-	color: #FF0000;
-}
-
-/*- EDIT COMMENT PAGE */
-.page-comment .overview .textual a, .page-comment .overview .textual strong {
-	color: #000;
-	font-weight: bold;
-}
-
-.page-comment .overview .textual {
-	text-align: center;
-	font: 1.1em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
-	color: #333;
-}
-
-.page-comment .overview .buttons {
-	float: left;
-}
-
-#page .form.comment #content_wrapper {
-	margin-top: 30px;
-}
-
-#page .form.comment #content_wrapper .container, #page .form.comment .container.pagesplitter, #page .form.comment .container.pagesplitter .container {
-	background: transparent none repeat scroll 0% 0%;
-	overflow: visible;
-	padding: 0px;
-	box-shadow: none;
-	-webkit-box-shadow: none;
-	-moz-box-shadow: none;
-	border:none;
-}
-
-#page .form.comment .buttons .status, #page .form.comment .buttons .button, #page .form.comment .buttons .button input {
-	float: left;
-	width: 130px;
-}
-
-#page .form.comment .buttons .status {
-	text-align: center;
-	border-radius: 9px;
-	-moz-border-radius: 9px;
-	-webkit-border-radius: 9px;
-	padding: 3px 0;
-	line-height: 18px;
-}
-
-#page .form.comment .buttons .delete {
-	margin-left: 0;
-	margin-right: 20px;
-}
-
-#page .form.comment .buttons .spam {
-	margin-left: 25px;
-	margin-right: 0;
-}
-
-#page .form.comment .buttons .status.spam {
-	background: #f8595f;
-	color: #FFF;
-}
-
-#page .form.comment .buttons .unapprove {
-	margin-left: 10px;
-	margin-right: 10px;
-}
-
-#page .form.comment .buttons .status.unapprove {
-	background: #fcd915;
-	color: #333;
-}
-
-#page .form.comment .buttons .approve {
-	margin-left: 0;
-	margin-right: 15px;
-}
-
-#page .form.comment .buttons .status.approve {
-	background: #34DB15;
-	color: #000;
-}
-
-#page .form.comment .buttons .save {
-	margin-left: 20px;
-	margin-right: 0;
-}
-
-#page .comments .button
-{
-	margin-left: 0;
-}
-
-#page .comments .buttons span{
-	padding-bottom: 5px;
-	margin-left: 10px;
-}
-
-#page .comment .buttons div{
-	padding-bottom: 1px;
-}
-
-#page .comments .buttons span.approve, #page .comment .buttons div.approve{
-	border-bottom:2px #339933 solid;
-}
-
-#page .comments .buttons span.unapprove, #page .comment .buttons div.unapprove{
-	border-bottom:2px #fcd915 solid;
-}
-
-#page .comments .buttons span.spam, #page .comment .buttons div.spam{
-	border-bottom:2px #f8595f solid;
-}
-
-#page .comment .buttons div.active {
-	border-bottom-color:#CCC;
-}
-
-/* Inline Comments Editor */
-
-
-/*- MANAGE TIMELINE */
-
-.navigator {
-	position: relative;
-}
-
-.navigator span {
-	float: left;
-}
-
-.navigator span span {
-	float: none;
-}
-
-.navigator .newer a, .navigator .older a {
-	font-weight: bold;
-	color: #333;
-}
-
-.navigator .currentposition {
-	text-align: center;
-	color: #999;
-}
-
-.navigator input {
-	width: 90%;
-	margin: 0 5%;
-}
-
-.navigator .newer {
-	text-align: right;
-	opacity: 0;
-}
-
-.navigator .filters {
-	position: relative;
-	}
-
-#page .navigator .dropbutton.special_search {
-	top: 1px;
-	right: 20px;
-	z-index: 500;
-	text-transform: capitalize;
-}
-
-.navigator .special_search a.active {
-	text-decoration: underline;
-}
-
-.timeline {
-	position: relative;
-	background: #323232;
-	width: 830px;
-	height: 50px;
-	clear: both;
-	margin-top: 33px;
-	margin-left: -40px;
-	overflow: hidden;
-}
-
-.timeline .years {
-	display: table;
-	height: 50px;
-	position: absolute;
-	right: 0;
-	cursor: col-resize;
-	background: #222;
-}
-
-.timeline .years .year {
-	display: table-cell;
-	height: inherit;
-	overflow: hidden;
-}
-
-.timeline .years .year > span {
-	position: absolute;
-	bottom: 0;
-	font: 20px 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Helvetica, Arial, Sans-Serif;
-	padding: 40px 0 0 3px;
-	margin: 0;
-	opacity: .2;
-	border-left: 1px solid #ccc;
-	color: white;
-	overflow: hidden;
-}
-
-.timeline .years .months {
-	display: table-row;
-	height: inherit;
-	position: relative;
-}
-
-.timeline .years .months div {
-	display: table-cell;
-	border-right: 1px solid #2d2d2d;
-	height: inherit;
-	overflow: hidden;
-}
-
-.timeline .years .months div span {
-	margin: 4px;
-	color: #ddd;
-	text-transform: uppercase;
-	font-size: 9px;
-}
-
-.timeline .track {
-	position: relative;
-	height: inherit;
-	margin-left: auto;
-}
-
-.timeline .handle {
-	background: url('../images/loupebg.png') repeat-x;
-	height: 50px;
-	width: 20px;
-	position: absolute;
-	top: 0;
-	cursor: move;
-	border-radius: 3px;
-	-webkit-border-radius: 3px;
-	-moz-border-radius: 3px;
-}
-
-.timeline .handle .resizehandleleft,
-.timeline .handle .resizehandleright {
-	cursor: col-resize;
-	background: url('../images/loupehandle.png') 2px center no-repeat;
-	width: 7px;
-	height: inherit;
-	margin-left: -2px;
-}
-
-.timeline .handle .resizehandleright {
-	background-position: 2px;
-	position: absolute;
-	right: -2px;
-}
-
-
-/*- MANAGE PAGES - INLINE EDITOR */
-
-.editable:hover {
-	background: #FFFFCC;
-}
-
-
-/*- TAGS PAGE */
-
-body.page-tags .instructions {
-	text-align: center;
-	font-size: 19px;
-	margin: 5px 0 10px;
-	color: #999;
-}
-
-body.page-tags .instructions span {
-	color: #111;
-}
-
-body.page-tags .container a {
-	color: #555;
-	margin: 0 5px;
-	line-height: 30px;
-	padding: 2px 0;
-	outline: none;
-}
-
-body.page-tags .container span {
-	display: inline-block;
-}
-
-body.page-tags .container .selected label {
-	color: #fb430f;
-}
-
-body.page-tags .item.tag .count {
-	color: #aaa;
-	font-size: 9px;
-	margin-left: 2px;
-	vertical-align: super;
-}
-
-body.page-tags #tag_collection input {
-	display: none;
-}
-
-body.page-tags #tag_collection .item {
-	display: inline;
-	background: transparent;
-	border: none;
-	margin: 0;
-	padding: 0;
-}
-
-body.page-tags .item.tag label:hover {
-	color: orange;
-	text-decoration: none;
-}
-
-.wt0 { font-size: 10px; }
-.wt1 { font-size: 11px; }
-.wt2 { font-size: 12px; }
-.wt3 { font-size: 13px; }
-.wt4 { font-size: 15px; }
-.wt5 { font-size: 16px; }
-.wt6 { font-size: 19px; }
-.wt7 { font-size: 20px; }
-.wt8 { font-size: 22px; }
-.wt9 { font-size: 23px; }
-.wt10 { font-size: 25px; }
-
-.tags .controls input {
-	margin: 0 5px;
-}
-
-.renamecontrols input[type=text] {
-	width: 200px;
-	float: right;
-}
-
-
-/*- TABS */
-
-ul.tabs {
-	position: relative;
-	text-align: center;
-	min-width: 130px;
-	height: 20px;
-	z-index: 10;
-	margin: 0;
-}
-
-ul.tabs li {
-	display: -moz-inline-box; /* for FF & Mozilla */
-	display: inline-block;
-	font-size: 11px;
-	text-align: center;
-	background: url('../images/tabsbg.png') center top;
-	color: #333;
-	cursor: pointer;
-	border-right: 1px solid #bdbdbd;
-}
-
-* html .tabs li { display: inline; }  /* for IE 6 */
-* + html .tabs li { display: inline; }	/* for IE 7 */
-
-ul.tabs li a {
-	float: left;
-	width: 110px;
-	line-height: 20px;
-	display: block;
-	color: #333;
-	outline: none;
-}
-
-ul.tabs li a:hover {
-	text-decoration: none;
-}
-
-ul.tabs li.first-child.last-child a {
-	width: 150px;
-}
-
-ul.tabs li.first-child {
-	background-position: left top;
-}
-
-ul.tabs li.last-child {
-	background-position: right top;
-	border: none;
-}
-
-ul.tabs li.ui-tabs-selected {
-	background-position: -10px bottom;
-}
-
-ul.tabs li.ui-tabs-selected.first-child {
-	background-position: left bottom;
-}
-
-ul.tabs li.ui-tabs-selected.last-child {
-	background-position: right bottom;
-}
-
-
-/*- PAGESPLITTER  */
-
-#page .container.pagesplitter {
-	width: 100%;
-	max-width: none;
-	margin: 20px auto;
-	padding: 0;
-}
-
-.page-themes #page .pagesplitter {
-	clear: left;
-	margin: auto -40px;
-}
-
-.splitterinside {
-	padding: 25px 0 20px;
-}
-
-.page-themes .splitterinside {
-	padding: 25px 40px 20px;
-}
-
-.splitterinside * a {
-	color: #999;
-}
-
-.ui-tabs-hide {
-	display: none;
-}
-
-.splitter {
-	position: relative;
-	top: -10px;
-	color: white;
-	background: #333333 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAVCAYAAACHUoQEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEBJREFUeNpiYGBgSGICEowg4i+I+AMnfoGI33ACzP0FxAxmIMIARGiBCBUQIQciJEGECIjgAxFcIIINRDADBBgAlsIJb8O3yoQAAAAASUVORK5CYII=') top repeat-x; /* Drop shadow */
-}
-
-.splitter select, .splitter input[type=text] {
-	width: 150px;
-	margin: 0;
-	margin-top: -3px;
-}
-
-.splitter .media_controls label {
-	margin-left: 10px;
-}
-
-.splitter p, .splitter ul, .splitter .media_browser label {
-	margin: 0;
-}
-
-.splitter .container {
-	padding: 10px 0;
-}
-
-.splitter hr {
-	height: 1px;
-	background: #2c2c2c;
-	border-bottom: 1px solid #424242;
-	margin: 0 auto;
-	width: 770px;
-	border: none;
-}
-
-.styledformelement {
-	border: 1px solid #bbb;
-}
-
-
-/*- CLEAR
-	Clearing floats without extra markup
-	Based on How To Clear Floats Without Structural Markup by PiE
-	[http://www.positioniseverything.net/easyclearing.html] */
-
-.clear { display: inline-block; }
-.clear:after, .container:after {
-  content: ".";
-  display: block;
-  height: 0;
-  clear: both;
-  visibility: hidden;
-}
-* html .clear { height: 1%; }
-.clear { display: block; }
-
-
-/*- LOGIN PAGE */
-
-body.login {
-	margin: 0;
-}
-
-body.login #page {
-	background: url('../images/loginbg.png') center -56px no-repeat;
-	margin: 0;
-	min-height: 536px;
-}
-
-body.login h1 {
-	text-align: center;
-	padding: 50px 0;
-	margin: 0;
-	font: 3.5em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Helvetica, Arial, Sans-Serif;
-	line-height: 100px;
-}
-
-body.login #page .container {
-	width: 290px;
-	background: none;
-	box-shadow: none;
-	-webkit-box-shadow: none;
-	-moz-box-shadow: none;
-	padding: 0;
-	margin: auto;
-	border: none;
-}
-
-body.login input[type=text], body.login input[type=password], body.login label.overcontent {
-	width: 100%;
-	font: 1.5em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Helvetica, Arial, Sans-Serif;
-	padding: 3px 5px;
-	margin: 0 auto 15px;
-	width: 280px; /* 100% will break the vertical lines */
-	color: #333;
-	border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	box-shadow: 0 0 20px #ddd;
-	-webkit-box-shadow: 0 0 20px #ddd;
-	-moz-box-shadow: 0 0 20px #ddd;
-}
-
-body.login label.overcontent {
-	text-transform: lowercase;
-	color: #aeaeae;
-}
-
-body.login .remember {
-	float: left;
-}
-
-body.login .remember label {
-	line-height: 25px;
-	font-weight: normal;
-	font-size: .9em;
-	color: #444;
-	margin-left: 5px;
-}
-
-body.login input[type=submit] {
-	float: right;
-	width: 100px;
-	margin-right: -1px;
-}
-
-body.login #password_utils {
-	text-align: right;
-	font-size: 0.8em;
-	clear: right;
-	padding-top: 10px;
-}
-
-
-/*- FOOTER */
-
-#footer {
-	margin: 35px auto;
-	text-align: center;
-}
-
-#footer p {
-	white-space: nowrap;
-	padding: 7px 15px;
-	background: #e3e3e3;
-	border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	display: inline;
-}
-
-#footer a, #footer span {
-	font-size: 11px;
-	color: #888;
-}
-
-#footer a {
-	font-weight: bold;
-	color: #777;
-}
-
-#footer .middot {
-	padding: 0 5px;
-	color: #aaa;
-}
-
-
-/*- HUMANIZED MESSAGES 1.0 (Habari Edition)
-	home - http://humanmsg.googlecode.com */
-
-.humanMsg {
-	font: normal 12px Helvetica, Arial, Sans-Serif;
-	position: fixed;
-	top: 40px;
-	left: 10px;
-	width: 30%;
-	max-width: 300px;
-	color: white;
-	text-align: left;
-	z-index: 900;
-	display: none;
-	padding: 0px;
-}
-
-body.login .humanMsg {
-	top: 10px;
-}
-
-.humanMsg .imsgs .msg {
-	padding: 10px;
-	background-color: black;
-	border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-moz-border-radius: 5px;
-	box-shadow: 0px 1px 5px #333;
-	-webkit-box-shadow: 0px 1px 5px #333;
-	-moz-box-shadow: 0px 1px 5px #333;
-	margin-bottom: 5px;
-}
-
-.humanMsg p {
-	display: inline;
-}
-
-.humanMsg p a {
-	color: #19a5d1;
-}
-
-.humanMsg .imsgs .msg {
-	display: none;
-	opacity: 0;
-}
-
-#humanMsgLog {
-	font: normal 10px Helvetica, Arial, Sans-Serif;
-	color: white;
-	position: fixed;
-	bottom: 0;
-	left: 0;
-	width: 100%;
-	max-height: 200px;
-	display: none;
-	z-index: 10000;
-}
-
-#humanMsgLog p:hover {
-	opacity: 1;
-}
-
-#humanMsgLog p {
-	opacity: .3;
-	position: relative;
-	left: 50%;
-	width: 200px;
-	margin: 0;
-	margin-left: -100px;
-	padding: 0 10px;
-	line-height: 20px;
-	background: #333;
-	text-align: center;
-	white-space: pre;
-	cursor: pointer;
-	border-top-right-radius: 5px;
-	border-top-left-radius: 5px;
-	-webkit-border-top-right-radius: 5px;
-	-webkit-border-top-left-radius: 5px;
-	-moz-border-radius-topright: 5px;
-	-moz-border-radius-topleft: 5px;
-}
-
-#humanMsgLog.logisopen p {
-	opacity: 1;
-}
-
-#humanMsgLog ul {
-	background: #eee url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAARCAIAAACaSvE/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUeNqEjVEKACAIQ516Ee//5wVNCjIjaB/iY5vC3YkoIgDkVDOjQ5pqLCI3r2bLFzNzyydvM4uKqfJPKN4vyl9LO/7o3/6PhwADAIWkFPjc5eRrAAAAAElFTkSuQmCC') repeat-x;
-	margin: 0;
-	padding: 0;
-	position: relative;
-	max-height: 180px;
-	overflow: auto;
-	display: none;
-}
-
-#humanMsgLog ul li {
-	color: #555;
-	font-size: 12px;
-	list-style-type: none;
-	border-bottom: 1px solid #ddd;
-	line-height: 40px;
-	display: none;
-	padding: 0 20px;
-	position: relative;
-	overflow: hidden;
-	white-space: pre;
-}
-
-#humanMsgLog ul li:hover {
-	background: #f2f2f2;
-}
-
-#humanMsgLog ul li:first-child {
-	margin-top: 1px;
-}
-
-#humanMsgLog ul li .error {
-	color: #FF4500;
-}
-
-#humanMsgLog ul li .indent {
-	position: absolute;
-	top: 0;
-	left: 100px;
-	margin-right: 200px;
-	height: inherit;
-}
-
-
-.page-logs .item .info span {
-	height: 13px;
-	width: 13px;
-	background: url('../images/info.png') no-repeat;
-	display: block;
-	cursor: pointer;
-}
-
-.page-logs .item .info span:hover {
-	background: url('../images/info_hover.png') no-repeat;
-}
-
-#pop {
-	border: 1px solid #efefef;
-	overflow: auto;
-}
-
-#page .hidden, #page ul.dropbutton li.nodisplay {
-	display: none;
-}

Copied: trunk/htdocs/system/admin/css/admin.css (from rev 3828, branches/tags_as_terms/system/admin/css/admin.css) (0 => 3829)


--- trunk/htdocs/system/admin/css/admin.css	                        (rev 0)
+++ trunk/htdocs/system/admin/css/admin.css	2009-11-25 04:45:07 UTC (rev 3829)
@@ -0,0 +1,2655 @@
+/*
+ * Name: Habari Admin Stylesheet
+ * Author: Habari Community
+ * License: Apache License 2.0
+ */
+
+/*- RESET, courtesy of http://www.blueprintcss.org/ */
+html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
+table {border-collapse:separate;border-spacing:0;}
+caption, th, td {text-align:left;font-weight:normal;}
+table, td, th {vertical-align:middle;}
+fieldset {padding:1.4em;margin:1em 0 1.5em 0;border:1px solid #ccc;}
+
+/*- THE BASICS */
+
+html {
+	overflow-y: scroll; /* To prevent 'popping' */
+}
+
+body {
+	background-color: #f0f0f0;
+	color: #000;
+	font-size: 75%;
+	font-family: "Helvetica Neue", Helvetica, "Lucida Grande", Arial, Verdana, Sans-Serif;
+}
+
+a img {
+	border: none;
+}
+
+
+/*- OPACITY PERCENTAGES */
+.opa0 { opacity: 0; }
+.opa10 { opacity: .10; }
+.opa15 { opacity: .15; }
+.opa20 { opacity: .20; }
+.opa25 { opacity: .25; }
+.opa30 { opacity: .30; }
+.opa35 { opacity: .35; }
+.opa40 { opacity: .40; }
+.opa45 { opacity: .45; }
+.opa50 { opacity: .50; }
+.opa55 { opacity: .55; }
+.opa60 { opacity: .60; }
+.opa65 { opacity: .65; }
+.opa70 { opacity: .70; }
+.opa75 { opacity: .75; }
+.opa80 { opacity: .80; }
+.opa85 { opacity: .85; }
+.opa90 { opacity: .90; }
+.opa95 { opacity: .95; }
+.opa100 { opacity: 1; }
+
+
+/*- WIDTH PERCENTAGES */
+
+.pct5, .pct10, .pct15, .pct20, .pct25, .pct30, .pct35, .pct40, .pct45, .pct50, .pct55, .pct60, .pct65, .pct70, .pct75, .pct80, .pct85, .pct90, .pct95, .pct100 {
+	float: left;
+}
+.pct5 { width: 5%; }
+.pct10 { width: 10%; }
+.pct15 { width: 15%; }
+.pct20 { width: 20%; }
+.pct25 { width: 25%; }
+.pct30 { width: 30%; }
+.pct35 { width: 35%; }
+.pct40 { width: 40%; }
+.pct45 { width: 45%; }
+.pct50 { width: 50%; }
+.pct55 { width: 55%; }
+.pct60 { width: 60%; }
+.pct65 { width: 65%; }
+.pct70 { width: 70%; }
+.pct75 { width: 75%; }
+.pct80 { width: 80%; }
+.pct85 { width: 85%; }
+.pct90 { width: 90%; }
+.pct95 { width: 95%; }
+.pct100 { width: 100%; }
+
+.error {
+	color: #FF4500;
+}
+
+
+/*- THE MENUBAR */
+
+#menubar {
+	background: #1a1a1a;
+	position: fixed;
+	width: 100%;
+	height: 32px;
+	top: 0;
+	left: 0;
+	z-index: 1000;
+	opacity: 1; /* was .98 - see issue #588 */
+}
+
+#menubar a {
+	color: #fff;
+	outline: none;
+}
+
+#site {
+	position: absolute;
+	top: 5px;
+	right: 20px;
+	font: 18px 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
+	line-height: 22px;
+}
+
+
+/*- THE MENU */
+
+#menu {
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 180px;
+	padding: 5px 0 0;
+	margin-left: 5px;
+	height: 27px;
+}
+
+#menu a:hover, #menu a {
+	text-decoration: none;
+}
+
+#menu a .hotkey {
+	display:none;
+	color: #777;
+	position: absolute;
+	top: 0;
+	right: 30px;
+	width: 15px;
+	text-align: center;
+}
+
+#menu a .hotkey.enabled {
+	display: block;
+}
+
+#menubutton {
+	font-size: 12px;
+	position: absolute;
+	width: 100%;
+	height: 22px;
+	background: #2b2b2b;
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+}
+
+#menubutton a {
+	line-height: 22px;
+	display: block;
+	padding: 0 30px 0 10px;
+	background: url(../images/arrowdown.png) 160px center no-repeat;
+}
+
+#menubutton a:first-letter {
+	text-transform: uppercase;
+}
+
+#menu #menulist ul {
+	background: #2b2b2b;
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	padding: 5px 0;
+	opacity: 1; /* was .99 - see issue #588 */
+	display: none;
+	box-shadow: 0px 2px 20px #111;
+	-webkit-box-shadow: 0px 2px 20px #111;
+	-moz-box-shadow: 0px 2px 20px #111;
+	list-style-type: none;
+	list-style-position: outside;
+	margin-bottom: 0;
+	top: -5px;
+	z-index: -1; /* Even with the main menu (its parent), so shadows don't get messed up */
+}
+
+#menu #menulist > ul {
+	position: absolute;
+	top: 28px;
+	width: 100%;
+}
+
+#menu.hovering #menulist, #menu.hovering #menulist > ul, #menu:hover #menulist > ul, #menu:hover #menulist > ul li.submenu:hover ul.submenu, #menu.hovering #menulist > ul li.submenu.carrot ul.submenu {
+	display: block;
+}
+
+#menu.hovering #menulist li li, #menu:hover #menulist li li {
+	display: none;
+}
+
+#menu:hover #menulist li:hover li, #menu #menulist li.carrot li {
+	display: block;
+}
+
+#menu #menulist li ul {
+	position: absolute;
+	left: 100%;
+	top: 0;
+	width: 100%;
+	background: #2b2b2b;
+	border-bottom-left-radius: 0;
+	border-top-left-radius: 0;
+	-moz-border-radius-topleft: 0;
+	-moz-border-radius-bottomleft: 0;
+	-webkit-border-bottom-left-radius: 0;
+	-webkit-border-top-left-radius: 0;
+	padding-top:0;
+	padding-bottom:0;
+}
+
+#menulist li {
+	position: relative;
+	background: #2b2b2b;
+	font-size: 11px;
+	line-height: 25px;
+}
+
+#menulist li a {
+	display: block;
+	padding: 0 45px 0 20px;
+	height: 25px;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+	overflow: hidden;
+}
+
+#menulist li.submenu a.top {
+	background: url('../images/arrowright.png') 163px center no-repeat;
+}
+
+#menulist li.submenu li:first-child, #menulist li.submenu li:first-child a {
+	border-top-right-radius: 5px;
+	-moz-border-radius-topright: 5px;
+	-webkit-border-top-right-radius: 5px;
+}
+
+#menulist li.submenu li:last-child, #menulist li.submenu li:last-child a {
+	border-bottom-right-radius: 5px;
+	-moz-border-radius-bottomright: 5px;
+	-webkit-border-bottom-right-radius: 5px;
+}
+
+#menulist li.carrot a.top, #menulist li:hover a.top, #menulist li a:hover, #menulist li li.carrot a {
+	background-color: #444;
+}
+
+#menulist li.selected a {
+	background: url('../images/currentpageindicator.png') 8px center no-repeat;
+}
+
+#menulist li.selected a:hover, #menulist li.selected.carrot a {
+	background: #444 url('../images/currentpageindicator.png') 8px center no-repeat;
+}
+
+#menulist li#link-tags, #menulist li#link-logs {
+	padding-bottom: 5px;
+}
+
+#menulist li#link-dashboard, #menulist li#link-logout {
+	border-top: 1px solid #444;
+	padding-top: 5px;
+}
+
+#menulist li#link-dashboard .hotkey, #menulist li#link-logout .hotkey {
+	top: 6px;
+}
+
+
+/* DROPBUTTONS */
+
+#page .dropbutton {
+	float: right;
+	min-width: 8em;
+	max-width: 16em;
+	white-space: nowrap;
+	background: #333;
+	border-radius: 3px;
+	-webkit-border-radius: 3px;
+	-moz-border-radius: 3px;
+	font-size: 9px;
+	list-style: none outside;
+	margin: 0 0 0 10px;
+	position: absolute;
+/*	top: 10px;*/
+	right: 40px;
+}
+
+#page .dropbutton:hover {
+	z-index: 1000;
+}
+
+#page .dropbutton * {
+	cursor: pointer;
+}
+
+#page .dropbutton.alert {
+/*	background: #FF4500; */
+	background: #AA0000;
+}
+
+#page .comments-action.dropbutton{
+	right:170px;
+}
+#page .comments-action.dropbutton.alert {
+/*	background: #FF4500; */
+	background: #AA0000;
+	right:40px;
+}
+
+#page .dropbutton li {
+	padding: 0 5px;
+	display: none;
+}
+
+#page .dropbutton li.first-child {
+	display: block;
+}
+
+#page .dropbutton:hover li,
+#page .dropbutton.hovering li {
+	display: block;
+}
+
+#page .dropbutton a, #page .dropbutton button, #page .dropbutton input {
+	color: white;
+	font-weight: normal;
+	display: block;
+	padding-right: 20px;
+	line-height: 16px;
+	text-overflow: ellipsis;
+	overflow: hidden;
+	font-size: 9px;
+	font-family: 'Helvetica Neue', Helvetica, 'Lucida Grande', Arial, Verdana, Sans-Serif;
+	padding-left: 0px;
+	outline: none;
+}
+
+#page .dropbutton button {
+	border: none;
+	background: none;
+	font-size: 9px;
+	font-family: 'Helvetica Neue', Helvetica, 'Lucida Grande', Arial, Verdana, Sans-Serif;
+	padding: 0px;
+	height: auto;
+}
+
+#page .dropbutton li.first-child {
+	border-top-right-radius: 3px;
+	border-top-left-radius: 3px;
+	-webkit-border-top-right-radius: 3px;
+	-webkit-border-top-left-radius: 3px;
+	-moz-border-radius-topright: 3px;
+	-moz-border-radius-topleft: 3px;
+}
+
+#page .dropbutton li.last-child {
+	border-bottom-right-radius: 3px;
+	border-bottom-left-radius: 3px;
+	-webkit-border-bottom-right-radius: 3px;
+	-webkit-border-bottom-left-radius: 3px;
+	-moz-border-radius-bottomright: 3px;
+	-moz-border-radius-bottomleft: 3px;
+}
+
+#page .dropbutton li:hover {
+	background: #555;
+}
+
+#page .dropbutton li.first-child a {
+	/* Add dropdown indicator to first child */
+	background: url(../images/arrowdown.png) right 6px no-repeat;
+	border-top-right-radius: 3px;
+	border-top-left-radius: 3px;
+	-webkit-border-top-right-radius: 3px;
+	-webkit-border-top-left-radius: 3px;
+	-moz-border-radius-topright: 3px;
+	-moz-border-radius-topleft: 3px;
+}
+
+#page .dropbutton li.first-child.last-child a {
+	/* No dropdown indicator if only one <li> */
+	background: none;
+	padding-right: 0;
+}
+
+
+/*- GENERAL STRUCTURE & STYLING */
+
+#page {
+	margin-top: 50px;
+}
+
+#page .container {
+/*	width: 70%;
+	min-width: 750px;
+	max-width: 900px;*/
+	width: 750px;
+	margin: 10px auto;
+	padding: 15px 40px;
+	background: #fafafa;
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	box-shadow: 0px 1px 15px #ddd;
+	-webkit-box-shadow: 0px 1px 15px #ddd;
+	-moz-box-shadow: 0px 1px 15px #ddd;
+	border: 1px solid #e7e7e7;
+}
+
+#page .container.transparent {
+	background: transparent;
+	border: none;
+	padding-top: 0;
+	padding-bottom: 0;
+	box-shadow: none;
+	-webkit-box-shadow: none;
+	-moz-box-shadow: none;
+}
+
+#page .container h2 {
+	font: 1.6em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
+	color: #333;
+	text-transform: capitalize;
+}
+
+#page .container h3 {
+	font-size: 1.2em;
+	color: #333;
+}
+
+#page .container h3 a {
+	font-weight: bold;
+}
+
+#page input[type=button], #page input[type=submit], #page button {
+	padding: 2px 4px 2px 4px;
+	cursor: pointer;
+	border-radius: 9px;
+	-webkit-border-radius: 9px;		/* Webkit only supports up to 9px at present */
+	-moz-border-radius: 9px;
+	font-size: 10px;
+	background: transparent url('../images/button_background.png') repeat-x;
+	border: 1px solid #b3b3b3;
+}
+
+#page input[type=button]:hover, #page input[type=submit]:hover, #page button:hover {
+	border: 1px solid #555;
+	background-position: 0 -30px;
+}
+
+.item {
+	position: relative;
+	padding: 10px 0 10px;
+	border-bottom: 1px solid #eee;
+	margin-left: -40px;
+	padding-left: 40px;
+	margin-right: -40px;
+	padding-right: 40px;
+}
+
+.item.selected {
+	background-color:#fffde2;
+}
+
+.item.hide {
+	display: none;
+}
+
+.item.last-child {
+	border: none;
+}
+
+.item .head {
+	margin-bottom: 5px;
+	font-size: 1.1em;
+}
+
+.item .head a {
+	font-weight: bold;
+	color: #333;
+}
+
+span.dim {
+	font-weight: normal;
+	color: #555;
+}
+
+.item .description, .item .content, .item .type {
+	color: #555;
+	overflow-x: auto;
+}
+
+a, a:visited, a:hover {
+	color: #333;
+	text-decoration: none;
+}
+
+a:hover {
+	text-decoration: underline;
+}
+
+#page .dropbutton a {
+	text-decoration: none;
+}
+
+#page .dropbutton a.active, #pluginconfigure a {
+	text-decoration: underline;
+}
+#page .dropbutton a.active,
+#page .dropbutton.hovering li.first-child a.active {
+	background: url('../images/currentpageindicator.png') right center no-repeat;
+}
+
+
+.border {
+	border: 1px solid #bbb;
+	margin: 0;
+}
+
+.minor, .minor a {
+	font-size: 11px;
+	font-weight: normal;
+}
+
+a.minor {
+	color: #999;
+	padding-left: 5px;
+}
+
+.or, .conjunction {
+	font-size: 1.3em;
+	line-height: 16px;
+	color: #aaa;
+	text-align: center;
+}
+
+.selectedtext {
+	color: #999;
+	margin-left: 10px;
+	top: 0;
+}
+
+ul {
+	list-style-type: none;
+	list-style-position: outside;
+	margin: 0;
+	padding: 0;
+}
+
+#spinner {
+	position: fixed;
+	top: 40px;
+	right: 8px;
+	z-index: 100;
+}
+
+/*- FORMS */
+
+input, textarea {
+	color: #333;
+}
+
+textarea {
+	width: 100%;
+	line-height: 1.3em;
+}
+
+select {
+	width: 98%;
+}
+
+label.abovecontent {
+	font-size: 9px;
+	line-height: 10px;
+	background: #d4d4d4;
+	padding: 1px 10px 2px;
+	color: #444;
+	font-weight: normal;
+	border-top-left-radius: 5px;
+	border-top-right-radius: 5px;
+	-webkit-border-top-left-radius: 5px;
+	-webkit-border-top-right-radius: 5px;
+	-moz-border-radius-topleft: 5px;
+	-moz-border-radius-topright: 5px;
+	position: absolute;
+	margin-top: -13px;
+	margin-left: 5px;
+	z-index: 2;
+}
+
+label.overcontent {
+	font-weight: normal;
+	position: absolute;
+	width: auto;
+	cursor: text;
+	box-shadow: none;
+	-webkit-box-shadow: none;
+	-moz-box-shadow: none;
+}
+
+p:hover > label.abovecontent {
+	display: block;
+}
+
+/*-- FORM BUTTONS  */
+
+.button, #save input, button {
+	min-width: 110px;
+	margin-left: 10px;
+	float: right;
+}
+
+body.page-comments .button{
+	float:none;
+}
+
+.button.delete, .formcontrol.delete input {
+	float: left;
+	}
+
+.button#delete {
+	float: left;
+	margin-left: 0;
+	margin-right: 10px;
+}
+
+.button.submit {
+	float: left;
+	margin-left: 10px;
+	margin-right: 0;
+}
+
+.comments .button.delete {
+	float: none;
+}
+
+.comments .buttons {
+	float: right;
+}
+
+.button.publish {
+	font-weight: bold;
+}
+
+.buttons .formcontrol {
+	display: inline;
+}
+
+
+/*- CREATE */
+#page .create {
+	margin-top: 70px;
+}
+
+#page .create .container > p {
+	margin: 0;
+}
+
+.create input.text, .create textarea, .create label.overcontent {
+	font-family: 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Helvetica, Arial, Sans-Serif;
+	padding: 3px 5px;
+	margin: 0 0 0 -6px;
+	width: 100%;
+	border-radius: 3px;
+	-webkit-border-radius: 3px;
+	-moz-border-radius: 3px;
+}
+
+.create label.overcontent {
+	text-transform: lowercase;
+	color: #aeaeae;
+	width: 759px;
+}
+
+create input.text, .create label.overcontent {
+	font-size: 1.1em;
+}
+
+.create input.text.important, .create label.important.overcontent {
+	font-size: 1.7em;
+}
+
+.create input.text:focus {
+	color: #222;
+}
+
+body.page-publish .buttons input {
+	float: right;
+}
+
+.create textarea {
+	padding: 5px;
+	font-size: 14px;
+}
+
+.create label.textarea.overcontent {
+	padding: 5px;
+}
+
+.grip {
+	height: 10px;
+	cursor: row-resize;
+	background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAAADCAYAAAAuu3lbAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACRJREFUeNpivHLlyn+GUYABGP//Hw0XbIDl6tWroyGDBQAEGADRQAn91uPxnQAAAABJRU5ErkJggg==') center center no-repeat; /* Double line 'grip' */
+}
+
+#tags_list ul {
+	text-align: left;
+	margin-right: 50px;
+	margin-left: 10px;
+	}
+
+#tags_list ul li {
+	font-family: "Arial", san-serif;
+	font-size: 0.8em;
+	display: inline;
+	line-height: 2.0em;
+	padding: 3px;
+	color: #ccc;
+	cursor: pointer;
+	}
+
+#tags_list ul li.clicked {
+	background: #000;
+	}
+
+.viewpost {
+	float: right;
+}
+
+
+/*- MEDIA SILOS */
+
+.mediasplitter {
+	border-bottom: 1px solid white;
+}
+
+.mediasplitter .splitterinside {
+	padding: 13px 0px 0px;
+	color: #848484;
+	padding: 0;
+	background: #262626;
+	height: 240px;
+}
+
+.mediasplitter td {
+	padding: 0;
+}
+
+#mediatabs a {
+	background: no-repeat 5% 50%;
+}
+
+#mediatabs.iconify a {
+	width: 30px;
+	background-position: 50% 50%;
+	text-indent: -10000px;
+}
+
+#mediatabs.iconify li.ui-tabs-selected a {
+	width: 110px;
+	text-indent: 0;
+	background-position: 5% 50%;
+}
+
+/* -- TOOLBAR */
+
+.media_controls {
+	background: #474747 url('../images/shadow-heavy-top.png') top repeat-x;
+	padding: 15px 5px 5px;
+	height: 25px;
+}
+
+.media_controls a {
+	color: white;
+	text-decoration: none;
+}
+
+.media_controls ul {
+	position: absolute;
+	top: 18px;
+	left: 10px;
+}
+
+.media_controls li {
+	list-style: none;
+	margin-right: 15px;
+	display: block;
+	float: left;
+}
+
+.media_controls input[type=search] {
+	width: 270px;
+	margin-left: 5px;
+}
+
+.media_controls .upload {
+	position: absolute;
+	top: 16px;
+	right: 10px;
+}
+
+.media_controls .upload input[type=file] {
+	margin-right: 5px;
+	color: #888;
+}
+
+/* -- MEDIA BROWSER */
+
+.media_browser {
+	height: 195px;
+	overflow-x: scroll;
+	overflow-y: hidden;
+	position: relative;
+	background: url('../images/shadow-light-top.png') top right repeat-x; /* Drop shadow */
+}
+
+/* -- MEDIA DIRECTORIES */
+
+.media_dirlevel {
+	float: left;
+	height: inherit;
+	overflow-y: auto;
+	overflow-x: hidden;
+	background: url('../images/shadow-light-left.png') repeat-y;
+	height: 180px;
+	border-right: 1px solid #333;
+}
+
+.media_dirlevel ul {
+	max-width: 250px;
+	list-style-position: outside;
+	list-style-type: none;
+}
+
+.media_dirlevel:first-child {
+	background: #262626;
+}
+
+.media_dirlevel li {
+	min-width: 70px;
+	background: url(../images/arrowright.png) right center no-repeat;
+	cursor: pointer;
+	color: #888;
+	padding: 0px 15px 0px 10px;
+	font: 11px/20px 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+	overflow: hidden;
+}
+
+.media_dirlevel li:first-child {
+	margin-top: 1px;
+}
+
+.media_dirlevel li:hover, .media_dirlevel li.active {
+	background: #333 url(../images/arrowright.png) right center no-repeat;
+}
+
+.media_dirlevel li.active {
+	color: white;
+}
+
+
+/* -- MEDIA LISTING */
+
+.mediaphotos {
+	display: table;
+}
+
+.mediaphotos > ul {
+	display: table-row;
+}
+
+.mediaphotos > ul li {
+	display: table-cell;
+	font-size: 0.8em;
+	overflow: hidden;
+	border-right: 1px solid #303030;
+	padding: 0 10px;
+	min-width: 30px;
+	position: relative;
+}
+
+.mediaphotos > ul li.first {
+	background: url('../images/shadow-light-left.png') left repeat-y;
+}
+
+.mediaphotos > ul li.end {
+	border: none;
+	font-size: 3em;
+	line-height: 10px;
+	vertical-align: middle;
+	white-space: nowrap;
+	color: #444;
+	height: 180px;
+	width: 100px;
+	background: url('../images/shadow-light-left.png') left repeat-y}
+
+.mediaphotos > ul li:hover {
+	background: #111;
+}
+
+.mediaphotos > ul li.end:hover {
+	background: url('../images/shadow-light-left.png') left repeat-y}
+
+.mediaphotos li.media .foroutput {
+	display: none;
+}
+
+.mediaphotos li.media .mediatitle {
+	line-height: 35px;
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+
+.mediaphotos li.media .mediatitle:after { /* Helps Safari if there is no title */
+	-webk-content: '\000001';
+}
+
+.mediaphotos li.media .medialink {
+	background: url('../images/medialink.png') no-repeat;
+	width: 10px;
+	height: 9px;
+	text-indent: -3000px;
+	margin-top: 12px;
+	float: right;
+}
+
+.mediaphotos li.media img {
+	margin: 0 0 -3px;
+	height: 100px;
+	border: 1px solid #fff;
+	cursor: pointer;
+	max-width: 300px;
+	min-width: 30px;
+}
+
+.mediaphotos li.media:last-child img {
+	border-left: 1px solid white;
+}
+
+.mediaphotos li.media img.loading {
+	border-color: #333;
+	width: 100%;
+	background: #303030;
+}
+
+.mediaphotos li.media .mediastats {
+	padding-left: 5px;
+	height: 42px;
+}
+
+.media_panel {
+	min-height: 200px;
+	margin: 10px;
+}
+
+.media_panel #submit
+{
+	margin: 10px auto;
+}
+
+.media_panel p
+{
+	padding: 5px 0px;
+}
+
+.media_panel #simple_upload_frame
+{
+	display:none;
+}
+
+/*-- MEDIA ACTION DROPBUTTONS */
+
+.mediaactions.dropbutton {
+	position: relative !important; 
+	right: 0px !important; 
+	min-width: 100% !important;  
+	opacity: .8;
+}
+
+.mediastats {
+	display: none;
+}
+
+
+/*-- VIDDLER SILO */
+
+.viddler_recorder_container {
+	text-align: center;
+	padding: 15px 0;
+	background: url('../images/shadow-light-top.png') top right repeat-x; /* Drop shadow */
+}
+
+
+/*- DASHBOARD */
+
+#page .dashboardinfo {
+	padding: 5px 0 0;
+	background: none;
+	color: #444;
+	font: 1.4em/1.4em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
+	text-align: center;
+}
+
+#page .dashboardinfo p {
+	margin-bottom: 15px;
+}
+
+#page .dashboardinfo a {
+	font-weight: bold;
+	color: #444;
+}
+
+#page .dashboard {
+	min-width: 820px;
+	max-width: 920px;
+	width: 80%;
+	background: none;
+	padding: 0;
+	margin-top: 0;
+	margin-bottom: 0;
+}
+
+.dashboard .module {
+	position: relative;
+	float: left;
+	width: 50%;
+	height: 260px;
+}
+
+.dashboard .module.add-item-module {
+	height: 65px;
+}
+
+.dashboard .module .modulecore,
+.dashboard .module .optionswindow {
+	height: 195px;
+	margin: 5px;
+	padding: 45px 0px 10px;
+	position: relative;
+	overflow: hidden;
+	background: #fafafa;
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	box-shadow: 0px 1px 15px #ddd;
+	-webkit-box-shadow: 0px 1px 15px #ddd;
+	-moz-box-shadow: 0px 1px 15px #ddd;
+	border: 1px solid #E7E7E7;
+}
+
+.dashboard .module .handle {
+	background: url('../images/dashboardhandle.png') center center no-repeat;
+	position: absolute;
+	top: 16px;
+	left: 5%;
+	height: 20px;
+	width: 90%;
+	z-index: 90;
+	cursor: move;
+}
+
+.dashboard .module h2 {
+	z-index: 100;
+	background: url('../images/dashboardh2bg.png') right center no-repeat;
+	padding-right: 10px;
+	position: absolute;
+	top: 15px;
+	left: 20px;
+	font-size: 1.5em;
+	line-height: 22px;
+}
+
+.dashboard .item {
+	line-height: 24px;
+	border-bottom: 1px solid #e9e9e9;
+	color: #666;
+	width: 94%;
+	padding: 0 3%;
+	margin: 0;
+}
+
+.dashboard .item.last-child {
+	border: none;
+}
+
+.dashboard .item a {
+	color: #555;
+	font-weight: bold;
+}
+
+.dashboard .item span {
+	float: left;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+	overflow: hidden;
+}
+
+.dashboard .item span.author {
+	font-size: .8em;
+}
+
+.dashboard .item span.author span {
+	margin-left: 5px;
+}
+
+.dashboard .item span.comments {
+	text-align: right;
+}
+
+.dashboard .module.add-item-module .modulecore {
+	height: 0px;
+}
+
+.dashboard .module.add-item-module h2, .dashboard .module.add-item-module form {
+	position: absolute;
+	top: 16px;
+}
+
+.dashboard .module.add-item-module form {
+	left: 120px;
+}
+
+.dashboard .module.add-item-module select {
+	width: 230px;
+}
+.dashboard .module.add-item-module .formcontrol {
+	display: inline;
+}
+
+.dashboard .modulecore ul li {
+	list-style-type: none;
+	clear: both;
+}
+
+.dashboard .module .close {
+	position: absolute;
+	top: 7px;
+	left: 7px;
+	height: 16px;
+	width: 16px;
+	background: url('../images/closebutton.png') center center no-repeat;
+	cursor: pointer;
+	z-index: 110;
+}
+
+.dashboard .module .options {
+	position: absolute;
+	top: 7px;
+	right: 7px;
+	height: 16px;
+	width: 16px;
+	background: url('../images/moduleoptions.png') center center no-repeat;
+	cursor: pointer;
+	z-index: 110;
+}
+
+.dashboard .module .optionswindow {
+	z-index: 100;
+	height: 195px;
+	background: #111;
+	color: #555;
+	display: none;
+}
+
+.dashboard .module.viewingoptions .optionswindow {
+	display: block;
+}
+
+.dashboard .module.viewingoptions .modulecore {
+	display: none;
+}
+
+.dashboard .optionscontent {
+	overflow-y: auto;
+	overflow-x: hidden;
+	height: 175px;
+	padding: 10px;
+}
+
+.dashboard .optionscontent p {
+	padding-bottom: 10px;
+}
+
+.dashboard .optionscontent p.buttons {
+	margin-top: 25px;
+	text-align: right;
+}
+
+.dashboard .optionscontent label {
+	text-align: right;
+	padding-right: 5%;
+}
+
+.dashboard .module.viewingoptions .handle {
+	opacity: .3;
+}
+
+#page .dashboard .module.viewingoptions .optionswindow h2 {
+	background: url('../images/dashboardh2bgdark.png') right center no-repeat;
+	color: #eee;
+}
+
+
+/*-- DASHBOARD - LATEST COMMENTS MODULE */
+.dashboard .latest-comments-module .item {
+
+}
+
+.dashboard .latest-comments-module .item > span {
+	float: left;
+}
+
+.dashboard .latest-comments-module .titleanddate {
+	margin-top: 5px;
+	line-height: 16px;
+	color: #999;
+}
+
+.dashboard .latest-comments-module ul {
+	margin-bottom: 5px;
+	line-height: 13px;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+	overflow: hidden;
+}
+
+.dashboard .latest-comments-module ul.commentauthors li {
+	display: inline;
+}
+
+.dashboard .latest-comments-module ul li:after {
+	content: ', ';
+}
+
+.dashboard .latest-comments-module ul li.last-child:after {
+	content: '';
+}
+
+.dashboard .latest-comments-module .commentauthors a:hover {
+	opacity: 1;
+}
+
+.dashboard .latest-comments-module .item span.comments {
+	float: right;
+}
+
+.dashboard .latest-comments-module .comments {
+	line-height: 34px;
+	font-size: 24px;
+}
+
+/* Dashmodules Tables */
+
+.modules table	{
+	width: 100%;
+}
+
+.modules table th {
+	padding-left: 15px;
+}
+
+.modules table th, .modules table td {
+	border-bottom: 1px solid #e9e9e9;
+}
+
+tr.status_item {
+	color: #666;
+	line-height: 24px;
+}
+
+#dash_status .label {
+	width: 75%;
+	color: #555;
+	font-weight: bold;
+}
+
+
+
+/* LOGS PAGE */
+
+body.page-logs .time, body.page-logs .user, body.page-logs .ip, body.page-logs .module, body.page-logs .severity {
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+
+body.page-logs .item select {
+	margin-right: 10px;
+}
+
+body.page-logs .item {
+	padding: 3px 0 3px 2px;
+}
+
+body.page-logs .item input[type=checkbox] {
+	margin-left: 10px;
+}
+
+body.page-logs .item .message {
+	cursor: help;
+}
+
+body.page-logs .item .more, body.page-logs .item.expanded .less {
+	display: none;
+}
+
+body.page-logs .item.expanded .more {
+	display: block;
+}
+
+
+/*- USERS & GROUPS PAGES */
+
+body.page-users .navigation {
+	margin-bottom: 20px;
+}
+
+body.page-users .container.users {
+	padding-top: 10px;
+	padding-bottom: 10px;
+}
+
+body.page-users .item .user {
+	font-size: 1.3em;
+	line-height: 16px;
+	font-weight: bold;
+}
+
+body.page-users .item .user a {
+	color: #444;
+}
+
+body.page-groups .allgroups .users, body.page-users .item .aka, body.page-users .item .userlogin {
+	color: #999;
+}
+
+body.page-users .item .aka, body.page-users .item .userlogin {
+	font-size: 11px;
+}
+
+body.page-users .item strong {
+	color: #777;
+	padding: 0 2px;
+}
+
+body.page-users .item span {
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+
+body.page-users .addnewuser {
+	position: relative;
+	border-top-left-radius: 5px;
+	border-top-right-radius: 5px;
+	-moz-border-radius-topright: 5px;
+	-moz-border-radius-topleft: 5px;
+	-webkit-border-top-left-radius: 5px;
+	-webkit-border-top-right-radius: 5px;
+	background: #f3f3f3;
+	margin: -10px -40px 0 -40px;
+	padding: 16px 40px 15px 80px;
+}
+
+.addnewuser input[type=text], .addnewuser input[type=password] {
+	margin-right: 5px;
+	margin-left: -5px;
+	margin-top: -1px;
+	padding: 3px;
+	width: 140px;
+}
+
+.addnewuser label.overcontent {
+	margin: 1px 0 0 1px;
+	color: #ccc;
+}
+
+.addnewuser input[type=submit] {
+	min-width: 100px;
+}
+
+.reassign {
+	color: #999;
+	float: right;
+}
+
+.reassign select#reassign {
+	margin: 0 10px;
+}
+
+.reassign input {
+	margin-left: 10px;
+	min-width: 110px;
+}
+
+
+/*-- USER */
+
+body.page-user .userstats, body.page-group .groupstats {
+	font: 1.5em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
+	text-align: center;
+	color: #333;
+	padding: 10px;
+}
+
+body.page-user #apply {
+	float: right;
+}
+
+/*-- GROUPS */
+body.page-groups .allgroups .users strong, body.page-groups .allgroups .users strong a {
+	color:#444;
+}
+
+body.page-groups .container.addgroup .item.submit input {
+	margin-left:10px;
+}
+
+/*-- GROUP */
+body.page-group .container.groupmembers a.user {
+	margin-right:1em;
+	padding-right:14px;
+	line-height:14px;
+	background:url('../images/closebutton.png') no-repeat right center;
+}
+
+body.page-group .container.groupmembers a.user:hover, body.page-group .container.groupmembers #currentusers a.user:focus {
+	background-image:url('../images/minusbutton.png');
+}
+
+body.page-group .container.groupmembers a.user.template, body.page-group .container.groupmembers #currentusers a.user .id {
+	display:none;
+}
+
+body.page-group .container.groupacl h3 {
+	margin-bottom: 1.2em;
+}
+
+/*- OPTIONS PAGE */
+
+body.page-options .item {
+	padding-top: 2px;
+	padding-bottom: 2px;
+}
+
+
+/*- NAVIGATION */
+
+.navigation span > * {
+	width: 100%;
+}
+
+.navigation .or {
+	font-size: 2em;
+	line-height: 18px;
+}
+
+
+/*- PLUGINS PAGE */
+
+.plugins p a {
+	text-decoration: underline;
+}
+
+.plugins .item {
+	padding-left: 40px;
+	padding-right: 40px;
+}
+
+.plugins .item:hover {
+	background: #dfdfdf;
+}
+
+.plugins .head {
+	margin: 0;
+	font-size: 1.1em;
+}
+
+.plugins .description {
+	margin: 0;
+	width: 80%;
+}
+
+.plugins .item a.help, .plugins .item a.help.active:hover {
+	text-indent: -10000px;
+	background: transparent url('../images/help_icon.png') scroll no-repeat;
+	width: 15px;
+	height: 15px;
+	display: inline-block;
+	outline: none;
+}
+
+.plugins .item a.help:hover, .plugins .item a.help.active {
+	background-image: url('../images/help_icon_over.png');
+}
+
+.plugins #pluginconfigure, .plugins .pluginhelp {
+	clear: both;
+	float: left;
+	width: 100%;
+}
+
+.plugins #pluginconfigure form, #pluginconfigure .help, .plugins .pluginhelp .help {
+	background-color: #f8f8f8;
+	border: #bbb 1px solid;
+	padding: 12px;
+	margin-top:3px;
+	margin-bottom: 5px;
+	border-radius: 5px;
+	-moz-border-radius: 5px;
+	-webkit-border-radius: 5px;
+}
+
+.plugins .pluginhelp {
+	display: none;
+}
+
+.plugins .pluginhelp.active {
+	display: block;
+}
+
+.plugins #pluginconfigure select {
+	width: 30%;
+}
+
+#pluginconfigure .formcontrol {
+	padding: 6px 0;
+}
+
+#pluginconfigure .formui input, #pluginconfigure .formui select {
+	margin-left: 8px;
+}
+
+/*-- PLUGINS HELP */
+.pluginhelp .help {
+	line-height: 1.5em;
+}
+
+.pluginhelp .help p {
+	margin-bottom: 5px;
+}
+
+.pluginhelp .help h3 {
+	margin-top: 10px;
+	margin-bottom: 5px;
+	font-size: 160%;
+	font-weight: bold;
+}
+
+.pluginhelp .help h4 {
+	margin-top: 7px;
+	margin-bottom: 3px;
+	font-size: 110%;
+	font-style: italic;
+}
+
+.pluginhelp .help code {
+	font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
+	white-space: pre;
+	padding: 0.25em 0.5em 0;
+	background-color: #e3e3e3;
+}
+
+.pluginhelp .help code.block {
+	display: block;
+}
+
+.pluginhelp p.warning {
+	padding-left: 20px;
+	background: url('../images/warning.png') no-repeat left center;
+	color: #FF4500;
+}
+
+.pluginhelp .help em {
+	font-style: italic;
+}
+
+.pluginhelp .help strong {
+	font-weight: bold;
+}
+
+.pluginhelp .help a, .pluginhelp .help a:visited {
+	color: #555;
+	text-decoration: underline;
+}
+
+.pluginhelp .help a:hover, .pluginhelp .help a:focus {
+	color: #000;
+}
+
+.pluginhelp .help ol, .pluginhelp .help ul {
+	margin: 5px 20px;
+}
+
+.pluginhelp .help ol, .pluginhelp .help ul ol {
+	list-style: decimal;
+}
+
+.pluginhelp .help ol ol {
+	list-style: lower-latin;
+}
+
+.pluginhelp .help ul, .pluginhelp .help ol ul {
+	list-style: disc;
+}
+
+.pluginhelp .help ul ul {
+	list-style: circle;
+}
+
+.pluginhelp .help ol ol, .pluginhelp .help ul ul, .pluginhelp .help ul ol, .pluginhelp .help ol ul {
+	margin-top: 0;
+	margin-bottom: 0;
+}
+
+/*- THEMES PAGE */
+
+body.page-themes .head {
+	margin: 10px 0 15px;
+}
+
+body.page-themes #page .dropbutton {
+	top: 20px;
+}
+
+body.page-themes .thumb img {
+	float: left;
+	margin: 0 0 10px 0;
+	padding: 4px;
+	width: 200px;
+	display: block;
+	overflow: hidden;
+	background: #f2f2f2;
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	border: 1px solid #e7e7e7;
+}
+
+.thumb, .description {
+	float: left;
+}
+
+.thumb * {
+	width: 125px;
+}
+
+.thumb .empty {
+	background: #eee;
+	text-align: center;
+	line-height: 125px;
+	height: 125px;
+	color: #aaa;
+	font-size: .9em;
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+}
+
+#themeconfigure {
+	clear: both;
+	background: #f4f4f4;
+	margin: 0 -40px;
+	padding: 20px 40px;
+	border-bottom: 1px solid #ddd;
+	border-top: 1px solid #ddd;
+}
+
+#themeconfigure form {
+	background-color: #f8f8f8;
+	border: #bbb 1px solid;
+	padding: 12px;
+	margin-bottom: 5px;
+	border-radius: 5px;
+	-moz-border-radius: 5px;
+	-webkit-border-radius: 5px;
+}
+
+.uploadpackage h2 {
+	float: left;
+	margin: 0;
+}
+
+.uploadform {
+	float: right;
+}
+
+#block_add {
+	float: left;
+	width: 66%;
+	border-right: 1px solid #666666;
+}
+
+#scope_container {
+	float: left;
+	color: white;
+	padding-left: 10px;
+	width: 30%;
+}
+
+#page #scope_container h3 {
+	color: white;
+}
+
+#block_instances {
+	height: 200px;
+}
+
+.area_drop {
+	padding-bottom: 1em;
+}
+
+.area_drop.drop_area_active {
+	border: 1px dotted #444444;
+}
+
+.area_drop.drop_area_hover,
+.block_drop {
+	background-color: #222222;
+	width: 100%;
+	height: 1em;
+}
+
+.area_block {
+	cursor: n-resize;
+}
+
+/*- OPTIONS PAGE */
+
+body.page-options .container .item {
+	line-height: 34px;
+}
+
+body.page-options #title {
+	line-height: 40px;
+}
+
+body.page-options #title input {
+	font-size: 2em;
+	padding: 2px 0 2px 2px;
+	margin: 0;
+}
+
+.container .item label {
+	font-weight: normal;
+	margin-left: 10px;
+	color: #555;
+}
+
+.container .item span.helptext {
+	color: #888;
+	font-size: 11px;
+}
+
+.container.settings input[type=text], .container.settings input[type=password] {
+	width: 95%;
+	color: #444;
+}
+
+.container input.big, .container .item.big input {
+	font-size: 1.8em;
+}
+
+.container .item.big label {
+	font-size:1.5em;
+	line-height:1.2em;
+}
+
+.humanepathspreview {
+	font-family: 'Courier New';
+	margin-top: -15px
+}
+
+.humanepathslegend {
+	font: 1em/1.5em 'Courier New';
+}
+
+.savebutton {
+	width: 100px;
+	float: right;
+}
+
+
+/*- MANAGE PAGE (ENTRIES/PAGES/COMMENTS/TAGS) */
+
+.container .item:hover {
+	background: #f3f3f3;
+}
+
+.container .item.selected:hover {
+	background: #faf8dd;
+}
+
+body.page-Manage .item .head > span {
+	white-space: nowrap;
+	line-height: 20px;
+}
+
+body.page-Manage .item.deleted {
+	border-left: 3px solid #f8595f;
+	border-right: 3px solid #f8595f;
+}
+
+body.page-Manage .item .title {
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+
+body.page-Manage .item .title input.checkbox {
+	margin-right: 10px;
+}
+
+body.page-Manage .selectedtext.none {
+	margin: 0 20px 0 10px;
+}
+
+body.page-Manage .actiondropdown {
+	width: 110px;
+	margin-right: 5px;
+}
+
+body.page-Manage .state {
+	text-transform: capitalize;
+}
+
+/*
+.special_search {
+	padding: 3px 0 5px;
+}
+
+.special_search	 a {
+	color: #666;
+}
+*/
+
+.message.none p {
+	text-align: center;
+	margin: 0;
+	font-size: 1.2em;
+	color: #666;
+}
+
+.item.controls {
+	padding-top: 0;
+}
+
+
+/*- MANAGE COMMENTS PAGE */
+
+#comments .item.spam {
+	border-left: 3px solid #f8595f;
+	border-right: 3px solid #f8595f;
+}
+
+#comments .item.unapproved {
+	border-left: 3px solid #fcd915;
+	border-right: 3px solid #fcd915;
+}
+
+#comments .item p.comment-type {
+	font-size: 11px;
+	text-transform: capitalize;
+	font-weight: bold;
+	padding-top: 5px;
+}
+
+.controls select {
+	width: 120px;
+	margin-right: 5px;
+}
+
+.authorinfo {
+	overflow: hidden;
+}
+
+.authorinfo .empty {
+	font-style: italic;
+}
+
+.authorinfo .keyval .label, .authorinfo .keyval strong {
+	float: left;
+}
+
+.authorinfo .keyval .label {
+	width: 60%;
+}
+
+.authorinfo .keyval strong {
+	width: 40%;
+}
+
+.authorinfo .spam strong {
+	color: #FF0000;
+}
+
+/*- EDIT COMMENT PAGE */
+.page-comment .overview .textual a, .page-comment .overview .textual strong {
+	color: #000;
+	font-weight: bold;
+}
+
+.page-comment .overview .textual {
+	text-align: center;
+	font: 1.1em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, Sans-Serif;
+	color: #333;
+}
+
+.page-comment .overview .buttons {
+	float: left;
+}
+
+#page .form.comment #content_wrapper {
+	margin-top: 30px;
+}
+
+#page .form.comment #content_wrapper .container, #page .form.comment .container.pagesplitter, #page .form.comment .container.pagesplitter .container {
+	background: transparent none repeat scroll 0% 0%;
+	overflow: visible;
+	padding: 0px;
+	box-shadow: none;
+	-webkit-box-shadow: none;
+	-moz-box-shadow: none;
+	border:none;
+}
+
+#page .form.comment .buttons .status, #page .form.comment .buttons .button, #page .form.comment .buttons .button input {
+	float: left;
+	width: 130px;
+}
+
+#page .form.comment .buttons .status {
+	text-align: center;
+	border-radius: 9px;
+	-moz-border-radius: 9px;
+	-webkit-border-radius: 9px;
+	padding: 3px 0;
+	line-height: 18px;
+}
+
+#page .form.comment .buttons .delete {
+	margin-left: 0;
+	margin-right: 20px;
+}
+
+#page .form.comment .buttons .spam {
+	margin-left: 25px;
+	margin-right: 0;
+}
+
+#page .form.comment .buttons .status.spam {
+	background: #f8595f;
+	color: #FFF;
+}
+
+#page .form.comment .buttons .unapprove {
+	margin-left: 10px;
+	margin-right: 10px;
+}
+
+#page .form.comment .buttons .status.unapprove {
+	background: #fcd915;
+	color: #333;
+}
+
+#page .form.comment .buttons .approve {
+	margin-left: 0;
+	margin-right: 15px;
+}
+
+#page .form.comment .buttons .status.approve {
+	background: #34DB15;
+	color: #000;
+}
+
+#page .form.comment .buttons .save {
+	margin-left: 20px;
+	margin-right: 0;
+}
+
+#page .comments .button
+{
+	margin-left: 0;
+}
+
+#page .comments .buttons span{
+	padding-bottom: 5px;
+	margin-left: 10px;
+}
+
+#page .comment .buttons div{
+	padding-bottom: 1px;
+}
+
+#page .comments .buttons span.approve, #page .comment .buttons div.approve{
+	border-bottom:2px #339933 solid;
+}
+
+#page .comments .buttons span.unapprove, #page .comment .buttons div.unapprove{
+	border-bottom:2px #fcd915 solid;
+}
+
+#page .comments .buttons span.spam, #page .comment .buttons div.spam{
+	border-bottom:2px #f8595f solid;
+}
+
+#page .comment .buttons div.active {
+	border-bottom-color:#CCC;
+}
+
+/* Inline Comments Editor */
+
+
+/*- MANAGE TIMELINE */
+
+.navigator {
+	position: relative;
+}
+
+.navigator span {
+	float: left;
+}
+
+.navigator span span {
+	float: none;
+}
+
+.navigator .newer a, .navigator .older a {
+	font-weight: bold;
+	color: #333;
+}
+
+.navigator .currentposition {
+	text-align: center;
+	color: #999;
+}
+
+.navigator input {
+	width: 90%;
+	margin: 0 5%;
+}
+
+.navigator .newer {
+	text-align: right;
+	opacity: 0;
+}
+
+.navigator .filters {
+	position: relative;
+	}
+
+#page .navigator .dropbutton.special_search {
+	top: 1px;
+	right: 20px;
+	z-index: 500;
+	text-transform: capitalize;
+}
+
+.navigator .special_search a.active {
+	text-decoration: underline;
+}
+
+.timeline {
+	position: relative;
+	background: #323232;
+	width: 830px;
+	height: 50px;
+	clear: both;
+	margin-top: 33px;
+	margin-left: -40px;
+	overflow: hidden;
+}
+
+.timeline .years {
+	display: table;
+	height: 50px;
+	position: absolute;
+	right: 0;
+	cursor: col-resize;
+	background: #222;
+}
+
+.timeline .years .year {
+	display: table-cell;
+	height: inherit;
+	overflow: hidden;
+}
+
+.timeline .years .year > span {
+	position: absolute;
+	bottom: 0;
+	font: 20px 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Helvetica, Arial, Sans-Serif;
+	padding: 40px 0 0 3px;
+	margin: 0;
+	opacity: .2;
+	border-left: 1px solid #ccc;
+	color: white;
+	overflow: hidden;
+}
+
+.timeline .years .months {
+	display: table-row;
+	height: inherit;
+	position: relative;
+}
+
+.timeline .years .months div {
+	display: table-cell;
+	border-right: 1px solid #2d2d2d;
+	height: inherit;
+	overflow: hidden;
+}
+
+.timeline .years .months div span {
+	margin: 4px;
+	color: #ddd;
+	text-transform: uppercase;
+	font-size: 9px;
+}
+
+.timeline .track {
+	position: relative;
+	height: inherit;
+	margin-left: auto;
+}
+
+.timeline .handle {
+	background: url('../images/loupebg.png') repeat-x;
+	height: 50px;
+	width: 20px;
+	position: absolute;
+	top: 0;
+	cursor: move;
+	border-radius: 3px;
+	-webkit-border-radius: 3px;
+	-moz-border-radius: 3px;
+}
+
+.timeline .handle .resizehandleleft,
+.timeline .handle .resizehandleright {
+	cursor: col-resize;
+	background: url('../images/loupehandle.png') 2px center no-repeat;
+	width: 7px;
+	height: inherit;
+	margin-left: -2px;
+}
+
+.timeline .handle .resizehandleright {
+	background-position: 2px;
+	position: absolute;
+	right: -2px;
+}
+
+
+/*- MANAGE PAGES - INLINE EDITOR */
+
+.editable:hover {
+	background: #FFFFCC;
+}
+
+
+/*- TAGS PAGE */
+
+body.page-tags .instructions {
+	text-align: center;
+	font-size: 19px;
+	margin: 5px 0 10px;
+	color: #999;
+}
+
+body.page-tags .instructions span {
+	color: #111;
+}
+
+body.page-tags .container a {
+	color: #555;
+	margin: 0 5px;
+	line-height: 30px;
+	padding: 2px 0;
+	outline: none;
+}
+
+body.page-tags .container span {
+	display: inline-block;
+}
+
+body.page-tags .container .selected label {
+	color: #fb430f;
+}
+
+body.page-tags .item.tag .count {
+	color: #aaa;
+	font-size: 9px;
+	margin-left: 2px;
+	vertical-align: super;
+}
+
+body.page-tags #tag_collection input {
+	display: none;
+}
+
+body.page-tags #tag_collection .item {
+	display: inline;
+	background: transparent;
+	border: none;
+	margin: 0;
+	padding: 0;
+}
+
+body.page-tags .item.tag label:hover {
+	color: orange;
+	text-decoration: none;
+}
+
+.wt0 { font-size: 10px; }
+.wt1 { font-size: 11px; }
+.wt2 { font-size: 12px; }
+.wt3 { font-size: 13px; }
+.wt4 { font-size: 15px; }
+.wt5 { font-size: 16px; }
+.wt6 { font-size: 19px; }
+.wt7 { font-size: 20px; }
+.wt8 { font-size: 22px; }
+.wt9 { font-size: 23px; }
+.wt10 { font-size: 25px; }
+
+.tags .controls input {
+	margin: 0 5px;
+}
+
+.renamecontrols input[type=text] {
+	width: 200px;
+	float: right;
+}
+
+
+/*- TABS */
+
+ul.tabs {
+	position: relative;
+	text-align: center;
+	min-width: 130px;
+	height: 20px;
+	z-index: 10;
+	margin: 0;
+}
+
+ul.tabs li {
+	display: -moz-inline-box; /* for FF & Mozilla */
+	display: inline-block;
+	font-size: 11px;
+	text-align: center;
+	background: url('../images/tabsbg.png') center top;
+	color: #333;
+	cursor: pointer;
+	border-right: 1px solid #bdbdbd;
+}
+
+* html .tabs li { display: inline; }  /* for IE 6 */
+* + html .tabs li { display: inline; }	/* for IE 7 */
+
+ul.tabs li a {
+	float: left;
+	width: 110px;
+	line-height: 20px;
+	display: block;
+	color: #333;
+	outline: none;
+}
+
+ul.tabs li a:hover {
+	text-decoration: none;
+}
+
+ul.tabs li.first-child.last-child a {
+	width: 150px;
+}
+
+ul.tabs li.first-child {
+	background-position: left top;
+}
+
+ul.tabs li.last-child {
+	background-position: right top;
+	border: none;
+}
+
+ul.tabs li.ui-tabs-selected {
+	background-position: -10px bottom;
+}
+
+ul.tabs li.ui-tabs-selected.first-child {
+	background-position: left bottom;
+}
+
+ul.tabs li.ui-tabs-selected.last-child {
+	background-position: right bottom;
+}
+
+
+/*- PAGESPLITTER  */
+
+#page .container.pagesplitter {
+	width: 100%;
+	max-width: none;
+	margin: 20px auto;
+	padding: 0;
+}
+
+.page-themes #page .pagesplitter {
+	clear: left;
+	margin: auto -40px;
+}
+
+.splitterinside {
+	padding: 25px 0 20px;
+}
+
+.page-themes .splitterinside {
+	padding: 25px 40px 20px;
+}
+
+.splitterinside * a {
+	color: #999;
+}
+
+.ui-tabs-hide {
+	display: none;
+}
+
+.splitter {
+	position: relative;
+	top: -10px;
+	color: white;
+	background: #333333 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAVCAYAAACHUoQEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEBJREFUeNpiYGBgSGICEowg4i+I+AMnfoGI33ACzP0FxAxmIMIARGiBCBUQIQciJEGECIjgAxFcIIINRDADBBgAlsIJb8O3yoQAAAAASUVORK5CYII=') top repeat-x; /* Drop shadow */
+}
+
+.splitter select, .splitter input[type=text] {
+	width: 150px;
+	margin: 0;
+	margin-top: -3px;
+}
+
+.splitter .media_controls label {
+	margin-left: 10px;
+}
+
+.splitter p, .splitter ul, .splitter .media_browser label {
+	margin: 0;
+}
+
+.splitter .container {
+	padding: 10px 0;
+}
+
+.splitter hr {
+	height: 1px;
+	background: #2c2c2c;
+	border-bottom: 1px solid #424242;
+	margin: 0 auto;
+	width: 770px;
+	border: none;
+}
+
+.styledformelement {
+	border: 1px solid #bbb;
+}
+
+
+/*- CLEAR
+	Clearing floats without extra markup
+	Based on How To Clear Floats Without Structural Markup by PiE
+	[http://www.positioniseverything.net/easyclearing.html] */
+
+.clear { display: inline-block; }
+.clear:after, .container:after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+* html .clear { height: 1%; }
+.clear { display: block; }
+
+
+/*- LOGIN PAGE */
+
+body.login {
+	margin: 0;
+}
+
+body.login #page {
+	background: url('../images/loginbg.png') center -56px no-repeat;
+	margin: 0;
+	min-height: 536px;
+}
+
+body.login h1 {
+	text-align: center;
+	padding: 50px 0;
+	margin: 0;
+	font: 3.5em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Helvetica, Arial, Sans-Serif;
+	line-height: 100px;
+}
+
+body.login #page .container {
+	width: 290px;
+	background: none;
+	box-shadow: none;
+	-webkit-box-shadow: none;
+	-moz-box-shadow: none;
+	padding: 0;
+	margin: auto;
+	border: none;
+}
+
+body.login input[type=text], body.login input[type=password], body.login label.overcontent {
+	width: 100%;
+	font: 1.5em 'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Helvetica, Arial, Sans-Serif;
+	padding: 3px 5px;
+	margin: 0 auto 15px;
+	width: 280px; /* 100% will break the vertical lines */
+	color: #333;
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	box-shadow: 0 0 20px #ddd;
+	-webkit-box-shadow: 0 0 20px #ddd;
+	-moz-box-shadow: 0 0 20px #ddd;
+}
+
+body.login label.overcontent {
+	text-transform: lowercase;
+	color: #aeaeae;
+}
+
+body.login .remember {
+	float: left;
+}
+
+body.login .remember label {
+	line-height: 25px;
+	font-weight: normal;
+	font-size: .9em;
+	color: #444;
+	margin-left: 5px;
+}
+
+body.login input[type=submit] {
+	float: right;
+	width: 100px;
+	margin-right: -1px;
+}
+
+body.login #password_utils {
+	text-align: right;
+	font-size: 0.8em;
+	clear: right;
+	padding-top: 10px;
+}
+
+
+/*- FOOTER */
+
+#footer {
+	margin: 35px auto;
+	text-align: center;
+}
+
+#footer p {
+	white-space: nowrap;
+	padding: 7px 15px;
+	background: #e3e3e3;
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	display: inline;
+}
+
+#footer a, #footer span {
+	font-size: 11px;
+	color: #888;
+}
+
+#footer a {
+	font-weight: bold;
+	color: #777;
+}
+
+#footer .middot {
+	padding: 0 5px;
+	color: #aaa;
+}
+
+
+/*- HUMANIZED MESSAGES 1.0 (Habari Edition)
+	home - http://humanmsg.googlecode.com */
+
+.humanMsg {
+	font: normal 12px Helvetica, Arial, Sans-Serif;
+	position: fixed;
+	top: 40px;
+	left: 10px;
+	width: 30%;
+	max-width: 300px;
+	color: white;
+	text-align: left;
+	z-index: 900;
+	display: none;
+	padding: 0px;
+}
+
+body.login .humanMsg {
+	top: 10px;
+}
+
+.humanMsg .imsgs .msg {
+	padding: 10px;
+	background-color: black;
+	border-radius: 5px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	box-shadow: 0px 1px 5px #333;
+	-webkit-box-shadow: 0px 1px 5px #333;
+	-moz-box-shadow: 0px 1px 5px #333;
+	margin-bottom: 5px;
+}
+
+.humanMsg p {
+	display: inline;
+}
+
+.humanMsg p a {
+	color: #19a5d1;
+}
+
+.humanMsg .imsgs .msg {
+	display: none;
+	opacity: 0;
+}
+
+#humanMsgLog {
+	font: normal 10px Helvetica, Arial, Sans-Serif;
+	color: white;
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	width: 100%;
+	max-height: 200px;
+	display: none;
+	z-index: 10000;
+}
+
+#humanMsgLog p:hover {
+	opacity: 1;
+}
+
+#humanMsgLog p {
+	opacity: .3;
+	position: relative;
+	left: 50%;
+	width: 200px;
+	margin: 0;
+	margin-left: -100px;
+	padding: 0 10px;
+	line-height: 20px;
+	background: #333;
+	text-align: center;
+	white-space: pre;
+	cursor: pointer;
+	border-top-right-radius: 5px;
+	border-top-left-radius: 5px;
+	-webkit-border-top-right-radius: 5px;
+	-webkit-border-top-left-radius: 5px;
+	-moz-border-radius-topright: 5px;
+	-moz-border-radius-topleft: 5px;
+}
+
+#humanMsgLog.logisopen p {
+	opacity: 1;
+}
+
+#humanMsgLog ul {
+	background: #eee url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAARCAIAAACaSvE/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUeNqEjVEKACAIQ516Ee//5wVNCjIjaB/iY5vC3YkoIgDkVDOjQ5pqLCI3r2bLFzNzyydvM4uKqfJPKN4vyl9LO/7o3/6PhwADAIWkFPjc5eRrAAAAAElFTkSuQmCC') repeat-x;
+	margin: 0;
+	padding: 0;
+	position: relative;
+	max-height: 180px;
+	overflow: auto;
+	display: none;
+}
+
+#humanMsgLog ul li {
+	color: #555;
+	font-size: 12px;
+	list-style-type: none;
+	border-bottom: 1px solid #ddd;
+	line-height: 40px;
+	display: none;
+	padding: 0 20px;
+	position: relative;
+	overflow: hidden;
+	white-space: pre;
+}
+
+#humanMsgLog ul li:hover {
+	background: #f2f2f2;
+}
+
+#humanMsgLog ul li:first-child {
+	margin-top: 1px;
+}
+
+#humanMsgLog ul li .error {
+	color: #FF4500;
+}
+
+#humanMsgLog ul li .indent {
+	position: absolute;
+	top: 0;
+	left: 100px;
+	margin-right: 200px;
+	height: inherit;
+}
+
+
+.page-logs .item .info span {
+	height: 13px;
+	width: 13px;
+	background: url('../images/info.png') no-repeat;
+	display: block;
+	cursor: pointer;
+}
+
+.page-logs .item .info span:hover {
+	background: url('../images/info_hover.png') no-repeat;
+}
+
+#pop {
+	border: 1px solid #efefef;
+	overflow: auto;
+}
+
+#page .hidden, #page ul.dropbutton li.nodisplay {
+	display: none;
+}

Property changes: trunk/htdocs/system/admin/formcontrols/formcontrol_file.php


Added: svn:executable

Modified: trunk/htdocs/system/classes/adminhandler.php (3828 => 3829)


--- trunk/htdocs/system/classes/adminhandler.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/adminhandler.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -394,7 +394,7 @@
 			'page_count' => Posts::get( array( 'count' => 1, 'content_type' => Post::type('page'), 'status' => Post::status('published') ) ),
 			'entry_count' => Posts::get( array( 'count' => 1, 'content_type' => Post::type('entry'), 'status' => Post::status('published') ) ),
 			'comment_count' => Comments::count_total( Comment::STATUS_APPROVED, FALSE ),
-			'tag_count' => DB::get_value('SELECT count(id) FROM {tags}'),
+			'tag_count' => Tags::count_total(),
 			'page_draft_count' => Posts::get( array( 'count' => 1, 'content_type' => Post::type('page'), 'status' => Post::status('draft'), 'user_id' => User::identify()->id ) ),
 			'entry_draft_count' => Posts::get( array( 'count' => 1, 'content_type' => Post::type('entry'), 'status' => Post::status('draft'), 'user_id' => User::identify()->id ) ),
 			'unapproved_comment_count' => User::identify()->can( 'manage_all_comments' ) ? Comments::count_total( Comment::STATUS_UNAPPROVED, FALSE ) : Comments::count_by_author( User::identify()->id, Comment::STATUS_UNAPPROVED ),

Modified: trunk/htdocs/system/classes/databaseconnection.php (3828 => 3829)


--- trunk/htdocs/system/classes/databaseconnection.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/databaseconnection.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -43,8 +43,6 @@
 		'rewrite_rules',
 		'scopes',
 		'sessions',
-		'tag2post',
-		'tags',
 		'terms',
 		'tokens',
 		'userinfo',

Modified: trunk/htdocs/system/classes/installhandler.php (3828 => 3829)


--- trunk/htdocs/system/classes/installhandler.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/installhandler.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -445,6 +445,13 @@
 				return false;
 			}
 		}
+		
+		// Create the Tags vocabulary
+		if(! $this->create_tags_vocabulary()) {
+			$this->theme->assign('form_errors', array('options'=>_t('Problem creating tags vocabulary')));
+			DB::rollback();
+			return false;
+		}
 
 		// Create the standard post types and statuses
 		if(! $this->create_base_post_types()) {
@@ -680,6 +687,17 @@
 
 		return true;
 	}
+	
+	/**
+	 * Add the tags vocabulary
+	 */	 	
+	private function create_tags_vocabulary()
+	{
+		$vocabulary = new Vocabulary( array( 'name' => 'tags', 'description' => 'Habari\'s tags implementation', 'features' => array( 'multiple', 'free' ) ) );
+		$vocabulary->insert();
+		
+		return true;
+	}
 
 	/**
 	 * Create the first post
@@ -1456,6 +1474,25 @@
 		ACL::create_token( 'manage_dash_modules', _t('Manage dashboard modules'), 'Administration' );
 	}
 
+	private function upgrade_db_post_3749()
+	{
+		$type_id = Vocabulary::object_type_id( 'post' );
+
+		$vocabulary = new Vocabulary( array( 'name' => 'tags', 'description' => 'Habari\'s tags implementation', 'features' => array( 'multiple', 'free' ) ) );
+		$vocabulary->insert();
+		
+		$new_tag = NULL;
+		$prefix = Config::get( 'db_connection' )->prefix;
+
+		$results = DB::get_results( "SELECT ID, tag_text, tag_slug from {$prefix}tags" );
+
+		foreach( $results as $tag ) {
+			$new_tag = $vocabulary->add_term( $tag->tag_text );
+			DB::query( "UPDATE {$prefix}tag2post SET tag_id = ? WHERE tag_id = ?", array( $new_tag->id, $tag->id ) );
+		}
+		DB::exec( "INSERT INTO {object_terms} (term_id, object_id, object_type_id) SELECT tag_id, post_id, {$type_id} AS type_id FROM {$prefix}tag2post" );
+	}
+
 	/**
 	 * Validate database credentials for MySQL
 	 * Try to connect and verify if database name exists

Modified: trunk/htdocs/system/classes/post.php (3828 => 3829)


--- trunk/htdocs/system/classes/post.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/post.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -450,98 +450,11 @@
 	}
 
 	/**
-	 * Save the tags associated to this post into the tags and tags2post tables
+	 * Save the tags associated to this post into the terms and object_terms tables
 	 */
 	private function save_tags()
 	{
-		// no tags? then let's get out'a'here 
-		if (count($this->tags) == 0) {
-			Plugins::act( 'tag_detach_all_from_post_before', $this->id );
-
-			$results = DB::get_column( 'SELECT tag_id FROM {tag2post} WHERE post_id = ?', array( $this->id ) );
-			foreach ( $results as $tag_id ) {
-				Tag::detatch_from_post( $tag_id, $this->id );
-			}
-
-			Plugins::act( 'tag_detach_all_from_post_after', $this->id );
-			return TRUE;
-		} 
-		/*
-		 * First, let's clean the incoming tag text array, ensuring we have
-		 * a unique set of tag texts and slugs.
-		 */
-		$tag_ids_to_post = $clean_tags = array();
-		foreach ( ( array ) $this->tags as $tag )
-			if ( ! in_array( $tag, array_keys( $clean_tags ) ) )
-				if ( ! in_array( $slug = Utils::slugify( $tag ), array_values( $clean_tags ) ) )
-					$clean_tags[$tag] = $slug;
-
-		/* Now, let's insert any *new* tag texts or slugs into the tags table */
-		$placeholders = Utils::placeholder_string( count($clean_tags) );
-		$sql_tags_exist = "SELECT id, tag_text, tag_slug
-			FROM {tags}
-			WHERE tag_text IN ({$placeholders})
-			OR tag_slug IN ({$placeholders})";
-		$params = array_merge( array_keys( $clean_tags ), array_values( $clean_tags ) );
-		$existing_tags = DB::get_results( $sql_tags_exist, $params );
-		if ( count( $existing_tags ) > 0 ) {
-			/* Tags exist which match the text or the slug */
-			foreach ( $existing_tags as $existing_tag ) {
-				/*
-				 * Tag exists.
-				 * Attach post to tag, then remove tag from creation list.
-				 */
-				Tag::attach_to_post( $existing_tag->id, $this->fields['id'] );
-				$tag_ids_to_post[] = $existing_tag->id;
-
-				/*
-				 * We remove it from the clean_tags collection as we only
-				 * want to add to the tags table those tags which don't already exist
-				 */
-				if ( in_array( $existing_tag->tag_text, array_keys( $clean_tags ) ) ) {
-					unset( $clean_tags[$existing_tag->tag_text] );
-				}
-				if ( in_array( $existing_tag->tag_slug, array_values( $clean_tags ) ) ) {
-					foreach ( $clean_tags as $text=>$slug ) {
-						if ( $slug == $existing_tag->tag_slug ) {
-							unset( $clean_tags[$text] );
-							break;
-						}
-					}
-				}
-			}
-		}
-
-//		DB::begin_transaction();
-		/*
-		 * $clean_tags now contains an associative array of tags
-		 * we need to add to the main tags table.
-		 *
-		 * Let's add the new tags to the tags table...
-		 */
-		foreach ( $clean_tags as $new_tag_text=>$new_tag_slug ) {
-			$tag = Tag::create( array( 'tag_text' => $new_tag_text, 'tag_slug' => $new_tag_slug ) );
-			Tag::attach_to_post( $tag->id, $this->fields['id'] );
-			$tag_ids_to_post[]= $tag->id;
-		}
-
-		/*
-		 * Finally, remove the tags which are no longer associated with the
-		 * post.
-		 */
-		$repeat_questions = Utils::placeholder_string( count($tag_ids_to_post) );
-		$sql_delete = "SELECT tag_id FROM {tag2post} WHERE post_id = ? AND tag_id NOT IN ({$repeat_questions})";
-		$params = array_merge( (array) $this->fields['id'], array_values( $tag_ids_to_post ) );
-
-		$result = DB::get_results( $sql_delete, $params );
-
-		foreach ( $result as $t ) {
-			Tag::detatch_from_post( $t->tag_id, $this->fields['id'] );
-		}
-
-//		DB::commit();
-		return TRUE;
-
+		return Tags::save_associations( $this->tags, $this->fields['id'] );
 	}
 
 	/**
@@ -1068,17 +981,10 @@
 	private function get_tags()
 	{
 		if ( empty( $this->tags ) ) {
-			$sql = "
-				SELECT t.tag_text, t.tag_slug
-				FROM {tags} t
-				INNER JOIN {tag2post} t2p
-				ON t.id = t2p.tag_id
-				WHERE t2p.post_id = ?
-				ORDER BY t.tag_text ASC";
-			$result = DB::get_results( $sql, array( $this->fields['id'] ) );
+			$result = Tags::get_associations( $this->fields['id'] );
 			if ( $result ) {
 				foreach ( $result as $t ) {
-					$this->tags[$t->tag_slug] = $t->tag_text;
+					$this->tags[$t->term] = $t->term_display;
 				}
 			}
 		}

Modified: trunk/htdocs/system/classes/posts.php (3828 => 3829)


--- trunk/htdocs/system/classes/posts.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/posts.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -163,40 +163,42 @@
 						$where[] = "{posts}.user_id = ?";
 						$params[] = (int) $paramset['user_id'];
 					}
+				
 				}
+
 				if ( isset( $paramset['tag'] ) || isset( $paramset['tag_slug'] )) {
-					$joins['tag2post_posts'] = ' JOIN {tag2post} ON {posts}.id = {tag2post}.post_id';
-					$joins['tags_tag2post'] = ' JOIN {tags} ON {tag2post}.tag_id = {tags}.id';
+					$joins['tag2post_posts'] = ' JOIN {object_terms} ON {posts}.id = {object_terms}.object_id';
+					$joins['tags_tag2post'] = ' JOIN {terms} ON {object_terms}.term_id = {terms}.id';
 
 					if ( isset( $paramset['tag'] ) ) {
 						if ( is_array( $paramset['tag'] ) ) {
-							$where[] = "{tags}.tag_text IN (" . implode( ',', array_fill( 0, count( $paramset['tag'] ), '?' ) ) . ")";
+							$where[] = "{terms}.term_display IN (" . implode( ',', array_fill( 0, count( $paramset['tag'] ), '?' ) ) . ")" . '  AND {object_terms}.object_type_id = ?';
 							$params = array_merge( $params, $paramset['tag'] );
 						}
 						else {
-							$where[] = '{tags}.tag_text = ?';
+							$where[] = '{terms}.term_display = ? AND {object_terms}.object_type_id = ?';
 							$params[] = (string) $paramset['tag'];
 						}
 					}
 					if ( isset( $paramset['tag_slug'] ) ) {
 						if ( is_array( $paramset['tag_slug'] ) ) {
-							$where[] = "{tags}.tag_slug IN (" . implode( ',', array_fill( 0, count( $paramset['tag_slug'] ), '?' ) ) . ")";
+							$where[] = "{terms}.term IN (" . implode( ',', array_fill( 0, count( $paramset['tag_slug'] ), '?' ) ) . ")" . ' AND {object_terms}.object_type_id = ?';
 							$params = array_merge( $params, $paramset['tag_slug'] );
 						}
 						else {
-							$where[] = '{tags}.tag_slug= ?';
+							$where[] = '{terms}.term= ? AND {object_terms}.object_type_id = ?';
 							$params[] = (string) $paramset['tag_slug'];
 						}
 					}
+					$params[] = Vocabulary::object_type_id( Tags::object_type() );
 				}
 
 				if ( isset( $paramset['all:tag'] ) ) {
+					$joins['tag2post_posts'] = ' JOIN {object_terms} ON {posts}.id = {object_terms}.object_id';
+					$joins['tags_tag2post'] = ' JOIN {terms} ON {object-terms}.term_id = {terms}.id';
 
-					$joins['tag2post_posts'] = ' JOIN {tag2post} ON {posts}.id = {tag2post}.post_id';
-					$joins['tags_tag2post'] = ' JOIN {tags} ON {tag2post}.tag_id = {tags}.id';
-
 					if ( is_array( $paramset['all:tag'] ) ) {
-						$where[] = '{tags}.tag_text IN (' . implode( ',', array_fill( 0, count( $paramset['all:tag'] ), '?' ) ) . ')';
+						$where[] = '{terms}.term_display IN (' . implode( ',', array_fill( 0, count( $paramset['all:tag'] ), '?' ) ) . ')' . ' AND {object_terms}.object_type_id = ?';
 						$params = array_merge( $params, $paramset['all:tag'] );
 
 						$groupby = '{posts}.id';
@@ -204,22 +206,23 @@
 					}
 					else {
 						// this is actually the same as plain 'tag' for a single tag search - go with it
-						$where[] = '{tags}.tag_text = ?';
+						$where[] = '{terms}.term_display = ? AND {object_terms}.object_type_id = ?';
 						$params[] = $paramset['all:tag'];
 					}
-
+					$params[] = Vocabulary::object_type_id( Tags::object_type() );
 				}
 
 				if ( isset( $paramset['not:tag'] ) ) {
 					$nottag = is_array( $paramset['not:tag'] ) ? array_values( $paramset['not:tag'] ) : array( $paramset['not:tag'] );
-
 					$where[] = 'NOT EXISTS (SELECT 1
-						FROM {tag2post}
-						INNER JOIN {tags} ON {tags}.id = {tag2post}.tag_id
-						WHERE {tags}.tag_slug IN (' . implode( ',', array_fill( 0, count( $nottag ), '?' ) ) . ')
-						AND {tag2post}.post_id = {posts}.id)
+						FROM {object_terms}
+						INNER JOIN {terms} ON {terms}.id = {object_terms}.term_id
+						WHERE {terms}.term_display IN (' . implode( ',', array_fill( 0, count( $nottag ), '?' ) ) . ')
+						AND {object_terms}.object_id = {posts}.id
+						AND {object_terms}.object_type_id = ?)
 					';
 					$params = array_merge( $params, $nottag );
+					$params[] = Vocabulary::object_type_id( Tags::object_type() );
 				}
 
 				if ( isset( $paramset['criteria'] ) ) {
@@ -585,6 +588,7 @@
 		$results = DB::$fetch_fn( $query, $params, 'Post' );
 
 		//Utils::debug( $paramarray, $fetch_fn, $query, $params, $results );
+//		var_dump( $query );
 
 		/**
 		 * Return the results

Modified: trunk/htdocs/system/classes/tag.php (3828 => 3829)


--- trunk/htdocs/system/classes/tag.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/tag.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -8,37 +8,52 @@
  * Class which describes a single Tag object
  *
  */
-class Tag extends QueryRecord
+class Tag
 {
 
-	/**
-	 * Return the defined database columns for a Tag.
-	 * @return array Array of columns in the tags table
-	 */
-	public static function default_fields()
-	{
-		return array(
-			'id' => 0,
-			'tag_slug' => '',
-			'tag_text' => ''
-		);
-	}
+	public $tag_text = '';
+	public $tag_slug = '';
+	public $id = 0;
 
+
 	/**
 	 * Constructor for the Tag class.
 	 * @param array $paramarray an associative array of initial Tag field values.
 	 **/
 	public function __construct( $paramarray = array() )
 	{
-		// Defaults
-		$this->fields = array_merge(
-			self::default_fields(),
-			$this->fields,
-			$this->newfields
-		);
+		foreach($paramarray as $key => $value ){
+			$this->$key = $value;
+		}
+	}
 
-		parent::__construct( $paramarray );
-		$this->exclude_fields( 'id' );
+	/**
+	 * function __get
+	 * Overrides QueryRecord __get to implement custom object properties
+	 * @param string Name of property to return
+	 * @return mixed The requested field value
+	 **/
+	public function __get( $name )
+	{
+		$vocabulary = Vocabulary::get( Tags::vocabulary() );
+		$term = Term::get( $vocabulary->id, $this->id );
+
+		switch ($name) {
+			case 'tag':
+			case 'tag_text':
+				$out = $term->term_display;
+				break;
+			case 'slug':
+			case 'tag_slug':
+				$out = $term->term;
+				break;
+			case 'count':
+				$out = $this->get_count();
+				break;
+			default:
+				break;
+		}
+		return $out;
 	}
 
 	/**
@@ -82,6 +97,7 @@
 	{
 		return Tags::get_one( $tag );
 	}
+
 	/**
 	 * Create a tag and save it.
 	 *
@@ -91,7 +107,7 @@
 	static function create( $paramarray )
 	{
 		$tag = new Tag( $paramarray );
-		$tag->insert();
+		$tag = $tag->insert();
 		return $tag;
 	}
 
@@ -104,32 +120,41 @@
 	 */
 	public static function attach_to_post( $tag_id, $post_id )
 	{
+		$vocabulary = Vocabulary::get( Tags::vocabulary() );
+		$term = $vocabulary->get_term( $tag_id );
 		$result = TRUE;
+
 		Plugins::act( 'tag_attach_to_post_before', $tag_id, $post_id );
-		if (0 == (int) DB::get_value( "SELECT COUNT(*) FROM {tag2post} WHERE tag_id = ? AND post_id = ?", array( $tag_id, $post_id ) ) ) {
-			$sql = "INSERT INTO {tag2post} (tag_id, post_id) VALUES (?,?)";
-			$result = DB::query( $sql, array( $tag_id, $post_id ) );
-		}
+
+		$result = $term->associate( Tags::object_type(), $post_id);
+
 		Plugins::act( 'tag_attach_to_post_after', $tag_id, $post_id );
+
 		return $result;
 	}
 
+	/**
+	 * Detaches a tag from a post (removes their association )
+	 *
+	 * @param		tag_id		The ID of the tag
+	 * @param		post_id		The ID of the post
+	 * @return	TRUE or FALSE depending if association was removed.
+	 */
 	public static function detatch_from_post( $tag_id, $post_id )
 	{
-
+		$vocabulary = Vocabulary::get( Tags::vocabulary() );
+		$term = $vocabulary->get_term( $tag_id );
 		Plugins::act( 'tag_detatch_from_post_before', $tag_id, $post_id );
 
-		$result = DB::query( 'DELETE FROM {tag2post} WHERE tag_id = ? AND post_id = ?', array( $tag_id, $post_id ) );
+		$result = $term->dissociate( Tags::object_type(), $post_id );
 
 		// should we delete the tag if it's the only one left?
-		$count = DB::get_value( 'SELECT COUNT(tag_id) FROM {tag2post} WHERE tag_id = ?', array( $tag_id ) );
-
-		if ( $count == 0 ) {
+		if( 0 == count( $term->objects( Tags::object_type() ) ) ) {
 			$delete = true;
 			$delete = Plugins::filter( 'tag_detach_from_post_delete_empty_tag', $delete, $tag_id );
 
 			if ( $delete ) {
-				DB::query( 'DELETE FROM {tags} WHERE id = ?', array( $tag_id ) );
+				$term->delete();
 			}
 		}
 
@@ -146,28 +171,10 @@
 	 */
 	private function setslug()
 	{
-		// determine the base value from:
-		// - the new slug
-		if ( isset( $this->newfields['tag_slug']) && $this->newfields['tag_slug'] != '' ) {
-			$value = $this->newfields['tag_slug'];
-		}
-		// - the existing slug
-		elseif ( $this->fields['tag_slug'] != '' ) {
-			$value = $this->fields['tag_slug'];
-		}
-		// - the new tag's text
-		elseif ( isset( $this->newfields['tag_text'] ) && $this->newfields['tag_text'] != '' ) {
-			$value = $this->newfields['tag_text'];
-		}
-		// - the existing tag text
-		elseif ( $this->fields['tag_text'] != '' ) {
-			$value = $this->fields['tag_text'];
-		}
-
 		// make sure our slug is unique
-		$slug = Plugins::filter( 'tag_setslug', $value );
-		$slug = Utils::slugify( $slug );
-		return $this->newfields['tag_slug'] = $slug;
+		$this->tag_slug = Plugins::filter( 'tag_setslug', $value );
+		$this->tag_slug = Utils::slugify( $slug );
+		return $this->tag_slug;
 	}
 
 	/**
@@ -176,8 +183,10 @@
 	 */
 	public function insert()
 	{
-		$this->setslug();
+		$vocabulary = Vocabulary::get( Tags::vocabulary() );
 
+//		$this->setslug();
+
 		$allow = true;
 		$allow = Plugins::filter( 'tag_insert_allow', $allow, $this );
 		if ( ! $allow ) {
@@ -185,19 +194,13 @@
 		}
 		Plugins::act( 'tag_insert_before', $this );
 
-		// Invoke plugins for all fields, since they're all "changed" when inserted
-		foreach ( $this->fields as $fieldname => $value ) {
-			Plugins::act( 'tag_update_' . $fieldname, $this, ( $this->id == 0 ) ? null : $value, $this->$fieldname );
-		}
+		$term = new Term( array( 'term' => $this->tag_slug, 'term_display' => $this->tag_text ) );
+		$term = $vocabulary->add_term( $term );
 
-		$result = parent::insertRecord( DB::table( 'tags' ) );
-		$this->newfields['id'] = DB::last_insert_id(); // Make sure the id is set in the Tag object to match the row id
-		$this->fields = array_merge( $this->fields, $this->newfields );
-		$this->newfields = array();
 		EventLog::log( sprintf(_t('New tag %1$s (%2$s);  Slug: %3$s'), $this->id, $this->tag_text, $this->tag_slug), 'info', 'content', 'habari' );
 		Plugins::act( 'tag_insert_after', $this );
 
-		return $result;
+		return new Tag( array( 'tag_text' => $term->term_display, 'tag_slug' => $term->term, 'id' => $term->id ) );
 	}
 
 	/**
@@ -206,6 +209,7 @@
 	 */
 	public function update()
 	{
+		$vocabulary = Vocabulary::get( Tags::vocabulary() );
 
 		$allow = true;
 		$allow = Plugins::filter( 'tag_update_allow', $allow, $this );
@@ -215,23 +219,16 @@
 		Plugins::act( 'tag_update_before', $this );
 
 		// Call setslug() only when tag slug is changed
-		if ( isset( $this->newfields['tag_slug'] ) && $this->newfields['tag_slug'] != '' ) {
-			if ( $this->fields['tag_slug'] != $this->newfields['tag_slug'] ) {
-				$this->setslug();
-			}
+		if ( isset( $this->tag_slug ) && $this->tag_slug != '' ) {
+			$this->setslug();
 		}
 
-		// invoke plugins for all fields which have been changed
-		// For example, a plugin action "tag_update_slug" would be
-		// triggered if the tag has a new slug value
-		foreach ( $this->newfields as $fieldname => $value ) {
-			Plugins::act( 'tag_update_' . $fieldname, $this, $this->fields[$fieldname], $value );
-		}
 
-		$result = parent::updateRecord( DB::table( 'tags' ), array( 'id' => $this->id ) );
+		$term = $vocabulary->get_term( $this->id );
+		$term->term = $this->tag_slug;
+		$term->term_display = $this->tag_text;
+		$result = $term->update();
 
-		$this->fields = array_merge( $this->fields, $this->newfields );
-		$this->newfields = array();
 		Plugins::act( 'tag_update_after', $this );
 		return $result;
 	}
@@ -242,6 +239,8 @@
 	 */
 	public function delete()
 	{
+		$vocabulary = Vocabulary::get( Tags::vocabulary() );
+
 		$allow = true;
 		$allow = Plugins::filter( 'tag_delete_allow', $allow, $this );
 		if ( ! $allow ) {
@@ -250,12 +249,10 @@
 		// invoke plugins
 		Plugins::act( 'tag_delete_before', $this );
 
-		// Delete all tag2post records associated with this tag
-		$sql = "DELETE FROM {tag2post} WHERE tag_id = ?";
-		DB::query( $sql, array( $this->id ) );
+		// Delete the actual term record
+		$term = $vocabulary->get_term( $this->id );
+		$result = $vocabulary->delete_term( $term );
 
-		// Delete the parent tags record
-		$result = parent::deleteRecord( DB::table( 'tags' ), array( 'id'=>$this->id ) );
 		EventLog::log( sprintf(_t('Tag %1$s (%2$s) deleted.'), $this->id, $this->tag_text), 'info', 'content', 'habari' );
 
 		Plugins::act( 'tag_delete_after', $this );
@@ -280,7 +277,22 @@
 	 **/
 	protected function get_count()
 	{
-		return (int)DB::get_value( 'SELECT count(tag_id) FROM {tag2post} WHERE tag_id = ?', array( $this->id ) );
+		$vocabulary = Vocabulary::get( Tags::vocabulary() );
+		$term = $vocabulary->get_term( $this->id );
+		return count( $term->objects( Tags::object_type() ) );
 	}
+
+	/**
+	 * Get a count of how many times the tag has been used in a post
+	 * @return integer The number of times the tag has been used
+	 **/
+	public function count( $object_type = 'post' )
+	{
+		$vocabulary = Vocabulary::get( Tags::vocabulary() );
+		$term = $vocabulary->get_term( $this->id );
+		return count( $term->objects( $object_type ) );
+	}
+
 }
+
 ?>

Modified: trunk/htdocs/system/classes/tags.php (3828 => 3829)


--- trunk/htdocs/system/classes/tags.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/tags.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -10,132 +10,23 @@
 */
 class Tags extends ArrayObject
 {
-	protected $get_param_cache; // Stores info about the last set of data fetched that was not a single value
+	private static $vocabulary = 'tags';
+	private static $object_type = 'post';
 
 	/**
 	 * Returns a tag or tags based on supplied parameters.
-	 * @todo This class should cache query results!
-	 *
-	 * @param array $paramarray An associated array of parameters, or a querystring
-	 * @return array An array of Tag objects, or a single Tag object, depending on request
+	 * @return array An array of Tag objects
 	 **/
 	public static function get( $paramarray = array() )
 	{
-		$params = array();
-		$fns = array( 'get_results', 'get_row', 'get_value' );
-		$select = '';
-		// what to select -- by default, everything
-		foreach ( Tag::default_fields() as $field => $value ) {
-			$select .= ( '' == $select )
-				? "{tags}.$field"
-				: ", {tags}.$field";
+		$tags = array();
+		$terms = Vocabulary::get( self::$vocabulary )->get_tree();
+		foreach( $terms as $term ) {
+			$tags[] = new Tag( array( 'tag_text' => $term->term_display, 'tag_slug' => $term->term, 'id' => $term->id ) );
 		}
-		// defaults
-		$orderby = 'id ASC';
-		$nolimit = TRUE;
+		return $tags;
+//		return $terms;
 
-		// Put incoming parameters into the local scope
-		$paramarray = Utils::get_params( $paramarray );
-
-		// Transact on possible multiple sets of where information that is to be OR'ed
-		if ( isset( $paramarray['where'] ) && is_array( $paramarray['where'] ) ) {
-			$wheresets = $paramarray['where'];
-		}
-		else {
-			$wheresets = array( array() );
-		}
-
-		$wheres = array();
-		$join = '';
-		if ( isset( $paramarray['where'] ) && is_string( $paramarray['where'] ) ) {
-			$wheres[] = $paramarray['where'];
-		}
-		else {
-			foreach( $wheresets as $paramset ) {
-				// safety mechanism to prevent empty queries
-				$where = array();
-				$paramset = array_merge((array) $paramarray, (array) $paramset);
-
-				$default_fields = Tag::default_fields();
-				foreach ( Tag::default_fields() as $field => $scrap ) {
-					if ( !isset( $paramset[$field] ) ) {
-						continue;
-					}
-					switch ( $field ) {
-						case 'id':
-							if ( !is_numeric( $paramset[$field] ) ) {
-								continue;
-							}
-						default:
-							$where[] = "{$field}= ?";
-							$params[] = $paramset[$field];
-					}
-				}
-
-				if(count($where) > 0) {
-					$wheres[] = ' (' . implode( ' AND ', $where ) . ') ';
-				}
-			}
-		}
-
-		// Get any full-query parameters
-		$possible = array( 'fetch_fn', 'count', 'nolimit', 'limit', 'offset' );
-		foreach ( $possible as $varname ) {
-			if ( isset( $paramarray[$varname] ) ) {
-				$$varname = $paramarray[$varname];
-			}
-		}
-
-		if ( isset( $fetch_fn ) ) {
-			if ( ! in_array( $fetch_fn, $fns ) ) {
-				$fetch_fn = $fns[0];
-			}
-		}
-		else {
-			$fetch_fn = $fns[0];
-		}
-
-		// is a count being request?
-		if ( isset( $count ) ) {
-			$select = "COUNT($count)";
-			$fetch_fn = 'get_value';
-			$orderby = '';
-		}
-		if ( isset( $limit ) ) {
-			$limit = " LIMIT $limit";
-			if ( isset( $offset ) ) {
-				$limit .= " OFFSET $offset";
-			}
-		}
-		if ( isset( $nolimit ) ) {
-			$limit = '';
-		}
-
-		$query = '
-			SELECT ' . $select
-			. ' FROM {tags} '
-			. $join;
-
-		if ( count( $wheres ) > 0 ) {
-			$query .= ' WHERE ' . implode( " \nOR\n ", $wheres );
-		}
-		$query .= ( ($orderby == '') ? '' : ' ORDER BY ' . $orderby ) . $limit;
-		//Utils::debug($paramarray, $fetch_fn, $query, $params);
-
-		DB::set_fetch_mode(PDO::FETCH_CLASS);
-		DB::set_fetch_class('Tag');
-		$results = DB::$fetch_fn( $query, $params, 'Tag' );
-
-		if ( 'get_results' != $fetch_fn ) {
-			// return the results
-			return $results;
-		}
-		elseif ( is_array( $results ) ) {
-			$c = __CLASS__;
-			$return_value = new $c( $results );
-			$return_value->get_param_cache = $paramarray;
-			return $return_value;
-		}
 	}
 
 	/**
@@ -143,18 +34,11 @@
 	 *
 	 * @return QueryRecord A tag QueryRecord
 	 **/
-	public static function get_one($tag)
+	public static function get_one( $tag )
 	{
-		$params = array();
-		if( is_numeric( $tag ) ) {
-			$params['id'] = $tag;
-		}
-		else {
-			$params['tag_slug'] = Utils::slugify( $tag );
-		}
-		$params['limit'] = 1;
-		$params['fetch_fn'] = 'get_row';
-		return Tags::get( $params );
+		$term = Vocabulary::get( self::$vocabulary )->get_term( $tag );
+		$tag = new Tag( array( 'tag_text' => $term->term_display, 'tag_slug' => $term->term, 'id' => $term->id ) );
+		return $tag;
 	}
 
 	/**
@@ -168,8 +52,6 @@
 	}
 
 	/**
-	 * TODO: be more careful
-	 * INSERT INTO {tag2post} / SELECT $master_tag->ID,post_ID FROM {tag2post} WHERE tag_id = $tag->id" and then "DELETE FROM {tag2post} WHERE tag_id = $tag->id"
 	 * Renames tags.
 	 * If the master tag exists, the tags will be merged with it.
 	 * If not, it will be created first.
@@ -177,9 +59,12 @@
 	 * @param Array tags The tag text, slugs or ids to be renamed
 	 * @param mixed master The Tag to which they should be renamed, or the slug, text or id of it
 	 **/
-	public static function rename($master, $tags)
+	public static function rename($master, $tags, $object_type = 'post' )
 	{
-		$tags = Utils::single_array( $tags );
+		$vocabulary = Vocabulary::get( self::$vocabulary );
+		$type_id = Vocabulary::object_type_id( $object_type );
+
+		$post_ids = array();
 		$tag_names = array();
 		$post_ids = array();
 
@@ -187,63 +72,52 @@
 		foreach ( $tags as $tag ) {
 			
 			$posts = array();
-//			$post_ids = array();
-			$tag = Tags::get_one( $tag );
+			$term = $vocabulary->get_term( $tag );
 			
 			// get all the post ID's tagged with this tag
-			$posts = DB::get_results( 'SELECT post_id FROM {tag2post} WHERE tag_id = ?', array( $tag->id ) );
+			$posts = $term->objects( $object_type );
 
 			if ( count( $posts ) > 0 ) {
-
-				// build a list of all the post_id's we need for the new tag
-				foreach ( $posts as $post ) {
-					$post_ids[] = $post->post_id;
-				}
-				$tag_names[] = $tag->tag;
+				// merge the current post ids into the list of all the post_ids we need for the new tag
+				$post_ids = array_merge( $post_ids, $posts );
 			}
 
-			Tags::delete( $tag );
+			$tag_names[] = $tag;
+			$vocabulary->delete_term( $term->id );
 		}
 		
-		// get the master tag
-		$master_tag = Tags::get_one($master);
+		// get the master term
+		$master_term = $vocabulary->get_term( $master );
 		
-		if ( !isset($master_tag->slug) ) {
+		if ( !isset($master_term->term ) ) {
 			// it didn't exist, so we assume it's tag text and create it
-			$master_tag = Tag::create(array('tag_slug' => Utils::slugify($master), 'tag_text' => $master));
+			$master_term = $vocabulary->add_term( $master );
 			
 			$master_ids = array();
 		}
 		else {
 			// get the posts the tag is already on so we don't duplicate them
-			$master_posts = DB::get_results( 'SELECT post_id FROM {tag2post} WHERE tag_id = ?', array( $master_tag->id ) );
+			$master_ids = $master_term->objects( $object_type );
 			
-			$master_ids = array();
-			
-			foreach ( $master_posts as $master_post ) {
-				$master_ids[] = $master_post->post_id;
-			}
-			
 		}
 
 		if ( count( $post_ids ) > 0 ) {
-			
 			// only try and add the master tag to posts it's not already on
 			$post_ids = array_diff( $post_ids, $master_ids );
-			
-			// link the master tag to each distinct post we removed tags from
-			foreach ( $post_ids as $post_id ) {
-
-				DB::query( 'INSERT INTO {tag2post} ( tag_id, post_id ) VALUES ( ?, ? )', array( $master_tag->id, $post_id ) );
-
-			}
-
 		}
+		else {
+			$post_ids = $master_ids;
+		}
+		// link the master tag to each distinct post we removed tags from
+		foreach ( $post_ids as $post_id ) {
+			$master_term->associate( $object_type, $post_id );
+		}
+
 		EventLog::log(sprintf(
 			_n('Tag %s has been renamed to %s.',
 				 'Tags %s have been renamed to %s.',
-				  count($tags)
-			), implode($tag_names, ', '), $master ), 'info', 'tag', 'habari'
+				  count( $tags )
+			), implode( $tag_names, ', ' ), $master ), 'info', 'tag', 'habari'
 		);
 
 	}
@@ -255,48 +129,95 @@
 	 **/
 	public static function max_count()
 	{
-		return DB::get_value( 'SELECT count( t2.post_id ) AS max FROM {tags} t, {tag2post} t2 WHERE t2.tag_id = t.id GROUP BY t.id ORDER BY max DESC LIMIT 1' );
+		$vocabulary = Vocabulary::get( self::$vocabulary );
+		return DB::get_value( 'SELECT count( t2.object_id ) AS max FROM {terms} t, {object_terms} t2 WHERE t2.term_id = t.id AND t.vocabulary_id = ? GROUP BY t.id ORDER BY max DESC LIMIT 1', array( $vocabulary->id ) );
 	}
 
 	/**
+	 * Returns the number of tags in the database.
+	 *
+	 * @return int The number of tags in the database.
+	 **/
+	public static function count_total()
+	{
+		return count( Vocabulary::get( self::$vocabulary )->get_tree() );
+	}
+
+	/**
 	 * Returns the count of times a tag is used.
 	 *
 	 * @param mixed The tag to count usage.
 	 * @return int The number of times a tag is used.
 	 **/
-	public static function post_count($tag)
+	public static function post_count($tag, $object_type = 'post' )
 	{
-		$params = array();
-		$params['fetch_fn'] = 'get_row';
-		if ( is_int( $tag ) ) {
-			$params['id'] = $tag;
-		}
-		else if ( is_string( $tag ) ) {
-			$params['tag_slug'] = Utils::slugify( $tag );
-		}
-		$tag =  Tags::get( $params );
-		return $tag->count;
+		$tag = Tags::get_one( $tag );
+		return $tag->count( $object_type );
 	}
 
 	public static function get_by_text($tag)
 	{
-		return Tags::get( array( 'tag_text' => $tag, 'fetch_fn' => 'get_row', 'limit' => 1  ) );
+		return Tags::get_one( $tag );
 	}
 
 	public static function get_by_slug($tag)
 	{
-		return Tags::get( array( 'tag_slug' => $tag, 'fetch_fn' => 'get_row', 'limit' => 1  ) );
+		return Tags::get_one( $tag );
 	}
 
 	/**
 	 * Returns a Tag object based on a supplied ID
 	 *
-	 * @param		tag_id	The ID of the tag to retrieve
+	 * @param Integer tag_id The ID of the tag to retrieve
 	 * @return	A Tag object
 	 */
 	public static function get_by_id( $tag )
 	{
-		return Tags::get( array( 'id' => $tag, 'fetch_fn' => 'get_row', 'limit' => 1 ) );
+		return Tags::get_one( $tag );
 	}
+
+	/**
+	 * Returns the name of this vocabulary
+	 * 
+	 * @return String The vocabulary name
+	 */
+	public static function vocabulary()
+	{
+		return self::$vocabulary;
+	}
+
+	/**
+	 * Returns the default type Tags uses
+	 *
+	 * @return String The default type name
+	 */
+	public static function object_type()
+	{
+		return self::$object_type;
+	}
+
+	/**
+	 * Save the tags associated to this object into the terms and object_terms tables
+	 *
+	 * @param Array $tags strings. The tag names to associate to the object
+	 * @param Integer $object_id. The id of the object being tagged
+	 * @param String $object_type. The name of the type of the object being tagged. Defaults to post
+	 *
+	 * @return boolean. Whether the associating succeeded or not. TRUE
+	 */
+
+	public static function save_associations( $tags, $object_id, $object_type = 'post' )
+	{
+		$vocabulary = Vocabulary::get( self::$vocabulary );
+		return $vocabulary->set_object_terms( $object_type, $object_id, $tags );
+	}
+
+	public static function get_associations( $object_id, $object_type = 'post' )
+	{
+		$vocabulary = Vocabulary::get( self::$vocabulary );
+		return $vocabulary->get_object_terms( $object_type, $object_id );
+
+	}
+
 }
 ?>

Modified: trunk/htdocs/system/classes/term.php (3828 => 3829)


--- trunk/htdocs/system/classes/term.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/term.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -3,9 +3,9 @@
 /**
  * Term Class
  *
+ * Term is part of the vocabulary system. A term exists in a vocabulary and can
+ * be associated with objects, such as posts.
  *
- * @version $Id$
- * @copyright 2009
  */
 
 class Term extends QueryRecord
@@ -42,7 +42,7 @@
 			self::default_fields(),
 			$this->fields
 		);
-		
+
 		if(is_string($paramarray)) {
 			$paramarray = array(
 				'term_display' => $paramarray,
@@ -62,29 +62,35 @@
 
 		$this->exclude_fields( 'id' );
 	}
-	
+
 	/**
 	 * Fetch a term from a specified vocabulary
-	 * 
+	 *
 	 * @param mixed $vocab_id The id of a vocabulary, or a Vocabulary object
-	 * @param mixed $term_id A Term id or null for the root node of the vocabulary
+	 * @param mixed $term A Term id, display text, or null for the root node of the vocabulary
 	 * @return Term The requested Term object instance
 	 */
-	public static function get($vocab_id, $term_id = null)
+	public static function get( $vocab_id, $term = null )
 	{
-		if($vocab_id instanceof Vocabulary) {
+		if ( $vocab_id instanceof Vocabulary ) {
 			$vocab_id = $vocab_id->id;
 		}
-		$params = array($vocab_id);
+		$params = array( $vocab_id );
 		$query = '';
-		if(is_null($term_id)) {
+		if ( is_null( $term )  ) {
 			// The root node has an mptt_left value of 1
 			$params[] = 1;
-			$query = 'SELECT * FROM {terms} WHERE vocabulary_id=? AND mptt_left=?';
+			$query = 'SELECT * FROM {terms} WHERE vocabulary_id = ? AND mptt_left = ?';
 		}
 		else {
-			$params[] = $term_id;
-			$query = 'SELECT * FROM {terms} WHERE vocabulary_id=? AND id=?';
+			$term = Utils::slugify( $term );
+			$params[] = $term;
+			if ( is_numeric( $term ) ) {
+				$query = 'SELECT * FROM {terms} WHERE vocabulary_id = ? AND id = ?';
+			}
+			else {
+				$query = 'SELECT * FROM {terms} WHERE vocabulary_id = ? AND term = ?';
+			}
 		}
 		return DB::get_row( $query, $params, 'Term' );
 	}
@@ -114,7 +120,7 @@
 		// We've inserted the term, reset newfields
 		$this->newfields = array();
 
-		EventLog::log( sprintf(_t('New term %1$s (%2$s)'), $this->id, $this->name), 'info', 'content', 'habari' );
+		EventLog::log( _t( 'New term %1$s: %2$s', array( $this->id, $this->term_display ) ), 'info', 'content', 'habari' );
 
 		// Let plugins act after we write to the database
 		Plugins::act( 'term_insert_after', $this );
@@ -157,8 +163,10 @@
 		}
 		Plugins::act( 'term_delete_before', $this );
 
+		DB::query( "DELETE FROM {object_terms} WHERE term_id = ?", array( $this->id) );
+
 		$result = parent::deleteRecord( '{terms}', array( 'id'=>$this->id ) );
-		EventLog::log( sprintf(_t('Term %1$s (%2$s) deleted.'), $this->id, $this->name), 'info', 'content', 'habari' );
+		EventLog::log( sprintf(_t('Term %1$s (%2$s) deleted.'), $this->id, $this->term_display), 'info', 'content', 'habari' );
 
 		// Let plugins act after we write to the database
 		Plugins::act( 'term_delete_after', $this );
@@ -171,7 +179,6 @@
 	 **/
 	public function ancestors()
 	{
-		// TODO There should probably be a Term::get()
 		$params = array($this->vocabulary_id, $this->mptt_left, $this->mptt_right );
 		$query = 'SELECT * FROM {terms} WHERE vocabulary_id=? AND mptt_left<? AND mptt_right>? ORDER BY mptt_left ASC';
 		return DB::get_results( $query, $params, 'Term' );
@@ -183,7 +190,6 @@
 	 **/
 	public function descendants()
 	{
-		// TODO There should probably be a Term::get()
 		$params = array($this->vocabulary_id, $this->mptt_left, $this->mptt_right);
 		$query = 'SELECT * FROM {terms} WHERE vocabulary_id=? AND mptt_left>? AND mptt_right<? ORDER BY mptt_left ASC';
 		return DB::get_results( $query, $params, 'Term' );
@@ -195,7 +201,6 @@
 	 **/
 	public function parent()
 	{
-		// TODO There should probably be a Term::get()
 		$params = array($this->vocabulary_id, $this->mptt_left, $this->mptt_right);
 		$query = 'SELECT * FROM {terms} WHERE vocabulary_id=? AND mptt_left<? AND mptt_right>? ORDER BY mptt_left DESC LIMIT 1';
 		return DB::get_row( $query, $params, 'Term' );
@@ -237,7 +242,7 @@
 	ON child.mptt_left BETWEEN parent.mptt_left AND parent.mptt_right
 	AND child.vocabulary_id = parent.vocabulary_id
 WHERE parent.mptt_left > :left AND parent.mptt_right < :right
-AND parent.vocabulary_id = :vocab
+	AND parent.vocabulary_id = :vocab
 GROUP BY child.term
 HAVING COUNT(child.term)=1
 ORDER BY NULL
@@ -248,22 +253,54 @@
 	/**
 	 * Find objects of a given type associated with this Term.
 	 *
+	 * @param $type string. The name of the object type for which the associations are wanted.
 	 * @return Array of object ids associated with this term for the given type.
 	 **/
-	public function objects($type)
+	public function objects( $type )
 	{
+		$type_id = Vocabulary::object_type_id( $type );
+		$results = DB::get_column( "SELECT object_id FROM {object_terms} WHERE term_id = ? AND object_type_id = ?", array( $this->id, $type_id ) );
+		return $results;
 	}
 
 	/**
 	 * Associate this term to an object of a certain type via its id.
+	 * @param $type string. The name of the object type we want to set an association for
+	 * @param $id integer. The object's id
 	 *
 	 **/
-	public function associate($type, $id)
+	public function associate( $type, $id )
 	{
+		$result = TRUE;
+		$type_id = Vocabulary::object_type_id( $type );
+
+		Plugins::act( 'term_associate_to_object_before', $this->id, $id, $type_id );
+
+		if( ! DB::exists( "{object_terms}", array( 'term_id' => $this->id, 'object_id' => $id, 'object_type_id' => $type_id ) ) ) {
+			$result = DB::insert( "{object_terms}", array( 'term_id' => $this->id, 'object_id' => $id, 'object_type_id' => $type_id ) );
+		}
+
+		Plugins::act( 'term_associate_to_object_after', $this->id, $id, $type_id );
+
+		return $result;
 	}
 
-}
+	/**
+	 * Associate this term to an object of a certain type via its id.
+	 * @param $type string. The name of the object type we want to unset an association for
+	 * @param $id integer. The object's id
+	 *
+	 **/
+	public function dissociate( $type = NULL, $id = NULL )
+	{
+		$result = TRUE;
 
+		$type_id = Vocabulary::object_type_id( $type );
 
+		$result = DB::query( "DELETE FROM {object_terms} WHERE term_id = ? AND object_id = ? AND object_type_id = ?", array( $this->id, $id, $type_id ) );
+		return $result;
+	}
 
-?>
\ No newline at end of file
+}
+
+?>

Modified: trunk/htdocs/system/classes/utils.php (3828 => 3829)


--- trunk/htdocs/system/classes/utils.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/utils.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -61,7 +61,7 @@
 		}
 		header('Location: ' . $url, true, 302);
 
-		if (!$continue) exit;
+		if ( !$continue ) exit;
 	}
 
 	/**
@@ -1004,7 +1004,7 @@
 			exit;
 		}
 	}
-	
+
 	/**
 	 * Returns a regex pattern equivalent to the given glob pattern
 	 *
@@ -1026,13 +1026,12 @@
 		$pattern = str_replace( array_keys( $braces ), array_values( $braces ), $pattern );
 		return '/'.$pattern.'/';
 	}
-	
-	
+
 	/**
 	 * Return the port used for a specific URL scheme
-	 * 
+	 *
 	 * @param string $scheme The scheme in question
-	 * @return integer the port used for teh scheme
+	 * @return integer the port used for the scheme
 	 */
 	public static function scheme_ports( $scheme = null )
 	{
@@ -1051,7 +1050,7 @@
 			'imaps' => 993,
 			'pop3s' => 995,
 		);
-		if(is_null($scheme)) {
+		if ( is_null($scheme) ) {
 			return $scheme_ports;
 		}
 		return $scheme_ports[$scheme];

Modified: trunk/htdocs/system/classes/version.php (3828 => 3829)


--- trunk/htdocs/system/classes/version.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/version.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -14,7 +14,8 @@
 {
 	// DB and API versions are aligned with the SVN revision
 	// number in which they last changed.
-	const DB_VERSION = 3702;
+//	const DB_VERSION = 3702;
+	const DB_VERSION = 3749;
 	const API_VERSION = 3124;
 
 	const HABARI_VERSION = '0.7-alpha';

Modified: trunk/htdocs/system/classes/vocabulary.php (3828 => 3829)


--- trunk/htdocs/system/classes/vocabulary.php	2009-11-25 04:37:47 UTC (rev 3828)
+++ trunk/htdocs/system/classes/vocabulary.php	2009-11-25 04:45:07 UTC (rev 3829)
@@ -3,9 +3,8 @@
 /**
  * Vocabulary Class
  *
+ * Vocabulary is part of the taxonomy system. A vocabulary holds terms and has features.
  *
- * @version $Id$
- * @copyright 2009
  */
 
 class Vocabulary extends QueryRecord
@@ -56,12 +55,13 @@
 		$out = parent::__get( $name );
 		switch($name) {
 			case 'features':
-				return unserialize($out);
+				$out = unserialize($out);
+				break;
 		}
-		if ( is_null( $out ) ) {
-			$features = unserialize( parent::__get( 'features' ) );
-			return in_array($name, $features);
-		}
+//		if ( is_null( $out ) ) {
+//			$features = unserialize( parent::__get( 'features' ) );
+//			return in_array($name, $features);
+//		}
 		return $out;
 	}
 
@@ -73,10 +73,10 @@
 	{
 		return DB::get_row( 'SELECT * FROM {vocabularies} WHERE name=?', array($name), 'Vocabulary' );
 	}
-	
+
 	/**
 	 * Return a Vocabulary by id
-	 * 
+	 *
 	 * @param integer $id The id of the vocabulary
 	 * @return Vocabulary The object requested
 	 */
@@ -84,10 +84,10 @@
 	{
 		return DB::get_row( 'SELECT * FROM {vocabularies} WHERE id=?', array($id), 'Vocabulary' );
 	}
-	
+
 	/**
 	 * Return all vocabularies as Vocabulary objects
-	 * 
+	 *
 	 * @return array An array of Vocabulary objects
 	 */
 	public static function get_all()
@@ -124,10 +124,22 @@
 
 	/**
 	 * Return the Term objects associated to that type of object with that id in any vocabulary.
+	 * For example, return all terms associated with a particular post, from all vocabularies.
+	 *
 	 * @return array Array of Vocabulary names
 	 **/
 	public static function get_all_object_terms($object_type, $id)
 	{
+		$results = DB::get_results(
+			'SELECT id, term, term_display FROM {terms}
+			JOIN {object_terms ON {terms}.id = {object_terms}.term_id
+			WHERE {object_terms}.object_type_id = ?
+				AND {object_terms}.object_id = ?',
+			array( self::object_type_id( $object_type ), $id ),
+			'Term'
+		);
+
+		return $results;
 	}
 
 	/**
@@ -159,17 +171,17 @@
 		}
 		Plugins::act( 'vocabulary_insert_before', $this );
 
-		if(isset($this->newfields['features'])) {
+		if ( isset($this->newfields['features']) ) {
 			$this->newfields['features'] = serialize($this->newfields['features']);
 		}
-		if(isset($this->fields['features'])) {
+		if ( isset($this->fields['features']) ) {
 			$this->fields['features'] = serialize($this->fields['features']);
 		}
 		$result = parent::insertRecord( '{vocabularies}' );
-		if(isset($this->newfields['features'])) {
+		if ( isset($this->newfields['features']) ) {
 			$this->newfields['features'] = unserialize($this->newfields['features']);
 		}
-		if(isset($this->fields['features'])) {
+		if ( isset($this->fields['features']) ) {
 			$this->fields['features'] = unserialize($this->fields['features']);
 		}
 
@@ -214,17 +226,17 @@
 		}
 		Plugins::act( 'vocabulary_update_before', $this );
 
-		if(isset($this->newfields['features'])) {
+		if ( isset($this->newfields['features']) ) {
 			$this->newfields['features'] = serialize($this->newfields['features']);
 		}
-		if(isset($this->fields['features'])) {
+		if ( isset($this->fields['features']) ) {
 			$this->fields['features'] = serialize($this->fields['features']);
 		}
 		$result = parent::updateRecord( '{vocabularies}', array( 'id' => $this->id ) );
-		if(isset($this->newfields['features'])) {
+		if ( isset($this->newfields['features']) ) {
 			$this->newfields['features'] = unserialize($this->newfields['features']);
 		}
-		if(isset($this->fields['features'])) {
+		if ( isset($this->fields['features']) ) {
 			$this->fields['features'] = unserialize($this->fields['features']);
 		}
 
@@ -326,14 +338,127 @@
 	}
 
 	/**
-	 * Gets the Term objects associated to that type of object with that id.
+	 * Gets the Term objects associated to that type of object with that id in this vocabulary
+	 * For example, return all terms in this vocabulary that are associated with a particular post
+	 *
+	 * @param String the name of the object type
+	 * @param integer The id of the object for which you want the terms
 	 * @return Array The Term objects requested
 	 **/
 	public function get_object_terms($object_type, $id)
 	{
+		$results = DB::get_results(
+			'SELECT id, term, term_display FROM {terms}
+			JOIN {object_terms} ON {terms}.id = {object_terms}.term_id
+			WHERE {terms}.vocabulary_id = ?
+				AND {object_terms}.object_type_id = ?
+				AND {object_terms}.object_id = ?',
+			array( $this->id, self::object_type_id( $object_type ), $id ),
+			'Term'
+		);
+
+		return $results;
 	}
 
 	/**
+	 * Sets the Term objects associated to that type of object with that id in this vocabulary
+	 *
+	 * @param String the name of the object type
+	 * @param Integer The id of the object for which you want the terms
+	 * @param Array. The names of the terms to associate
+	 *
+	 * @return boolean. Whether the associations were successful or not
+	 **/
+	public function set_object_terms( $object_type, $id, $terms )
+	{
+		// no terms? then let's get out'a'here
+		if (count($terms) == 0) {
+			Plugins::act( 'term_detach_all_from_object_before', $this->id );
+
+			$results = $this->get_object_terms( $object_type, $this->id );
+			foreach ( $results as $term ) {
+				$term->dissociate( $term->id, $id );
+			}
+
+			Plugins::act( 'term_detach_all_from_object_after', $this->id );
+			return TRUE;
+		}
+		/*
+		 * First, let's clean the incoming tag text array, ensuring we have
+		 * a unique set of tag texts and slugs.
+		 */
+		$term_ids_to_object = $clean_terms = array();
+		foreach ( ( array ) $terms as $term )
+			if ( ! in_array( $term, array_keys( $clean_terms ) ) )
+				if ( ! in_array( $slug = Utils::slugify( $term ), array_values( $clean_terms ) ) )
+					$clean_terms[$term] = $slug;
+
+		/* Now, let's insert any *new* tag texts or slugs into the tags table */
+		$placeholders = Utils::placeholder_string( count( $clean_terms ) );
+		$sql_terms_exist = "SELECT id, term_display, term
+			FROM {terms}
+			WHERE term_display IN ({$placeholders})
+			OR term IN ({$placeholders})";
+		$params = array_merge( array_keys( $clean_terms ), array_values( $clean_terms ) );
+		$existing_terms = DB::get_results( $sql_terms_exist, $params, 'Term' );
+		if ( count( $existing_terms ) > 0 ) {
+			/* Tags exist which match the text or the slug */
+			foreach ( $existing_terms as $existing_term ) {
+				/*
+				 * Tag exists.
+				 * Attach post to tag, then remove tag from creation list.
+				 */
+				$existing_term->associate( $object_type, $id );
+				$term_ids_to_object[] = $existing_term->id;
+
+				/*
+				 * We remove it from the clean_terms collection as we only
+				 * want to add to the terms table those terms which don't already exist
+				 */
+				if ( in_array( $existing_term->term_display, array_keys( $clean_terms ) ) ) {
+					unset( $clean_terms[$existing_term->term_display] );
+				}
+				if ( in_array( $existing_term->term, array_values( $clean_terms ) ) ) {
+					foreach ( $clean_terms as $text => $slug ) {
+						if ( $slug == $existing_term->term ) {
+							unset( $clean_terms[$text] );
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		/*
+		 * $clean_terms now contains an associative array of terms
+		 * we need to add to the main terms table, so add them
+		 *
+		 */
+		foreach ( $clean_terms as $new_term_text => $new_term_slug ) {
+			$term = new Term( array( 'term_display' => $new_term_text, 'term' => $new_term_slug ) );
+			$this->add_term( $term );
+			$term->associate( $object_type, $id );
+			$term_ids_to_object[] = $term->id;
+		}
+
+		/*
+		 * Finally, remove the terms which are no longer associated with the object.
+		 */
+		$repeat_questions = Utils::placeholder_string( count( $term_ids_to_object ) );
+		$sql_delete = "SELECT term_id FROM {object_terms} WHERE object_id = ? AND term_id NOT IN ({$repeat_questions}) AND object_type_id = ?";
+		$params = array_merge( (array) $id, array_values( $term_ids_to_object ), (array)Vocabulary::object_type_id( $object_type ) );
+
+		$result = DB::get_column( $sql_delete, $params );
+
+		foreach ( $result as $t ) {
+			$term = $this->get_term( $t );
+			$term->dissociate( $object_type, $id );
+		}
+
+		return TRUE;
+	}
+
+	/**
 	 * Remove the term from the vocabulary.  Convenience method to ->get_term('foo')->delete().
 	 *
 	 **/
@@ -382,10 +507,35 @@
 	 **/
 	public function get_tree()
 	{
-		// TODO There should probably be a Term::get()
 		return DB::get_results( 'SELECT * FROM {terms} WHERE vocabulary_id=? ORDER BY mptt_left ASC', array($this->id), 'Term' );
 	}
 
+	/**
+	 * inserts a new object type into the database, if it doesn't exist
+	 * @param string The name of the new post type
+	 * @param bool Whether the new post type is active or not
+	 * @return none
+	**/
+	public static function add_object_type( $type )
+	{
+		$params = array( 'name' => $type );
+		if ( ! DB::exists( "{object_types}", $params ) ) {
+			DB::insert( "{object_types}", $params );
+		}
+	}
+
+	/**
+	 * Return the object type id for a named object, such as a post
+	 *
+	 * @param string $name The type of object
+	 * @return integer The id of the object type
+	*/
+	public static function object_type_id( $type )
+	{
+		$id = (int)DB::get_value( "SELECT id FROM {object_types} WHERE name = ?", array( $type ) );
+		return $id;
+
+	}
 }
 
-?>
\ No newline at end of file
+?>
Reply all
Reply to author
Forward
0 new messages