1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-11-05 02:22:31 +01:00

Added instant notification framework

This commit is contained in:
kay.one 2011-08-08 14:50:48 -07:00
parent eaaf464d38
commit 5ab07d7028
29 changed files with 697 additions and 555 deletions

View File

@ -138,9 +138,9 @@
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\Libraries\Migrator.NET\Migrator.Providers.dll</HintPath> <HintPath>..\Libraries\Migrator.NET\Migrator.Providers.dll</HintPath>
</Reference> </Reference>
<Reference Include="MvcMiniProfiler, Version=1.6.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3, processorArchitecture=MSIL"> <Reference Include="MvcMiniProfiler, Version=1.7.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\MiniProfiler.1.6\lib\MvcMiniProfiler.dll</HintPath> <HintPath>..\packages\MiniProfiler.1.7\lib\MvcMiniProfiler.dll</HintPath>
</Reference> </Reference>
<Reference Include="Ninject, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL"> <Reference Include="Ninject, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
<HintPath>..\packages\Ninject.2.2.1.4\lib\net40-Full\Ninject.dll</HintPath> <HintPath>..\packages\Ninject.2.2.1.4\lib\net40-Full\Ninject.dll</HintPath>

View File

@ -2,5 +2,5 @@
<packages> <packages>
<package id="Ninject" version="2.2.1.4" /> <package id="Ninject" version="2.2.1.4" />
<package id="SqlServerCompact" version="4.0.8482.1" /> <package id="SqlServerCompact" version="4.0.8482.1" />
<package id="MiniProfiler" version="1.6" /> <package id="MiniProfiler" version="1.7" />
</packages> </packages>

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,100 @@
/* the norm */
#gritter-notice-wrapper {
position:fixed;
top:20px;
right:20px;
width:301px;
z-index:9999;
}
#gritter-notice-wrapper.top-left {
left: 20px;
right: auto;
}
#gritter-notice-wrapper.bottom-right {
top: auto;
left: auto;
bottom: 20px;
right: 20px;
}
#gritter-notice-wrapper.bottom-left {
top: auto;
right: auto;
bottom: 20px;
left: 20px;
}
.gritter-item-wrapper {
position:relative;
margin:0 0 10px 0;
}
.gritter-top {
height:10px;
}
.hover .gritter-top {
background-position:right -30px;
}
.gritter-bottom {
height:8px;
margin:0;
}
.hover .gritter-bottom {
background-position: bottom right;
}
.gritter-item {
display:block;
background-color: #272525;
opacity: .9;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)";
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85);
color:#eee;
padding:8px 11px;
font-size: 11px;
border-bottom-style: solid;
border-bottom-width: 3px;
}
.gritter-success .gritter-item{
border-color: rgb(100, 135, 46);
}
.gritter-fail .gritter-item{
border-color: rgb(212, 44, 44);
}
.hover .gritter-item {
background-position:right -40px;
}
.gritter-item p {
padding:0;
margin:0;
}
.gritter-close {
display:none;
position:absolute;
top:0px;
right: -10px;
background:url(../content/images/gritter.png) no-repeat left top;
cursor:pointer;
width:30px;
height:30px;
}
.gritter-title {
font-size:20px;
padding:0;
display:block;
text-shadow:1px 1px #000; /* Not supported by IE :( */
}
.gritter-image {
width:48px;
height:48px;
float:left;
}
.gritter-with-image,
.gritter-without-image {
padding:0 0 5px 0;
}
.gritter-with-image {
width:220px;
float:right;
}

View File

@ -1,148 +0,0 @@
div.jGrowl
{
padding-top: 10px;
z-index: 9999;
color: #fff;
font-size: 12px;
}
/** Special IE6 Style Positioning **/
div.ie6
{
position: absolute;
}
div.ie6.top-right
{
right: auto;
bottom: auto;
left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
}
div.ie6.top-left
{
left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
}
div.ie6.bottom-right
{
left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
}
div.ie6.bottom-left
{
left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
}
div.ie6.center
{
left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
width: 100%;
}
/** Normal Style Positions **/
body > div.jGrowl
{
position: fixed;
}
body > div.jGrowl.top-left
{
left: 0px;
top: 0px;
}
body > div.jGrowl.top-right
{
right: 0px;
top: 0px;
}
body > div.jGrowl.bottom-left
{
left: 0px;
bottom: 0px;
}
body > div.jGrowl.bottom-right
{
right: 0px;
bottom: 0px;
}
body > div.jGrowl.center
{
top: 0px;
width: 50%;
left: 25%;
}
/** Cross Browser Styling **/
div.center div.jGrowl-notification, div.center div.jGrowl-closer
{
margin-left: auto;
margin-right: auto;
}
div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer
{
background-color: #000;
opacity: .85;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)";
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85);
zoom: 1;
width: 235px;
padding: 10px;
margin-top: 5px;
margin-bottom: 5px;
font-size: 1em;
text-align: left;
display: none;
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
}
div.jGrowl div.jGrowl-notification
{
min-height: 40px;
}
div.jGrowl div.jGrowl-notification div.header
{
font-weight: bold;
font-size: .85em;
}
div.jGrowl div.jGrowl-notification div.close
{
z-index: 99;
float: right;
font-weight: bold;
font-size: 1em;
cursor: pointer;
}
div.jGrowl div.jGrowl-closer
{
padding-top: 4px;
padding-bottom: 4px;
cursor: pointer;
font-size: .9em;
font-weight: bold;
text-align: center;
}
/** Hide jGrowl when printing **/
@media print
{
div.jGrowl
{
display: none;
}
}

View File

@ -20,37 +20,24 @@ namespace NzbDrone.Web.Controllers
[HandleError] [HandleError]
public class SettingsController : Controller public class SettingsController : Controller
{ {
private const string SETTINGS_SAVED = "Settings Saved.";
private const string SETTINGS_FAILED = "Error Saving Settings, please fix any errors";
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly ConfigProvider _configProvider; private readonly ConfigProvider _configProvider;
private readonly IndexerProvider _indexerProvider; private readonly IndexerProvider _indexerProvider;
private readonly QualityProvider _qualityProvider; private readonly QualityProvider _qualityProvider;
private readonly RootDirProvider _rootDirProvider;
private readonly AutoConfigureProvider _autoConfigureProvider; private readonly AutoConfigureProvider _autoConfigureProvider;
private readonly NotificationProvider _notificationProvider;
private readonly DiskProvider _diskProvider;
private readonly SeriesProvider _seriesProvider; private readonly SeriesProvider _seriesProvider;
private readonly ExternalNotificationProvider _externalNotificationProvider; private readonly ExternalNotificationProvider _externalNotificationProvider;
private readonly ProgressNotification _progressNotification;
public SettingsController(ConfigProvider configProvider, IndexerProvider indexerProvider, public SettingsController(ConfigProvider configProvider, IndexerProvider indexerProvider,
QualityProvider qualityProvider, RootDirProvider rootDirProvider, QualityProvider qualityProvider, AutoConfigureProvider autoConfigureProvider,
AutoConfigureProvider autoConfigureProvider, NotificationProvider notificationProvider, SeriesProvider seriesProvider, ExternalNotificationProvider externalNotificationProvider)
DiskProvider diskProvider, SeriesProvider seriesProvider,
ExternalNotificationProvider externalNotificationProvider)
{ {
_externalNotificationProvider = externalNotificationProvider; _externalNotificationProvider = externalNotificationProvider;
_configProvider = configProvider; _configProvider = configProvider;
_indexerProvider = indexerProvider; _indexerProvider = indexerProvider;
_qualityProvider = qualityProvider; _qualityProvider = qualityProvider;
_rootDirProvider = rootDirProvider;
_autoConfigureProvider = autoConfigureProvider; _autoConfigureProvider = autoConfigureProvider;
_notificationProvider = notificationProvider;
_diskProvider = diskProvider;
_seriesProvider = seriesProvider; _seriesProvider = seriesProvider;
_progressNotification = new ProgressNotification("Settings");
} }
public ActionResult Test() public ActionResult Test()
@ -71,35 +58,35 @@ public ActionResult Index()
public ActionResult Indexers() public ActionResult Indexers()
{ {
return View(new IndexerSettingsModel return View(new IndexerSettingsModel
{ {
NzbMatrixUsername = _configProvider.NzbMatrixUsername, NzbMatrixUsername = _configProvider.NzbMatrixUsername,
NzbMatrixApiKey = _configProvider.NzbMatrixApiKey, NzbMatrixApiKey = _configProvider.NzbMatrixApiKey,
NzbsrusUId = _configProvider.NzbsrusUId, NzbsrusUId = _configProvider.NzbsrusUId,
NzbsrusHash = _configProvider.NzbsrusHash, NzbsrusHash = _configProvider.NzbsrusHash,
NzbsOrgHash = _configProvider.NzbsOrgHash, NzbsOrgHash = _configProvider.NzbsOrgHash,
NzbsOrgUId = _configProvider.NzbsOrgUId, NzbsOrgUId = _configProvider.NzbsOrgUId,
NewzbinUsername = _configProvider.NewzbinUsername, NewzbinUsername = _configProvider.NewzbinUsername,
NewzbinPassword = _configProvider.NewzbinPassword, NewzbinPassword = _configProvider.NewzbinPassword,
NzbsOrgEnabled = _indexerProvider.GetSettings(typeof(NzbsOrg)).Enable, NzbsOrgEnabled = _indexerProvider.GetSettings(typeof(NzbsOrg)).Enable,
NzbMatrixEnabled = _indexerProvider.GetSettings(typeof(NzbMatrix)).Enable, NzbMatrixEnabled = _indexerProvider.GetSettings(typeof(NzbMatrix)).Enable,
NzbsRUsEnabled = _indexerProvider.GetSettings(typeof(NzbsRUs)).Enable, NzbsRUsEnabled = _indexerProvider.GetSettings(typeof(NzbsRUs)).Enable,
NewzbinEnabled = _indexerProvider.GetSettings(typeof(Newzbin)).Enable NewzbinEnabled = _indexerProvider.GetSettings(typeof(Newzbin)).Enable
}); });
} }
public ActionResult Sabnzbd() public ActionResult Sabnzbd()
{ {
var sabDropDir = _configProvider.SabDropDirectory; var sabDropDir = _configProvider.SabDropDirectory;
var selectList = new SelectList(new List<string> {sabDropDir}, sabDropDir); var selectList = new SelectList(new List<string> { sabDropDir }, sabDropDir);
var model = new SabnzbdSettingsModel var model = new SabnzbdSettingsModel
{ {
SabHost = _configProvider.SabHost, SabHost = _configProvider.SabHost,
SabPort =_configProvider.SabPort, SabPort = _configProvider.SabPort,
SabApiKey = _configProvider.SabApiKey, SabApiKey = _configProvider.SabApiKey,
SabUsername = _configProvider.SabUsername, SabUsername = _configProvider.SabUsername,
SabPassword = _configProvider.SabPassword, SabPassword = _configProvider.SabPassword,
@ -269,12 +256,10 @@ public JsonResult AutoConfigureSab()
return new JsonResult { Data = "failed" }; return new JsonResult { Data = "failed" };
} }
} }
[HttpPost]
public ActionResult SaveIndexers(IndexerSettingsModel data)
{
_notificationProvider.Register(_progressNotification);
[HttpPost]
public JsonResult SaveIndexers(IndexerSettingsModel data)
{
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
var nzbsOrgSettings = _indexerProvider.GetSettings(typeof(NzbsOrg)); var nzbsOrgSettings = _indexerProvider.GetSettings(typeof(NzbsOrg));
@ -305,21 +290,15 @@ public ActionResult SaveIndexers(IndexerSettingsModel data)
_configProvider.NewzbinUsername = data.NewzbinUsername; _configProvider.NewzbinUsername = data.NewzbinUsername;
_configProvider.NewzbinPassword = data.NewzbinPassword; _configProvider.NewzbinPassword = data.NewzbinPassword;
_progressNotification.CurrentMessage = SETTINGS_SAVED; return GetSuccessResult();
_progressNotification.Status = ProgressNotificationStatus.Completed;
return Content(SETTINGS_SAVED);
} }
_progressNotification.CurrentMessage = SETTINGS_FAILED; return GetInvalidModelResult();
_progressNotification.Status = ProgressNotificationStatus.Completed;
return Content(SETTINGS_FAILED);
} }
[HttpPost] [HttpPost]
public ActionResult SaveSabnzbd(SabnzbdSettingsModel data) public JsonResult SaveSabnzbd(SabnzbdSettingsModel data)
{ {
_notificationProvider.Register(_progressNotification);
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
_configProvider.SabHost = data.SabHost; _configProvider.SabHost = data.SabHost;
@ -331,28 +310,26 @@ public ActionResult SaveSabnzbd(SabnzbdSettingsModel data)
_configProvider.SabTvPriority = data.SabTvPriority; _configProvider.SabTvPriority = data.SabTvPriority;
_configProvider.SabDropDirectory = data.SabDropDirectory; _configProvider.SabDropDirectory = data.SabDropDirectory;
_progressNotification.CurrentMessage = SETTINGS_SAVED;
_progressNotification.Status = ProgressNotificationStatus.Completed; return GetSuccessResult();
return Content(SETTINGS_SAVED);
} }
_progressNotification.CurrentMessage = SETTINGS_FAILED; return
_progressNotification.Status = ProgressNotificationStatus.Completed; Json(new NotificationResult() { Title = "Failed", Text = "Invalid request data.", NotificationType = NotificationType.Error });
return Content(SETTINGS_FAILED);
} }
[HttpPost] [HttpPost]
public ActionResult SaveQuality(QualityModel data) public ActionResult SaveQuality(QualityModel data)
{ {
_notificationProvider.Register(_progressNotification);
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
_configProvider.DefaultQualityProfile = data.DefaultQualityProfileId; _configProvider.DefaultQualityProfile = data.DefaultQualityProfileId;
//Saves only the Default Quality, skips User Profiles since none exist //Saves only the Default Quality, skips User Profiles since none exist
if (data.Profiles == null) if (data.Profiles == null)
return Content(SETTINGS_SAVED); return GetSuccessResult();
foreach (var profile in data.Profiles) foreach (var profile in data.Profiles)
{ {
@ -377,21 +354,15 @@ public ActionResult SaveQuality(QualityModel data)
_qualityProvider.Update(profile); _qualityProvider.Update(profile);
} }
_progressNotification.CurrentMessage = SETTINGS_SAVED; return GetSuccessResult();
_progressNotification.Status = ProgressNotificationStatus.Completed;
return Content(SETTINGS_SAVED);
} }
_progressNotification.CurrentMessage = SETTINGS_FAILED; return GetInvalidModelResult();
_progressNotification.Status = ProgressNotificationStatus.Completed;
return Content(SETTINGS_FAILED);
} }
[HttpPost] [HttpPost]
public ActionResult SaveNotifications(NotificationSettingsModel data) public ActionResult SaveNotifications(NotificationSettingsModel data)
{ {
_notificationProvider.Register(_progressNotification);
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
//XBMC Enabled //XBMC Enabled
@ -407,21 +378,15 @@ public ActionResult SaveNotifications(NotificationSettingsModel data)
_configProvider.XbmcUsername = data.XbmcUsername; _configProvider.XbmcUsername = data.XbmcUsername;
_configProvider.XbmcPassword = data.XbmcPassword; _configProvider.XbmcPassword = data.XbmcPassword;
_progressNotification.CurrentMessage = SETTINGS_SAVED; return GetSuccessResult();
_progressNotification.Status = ProgressNotificationStatus.Completed;
return Content(SETTINGS_SAVED);
} }
_progressNotification.CurrentMessage = SETTINGS_FAILED; return GetInvalidModelResult();
_progressNotification.Status = ProgressNotificationStatus.Completed;
return Content(SETTINGS_FAILED);
} }
[HttpPost] [HttpPost]
public ActionResult SaveEpisodeSorting(EpisodeSortingModel data) public ActionResult SaveEpisodeSorting(EpisodeSortingModel data)
{ {
_notificationProvider.Register(_progressNotification);
if (ModelState.IsValid) if (ModelState.IsValid)
{ {
_configProvider.SortingIncludeSeriesName = data.SeriesName; _configProvider.SortingIncludeSeriesName = data.SeriesName;
@ -434,14 +399,20 @@ public ActionResult SaveEpisodeSorting(EpisodeSortingModel data)
_configProvider.SortingNumberStyle = data.NumberStyle; _configProvider.SortingNumberStyle = data.NumberStyle;
_configProvider.SortingMultiEpisodeStyle = data.MultiEpisodeStyle; _configProvider.SortingMultiEpisodeStyle = data.MultiEpisodeStyle;
_progressNotification.CurrentMessage = SETTINGS_SAVED; return GetSuccessResult();
_progressNotification.Status = ProgressNotificationStatus.Completed;
return Content(SETTINGS_SAVED);
} }
_progressNotification.CurrentMessage = SETTINGS_FAILED; return GetInvalidModelResult();
_progressNotification.Status = ProgressNotificationStatus.Completed; }
return Content(SETTINGS_FAILED);
private JsonResult GetSuccessResult()
{
return Json(new NotificationResult() { Title = "Settings Saved" });
}
private JsonResult GetInvalidModelResult()
{
return Json(new NotificationResult() { Title = "Unable to save setting", Text = "Invalid post data", NotificationType = NotificationType.Error });
} }
} }
} }

View File

@ -0,0 +1,25 @@
namespace NzbDrone.Web.Models
{
public class NotificationResult
{
public NotificationResult()
{
Text = string.Empty;
}
public bool IsMessage { get { return true; } }
public string Title { get; set; }
public string Text { get; set; }
public NotificationType NotificationType { get; set; }
}
public enum NotificationType
{
Info,
Error
}
}

View File

@ -51,9 +51,9 @@
<HintPath>..\Libraries\MVC3\Microsoft.Web.Infrastructure.dll</HintPath> <HintPath>..\Libraries\MVC3\Microsoft.Web.Infrastructure.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="MvcMiniProfiler, Version=1.6.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3, processorArchitecture=MSIL"> <Reference Include="MvcMiniProfiler, Version=1.7.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\MiniProfiler.1.6\lib\MvcMiniProfiler.dll</HintPath> <HintPath>..\packages\MiniProfiler.1.7\lib\MvcMiniProfiler.dll</HintPath>
</Reference> </Reference>
<Reference Include="Ninject, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL"> <Reference Include="Ninject, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
<HintPath>..\packages\Ninject.2.2.1.4\lib\net40-Full\Ninject.dll</HintPath> <HintPath>..\packages\Ninject.2.2.1.4\lib\net40-Full\Ninject.dll</HintPath>
@ -135,6 +135,11 @@
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="Content\Images\close.png" />
<Content Include="Content\Images\error.png" />
<Content Include="Content\Images\gritter.png" />
<Content Include="Content\Images\success.png" />
<Content Include="Content\jquery.gritter.css" />
<Content Include="Content\Menu.css" /> <Content Include="Content\Menu.css" />
<Compile Include="Controllers\CommandController.cs" /> <Compile Include="Controllers\CommandController.cs" />
<Compile Include="Controllers\DirectoryController.cs" /> <Compile Include="Controllers\DirectoryController.cs" />
@ -160,6 +165,7 @@
<Compile Include="Helpers\IsCurrentActionHelper.cs" /> <Compile Include="Helpers\IsCurrentActionHelper.cs" />
<Compile Include="Models\ExistingSeriesModel.cs" /> <Compile Include="Models\ExistingSeriesModel.cs" />
<Compile Include="Models\AddNewSeriesModel.cs" /> <Compile Include="Models\AddNewSeriesModel.cs" />
<Compile Include="Models\NotificationResult.cs" />
<Compile Include="Models\PendingProcessingModel.cs" /> <Compile Include="Models\PendingProcessingModel.cs" />
<Compile Include="Models\QualityTypeModel.cs" /> <Compile Include="Models\QualityTypeModel.cs" />
<Compile Include="Models\RootDirModel.cs" /> <Compile Include="Models\RootDirModel.cs" />
@ -247,7 +253,6 @@
<Content Include="Content\Images\ui-icons_ffffff_256x240.png" /> <Content Include="Content\Images\ui-icons_ffffff_256x240.png" />
<Content Include="Content\Images\VideoFolder.png" /> <Content Include="Content\Images\VideoFolder.png" />
<Content Include="Content\Images\X.png" /> <Content Include="Content\Images\X.png" />
<Content Include="Content\jquery.jgrowl.css" />
<Content Include="Content\notibar.css" /> <Content Include="Content\notibar.css" />
<Content Include="Content\Settings.css" /> <Content Include="Content\Settings.css" />
<Content Include="Content\NzbDrone.css" /> <Content Include="Content\NzbDrone.css" />
@ -255,13 +260,13 @@
<Content Include="favicon.ico" /> <Content Include="favicon.ico" />
<Content Include="Global.asax" /> <Content Include="Global.asax" />
<Content Include="Scripts\AutoComplete.js" /> <Content Include="Scripts\AutoComplete.js" />
<Content Include="Scripts\Plugins\jquery.gritter.js" />
<Content Include="Scripts\seriesDetails.js" /> <Content Include="Scripts\seriesDetails.js" />
<Content Include="Scripts\Plugins\jquery.livequery.js" /> <Content Include="Scripts\Plugins\jquery.livequery.js" />
<Content Include="Scripts\settingsForm.js" /> <Content Include="Scripts\settingsForm.js" />
<Content Include="Scripts\Plugins\doTimeout.js" /> <Content Include="Scripts\Plugins\doTimeout.js" />
<Content Include="Scripts\episodeSearch.js" /> <Content Include="Scripts\episodeSearch.js" />
<Content Include="Scripts\Plugins\jquery.form.js" /> <Content Include="Scripts\Plugins\jquery.form.js" />
<Content Include="Scripts\Plugins\jquery.jgrowl.js" />
<Content Include="Scripts\Plugins\jquery-tgc-countdown-1.0.js" /> <Content Include="Scripts\Plugins\jquery-tgc-countdown-1.0.js" />
<Content Include="Scripts\Plugins\jquery.watermark.min.js" /> <Content Include="Scripts\Plugins\jquery.watermark.min.js" />
<Content Include="Scripts\Notification.js" /> <Content Include="Scripts\Notification.js" />

View File

@ -1,4 +1,57 @@
$(window).load(function () { 
(function ($) {
$.extend($.gritter.options, {
fade_in_speed: 'medium', // how fast notifications fade in (string or int)
fade_out_speed: 'medium', // how fast the notices fade out
time: 3000, // hang on the screen for...
sticky: false
});
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
jqXHR.success(function (data) {
//Check if the response is a message type,
if (data.IsMessage) {
if (data.NotificationType === 0) {
$.gritter.add({
title: data.Title,
text: data.Text,
image: '/content/images/success.png',
class_name: 'gritter-success'
});
}
else {
$.gritter.add({
title: data.Title,
text: data.Text,
image: '/content/images/error.png',
class_name: 'gritter-fail'
});
}
}
});
jqXHR.error(function (xhr, ajaxOptions, thrownError) {
//ignore notification errors.
if (this.url.indexOf("/notification/Comet") !== 0) {
$.gritter.add({
title: 'Request failed',
text: this.url,
image: '/content/images/error.png',
class_name: 'gritter-fail'
});
}
});
});
} (jQuery));
$(window).load(function () {
var speed = 700; var speed = 700;
var isShown = false; var isShown = false;
var currentMessage = ""; var currentMessage = "";
@ -10,7 +63,7 @@
else { else {
refreshNotifications(); refreshNotifications();
} }
function refreshNotifications() { function refreshNotifications() {
$.get('/notification/Comet', { message: currentMessage }, notificationCallback); $.get('/notification/Comet', { message: currentMessage }, notificationCallback);

View File

@ -0,0 +1,406 @@
/*
* https://raw.github.com/jboesch/Gritter/master/js/jquery.gritter.js
* Gritter for jQuery
* http://www.boedesign.com/
*
* Copyright (c) 2011 Jordan Boesch
* Dual licensed under the MIT and GPL licenses.
*
* Date: March 29, 2011
* Version: 1.7.1
*/
(function ($) {
/**
* Set it up as an object under the jQuery namespace
*/
$.gritter = {};
/**
* Set up global options that the user can over-ride
*/
$.gritter.options = {
position: '',
fade_in_speed: 'medium', // how fast notifications fade in
fade_out_speed: 1000, // how fast the notices fade out
time: 6000 // hang on the screen for...
}
/**
* Add a gritter notification to the screen
* @see Gritter#add();
*/
$.gritter.add = function (params) {
try {
return Gritter.add(params || {});
} catch (e) {
var err = 'Gritter Error: ' + e;
(typeof (console) != 'undefined' && console.error) ?
console.error(err, params) :
alert(err);
}
}
/**
* Remove a gritter notification from the screen
* @see Gritter#removeSpecific();
*/
$.gritter.remove = function (id, params) {
Gritter.removeSpecific(id, params || {});
}
/**
* Remove all notifications
* @see Gritter#stop();
*/
$.gritter.removeAll = function (params) {
Gritter.stop(params || {});
}
/**
* Big fat Gritter object
* @constructor (not really since it's object literal)
*/
var Gritter = {
// Public - options to over-ride with $.gritter.options in "add"
position: '',
fade_in_speed: '',
fade_out_speed: '',
time: '',
// Private - no touchy the private parts
_custom_timer: 0,
_item_count: 0,
_is_setup: 0,
_tpl_close: '<div class="gritter-close"></div>',
_tpl_item: '<div id="gritter-item-[[number]]" class="gritter-item-wrapper [[item_class]]" style="display:none"><div class="gritter-top"></div><div class="gritter-item">[[close]][[image]]<div class="[[class_name]]"><span class="gritter-title">[[username]]</span><p>[[text]]</p></div><div style="clear:both"></div></div><div class="gritter-bottom"></div></div>',
_tpl_wrap: '<div id="gritter-notice-wrapper"></div>',
/**
* Add a gritter notification to the screen
* @param {Object} params The object that contains all the options for drawing the notification
* @return {Integer} The specific numeric id to that gritter notification
*/
add: function (params) {
// We might have some issues if we don't have a title or text!
if (!params.title) {
throw 'You need to fill out the first 2 params: "title" and "text"';
}
// Check the options and set them once
if (!this._is_setup) {
this._runSetup();
}
// Basics
var user = params.title,
text = params.text,
image = params.image || '',
sticky = params.sticky || false,
item_class = params.class_name || '',
position = $.gritter.options.position,
time_alive = params.time || '';
this._verifyWrapper();
this._item_count++;
var number = this._item_count,
tmp = this._tpl_item;
// Assign callbacks
$(['before_open', 'after_open', 'before_close', 'after_close']).each(function (i, val) {
Gritter['_' + val + '_' + number] = ($.isFunction(params[val])) ? params[val] : function () { }
});
// Reset
this._custom_timer = 0;
// A custom fade time set
if (time_alive) {
this._custom_timer = time_alive;
}
var image_str = (image != '') ? '<img src="' + image + '" class="gritter-image" />' : '',
class_name = (image != '') ? 'gritter-with-image' : 'gritter-without-image';
// String replacements on the template
tmp = this._str_replace(
['[[username]]', '[[text]]', '[[close]]', '[[image]]', '[[number]]', '[[class_name]]', '[[item_class]]'],
[user, text, this._tpl_close, image_str, this._item_count, class_name, item_class], tmp
);
this['_before_open_' + number]();
$('#gritter-notice-wrapper').addClass(position).append(tmp);
var item = $('#gritter-item-' + this._item_count);
item.fadeIn(this.fade_in_speed, function () {
Gritter['_after_open_' + number]($(this));
});
if (!sticky) {
this._setFadeTimer(item, number);
}
// Bind the hover/unhover states
$(item).bind('mouseenter mouseleave', function (event) {
if (event.type == 'mouseenter') {
if (!sticky) {
Gritter._restoreItemIfFading($(this), number);
}
}
else {
if (!sticky) {
Gritter._setFadeTimer($(this), number);
}
}
Gritter._hoverState($(this), event.type);
});
return number;
},
/**
* If we don't have any more gritter notifications, get rid of the wrapper using this check
* @private
* @param {Integer} unique_id The ID of the element that was just deleted, use it for a callback
* @param {Object} e The jQuery element that we're going to perform the remove() action on
* @param {Boolean} manual_close Did we close the gritter dialog with the (X) button
*/
_countRemoveWrapper: function (unique_id, e, manual_close) {
// Remove it then run the callback function
e.remove();
this['_after_close_' + unique_id](e, manual_close);
// Check if the wrapper is empty, if it is.. remove the wrapper
if ($('.gritter-item-wrapper').length == 0) {
$('#gritter-notice-wrapper').remove();
}
},
/**
* Fade out an element after it's been on the screen for x amount of time
* @private
* @param {Object} e The jQuery element to get rid of
* @param {Integer} unique_id The id of the element to remove
* @param {Object} params An optional list of params to set fade speeds etc.
* @param {Boolean} unbind_events Unbind the mouseenter/mouseleave events if they click (X)
*/
_fade: function (e, unique_id, params, unbind_events) {
var params = params || {},
fade = (typeof (params.fade) != 'undefined') ? params.fade : true;
fade_out_speed = params.speed || this.fade_out_speed,
manual_close = unbind_events;
this['_before_close_' + unique_id](e, manual_close);
// If this is true, then we are coming from clicking the (X)
if (unbind_events) {
e.unbind('mouseenter mouseleave');
}
// Fade it out or remove it
if (fade) {
e.animate({
opacity: 0
}, fade_out_speed, function () {
e.animate({ height: 0 }, 300, function () {
Gritter._countRemoveWrapper(unique_id, e, manual_close);
})
})
}
else {
this._countRemoveWrapper(unique_id, e);
}
},
/**
* Perform actions based on the type of bind (mouseenter, mouseleave)
* @private
* @param {Object} e The jQuery element
* @param {String} type The type of action we're performing: mouseenter or mouseleave
*/
_hoverState: function (e, type) {
// Change the border styles and add the (X) close button when you hover
if (type == 'mouseenter') {
e.addClass('hover');
// Show close button
e.find('.gritter-close').show();
// Clicking (X) makes the perdy thing close
e.find('.gritter-close').click(function () {
var unique_id = e.attr('id').split('-')[2];
Gritter.removeSpecific(unique_id, {}, e, true);
});
}
// Remove the border styles and hide (X) close button when you mouse out
else {
e.removeClass('hover');
// Hide close button
e.find('.gritter-close').hide();
}
},
/**
* Remove a specific notification based on an ID
* @param {Integer} unique_id The ID used to delete a specific notification
* @param {Object} params A set of options passed in to determine how to get rid of it
* @param {Object} e The jQuery element that we're "fading" then removing
* @param {Boolean} unbind_events If we clicked on the (X) we set this to true to unbind mouseenter/mouseleave
*/
removeSpecific: function (unique_id, params, e, unbind_events) {
if (!e) {
var e = $('#gritter-item-' + unique_id);
}
// We set the fourth param to let the _fade function know to
// unbind the "mouseleave" event. Once you click (X) there's no going back!
this._fade(e, unique_id, params || {}, unbind_events);
},
/**
* If the item is fading out and we hover over it, restore it!
* @private
* @param {Object} e The HTML element to remove
* @param {Integer} unique_id The ID of the element
*/
_restoreItemIfFading: function (e, unique_id) {
clearTimeout(this['_int_id_' + unique_id]);
e.stop().css({ opacity: '' });
},
/**
* Setup the global options - only once
* @private
*/
_runSetup: function () {
for (opt in $.gritter.options) {
this[opt] = $.gritter.options[opt];
}
this._is_setup = 1;
},
/**
* Set the notification to fade out after a certain amount of time
* @private
* @param {Object} item The HTML element we're dealing with
* @param {Integer} unique_id The ID of the element
*/
_setFadeTimer: function (e, unique_id) {
var timer_str = (this._custom_timer) ? this._custom_timer : this.time;
this['_int_id_' + unique_id] = setTimeout(function () {
Gritter._fade(e, unique_id);
}, timer_str);
},
/**
* Bring everything to a halt
* @param {Object} params A list of callback functions to pass when all notifications are removed
*/
stop: function (params) {
// callbacks (if passed)
var before_close = ($.isFunction(params.before_close)) ? params.before_close : function () { };
var after_close = ($.isFunction(params.after_close)) ? params.after_close : function () { };
var wrap = $('#gritter-notice-wrapper');
before_close(wrap);
wrap.fadeOut(function () {
$(this).remove();
after_close();
});
},
/**
* An extremely handy PHP function ported to JS, works well for templating
* @private
* @param {String/Array} search A list of things to search for
* @param {String/Array} replace A list of things to replace the searches with
* @return {String} sa The output
*/
_str_replace: function (search, replace, subject, count) {
var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0,
f = [].concat(search),
r = [].concat(replace),
s = subject,
ra = r instanceof Array, sa = s instanceof Array;
s = [].concat(s);
if (count) {
this.window[count] = 0;
}
for (i = 0, sl = s.length; i < sl; i++) {
if (s[i] === '') {
continue;
}
for (j = 0, fl = f.length; j < fl; j++) {
temp = s[i] + '';
repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
s[i] = (temp).split(f[j]).join(repl);
if (count && s[i] !== temp) {
this.window[count] += (temp.length - s[i].length) / f[j].length;
}
}
}
return sa ? s : s[0];
},
/**
* A check to make sure we have something to wrap our notices with
* @private
*/
_verifyWrapper: function () {
if ($('#gritter-notice-wrapper').length == 0) {
$('body').append(this._tpl_wrap);
}
}
}
})(jQuery);

View File

@ -1,309 +0,0 @@
/**
* jGrowl 1.2.4
*
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
* Written by Stan Lemon <stosh1985@gmail.com>
* Last updated: 2009.12.13
*
* jGrowl is a jQuery plugin implementing unobtrusive userland notifications. These
* notifications function similarly to the Growl Framework available for
* Mac OS X (http://growl.info).
*
* To Do:
* - Move library settings to containers and allow them to be changed per container
*
* Changes in 1.2.4
* - Fixed IE bug with the close-all button
* - Fixed IE bug with the filter CSS attribute (special thanks to gotwic)
* - Update IE opacity CSS
* - Changed font sizes to use "em", and only set the base style
*
* Changes in 1.2.3
* - The callbacks no longer use the container as context, instead they use the actual notification
* - The callbacks now receive the container as a parameter after the options parameter
* - beforeOpen and beforeClose now check the return value, if it's false - the notification does
* not continue. The open callback will also halt execution if it returns false.
* - Fixed bug where containers would get confused
* - Expanded the pause functionality to pause an entire container.
*
* Changes in 1.2.2
* - Notification can now be theme rolled for jQuery UI, special thanks to Jeff Chan!
*
* Changes in 1.2.1
* - Fixed instance where the interval would fire the close method multiple times.
* - Added CSS to hide from print media
* - Fixed issue with closer button when div { position: relative } is set
* - Fixed leaking issue with multiple containers. Special thanks to Matthew Hanlon!
*
* Changes in 1.2.0
* - Added message pooling to limit the number of messages appearing at a given time.
* - Closing a notification is now bound to the notification object and triggered by the close button.
*
* Changes in 1.1.2
* - Added iPhone styled example
* - Fixed possible IE7 bug when determining if the ie6 class shoudl be applied.
* - Added template for the close button, so that it's content could be customized.
*
* Changes in 1.1.1
* - Fixed CSS styling bug for ie6 caused by a mispelling
* - Changes height restriction on default notifications to min-height
* - Added skinned examples using a variety of images
* - Added the ability to customize the content of the [close all] box
* - Added jTweet, an example of using jGrowl + Twitter
*
* Changes in 1.1.0
* - Multiple container and instances.
* - Standard $.jGrowl() now wraps $.fn.jGrowl() by first establishing a generic jGrowl container.
* - Instance methods of a jGrowl container can be called by $.fn.jGrowl(methodName)
* - Added glue preferenced, which allows notifications to be inserted before or after nodes in the container
* - Added new log callback which is called before anything is done for the notification
* - Corner's attribute are now applied on an individual notification basis.
*
* Changes in 1.0.4
* - Various CSS fixes so that jGrowl renders correctly in IE6.
*
* Changes in 1.0.3
* - Fixed bug with options persisting across notifications
* - Fixed theme application bug
* - Simplified some selectors and manipulations.
* - Added beforeOpen and beforeClose callbacks
* - Reorganized some lines of code to be more readable
* - Removed unnecessary this.defaults context
* - If corners plugin is present, it's now customizable.
* - Customizable open animation.
* - Customizable close animation.
* - Customizable animation easing.
* - Added customizable positioning (top-left, top-right, bottom-left, bottom-right, center)
*
* Changes in 1.0.2
* - All CSS styling is now external.
* - Added a theme parameter which specifies a secondary class for styling, such
* that notifications can be customized in appearance on a per message basis.
* - Notification life span is now customizable on a per message basis.
* - Added the ability to disable the global closer, enabled by default.
* - Added callbacks for when a notification is opened or closed.
* - Added callback for the global closer.
* - Customizable animation speed.
* - jGrowl now set itself up and tears itself down.
*
* Changes in 1.0.1:
* - Removed dependency on metadata plugin in favor of .data()
* - Namespaced all events
*/
(function ($) {
/** jGrowl Wrapper - Establish a base jGrowl Container for compatibility with older releases. **/
$.jGrowl = function (m, o) {
// To maintain compatibility with older version that only supported one instance we'll create the base container.
if ($('#jGrowl').size() == 0)
$('<div id="jGrowl"></div>').addClass($.jGrowl.defaults.position).appendTo('body');
// Create a notification on the container.
$('#jGrowl').jGrowl(m, o);
};
/** Raise jGrowl Notification on a jGrowl Container **/
$.fn.jGrowl = function (m, o) {
if ($.isFunction(this.each)) {
var args = arguments;
return this.each(function () {
var self = this;
/** Create a jGrowl Instance on the Container if it does not exist **/
if ($(this).data('jGrowl.instance') == undefined) {
$(this).data('jGrowl.instance', $.extend(new $.fn.jGrowl(), { notifications: [], element: null, interval: null }));
$(this).data('jGrowl.instance').startup(this);
}
/** Optionally call jGrowl instance methods, or just raise a normal notification **/
if ($.isFunction($(this).data('jGrowl.instance')[m])) {
$(this).data('jGrowl.instance')[m].apply($(this).data('jGrowl.instance'), $.makeArray(args).slice(1));
} else {
$(this).data('jGrowl.instance').create(m, o);
}
});
};
};
$.extend($.fn.jGrowl.prototype, {
/** Default JGrowl Settings **/
defaults: {
pool: 0,
header: '',
group: '',
sticky: false,
position: 'top-right', // Is this still needed?
glue: 'after',
theme: 'default',
corners: '0px',
check: 250,
life: 3000,
speed: '0',
easing: 'swing',
closer: true,
closeTemplate: '&times;',
closerTemplate: '<div>[ close all ]</div>',
log: function (e, m, o) { },
beforeOpen: function (e, m, o) { },
open: function (e, m, o) { },
beforeClose: function (e, m, o) { },
close: function (e, m, o) { },
animateOpen: {
opacity: 'show'
},
animateClose: {
opacity: 'hide'
}
},
notifications: [],
/** jGrowl Container Node **/
element: null,
/** Interval Function **/
interval: null,
/** Create a Notification **/
create: function (message, o) {
var o = $.extend({}, this.defaults, o);
this.notifications.push({ message: message, options: o });
o.log.apply(this.element, [this.element, message, o]);
},
render: function (notification) {
var self = this;
var message = notification.message;
var o = notification.options;
var notification = $(
'<div id=' +
notification.options.guid +' class="jGrowl-notification ui-state-highlight ui-corner-all' +
((o.group != undefined && o.group != '') ? ' ' + o.group : '') + '">' +
'<div class="close">' + o.closeTemplate + '</div>' +
'<div class="header">' + o.header + '</div>' +
'<div class="message">' + message + '</div></div>'
).data("jGrowl", o).addClass(o.theme).children('div.close').bind("click.jGrowl", function () {
$(this).parent().trigger('jGrowl.close');
}).parent();
/** Notification Actions **/
$(notification).bind("mouseover.jGrowl", function () {
$('div.jGrowl-notification', self.element).data("jGrowl.pause", true);
}).bind("mouseout.jGrowl", function () {
$('div.jGrowl-notification', self.element).data("jGrowl.pause", false);
}).bind('jGrowl.beforeOpen', function () {
if (o.beforeOpen.apply(notification, [notification, message, o, self.element]) != false) {
$(this).trigger('jGrowl.open');
}
}).bind('jGrowl.open', function () {
if (o.open.apply(notification, [notification, message, o, self.element]) != false) {
if (o.glue == 'after') {
$('div.jGrowl-notification:last', self.element).after(notification);
} else {
$('div.jGrowl-notification:first', self.element).before(notification);
}
$(this).animate(o.animateOpen, 0, o.easing, function () {
// Fixes some anti-aliasing issues with IE filters.
if ($.browser.msie && (parseInt($(this).css('opacity'), 10) === 1 || parseInt($(this).css('opacity'), 10) === 0))
this.style.removeAttribute('filter');
$(this).data("jGrowl").created = new Date();
});
}
}).bind('jGrowl.beforeClose', function () {
if (o.beforeClose.apply(notification, [notification, message, o, self.element]) != false)
$(this).trigger('jGrowl.close');
}).bind('jGrowl.close', function () {
// Pause the notification, lest during the course of animation another close event gets called.
$(this).data('jGrowl.pause', true);
$(this).animate(o.animateClose, o.speed, o.easing, function () {
$(this).remove();
var close = o.close.apply(notification, [notification, message, o, self.element]);
if ($.isFunction(close))
close.apply(notification, [notification, message, o, self.element]);
});
}).trigger('jGrowl.beforeOpen');
/** Optional Corners Plugin **/
if ($.fn.corner != undefined) $(notification).corner(o.corners);
/** Add a Global Closer if more than one notification exists **/
if ($('div.jGrowl-notification:parent', self.element).size() > 1 &&
$('div.jGrowl-closer', self.element).size() == 0 && this.defaults.closer != false) {
$(this.defaults.closerTemplate).addClass('jGrowl-closer ui-state-highlight ui-corner-all').addClass(this.defaults.theme)
.appendTo(self.element).animate(this.defaults.animateOpen, this.defaults.speed, this.defaults.easing)
.bind("click.jGrowl", function () {
$(this).siblings().children('div.close').trigger("click.jGrowl");
if ($.isFunction(self.defaults.closer)) {
self.defaults.closer.apply($(this).parent()[0], [$(this).parent()[0]]);
}
});
};
},
/** Update the jGrowl Container, removing old jGrowl notifications **/
update: function () {
$(this.element).find('div.jGrowl-notification:parent').each(function () {
if ($(this).data("jGrowl") != undefined && $(this).data("jGrowl").created != undefined &&
($(this).data("jGrowl").created.getTime() + $(this).data("jGrowl").life) < (new Date()).getTime() &&
$(this).data("jGrowl").sticky != true &&
($(this).data("jGrowl.pause") == undefined || $(this).data("jGrowl.pause") != true)) {
// Pause the notification, lest during the course of animation another close event gets called.
$(this).trigger('jGrowl.beforeClose');
}
});
if (this.notifications.length > 0 &&
(this.defaults.pool == 0 || $(this.element).find('div.jGrowl-notification:parent').size() < this.defaults.pool))
this.render(this.notifications.shift());
if ($(this.element).find('div.jGrowl-notification:parent').size() < 2) {
$(this.element).find('div.jGrowl-closer').animate(this.defaults.animateClose, this.defaults.speed, this.defaults.easing, function () {
$(this).remove();
});
}
},
/** Setup the jGrowl Notification Container **/
startup: function (e) {
this.element = $(e).addClass('jGrowl').append('<div class="jGrowl-notification"></div>');
this.interval = setInterval(function () {
$(e).data('jGrowl.instance').update();
}, this.defaults.check);
if ($.browser.msie && parseInt($.browser.version) < 7 && !window["XMLHttpRequest"]) {
$(this.element).addClass('ie6');
}
},
/** Shutdown jGrowl, removing it and clearing the interval **/
shutdown: function () {
$(this.element).removeClass('jGrowl').find('div.jGrowl-notification').remove();
clearInterval(this.interval);
},
close: function () {
$(this.element).find('div.jGrowl-notification').each(function () {
$(this).trigger('jGrowl.beforeClose');
});
}
});
/** Reference the Defaults Object for compatibility with older versions of jGrowl **/
$.jGrowl.defaults = $.fn.jGrowl.prototype.defaults;
})(jQuery);

View File

@ -1,8 +1,8 @@
$(document).ready(function () { $(document).ready(function () {
var options = { var options = {
target: '#result', target: '#result',
beforeSubmit: showRequest, //beforeSubmit: showRequest,
success: showResponse, //success: showResponse,
type: 'post', type: 'post',
resetForm: false resetForm: false
}; };

View File

@ -27,7 +27,4 @@
</label> </label>
@Html.TextBoxFor(m => m.Path, new { @class = "inputClass" }) @Html.TextBoxFor(m => m.Path, new { @class = "inputClass" })
</div> </div>
</div> </div>
<span id="ajaxSaveWheel" style="display: none; float: right; padding-right: 550px;
padding-top: 1.5px;">
<img src="../../../Content/Images/ajax-loader.gif" width="20px" height="20px" /></span>

View File

@ -81,7 +81,7 @@
</div> </div>
</div> </div>
<button type="submit" id="save_button" disabled="disabled">Save</button><img src="../../Content/Images/ajax-loader.gif" alt="Loader" id="saveAjax"/> <button type="submit" id="save_button" disabled="disabled">Save</button>
} }
</div> </div>
<div id="result" class="hiddenResult"></div> <div id="result" class="hiddenResult"></div>

View File

@ -125,7 +125,7 @@
} }
</div> </div>
<br/> <br/>
<button type="submit" id="save_button" disabled="disabled">Save</button><img src="../../Content/Images/ajax-loader.gif" alt="Loader" id="saveAjax"/> <button type="submit" id="save_button" disabled="disabled">Save</button>
} }
</div> </div>

View File

@ -92,7 +92,7 @@
@Html.TextBoxFor(m => m.XbmcPassword, new { @class = "inputClass" }) @Html.TextBoxFor(m => m.XbmcPassword, new { @class = "inputClass" })
</div> </div>
<button type="submit" id="save_button" disabled="disabled">Save</button><img src="../../Content/Images/ajax-loader.gif" alt="Loader" id="saveAjax"/> <button type="submit" id="save_button" disabled="disabled">Save</button>
} }
</div> </div>

View File

@ -40,7 +40,7 @@ Settings
</div> </div>
</div> </div>
<br /> <br />
<button type="submit" id="save_button" disabled="disabled">Save</button><img src="../../Content/Images/ajax-loader.gif" alt="Loader" id="saveAjax"/> <button type="submit" id="save_button" disabled="disabled">Save</button>
</div> </div>
} }
</div> </div>

View File

@ -66,7 +66,7 @@
</label> </label>
@Html.TextBoxFor(m => m.SabDropDirectory, new { @class = "inputClass folderLookup" }) @Html.TextBoxFor(m => m.SabDropDirectory, new { @class = "inputClass folderLookup" })
<button type="submit" id="save_button" disabled="disabled">Save</button><img src="../../Content/Images/ajax-loader.gif" alt="Loader" id="saveAjax"/> <button type="submit" id="save_button" disabled="disabled">Save</button>
} }
</div> </div>

View File

@ -9,6 +9,7 @@
<link type="text/css" rel="stylesheet" href="http://aspnet-skins.telerikstatic.com/mvcz/2011.2.712/telerik.sitefinity.min.css" /> <link type="text/css" rel="stylesheet" href="http://aspnet-skins.telerikstatic.com/mvcz/2011.2.712/telerik.sitefinity.min.css" />
<link type="text/css" rel="stylesheet" href="/Content/Blueprint/screen.css" /> <link type="text/css" rel="stylesheet" href="/Content/Blueprint/screen.css" />
<link type="text/css" rel="stylesheet" href="/Content/jQueryUI/jquery-ui-1.8.14.nzbdrone.css" /> <link type="text/css" rel="stylesheet" href="/Content/jQueryUI/jquery-ui-1.8.14.nzbdrone.css" />
<link type="text/css" rel="stylesheet" href="/Content/jquery.gritter.css" />
<link type="text/css" rel="stylesheet" href="/Content/NzbDrone.css" /> <link type="text/css" rel="stylesheet" href="/Content/NzbDrone.css" />
<link type="text/css" rel="stylesheet" href="/Content/Notibar.css" /> <link type="text/css" rel="stylesheet" href="/Content/Notibar.css" />
<link type="text/css" rel="stylesheet" href="/Content/ActionButton.css" /> <link type="text/css" rel="stylesheet" href="/Content/ActionButton.css" />
@ -19,9 +20,9 @@
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/yui/3.3.0/build/yui/yui-min.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/yui/3.3.0/build/yui/yui-min.js"></script>
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js"></script> <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js"></script>
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/mvc/3.0/MicrosoftMvcAjax.js"></script> <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/mvc/3.0/MicrosoftMvcAjax.js"></script>
<script type="text/javascript" src="/Scripts/Plugins/jquery.gritter.js"></script>
<script type="text/javascript" src="/Scripts/Plugins/jquery.livequery.js"></script> <script type="text/javascript" src="/Scripts/Plugins/jquery.livequery.js"></script>
<script type="text/javascript" src="/Scripts/Plugins/jquery.form.js"></script> <script type="text/javascript" src="/Scripts/Plugins/jquery.form.js"></script>
<script type="text/javascript" src="/Scripts/Plugins/jquery.jgrowl.js"></script>
<script type="text/javascript" src="/Scripts/Plugins/jquery-tgc-countdown-1.0.js"></script> <script type="text/javascript" src="/Scripts/Plugins/jquery-tgc-countdown-1.0.js"></script>
<script type="text/javascript" src="/Scripts/Plugins/jquery.watermark.min.js"></script> <script type="text/javascript" src="/Scripts/Plugins/jquery.watermark.min.js"></script>
<script type="text/javascript" src="/Scripts/Plugins/doTimeout.js"></script> <script type="text/javascript" src="/Scripts/Plugins/doTimeout.js"></script>

View File

@ -8,5 +8,5 @@
<package id="jQuery.Validation" version="1.8.0.1" /> <package id="jQuery.Validation" version="1.8.0.1" />
<package id="jQuery" version="1.6.1" /> <package id="jQuery" version="1.6.1" />
<package id="SqlServerCompact" version="4.0.8482.1" /> <package id="SqlServerCompact" version="4.0.8482.1" />
<package id="MiniProfiler" version="1.6" /> <package id="MiniProfiler" version="1.7" />
</packages> </packages>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -668,6 +668,21 @@
proxy proxy
</summary> </summary>
</member> </member>
<member name="T:MvcMiniProfiler.MVCHelpers.ProfilingActionFilter">
<summary>
This filter can be applied globally to hook up automatic action profiling
</summary>
</member>
<member name="M:MvcMiniProfiler.MVCHelpers.ProfilingActionFilter.OnActionExecuting(System.Web.Mvc.ActionExecutingContext)">
<summary>
Happens before the action starts running
</summary>
</member>
<member name="M:MvcMiniProfiler.MVCHelpers.ProfilingActionFilter.OnActionExecuted(System.Web.Mvc.ActionExecutedContext)">
<summary>
Happens after the action executes
</summary>
</member>
<member name="T:MvcMiniProfiler.ProfileLevel"> <member name="T:MvcMiniProfiler.ProfileLevel">
<summary> <summary>
Categorizes individual <see cref="T:MvcMiniProfiler.Timing"/> steps to allow filtering. Categorizes individual <see cref="T:MvcMiniProfiler.Timing"/> steps to allow filtering.
@ -1293,6 +1308,32 @@
How large the type is, e.g. for string, size could be 4000 How large the type is, e.g. for string, size could be 4000
</summary> </summary>
</member> </member>
<member name="T:MvcMiniProfiler.MVCHelpers.ProfilingViewEngine">
<summary>
You can wrap your view engines with this view to enable profiling on views and partial
</summary>
</member>
<member name="M:MvcMiniProfiler.MVCHelpers.ProfilingViewEngine.#ctor(System.Web.Mvc.IViewEngine)">
<summary>
Create a wrapped view engine, which will profile partials an non-partial views
</summary>
<param name="wrapped"></param>
</member>
<member name="M:MvcMiniProfiler.MVCHelpers.ProfilingViewEngine.FindPartialView(System.Web.Mvc.ControllerContext,System.String,System.Boolean)">
<summary>
Find a partial view
</summary>
</member>
<member name="M:MvcMiniProfiler.MVCHelpers.ProfilingViewEngine.FindView(System.Web.Mvc.ControllerContext,System.String,System.String,System.Boolean)">
<summary>
Fined a view
</summary>
</member>
<member name="M:MvcMiniProfiler.MVCHelpers.ProfilingViewEngine.ReleaseView(System.Web.Mvc.ControllerContext,System.Web.Mvc.IView)">
<summary>
Release view
</summary>
</member>
<member name="T:MvcMiniProfiler.UI.MiniProfilerHandler"> <member name="T:MvcMiniProfiler.UI.MiniProfilerHandler">
<summary> <summary>
Understands how to route and respond to MiniProfiler UI urls. Understands how to route and respond to MiniProfiler UI urls.