// --------------------------- // Constructor // --------------------------- // CastleRater class constructor // This class constructor should be treated as private. This Rater object should be // instantiated using the Rater.Create method. function CastleRater(id, imageOnUrl, imageOffUrl, imageHoverUrl, maxValue, value) { // Assign default values for undefined or null parameters if( value == undefined || value == null ) value = 0; if( maxValue == undefined || maxValue == null ) maxValue = 5; // // Initialize default values for instance properties // // ID contains the client-side unique id of this control this.ID = id; // MaxValue: Get or Set the maximum value for this control this.MaxValue = maxValue; // Value: Get or Set the value for this control. this.Value = value; // ImageOn: name of the image used to represent the selected value this.ImageOn = imageOnUrl; // ImageOff: name of the image used to represent the available values to select this.ImageOff = imageOffUrl; // ImageHover: name of the image used to provide user feedback when hovering over the control this.ImageHover = imageHoverUrl; // AutoLock: (if true) will disable this control once a value has been selected (clicked). this.AutoLock = false; // IsEnabled returns a boolean value indicating if the user may use this control. ReadOnly. this.IsEnabled = true; // IsInitialized: returns a boolean value indicating if this rater control has been initialized. ReadOnly. this.IsInitialized = false; // Images: an Array containing an entry for each image in this control. this.Images = new Array(maxValue); // Container: provides a reference to the html object acting as the outer most container // for this control. This property is assigned a value during the Render method. this.Container = null; this.ValueControl = null; this.ValueControlID = this.ID + "_Value"; // Cache (pre-load) images new Image().src = this.ImageOn; new Image().src = this.ImageOff; new Image().src = this.ImageHover; } // --------------------------- // Class Properties // --------------------------- CastleRater.Items = Array(); // --------------------------- // Class Functions // --------------------------- // CastleRater.Create - class function // id: // imageOnUrl: // imageOffUrl: // imageOverUrl: // maxValue: // value: CastleRater.Create = function(id, imageOnUrl, imageOffUrl, imageHoverUrl, maxValue, value) { // Create new CastleRater object var obj = new CastleRater(id, imageOnUrl, imageOffUrl, imageHoverUrl, maxValue, value); // Add the new Rater object to the Class items array CastleRater.Items[obj.ID] = obj; // Return new Rater object return obj; } // CastleRater.CreateNETControl - class function // id: // imageOnUrl: // imageOffUrl: // imageOverUrl: // maxValue: // value: CastleRater.CreateNETControl = function(id, imageOnUrl, imageOffUrl, imageHoverUrl, maxValue, value) { // Create an instance of the Rater object. var rater = CastleRater.Create(id, imageOnUrl, imageOffUrl, imageHoverUrl, maxValue, value); // Initialize javascript object for use with the .NET control. rater.Initialize(); // Return new Rater object return rater; } // CastleRater.CreateJSControl - class function // id: // imageOnUrl: // imageOffUrl: // imageOverUrl: // maxValue: // value: CastleRater.CreateJSControl = function(id, imageOnUrl, imageOffUrl, imageHoverUrl, maxValue, value) { // Create an instance of the Rater object. var rater = CastleRater.Create(id, imageOnUrl, imageOffUrl, imageHoverUrl, maxValue, value); // Initialize javascript object for use with the .NET control. rater.Render(); // Return new Rater object return rater; } // Class function CastleRater.InitializeRater = function(rater) { for(i = 1; i <= rater.MaxValue; i++) { var imgID = rater.ID + "_img" + i; var img = document.getElementById(imgID); rater.Images[i] = img; } // Find the html tag representing this control and retain a reference to it rater.Container = document.getElementById(rater.ID); // this.Container.style.cursor = "hand"; // This is only valid for IE. Causes no problem for NS or Firefox. // Save the new value in the hidden input control var myItems = document.getElementsByName(rater.ValueControlID); rater.ValueControl = myItems[0]; rater.ValueControl.value = rater.Value; rater.IsInitialized = true; } // Class Function // source: image object calling this function. Usually "this". // raterID: ID of the CastleRater object. CastleRater.Refresh = function(source, raterID) { var rater = CastleRater.Items[raterID]; var value = rater.Value; for(var i = 1; i <= rater.MaxValue; i++) { if( value >= i ) rater.Images[i].src = rater.ImageOn; else rater.Images[i].src = rater.ImageOff; } } // CastleRater.ShowHover - class function // source: image object calling this function. Usually "this". // raterID: ID of the CastleRater object. CastleRater.Hover = function(source, raterID) { var rater = CastleRater.Items[raterID]; if( !rater.IsEnabled ) return; var value = source.getAttribute("value"); for(var i = 1; i <= rater.MaxValue; i++) { if( value >= i ) rater.Images[i].src = rater.ImageHover; else rater.Images[i].src = rater.ImageOff; } } // CastleRater.Click - class function // source: image object calling this function. Usually "this". // raterID: ID of the CastleRater object. CastleRater.Click = function(source, raterID) { var rater = CastleRater.Items[raterID]; if( !rater.IsEnabled ) return; // Get new value. rater.Value = source.getAttribute("value"); // Update the hidden input control with the new value. rater.ValueControl.value = rater.Value; // Repaint the control. CastleRater.Refresh(source, raterID); if( rater.AutoLock ) rater.Enable(false); } // CastleRater.Reset - class function // source: image object calling this function. Usually "this". // raterID: ID of the CastleRater object. CastleRater.Reset = function(source, raterID) { var rater = CastleRater.Items[raterID]; if( !rater.IsEnabled ) return; // Get new value. rater.Value = 0; // Update the hidden input control with the new value. rater.ValueControl.value = rater.Value; // Repaint the control. CastleRater.Refresh(source, raterID); } // --------------------------- // Instance Functions // --------------------------- // Instance function CastleRater.prototype.Initialize = function() { CastleRater.InitializeRater(this); } // Instance function CastleRater.prototype.Enable = function(enable) { this.Container.disabled = !enable; this.IsEnabled = enable; } // Instance function CastleRater.prototype.Visible = function(visible) { if( visible ) this.Container.style.visibility = "Visible"; else this.Container.style.visibility = "Hidden"; } // Instance function CastleRater.prototype.Render = function() { document.write(""); document.write(""); for(var i = 1; i <= this.MaxValue; i++) { // Use the correct image in order correctly reflect the current value for this Rater control. if( this.Value >= i ) imageName = this.ImageOn; else imageName = this.ImageOff; // Important Note: IE does NOT support dynamically setting html tag EVENT attributes // using javascript. However IE does support dynamically creating the html tags events // as long as the html tag is rendered to the document using the javascript // document.write method. // These examples do NOT work in IE: // this.Images[i].setAttribute("onclick", "CastleRater.Click(this, \"" + this.ID + "\");"); // or // this.Images[i].onclick = "CastleRater.Click(this, \"" + this.ID + "\");"; // Get the next available image index number var index = document.images.length; // Render the new img tag. Also, any tag events must be defined here to work in IE. var onclick = " onclick=\"CastleRater.Click(this, '" + this.ID + "');\" "; var onmouseover = " onmouseover=\"CastleRater.Hover(this, '" + this.ID + "');\" "; var onmouseout = " onmouseout=\"CastleRater.Refresh(this, '" + this.ID + "');\" "; var imgID = this.ID + "_img" + i; document.write(""); // Add a reference to the newly created img tag to our images collection this.Images[i] = document.images[index]; // Set the image properties. Note: IE requires html tag events to be defined // when the html tag is rendered, so they are defined with the tag. this.Images[i].src = imageName; this.Images[i].setAttribute("imageSrc", imageName); this.Images[i].setAttribute("imageHover", this.ImageHover); this.Images[i].setAttribute("value", i); this.Images[i].border = 0; } document.write(""); if( this.IsInitialized == false ) this.Initialize(); }