From 33b09567cec207d94a9c24c5c1fb65621d300035 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Tue, 22 Mar 2011 22:19:23 -0700 Subject: [PATCH] History VIew Added. Fixed Relationships between History and Episode/Indexer. Indexer now uses int as ID, string caused issues. Get single Indexer by ID. --- NzbDrone.Core.Test/HistoryProviderTest.cs | 8 +- NzbDrone.Core/CentralDispatch.cs | 20 +- NzbDrone.Core/Providers/HistoryProvider.cs | 2 +- NzbDrone.Core/Providers/IIndexerProvider.cs | 1 + NzbDrone.Core/Providers/IndexerProvider.cs | 5 + .../Providers/RssItemProcessingProvider.cs | 81 +- NzbDrone.Core/Repository/Episode.cs | 1 - NzbDrone.Core/Repository/History.cs | 8 +- NzbDrone.Core/Repository/Indexer.cs | 4 +- NzbDrone.Web/Content/telerik.common.min.css | 1474 ++++++++++++++++- NzbDrone.Web/Controllers/HistoryController.cs | 62 + NzbDrone.Web/Models/HistoryModel.cs | 23 + NzbDrone.Web/NzbDrone.Web.csproj | 1 + NzbDrone.Web/Views/History/Index.aspx | 62 + 14 files changed, 1704 insertions(+), 48 deletions(-) create mode 100644 NzbDrone.Web/Controllers/HistoryController.cs create mode 100644 NzbDrone.Web/Models/HistoryModel.cs create mode 100644 NzbDrone.Web/Views/History/Index.aspx diff --git a/NzbDrone.Core.Test/HistoryProviderTest.cs b/NzbDrone.Core.Test/HistoryProviderTest.cs index 2c44f3722..be98f4a5f 100644 --- a/NzbDrone.Core.Test/HistoryProviderTest.cs +++ b/NzbDrone.Core.Test/HistoryProviderTest.cs @@ -20,7 +20,7 @@ namespace NzbDrone.Core.Test public void AllItems() { //Setup - var indexer = new Indexer { Enabled = true, IndexerName = "NzbMatrix", Order = 1, RssUrl = "http://www.nzbmatrix.com" }; + var indexer = new Indexer { Enabled = true, IndexerId = 0, IndexerName = "NzbMatrix", Order = 1, RssUrl = "http://www.nzbmatrix.com" }; var series = new Series { SeriesId = 5656, @@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test Date = DateTime.Now, IsProper = false, Quality = QualityTypes.TV, - IndexerName = indexer.IndexerName, + IndexerId = indexer.IndexerId, EpisodeId = episode.EpisodeId }); @@ -105,7 +105,7 @@ namespace NzbDrone.Core.Test Date = DateTime.Now, IsProper = false, Quality = QualityTypes.TV, - IndexerName = indexer.IndexerName, + IndexerId = indexer.IndexerId, EpisodeId = episode.EpisodeId }); @@ -161,7 +161,7 @@ namespace NzbDrone.Core.Test Date = DateTime.Now, IsProper = false, Quality = QualityTypes.TV, - IndexerName = indexer.IndexerName, + IndexerId = indexer.IndexerId, EpisodeId = episode.EpisodeId }); diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index bbcd65f06..b7faf0a59 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -24,6 +24,7 @@ namespace NzbDrone.Core private static IKernel _kernel; private static readonly Object kernelLock = new object(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private static string _startupPath; public static void BindKernel() { @@ -86,6 +87,9 @@ namespace NzbDrone.Core SetupIndexers(_kernel.Get()); //Setup the default set of indexers on start-up SetupDefaultQualityProfiles(_kernel.Get()); //Setup the default QualityProfiles on start-up + //Store the startup path + _startupPath = AppPath; + //Get the Timers going var config = _kernel.Get(); var timer = _kernel.Get(); @@ -116,6 +120,11 @@ namespace NzbDrone.Core } } + public static string StartupPath + { + get { return _startupPath; } + } + public static IKernel NinjectKernel { get @@ -134,6 +143,8 @@ namespace NzbDrone.Core repository.GetPaged(0, 1); repository.GetPaged(0, 1); repository.GetPaged(0, 1); + repository.GetPaged(0, 1); + repository.GetPaged(0, 1); } /// @@ -182,6 +193,7 @@ namespace NzbDrone.Core var nzbMatrixIndexer = new Indexer { + IndexerId = 1, IndexerName = "NzbMatrix", RssUrl = nzbMatrixRss, ApiUrl = nzbMatrixApi, @@ -190,6 +202,7 @@ namespace NzbDrone.Core var nzbsOrgIndexer = new Indexer { + IndexerId = 2, IndexerName = "NzbsOrg", RssUrl = nzbsOrgRss, ApiUrl = nzbsOrgApi, @@ -198,6 +211,7 @@ namespace NzbDrone.Core var nzbsrusIndexer = new Indexer { + IndexerId = 3, IndexerName = "Nzbsrus", RssUrl = nzbsrusRss, ApiUrl = nzbsrusApi, @@ -206,7 +220,7 @@ namespace NzbDrone.Core //NzbMatrix Logger.Debug("Checking for NzbMatrix Indexer"); - var nzbMatix = repository.Single("NzbMatrix"); + var nzbMatix = repository.Single(1); if (nzbMatix == null) { Logger.Debug("Adding new Indexer: NzbMatrix"); @@ -223,7 +237,7 @@ namespace NzbDrone.Core //Nzbs.org Logger.Debug("Checking for Nzbs.org"); - var nzbsOrg = repository.Single("NzbsOrg"); + var nzbsOrg = repository.Single(2); if (nzbsOrg == null) { Logger.Debug("Adding new Indexer: Nzbs.org"); @@ -240,7 +254,7 @@ namespace NzbDrone.Core //Nzbsrus Logger.Debug("Checking for Nzbsrus"); - var nzbsrus = repository.Single("Nzbsrus"); + var nzbsrus = repository.Single(3); if (nzbsrus == null) { Logger.Debug("Adding new Indexer: Nzbsrus"); diff --git a/NzbDrone.Core/Providers/HistoryProvider.cs b/NzbDrone.Core/Providers/HistoryProvider.cs index 3ff35aaf1..fd09a0520 100644 --- a/NzbDrone.Core/Providers/HistoryProvider.cs +++ b/NzbDrone.Core/Providers/HistoryProvider.cs @@ -44,7 +44,7 @@ namespace NzbDrone.Core.Providers public void Insert(History item) { _sonicRepo.Add(item); - Logger.Info("Item added to history: {0} - {1}x{2:00}", item.Episode.Series.Title, item.Episode.SeasonNumber, item.Episode.EpisodeNumber); + //Logger.Info("Item added to history: {0} - {1}x{2:00}", item.Episode.Series.Title, item.Episode.SeasonNumber, item.Episode.EpisodeNumber); } public bool Exists(int episodeId, QualityTypes quality, bool proper) diff --git a/NzbDrone.Core/Providers/IIndexerProvider.cs b/NzbDrone.Core/Providers/IIndexerProvider.cs index 8c7c5e971..a13f8e4a5 100644 --- a/NzbDrone.Core/Providers/IIndexerProvider.cs +++ b/NzbDrone.Core/Providers/IIndexerProvider.cs @@ -12,5 +12,6 @@ namespace NzbDrone.Core.Providers List AllIndexers(); List EnabledIndexers(); void Update(Indexer indexer); + Indexer Single(int indexerId); } } diff --git a/NzbDrone.Core/Providers/IndexerProvider.cs b/NzbDrone.Core/Providers/IndexerProvider.cs index d7b94fa87..d7f044d81 100644 --- a/NzbDrone.Core/Providers/IndexerProvider.cs +++ b/NzbDrone.Core/Providers/IndexerProvider.cs @@ -39,6 +39,11 @@ namespace NzbDrone.Core.Providers _sonicRepo.Update(indexer); } + public Indexer Single(int indexerId) + { + return _sonicRepo.Single(indexerId); + } + #endregion } } diff --git a/NzbDrone.Core/Providers/RssItemProcessingProvider.cs b/NzbDrone.Core/Providers/RssItemProcessingProvider.cs index 6630c14ad..71360b822 100644 --- a/NzbDrone.Core/Providers/RssItemProcessingProvider.cs +++ b/NzbDrone.Core/Providers/RssItemProcessingProvider.cs @@ -53,7 +53,7 @@ namespace NzbDrone.Core.Providers var episodeParseResults = Parser.ParseEpisodeInfo(nzb.Title); - if (episodeParseResults.Count() > 1) + if (episodeParseResults.Count() > 0) { ProcessStandardItem(nzb, indexer, episodeParseResults); return false; @@ -70,6 +70,7 @@ namespace NzbDrone.Core.Providers catch (Exception ex) { + Logger.Error("Unsupported Title: {0}", nzb.Title); Logger.ErrorException("Error Parsing NZB: " + ex.Message, ex); } return false; @@ -89,8 +90,10 @@ namespace NzbDrone.Core.Providers if (episodeInDb == null) { - Logger.Debug("Episode Not found in Database"); - return String.Format("{0} - {1:00}x{2}", series.Title, episode.SeasonNumber, episode.SeriesTitle); + //Todo: Handle this some other way? + Logger.Debug("Episode Not found in Database, Fake it..."); + //return String.Format("{0} - {1:00}x{2}", series.Title, episode.SeasonNumber, episode.EpisodeNumber); + episodeInDb = new Episode { EpisodeNumber = episode.EpisodeNumber, Title = "TBA" }; } seasonNumber = episodeInDb.SeasonNumber; @@ -149,7 +152,7 @@ namespace NzbDrone.Core.Providers var titleFix = GetTitleFix(new List { episode }, episodeModel.SeriesId); titleFix = String.Format("{0} [{1}]", titleFix, nzb.Quality); //Add Quality to the titleFix - if (Convert.ToBoolean(_configProvider.GetValue("UseBlackhole", true, true))) + if (!Convert.ToBoolean(_configProvider.GetValue("UseBlackhole", true, true))) if (_sabProvider.IsInQueue(titleFix)) return; } @@ -165,11 +168,17 @@ namespace NzbDrone.Core.Providers if (String.IsNullOrEmpty(path)) { //Use the NZBDrone root Directory + /NZBs - path = CentralDispatch.AppPath + Path.DirectorySeparatorChar + "NZBs"; + //path = CentralDispatch.StartupPath + "NZBs"; + path = @"C:\Test\NZBs"; } if (_diskProvider.FolderExists(path)) - _httpProvider.DownloadFile(nzb.Link.ToString(), path); + { + var filename = path + Path.DirectorySeparatorChar + nzb.TitleFix; + + if (_httpProvider.DownloadFile(nzb.Link.ToString(), filename)) + AddToHistory(episodeParseResults, series, nzb, indexer); + } else Logger.Error("Blackhole Directory doesn't exist, not saving NZB: '{0}'", path); @@ -185,7 +194,13 @@ namespace NzbDrone.Core.Providers } if (indexer.IndexerName != "Newzbin") - AddByUrl(episodeParseResults, series, nzb, indexer); + { + if (AddByUrl(nzb)) + { + AddToHistory(episodeParseResults, series, nzb, indexer); + } + + } else { @@ -195,35 +210,37 @@ namespace NzbDrone.Core.Providers } - private void AddByUrl(List episodeParseResults, Series series, NzbInfoModel nzb, Indexer indexer) + private bool AddByUrl(NzbInfoModel nzb) { - if (_sabProvider.AddByUrl(nzb.Link.ToString(), nzb.TitleFix)) + return _sabProvider.AddByUrl(nzb.Link.ToString(), nzb.TitleFix); + } + + private void AddToHistory(List episodeParseResults, Series series, NzbInfoModel nzb, Indexer indexer) + { + //We need to loop through the episodeParseResults so each episode in the NZB is properly handled + foreach (var epr in episodeParseResults) { - //We need to loop through the episodeParseResults so each episode in the NZB is properly handled - foreach (var epr in episodeParseResults) + var episode = _episodeProvider.GetEpisode(series.SeriesId, epr.SeasonNumber, epr.EpisodeNumber); + + if (episode == null) { - var episode = _episodeProvider.GetEpisode(series.SeriesId, epr.SeasonNumber, epr.EpisodeNumber); - - if (episode == null) - { - //Not sure how we got this far, so lets throw an exception - throw new ArgumentOutOfRangeException(); - } - - //Set episode status to grabbed - episode.Status = EpisodeStatusType.Grabbed; - - //Add to History - var history = new History(); - history.Date = DateTime.Now; - history.EpisodeId = episode.EpisodeId; - history.IndexerName = indexer.IndexerName; - history.IsProper = nzb.Proper; - history.Quality = nzb.Quality; - history.NzbTitle = nzb.Title; - - _historyProvider.Insert(history); + //Not sure how we got this far, so lets throw an exception + throw new ArgumentOutOfRangeException(); } + + //Set episode status to grabbed + episode.Status = EpisodeStatusType.Grabbed; + + //Add to History + var history = new History(); + history.Date = DateTime.Now; + history.EpisodeId = episode.EpisodeId; + history.IndexerId = indexer.IndexerId; + history.IsProper = nzb.Proper; + history.Quality = nzb.Quality; + history.NzbTitle = nzb.Title; + + _historyProvider.Insert(history); } } } diff --git a/NzbDrone.Core/Repository/Episode.cs b/NzbDrone.Core/Repository/Episode.cs index f7e3ff41e..5748cbf96 100644 --- a/NzbDrone.Core/Repository/Episode.cs +++ b/NzbDrone.Core/Repository/Episode.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Web.Script.Serialization; using NzbDrone.Core.Model; using SubSonic.SqlGeneration.Schema; diff --git a/NzbDrone.Core/Repository/History.cs b/NzbDrone.Core/Repository/History.cs index f859826d1..a5f0dead8 100644 --- a/NzbDrone.Core/Repository/History.cs +++ b/NzbDrone.Core/Repository/History.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using NzbDrone.Core.Repository.Quality; using SubSonic.SqlGeneration.Schema; @@ -9,9 +6,10 @@ namespace NzbDrone.Core.Repository { public class History { - public int HistoryId { get; set; } + [SubSonicPrimaryKey(true)] + public virtual int HistoryId { get; set; } public virtual int EpisodeId { get; set; } - public virtual string IndexerName { get; set; } + public virtual int IndexerId { get; set; } public string NzbTitle { get; set; } public QualityTypes Quality { get; set; } public DateTime Date { get; set; } diff --git a/NzbDrone.Core/Repository/Indexer.cs b/NzbDrone.Core/Repository/Indexer.cs index 5aea5e64c..5e4e17030 100644 --- a/NzbDrone.Core/Repository/Indexer.cs +++ b/NzbDrone.Core/Repository/Indexer.cs @@ -10,7 +10,9 @@ namespace NzbDrone.Core.Repository { public class Indexer { - [SubSonicPrimaryKey(true)] + [SubSonicPrimaryKey(false)] + public virtual int IndexerId { get; set; } + public string IndexerName { get; set; } public string RssUrl { get; set; } diff --git a/NzbDrone.Web/Content/telerik.common.min.css b/NzbDrone.Web/Content/telerik.common.min.css index b11fa2b58..aa4733e56 100644 --- a/NzbDrone.Web/Content/telerik.common.min.css +++ b/NzbDrone.Web/Content/telerik.common.min.css @@ -1 +1,1473 @@ -.t-reset{margin:0;padding:0;border:0;outline:0;text-decoration:none;font-size:100%;list-style:none;}.t-widget,.t-widget .t-input,.t-widget .text-box,.t-button{font-size:100%;}.t-widget{border-width:1px;border-style:solid;}.t-link{cursor:pointer;outline:none;}.t-button{display:inline-block;margin:0;padding:2px 6px;border-width:1px;border-style:solid;font-size:100%;line-height:1.435;text-align:center;text-decoration:none;cursor:pointer;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}* html .t-button{display:inline;zoom:1;}*+html .t-button{overflow:visible;margin-right:4px;}* html .t-button{overflow:visible;margin-right:4px;}*+html .t-button-expand{margin-right:0;}* html .t-button-expand{margin-right:0;}*+html a.t-button{line-height:1.6;padding-left:7px;padding-right:7px;}* html a.t-button{line-height:1.6;padding-left:7px;padding-right:7px;}.t-button-icontext{line-height:1.453;}a.t-button{-moz-padding-start:9px;-moz-padding-end:9px;}a.t-button-expand{display:block;}button.t-button-expand{width:100%;}body .t-button-icon{padding-left:4px;padding-right:4px;}button.t-button-icon{-moz-padding-start:1px;-moz-padding-end:1px;}*+html a.t-button-icon{padding-left:5px;padding-right:5px;}* html a.t-button-icon{padding-left:5px;padding-right:5px;}.t-button-icontext{padding-right:8px;}a.t-button-icontext{-moz-padding-end:11px;}.t-button-icontext .t-icon{margin:0 3px 0 -3px;vertical-align:top;}*+html .t-button-icontext .t-icon{margin-right:4px;}* html .t-button-icontext .t-icon{margin-right:4px;}html body .t-button-bare,html body .t-button-bare:hover,html body .t-button-bare:focus{background:none;border-width:0;}.t-icon,.t-editor-button .t-tool-icon{background-color:transparent;background-repeat:no-repeat;}.t-header .t-link{text-decoration:none;}.t-state-disabled,.t-state-disabled .t-link{cursor:default;outline:none;}.t-icon,.t-sprite,.t-editor-button .t-tool-icon{display:inline-block;width:16px;height:16px;overflow:hidden;font-size:0;line-height:0;text-indent:-3333px;text-align:center;vertical-align:middle;}* html .t-icon,* html .t-sprite,* html .t-editor-button .t-tool-icon{display:inline;zoom:1;}* html .t-icon,.t-sprite{text-indent:0;}*+html .t-icon,.t-sprite{text-indent:0;}.t-image{border:0;}div.t-window{display:inline-block;*display:inline;zoom:1;z-index:10001;position:absolute;border-width:0;border-width:5px\9;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:0 0 5px 2px #aaa;-webkit-box-shadow:0 0 5px 2px #aaa;box-shadow:0 0 5px 2px #aaa;}.t-window-titlebar{padding:.4em 0;font-size:1.2em;line-height:1.2em;white-space:nowrap;border-bottom-width:1px;border-bottom-style:solid;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;}.t-window-title{cursor:default;position:absolute;text-overflow:ellipsis;overflow:hidden;left:.5em;right:.5em;}.t-window-title .t-image{margin:0 5px 0 0;vertical-align:middle;}div.t-window-content{padding:.4em .5em;padding:0\9;margin:.4em .5em\9;border-width:0\9;overflow:auto;position:relative;-moz-border-radius-bottomleft:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-left-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;}.t-window-titlebar .t-window-actions{position:absolute;right:.5em;top:0;padding-top:.3em;white-space:nowrap;}.t-window-titlebar .t-window-action{width:16px;height:16px;padding:2px;text-decoration:none;vertical-align:middle;display:inline-block;*display:inline;zoom:1;opacity:.7;filter:alpha(opacity=70);}.t-window-titlebar .t-state-hover{border-width:1px;border-style:solid;padding:1px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;opacity:1;filter:alpha(opacity=100);}.t-window-action .t-icon{margin:0;vertical-align:top;}.t-window .t-resize-handle{position:absolute;z-index:1;background-color:#fff;opacity:0;filter:alpha(opacity=0);zoom:1;line-height:6px;font-size:0;}.t-resize-n{top:-3px;left:0;width:100%;height:6px;cursor:n-resize;}.t-resize-e{top:0;right:-3px;width:6px;height:100%;cursor:e-resize;}.t-resize-s{bottom:-3px;left:0;width:100%;height:6px;cursor:s-resize;}.t-resize-w{top:0;left:-3px;width:6px;height:100%;cursor:w-resize;}.t-resize-se{bottom:-3px;right:-3px;width:16px;height:16px;cursor:se-resize;}.t-resize-sw{bottom:-3px;left:-3px;width:6px;height:6px;cursor:sw-resize;}.t-resize-ne{top:-3px;right:-3px;width:6px;height:6px;cursor:ne-resize;}.t-resize-nw{top:-3px;left:-3px;width:6px;height:6px;cursor:nw-resize;}.t-overlay{width:100%;height:100%;position:fixed;top:0;left:0;background-color:#000;filter:alpha(opacity=50);opacity:.5;z-index:10000;}.t-window .t-overlay{background-color:#fff;opacity:0;filter:alpha(opacity=0);position:absolute;width:100%;height:100%;}.t-window .t-widget{z-index:10002;}.t-tabstrip{margin:0;padding:0;zoom:1;}.t-tabstrip .t-tabstrip-items{padding:0 .3em;}.t-tabstrip-items .t-item,.t-panelbar .t-tabstrip-items .t-item{list-style-type:none;vertical-align:top;display:inline-block;*display:inline;zoom:1;border-width:1px 1px 0;border-style:solid;margin:.1em .3em 0 0;padding:0;position:relative;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;}.t-tabstrip-items .t-state-active,.t-panelbar .t-tabstrip-items .t-state-active{padding-bottom:1px;margin-bottom:-1px;}.t-tabstrip-items .t-link,.t-panelbar .t-tabstrip-items .t-link{padding:.3em .9em;display:inline-block;*display:inline;zoom:1;border-bottom-width:0;outline:0;}.t-tabstrip-items .t-icon,.t-panelbar .t-tabstrip-items .t-icon{margin:-1px 4px 0 -3px;vertical-align:top;}.t-tabstrip-items .t-item .t-image,.t-tabstrip-items .t-item .t-sprite,.t-panelbar .t-tabstrip-items .t-item .t-image,.t-panelbar .t-tabstrip-items .t-item .t-sprite{vertical-align:middle;margin:-3px 3px 0 -6px;}* html .t-tabstrip-items .t-item .t-image,* html .t-tabstrip-items .t-item .t-sprite{vertical-align:top;margin-top:-1px;}*+html .t-tabstrip-items .t-item .t-image,*+html .t-tabstrip-items .t-item .t-sprite{vertical-align:top;margin-top:-1px;}.t-tabstrip .t-content,.t-panelbar .t-tabstrip .t-content{border-width:1px;border-style:solid;margin:0 .3em .3em;padding:.3em 1em;display:none;position:static;zoom:1;}.t-panelbar{zoom:1;}.t-panelbar .t-item{list-style-type:none;display:block;zoom:1;margin:0;top:0;border-width:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;}.t-panelbar .t-image,.t-panelbar .t-sprite{vertical-align:middle;margin-right:5px;margin-top:4px;float:left;}.t-panelbar .t-group .t-image,.t-panelbar .t-group .t-sprite{margin-top:1px;}.t-panelbar .t-link{line-height:2.05em;padding:0 1em;border-bottom:1px solid;display:block;position:relative;text-decoration:none;zoom:1;}.t-panelbar-expand,.t-panelbar-collapse{position:absolute;top:5px;right:2px;}.t-panelbar .t-group,.t-panelbar .t-content{position:relative;zoom:1;padding:0;margin:0;border-bottom-width:1px;border-bottom-style:solid;}.t-panelbar .t-group .t-link{line-height:1.7em;border-bottom:0;font-size:.95em;}.t-panelbar .t-group .t-arrow-up,.t-panelbar .t-group .t-arrow-down{top:2px;}.t-panelbar .t-group .t-group .t-link{padding-left:2em;}.t-panelbar .t-last .t-link{border-bottom:0;}.t-panelbar .t-group .t-group{border-bottom:0;}.t-tabstrip .t-panelbar .t-content{display:block;}.t-menu{cursor:default;}.t-menu,.t-menu .t-group{list-style:none;padding:0;margin:0;zoom:1;}.t-menu .t-group .t-link{padding-right:2em;}.t-menu .t-item{position:relative;display:inline-block;*display:inline;zoom:1;border-width:0 1px 0 0;border-style:solid;vertical-align:top;}.t-menu-vertical .t-item{display:block;border-width:0;}.t-menu .t-image,.t-menu .t-sprite{margin:0 4px 0 -4px;vertical-align:top;}.t-menu .t-link{text-decoration:none;padding:.25em .97em;display:block;}.t-menu .t-group{display:none;white-space:nowrap;border-style:solid;border-width:1px;overflow:visible;-moz-box-shadow:2px 2px 2px #aaa;-webkit-box-shadow:2px 2px 2px #aaa;box-shadow:2px 2px 2px #aaa;}.t-menu .t-group .t-item{display:block;border-width:0;}.t-menu .t-group .t-link{zoom:1;}.t-menu .t-arrow-down{margin-left:2px;margin-right:-10px;vertical-align:top;}.t-menu .t-arrow-next{position:absolute;right:0;top:3px;}.t-menu .t-animation-container,.t-menu .t-group{left:-1px;position:absolute;}.t-menu .t-animation-container .t-animation-container,.t-menu .t-group .t-group{left:100%;top:-1px;}.t-menu-vertical .t-animation-container,.t-menu-vertical .t-group{left:100%;top:-1px;}.t-menu .t-animation-container .t-group{left:auto;top:auto;}.t-grid{position:relative;zoom:1;}.t-grid table{width:100%;border-collapse:separate;empty-cells:show;border:0;}.t-grid-header .t-header{text-align:left;}.t-grid-header .t-header,.t-grid-header .t-last-header{padding:.3em .6em;border-width:0 1px 1px 0;border-style:solid;font-weight:normal;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.t-grid-header .t-last-header{border-right-width:0;}.t-grid-header .t-header .t-link{line-height:18px;height:18px;display:block;margin:-.3em -.6em;padding:.3em 2.4em .3em .6em;border:0;}.t-grid-header .t-header .t-icon{position:static;}.t-grid .t-state-hover{cursor:pointer;}.t-grid td{padding:.25em .6em;border:0;vertical-align:middle;line-height:1.6em;overflow:hidden;text-overflow:ellipsis;}.t-grid .t-last{border-right-width:0;border-bottom-width:0;}.t-grid-header-wrap,.t-footer-template-wrap{position:relative;overflow:hidden;width:100%;zoom:1;}div.t-grid-header,.t-footer-template-wrap table{padding-right:17px;zoom:1;border-bottom-width:1px;border-bottom-style:solid;}div.t-grid-header .t-header,div.t-grid-header .t-last-header{border-bottom-width:0;}div.t-grid-header .t-last-header{border-right-width:1px;}.t-grid-content{position:relative;overflow:auto;overflow-x:auto;overflow-y:scroll;width:100%;zoom:1;}.t-grid-header table,.t-grid-content table,.t-grid-footer table{table-layout:fixed;}* html .t-grid-content table{width:auto;}*+html .t-grid-content table{width:auto;}.t-grid .t-pager-wrapper,.t-grid-footer{border-style:solid;border-width:1px 0 0;}.t-grid div.t-pager-wrapper{border-width:0 0 1px 0;}.t-grid-footer div.t-pager-wrapper{border-width:0;}.t-grid div.t-grid-footer{border-width:1px 0 0;}.t-grid .t-pager-wrapper{padding:.2em .6em;line-height:1.8em;overflow:auto;}* html .t-pager-wrapper input{vertical-align:middle;}*+html .t-pager-wrapper input{vertical-align:middle;}.t-grid .t-pager,.t-grid .t-status,.t-grid .t-status-text,.t-pager .t-numeric,.t-pager .t-page-i-of-n,.t-pager .t-link,.t-pager span,.t-pager input,.t-grouping-row p{display:inline-block;*display:inline;zoom:1;vertical-align:middle;}.t-footer-template td{border-width:1px 1px 1px 0;border-style:solid;}.t-footer-template-wrap table{border-style:solid;border-width:0 0 1px;}.t-footer-template-wrap td{border-top-width:0;}.t-grid .t-status{float:left;margin:-.2em .6em -.2em -.6em;padding:.2em .6em;height:1.85em;border-right-width:1px;border-right-style:solid;}.t-grid .t-pager{float:left;cursor:default;}.t-grid .t-status-text{float:right;margin-right:.2em;}.t-pager .t-link{text-decoration:none;padding:1px;margin-top:.2em;border:0;line-height:16px;}.t-pager .t-state-active,.t-pager .t-state-hover{padding:0;border-width:1px;border-style:solid;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;}.t-pager span,.t-pager .t-link{vertical-align:top;}.t-pager .t-numeric,.t-pager .t-page-i-of-n{margin:0 7px;vertical-align:top;}.t-numeric .t-link,.t-numeric .t-state-active{margin-top:0;padding:0 5px;line-height:22px;vertical-align:top;}.t-numeric .t-state-active,.t-numeric .t-state-hover{padding:0 4px;line-height:20px;}.t-page-i-of-n input{width:2em;vertical-align:baseline;font-size:1em;}.t-pager-wrapper .t-status .t-icon{vertical-align:top;margin-top:3px;}.t-grid-filter{float:right;height:18px;padding:.3em .2em;position:relative;display:inline-block;*display:inline;zoom:1;margin:-1.8em -.6em -.3em 3px;margin-top:-.3em\9;}.t-link+.t-grid-filter{margin-top:-1.8em\9;}*+html .t-grid .t-grid-filter{margin-top:-1.8em;}.t-grid-filter .t-icon{vertical-align:top;}.t-grid .t-animation-container{position:absolute;}.t-filter-options{position:absolute;border-width:1px;border-style:solid;padding:3px;width:148px;-moz-box-shadow:2px 2px 2px #aaa;-webkit-box-shadow:2px 2px 2px #aaa;box-shadow:2px 2px 2px #aaa;}.t-filter-options .t-filter-help-text,.t-filter-options select,.t-filter-options input,.t-filter-options .t-button,.t-filter-options .t-datepicker{display:block;margin-bottom:4px;}.t-filter-options .t-button,.t-filter-options select{width:148px;}.t-filter-options input{width:142px;}.t-filter-options .t-datepicker{width:100%;}.t-filter-options .t-filter-button{margin-bottom:0;}.t-grouping-row .t-icon{margin:0 4px;}.t-grouping-row p{padding:0 .6em;margin-left:-.6em;}.t-grid td.t-group-cell,.t-grid td.t-hierarchy-cell{border-right:0;}.t-grid .t-group-col,.t-grid .t-hierarchy-col{width:30px;}.t-grouping-header,.t-grouping-dropclue{height:24px;line-height:24px;}.t-grouping-dropclue{position:absolute;width:6px;}.t-grouping-header .t-group-indicator{display:inline-block;*display:inline;zoom:1;border-width:1px;border-style:solid;line-height:1.5em;padding:.15em .15em .15em .4em;margin:0 3px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;}.t-grouping-header .t-link{text-decoration:none;display:inline-block;*display:inline;zoom:1;line-height:normal;padding:0;border-style:none;}.t-grouping-header .t-button{padding:0;border:0;background:transparent;}.t-grouping-header .t-icon{vertical-align:top;}.t-grouping-header .t-link .t-icon{margin:0 0 0 -3px;}.t-grouping-header .t-button .t-icon{margin:0 0 0 3px;}.t-grouping-header a,.t-grouping-header .t-button{display:inline-block;*display:inline;zoom:1;vertical-align:baseline;}.t-grouping-header,.t-grid-toolbar{cursor:default;margin:0;padding:.25em;border-bottom-width:1px;border-bottom-style:solid;}.t-grid .t-edit-container{padding:0;border-right:0;}.t-edit-form{padding:0;margin:0;}.t-edit-form td{border-top:0;border-bottom:0;}.t-edit-container .text-box,.t-edit-container .t-numerictextbox,.t-edit-container .t-datepicker{vertical-align:middle;width:5em;max-width:90%;min-width:90%;margin:-.4em -.3em -.15em;}.t-edit-container .t-dropdown,.t-edit-container .t-combobox{width:5em;max-width:90%;min-width:90%;line-height:normal;margin:-.1em -.3em -.45em;}* html .t-grid .text-box{width:90%;}.t-grid .field-validation-error{display:block;}.t-grid .input-validation-error{border-style:ridge;border-color:#f00;background-color:#ffc0cb;}.t-grid-toolbar .t-button{vertical-align:middle;}.t-grid-actions{display:inline-block;}* html .t-grid-actions{display:inline;zoom:1;vertical-align:bottom;}*+html .t-grid-actions{display:inline;zoom:1;vertical-align:bottom;}.t-grid tbody .t-button{margin:0 .2em;min-width:64px;}.t-grid tbody button.t-button,#ie8#skips{min-width:78px;}*+html .t-grid tbody a.t-button{min-width:62px;}.t-grid tbody a.t-button{-moz-padding-start:6px;-moz-padding-end:6px;}.t-grid tbody a.t-button-icon{-moz-padding-start:4px;-moz-padding-end:4px;}html body .t-grid tbody .t-button-icon{min-width:0;width:auto;}.t-detail-row{position:relative;}.t-grid .t-detail-cell{overflow:visible;}.t-grid-resize-indicator{position:absolute;width:2px;background-color:#aaa;}.t-grid .t-resize-handle{cursor:col-resize;position:absolute;height:25px;}.t-autocomplete{background-position:100% 50%!important;}.t-combobox,.t-dropdown,.t-selectbox{display:inline-block;*display:inline;zoom:1;position:relative;overflow:hidden;white-space:nowrap;width:150px;border-width:0;}*+html .t-combobox{overflow:visible;}* html .t-combobox{overflow:visible;}.t-dropdown-wrap,.t-picker-wrap{position:relative;display:block;cursor:default;}.t-picker-wrap{padding:0 25px 0 0;}.t-dropdown-wrap{padding-right:16px;border-width:1px;border-style:solid;}.t-combobox>.t-dropdown-wrap{padding-right:22px;}* html .t-combobox .t-dropdown-wrap{height:20px;}* html .t-picker-wrap{height:20px;padding-right:20px;}.t-picker-wrap .t-input,.t-combobox .t-input{vertical-align:top;width:100%;}.t-combobox .t-input{outline:0;border:0;}* html{position:absolute;top:0;}.t-picker-wrap .t-select,.t-dropdown-wrap .t-select{text-decoration:none;vertical-align:top;display:inline-block;*display:inline;zoom:1;cursor:default;position:absolute;top:0;right:0;}* html .t-picker-wrap .t-select,* html .t-dropdown-wrap .t-select{top:1px;right:1px;}.t-combobox .t-select{border-width:0 0 0 1px;border-style:solid;border-color:inherit;}.t-combobox .t-icon{margin-top:1px;}.t-dropdown .t-select,.t-selectbox .t-select{border:0;text-decoration:none;font:inherit;color:inherit;overflow:hidden;cursor:default;}.t-dropdown .t-input,.t-selectbox .t-input{overflow:hidden;display:block;text-overflow:ellipsis;padding:.2em 0 .2em 3px;}.t-picker-wrap .t-select,.t-dropdown-wrap .t-select{position:absolute;right:0;top:0;}.t-picker-wrap .t-icon,.t-dropdown-wrap .t-icon{vertical-align:top;margin-top:2px;}.t-combobox .t-input{height:18px;line-height:18px;padding:1px 3px;border:0;margin:0;}.t-picker-wrap .t-select,.t-dropdown-wrap .t-select{height:20px;line-height:20px;}.t-popup{border-width:1px;border-style:solid;}.t-popup .t-item{padding:1px 5px 1px 3px;cursor:default;}.t-calendar{display:inline-block;*display:inline;zoom:1;width:203px;position:relative;overflow:hidden;}.t-calendar .t-link{text-decoration:none;}.t-calendar .t-action-link{text-decoration:underline;}.t-calendar .t-header{padding:.4em 0;text-align:center;position:relative;zoom:1;}.t-calendar .t-nav-prev,.t-calendar .t-nav-next{position:absolute;top:.3em;}.t-calendar .t-nav-prev{left:1%;}.t-calendar .t-nav-next{right:1%;}.t-calendar .t-content{text-align:right;display:table;width:100%;height:169px;table-layout:fixed;border-style:none;margin:0;padding:0;}.t-calendar .t-animation-container .t-content{height:100%;}.t-calendar .t-nav-fast{display:inline-block;*display:inline;zoom:1;width:75%;}.t-calendar .t-nav-fast .t-icon{vertical-align:top;}.t-calendar th{border-bottom-style:solid;border-bottom-width:1px;font-weight:normal;cursor:default;}.t-calendar td{cursor:pointer;padding:1px;}.t-calendar .t-state-focus{border-width:1px;border-style:dotted;padding:0;}.t-calendar .t-content .t-link{display:block;overflow:hidden;position:relative;}.t-calendar th,.t-calendar .t-content .t-link{padding:.25em .45em .3em .1em;}.t-calendar .t-meta-view .t-link{padding:.25em 0 .3em;text-align:center;}.t-timepicker,.t-datetimepicker,.t-datepicker{border:0;white-space:nowrap;width:8.5em;}.t-datetimepicker{width:13em;}div.t-timepicker,div.t-datetimepicker,div.t-datepicker{background-color:transparent;}.t-datetimepicker .t-picker-wrap{padding-right:44px;}* html .t-datetimepicker .t-picker-wrap{padding-right:40px;}.t-datetimepicker .t-icon-calendar{margin-right:3px;}.t-picker-wrap .t-icon{cursor:pointer;}.t-state-disabled .t-picker-wrap .t-icon{cursor:default;}.t-timepicker,.t-datepicker,.t-datetimepicker{display:inline-block;*display:inline;zoom:1;vertical-align:top;}.t-picker-wrap .t-input{margin:0;}.t-time-popup,.t-datepicker-calendar{-moz-box-shadow:2px 2px 2px #aaa;-webkit-box-shadow:2px 2px 2px #aaa;box-shadow:2px 2px 2px #aaa;}.t-iframe-overlay{position:absolute;width:100%;border:0;top:0;left:0;filter:alpha(opacity=0);}.t-time-popup .t-item{padding:1px 3px;}div.t-treeview{border-width:0;background:none;white-space:nowrap;overflow:auto;}.t-treeview .t-item{padding:0 0 0 16px;margin:0;border-width:0;position:static;top:auto;display:block;}.t-treeview .t-group,.t-treeview .t-content{list-style-type:none;background:none;margin:0;padding:0;}.t-treeview .t-animation-container{height:auto!important;}.t-treeview .t-icon,.t-treeview .t-image,.t-treeview .t-sprite,.t-treeview .t-in{display:inline-block;*display:inline;zoom:1;vertical-align:top;}.t-treeview .t-plus,.t-treeview .t-minus,.t-treeview .t-plus-disabled,.t-treeview .t-minus-disabled{margin-left:-16px;margin-top:2px;float:left;*float:none;}.t-treeview .t-plus,.t-treeview .t-minus{cursor:pointer;}.t-treeview .t-plus-disabled,.t-treeview .t-minus-disabled{cursor:default;}.t-treeview .t-sprite,.t-treeview .t-image{margin-right:3px;}.t-treeview .t-in{margin:1px 0;padding:2px 4px 2px 3px;text-decoration:none;line-height:16px;margin-left:2px;}.t-treeview span.t-in{cursor:default;}.t-treeview .t-state-hover,.t-treeview .t-state-selected{padding:1px 3px 1px 2px;border-width:1px;border-style:solid;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;}.t-treeview .t-drop-clue{width:80px;visibility:hidden;height:5px;position:absolute;margin-top:-3px;z-index:10000;background-color:transparent;background-repeat:no-repeat;}.t-treeview-lines .t-top,.t-treeview-lines .t-mid,.t-treeview-lines .t-bot{background-repeat:no-repeat;margin-left:-16px;padding-left:16px;}.t-treeview-lines .t-top{background-position:-91px 0;}.t-treeview-lines .t-bot{background-position:-69px -22px;}.t-treeview-lines .t-mid{background-position:-47px -44px;}.t-treeview-lines .t-last .t-top{background-position:-25px -66px;}.t-treeview-lines .t-group .t-last .t-bot{background-position:-69px -22px;}.t-treeview-lines .t-item{background-repeat:no-repeat;}.t-treeview-lines .t-first{background-repeat:no-repeat;background-position:0 16px;}div.t-numerictextbox{display:inline-block;*display:inline;zoom:1;vertical-align:middle;white-space:nowrap;border:0;background:transparent;}.t-numerictextbox .t-icon{margin-left:-16px;}.t-numerictextbox .t-link{border-style:none;display:inline-block;*display:inline;zoom:1;}.t-numerictextbox .t-arrow-up{vertical-align:top;margin-top:1px;height:10px;[hack:safari;margin-top:3px;];}*+html .t-numerictextbox .t-arrow-up{margin-top:1px;}.t-numerictextbox .t-arrow-down{vertical-align:bottom;margin-bottom:1px;height:11px;[hack:safari;margin-bottom:3px;];}*+html .t-numerictextbox .t-arrow-down{margin-bottom:1px;}.t-colorpicker{display:inline-block;*display:inline;zoom:1;vertical-align:middle;}.t-colorpicker .t-tool-icon{display:inline-block;*display:inline;zoom:1;vertical-align:top;padding:2px 3px;font-size:0;line-height:0;}.t-colorpicker .t-selected-color{display:block;height:16px;width:16px;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;}.t-colorpicker .t-icon{vertical-align:middle;margin-top:2px;}.t-colorpicker-popup{line-height:0;width:136px;}.t-colorpicker-popup .t-reset{padding:.25em;margin:0;display:inline-block;*display:inline;zoom:1;}.t-colorpicker-popup .t-item{float:left;display:block;overflow:hidden;width:12px;height:12px;font-size:0;padding:0;margin:0 1px 1px 0;}.t-editor{border-width:1px;border-style:solid;border-collapse:separate;height:250px;font-size:100%;table-layout:fixed;vertical-align:top;width:100%;}.t-editor .t-editor-toolbar-wrap{border:0;padding:0;}.t-editor-toolbar{margin:0;padding:.1em 0;list-style-type:none;cursor:default;line-height:1.3em;}.t-editor-toolbar li{display:inline;vertical-align:middle;}.t-editor-toolbar .t-editor-dropdown,.t-editor-toolbar .t-editor-combobox,.t-editor-toolbar .t-editor-selectbox,.t-editor-toolbar .t-editor-colorpicker{margin-right:2px;}.t-editor-toolbar .t-separator{border-width:0 1px 0 0;border-style:solid;padding:0 0 0 1px;font-size:1.3em;margin:0 .15em;position:relative;top:1px;}.t-editor-toolbar .t-break{display:block;height:1px;line-height:0;font-size:0;}.t-editor-toolbar .t-dropdown,.t-editor-toolbar .t-combobox,.t-editor-toolbar .t-selectbox,.t-editor-toolbar .t-colorpicker{vertical-align:middle;}.t-editor-button .t-tool-icon{vertical-align:middle;width:22px;height:22px;margin:1px;}.t-editor-colorpicker .t-tool-icon{padding:17px 3px 2px;}.t-editor-colorpicker .t-icon{border-style:solid;border-color:#ccc;border-width:0 0 0 1px;}.t-editor-colorpicker .t-selected-color{height:3px;}.t-editor-combobox .t-input{height:20px;line-height:20px;}.t-editor-combobox .t-select{height:22px;line-height:22px;}.t-bold{background-position:-22px 0;}.t-italic{background-position:-44px 0;}.t-underline{background-position:-66px 0;}.t-strikethrough{background-position:-88px 0;}.t-justifyLeft{background-position:-110px 0;}.t-justifyCenter{background-position:-132px 0;}.t-justifyRight{background-position:-154px 0;}.t-justifyFull{background-position:-176px 0;}.t-insertOrderedList{background-position:-198px 0;}.t-insertUnorderedList{background-position:-220px 0;}.t-createLink{background-position:-242px 0;}.t-unlink{background-position:-264px 0;}.t-insertImage{background-position:-286px 0;}.t-foreColor .t-tool-icon{background-position:-308px -2px;}.t-backColor .t-tool-icon{background-position:-330px -2px;}.t-indent{background-position:-352px 0;}.t-outdent{background-position:-374px 0;}.t-fontName{width:110px;}.t-fontSize{width:124px;}.t-formatBlock{width:147px;}.t-editor-button .t-state-hover,.t-editor-button .t-state-active{vertical-align:middle;border-width:1px;border-style:solid;margin:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;}.t-editor-button .t-state-disabled{opacity:.3;filter:alpha(opacity=30);}.t-editor .t-editable-area{outline:none;height:100%;width:100%;border-width:1px;border-style:solid;}.t-editor .t-content{height:100%;width:100%;display:block;padding:0;margin:0;border:0;}.t-editor .t-raw-content{border:0;margin:0;padding:0;font-size:inherit;font-family:Consolas,"Courier New",monospace;}.t-editor-dialog{padding:1em;}.t-editor-dialog ol{margin:0;padding:0;list-style:none;}.t-form-text-row,.t-form-checkbox-row{padding-bottom:1em;}.t-form-text-row label{display:inline-block;*display:inline;zoom:1;width:6.5em;text-align:right;padding-right:.5em;}.t-form-checkbox-row input{margin-left:6.5em;font-size:inherit;padding:0;}.t-form-checkbox-row label{padding-left:.3em;}.t-form-checkbox-row input,.t-form-checkbox-row label,.t-form-text-row label .t-form-text-row input,.t-form-text-row select{vertical-align:middle;}.t-form-text-row input,.t-form-text-row select{width:20em;}.t-editor-dialog .t-button-wrapper{padding-top:.5em;text-align:right;}.t-editor-dialog .t-button{display:inline-block;*display:inline;zoom:1;}.t-drag-clue{border-width:1px;border-style:solid;font-size:.9em;padding:.05em .15em;position:absolute;z-index:10003;white-space:nowrap;cursor:default;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;}.t-drag-status{margin-right:4px;vertical-align:top;margin-top:-1px;}.t-reorder-cue{position:absolute;width:1px;overflow:visible;}.t-reorder-cue .t-icon{width:8px;height:4px;position:absolute;left:-4px;}.t-reorder-cue .t-arrow-down{top:-4px;background-position:-20px -182px;}.t-reorder-cue .t-arrow-up{bottom:-4px;background-position:-20px -166px;} \ No newline at end of file +.t-reset { + border: 0 none; + font-size: 100%; + list-style: none outside none; + margin: 0; + outline: 0 none; + padding: 0; + text-decoration: none; +} +.t-widget, .t-widget .t-input, .t-widget .text-box, .t-button { + font-size: 100%; +} +.t-widget { + border-style: solid; + border-width: 1px; +} +.t-link { + cursor: pointer; + outline: medium none; +} +.t-button { + border-radius: 3px 3px 3px 3px; + border-style: solid; + border-width: 1px; + cursor: pointer; + display: inline-block; + font-size: 100%; + line-height: 1.435; + margin: 0; + padding: 2px 6px; + text-align: center; + text-decoration: none; +} +* html .t-button { + display: inline; +} +* + html .t-button { + margin-right: 4px; + overflow: visible; +} +* html .t-button { + margin-right: 4px; + overflow: visible; +} +* + html .t-button-expand { + margin-right: 0; +} +* html .t-button-expand { + margin-right: 0; +} +* + html a.t-button { + line-height: 1.6; + padding-left: 7px; + padding-right: 7px; +} +* html a.t-button { + line-height: 1.6; + padding-left: 7px; + padding-right: 7px; +} +.t-button-icontext { + line-height: 1.453; +} +a.t-button { + -moz-padding-end: 9px; + -moz-padding-start: 9px; +} +a.t-button-expand { + display: block; +} +button.t-button-expand { + width: 100%; +} +body .t-button-icon { + padding-left: 4px; + padding-right: 4px; +} +button.t-button-icon { + -moz-padding-end: 1px; + -moz-padding-start: 1px; +} +* + html a.t-button-icon { + padding-left: 5px; + padding-right: 5px; +} +* html a.t-button-icon { + padding-left: 5px; + padding-right: 5px; +} +.t-button-icontext { + padding-right: 8px; +} +a.t-button-icontext { + -moz-padding-end: 11px; +} +.t-button-icontext .t-icon { + margin: 0 3px 0 -3px; + vertical-align: top; +} +* + html .t-button-icontext .t-icon { + margin-right: 4px; +} +* html .t-button-icontext .t-icon { + margin-right: 4px; +} +html body .t-button-bare, html body .t-button-bare:hover, html body .t-button-bare:focus { + background: none repeat scroll 0 0 transparent; + border-width: 0; +} +.t-icon, .t-editor-button .t-tool-icon { + background-color: transparent; + background-repeat: no-repeat; +} +.t-header .t-link { + text-decoration: none; +} +.t-state-disabled, .t-state-disabled .t-link { + cursor: default; + outline: medium none; +} +.t-icon, .t-sprite, .t-editor-button .t-tool-icon { + display: inline-block; + font-size: 0; + height: 16px; + line-height: 0; + overflow: hidden; + text-align: center; + text-indent: -3333px; + vertical-align: middle; + width: 16px; +} +* html .t-icon, * html .t-sprite, * html .t-editor-button .t-tool-icon { + display: inline; +} +* html .t-icon, .t-sprite { + text-indent: 0; +} +* + html .t-icon, .t-sprite { + text-indent: 0; +} +.t-image { + border: 0 none; +} +div.t-window { + border-radius: 5px 5px 5px 5px; + border-width: 0; + box-shadow: 0 0 5px 2px #AAAAAA; + display: inline-block; + position: absolute; + z-index: 10001; +} +.t-window-titlebar { + border-bottom-style: solid; + border-bottom-width: 1px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + font-size: 1.2em; + line-height: 1.2em; + padding: 0.4em 0; + white-space: nowrap; +} +.t-window-title { + cursor: default; + left: 0.5em; + overflow: hidden; + position: absolute; + right: 0.5em; +} +.t-window-title .t-image { + margin: 0 5px 0 0; + vertical-align: middle; +} +div.t-window-content { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + overflow: auto; + padding: 0.4em 0.5em; + position: relative; +} +.t-window-titlebar .t-window-actions { + padding-top: 0.3em; + position: absolute; + right: 0.5em; + top: 0; + white-space: nowrap; +} +.t-window-titlebar .t-window-action { + display: inline-block; + height: 16px; + opacity: 0.7; + padding: 2px; + text-decoration: none; + vertical-align: middle; + width: 16px; +} +.t-window-titlebar .t-state-hover { + border-radius: 5px 5px 5px 5px; + border-style: solid; + border-width: 1px; + opacity: 1; + padding: 1px; +} +.t-window-action .t-icon { + margin: 0; + vertical-align: top; +} +.t-window .t-resize-handle { + background-color: #FFFFFF; + font-size: 0; + line-height: 6px; + opacity: 0; + position: absolute; + z-index: 1; +} +.t-resize-n { + cursor: n-resize; + height: 6px; + left: 0; + top: -3px; + width: 100%; +} +.t-resize-e { + cursor: e-resize; + height: 100%; + right: -3px; + top: 0; + width: 6px; +} +.t-resize-s { + bottom: -3px; + cursor: s-resize; + height: 6px; + left: 0; + width: 100%; +} +.t-resize-w { + cursor: w-resize; + height: 100%; + left: -3px; + top: 0; + width: 6px; +} +.t-resize-se { + bottom: -3px; + cursor: se-resize; + height: 16px; + right: -3px; + width: 16px; +} +.t-resize-sw { + bottom: -3px; + cursor: sw-resize; + height: 6px; + left: -3px; + width: 6px; +} +.t-resize-ne { + cursor: ne-resize; + height: 6px; + right: -3px; + top: -3px; + width: 6px; +} +.t-resize-nw { + cursor: nw-resize; + height: 6px; + left: -3px; + top: -3px; + width: 6px; +} +.t-overlay { + background-color: #000000; + height: 100%; + left: 0; + opacity: 0.5; + position: fixed; + top: 0; + width: 100%; + z-index: 10000; +} +.t-window .t-overlay { + background-color: #FFFFFF; + height: 100%; + opacity: 0; + position: absolute; + width: 100%; +} +.t-window .t-widget { + z-index: 10002; +} +.t-tabstrip { + margin: 0; + padding: 0; +} +.t-tabstrip .t-tabstrip-items { + padding: 0 0.3em; +} +.t-tabstrip-items .t-item, .t-panelbar .t-tabstrip-items .t-item { + border-style: solid; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-width: 1px 1px 0; + display: inline-block; + list-style-type: none; + margin: 0.1em 0.3em 0 0; + padding: 0; + position: relative; + vertical-align: top; +} +.t-tabstrip-items .t-state-active, .t-panelbar .t-tabstrip-items .t-state-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.t-tabstrip-items .t-link, .t-panelbar .t-tabstrip-items .t-link { + border-bottom-width: 0; + display: inline-block; + outline: 0 none; + padding: 0.3em 0.9em; +} +.t-tabstrip-items .t-icon, .t-panelbar .t-tabstrip-items .t-icon { + margin: -1px 4px 0 -3px; + vertical-align: top; +} +.t-tabstrip-items .t-item .t-image, .t-tabstrip-items .t-item .t-sprite, .t-panelbar .t-tabstrip-items .t-item .t-image, .t-panelbar .t-tabstrip-items .t-item .t-sprite { + margin: -3px 3px 0 -6px; + vertical-align: middle; +} +* html .t-tabstrip-items .t-item .t-image, * html .t-tabstrip-items .t-item .t-sprite { + margin-top: -1px; + vertical-align: top; +} +* + html .t-tabstrip-items .t-item .t-image, * + html .t-tabstrip-items .t-item .t-sprite { + margin-top: -1px; + vertical-align: top; +} +.t-tabstrip .t-content, .t-panelbar .t-tabstrip .t-content { + border-style: solid; + border-width: 1px; + display: none; + margin: 0 0.3em 0.3em; + padding: 0.3em 1em; + position: static; +} +.t-panelbar { +} +.t-panelbar .t-item { + border-radius: 0 0 0 0; + border-width: 0; + display: block; + list-style-type: none; + margin: 0; + top: 0; +} +.t-panelbar .t-image, .t-panelbar .t-sprite { + float: left; + margin-right: 5px; + margin-top: 4px; + vertical-align: middle; +} +.t-panelbar .t-group .t-image, .t-panelbar .t-group .t-sprite { + margin-top: 1px; +} +.t-panelbar .t-link { + border-bottom: 1px solid; + display: block; + line-height: 2.05em; + padding: 0 1em; + position: relative; + text-decoration: none; +} +.t-panelbar-expand, .t-panelbar-collapse { + position: absolute; + right: 2px; + top: 5px; +} +.t-panelbar .t-group, .t-panelbar .t-content { + border-bottom-style: solid; + border-bottom-width: 1px; + margin: 0; + padding: 0; + position: relative; +} +.t-panelbar .t-group .t-link { + border-bottom: 0 none; + font-size: 0.95em; + line-height: 1.7em; +} +.t-panelbar .t-group .t-arrow-up, .t-panelbar .t-group .t-arrow-down { + top: 2px; +} +.t-panelbar .t-group .t-group .t-link { + padding-left: 2em; +} +.t-panelbar .t-last .t-link { + border-bottom: 0 none; +} +.t-panelbar .t-group .t-group { + border-bottom: 0 none; +} +.t-tabstrip .t-panelbar .t-content { + display: block; +} +.t-menu { + cursor: default; +} +.t-menu, .t-menu .t-group { + list-style: none outside none; + margin: 0; + padding: 0; +} +.t-menu .t-group .t-link { + padding-right: 2em; +} +.t-menu .t-item { + border-style: solid; + border-width: 0 1px 0 0; + display: inline-block; + position: relative; + vertical-align: top; +} +.t-menu-vertical .t-item { + border-width: 0; + display: block; +} +.t-menu .t-image, .t-menu .t-sprite { + margin: 0 4px 0 -4px; + vertical-align: top; +} +.t-menu .t-link { + display: block; + padding: 0.25em 0.97em; + text-decoration: none; +} +.t-menu .t-group { + border-style: solid; + border-width: 1px; + box-shadow: 2px 2px 2px #AAAAAA; + display: none; + overflow: visible; + white-space: nowrap; +} +.t-menu .t-group .t-item { + border-width: 0; + display: block; +} +.t-menu .t-group .t-link { +} +.t-menu .t-arrow-down { + margin-left: 2px; + margin-right: -10px; + vertical-align: top; +} +.t-menu .t-arrow-next { + position: absolute; + right: 0; + top: 3px; +} +.t-menu .t-animation-container, .t-menu .t-group { + left: -1px; + position: absolute; +} +.t-menu .t-animation-container .t-animation-container, .t-menu .t-group .t-group { + left: 100%; + top: -1px; +} +.t-menu-vertical .t-animation-container, .t-menu-vertical .t-group { + left: 100%; + top: -1px; +} +.t-menu .t-animation-container .t-group { + left: auto; + top: auto; +} +.t-grid { + position: relative; +} +.t-grid table { + border: 0 none; + border-collapse: separate; + empty-cells: show; + width: 100%; +} +.t-grid-header .t-header { + text-align: left; +} +.t-grid-header .t-header, .t-grid-header .t-last-header { + border-style: solid; + border-width: 0 1px 1px 0; + font-weight: normal; + overflow: hidden; + padding: 0.3em 0.3em; + white-space: nowrap; +} +.t-grid-header .t-last-header { + border-right-width: 0; +} +.t-grid-header .t-header .t-link { + border: 0 none; + display: block; + height: 18px; + line-height: 18px; + margin: -0.3em -0.6em; + padding: 0.3em 0.3em 0.3em 0.6em; +} +.t-grid-header .t-header .t-icon { + position: static; +} +.t-grid .t-state-hover { + cursor: pointer; +} +.t-grid td { + border: 0 none; + line-height: 1.6em; + overflow: hidden; + padding: 0.25em 0.6em; + vertical-align: middle; +} +.t-grid .t-last { + border-bottom-width: 0; + border-right-width: 0; +} +.t-grid-header-wrap, .t-footer-template-wrap { + overflow: hidden; + position: relative; + width: 100%; +} +div.t-grid-header, .t-footer-template-wrap table { + border-bottom-style: solid; + border-bottom-width: 1px; + padding-right: 17px; +} +div.t-grid-header .t-header, div.t-grid-header .t-last-header { + border-bottom-width: 0; +} +div.t-grid-header .t-last-header { + border-right-width: 1px; +} +.t-grid-content { + overflow-x: auto; + overflow-y: scroll; + position: relative; + width: 100%; +} +.t-grid-header table, .t-grid-content table, .t-grid-footer table { + table-layout: fixed; +} +* html .t-grid-content table { + width: auto; +} +* + html .t-grid-content table { + width: auto; +} +.t-grid .t-pager-wrapper, .t-grid-footer { + border-style: solid; + border-width: 1px 0 0; +} +.t-grid div.t-pager-wrapper { + border-width: 0 0 1px; +} +.t-grid-footer div.t-pager-wrapper { + border-width: 0; +} +.t-grid div.t-grid-footer { + border-width: 1px 0 0; +} +.t-grid .t-pager-wrapper { + line-height: 1.8em; + overflow: auto; + padding: 0.2em 0.6em; +} +* html .t-pager-wrapper input { + vertical-align: middle; +} +* + html .t-pager-wrapper input { + vertical-align: middle; +} +.t-grid .t-pager, .t-grid .t-status, .t-grid .t-status-text, .t-pager .t-numeric, .t-pager .t-page-i-of-n, .t-pager .t-link, .t-pager span, .t-pager input, .t-grouping-row p { + display: inline-block; + vertical-align: middle; +} +.t-footer-template td { + border-style: solid; + border-width: 1px 1px 1px 0; +} +.t-footer-template-wrap table { + border-style: solid; + border-width: 0 0 1px; +} +.t-footer-template-wrap td { + border-top-width: 0; +} +.t-grid .t-status { + border-right-style: solid; + border-right-width: 1px; + float: left; + height: 1.85em; + margin: -0.2em 0.6em -0.2em -0.6em; + padding: 0.2em 0.6em; +} +.t-grid .t-pager { + cursor: default; + float: left; +} +.t-grid .t-status-text { + float: right; + margin-right: 0.2em; +} +.t-pager .t-link { + border: 0 none; + line-height: 16px; + margin-top: 0.2em; + padding: 1px; + text-decoration: none; +} +.t-pager .t-state-active, .t-pager .t-state-hover { + border-radius: 5px 5px 5px 5px; + border-style: solid; + border-width: 1px; + padding: 0; +} +.t-pager span, .t-pager .t-link { + vertical-align: top; +} +.t-pager .t-numeric, .t-pager .t-page-i-of-n { + margin: 0 7px; + vertical-align: top; +} +.t-numeric .t-link, .t-numeric .t-state-active { + line-height: 22px; + margin-top: 0; + padding: 0 5px; + vertical-align: top; +} +.t-numeric .t-state-active, .t-numeric .t-state-hover { + line-height: 20px; + padding: 0 4px; +} +.t-page-i-of-n input { + font-size: 1em; + vertical-align: baseline; + width: 2em; +} +.t-pager-wrapper .t-status .t-icon { + margin-top: 3px; + vertical-align: top; +} +.t-grid-filter { + display: inline-block; + float: right; + height: 18px; + margin: -1.8em -0.6em -0.3em 3px; + padding: 0.3em 0.2em; + position: relative; +} +.t-link + .t-grid-filter { +} +* + html .t-grid .t-grid-filter { + margin-top: -1.8em; +} +.t-grid-filter .t-icon { + vertical-align: top; +} +.t-grid .t-animation-container { + position: absolute; +} +.t-filter-options { + border-style: solid; + border-width: 1px; + box-shadow: 2px 2px 2px #AAAAAA; + padding: 3px; + position: absolute; + width: 148px; +} +.t-filter-options .t-filter-help-text, .t-filter-options select, .t-filter-options input, .t-filter-options .t-button, .t-filter-options .t-datepicker { + display: block; + margin-bottom: 4px; +} +.t-filter-options .t-button, .t-filter-options select { + width: 148px; +} +.t-filter-options input { + width: 142px; +} +.t-filter-options .t-datepicker { + width: 100%; +} +.t-filter-options .t-filter-button { + margin-bottom: 0; +} +.t-grouping-row .t-icon { + margin: 0 4px; +} +.t-grouping-row p { + margin-left: -0.6em; + padding: 0 0.6em; +} +.t-grid td.t-group-cell, .t-grid td.t-hierarchy-cell { + border-right: 0 none; +} +.t-grid .t-group-col, .t-grid .t-hierarchy-col { + width: 30px; +} +.t-grouping-header, .t-grouping-dropclue { + height: 24px; + line-height: 24px; +} +.t-grouping-dropclue { + position: absolute; + width: 6px; +} +.t-grouping-header .t-group-indicator { + border-radius: 4px 4px 4px 4px; + border-style: solid; + border-width: 1px; + display: inline-block; + line-height: 1.5em; + margin: 0 3px; + padding: 0.15em 0.15em 0.15em 0.4em; +} +.t-grouping-header .t-link { + border-style: none; + display: inline-block; + line-height: normal; + padding: 0; + text-decoration: none; +} +.t-grouping-header .t-button { + background: none repeat scroll 0 0 transparent; + border: 0 none; + padding: 0; +} +.t-grouping-header .t-icon { + vertical-align: top; +} +.t-grouping-header .t-link .t-icon { + margin: 0 0 0 -3px; +} +.t-grouping-header .t-button .t-icon { + margin: 0 0 0 3px; +} +.t-grouping-header a, .t-grouping-header .t-button { + display: inline-block; + vertical-align: baseline; +} +.t-grouping-header, .t-grid-toolbar { + border-bottom-style: solid; + border-bottom-width: 1px; + cursor: default; + margin: 0; + padding: 0.25em; +} +.t-grid .t-edit-container { + border-right: 0 none; + padding: 0; +} +.t-edit-form { + margin: 0; + padding: 0; +} +.t-edit-form td { + border-bottom: 0 none; + border-top: 0 none; +} +.t-edit-container .text-box, .t-edit-container .t-numerictextbox, .t-edit-container .t-datepicker { + margin: -0.4em -0.3em -0.15em; + max-width: 90%; + min-width: 90%; + vertical-align: middle; + width: 5em; +} +.t-edit-container .t-dropdown, .t-edit-container .t-combobox { + line-height: normal; + margin: -0.1em -0.3em -0.45em; + max-width: 90%; + min-width: 90%; + width: 5em; +} +* html .t-grid .text-box { + width: 90%; +} +.t-grid .field-validation-error { + display: block; +} +.t-grid .input-validation-error { + background-color: #FFC0CB; + border-color: #FF0000; + border-style: ridge; +} +.t-grid-toolbar .t-button { + vertical-align: middle; +} +.t-grid-actions { + display: inline-block; +} +* html .t-grid-actions { + display: inline; + vertical-align: bottom; +} +* + html .t-grid-actions { + display: inline; + vertical-align: bottom; +} +.t-grid tbody .t-button { + margin: 0 0.2em; + min-width: 64px; +} +.t-grid tbody button.t-button, #ie8#skips { + min-width: 78px; +} +* + html .t-grid tbody a.t-button { + min-width: 62px; +} +.t-grid tbody a.t-button { + -moz-padding-end: 6px; + -moz-padding-start: 6px; +} +.t-grid tbody a.t-button-icon { + -moz-padding-end: 4px; + -moz-padding-start: 4px; +} +html body .t-grid tbody .t-button-icon { + min-width: 0; + width: auto; +} +.t-detail-row { + position: relative; +} +.t-grid .t-detail-cell { + overflow: visible; +} +.t-grid-resize-indicator { + background-color: #AAAAAA; + position: absolute; + width: 2px; +} +.t-grid .t-resize-handle { + cursor: col-resize; + height: 25px; + position: absolute; +} +.t-autocomplete { + background-position: 100% 50% !important; +} +.t-combobox, .t-dropdown, .t-selectbox { + border-width: 0; + display: inline-block; + overflow: hidden; + position: relative; + white-space: nowrap; + width: 150px; +} +* + html .t-combobox { + overflow: visible; +} +* html .t-combobox { + overflow: visible; +} +.t-dropdown-wrap, .t-picker-wrap { + cursor: default; + display: block; + position: relative; +} +.t-picker-wrap { + padding: 0 25px 0 0; +} +.t-dropdown-wrap { + border-style: solid; + border-width: 1px; + padding-right: 16px; +} +.t-combobox > .t-dropdown-wrap { + padding-right: 22px; +} +* html .t-combobox .t-dropdown-wrap { + height: 20px; +} +* html .t-picker-wrap { + height: 20px; + padding-right: 20px; +} +.t-picker-wrap .t-input, .t-combobox .t-input { + vertical-align: top; + width: 100%; +} +.t-combobox .t-input { + border: 0 none; + outline: 0 none; +} +* html { + position: absolute; + top: 0; +} +.t-picker-wrap .t-select, .t-dropdown-wrap .t-select { + cursor: default; + display: inline-block; + position: absolute; + right: 0; + text-decoration: none; + top: 0; + vertical-align: top; +} +* html .t-picker-wrap .t-select, * html .t-dropdown-wrap .t-select { + right: 1px; + top: 1px; +} +.t-combobox .t-select { + border-color: inherit; + border-style: solid; + border-width: 0 0 0 1px; +} +.t-combobox .t-icon { + margin-top: 1px; +} +.t-dropdown .t-select, .t-selectbox .t-select { + border: 0 none; + color: inherit; + cursor: default; + font: inherit; + overflow: hidden; + text-decoration: none; +} +.t-dropdown .t-input, .t-selectbox .t-input { + display: block; + overflow: hidden; + padding: 0.2em 0 0.2em 3px; +} +.t-picker-wrap .t-select, .t-dropdown-wrap .t-select { + position: absolute; + right: 0; + top: 0; +} +.t-picker-wrap .t-icon, .t-dropdown-wrap .t-icon { + margin-top: 2px; + vertical-align: top; +} +.t-combobox .t-input { + border: 0 none; + height: 18px; + line-height: 18px; + margin: 0; + padding: 1px 3px; +} +.t-picker-wrap .t-select, .t-dropdown-wrap .t-select { + height: 20px; + line-height: 20px; +} +.t-popup { + border-style: solid; + border-width: 1px; +} +.t-popup .t-item { + cursor: default; + padding: 1px 5px 1px 3px; +} +.t-calendar { + display: inline-block; + overflow: hidden; + position: relative; + width: 203px; +} +.t-calendar .t-link { + text-decoration: none; +} +.t-calendar .t-action-link { + text-decoration: underline; +} +.t-calendar .t-header { + padding: 0.4em 0; + position: relative; + text-align: center; +} +.t-calendar .t-nav-prev, .t-calendar .t-nav-next { + position: absolute; + top: 0.3em; +} +.t-calendar .t-nav-prev { + left: 1%; +} +.t-calendar .t-nav-next { + right: 1%; +} +.t-calendar .t-content { + border-style: none; + display: table; + height: 169px; + margin: 0; + padding: 0; + table-layout: fixed; + text-align: right; + width: 100%; +} +.t-calendar .t-animation-container .t-content { + height: 100%; +} +.t-calendar .t-nav-fast { + display: inline-block; + width: 75%; +} +.t-calendar .t-nav-fast .t-icon { + vertical-align: top; +} +.t-calendar th { + border-bottom-style: solid; + border-bottom-width: 1px; + cursor: default; + font-weight: normal; +} +.t-calendar td { + cursor: pointer; + padding: 1px; +} +.t-calendar .t-state-focus { + border-style: dotted; + border-width: 1px; + padding: 0; +} +.t-calendar .t-content .t-link { + display: block; + overflow: hidden; + position: relative; +} +.t-calendar th, .t-calendar .t-content .t-link { + padding: 0.25em 0.45em 0.3em 0.1em; +} +.t-calendar .t-meta-view .t-link { + padding: 0.25em 0 0.3em; + text-align: center; +} +.t-timepicker, .t-datetimepicker, .t-datepicker { + border: 0 none; + white-space: nowrap; + width: 8.5em; +} +.t-datetimepicker { + width: 13em; +} +div.t-timepicker, div.t-datetimepicker, div.t-datepicker { + background-color: transparent; +} +.t-datetimepicker .t-picker-wrap { + padding-right: 44px; +} +* html .t-datetimepicker .t-picker-wrap { + padding-right: 40px; +} +.t-datetimepicker .t-icon-calendar { + margin-right: 3px; +} +.t-picker-wrap .t-icon { + cursor: pointer; +} +.t-state-disabled .t-picker-wrap .t-icon { + cursor: default; +} +.t-timepicker, .t-datepicker, .t-datetimepicker { + display: inline-block; + vertical-align: top; +} +.t-picker-wrap .t-input { + margin: 0; +} +.t-time-popup, .t-datepicker-calendar { + box-shadow: 2px 2px 2px #AAAAAA; +} +.t-iframe-overlay { + border: 0 none; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.t-time-popup .t-item { + padding: 1px 3px; +} +div.t-treeview { + background: none repeat scroll 0 0 transparent; + border-width: 0; + overflow: auto; + white-space: nowrap; +} +.t-treeview .t-item { + border-width: 0; + display: block; + margin: 0; + padding: 0 0 0 16px; + position: static; + top: auto; +} +.t-treeview .t-group, .t-treeview .t-content { + background: none repeat scroll 0 0 transparent; + list-style-type: none; + margin: 0; + padding: 0; +} +.t-treeview .t-animation-container { + height: auto !important; +} +.t-treeview .t-icon, .t-treeview .t-image, .t-treeview .t-sprite, .t-treeview .t-in { + display: inline-block; + vertical-align: top; +} +.t-treeview .t-plus, .t-treeview .t-minus, .t-treeview .t-plus-disabled, .t-treeview .t-minus-disabled { + float: left; + margin-left: -16px; + margin-top: 2px; +} +.t-treeview .t-plus, .t-treeview .t-minus { + cursor: pointer; +} +.t-treeview .t-plus-disabled, .t-treeview .t-minus-disabled { + cursor: default; +} +.t-treeview .t-sprite, .t-treeview .t-image { + margin-right: 3px; +} +.t-treeview .t-in { + line-height: 16px; + margin: 1px 0 1px 2px; + padding: 2px 4px 2px 3px; + text-decoration: none; +} +.t-treeview span.t-in { + cursor: default; +} +.t-treeview .t-state-hover, .t-treeview .t-state-selected { + border-radius: 4px 4px 4px 4px; + border-style: solid; + border-width: 1px; + padding: 1px 3px 1px 2px; +} +.t-treeview .t-drop-clue { + background-color: transparent; + background-repeat: no-repeat; + height: 5px; + margin-top: -3px; + position: absolute; + visibility: hidden; + width: 80px; + z-index: 10000; +} +.t-treeview-lines .t-top, .t-treeview-lines .t-mid, .t-treeview-lines .t-bot { + background-repeat: no-repeat; + margin-left: -16px; + padding-left: 16px; +} +.t-treeview-lines .t-top { + background-position: -91px 0; +} +.t-treeview-lines .t-bot { + background-position: -69px -22px; +} +.t-treeview-lines .t-mid { + background-position: -47px -44px; +} +.t-treeview-lines .t-last .t-top { + background-position: -25px -66px; +} +.t-treeview-lines .t-group .t-last .t-bot { + background-position: -69px -22px; +} +.t-treeview-lines .t-item { + background-repeat: no-repeat; +} +.t-treeview-lines .t-first { + background-position: 0 16px; + background-repeat: no-repeat; +} +div.t-numerictextbox { + background: none repeat scroll 0 0 transparent; + border: 0 none; + display: inline-block; + vertical-align: middle; + white-space: nowrap; +} +.t-numerictextbox .t-icon { + margin-left: -16px; +} +.t-numerictextbox .t-link { + border-style: none; + display: inline-block; +} +.t-numerictextbox .t-arrow-up { + height: 10px; + margin-top: 1px; + vertical-align: top; +} +* + html .t-numerictextbox .t-arrow-up { + margin-top: 1px; +} +.t-numerictextbox .t-arrow-down { + height: 11px; + margin-bottom: 1px; + vertical-align: bottom; +} +* + html .t-numerictextbox .t-arrow-down { + margin-bottom: 1px; +} +.t-colorpicker { + display: inline-block; + vertical-align: middle; +} +.t-colorpicker .t-tool-icon { + display: inline-block; + font-size: 0; + line-height: 0; + padding: 2px 3px; + vertical-align: top; +} +.t-colorpicker .t-selected-color { + border-radius: 2px 2px 2px 2px; + display: block; + height: 16px; + width: 16px; +} +.t-colorpicker .t-icon { + margin-top: 2px; + vertical-align: middle; +} +.t-colorpicker-popup { + line-height: 0; + width: 136px; +} +.t-colorpicker-popup .t-reset { + display: inline-block; + margin: 0; + padding: 0.25em; +} +.t-colorpicker-popup .t-item { + display: block; + float: left; + font-size: 0; + height: 12px; + margin: 0 1px 1px 0; + overflow: hidden; + padding: 0; + width: 12px; +} +.t-editor { + border-collapse: separate; + border-style: solid; + border-width: 1px; + font-size: 100%; + height: 250px; + table-layout: fixed; + vertical-align: top; + width: 100%; +} +.t-editor .t-editor-toolbar-wrap { + border: 0 none; + padding: 0; +} +.t-editor-toolbar { + cursor: default; + line-height: 1.3em; + list-style-type: none; + margin: 0; + padding: 0.1em 0; +} +.t-editor-toolbar li { + display: inline; + vertical-align: middle; +} +.t-editor-toolbar .t-editor-dropdown, .t-editor-toolbar .t-editor-combobox, .t-editor-toolbar .t-editor-selectbox, .t-editor-toolbar .t-editor-colorpicker { + margin-right: 2px; +} +.t-editor-toolbar .t-separator { + border-style: solid; + border-width: 0 1px 0 0; + font-size: 1.3em; + margin: 0 0.15em; + padding: 0 0 0 1px; + position: relative; + top: 1px; +} +.t-editor-toolbar .t-break { + display: block; + font-size: 0; + height: 1px; + line-height: 0; +} +.t-editor-toolbar .t-dropdown, .t-editor-toolbar .t-combobox, .t-editor-toolbar .t-selectbox, .t-editor-toolbar .t-colorpicker { + vertical-align: middle; +} +.t-editor-button .t-tool-icon { + height: 22px; + margin: 1px; + vertical-align: middle; + width: 22px; +} +.t-editor-colorpicker .t-tool-icon { + padding: 17px 3px 2px; +} +.t-editor-colorpicker .t-icon { + border-color: #CCCCCC; + border-style: solid; + border-width: 0 0 0 1px; +} +.t-editor-colorpicker .t-selected-color { + height: 3px; +} +.t-editor-combobox .t-input { + height: 20px; + line-height: 20px; +} +.t-editor-combobox .t-select { + height: 22px; + line-height: 22px; +} +.t-bold { + background-position: -22px 0; +} +.t-italic { + background-position: -44px 0; +} +.t-underline { + background-position: -66px 0; +} +.t-strikethrough { + background-position: -88px 0; +} +.t-justifyLeft { + background-position: -110px 0; +} +.t-justifyCenter { + background-position: -132px 0; +} +.t-justifyRight { + background-position: -154px 0; +} +.t-justifyFull { + background-position: -176px 0; +} +.t-insertOrderedList { + background-position: -198px 0; +} +.t-insertUnorderedList { + background-position: -220px 0; +} +.t-createLink { + background-position: -242px 0; +} +.t-unlink { + background-position: -264px 0; +} +.t-insertImage { + background-position: -286px 0; +} +.t-foreColor .t-tool-icon { + background-position: -308px -2px; +} +.t-backColor .t-tool-icon { + background-position: -330px -2px; +} +.t-indent { + background-position: -352px 0; +} +.t-outdent { + background-position: -374px 0; +} +.t-fontName { + width: 110px; +} +.t-fontSize { + width: 124px; +} +.t-formatBlock { + width: 147px; +} +.t-editor-button .t-state-hover, .t-editor-button .t-state-active { + border-radius: 5px 5px 5px 5px; + border-style: solid; + border-width: 1px; + margin: 0; + vertical-align: middle; +} +.t-editor-button .t-state-disabled { + opacity: 0.3; +} +.t-editor .t-editable-area { + border-style: solid; + border-width: 1px; + height: 100%; + outline: medium none; + width: 100%; +} +.t-editor .t-content { + border: 0 none; + display: block; + height: 100%; + margin: 0; + padding: 0; + width: 100%; +} +.t-editor .t-raw-content { + border: 0 none; + font-family: Consolas,"Courier New",monospace; + font-size: inherit; + margin: 0; + padding: 0; +} +.t-editor-dialog { + padding: 1em; +} +.t-editor-dialog ol { + list-style: none outside none; + margin: 0; + padding: 0; +} +.t-form-text-row, .t-form-checkbox-row { + padding-bottom: 1em; +} +.t-form-text-row label { + display: inline-block; + padding-right: 0.5em; + text-align: right; + width: 6.5em; +} +.t-form-checkbox-row input { + font-size: inherit; + margin-left: 6.5em; + padding: 0; +} +.t-form-checkbox-row label { + padding-left: 0.3em; +} +.t-form-checkbox-row input, .t-form-checkbox-row label, .t-form-text-row label .t-form-text-row input, .t-form-text-row select { + vertical-align: middle; +} +.t-form-text-row input, .t-form-text-row select { + width: 20em; +} +.t-editor-dialog .t-button-wrapper { + padding-top: 0.5em; + text-align: right; +} +.t-editor-dialog .t-button { + display: inline-block; +} +.t-drag-clue { + border-radius: 4px 4px 4px 4px; + border-style: solid; + border-width: 1px; + cursor: default; + font-size: 0.9em; + padding: 0.05em 0.15em; + position: absolute; + white-space: nowrap; + z-index: 10003; +} +.t-drag-status { + margin-right: 4px; + margin-top: -1px; + vertical-align: top; +} +.t-reorder-cue { + overflow: visible; + position: absolute; + width: 1px; +} +.t-reorder-cue .t-icon { + height: 4px; + left: -4px; + position: absolute; + width: 8px; +} +.t-reorder-cue .t-arrow-down { + background-position: -20px -182px; + top: -4px; +} +.t-reorder-cue .t-arrow-up { + background-position: -20px -166px; + bottom: -4px; +} diff --git a/NzbDrone.Web/Controllers/HistoryController.cs b/NzbDrone.Web/Controllers/HistoryController.cs new file mode 100644 index 000000000..add1a68d5 --- /dev/null +++ b/NzbDrone.Web/Controllers/HistoryController.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; +using NzbDrone.Core.Providers; +using NzbDrone.Core.Repository.Quality; +using NzbDrone.Web.Models; +using Telerik.Web.Mvc; + +namespace NzbDrone.Web.Controllers +{ + public class HistoryController : Controller + { + private IHistoryProvider _historyProvider; + + public HistoryController(IHistoryProvider historyProvider) + { + _historyProvider = historyProvider; + } + + // + // GET: /History/ + + public ActionResult Index() + { + return View(); + } + + public ActionResult Trim() + { + _historyProvider.Trim(); + return RedirectToAction("Index"); + } + + public ActionResult Purge() + { + _historyProvider.Purge(); + return RedirectToAction("Index"); + } + + [GridAction] + public ActionResult _AjaxBinding() + { + var history = _historyProvider.AllItems().Select(h => new HistoryModel + { + HistoryId = h.HistoryId, + SeasonNumber = h.Episode.SeasonNumber, + EpisodeNumber = h.Episode.EpisodeNumber, + EpisodeTitle = h.Episode.Title, + EpisodeOverview = h.Episode.Overview, + SeriesTitle = h.Episode.Series.Title, + NzbTitle = h.NzbTitle, + Quality = h.Quality.ToString("G"), + IsProper = h.IsProper, + Date = h.Date + }); + + return View(new GridModel(history)); + } + } +} diff --git a/NzbDrone.Web/Models/HistoryModel.cs b/NzbDrone.Web/Models/HistoryModel.cs new file mode 100644 index 000000000..7a47c0f57 --- /dev/null +++ b/NzbDrone.Web/Models/HistoryModel.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using NzbDrone.Core.Repository; +using NzbDrone.Core.Repository.Quality; + +namespace NzbDrone.Web.Models +{ + public class HistoryModel + { + public int HistoryId { get; set; } + public string SeriesTitle { get; set; } + public int SeasonNumber { get; set; } + public int EpisodeNumber { get; set; } + public string EpisodeTitle { get; set; } + public string EpisodeOverview { get; set; } + public string NzbTitle { get; set; } + public string Quality { get; set; } + public DateTime Date { get; set; } + public bool IsProper { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Web/NzbDrone.Web.csproj b/NzbDrone.Web/NzbDrone.Web.csproj index a2577afe1..69ef31b36 100644 --- a/NzbDrone.Web/NzbDrone.Web.csproj +++ b/NzbDrone.Web/NzbDrone.Web.csproj @@ -96,6 +96,7 @@ + diff --git a/NzbDrone.Web/Views/History/Index.aspx b/NzbDrone.Web/Views/History/Index.aspx new file mode 100644 index 000000000..76b3dc389 --- /dev/null +++ b/NzbDrone.Web/Views/History/Index.aspx @@ -0,0 +1,62 @@ +<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage>" %> + +<%@ Import Namespace="Telerik.Web.Mvc.UI" %> +<%@ Import Namespace="NzbDrone.Web.Models" %> + + + + + + History + + + <% + Html.Telerik().Menu().Name("historyMenu").Items(items => + { + items.Add().Text("Trim History").Action("Trim", "History"); + items.Add().Text("Purge History").Action("Purge", "History"); + }).Render(); + %> + + + <%Html.Telerik().Grid().Name("history") + .Columns(columns => + { + columns.Bound(c => c.SeriesTitle).Title("Series Name").Width(120); + columns.Bound(c => c.SeasonNumber).Title("Season #").Width(10); + columns.Bound(c => c.EpisodeNumber).Title("Episode #").Width(10); + columns.Bound(c => c.EpisodeTitle).Title("Episode Title").Width(140); + columns.Bound(c => c.Quality).Title("Quality").Width(30); + columns.Bound(c => c.Date).Title("Date Grabbed").Width(60); + }) + .DetailView(detailView => detailView.ClientTemplate( + "
Overview: <#= EpisodeOverview #>
" + + "
NZB Title: <#= NzbTitle #>
" + + "
Proper: <#= IsProper #>
" + + )) + .DataBinding(data => data.Ajax().Select("_AjaxBinding", "History")) + .Sortable(rows => rows.OrderBy(epSort => epSort.Add(c => c.Date).Descending()).Enabled(true)) + .Pageable(c => c.PageSize(20).Position(GridPagerPosition.Both).Style(GridPagerStyles.PageInput | GridPagerStyles.NextPreviousAndNumeric)) + //.Filterable() + //.ClientEvents(c => c.OnRowDataBound("onRowDataBound")) + .Render(); + %> +