﻿/// Инициализация

if (!window.NicoFanSite)
	window.NicoFanSite = {};

NicoFanSite.Page = function() {}

NicoFanSite.Page.prototype =
{
    handleLoad: function(control, userContext, rootElement)
    {
        this.control = control;
        this.control.content.findName("cyrcleAnimation").Begin();

        //Downloader("xml/menu.xml", getXml, null, xmltext);
        //Downloader("xml/menu.xslt", getXml, null, xsltext);
        XHRLoader("xml/menu.xml", null, "GET", XmlDownloadCompleted, null,
            { namespace: "NicoFanSite.Menu", successAction: GenerateSubmenu });
        XHRLoader("xml/menu.xslt", null, "GET", XmlDownloadCompleted, null,
            { namespace: "NicoFanSite.Menu", successAction: GenerateSubmenu });
        Downloader("content.zip", downloadedContent, downloadingContent);
    }
}


/// Глобальные переменные и функции

NicoFanSite.Menu = {};
NicoFanSite.Menu.XmlObject = null;
NicoFanSite.Menu.XslObject = null;
NicoFanSite.Templates =
{
    GetTemplate: function(name)
    {
        var template = GetControl().content.createFromXamlDownloader(zippedContent, "templates/" + name + ".xaml");
        return template;
    }
};

var zippedContent;
var xmltext = '';
var xsltext = '';
var standby;
var loadingContent = '';
var tooltip_standby;

function GetControl()
{
    if (NicoFanSite.control == undefined)
    {
        NicoFanSite.control = document.getElementById("SilverlightControl");
    }
    return NicoFanSite.control;
}

function Downloader(fileName, Completed, ProgressChanged, destination)
{
    var object = GetControl().createObject("downloader");
    if (ProgressChanged) object.addEventListener("downloadProgressChanged", ProgressChanged);
    if (Completed) object.addEventListener("completed", Completed);
    object.addEventListener("downloadFailed", DownloadFailed);
    object.open("GET", fileName);
    object.send();
}

function DownloadFailed(sender, args)
{
    alert("При обращении к серверу произошла ошибка... Проверьте соединение и повторите попытку.");
}

function XsltTransformation(xml, xsl)
{
    //выполняем XSLT-преобразование
    var xaml;
    try
    {
        if (window.ActiveXObject)
        {
            xaml = xml.transformNode(xsl);
        }
        else
        {
            var serializer = new XMLSerializer();
            var xsltProcessor = new XSLTProcessor();
            xsltProcessor.importStylesheet(xsl);
            xaml = xsltProcessor.transformToFragment(xml, document);
            xaml = serializer.serializeToString(xaml);
            //выгружаем лишнее
            serializer = null;
            xsltProcessor = null;
        }
    }
    catch (e)
    {
        alert("Ошибка динамической генерации страницы: " + e.message + " Сообщите администратору сайта...");
        return null;
    }
    return xaml.replace(/\sx="http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml"/g, '');
}

function GenerateSubmenu()
{
    var control = GetControl().content;
    var xaml = XsltTransformation(NicoFanSite.Menu.XmlObject, NicoFanSite.Menu.XslObject);
    var content = control.createFromXaml(xaml);
    NicoFanSite.Menu.names = "";
    for (var i = 0; i < content.children.count; i++)
    {
        var submenuItem = content.children.GetItem(i);
        submenuItem.Visibility = "Collapsed";
        NicoFanSite.Menu.names += ('|' + submenuItem["Name"] + '|');
    }

    NicoFanSite.Menu.content = content;
    var submenu = control.findName("submenuGroup");
    if (submenu)
    {
        submenu.children.clear();
        submenu.children.Insert(0, content);
    }
}

function ChangeSubmenu(menuItemName, submenuItemName)//создание подменю
{
    var control = GetControl().content;
    var containsSubmenuItem = false;
    var submenuObject = control.findName("submenuGroup").children.getItem(0);
    for (var i = 0; i < submenuObject.children.count; i++)
    {
        var menuItem = submenuObject.children.GetItem(i);
        if (menuItem["Name"] == menuItemName)
        {
            menuItem.Visibility = "Visible";
            location.hash = menuItem["Tag"];
            for (var j = 0; j < menuItem.children.count; j++)
            {
                var submenuItem = menuItem.children.GetItem(j);
                if (submenuItem["Name"] == submenuItemName + "_submenu") containsSubmenuItem = true;
                var fon = submenuItem.children.GetItem(0);
                fon.Visibility = "Visible";
            }
        }
        else
        {
            menuItem.Visibility = "Collapsed";
        }
    }    
    return containsSubmenuItem;
}

function centeringText(textblock, canvas)
{
    textblock["Canvas.Left"] = (canvas.Width - textblock.ActualWidth) / 2;
}

function manageEvent_ToMainMenu(isAdd) //управление обработчиком нажатия для главного изображения
{
    var link = GetControl().content.findName("image_link");
    if (isAdd)
    {
        link.addEventListener("MouseLeftButtonDown", "mainClick");
        link.Cursor = "Hand";
    }
    else
    {
        link.removeEventListener("MouseLeftButtonDown", "mainClick");
        link.Cursor = "Arrow";
    }
}

function visibility_pageChanging(flag) //при переходе между страницами "Главное меню - Контент" - управление свойством Visibility
{
    var mainVisibility, pageVisibility;
    if (flag) { mainVisibility = "Collapsed"; pageVisibility = "Visible" }
    else { pageVisibility = "Collapsed"; mainVisibility = "Visible" }

    var content = GetControl().content;
    content.findName("menuGroup").Visibility = mainVisibility;
    content.findName("extContent").Visibility = mainVisibility;
    content.findName("pageGroup").Visibility = pageVisibility;
}

function GoToContent(submenuName, pageName, startAction)
{
    var isPageNameCorrect = ChangeSubmenu(submenuName + "_menu", pageName);

    loadingContent = '';
    var contentLoaded = false;
    if (pageName && isPageNameCorrect)
    {
        SetContentPage(pageName, false);
        contentLoaded = true;
    }
    GoToContentMenu(contentLoaded, startAction);
}

function GoToContentMenu(contentLoaded, startAction)
{
    var control = GetControl().content;
    control.findName("mainAnimation").Pause();
    var animation = control.findName("toPageAnimation");
    animation.Begin();
    if (startAction)
    {
        animation.Pause();
        animation.Seek("0:0:2");
    }
    if (!contentLoaded)
    {
        control.findName("contentPages").children.clear();
        control.findName("submenuChoiceAnimation").Begin();
    }
    control.findName("menu_toolTip").Visibility = "Visible";
    if (startAction)
    {
        visibility_pageChanging(true);
        manageEvent_ToMainMenu(true);
        animation.Resume();
    }
    else
    {
        window.setTimeout(function() { visibility_pageChanging(true); }, 1000);
        if (standby != null) window.clearTimeout(standby); //чтобы не добавилось больше 1 обработчика
        standby = window.setTimeout(function() { manageEvent_ToMainMenu(true); }, 2000);
    }
}

function ContentPageAlreadyLoading(loadingContent, mousePosition)
{
    var control = GetControl().content;
    var textblock = control.findName("contentLoading_name");
    textblock.Text = loadingContent;
    var tooltip = control.findName("contentLoading");
    tooltip.Visibility = "Visible";
    tooltip["Canvas.Left"] = mousePosition.X + 2;
    tooltip["Canvas.Top"] = mousePosition.Y - 27;

    control.findName("contentLoadingAnimation").Begin();
    if (tooltip_standby != null) window.clearTimeout(tooltip_standby);
    //через секунду надо убрать подсказку, чтобы не висела на переднем фоне
    tooltip_standby = window.setTimeout(function()
    {
        var tooltip = GetControl().content.findName("contentLoading");
        tooltip["Canvas.Left"] = 0;
        tooltip["Canvas.Top"] = 0;
        tooltip.Visibility = "Collapsed";
    }, 1000);
}

function SetContentPage(contentName, withAnimation)
{
    var control = GetControl().content;
    var menuRoot = control.findName("submenuGroup").children.GetItem(0);
    var isPageAlreadyLoaded = false;
    for (var i = 0; i < menuRoot.children.count; i++)
    {
        var menuItem = menuRoot.children.GetItem(i);
        if (menuItem.Visibility == "Visible")
        {
            for (var j = 0; j < menuItem.children.count; j++)
            {
                var submenuItem = menuItem.children.GetItem(j);
                if (submenuItem["Name"] == contentName + "_submenu")
                {
                    var fon = submenuItem.children.GetItem(0);
                    isPageAlreadyLoaded = fon.Visibility == "Collapsed";
                    if (withAnimation)
                    {
                        var storyboard = control.findName("hideSubmenuItemFonAnimation");
                        storyboard.Stop();
                        storyboard.Children.GetItem(0)["Storyboard.TargetName"] = fon["Name"];
                        storyboard.Begin();
                        window.setTimeout(function()
                        {
                            fon.Visibility = "Collapsed";
                        }, 500);
                    }
                    else
                    {
                        fon.Opacity = 0;
                        fon.Visibility = "Collapsed";
                    }
                }
                else
                {
                    submenuItem.children.GetItem(0).Visibility = "Visible";
                }
            }
        }
    }

    var fileName = contentName + '.xaml';
    var animation = control.findName("pageChangingAnimation");
    if (!isPageAlreadyLoaded)
    {
        deleteMouseCaptureObjects();
        var content, nocontent;
        try
        {
            nocontent = control.createFromXamlDownloader(zippedContent, "pages/nopage.xaml");
            content = control.createFromXamlDownloader(zippedContent, "pages/" + fileName);
        }
        catch (e) { }
        //Opera очень сильно тупит с выполнением блока try. Исключения висят в консоли ошибок.
        if (content == undefined) content = nocontent;
        var contentCanvas = control.findName("contentPages");
        var hash = content["Tag"] == "" ? menuRoot["Tag"] : content["Tag"];
        if (withAnimation)
        {
            window.setTimeout(function()
            {
                ChangeContentPage(content, contentCanvas, animation);
                location.hash = hash;
            }, 1000);
        }
        else
        {
            contentCanvas.children.clear();
            contentCanvas.children.add(content);
            location.hash = hash;
        }
    }

    ChangeTextboxesVisibility(fileName == "gb.xaml");
    if (withAnimation) animation.Begin();
}

function ChangeContentPage(content, canvas, storyboard)
{
    storyboard.Pause();
    canvas.children.clear();
    canvas.children.add(content);
    storyboard.Resume();
}

//обработчики событий:

function XmlDownloadCompleted(xml, url, params)
{
    var error = xml.getElementsByTagName("errorMessage")[0];
    if (error != undefined && error != null)
    {
        if (params.errorAction) params.errorAction();
        alert(error.childNodes[0].nodeValue);
        return;
    }

    var namespace = eval(params.namespace);
    if (/\.xslt$/.test(url))
    {
        namespace.XslObject = xml;
    }
    else
    {
        namespace.XmlObject = xml;
    }
    if (namespace.XslObject != null && namespace.XmlObject != null)
    {
        if(params.successAction) params.successAction();
    }
}

function downloadedContent(sender, args)
{
    if (sender.status != 200)
    {
        alert("При загрузке произошла ошибка... Перезагрузите страницу (F5)...");
        return;
    }

    zippedContent = sender;
    var animation = sender.findName("downloadedAnimation");
    animation.addEventListener("completed", function() { mainContentStart(sender); });
    animation.Begin();
}

function downloadingContent(sender, args)
{
    var done = Math.floor(sender.downloadProgress * 100);

    var indicator = sender.findName("DownloadProcessIndicator");
    var progress = sender.findName("DownloadProcessValue");
    progress.text = done + "%";
    centeringText(progress, indicator);

    var animation = sender.findName("DownloadProgressAnimation");
    animation.children.GetItem(0).keyframes.GetItem(0).value = done * 295 / 100;
    animation.Begin();
}

//курсор вышел за пределы контрола Silverlight!!!
function rootMouseLeave(sender, eventArgs)
{
    if(scroller.lastScroller != null)
    {
        scroller.isMouseCaptured = false;
        scroller.lastScroller.ReleaseMouseCapture();
        scroller.lastScroller.Fill = scroller.scrollerFill;
        scroller.lastScroller = null;
    }
    levelChangers.ReleaseCapture();
}

function menuItemClick(sender, eventArgs)//переход из меню к одной из страниц
{
    ChangeSubmenu(sender["Tag"]);
    GoToContentMenu();
}

function mainClick(sender, eventArgs)//возвращение в меню
{
    manageEvent_ToMainMenu(false);
    location.hash = "#";
	sender.findName("toMenuAnimation").Begin();
	sender.findName("mainAnimation").Resume();
	sender.findName("submenuChoiceAnimation").Stop();
	sender.findName("menu_toolTip").Visibility = "Collapsed";
	window.setTimeout(function(){visibility_pageChanging(false);}, 1500);
	deleteMouseCaptureObjects();
	ChangeTextboxesVisibility(false);
}

function GoToContentEvent(sender, args)
{
    var contentParameters = sender["Tag"].split('/');
    GoToContent(contentParameters[0], contentParameters[1]);
}

function HideTooltip(sender, args)
{
    sender.findName("menu_toolTip").Visibility = "Collapsed";
}

function submenuItemClicked(sender, args)
{
	if(loadingContent.length > 0)
	{
        ContentPageAlreadyLoading(loadingContent, args.GetPosition(null));
		return;
	}
	else {loadingContent = '"' + sender["Tag"] + '"';}

	SetContentPage(sender["Name"], true);
}

function PageChangingCompleted(sender, args)
{
    loadingContent = '';
}

function deleteMouseCaptureObjects() {
    if (scroller.controls.canvas) //если на прошлой странице есть контрол для прокрутки
    {
        //то уничтожаем переменные и обработчики скроллера!!!
        scroller.Destroy();
    }
    if (audioPlayer.player) {
        audioPlayer.Destroy(true);
    }
    levelChangers.DestroyAll();
}

function submenuItemEntered(sender, args)
{
	reusableSubmenuAnimation(sender["Name"], sender.findName("smoothlyShow"));
}

function submenuItemLeaved(sender, args)
{
	reusableSubmenuAnimation(sender["Name"], sender.findName("smoothlyHide"));
}

function reusableSubmenuAnimation(name, storyboard)//запуск многократно используемой анимации
{
	plugin = storyboard.getHost().content;
	var strokeOpacity = plugin.findName(name + "_stroke")["Opacity"];
	var fonOpacity = plugin.findName(name + "_fon")["Opacity"];
	if(storyboard.Children.GetItem(0)["Storyboard.TargetName"] != name + "_stroke")
	{
	    storyboard.Stop();
	    storyboard.Children.GetItem(0)["Storyboard.TargetName"] = name + "_stroke";
	    storyboard.Children.GetItem(1)["Storyboard.TargetName"] = name + "_fon";
	}
	plugin.findName(name + "_stroke")["Opacity"] = strokeOpacity;
	plugin.findName(name + "_fon")["Opacity"] = fonOpacity;
	storyboard.Begin();
}

function loadImageFromZip(sender, args)
{
    try
    {
        sender.setSource(zippedContent, "images/" + sender["Name"] + ".png");
    }
    catch(e)
    {
        if(sender["Name"].indexOf('cover_') == 0) //если мы ищем обложку, которой нет - подставим стандартную
        {
            sender.setSource(zippedContent, "images/cover_other.png");
        }
    }
}



function ButtonHover(sender, args) {
    sender.findName("ButtonHoverAnimation").Begin();
}

function ButtonNormal(sender, args) {
    sender.findName("ButtonNormalAnimation").Begin();
}

function hyperlink_MouseEnter(sender, args) {
    sender.textDecorations = "Underline";
    sender.foreground = "Pink";
}

function hyperlink_MouseLeave(sender, args) {
    sender.textDecorations = "None";
    sender.foreground = "White";
}

function hyperlink_MouseClick(sender, args) {
    var link = sender.tag;
    window.open(link, '', '');
}

function mainContentStart(sender)
{
    var mainXaml = sender.getResponseText("Content.xaml");
    var content = sender.getHost().content.createFromXaml(mainXaml);

    var root = sender.findName("rootCanvas");
    root.children.clear();
    root.children.insert(0, content);
    if (NicoFanSite.Menu.content)
    {
        var submenu = sender.findName("submenuGroup");
        submenu.children.clear();
        submenu.children.insert(0, NicoFanSite.Menu.content);
    }

    var image = content.findName("image");
    image.setSource(sender, "images/nico_top.png");

    var menu = content.findName("menuGroup");
    for (var i = 0; i < menu.children.count; i++)
    {
        menu.children.getItem(i).children.getItem(0).children.insert(0, NicoFanSite.Templates.GetTemplate("cyrcle"));
    }

    sender.findName("mainAnimation").Begin();
    if (location.hash.length > 1)
    {
        //если не подгрузилось меню, то песец...
        var contentParameters = location.hash.replace('#', '').split('/');
        if (NicoFanSite.Menu.names.indexOf('|' + contentParameters[0] + '_menu|', 0) >= 0)
        {
            GoToContent(contentParameters[0], contentParameters[1], true);
        }
    }
    sender.findName("mainContentStartAnimation").Begin();
    Downloader("handlers/mainnews.ashx?session=" + (new Date()).getTime().toString(), SetMainNews, null);
}

function SetMainNews(sender, args)
{
    var xaml = sender.getResponseText("");
    sender.findName("extContent").children.insert(0, GetControl().content.createFromXaml(xaml));
}



//--------------------------------------
//      Объекты для скроллинга
//--------------------------------------
var scroller = 
{
    deltaFromTopPosition: null,
    isMouseCaptured: false,
    mouseVerticalPosition: null,
    scrollerFill: null,
    lastScroller: null,
    color: null,
    controls:
    {
        scroller: null,
        canvas: null,
        deltabutton_up: null,
        deltabutton_down: null
    },
    tokens:
    {
        scroller_mlbd: null,
        scroller_mlbu: null,
        scroller_mm: null,
        up_mlbd: null,
        down_mlbd: null
    },
    canvasHeight: null,
    ratio: null,
    defaultDelta: 20,
    
    Initialize: function(scrollerControl, controlToScrolling, up, down, color)
    {
        scrollerControl["Canvas.Top"] = 0;
		controlToScrolling["Canvas.Top"] = 0;
		
		var scrollerCanvas = scrollerControl.getParent();
        
        scroller.canvasHeight = controlToScrolling.getParent().Height;
        scroller.ratio = controlToScrolling.Height / scrollerCanvas.Height;
        
        var scrollerHeight = scroller.canvasHeight / scroller.ratio;
        if(scrollerHeight < scrollerCanvas.Height)
        {
            scrollerControl.Height = scrollerHeight;
			scrollerCanvas.GetParent().Visibility = "Visible";
        }
        else
        {
			scrollerCanvas.GetParent().Visibility = "Collapsed";
        }
		
		var plugin = scrollerControl.getHost().content;
        var Brush = LinearGradientBrush(plugin, 0, scroller.canvasHeight);
        controlToScrolling.OpacityMask = Brush;
            
        scroller.color = color;
        scroller.controls.scroller = scrollerControl;
        scroller.controls.canvas = controlToScrolling;
        scroller.controls.deltabutton_up = up;
        scroller.controls.deltabutton_down = down;
        
        scroller.tokens.scroller_mlbd = scrollerControl.addEventListener("MouseLeftButtonDown", scroller.ScrollerMouseDown);
        scroller.tokens.scroller_mlbu = scrollerControl.addEventListener("MouseLeftButtonUp", scroller.ScrollerMouseUp);
        scroller.tokens.scroller_mm = scrollerControl.addEventListener("MouseMove", scroller.ScrollerMove);
        if(up != null)
        {
            scroller.tokens.up_mlbd = up.addEventListener("MouseLeftButtonDown", scroller.ScrollUp);
        }
        if(down != null)
        {
            scroller.tokens.down_mlbd = down.addEventListener("MouseLeftButtonDown", scroller.ScrollDown);
        }
    },
    
    Destroy: function()
    {
        scroller.controls.scroller.removeEventListener("MouseLeftButtonDown", scroller.tokens.scroller_mlbd );
        scroller.controls.scroller.removeEventListener("MouseLeftButtonUp", scroller.tokens.scroller_mlbu );
        scroller.controls.scroller.removeEventListener("MouseMove", scroller.tokens.scroller_mm );
        if(scroller.controls.deltabutton_up != null)
        {
            scroller.controls.deltabutton_up.removeEventListener("MouseLeftButtonDown", scroller.tokens.up_mlbd );
        }
        if(scroller.controls.deltabutton_down != null)
        {
            scroller.controls.deltabutton_down.removeEventListener("MouseLeftButtonDown", scroller.tokens.down_mlbd );
        }
        
        scroller.controls.scroller = null;
        scroller.controls.canvas = null;
        scroller.controls.deltabutton_up = null;
        scroller.controls.deltabutton_down = null;
        
        scroller.tokens.scroller_mlbd = null;
        scroller.tokens.scroller_mlbu = null;
        scroller.tokens.scroller_mm = null;
        scroller.tokens.up_mlbd = null;
        scroller.tokens.down_mlbd = null;
        
        scroller.deltaFromTopPosition = null;
        scroller.isMouseCaptured = false;
        scroller.mouseVerticalPosition = null;
        scroller.scrollerFill = null;
        scroller.lastScroller = null;
        scroller.color = null;
        scroller.canvasHeight = null;
        scroller.ratio = null;
    },
    
    ScrollerMouseDown: function(sender, eventArgs)
    {
        scroller.mouseVerticalPosition = eventArgs.getPosition(null).y;
        scroller.deltaFromTopPosition = eventArgs.getPosition(sender).y;
        scroller.isMouseCaptured = true;
        sender.CaptureMouse();
        if (scroller.scrollerFill == null) scroller.scrollerFill = sender.Fill;
        sender.Fill = scroller.color;
        scroller.lastScroller = sender;
    },

    ScrollerMouseUp: function(sender, eventArgs)
    {
        scroller.isMouseCaptured = false;
        sender.ReleaseMouseCapture();
        sender.Fill = scroller.scrollerFill;
    },

    ScrollerMove: function(sender, eventArgs)
    {
        if(scroller.isMouseCaptured)
        {
            var scrolled = scroller.controls.canvas;
            var y = eventArgs.getPosition(null).y;
            var delta = y - scroller.mouseVerticalPosition;
            var top = sender["Canvas.Top"] + delta;
            var scrolledTop;
            
            var minTop = 0;
            var maxTop = sender.getParent().Height - sender.Height;
            if(top < minTop) top = minTop;
            if(top > maxTop) top = maxTop;
            
            scrolledTop = top * scroller.ratio;
            
            var deltaFromParentTop = eventArgs.getPosition(sender.getParent()).y;
            if(!(deltaFromParentTop < scroller.deltaFromTopPosition ||
                deltaFromParentTop > scroller.deltaFromTopPosition + sender["Canvas.Top"]))
            {
                scroller.mouseVerticalPosition = y;
            }
            var brush = LinearGradientBrush(sender.GetHost().content,
                scrolledTop,
                scrolledTop + scroller.canvasHeight);
            
            sender["Canvas.Top"] = top;
            scrolled["Canvas.Top"] = -scrolledTop;
            scrolled.OpacityMask = brush;
        }
    },
    
    ScrollUp: function(sender, eventArgs)
    {
        var scrollerDelta = scroller.defaultDelta / scroller.ratio;
        var top = scroller.controls.scroller["Canvas.Top"] - scrollerDelta;
        if(top < 0) top = 0;
        scroller.controls.scroller["Canvas.Top"] = top;
        
        var scrolledTop = top * scroller.ratio;
        scroller.controls.canvas["Canvas.Top"] = -scrolledTop;
        var brush = LinearGradientBrush(sender.GetHost().content,
            scrolledTop,
            scrolledTop + scroller.canvasHeight);
        scroller.controls.canvas.OpacityMask = brush;
    },
    
    ScrollDown: function(sender, eventArgs)
    {
        var scrollerDelta = scroller.defaultDelta / scroller.ratio;
        var top = scroller.controls.scroller["Canvas.Top"] + scrollerDelta;
        var height = scroller.controls.scroller.Height;
        var scrollerParent = scroller.controls.scroller.GetParent();
        if(top + height > scrollerParent.Height) top = scrollerParent.Height - height;
        scroller.controls.scroller["Canvas.Top"] = top;
        
        var scrolledTop = top * scroller.ratio;
        scroller.controls.canvas["Canvas.Top"] = -scrolledTop;
        var brush = LinearGradientBrush(sender.GetHost().content,
            scrolledTop,
            scrolledTop + scroller.canvasHeight);
        scroller.controls.canvas.OpacityMask = brush;
    }
}

var GradientStop = function(plugin, color, offset)
{
    var item = plugin.CreateFromXaml("<GradientStop />");
    item.Color = color;
    item.Offset = offset;
    return item;
}

var LinearGradientBrush = function(plugin, start, end)
{
    var brush = plugin.CreateFromXaml("<LinearGradientBrush />")
    brush.MappingMode = "Absolute";
    brush.StartPoint = "0," + start;
    brush.EndPoint = "0," + end;
    
    brush.GradientStops.Add(GradientStop(plugin, "#00000000", "0"));
    brush.GradientStops.Add(GradientStop(plugin, "#FF000000", "1"));
    brush.GradientStops.Add(GradientStop(plugin, "#FF000000", "0"));
    brush.GradientStops.Add(GradientStop(plugin, "#00000000", "1"));
    
    return brush;
}
