-/**\r
- * Namespace: System.Web.UI.WebControls\r
- * Class: AdRotator\r
- *\r
- * Author: Gaurav Vaish\r
- * Maintainer: gvaish@iitk.ac.in\r
- * Implementation: yes\r
- * Contact: <gvaish@iitk.ac.in>\r
- * Status: 100%\r
- *\r
- * (C) Gaurav Vaish (2001)\r
- */\r
-\r
-using System;\r
-using System.IO;\r
-using System.Collections;\r
-using System.Collections.Specialized;\r
-using System.Web;\r
-using System.Web.Caching;\r
-using System.Web.UI;\r
-using System.Xml;\r
-using System.Web.Utils;\r
-using System.ComponentModel;\r
-\r
-namespace System.Web.UI.WebControls\r
-{\r
- [DefaultEvent("AdCreated")]\r
- [DefaultProperty("AdvertisementFile")]\r
- //TODO: [Designer("??")]\r
- [ToolboxData("<{0}:AdRotator runat=\"server\" Height=\"60px\" "\r
- + "Width=\"468\"></{0}:AdRotator>")]\r
- public class AdRotator: WebControl\r
- {\r
-\r
- private string advertisementFile;\r
- private static readonly object AdCreatedEvent = new object();\r
-\r
- // Will be set values during (On)PreRender-ing\r
- private string alternateText;\r
- private string imageUrl;\r
- private string navigateUrl;\r
-\r
- private string fileDirectory;\r
-\r
- class AdRecord\r
- {\r
- public IDictionary adProps;\r
- public int hits; // or impressions or clicks\r
- public string keyword;\r
-\r
- public AdRecord(IDictionary adProps)\r
- {\r
- this.adProps = adProps;\r
- hits = 0;\r
- keyword = String.Empty;\r
- }\r
- }\r
-\r
-/*\r
- * Loading / Saving data from/to ad file and all the manipulations wrt to the URL...\r
- * are incorporated by the following functions.\r
- * GetData(string)\r
- * LoadAdFile(string)\r
- * IsAdMatching(AdRecord)\r
- * ResolveAdUrl(string)\r
- * SelectAd()\r
- * The exact control flow will be detailed. Let me first write the functions\r
- */\r
-\r
- private AdRecord[] LoadAdFile(string file)\r
- {\r
- Stream fStream;\r
- ArrayList list;\r
- XmlReader reader;\r
- XmlDocument document;\r
- XmlNode topNode, innerNode;\r
- IDictionary hybridDict = null;\r
- AdRecord[] adsArray = null;\r
- try\r
- {\r
- fStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read);\r
- } catch(Exception e)\r
- {\r
- throw new HttpException("AdRotator: Unable to open file");\r
- }\r
- try\r
- {\r
- list = new ArrayList();\r
- reader = new XmlTextReader(fStream);\r
- document = new XmlDocument();\r
- document.Load(reader);\r
- if(document.DocumentElement!=null)\r
- {\r
- if(document.DocumentElement.LocalName=="Advertisements")\r
- {\r
- topNode = document.DocumentElement.FirstChild;\r
- while(topNode!=null)\r
- {\r
- if(topNode.LocalName=="Ad")\r
- {\r
- innerNode = topNode.FirstChild;\r
- while(innerNode!=null)\r
- {\r
- if(innerNode.NodeType==XmlNodeType.Element)\r
- {\r
- if(hybridDict==null)\r
- {\r
- hybridDict = new HybridDictionary();\r
- }\r
- hybridDict.Add(innerNode.LocalName, innerNode.InnerText);\r
- }\r
- innerNode = innerNode.NextSibling;\r
- }\r
- if(hybridDict!=null)\r
- list.Add(hybridDict);\r
- }\r
- topNode = topNode.NextSibling;\r
- }\r
- }\r
- }\r
- if(list.Count>0)\r
- {\r
- adsArray = new AdRecord[list.Count];\r
- for(int i=0; i < list.Count; i++)\r
- {\r
- adsArray[i] = new AdRecord((IDictionary)list[i]);\r
- }\r
- }\r
- } catch(Exception e)\r
- {\r
- throw new HttpException("AdRotator_Parse_Error" + file);\r
- } finally\r
- {\r
- fStream.Close();\r
- }\r
- if(adsArray == null)\r
- {\r
- throw new HttpException("AdRotator_No_Advertisements_Found");\r
- }\r
- return adsArray;\r
- }\r
-\r
- private AdRecord[] GetData(string file)\r
- {\r
- string physPath = MapPathSecure(file);\r
- string AdKey = "AdRotatorCache: " + physPath;\r
- fileDirectory = UrlUtils.GetDirectory(UrlUtils.Combine(TemplateSourceDirectory, file));\r
- Cache cache = HttpRuntime.Cache;\r
- AdRecord[] records = (AdRecord[])cache[AdKey];\r
- if(records==null)\r
- {\r
- records = LoadAdFile(physPath);\r
- if(records==null)\r
- {\r
- return null;\r
- }\r
- cache.Insert(AdKey, records, new CacheDependency(physPath));\r
- }\r
- return records;\r
- }\r
-\r
- private IDictionary SelectAd()\r
- {\r
- AdRecord[] records = GetData(AdvertisementFile);\r
- if(records!=null && records.Length!=0)\r
- {\r
- int impressions = 0;\r
- for(int i=0 ; i < records.Length; i++)\r
- {\r
- if(IsAdMatching(records[i]))\r
- impressions += records[1].hits;\r
- }\r
- if(impressions!=0)\r
- {\r
- int rnd = (new Random()).Next(impressions) + 1;\r
- int counter = 0;\r
- int index = 0;\r
- for(int i=0; i < records.Length; i++)\r
- {\r
- if(IsAdMatching(records[i]))\r
- {\r
- if(rnd <= (counter + records[i].hits))\r
- {\r
- index = i;\r
- break;\r
- }\r
- counter += records[i].hits;\r
- }\r
- }\r
- return records[index].adProps;\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- private bool IsAdMatching(AdRecord currAd)\r
- {\r
- if(KeywordFilter!=String.Empty)\r
- {\r
- if(currAd.keyword.ToLower() == KeywordFilter.ToLower())\r
- return false;\r
- }\r
- return true;\r
- }\r
-\r
- private string ResolveAdUrl(string relativeUrl)\r
- {\r
- if(relativeUrl.Length==0 || !UrlUtils.IsRelativeUrl(relativeUrl))\r
- return relativeUrl;\r
- string fullUrl = String.Empty;\r
- if(fileDirectory != null)\r
- fullUrl = fileDirectory;\r
- if(fullUrl.Length == 0)\r
- fullUrl = TemplateSourceDirectory;\r
- if(fullUrl.Length == 0)\r
- return relativeUrl;\r
- return (fullUrl + relativeUrl);\r
- }\r
-\r
- [WebCategory("Action")]\r
- [WebSysDescription("AdRotator_OnAdCreated")]\r
- public event AdCreatedEventHandler AdCreated\r
- {\r
- add\r
- {\r
- Events.AddHandler(AdCreatedEvent, value);\r
- }\r
- remove\r
- {\r
- Events.RemoveHandler(AdCreatedEvent, value);\r
- }\r
- }\r
-\r
- public AdRotator(): base()\r
- {\r
- advertisementFile = string.Empty;\r
- fileDirectory = null;\r
- }\r
-\r
- [Bindable(true)]\r
- [DefaultValue("")]\r
- //[Editor("??")]\r
- [WebCategory("Behaviour")]\r
- [WebSysDescription("AdRotator_AdvertisementFile")]\r
- public string AdvertisementFile\r
- {\r
- get\r
- {\r
- return advertisementFile;\r
- }\r
- set\r
- {\r
- advertisementFile = value;\r
- }\r
- }\r
-\r
- public override FontInfo Font\r
- {\r
- get\r
- {\r
- return Font;\r
- }\r
- }\r
-\r
- [Bindable(true)]\r
- [DefaultValue("")]\r
- [WebCategory("Behaviour")]\r
- [WebSysDescription("AdRotator_KeywordFilter")]\r
- public string KeywordFilter\r
- {\r
- get\r
- {\r
- object o = ViewState["KeywordFilter"];\r
- if(o!=null)\r
- return (string)o;\r
- return String.Empty;\r
- }\r
- set\r
- {\r
- if(value!=null)\r
- ViewState["KeywordFilter"] = value.Trim();\r
- }\r
- }\r
-\r
- [Bindable(true)]\r
- [DefaultValue("")]\r
- [TypeConverter(typeof(TargetConverter))]\r
- [WebCategory("Behaviour")]\r
- [WebSysDescription("AdRotator_Target")]\r
- public string Target\r
- {\r
- get\r
- {\r
- object o = ViewState["Target"];\r
- if(o!=null)\r
- return (string)o;\r
- return String.Empty;\r
- }\r
- set\r
- {\r
- ViewState["Target"] = value;\r
- }\r
- }\r
-\r
- protected override ControlCollection CreateControlCollection()\r
- {\r
- return new EmptyControlCollection(this);\r
- }\r
-\r
- protected virtual void OnAdCreated(AdCreatedEventArgs e)\r
- {\r
- if(Events!=null)\r
- {\r
- AdCreatedEventHandler aceh = (AdCreatedEventHandler)(Events[AdCreatedEvent]);\r
- if(aceh!=null)\r
- aceh(this, e);\r
- }\r
- }\r
-\r
- protected override void OnPreRender(EventArgs e)\r
- {\r
- if(AdvertisementFile!=String.Empty)\r
- {\r
- AdCreatedEventArgs acea = new AdCreatedEventArgs(SelectAd());\r
- imageUrl = acea.ImageUrl;\r
- navigateUrl = acea.NavigateUrl;\r
- alternateText = acea.AlternateText;\r
- }\r
- }\r
-\r
- protected override void Render(HtmlTextWriter writer)\r
- {\r
- HyperLink hLink = new HyperLink();\r
- Image adImage = new Image();\r
- foreach(IEnumerable current in Attributes.Keys)\r
- {\r
- hLink.Attributes[(string)current] = Attributes[(string)current];\r
- }\r
- if(ID != null && ID.Length > 0)\r
- hLink.ID = ID;\r
- hLink.Target = Target;\r
- hLink.AccessKey = AccessKey;\r
- hLink.Enabled = Enabled;\r
- hLink.TabIndex = TabIndex;\r
- hLink.RenderBeginTag(writer);\r
- if(ControlStyleCreated)\r
- {\r
- adImage.ApplyStyle(ControlStyle);\r
- }\r
- if(imageUrl!=null && imageUrl.Length > 0)\r
- adImage.ImageUrl = ResolveAdUrl(imageUrl);\r
- adImage.AlternateText = alternateText;\r
- adImage.ToolTip = ToolTip;\r
- adImage.RenderControl(writer);\r
- hLink.RenderEndTag(writer);\r
- }\r
- }\r
-}\r
+//
+// System.Web.UI.WebControls.AdRotator.cs
+//
+// Authors:
+// Gaurav Vaish (gvaish@iitk.ac.in)
+// Gonzalo Paniagua Javier (gonzalo@ximian.com)
+// Andreas Nahr (ClassDevelopment@A-SoftTech.com)
+// Sanjay Gupta (gsanjay@novell.com)
+//
+// (c) 2002 Ximian, Inc. (http://www.ximian.com)
+// (C) Gaurav Vaish (2002)
+// (C) 2003 Andreas Nahr
+// (C) 2004 Novell, Inc. (http://www.novell.com)
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.IO;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Web;
+using System.Web.Caching;
+using System.Web.UI;
+using System.Xml;
+using System.Web.Util;
+using System.ComponentModel;
+using System.ComponentModel.Design;
+
+namespace System.Web.UI.WebControls
+{
+ [DefaultEvent("AdCreated")]
+ [DefaultProperty("AdvertisementFile")]
+ [Designer ("System.Web.UI.Design.WebControls.AdRotatorDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]
+ [ToolboxData("<{0}:AdRotator runat=\"server\" Height=\"60px\" "
+ + "Width=\"468\"></{0}:AdRotator>")]
+ public class AdRotator: WebControl
+ {
+ string advertisementFile;
+ static readonly object AdCreatedEvent = new object();
+
+ // Will be set values during (On)PreRender-ing
+ string alternateText;
+ string imageUrl;
+ string navigateUrl;
+ string fileDirectory;
+ Random random;
+
+ public AdRotator ()
+ {
+ advertisementFile = "";
+ fileDirectory = null;
+ }
+
+ AdRecord[] LoadAdFile (string file)
+ {
+ Stream fStream;
+ try {
+ fStream = new FileStream (file, FileMode.Open, FileAccess.Read, FileShare.Read);
+ } catch (Exception e) {
+ throw new HttpException("AdRotator: Unable to open file", e);
+ }
+
+ ArrayList list = new ArrayList ();
+ try {
+ IDictionary hybridDict = null;
+ XmlDocument document = new XmlDocument ();
+ document.Load (fStream);
+
+ XmlElement docElem = document.DocumentElement;
+
+ if (docElem == null)
+ throw new HttpException ("No advertisements found");
+
+ if (docElem.LocalName != "Advertisements")
+ throw new HttpException ("No advertisements found: invalid document element");
+
+ XmlNode node = docElem.FirstChild;
+ while (node != null) {
+ if (node.LocalName == "Ad") {
+ XmlNode innerNode = node.FirstChild;
+ while (innerNode != null) {
+ if (node.NodeType == XmlNodeType.Element) {
+ if (hybridDict == null)
+ hybridDict = new HybridDictionary ();
+
+ hybridDict.Add (innerNode.LocalName, innerNode.InnerText);
+ }
+ innerNode = innerNode.NextSibling;
+ }
+
+ if (hybridDict != null) {
+ list.Add (hybridDict);
+ hybridDict = null;
+ }
+ }
+ node = node.NextSibling;
+ }
+
+ } catch(Exception e) {
+ throw new HttpException("Parse error:" + file, e);
+ } finally {
+ if (fStream != null)
+ fStream.Close();
+ }
+
+ if (list.Count == 0)
+ throw new HttpException ("No advertisements found");
+
+ AdRecord [] adsArray = new AdRecord [list.Count];
+ int count = list.Count;
+ for (int i = 0; i < count; i++)
+ adsArray [i] = new AdRecord ((IDictionary) list [i]);
+
+ return adsArray;
+ }
+
+ AdRecord [] GetData (string file)
+ {
+ string physPath = MapPathSecure (file);
+ string AdKey = "AdRotatorCache: " + physPath;
+ fileDirectory = UrlUtils.GetDirectory (UrlUtils.Combine (TemplateSourceDirectory, file));
+ Cache cache = HttpRuntime.Cache;
+ AdRecord[] records = (AdRecord[]) cache [AdKey];
+ if (records == null) {
+ records = LoadAdFile (physPath);
+ cache.Insert (AdKey, records, new CacheDependency (physPath));
+ }
+
+ return records;
+ }
+
+ IDictionary SelectAd ()
+ {
+ AdRecord[] records = GetData (AdvertisementFile);
+ if (records == null || records.Length ==0)
+ return null;
+
+ int impressions = 0;
+ int rlength = records.Length;
+ for (int i=0 ; i < rlength; i++) {
+ if (IsAdMatching (records [i]))
+ impressions += records [i].Hits;
+ }
+
+ if (impressions == 0)
+ return null;
+
+ if (random == null)
+ random = new Random ();
+
+ int rnd = random.Next (impressions) + 1;
+ int counter = 0;
+ int index = 0;
+ for (int i = 0; i < rlength; i++) {
+ if(IsAdMatching(records[i])) {
+ if (rnd <= (counter + records [i].Hits)) {
+ index = i;
+ break;
+ }
+ counter += records [i].Hits;
+ }
+ }
+
+ return records [index].Properties;
+ }
+
+ private bool IsAdMatching (AdRecord currAd)
+ {
+ if (KeywordFilter != String.Empty)
+ return (0 == String.Compare (currAd.Keyword, KeywordFilter, true));
+
+ return true;
+ }
+
+ private string ResolveAdUrl (string relativeUrl)
+ {
+ if (relativeUrl.Length==0 || !UrlUtils.IsRelativeUrl (relativeUrl))
+ return relativeUrl;
+
+ string fullUrl;
+ if (fileDirectory != null)
+ fullUrl = fileDirectory;
+ else
+ fullUrl = TemplateSourceDirectory;
+
+ if (fullUrl.Length == 0)
+ return relativeUrl;
+
+ return UrlUtils.Combine (fullUrl, relativeUrl);
+ }
+
+ [WebCategory("Action")]
+ [WebSysDescription("AdRotator_OnAdCreated")]
+ public event AdCreatedEventHandler AdCreated {
+ add { Events.AddHandler (AdCreatedEvent, value); }
+ remove { Events.RemoveHandler (AdCreatedEvent, value); }
+ }
+
+ [Bindable(true)]
+ [DefaultValue("")]
+ [Editor ("System.Web.UI.Design.XmlUrlEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
+ [WebCategory("Behavior")]
+ [WebSysDescription("AdRotator_AdvertisementFile")]
+#if NET_2_0
+ [Localizable (true)]
+ [UrlProperty ()]
+#endif
+ public string AdvertisementFile {
+ get { return ((advertisementFile != null) ? advertisementFile : ""); }
+ set { advertisementFile = value; }
+ }
+
+ [Browsable (false), EditorBrowsable (EditorBrowsableState.Never)]
+ [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+ public override FontInfo Font {
+ get { return base.Font; }
+ }
+
+ [Bindable(true)]
+ [DefaultValue("")]
+ [WebCategory("Behavior")]
+ [WebSysDescription("AdRotator_KeywordFilter")]
+ public string KeywordFilter {
+ get {
+ object o = ViewState ["KeywordFilter"];
+ if (o != null)
+ return (string) o;
+
+ return String.Empty;
+ }
+ set {
+ if(value != null)
+ ViewState ["KeywordFilter"] = value.Trim ();
+ }
+ }
+
+ [Bindable(true)]
+ [DefaultValue("")]
+ [TypeConverter(typeof(TargetConverter))]
+ [WebCategory("Behavior")]
+ [WebSysDescription("AdRotator_Target")]
+ public string Target {
+ get {
+ object o = ViewState ["Target"];
+ if (o != null)
+ return (string) o;
+
+ return "_top";
+ }
+ set {
+ ViewState["Target"] = value;
+ }
+ }
+
+ protected override ControlCollection CreateControlCollection ()
+ {
+ return new EmptyControlCollection (this);
+ }
+
+ protected virtual void OnAdCreated (AdCreatedEventArgs e)
+ {
+ if (Events == null)
+ return;
+
+ AdCreatedEventHandler aceh = (AdCreatedEventHandler) Events [AdCreatedEvent];
+ if (aceh != null)
+ aceh (this, e);
+ }
+
+ protected override void OnPreRender (EventArgs e)
+ {
+ if(AdvertisementFile == String.Empty)
+ return;
+
+ AdCreatedEventArgs acea = new AdCreatedEventArgs (SelectAd ());
+ OnAdCreated (acea);
+ imageUrl = acea.ImageUrl;
+ navigateUrl = acea.NavigateUrl;
+ alternateText = acea.AlternateText;
+ }
+
+ [MonoTODO ("Update method with net 2.0 properties added for AdRotator class")]
+ protected override void Render (HtmlTextWriter writer)
+ {
+ HyperLink hLink = new HyperLink ();
+ Image adImage = new Image();
+ foreach (string current in Attributes.Keys)
+ hLink.Attributes [current] = Attributes [current];
+
+ if (ID != null && ID.Length > 0)
+ hLink.ID = ID;
+
+ hLink.Target = Target;
+ hLink.AccessKey = AccessKey;
+ hLink.Enabled = Enabled;
+ hLink.TabIndex = TabIndex;
+ if (navigateUrl != null && navigateUrl.Length != 0)
+ hLink.NavigateUrl = ResolveAdUrl (navigateUrl);
+
+ hLink.RenderBeginTag (writer);
+ if (ControlStyleCreated)
+ adImage.ApplyStyle(ControlStyle);
+
+ if(imageUrl!=null && imageUrl.Length > 0)
+ adImage.ImageUrl = ResolveAdUrl (imageUrl);
+
+ adImage.AlternateText = alternateText;
+ adImage.ToolTip = ToolTip;
+ adImage.RenderControl (writer);
+ hLink.RenderEndTag (writer);
+ }
+
+#if NET_2_0
+ AdType adType;
+
+ [DefaultValueAttribute ("Banner")]
+ [WebCategoryAttribute ("Behavior")]
+ [WebSysDescriptionAttribute ("Advertisement of specific type is created by specified value")]
+ public AdType AdType {
+ get { return adType; }
+ set { adType = value; }
+ }
+
+ string alternateTextField;
+
+ [DefaultValueAttribute ("AlternateText")]
+ [WebCategoryAttribute ("Behavior")]
+ [WebSysDescriptionAttribute ("Alternate text is retrieved from the elmenet name specified.")]
+ //[VerificationAttribute ()]
+ public string AlternateTextField {
+ get { return alternateTextField; }
+ set { alternateTextField = value; }
+ }
+
+ bool countClicks;
+
+ [DefaultValueAttribute (false)]
+ [WebCategoryAttribute ("Site Counters")]
+ [WebSysDescriptionAttribute ("On clicking an advertisement, click-through events should be counted.")]
+ public bool CountClicks {
+ get { return countClicks; }
+ set { countClicks = value; }
+ }
+
+ string counterGroup;
+
+ [DefaultValueAttribute ("AdRotator")]
+ [WebCategoryAttribute ("Site Counters")]
+ [WebSysDescriptionAttribute ("Name of the group which takes care of counting.")]
+ public string CounterGroup {
+ get { return counterGroup; }
+ set { counterGroup = value; }
+ }
+
+ string counterName;
+
+ [DefaultValueAttribute ("")]
+ [WebCategoryAttribute ("Site Counters")]
+ [WebSysDescriptionAttribute ("Name of the group which takes care of counting.")]
+ public string CounterName {
+ get { return counterName; }
+ set { counterName = value; }
+ }
+
+ bool countViews;
+
+ [DefaultValueAttribute (false)]
+ [WebCategoryAttribute ("Site Counters")]
+ [WebSysDescriptionAttribute ("On creation of an advertisement, view events should be counted.")]
+ public bool CountViews {
+ get { return countViews; }
+ set { countViews = value; }
+ }
+
+ string imageUrlField;
+
+ [DefaultValueAttribute ("ImageUrl")]
+ [WebCategoryAttribute ("Behavior")]
+ [WebSysDescriptionAttribute ("Image URL is retrieved from the elmenet name specified.")]
+ public string ImageUrlField {
+ get { return imageUrlField; }
+ set { imageUrlField = value; }
+ }
+
+ string navigateUrlField;
+
+ [DefaultValueAttribute ("NavigateUrl")]
+ [WebCategoryAttribute ("Behavior")]
+ [WebSysDescriptionAttribute ("Advertisement Web page URL is retrieved from the elmenet name specified.")]
+ public string NavigateUrlField {
+ get { return navigateUrlField; }
+ set { navigateUrlField = value; }
+ }
+
+ int popFrequency;
+
+ [DefaultValueAttribute ("100")]
+ [WebCategoryAttribute ("Behavior")]
+ [WebSysDescriptionAttribute ("Frequency in percentage for creation of Popup or PopUnder advertisement.")]
+ public int PopFrequency {
+ get { return popFrequency; }
+ set { popFrequency = value; }
+ }
+
+ int popPositionLeft;
+
+ [DefaultValueAttribute ("-1")]
+ [WebCategoryAttribute ("Appearance")]
+ [WebSysDescriptionAttribute ("Specifies X-coordinate in pixels of Popunder or Popup advertisements top-left corner.")]
+ public int PopPositionLeft {
+ get { return popPositionLeft; }
+ set { popPositionLeft = value; }
+ }
+
+ int popPositionTop;
+
+ [DefaultValueAttribute ("-1")]
+ [WebCategoryAttribute ("Appearance")]
+ [WebSysDescriptionAttribute ("Specifies Y-coordinate in pixels of Popunder or Popup advertisements top-left corner.")]
+ public int PopPositionTop {
+ get { return popPositionTop; }
+ set { popPositionTop = value; }
+ }
+
+ int rowsPerDay;
+
+ [DefaultValueAttribute ("-1")]
+ [WebCategoryAttribute ("Site Counters")]
+ [WebSysDescriptionAttribute ("On a given day this many number of rows of data needs to be collected.")]
+ public int RowsPerDay {
+ get { return rowsPerDay; }
+ set { rowsPerDay = value; }
+ }
+
+ string siteCountersProvider;
+
+ [DefaultValueAttribute ("")]
+ [WebCategoryAttribute ("Site Counters")]
+ [WebSysDescriptionAttribute ("Control uses the specified provider.")]
+ public string SiteCountersProvider {
+ get { return siteCountersProvider; }
+ set { siteCountersProvider = value; }
+ }
+
+ bool trackApplicationName;
+
+ [DefaultValueAttribute (true)]
+ [WebCategoryAttribute ("Site Counters")]
+ [WebSysDescriptionAttribute ("SiteCounters service tracks and stores the specified application name in a database.")]
+ public bool TrackApplicationName {
+ get { return trackApplicationName; }
+ set { trackApplicationName = value; }
+ }
+
+ bool trackNavigateUrl;
+
+ [DefaultValueAttribute (true)]
+ [WebCategoryAttribute ("Site Counters")]
+ [WebSysDescriptionAttribute ("SiteCounters service tracks and stores the destination URL of click through event in a database.")]
+ public bool TrackNavigateUrl {
+ get { return trackNavigateUrl; }
+ set { trackNavigateUrl = value; }
+ }
+
+ bool trackPageUrl;
+
+ [DefaultValueAttribute (true)]
+ [WebCategoryAttribute ("Site Counters")]
+ [WebSysDescriptionAttribute ("SiteCounters service tracks and stores the originating page URL in a database.")]
+ public bool TrackPageUrl {
+ get { return trackPageUrl; }
+ set { trackPageUrl = value; }
+ }
+#endif
+
+ class AdRecord
+ {
+ public IDictionary Properties;
+ public int Hits; // or impressions or clicks
+ public string Keyword;
+
+ public AdRecord (IDictionary adProps)
+ {
+ this.Properties = adProps;
+ Keyword = Properties ["Keyword"] as string;
+ if (Keyword == null)
+ Keyword = "";
+
+ string imp = Properties ["Impressions"] as string;
+ Hits = 1;
+ if (imp != null) {
+ try {
+ Hits = Int32.Parse (imp);
+ } catch {
+ }
+ }
+ }
+ }
+ }
+}
+