using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Web.UI;
using Mullivan.Web.UI.Design.WebControls;
using System.Diagnostics;
using System.Web.UI.Design;
namespace Mullivan.Web.UI.WebControls
{
[ToolboxData("<{0}:JQuerySlider runat=\"server\"></{0}:JQuerySlider>"),
Designer(typeof(JQuerySliderDesigner))]
public class JQuerySlider : WebControl
{
private string _values = "25,40,50,75";
private bool _initialized = false;
public JQuerySlider() : base(HtmlTextWriterTag.Div) { }
public enum JQuerySliderOrientation
{
//Auto = 0,
Horizontal = 1,
Vertical = 2
}
public event EventHandler SelectedValuesChanged;
[Browsable(false)]
public string ClientJQueryControlId
{
get
{
this.EnsureID();
return "jq" + this.ClientID;
}
}
public string ClientValuesControlId
{
get
{
return this.ClientJQueryControlId + "_Values";
}
}
[Category("Behavior"),
Browsable(true)]
public bool Animate
{
get
{
return (this.ViewState["Animate"] != null ?
(bool)this.ViewState["Animate"]
: true);
}
set
{
this.ViewState["Animate"] = value;
}
}
[Category("Behavior"),
Browsable(true)]
public int Maximum
{
get
{
return (this.ViewState["Maximum"] != null ?
(int)this.ViewState["Maximum"]
: 100);
}
set
{
this.ViewState["Maximum"] = value;
}
}
[Category("Behavior"),
Browsable(true)]
public int Minimum
{
get
{
return (this.ViewState["Minimum"] != null ?
(int)this.ViewState["Minimum"]
: 0);
}
set
{
this.ViewState["Minimum"] = value;
}
}
[Category("Behavior"),
Browsable(true)]
public int Step
{
get
{
return (this.ViewState["Step"] != null ?
(int)this.ViewState["Step"]
: 1);
}
set
{
if(value > 0)
this.ViewState["Step"] = value;
}
}
[Category("Behavior"),
Browsable(true)]
public int Value
{
get
{
int[] vals = this.Values;
if (vals.Length < 1)
{
return this.Minimum;
}
return vals[0];
}
set
{
this.Values = new int[1] { value };
}
}
[Category("Behavior"),
Browsable(true),
TypeConverter(typeof(JQuerySliderValuesStringConverter)) ]
public int[] Values
{
get
{
return ConvertValuesToArray(_values);
}
set
{
if (!_initialized)
{
this._values = ConvertValueArrayToString(value);
}
else
{
this._values = ConvertValueArrayToString(value);
OnSelectedValuesChanged(new EventArgs());
}
}
}
[Category("Appearance"),
Browsable(true)]
public override string CssClass
{
get
{
return (this.ViewState["CssClass"] != null ?
this.ViewState["CssClass"].ToString()
: string.Empty);
}
set
{
this.ViewState["CssClass"] = value;
}
}
[Browsable(false)]
public string ValuesAsString
{
get
{
return ConvertValueArrayToString(this.Values);
}
}
[Category("Behavior"),
Browsable(true)]
public JQuerySliderOrientation Orientation
{
get
{
return (this.ViewState["Orientation"] != null ?
(JQuerySliderOrientation)this.ViewState["Orientation"]
: JQuerySliderOrientation.Horizontal);
}
set
{
this.ViewState["Orientation"] = value;
}
}
[Category("Behavior"),
Browsable(true)]
public string OnClientSelectedValuesChanged
{
get
{
return (this.ViewState["OnClientSelectedValuesChanged"] != null ?
this.ViewState["OnClientSelectedValuesChanged"].ToString()
: null);
}
set
{
this.ViewState["OnClientSelectedValuesChanged"] = value;
}
}
private void OnSelectedValuesChanged(EventArgs eventArgs)
{
if (SelectedValuesChanged != null)
SelectedValuesChanged(this, eventArgs);
}
internal static string ConvertValueArrayToString(int[] values)
{
StringBuilder sb = new StringBuilder();
foreach (int val in values)
{
if (sb.Length != 0)
sb.Append(",");
sb.Append(val);
}
return sb.ToString();
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.EnsureID();
this.Page.RegisterRequiresControlState(this);
ClientScriptProxy p = ClientScriptProxy.Current;
JQueryUtil.RegisterRequiredResources(p, this);
#if DEBUG
p.RegisterClientScriptInclude(this, WebResources.JQUERY_JAVASCRIPT_UI_SLIDER, false);
#endif
if (this.Page.IsPostBack)
{
this.Values = ConvertValuesToArray(this.Page.Request.Form[ClientValuesControlId]);
}
this._initialized = true;
}
internal static int[] ConvertValuesToArray(string values)
{
string[] vals = values.Split(new char[1]{','}, StringSplitOptions.RemoveEmptyEntries);
List<int> intVals = new List<int>();
foreach (string val in vals)
{
int intVal = 0;
if (int.TryParse(val, out intVal))
intVals.Add(intVal);
}
return intVals.ToArray();
}
protected override void OnPreRender(EventArgs e)
{
ClientScriptProxy p = ClientScriptProxy.Current;
p.RegisterHiddenField(this, ClientValuesControlId, _values);
string strSlideChanged = ClientJQueryControlId + "_SlideChanged";
StringBuilder sbStartup = new StringBuilder();
sbStartup.Append("var ");
sbStartup.Append(ClientJQueryControlId);
sbStartup.Append(" = jQuery('#");
sbStartup.Append(this.ClientID);
sbStartup.AppendLine("');");
sbStartup.Append("var ");
sbStartup.Append(ClientValuesControlId);
sbStartup.Append(" = document.getElementById('");
sbStartup.Append(ClientValuesControlId);
sbStartup.AppendLine("');");
sbStartup.Append("$(window).bind('load', ");
sbStartup.Append("Init_");
sbStartup.Append(ClientJQueryControlId);
sbStartup.AppendLine(");");
sbStartup.Append("function Init_");
sbStartup.Append(ClientJQueryControlId);
sbStartup.AppendLine("(){");
sbStartup.Append(ClientJQueryControlId);
sbStartup.AppendLine(".slider({ ");
sbStartup.Append("animate:");
sbStartup.AppendLine(this.Animate.ToString().ToLower());
sbStartup.Append(",max:");
sbStartup.AppendLine(this.Maximum.ToString().ToLower());
sbStartup.Append(",min:");
sbStartup.AppendLine(this.Minimum.ToString().ToLower());
sbStartup.Append(",step:");
sbStartup.AppendLine(this.Step.ToString());
sbStartup.Append(",orientation:'");
sbStartup.Append(this.Orientation.ToString().ToLower());
sbStartup.AppendLine("'");
sbStartup.Append(", values: [");
sbStartup.Append(_values);
sbStartup.AppendLine("]");
sbStartup.AppendLine("});");
sbStartup.Append(ClientJQueryControlId);
sbStartup.Append(".bind('slidechange', function (event, ui){");
sbStartup.Append(strSlideChanged);
sbStartup.AppendLine("(event, ui);});");
sbStartup.AppendLine("}");
sbStartup.Append("function ");
sbStartup.Append(strSlideChanged);
sbStartup.AppendLine("(event, ui){");
sbStartup.Append(@"
var strValues = '';
if(ui.values != null){
for(var i = 0; i < ui.values.length; i++){
if(i != 0)
strValues += ',';
strValues += ui.values[i];
}
}
");
sbStartup.Append(ClientValuesControlId);
sbStartup.AppendLine(".value = strValues;");
if(!string.IsNullOrEmpty(this.OnClientSelectedValuesChanged))
{
sbStartup.Append(this.OnClientSelectedValuesChanged);
sbStartup.AppendLine("(event, ui);");
}
sbStartup.AppendLine("}");
p.RegisterStartupScript(this.Page, typeof(WebResources), "_jsStartup__" + this.ClientID, sbStartup.ToString(), true);
base.OnPreRender(e);
}
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
if (this.DesignMode)
{
string cssClass = string.Empty;
if (!string.IsNullOrEmpty(this.CssClass))
cssClass = this.CssClass;
writer.AddAttribute(HtmlTextWriterAttribute.Class,
string.Format(
"{0} ui-slider ui-slider-{1} ui-widget ui-widget-content ui-corner-all",
cssClass,
this.Orientation.ToString().ToLower()));
writer.AddAttribute(DesignerRegion.DesignerRegionAttributeName, "0");
}
base.AddAttributesToRender(writer);
}
public class JQuerySliderValuesStringConverter : StringConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
string strValue = (string)value;
return JQuerySlider.ConvertValuesToArray(strValue);
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (value is int[])
{
return JQuerySlider.ConvertValueArrayToString((int[])value);
}
return base.ConvertTo(context, culture, value, destinationType);
}
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}
}
}
}