Message(this, "(optional) Enter the order of importance that you want the departments shown in."); });
$("#imageUrl").focus(function() { ShowMessage(this, "The relative web path of an image you want to be shown with products in this department."); });
$("#description").focus(function() { ShowMessage(this, "Enter a short description of the department to display to your users."); });
function ValidateTitle() {
return VerifyRequiredField("#title", "required");
}
function ValidateImageUrl() {
return VerifyRequiredField("#imageUrl", "required");
}
function ValidateDescription() {
return VerifyRequiredField("#description", "required");
}
function ValidateDepartment() {
var validTitle = ValidateTitle();
var validImage = ValidateImageUrl();
var validDescription = ValidateDescription();
return validTitle && validImage && validDescription;
}
$("form.department-create").validate(ValidateDepartment);
Tương tự thì tệp manage-product được sử dụng để đảm bảo các trường thông tin trong form tạo sản phẩm được điền vào đúng theo yêu cầu ..
/************************************************************************************ Product
***********************************************************************************/
$("#title").focus(function() { ShowMessage(this, "Enter your product name here."); });
$("#sku").focus(function() { ShowMessage(this, "Enter your SKU number here."); });
$("#unitPrice").focus(function() { ShowMessage(this, "Enter the unit price of this product."); });
$("#discountPercentage").focus(function() { ShowMessage(this, "Enter the percent off you want to give for this product."); });
$("#unitsInStock").focus(function() { ShowMessage(this, "Total number of units of this product you have in stock."); });
$("#smallImageURL").focus(function() { ShowMessage(this, "The url to the thumbnail for this product."); });
$("#fullImageURL").focus(function() { ShowMessage(this, "The url to full sized image of this product."); });
function ValidateTitle() {
return VerifyRequiredField("#title", "required");
}
function ValidateDescription() {
return VerifyRequiredField("#description", "required");
}
function ValidateProduct() {
return ValidateTitle()
&& ValidateDescription();
}
$("form.product-create").validate(ValidateProduct);
/***********************************************************************************
* Rich Text Editor
***********************************************************************************/
var bodyEditor;
$(document).ready(function() {
bodyEditor = new tinymce.Editor("description", __editorConfig);
bodyEditor.onChange.add(function(ed) { bodyEditor.save(); });
bodyEditor.onClick.add(function(ed) { ShowMessage("#description", "Enter the description of your product here."); });
bodyEditor.render();
});
// clears the message from the description when another input gets focus
$(":input")
.focus(function() { HideMessage("#description"); })
.blur(function() { HideMessage("#description"); });
Trong tệp commerece.js có các đoạn mã lệnh cho cả quản lí gian hàng, quản lí sản phẩm ,…
Đoạn code thực hiện xóa gian hàng không tạo ra việc Post back toàn bộ:
$(".delete-department-button").click(function() {
var departmentId = $(this).attr("meta:id");
$.post(
"/Commerce/DeleteDepartment",
{ id: departmentId },
function(data) {
$("#department-" + data.object.id).remove();
$("#admin-" + data.object.id).remove();
$("#spacer-" + data.object.id).remove();
},
"json"
);
return false;
});
Đoạn code thực hiện việc xóa sản phẩm khỏi gian hàng không tạo ra việc postback toàn bộ:
$(".delete-product-button").click(function () {
var productID = $(this).attr("meta:id");
$.post(
"/Commerce/DeleteProduct",
{ id: productID },
function (data) {
$("#product-" + data.object.id).remove();
$("#admin-" + data.object.id).remove();
$("#spacer-" + data.object.id).remove();
},
"json"
);
return false;
});
Đoạn code thực hiện việc các phương thức ứng với cách thức vận chuyển (như xóa cách thức vận chuyển, thêm cách thức vận chuyển ..) mà không tạo ra Post back toàn bộ:
$(".delete-shipping-method-button").live("click", function() {
var shippingMethodId = $(this).attr("meta:id");
$.post(
"/Commerce/DeleteShipping",
{ id: shippingMethodId },
function(data) {
$("#shipping-method-" + data.object.id).remove();
},
"json"
);
return false;
});
$("#add-shipping-method-button").click(function() {
var title = $("#title").val();
var price = $("#price").val();
$.post(
"/Commerce/CreateShipping",
{ title: title, price: price },
function(data) {
var html = '';
html += '' + title + '';
html += '' + price + '';
html += '';
html += '';
$("#shipping-table tbody").append(html);
$("#title").val("");
$("#price").val("");
},
"json"
);
return false;
});
Đoạn code thực hiện việc xóa sản phẩm khỏi giỏ hàng
$(".delete-item-button").click(function () {
var productId = $(this).attr("meta:id");
var form = $(this).parent("form");
$.post(
"/Commerce/DeleteShoppingCartItem",
{ id: productId },
function (data) {
$("#item-" + data.object.id).remove();
//Reload whole page
location.reload(form);
},
"json"
);
return false;
});
Cấu hình định tuyến
Định tuyến dành cho các view của người dùng có vai trò là storekeeper:
routes.MapRoute(
"CommerceManageStore",
"storekeeper/store",
new { controller = "Commerce", action = "ManageStore" }
);
routes.MapRoute(
"CommerceManageDepartments",
"storekeeper/store/departments",
new { controller = "Commerce", action = "ManageDepartments" }
);
routes.MapRoute(
"CommerceCreateDepartment",
"storekeeper/store/departments/create",
new { controller = "Commerce", action = "CreateDepartment" }
);
routes.MapRoute(
"CommerceEditDepartment",
"storekeeper/store/departments/edit/{departmentId}",
new { controller = "Commerce", action = "EditDepartment", departmentId = (int?)null }
);
routes.MapRoute(
"CommerceManageProducts",
"storekeeper/store/products",
new { controller = "Commerce", action = "ManageProducts" }
);
routes.MapRoute(
"CommerceCreateProduct",
"storekeeper/store/products/create",
new { controller = "Commerce", action = "CreateProduct" }
);
routes.MapRoute(
"CommerceEditProduct",
"storekeeper/store/products/edit/{productId}",
new { controller = "Commerce", action = "EditProduct", productId = (int?)null }
);
routes.MapRoute(
"CommerceManageOrders",
"storekeeper/store/orders",
new { controller = "Commerce", action = "ManageOrders" }
);
routes.MapRoute(
"CommerceOrderDetail",
"storekeeper/store/orders/{orderId}",
new { controller = "Commerce", action = "OrderDetail", orderId = (int?)null }
);
routes.MapRoute(
"CommerceManageShipping",
"storekeeper/store/shipping",
new { controller = "Commerce", action = "ManageShipping" }
);
Định tuyến dành cho những người dùng còn lại:
routes.MapRoute(
"CommerceIndex",
"",
new { controller = "Commerce", action = "Index" }
);
routes.MapRoute(
"CommerceDepartment",
"store/departments/{departmentId}",
new { controller = "Commerce", action = "ViewDepartment", departmentId = (int?)null }
);
routes.MapRoute(
"CommerceProduct",
"store/products/{productId}",
new { controller = "Commerce", action = "ViewProduct", productId = (int?)null }
);
routes.MapRoute(
"CommerceCart",
"store/cart",
new { controller = "Commerce", action = "ViewShoppingCart" }
);
routes.MapRoute(
"CommerceCompleted",
"store/order/completed",
new { controller = "Commerce", action = "CompleteOrder" }
);
MODULE GỬI THƯ
Tổng quan về module
Hệ thống luôn có những nội dung cập nhật mới như bài báo , diễn đàn, thông tin sản phẩm mới … để tạo sự chú ý cho những người dùng là khách hàng thì hệ thống có module gửi thư thông báo khách hàng biết có những thông tin mới đó để rồi khách hàng sẽ quay trở lại sử dụng hệ thống trong trường hợp khách hàng đăng kí nhận thư từ hệ thống.
Các vấn đề cần quan tâm khi xây dựng module:
Để lưu trữ thông tin đăng kí nhận thư của người dùng ta chỉ cần lưu các thông tin như địa chỉ thư điện tử của người dùng, tên, họ, định dạng thư nhận. Tất cả các thông tin này có trong các bảng của module hồ sơ và thành viên ta hoàn toàn có thể tận dụng.
Việc tạo và gửi thư điện tử của người dùng với vai trò là nhà quản trị có thể được xây dựng sử dụng namespace System.Net.Mail (namespace này được định nghĩa trong thư viện System.dll) . Các lớp chính cho việc tạo và gửi thư là lớp MailMessage, và lớp SmtpClient cung cấp các phương thức tạo và gửi thư bằng việc kết nối với máy chủ SMTP đã được cấu hình.
Với lớp MailMessage ta có thể tạo toàn bộ thông tin đầy đủ của một thư điện tử như sau:
// create the message
MailMessage mail = new MailMessage();
// set the sender's address and display name
mail.From = new MailAddress("
[email protected]", "Loc Dang");
// add a first recipient by specifying only her address
mail.To.Add("
[email protected]");
// add a second recipient by specifying his address and display name
mail.To.Add(new MailAddress("
[email protected]", "Dan nguyen"));
// add a third recipient, but to the CC field this time
mail.CC.Add("
[email protected]");
// set the mail's subject and HTML body
mail.Subject = "Sample Mail";
mail.Body = "Hello, my friend!How are you?";
mail.IsBodyHtml = true;
// set the mail’s priority to high
mail.Priority = MailPriority.High;
// add a couple of attachments
mail.Attachments.Add(
new Attachment(@"c:\demo.zip", MediaTypeNames.Application.Octet));
mail.Attachments.Add(
new Attachment(@"c:\report.xls", MediaTypeNames.Application.Octet));
Khi đối tượng MailMessage đã được tạo ta có thể gửi nó bằng phương thức Send của lớp SmtpClient.
SmtpClient smtpClient = new SmtpClient();
smtpClient.Send(mail);
Trước khi có thể gọi phương thức Send ta cần thiết lập các thông tin cấu hình cho hệ thống để phương thức này có thể thực hiện được như địa chỉ của máy chủ SMTP (thuộc tính SmtpClient Host) , cổng (thuộc tính port) và giấy chứng thực của máy chủ này (thuộc tính credentials) , kết nối được mã hóa với SSL (thuộc tính EnableSsl) và thời gian duy trì từ lúc bắt đầu cho tới khi kết thúc của việc gửi thư ( thuộc tính TimeOut , giá trị mặc định là 100 giây) . Một thuộc tính quan trọng là DeliveryMethod (đây là thuộc tính liệt kê của kiểu dữ liệu SmtpDeliveryMethod. Nó có thể nhận một trong các giá trị sau:
Network: Thư được gửi thông qua kết nối trực tiếp tới một máy chủ Smtp cụ thể
PickupDirectoryFromIs: Thư điện tử này được chuẩn bị và tệp thư này được lưu vào thư mục mặc định là :\Inetpub\mailroot\Queue. IIS sẽ lấy thư này từ hàng đợi thư để gửi.
SpecifedPickupDirectory: Các tệp EML với thư điện tử sẽ được gửi được lưu vào thư mục được chỉ định cho thuộc tính này của đối tượng SmtpClient. Thiết lập này sẽ hữu ích khi ta có một ứng dụng ngoài (không phải IIS) xử lí việc chọn thư và gửi
Cấu hình phần gửi thư của hệ thống thương mại trực tuyến
Vấn đề thời gian trong xử lí gửi thư có thể là rất lâu khiến người dùng có thể nghĩ hệ thống có lỗi. Việc gửi thư tới hàng ngàn khách hàng đăng kí nhận thư (subscribers) thường phải mất hàng phút trong khi để xử lí một yêu cầu theo tiêu chuẩn chỉ nên trong vài giây.
Một giải pháp được đưa ra trong hệ thống đó là khi người dùng nhấn nút submit (tương đương với hành động gửi thư) thì ở phía máy chủ sẽ sinh ra một tiến trình xử lí nhiệm vụ gửi thư mất nhiều thời gian đó ở chế độ nền (backgroudn running mode) và chuyển hướng người dùng về trang quản lí thư . Và ở trang đó người dùng có thể thấy được trạng thái của tất cả các thư đã gửi trong đó có cả thư mới tạo gần nhất và đang được gửi .
Để tránh việc phải có một nút refresh ở trang quản lí thư đó để biết được trạng thái thư mới gửi gần nhất ta sẽ sử dụng JQuery để yêu cầu dư liệu từ lớp điều khiển việc gửi thư (newsletters controller class) và rồi tạo một đối tượng DOM đưa trực tiếp dữ liệu về tình trạng xử lí thư vừa gửi vào trang quản lí thư. Đoạn code javascript đó như sau:
$.ajax({
type: "GET",
url: "/Newsletter/UpdateStatus",
dataType: "html",
sucess: function (result) {
var domElement = $(result);
$("#Newsletter_Status_Table").replaceWith(domElement);
}
});
Tạo các luồng tiến trình chạy nền – đa tiến trình
Các luồng tiến trình chạy nền hay luồng phụ được sử dụng để xử lí các nhiệm vụ cần nhiều thời gian mà không ảnh hưởng tới tiến trình chính.
Với ASP.NET ta có thể tạo 250 tiến trình chạy cùng một thời điểm trên một CPU Việc tạo mới một tiến trình không khó tuy nhiên ta phải quan tâm tới việc các tiến trình có thể truy cập cùng lúc tới cùng một không gian nhớ. Để tạo tiến trình ta cần namespace System.Threading trong thư viện mscorlib.dll . Dưới đây là một đoạn code tạo tiến trình phụ chạy nền
// create and start a background thread with some input parameters
object[] parameters = new object[]{"val1", 10, DateTime.Now};
ParameterizedThreadStart pts = new ParameterizedThreadStart(ExecuteTask);
Thread thread = new Thread(pts);
thread.Priority = ThreadPriority.BelowNormal;
thread.Start(parameters);
// main thread goes ahead immediately
…
// the method run asynchronously by the background thread
void ExecuteTask(object data)
{
// extract the parameters from the input data object
object[] parameters = (object[])data;
string val1 = (string)parameters[0];
int val2 = (int)parameters[1];
DateTime val3 = (DateTime)parameters[2];
// execute time consuming processing here
…
}
Sơ đồ chức năng
Hình 3.11 – Sơ đồ chức năng của module
Các bảng dữ liệu
Hình 3.12 – Bảng Newsletters
Với việc thông tin về người đăng kí nhận thư có thể sử dụng các bảng trong module hồ sơ và thành viên thì với module này chỉ cần một bảng Newsletters thể hiện nội dung thư gửi từ hệ thống, và các thông tin về thư đó.
Thiết kế lớp cấu hình cho module
Module này sử dụng thành phần nằm trong của tệp web.config . Để cấu hình cho module ta phải xem các thành phần cấu hình của // ở bảng sau
Thuộc tính SMTP
Mô tả
DeliveryMethod
Thiết lập thuộc tính này với “network” chỉ ra cho ứng dụng biết rằng có một mảy chủ thư điện tử bên ngoài sẽ được sử dụng để gửi thư điện tử. Để gửi được thư thì thành phần của cần được sử dụng gồm có Nơi chứa - Host,Cổng - Port,Tên người dùng - UserName,Mật khẩu- Password, và Chứng thực mặc định - DefaultCredentials.
From
Chỉ ra địa chỉ email sẽ được đặt trong mục “From” khi ứng dụng gửi thư đi
ConfigSource
Định nghĩa một nguồn ngoài cho các thiết lập cấu hình thư ví dụ như mail.config
Tiếp đến là cấu hình ///
Thuộc tính Network
Mô tả
DefaultCredentials
Một giá trị kiểu bool chỉ ra rằng các chứng thực của ứng dụng có được dùng hay không. Nếu giá trị đó là true thì UserName và Password là không cần
Host
Tên của máy chủ thư điện tử
UserName
Tên người dùng được sử dụng để đăng nhập vào máy chủ thư điện tử và gửi thư.
Password
Mật khẩu được sử dụng để đăng nhập vào máy chủ thư điện tử để gửi thư
Port
Cổng sẽ được sử dụng để gửi SMTP
Cuối cùng ta sẽ tạo thêm phần cấu hình cho module . Phần này thiết lập địa chỉ thư điện tử được sử dụng để gửi thư
Thuộc tính Newsletters
Mô tả
FromEmail
Địa chỉ thư điện tử thực sẽ xuất hiện trong mục “From” trong thư gửi đi ở phần đầu của thư
FromDisplayName
Tên hiển thị được sử dụng kèm với thuộc tính FromEmail
Model
Với module này ta sẽ chỉ cần model là lớp thực thể LINQ-to-SQL dưới đây:
Hình 3.13 – Sơ đồ Model Newsletter
Controller
Với các chức năng của module như sơ đồ chức năng ta có tương ứng các phương thức hành động của controller của module
Phương thức hành động
Bảo mật
Các tham số
Index
----
----
ManageNewsletters
Editor
----
UpdateStatus
Editor
----
CreateNewletters
Editor
string subject , string body
EditNewsletters
Editor
int? newsletterId, string subject, string body
RemoveNewsletter
Editor
int? newsletterId
View
Từ các phương thức hành động trong phần controller ta cũng có các view dành cho tương ứng . Dưới đây là danh sách các view của module
Tên trang
Đặc tả
Đường dẫn ảo
Index.aspx
Trang này được sử dụng để đăng kí nhận thư từ hệ thống
newsletter
CreateNewsletter.aspx
Trang này cho phép người dùng với vai trò là editor tạo hoặc chỉnh sửa thư
editor/newsletter/create
editor/newsletter/edit/{newsletterId}
ManageNewsletter.aspx
Trang này liệt kê toàn bộ các thư đã gửi trước đó. Editor có thể nhấn vào thư và xem lại nội dung thư hoặc xóa thư. Trang được cập nhật sau vài giây xử dụng JQuery
editor/newsletter/remove/{newsletterId}
editor/newsletter
Cấu hình định tuyến
Định tuyến cho trang index của module:
routes.MapRoute(
"NewsletterIndex",
"newsletters",
new { controller = "Newsletter", action = "Index" }
);
Định tuyến cho các trang dành cho editor:
routes.MapRoute(
"NewsletterCreate",
"editor/newsletters/create",
new { controller = "Newsletter", action = "CreateNewsletter" }
);
routes.MapRoute(
"NewsletterEdit",
"editor/newsletters/edit/{newsletterId}",
new { controller = "Newsletter", action = "EditNewsletter", newsletterId = (int?)null },
new { newsletterId = "[0-9]+" }
);
routes.MapRoute(
"NewsletterRemove",
"editor/newsletters/remove/{newsletterId}",
new { controller = "Newsletter", action = "RemoveNewsletter", newsletterId = (int?)null },
new { newsletterId = "[0-9]+" }
);
routes.MapRoute(
"NewsletterManage",
"admin/newsletters",
new { controller = "Newsletter", action = "ManageNewsletters" }
);
MODULE LẤY Ý KIẾN KHÁCH HÀNG
Tổng quan về module
Module lấy ý kiến khách hàng gồm các câu hỏi đi kèm với mỗi câu hỏi là các lựa chọn mà khách hàng có thể chọn để trả lời câu hỏi đó.
Module được xây dựng vì những lí do như người quản lí hệ thống muốn nắm bắt thị hiếu khách hàng về nhiều vấn đề từ hệ thống cho đến các sản phẩm bán trong siêu thị …Ngoài ra module được xây dựng cũng đem lại cho khách hàng cảm giác họ là một phần của hệ thống và như vậy họ sẽ sử dụng hệ thống thường xuyên hơn.
Về mặt chức năng thì module sẽ cho người dùng xem các chưng cầu có trong hệ thống (polls) , cho ý kiến (vote) . Với người dùng có vai trò là editor có thể quản lí các chưng cầu (chuyển chưng cầu sang trạng thái đã lấy đủ ý kiến - archive, hiện hành, chỉnh sửa chưng cầu, xóa chưng cầu) , tạo chưng cầu mới
Sơ đồ chức năng
Hình 3.14 – Sơ đồ chức năng của module lấy ý kiến người dùng
Các bảng dữ liệu
Hình 3.15 – Sơ đồ mối quan hệ giữa 2 bảng DL của module lấy ý kiến người dùng
Với module này ta cần 2 bảng một bảng là bảng Polls chứa các câu hỏi lấy ý kiến và các thuộc tính của chúng như câu hỏi chưng cầu là hiện hành – current , hay đã lấy đủ ý kiến – archived…
Bảng thứ 2 là bảng PollOptions chứa các thông tin về những chọn lựa cho câu hỏi đặt ra để lấy ý kiến. Mỗi một chọn lựa – options tương ứng với một câu trả lời được hệ thống tạo sẵn cho người dùng.Quan hệ giữa 2 bảng này được tạo thông qua khóa ngoại PollID
Hình 3.16 – Sơ đồ thiết kế bảng PollOptions
Hình 3.17 – Sơ đồ thiết kế bảng Polls
Thiết kế lớp cấu hình cho module
Với module này cần thiết lập một số thông tin cấu hình như thiết lập thuộc tính archived hay public cho một chưng cầu … (khi thiết lập thuộc tính public hay archived cho poll, cho phép hay không cho phép vote nhiều lần ..)
Bảng dưới đây sẽ là bảng các thuộc tính thuộc lớp PollElement . Lớp này kế thừa từ lớp ConfigurationElement của framework .net mvc. Nó sẽ đọc các thiết lập của thành phần nằm trong phần thiết lập cầu hình của trong tệp
web.config
Thuộc tính SMTP
Mô tả
VotingLockInterval
Một số nguyên cho biết khi nào thì cookie dành cho phần vote của một người dùng cụ thể nào đó hết hiệu lực (tương ứng với số ngày ngăn ngừa việc vote lại)
VotingLockByCookie
Một giá trị kiểu bool chỉ ra rằng liệu cookie có được dùng hay không được dùng cho việc nhớ người dùng đã vote hay chưa
VotingLockByIP
Một giá trị kiểu bool cho biết liệu địa chỉ IP của người dùng có được giữ trong bộ nhớ để tránh việc một người với cùng 1 địa chỉ IP trong phiên hiện hành vote cho cùng một poll nhiều lần
ArchiveIsPublic
Một giá trị kiểu bool được dùng để cho biết liệu các poll đã được thiết lập archive có được xem bởi tất cả mọi người hay không
Model
Model của module này cũng thiết kế theo kiểu mẫu Provider Model của Microsoft như đã trình bày trong phần lựa chọn kiến trúc hệ thống. Có 2 lớp thực thể LINQ-to-SQL được tạo tự động là:
Hình 3.18 – Sơ đồ lớp PollOption và Poll
Lớp tĩnh PollQueries chứa tất cả các truy vấn cần thiết để lấy thông tin từ CSDL cụ thể nó cung cấp các phương thức mở rộng cho module này.
Hình 3.19 – Sơ đồ lớp PollQueries
Controller
Ứng với các chức năng của module ta có các phương thức hành động trong controller của module ở bảng dưới đây
Phương thức hành động
Bảo mật
Các tham số
Index
----
bool? archived, int page
ViewPoll
----
int id, string path
Vote
----
int optionId
ManagePolls
Editor
int page
CreatePoll
Editor
string question, bool? Current
RemovePoll
Editor
int? newsletterId
EditPoll
Editor
int pollId, string question, bool? current, bool?
Archived
AddOption
Editor
int pollId, string text
RemoveOption
Editor
int optionId
SetCurrent
Editor
int pollId
SetArchived
Editor
int pollId, bool archive
View
Dưới đây là các trang – view của module dành cho người dùng có vai trò editor và người dùng khác của hệ thống:
Tên trang
Đặc tả
Đường dẫn ảo
Index.aspx
Trang này được sử dụng để xem các poll ở các trạng thái như công khai (public) , đã lấy đủ (archived)
/polls
/polls/page{page}
/polls?archived=true
/polls/ page{page}?archived=true
CreatePoll.aspx
Trang này cho phép người dùng với vai trò là editor tạo hoặc chỉnh sửa poll
/editor/polls/create
/ editor /polls/edit/{pollId}
ManagePolls.aspx
Trang này liệt kê toàn bộ các poll có trong hệ thống. Editor có thể thêm, chỉnh sửa, xóa các lựa chọn của poll, thiết lập poll hiện hành (set current), và xem poll hiện hành
/ editor /polls
/ editor /polls/page{page}
RemovePoll.aspx
Trang này dùng thực hiện việc xóa poll khỏi hệ thống
/editor/polls/remove/{pollId}
Sử dụng javascript
Module này sử dụng 2 tệp javascript trong thư mục Content/script là tệp manage-poll.js :
/******************************************************************
* Manage
******************************************************************/
$(document).ready(function() {
$("#polls :input").hide("fast");
});
$(".set-current").click(function() {
var id = $(this).attr("meta:id");
$.post(
"/poll/setcurrent",
{ pollId: id },
function(data) {
var poll = $("#set-current-" + data.object.pollId);
poll.remove();
},
"json"
);
return false;
});
$(".set-archived").click(function() {
var id = $(this).attr("meta:id"),
archived = $(this).hasClass("archived");
$.post(
"/poll/setarchived",
{ pollId: id, archive: !archived },
function(data) {
var poll = $("#set-archived-" + data.object.pollId);
poll.removeClass("archived");
if (data.object.isArchived)
poll.addClass("archived");
poll.text(data.object.isArchived ? "Allow Voting" : "Archive");
},
"json"
);
return false;
});
/******************************************************************
* Polls
******************************************************************/
$("#question").focus(function() { ShowMessage(this, "Enter the question you would like to ask in the poll."); });
function ValidateQuestion() {
return VerifyRequiredField("#question", "required");
}
function ValidatePoll() {
return ValidateQuestion();
}
$("form.poll-create").validate(ValidatePoll);
function EditOption() {
var id = $(this).attr("meta:id"),
option = $("#option-" + id),
text = option.find(".text").text();
// hide all the childrend
option.children().hide();
var optionForm = $(" Update Cancel");
// update the form
optionForm.find(".update").click(function () {
var id = $(this).attr("meta:id"),
formText = $(this).prevAll(".edit-text").val();
$.post(
"/poll/editoption",
{ optionId: id, text: formText },
function (data) {
var comment = $("#option-" + data.object.optionId);
comment.children("form").remove();
comment.children(".text").text(data.object.text);
comment.children().show();
},
"json"
);
});
// cancel the update
optionForm.find(".cancel").click(function () {
$(this).parents(".option").children(":hidden").show();
$(this).parents("form").remove();
});
// add the form to the current comment
option.append(optionForm);
return false;
}
$(".edit-option-button").click(EditOption);
function DeleteOption () {
var id = $(this).attr("meta:id");
$.post(
"/poll/removeoption",
{ optionId: id },
function (data) {
$("#option-" + data.object.optionId).fadeOut("slow", function () { $(this).remove() });
},
"json"
);
return false;
}
$(".delete-option-button").click(DeleteOption);
function AddOptionSuccess(data) {
var optionItem = $("" + data.object.text + " Edit Delete");
op