6.12.2009

Another New Feature

So we have been busy lately. Unfortunately, this has kept us from blogging as much as we should have been.

We have been working hard on a new feature. In the next couple of months, we will be introducing an advanced new feature to vesticator. Just as a high-level overview, and a give-you-a-teaser, this feature will consist of a new alert type that focuses on human intelligence rather than mathematics.

We are getting close to finalizing the first version and ready to test it. Many hours will be involved to test this so the release date is still unknown.

We will give you more details as time approaches!

More to come ...

4.07.2009

New Feature

Well, we added a new feature over at www.vesticator.com that brings us close to another feature we cannot wait to implement!

We have added a "slider" in place of the areas where you used to have to type in numbers. this should make things easier for users to work with the parameters that are required for each indicator.

As usual, our goal is to continually simplify things for the end user. We want things to be as simple as possible for our users.

If you have not signed up already, go sign up for a free trial at vesticator.com. If you have signed up, go add some new alerts or try editing one you have.

3.26.2009

Dreaming of new features

With more and more interest in vesticator.com, we are increasing efforts to simplify things even more. We have a few features in the works, but one I am really excited about. I am tempted to mention it here, but I think the suspense (probably my own) makes things far more fun.

We do have this great goal and desire to target our users in better and better ways. We want to make investing easier for them. We want investing to be passive (but not un-educated). We want them to avoid the stress of following the market hourly (I have experienced my share of heartburn on that one).

As we plan each feature, our next steps as a company and for our product, it is easy to keep coming back to the users we want to please. Because in many senses, those users are us too. I don't want to study the charts for every security I am interested in. I just want to know when those charts are doing things that I care about.

I hope that in the next month or two we will have some news to announce for one of our major new features we have planned. I hope it is not anti-climatic given that I am mentioning it in this post. :)

Stay Tuned ...

3.23.2009

JavaScript, DataGrid Paging, UpdatePanel, and ClientScriptManager. What works and what does not?

So, you want to add some simple JavaScript to an image to get the nice "hover" feature used on our homepage (hover over a small graph and you get a larger graph.)

It seems like a simple concept;

  • register your helper method

  • register your hover-over and hover-out images. Use JavaScript image to prevent caching issues "var myImg = new Image();"

  • add some onmouseover and onmouseout attributes

  • presto!


So, you do all this and it works perfectly! Right, well not exactly.

The first item that will break this concept is Paging. By turning on Paging for the GridView you will notice that all hover image will be the same for each page. This is because the ClientID of the rendered control will be the same for the same Row of data. For example the First Row of the First Page will have a ClientID of GridView_ctl01_Image1 and the First Row of the Second Page will have the same ClientID. This problem can be solved by incorporating the UniqueKey property and including this when generating a uniqueid (see method below).

The second item that will break this concept is the UpdatePanel. By enclosing our GridView in an UpdatePanel you will find that the hover will only work for the first Page, not for any others. This appears to be caused by using the ClientScriptManager instead of the ScriptManager (highlighted in Yellow below.) This problem can be solved by only using the ScriptManager and NOT the ClientScriptManager.

Here is some sample code to illustrate what I have found

Sample ASPX Code
<body>
<form id="form1" runat="server">
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/App_Data/GridData.xml"XPath="data/rows/row"></asp:XmlDataSource>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"DataSourceID="XmlDataSource1"AllowPaging="True"PageSize="3">
<Columns>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:Label ID="Label1" Text='<%# XPath("Name") %>' runat="server"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Image">
<ItemTemplate>
<cus:CustomImage ID="CustomImage1" AlternateText='<%# XPath("Name")%>' runat="server" UniqueKey='<%# XPath("Id")%>' ImageUrlSmall='<%#XPath("UrlSmall") %>' ImageUrlLarge='<%#XPath("UrlLarge")%>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>

Sample C# Code
/// <summary>
/// Summary description for CustomImage
/// </summary>

public class CustomImage : Image
{
[Browsable(true)]
public string ImageUrlLarge{
get;
set;
}
[Browsable(true)]
public string ImageUrlSmall{
get;
set;
}
[Browsable(true)]
public string UniqueKey{
get;
set;
}
public CustomImage()
: base() { }
protected override void OnPreRender(EventArgs e){
base.OnPreRender(e);
ClientScriptManager csm = this.Page.ClientScript;
if (!csm.IsStartupScriptRegistered(this.GetType(), "Shared")){
StringBuilder sb = new StringBuilder();
sb.AppendLine("function switchImageUrl(object, image) {");
sb.AppendLine(" object.src = image.src;");
sb.AppendLine(" object.style.zIndex = 1001;");
sb.AppendLine("}");
csm.RegisterStartupScript(
this.GetType(),
"Shared",
sb.ToString(),
true);
}
string key = GetUniqueKey();
if (!csm.IsClientScriptBlockRegistered(this.GetType(), key)){
StringBuilder sb = new StringBuilder();
sb.AppendFormat("var {0}large = new Image();\n", key);
sb.AppendFormat("{0}large.src = \"{1}\";\n", key, ImageUrlLarge);
sb.AppendFormat("var {0}small = new Image();\n", key);
sb.AppendFormat("{0}small.src = \"{1}\";\n", key, ImageUrlSmall);
// Works with Paging on, but not UpdatePanel
csm.RegisterClientScriptBlock(
this.GetType(),
key,
sb.ToString(),
true);
// Works with Paging and UpdatePanel
ScriptManager.RegisterClientScriptBlock(
this,
this.GetType(),
key,
sb.ToString(),
true);
}
this.Attributes.Add(
"onmouseover",
String.Format(
"switchImageUrl(this, {0}large)",
key));
this.Attributes.Add(
"onmouseout",
String.Format(
"switchImageUrl(this, {0}small)",
key));
if (!String.IsNullOrEmpty(ImageUrlSmall))
this.ImageUrl = ImageUrlSmall;
}
private string GetUniqueKey() {
// Client ID does work with Paging because
// paged rows end up with the same ClientID
// For Example:
// DataGrid_ctr01_CustomImage1 (page one row one)
// DataGrid_ctr01_CustomImage1 (page two row one)

if (String.IsNullOrEmpty(UniqueKey))
// Decided to hash the ClientID to avoid
// overly long var name in client stream

return String.Format(
"_ci_id_{0}_",
Math.Abs(this.ClientID.GetHashCode()));
else
// When UniqueKey is present use this instead
return String.Format(
"_ci_pk_{0}_",
UniqueKey);
}
}

3.16.2009

Stupid Browser Issues

Ok, so what a friggin pain! Scott and I (mainly Scott) have been wrestling with non-IE 7 issues for several days now over at vesticator.com.

Once we fixed IE 6 issues, we discovered FireFox, Chrome, Opera and Safari issues. We fixed all those issues (except FF) and then found more IE6 issues. Then we fixed the other IE 6 issues again only to have to fix all the non-IE issues again. Sheez! Most of this was all related to Ajax and the AutoCompleteExtender.

As a startup we cannot afford to have these issues. This problem was forcing users to use work arounds to create stock alerts for stock indicators. In fact, for IE6, users could not create stock alerts period.

In the end, my conclusion is this: people complain about how IE is so lame....but it seemed that IE 7+ was the easiest to work with from a CSS and Ajax perspective. The js and css was so much more intuitive and easy to work with in IE7+ compared to the other browsers. And this has nothing to do with having more experience in one vs. the others. I don't know js or ajax enough to have had an opinion before these experiences.

Anyway, all browsers should allow for Stock Alerts on the Stock Indicators we offer. What a relief!

3.10.2009

Lots of little things

It is amazing how many little things there are to do to polish a site up. Both Scott and I have been working like crazy to polish up all the little items that are noticeable and not noticeable.

One of the much needed items we just added was a page that discusses the different stock indicators the vesticator offers. In addition, on that same page, there are some links to some great resources to learn more about some of the concepts of technical analysis. IMO, the money central link is one of the best.

These items, and many more, have been added to help the overall user experience. I hope to some of these changes are noticeable to you; however, in a coming post, I will try and point some of these items out.

3.05.2009

A Basic Vesticator Blog Intro

Jonny here, technical lead over at vesticator.

Eight months ago I never would have believed the DOW would drop below 7000 and yet here we are. I really could have used a heads up on that one! Now that we are here, bottom or not, there are some good deals out there if you know what to look for. Here at vesticator we are about to release some power tools to provide the very heads up I have been missing.

It is time to turn things around and it starts by getting access to the information needed for smart decision making.