




if (typeof(disqus_iframe_css) == 'undefined') {
	disqus_iframe_css = '';
}
if (typeof(disqus_def_name) == 'undefined') {
	disqus_def_name = '';
}
if (typeof(disqus_def_email) == 'undefined') {
	disqus_def_email = '';
}
if (typeof(disqus_skip_auth) == 'undefined') {
	disqus_skip_auth = false;
}
if (typeof(disqus_default_text) == 'undefined') {
	disqus_default_text = 'Type your comment here.';
}

(function(){
	
	var ie = document.uniqueID
		&& document.compatMode
		&& !window.XMLHttpRequest
		&& document.execCommand ;

	try {
		if(!!ie) {
			document.execCommand("BackgroundImageCache", false, true);
		}
	} catch(e) {};
})();

var Dsq = new function() {
	this.container = document.getElementById('dsq-content');
	this.jsonData = {"reactions": [{"body": "New link: Kyle Brady: A Blog - How I Won a Copyfight http://tinyurl.com/nycqbp", "author_name": "splitbrain", "source_url": "http://www.backtype.com/search?q=http%3A//www.kyle-brady.com/2009/06/10/how-i-won-a-copyfight/", "id": 1846402, "get_service_url": "http://twitter.com/", "title": "", "url": "http://twitter.com/splitbrain/statuses/2598376999", "source": "backtype", "get_service_name": "twitter", "avatar_url": "http://s3.amazonaws.com/twitter_production/profile_images/24888262/andi_onwhite_normal.gif", "author_url": "", "date_created": "5 months ago", "retweets": [{"url": "http://twitter.com/splitbrain/status/2598376999", "author_name": "splitbrain"}]}, {"body": "@Sengupta Dude http://bit.ly/Frjaj\n?", "author_name": "anomit", "source_url": "http://www.ubervu.com/conversations/www.kyle-brady.com/2009/06/10/how-i-won-a-copyfight/", "id": 1846398, "get_service_url": "http://twitter.com/", "title": "@Sengupta Dude http://bit.ly/Frjaj\n?", "url": "http://twitter.com/anomit/status/2516446912", "source": "ubervu", "get_service_name": "twitter", "avatar_url": "http://s3.amazonaws.com/twitter_production/profile_images/59902783/4528972_normal.jpg", "author_url": "", "date_created": "5 months ago", "retweets": []}, {"body": "RE: @kylebradyblog Nice Blog...interesting \"CopyFight\" with the Professor...I am old school \"did not finish my PhD\" back\u2026 http://disq.us/fhf", "author_name": "enviroresearch", "source_url": "http://www.backtype.com/search?q=http%3A//www.kyle-brady.com/2009/06/10/how-i-won-a-copyfight/", "id": 1846403, "get_service_url": "http://twitter.com/", "title": "", "url": "http://twitter.com/enviroresearch/statuses/2184967126", "source": "backtype", "get_service_name": "twitter", "avatar_url": "http://s3.amazonaws.com/twitter_production/profile_images/215682772/kcEUomcklGUriU_Bruce_normal.jpg", "author_url": "", "date_created": "5 months ago", "retweets": []}, {"body": "Follow-up to Jun 12 post re: student who posted computer code-- read the student's narrative about this issue here:  http://bit.ly/98hGl", "author_name": "judicialdean", "source_url": "http://www.backtype.com/search?q=http%3A//www.kyle-brady.com/2009/06/10/how-i-won-a-copyfight/", "id": 1846404, "get_service_url": "http://twitter.com/", "title": "", "url": "http://twitter.com/judicialdean/statuses/2182965434", "source": "backtype", "get_service_name": "twitter", "avatar_url": "http://s3.amazonaws.com/twitter_production/profile_images/209989088/balance_normal.jpg", "author_url": "", "date_created": "5 months ago", "retweets": [{"url": "http://twitter.com/judicialdean/status/2182965434", "author_name": "judicialdean"}]}, {"body": "Conflict between prof and student over publishing class assignment/project source codes online  http://tr.im/oypY", "author_name": "vtcs", "source_url": "http://www.backtype.com/search?q=http%3A//www.kyle-brady.com/2009/06/10/how-i-won-a-copyfight/", "id": 1846405, "get_service_url": "http://twitter.com/", "title": "", "url": "http://twitter.com/vtcs/statuses/2179427084", "source": "backtype", "get_service_name": "twitter", "avatar_url": "http://s3.amazonaws.com/twitter_production/profile_images/66158819/pictures-037d73cc91234db2aa6452aac08d4055-large_normal.jpg", "author_url": "", "date_created": "5 months ago", "retweets": [{"url": "http://twitter.com/vtcs/status/2179427084", "author_name": "vtcs"}]}, {"body": "Great art. about stud wanting to post code from course online,prof's reaction. Via boingboing: http://bit.ly/4azCAI http://bit.ly/wG9eg", "author_name": "scmorgan", "source_url": "http://www.backtype.com/search?q=http%3A//www.kyle-brady.com/2009/06/10/how-i-won-a-copyfight/", "id": 1846406, "get_service_url": "http://twitter.com/", "title": "", "url": "http://twitter.com/scmorgan/statuses/2177772829", "source": "backtype", "get_service_name": "twitter", "avatar_url": "http://s3.amazonaws.com/twitter_production/profile_images/63379076/DSC_0032.JPG_normal.jpg", "author_url": "", "date_created": "5 months ago", "retweets": [{"url": "http://twitter.com/scmorgan/status/2177772829", "author_name": "scmorgan"}]}], "has_more_reactions": true, "users": {"zuhaib": {"username": "zuhaib", "tumblr": "", "display_name": "zuhaib", "url": "http://disqus.com/zuhaib/", "registered": true, "linkedin": "", "blog": "http://www.zuhaiblog.com", "remote_domain": null, "points": 1, "facebook": "", "avatar": "http://media.disqus.com/uploads/users/37/1235/avatar32.jpg", "delicious": "", "is_remote": false, "verified": true, "flickr": "zuhaib", "twitter": "", "remote_domain_name": ""}, "e8a0835e9f869c8c53304ba99e46b427": {"username": "Alex Gartrell", "tumblr": "", "display_name": "Alex Gartrell", "url": "http://disqus.com/guest/e8a0835e9f869c8c53304ba99e46b427/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "08a7b021977098f047802cd95a54b9fc": {"username": "trolley", "tumblr": "", "display_name": "trolley", "url": "http://disqus.com/guest/08a7b021977098f047802cd95a54b9fc/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "d818a1110c22caa41c17505a15c83ec0": {"username": "Jorge Reyes-Spindola", "tumblr": "", "display_name": "Jorge Reyes-Spindola", "url": "http://disqus.com/guest/d818a1110c22caa41c17505a15c83ec0/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "a2f078717bcc7fd84e495461e93b504e": {"username": "acadavid", "tumblr": "", "display_name": "acadavid", "url": "http://disqus.com/guest/a2f078717bcc7fd84e495461e93b504e/", "registered": false, "linkedin": "", "blog": "http://acadavid.info/", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "GregSJ": {"username": "GregSJ", "tumblr": "", "display_name": "GregSJ", "url": "http://disqus.com/GregSJ/", "registered": true, "linkedin": "", "blog": "http://www.runwiththelaw.com", "remote_domain": null, "points": 1, "facebook": "", "avatar": "http://media.disqus.com/uploads/users/36/3385/avatar32.jpg", "delicious": "", "is_remote": false, "verified": true, "flickr": "", "twitter": "", "remote_domain_name": ""}, "aa6ea3b1f7db6b36c57ea992e681b0dc": {"username": "Bryan", "tumblr": "", "display_name": "Bryan", "url": "http://disqus.com/guest/aa6ea3b1f7db6b36c57ea992e681b0dc/", "registered": false, "linkedin": "", "blog": "http://archalien.com/", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "Steve_R": {"username": "Steve_R", "tumblr": "", "display_name": "Steve R.", "url": "http://disqus.com/Steve_R/", "registered": true, "linkedin": "", "blog": "http://srynas.blogspot.com/", "remote_domain": null, "points": 20, "facebook": "", "avatar": "http://media.disqus.com/uploads/users/8/3576/avatar32.jpg", "delicious": "", "is_remote": false, "verified": true, "flickr": "", "twitter": "", "remote_domain_name": ""}, "67c5890959dffad8f3edc0ad29771641": {"username": "ForksNKnives", "tumblr": "", "display_name": "ForksNKnives", "url": "http://disqus.com/guest/67c5890959dffad8f3edc0ad29771641/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "cb5377d0606edbe9743433ddce59f97b": {"username": "A.P.", "tumblr": "", "display_name": "A.P.", "url": "http://disqus.com/guest/cb5377d0606edbe9743433ddce59f97b/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "22f33dbae649687e8e569f07f9a3a599": {"username": "Jikim", "tumblr": "", "display_name": "Jikim", "url": "http://disqus.com/guest/22f33dbae649687e8e569f07f9a3a599/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "facebook-34702744": {"username": "facebook-34702744", "tumblr": "", "display_name": "Kyle Thomas Wilson", "url": "http://disqus.com/facebook-34702744/", "registered": true, "linkedin": "", "blog": "http://www.facebook.com/people/Kyle-Thomas-Wilson/34702744", "remote_domain": 1, "points": 1, "facebook": "http://www.facebook.com/people/Kyle-Thomas-Wilson/34702744", "avatar": "http://media.disqus.com/uploads/users/38/2887/avatar32.jpg", "delicious": "", "is_remote": true, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": "Facebook"}, "6ae1d9643d0eda156c7ebeb342d04322": {"username": "Char", "tumblr": "", "display_name": "Char", "url": "http://disqus.com/guest/6ae1d9643d0eda156c7ebeb342d04322/", "registered": false, "linkedin": "", "blog": "http://www.psitutor.org/", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/uploads/anonusers/71/555/avatar32.jpg", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "twitter-37173188": {"username": "twitter-37173188", "tumblr": "", "display_name": "bruce j. edmonds III", "url": "http://disqus.com/twitter-37173188/", "registered": true, "linkedin": "", "blog": "http://twitter.com/enviroresearch", "remote_domain": 2, "points": 1, "facebook": "", "avatar": "http://media.disqus.com/uploads/users/38/7518/avatar32.jpg", "delicious": "", "is_remote": true, "verified": false, "flickr": "", "twitter": "http://twitter.com/enviroresearch", "remote_domain_name": "Twitter"}, "2b353f60884446e17960b6ae5c1b773a": {"username": "Andrew", "tumblr": "", "display_name": "Andrew", "url": "http://disqus.com/guest/2b353f60884446e17960b6ae5c1b773a/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "04ba362109d3862660d4b1b0b3f2d923": {"username": "Rob Williams", "tumblr": "", "display_name": "Rob Williams", "url": "http://disqus.com/guest/04ba362109d3862660d4b1b0b3f2d923/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "926aacbe453a711488887fac9e39c651": {"username": "ivo", "tumblr": "", "display_name": "ivo", "url": "http://disqus.com/guest/926aacbe453a711488887fac9e39c651/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "b6bb462cbf416a9f01effc0e12d61a93": {"username": "Kevin W. Gisi", "tumblr": "", "display_name": "Kevin W. Gisi", "url": "http://disqus.com/guest/b6bb462cbf416a9f01effc0e12d61a93/", "registered": false, "linkedin": "", "blog": "http://www.kevingisi.com/", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "3b2ea995c19e30264de7ceaae37f4b0c": {"username": "StudyPipe", "tumblr": "", "display_name": "StudyPipe", "url": "http://disqus.com/guest/3b2ea995c19e30264de7ceaae37f4b0c/", "registered": false, "linkedin": "", "blog": "http://www.studypipe.com/", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "cf611565f0b79abd0b3dc200ad867661": {"username": "Noah Kantrowitz", "tumblr": "", "display_name": "Noah Kantrowitz", "url": "http://disqus.com/guest/cf611565f0b79abd0b3dc200ad867661/", "registered": false, "linkedin": "", "blog": "http://coderanger.net/", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "e63abd3d55f2c71ef5ee3a3f0c18489e": {"username": "M. Heer", "tumblr": "", "display_name": "M. Heer", "url": "http://disqus.com/guest/e63abd3d55f2c71ef5ee3a3f0c18489e/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "50aaf9a0ff8f035fb623b9c158de4b1a": {"username": "Donkey Face", "tumblr": "", "display_name": "Donkey Face", "url": "http://disqus.com/guest/50aaf9a0ff8f035fb623b9c158de4b1a/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "e4b8032efbe7fd5b205187abf97abb6c": {"username": "Bryce", "tumblr": "", "display_name": "Bryce", "url": "http://disqus.com/guest/e4b8032efbe7fd5b205187abf97abb6c/", "registered": false, "linkedin": "", "blog": "http://neonderbycars.blogspot.com/", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "f48f6ce2d0943a821b93dfd7050e8fc6": {"username": "js", "tumblr": "", "display_name": "js", "url": "http://disqus.com/guest/f48f6ce2d0943a821b93dfd7050e8fc6/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "twitter-9949572": {"username": "twitter-9949572", "tumblr": "", "display_name": "Steve Elmore", "url": "http://disqus.com/twitter-9949572/", "registered": true, "linkedin": "", "blog": "http://twitter.com/DocAustin", "remote_domain": 2, "points": 1, "facebook": "", "avatar": "http://media.disqus.com/uploads/users/38/2724/avatar32.jpg", "delicious": "", "is_remote": true, "verified": false, "flickr": "", "twitter": "http://twitter.com/DocAustin", "remote_domain_name": "Twitter"}, "bradyk": {"username": "bradyk", "tumblr": "", "display_name": "Kyle Brady", "url": "http://disqus.com/bradyk/", "registered": true, "linkedin": "", "blog": "http://www.kyle-brady.com", "remote_domain": null, "points": 13, "facebook": "", "avatar": "http://media.disqus.com/uploads/users/5/3891/avatar32.jpg", "delicious": "", "is_remote": false, "verified": true, "flickr": "", "twitter": "", "remote_domain_name": ""}, "d042f45110c7fbd594abb25a4899e35a": {"username": "alex", "tumblr": "", "display_name": "alex", "url": "http://disqus.com/guest/d042f45110c7fbd594abb25a4899e35a/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "3ddc4450a26f05603415697338da9444": {"username": "Markos Nt. Apostolidis", "tumblr": "", "display_name": "Markos Nt. Apostolidis", "url": "http://disqus.com/guest/3ddc4450a26f05603415697338da9444/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "813c67a459fb2bff3b0be0680b21d2b6": {"username": "student_a", "tumblr": "", "display_name": "student_a", "url": "http://disqus.com/guest/813c67a459fb2bff3b0be0680b21d2b6/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "0e14a9902bed58b468be10240f965422": {"username": "Jonthecomposer", "tumblr": "", "display_name": "Jonthecomposer", "url": "http://disqus.com/guest/0e14a9902bed58b468be10240f965422/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "13a7d788f0f36744b238fd0d1b68c9cc": {"username": "spiralofhope", "tumblr": "", "display_name": "spiralofhope", "url": "http://disqus.com/guest/13a7d788f0f36744b238fd0d1b68c9cc/", "registered": false, "linkedin": "", "blog": "http://spiralofhope.com/", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "6db3006d6765a1c04b60620212633e9b": {"username": "kjinx", "tumblr": "", "display_name": "kjinx", "url": "http://disqus.com/guest/6db3006d6765a1c04b60620212633e9b/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "8fc9298dcb8acc9a0411623cafd5da50": {"username": "MoFoQ", "tumblr": "", "display_name": "MoFoQ", "url": "http://disqus.com/guest/8fc9298dcb8acc9a0411623cafd5da50/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "uknownstudent": {"username": "uknownstudent", "tumblr": "", "display_name": "uknownstudent", "url": "http://disqus.com/uknownstudent/", "registered": true, "linkedin": "", "blog": "", "remote_domain": null, "points": 2, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": true, "flickr": "", "twitter": "", "remote_domain_name": ""}, "twitter-18013831": {"username": "twitter-18013831", "tumblr": "", "display_name": "Andrew Spittle", "url": "http://disqus.com/twitter-18013831/", "registered": true, "linkedin": "", "blog": "http://twitter.com/andrewspittle", "remote_domain": 2, "points": 1, "facebook": "", "avatar": "http://media.disqus.com/uploads/users/37/8795/avatar32.jpg", "delicious": "", "is_remote": true, "verified": false, "flickr": "", "twitter": "http://twitter.com/andrewspittle", "remote_domain_name": "Twitter"}, "1747edb9566db061b88b4a5b5d76de8c": {"username": "Bob", "tumblr": "", "display_name": "Bob", "url": "http://disqus.com/guest/1747edb9566db061b88b4a5b5d76de8c/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "50c292ce2cfb503644c011e057e7c0cd": {"username": "Paul Gregoire", "tumblr": "", "display_name": "Paul Gregoire", "url": "http://disqus.com/guest/50c292ce2cfb503644c011e057e7c0cd/", "registered": false, "linkedin": "", "blog": "http://gregoire.org/", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "c58d9ddf15fd630e851770489a43f6fd": {"username": "Joe", "tumblr": "", "display_name": "Joe", "url": "http://disqus.com/guest/c58d9ddf15fd630e851770489a43f6fd/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "4ff4f38c0f7272a8c30edf2d005e9b6d": {"username": "SJKim", "tumblr": "", "display_name": "SJKim", "url": "http://disqus.com/guest/4ff4f38c0f7272a8c30edf2d005e9b6d/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/images/noavatar32.png", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "61f4f65bb54c2a34c37f94259be2a488": {"username": "Meh", "tumblr": "", "display_name": "Meh", "url": "http://disqus.com/guest/61f4f65bb54c2a34c37f94259be2a488/", "registered": false, "linkedin": "", "blog": "", "remote_domain": null, "points": null, "facebook": "", "avatar": "http://media.disqus.com/uploads/anonusers/6031/avatar32.jpg", "delicious": "", "is_remote": false, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": ""}, "facebook-709657736": {"username": "facebook-709657736", "tumblr": "", "display_name": "Desiree Cox", "url": "http://disqus.com/facebook-709657736/", "registered": true, "linkedin": "", "blog": "http://www.facebook.com/people/Desiree-Cox/709657736", "remote_domain": 1, "points": 1, "facebook": "http://www.facebook.com/people/Desiree-Cox/709657736", "avatar": "http://media.disqus.com/uploads/users/21/2153/avatar32.jpg", "delicious": "", "is_remote": true, "verified": false, "flickr": "", "twitter": "", "remote_domain_name": "Facebook"}}, "forum": {"use_media": true, "name": "Kyle Brady: Blog", "streaming_realtime": false, "url": "kyle-brady", "allow_anon_post": true, "reactions_enabled": true, "reply_position": 0, "show_avatar": true, "allow_anon_votes": false, "disqus_auth_disabled": false}, "realtime_enabled": false, "request": {"username": "", "is_global_moderator": false, "sharing": {}, "sort": 4, "forum": "kyle-brady", "is_initial_load": true, "is_authenticated": false, "timestamp": "2009-12-10_13:45:59", "remote_domain": "", "page": 1, "is_moderator": false, "display_username": "", "points": null, "subscribe_on_post": 2, "moderator_can_edit": false, "is_remote": false, "is_verified": false, "missing_perm": null}, "realtime_paused": false, "posts": {"10839808": {"up_voted": false, "ip": "", "has_replies": true, "message": "This is obviously an act of academic dishonesty. From section 1.1.7, you may not aid others in cheating. Whether or not that was your intention is not at issue. You know---in fact, it seems to have been part of your motivation for posting your solutions---that professors reuse assignments. Thus you also know that unless the professor discovers your solutions and changes his assignments, your solutions *will* aid future students in cheating. What you have done is to blackmail a professor into teaching the way *you* think he should teach, and then to claim that you have been treated unfairly. Professors have a hard enough job without having to deal with issues like this; if you tried to blackmail me, I would respond explosively too.<br><br>*You* should be ashamed.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_11:33:56", "killed": false, "user_key": "c58d9ddf15fd630e851770489a43f6fd", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 6, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10844032": {"up_voted": false, "ip": "", "has_replies": true, "message": "I am a Professor of computer science from a private university in Greece, EU (cooperating, as a franchise, with a British university) and I do not allow my students to post their answers to homework questions online or otherwise make their code available to anyone else. The code written for the purposes of education is the intellectual property of the university or the professor (depending on who wrote the initial homework questions). The reason is simple: if students were allowed to post their code, we (the professors) should change our questions for each new class, something we have no intention of doing as it is time-consuming and easily avoided by treating the students' answers as our intellectual property.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_14:54:06", "killed": false, "user_key": "3ddc4450a26f05603415697338da9444", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 4, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10773122": {"up_voted": false, "ip": "", "has_replies": true, "message": "All this tussle for some basic algorithm recreations? I bet you think you're the man now. You need to learn to respect your elders, son.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_21:39:38", "killed": false, "user_key": "813c67a459fb2bff3b0be0680b21d2b6", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10947843": {"up_voted": false, "ip": "", "has_replies": false, "message": "Well said, Kjnx. As someone who has taught graduate classes I can tell you that it can be a lot of work to create new assignments every semester, so from that point I can see why the professor would not want the results posted. However, the professor in question should have just ask nicely, been honest, and explained his reasoning. But instead of trying to bully his student under a serious threat of academic integrity. This action should be noted in the professors record. I don't mean to say the professor should be disciplined for doing this once, but it is a serious breach of conduct if this is a normal pattern of behavior.", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-15_17:23:16", "killed": false, "user_key": "1747edb9566db061b88b4a5b5d76de8c", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10737061, "depth": 1, "points": 0, "author_is_creator": false, "is_realtime": false}, "10804228": {"up_voted": false, "ip": "", "has_replies": false, "message": "Poor Dr. Beeson. If he hadn't responded in the first place, he wouldn't have helped make his test answers so famous.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-12_12:43:05", "killed": false, "user_key": "facebook-709657736", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10768262": {"up_voted": false, "ip": "", "has_replies": true, "message": "Dear Kyle:<br>One thing that I believe really helped your case was that you were articulate and polite in all of your correspondence.  You stated your points clearly and concisely without accusations or name-calling. Would that everybody be as polite as you.  Congratulations on your victory.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_19:27:16", "killed": false, "user_key": "d818a1110c22caa41c17505a15c83ec0", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10773128": {"up_voted": false, "ip": "", "has_replies": false, "message": "True, and thanks.<br><br>However, I'm not always that polite.  When it comes to legal situations or other important issues, I am, but I can fly off the handle just as easily in other situations.<br><br>Just wanted to point out that if you look hard enough, you'll find I'm not always that polite ;-)<br><br>--Kyle", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_21:39:54", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10768262, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10843638": {"up_voted": false, "ip": "", "has_replies": true, "message": "Hey,<br><br>Good job but for the sake of not coming off as a ponce, learn to write in simple English and never brandish a thesaurus and dictionary like weapon in the future it just lessens the impact of your writing.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_14:32:28", "killed": false, "user_key": "61f4f65bb54c2a34c37f94259be2a488", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10790538": {"up_voted": false, "ip": "", "has_replies": false, "message": "Noted, thanks!<br><br>--Kyle", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-12_04:55:13", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10790473, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10845058": {"up_voted": false, "ip": "", "has_replies": true, "message": "Ah, but he's in Greece.<br><br>Not exactly known for being \"liberal\", is it?<br><br>--Kyle", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_15:42:36", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": 10844496, "depth": 2, "points": 0, "author_is_creator": true, "is_realtime": false}, "10736921": {"up_voted": false, "ip": "", "has_replies": false, "message": "Yes, if the goal was just to make code available for future employers, there were other options.<br><br>But this was also about me being able to do what I want with something I created... my property, my rights, my decision.<br><br>--Kyle", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_10:00:41", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10736505, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10881946": {"up_voted": false, "ip": "", "has_replies": true, "message": "It's physically impossible to prevent the professor from giving you a penalty for causing this trouble - he can just \"be in a bad mood\" every time he grades anything you do.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-14_06:28:39", "killed": false, "user_key": "926aacbe453a711488887fac9e39c651", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10764445": {"up_voted": false, "ip": "", "has_replies": false, "message": "Excellent!  Thank you for having the courage to act and then following through with it.  I especially thank you for making it public, because such struggles need to be known to establish precedents and to encourage others.<br><br>I also applaud Dr. Louden for his sensible, measured response and eventual follow-through.<br><br>Dr. Beeson should be ashamed, not because he held a different view, but because he actively, emotionally vilified you in the process.  Such behavior reflects very poorly on himself and his institution--that is NOT the academic spirit of inquiry and debate that should dominate such interactions.  Instead, such behavior is typical of an authoritarian police state.  It makes me think of the cops that recently tazed the 72-year-old grandmother or the tiny Chihuahua (and then shot it).", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_18:08:17", "killed": false, "user_key": "04ba362109d3862660d4b1b0b3f2d923", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10733089": {"up_voted": false, "ip": "", "has_replies": false, "message": "Thanks!<br><br>--Kyle", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_06:39:25", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10731959, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10737061": {"up_voted": false, "ip": "", "has_replies": true, "message": "Re: michael_dorfman -- \"...... All that was accomplished is that the professor now needs to spend time every year retooling all of the homework problems so students can't easily copy from the now web-published version of) last year's answers.\"<br><br>Which is precisely why the professor raised such a fuss in the first place. Having created these assignments once, he did not want to put in the \"extra?\" work to generate new ones (I speak here from experience having been a prof myself). It's just \"academic laziness\" disingenuously masquerading as concern for \"academic Integrity\". He might have approached the issue with the student by explaining his concern about having to redo the assignment (ie. \"just been honest\"), instead he attempted to bully the student with threats. The student stood his ground ... excellent .... and learning occurred, to wit: \"Do not let authority figures bully you, remain respectful, but stick to your guns when you believe you are in the right.\" Could very well be a more valuable lesson than anything having to do with coding.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_10:05:14", "killed": false, "user_key": "6db3006d6765a1c04b60620212633e9b", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10844326": {"up_voted": false, "ip": "", "has_replies": false, "message": "Thanks.<br><br>I had two things going for me that probably didn't help... the first being that I have a Google PageRank and show up when you use the right keywords.  A more probably reason, however, is that a student found out about what I was doing, wasn't happy, and could have easily told Beeson.<br><br>But I know I'm not the only one ;-)  The others just weren't discovered.<br><br>--Kyle", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_15:11:55", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10843126, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10843178": {"up_voted": false, "ip": "", "has_replies": false, "message": "yea, I had Beeson too, not one of the most \"pleasant\" characters and I guess after this, can definitely be considered as one of the \"old dogs\" who doesn't understand the desire to post your own work for the public good.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_14:09:15", "killed": false, "user_key": "8fc9298dcb8acc9a0411623cafd5da50", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10744109": {"up_voted": false, "ip": "", "has_replies": false, "message": "Ok, just reading some more of these comments.  I can see that the principle of it is important - so good work.  I can understand the reasoning for sticking up for yourself.", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_13:19:32", "killed": false, "user_key": "3b2ea995c19e30264de7ceaae37f4b0c", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10744056, "depth": 1, "points": 0, "author_is_creator": false, "is_realtime": false}, "10879408": {"up_voted": false, "ip": "", "has_replies": true, "message": "I think I agree to an extent with Joe here. Dijkstra's algorithm and Binary Search Trees aren't going to change much from year to year, so I think it's unfair to call it lazy to reuse assignments. <br><br>Now, every year that the class is taught Beeson has two options. Make a minor modification to an assignment or completely rewrite it. If he opts to make a minor adjustment, then a student who has access to the previous years answers can simply tweak the source code to match the new behavior. They don't have to fully understand what they're doing, or why the algorithm works. They just need to figure out what part of the .java to hack and then they learn nothing from the assignment. <br><br>It seems reasonable to not want to have to rewrite assignments every year. The algorithms aren't changing year to year, and students aren't going to learn more from year 2010's version of the problem then they are 2009's. This is an intro to algorithms course, not a bleeding edge research course where the curriculum is going to change every year based on new research. The basic algorithms this year are going to be the same ones that are being used next year. <br><br>And then there's the question of how much you're actually helping people by posting your answers. For me, the actually having to figure out how to translate the psuedocode into real working code, and understanding the concept behind the algorithms were the useful skills. I don't believe that post your source code aids either. Learning to put down an algorithm from the psuedocode is something you learn through doing. Once you learn that skill you don't need the answers from someone else, because the answers are all right in the book. And in the case where I couldn't figure something out I went to Beeson's office hours and he was able to help me figure out what I was doing wrong. <br><br>It might be useful to other students who've taken the class to see another approach to the problem so they can see how others did it, but you can just send emails back and forth or talk about the problem in the CS club room to do that. Realistically, I doubt many people outside of the people taking the class are going to be very interested in your particular implementation of the Bellman-Ford algorithm, and the people who are taking the class would get more out of the assignment if they were to figure it out on their own. <br><br>I don't disagree that you have the right to post your solutions on the internet and be a smug jerk about it. You're in the right here, but you're still a smug jerk at the end of the day. If I were in your situation I would take down the answers. Not as matter of freedom to do what you want with your code, but as a courtesy.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-14_01:51:18", "killed": false, "user_key": "d042f45110c7fbd594abb25a4899e35a", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 2, "is_first_child": false, "email": "", "parent_post_id": 10869896, "depth": 2, "points": 0, "author_is_creator": false, "is_realtime": false}, "10844296": {"up_voted": false, "ip": "", "has_replies": false, "message": "Well,<br><br>I'm going to go ahead and guess you're a CS Prof. at SJSU trolling here.<br><br>And I'm not going to even counterpoint you, because your argument is baseless.<br><br>--Kyle", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_15:10:28", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": 10839808, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10731959": {"up_voted": false, "ip": "", "has_replies": true, "message": "I just posted over a Boing Boing, as someone who took CS146 and Dr. Beeson's class I give you a big pat on the back as well.  I thought about doing the same after the classes ended, some of the codes I thought I did well on or I thought had use outside the classroom but stopped because I did not want to be helping cheating.<br>But by putting the ground work you have opened up an avenue for those tho wish to post their code can and I think that is great.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_04:44:37", "killed": false, "user_key": "zuhaib", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "11034552": {"up_voted": false, "ip": "", "has_replies": true, "message": "Kyle, I heard about your blog from Cay Horstmanns post (<a href=\"http://weblogs.java.net/blog/cayhorstmann/archive/2009/06/my_department_i.html\" rel=\"nofollow\">http://weblogs.java.net/blog/cayhorstmann/archi...</a>) and I looked at your TicTacToe code. My honest opinion is that its ok for an early novice, but it will certainly not help you get a job. Most Engineers that I know would tear your short piece of code to bits. Lastly, I understand your professors point of view but he should not have threatened to fail you; that is complete bs. Good luck to you in the future.<br><br>Paul<br><a href=\"http://twitter.com/mondain\" rel=\"nofollow\">http://twitter.com/mondain</a>", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-17_02:41:33", "killed": false, "user_key": "50c292ce2cfb503644c011e057e7c0cd", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 5, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "11480225": {"up_voted": false, "ip": "", "has_replies": true, "message": "yea, and to a potential employer, the capacity to grow and learn is more valuable than an old dog who can't/won't learn new tricks.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-19_15:53:36", "killed": false, "user_key": "8fc9298dcb8acc9a0411623cafd5da50", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": 11034995, "depth": 3, "points": 0, "author_is_creator": false, "is_realtime": false}, "10768314": {"up_voted": false, "ip": "", "has_replies": false, "message": "Congrats on the victory.  Always good to see when common sense prevails.<br><br>BTW you made <a href=\"http://techdirt.com\" rel=\"nofollow\">techdirt.com</a> as well.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_19:29:20", "killed": false, "user_key": "GregSJ", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10880574": {"up_voted": false, "ip": "", "has_replies": false, "message": "Whatever.<br><br>I'm not being a smug jerk.  Just doing what I want with my property, as I'm allowed to.<br><br>I'm not taking down the answers... courtesy to who?  The Professor?<br><br>Please.  They're paid to work with students, and it's not really my problem if this means he feels he can't reuse his assignments each semester.<br><br>--Kyle", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-14_03:52:42", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": 10879408, "depth": 3, "points": 0, "author_is_creator": true, "is_realtime": false}, "11034688": {"up_voted": false, "ip": "", "has_replies": false, "message": "Hey Paul,<br><br>Well, I agree.  I had to take down the problem descriptions and things associated with them for the moment to prevent Beeson from having any valid claims on this...<br><br>But if they were up, it would have been obvious why this is kind of hacky code:  we received a handful of assignments at the beginning of the semester and had to solve them in a week (maybe two) or we'd be dropped from the class.  Along with the rest of the semester's activities, you can imagine why the code isn't that great ;-)  The implementation of the Google PageRank algorithm [ <a href=\"http://projects.kyle-brady.com/svn/filedetails.php?repname=sjsuProjects&path=%252Fcs146%252FGoogle%252Ftrunk%252FGoogle.java\" rel=\"nofollow\">http://projects.kyle-brady.com/svn/filedetails....</a> ] is probably more impressive.<br><br>That being said, I'm really not expecting it to help me get a job.  And if I were, I definitely wouldn't be pointing them to this code without some sort of context, the way you came across it.<br><br>Thanks for the feedback though<br><br>--Kyle", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-17_02:50:23", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 11034552, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10841281": {"up_voted": false, "ip": "", "has_replies": false, "message": "Joe, that is an absurd assertion, especially after the SJSU Judicial Affairs Office agreed with Kyle's position. A professor teaching a course should, as a matter of good practice, update assignments after each term specifically to prevent plagiarism, and also to keep course content relevant and current. Reusing assignments year after year is intellectual and academic laziness, a disservice to the students and a failure to maintain doctoral rigor. Additionally, peer reviewed solutions to any problem in a foundational course are widely available on the Internet, so it makes little difference if an assignment is posted publicly by a student after the due date. As long as a student gives proper attribution, uses peer reviewed sources and does not plagiarize, I don't care what they read or where they get their ideas. We (academics) are trying to teach problem solving and the student's work will speak for itself. There was no blackmail here; this was an honest difference of opinion and Kyle prevailed (and conducted himself admirably).", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_12:41:27", "killed": false, "user_key": "twitter-9949572", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10839808, "depth": 1, "points": 0, "author_is_creator": false, "is_realtime": false}, "10904139": {"up_voted": false, "ip": "", "has_replies": false, "message": "I never signed anything to that effect, nor was I told about it.<br><br>I also feel like it would have came up when Judicial Affairs came down with a proclamation. ;-)<br><br>From what I know, it's research universities and private schools that tend to do this... not so much SJSU.<br><br>--Kyle", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-14_21:01:36", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10904101, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10738116": {"up_voted": false, "ip": "", "has_replies": true, "message": "No comments in your code...tsktsk! ;)<br><br>Good for you for sticking up for yourself.<br><br>I like your SVN web interface. What software is that?", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_10:37:08", "killed": false, "user_key": "08a7b021977098f047802cd95a54b9fc", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10843126": {"up_voted": false, "ip": "", "has_replies": true, "message": "I had Beeson for windows programming in Fall '08 as well as other classes and posted all of my source code also. I guess I'm just lucky he didn't know about my website ( <a href=\"http://kylewilson.info/2008/10/09/windows-programming/\" rel=\"nofollow\">http://kylewilson.info/2008/10/09/windows-progr...</a> ). I found your article via Ars Technica <a href=\"http://arstechnica.com/open-source/news/2009/06/academic-source-code-dust-up-symptom-of-cs-education-ills.ars\" rel=\"nofollow\">http://arstechnica.com/open-source/news/2009/06...</a><br><br>This whole thing just reeks of laziness to me. Can't be bothered either to change part of the programming assignments from year to year or even to check carefully for plagiarism compared to previous submitted assignments. I'm glad Judicial Affairs ruled on your side.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_14:06:58", "killed": false, "user_key": "facebook-34702744", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10790473": {"up_voted": false, "ip": "", "has_replies": true, "message": "and now Hacker News", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-12_04:51:10", "killed": false, "user_key": "50aaf9a0ff8f035fb623b9c158de4b1a", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10952161": {"up_voted": false, "ip": "", "has_replies": false, "message": "Nice Blog...interesting \"CopyFight\" with the Professor...I am old school \"did not finish my PhD\" back in the early 90s...my thoughts on this issue: the old model of higher education \"Ivy covered brick structures\" is fast changing...Open Source and online publications first changed the newspaper media, and now the intellectual world...no one in their right mind wants a hunk of dead tree thrown on their lawn @ dawn with news that is one to two days old...a rather failed business model...now in intellectual circles research is undergoing a massive 360' degree about face...I feel it is all for the good...err remember those Monks in the Dark Ages who held all the books in the World in their libraries...books chained to the desk..and they decided who \"got to see them\" or some rich Lord or Baron in a rather smelly castle decided who could read what book or research document...just like the printing press changed all that muck...online publications (including this rather well written blog) have changed the information systems of the third planet back from the Sun...good luck and may the force be with u...", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-15_19:41:07", "killed": false, "user_key": "twitter-37173188", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10886216": {"up_voted": false, "ip": "", "has_replies": false, "message": "Are you dumb?<br><br>This is code, so there's really no subjectivity.  It works, or it doesn't.<br><br>And, do you really think, after all this, I'm going to put up with being graded down for bullshit?<br><br>Please.<br><br>--Kyle", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-14_11:49:16", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10881946, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10738761": {"up_voted": false, "ip": "", "has_replies": false, "message": "Yeah, well I tried to comment in the beginning of the class, and gave up... we had one of these projects due every week or so, and I had to move to fast to be able to care about comments.  ;-)<br><br>I think I did a fairly decent job of making it \"readable code\" though...<br><br>The SVN UI is \"WebSVN\": <a href=\"http://websvn.tigris.org/\" rel=\"nofollow\">http://websvn.tigris.org/</a>  It's made by the same people who do TortoiseSVN and a bunch of other stuff...  it's pretty cool, and very easy to setup.<br><br>--Kyle", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_10:54:59", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10738116, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10845239": {"up_voted": false, "ip": "", "has_replies": false, "message": "True, though I mean to use the word \"liberal\" specifically as pertinent to those principles of education that come from the classical liberalism of the Enlightenment -- which don't necessarily map onto present-day political liberalism.  (Having said that, I am also a liberal in the political sense, and damn proud of it.)<br><br>And Greece does have a strong authoritarian streak, which is an unfortunate irony all things considered...", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_15:55:10", "killed": false, "user_key": "cb5377d0606edbe9743433ddce59f97b", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": 10845058, "depth": 3, "points": 0, "author_is_creator": false, "is_realtime": false}, "10741453": {"up_voted": false, "ip": "", "has_replies": false, "message": "I find it startling that this issue arose at all.  At this same institution, it is common practice for students to retain copies of their classwork for use in personal portfolios.  If an art instructor indicated that students could not share the results of their efforts on assigned work to anyone outside of the class, post photos on Facebook after they had been submitted for course work, etc. there would be an uproar.  How is code different from artwork, essays or mathematical proofs?<br><br>I suspect that too many instructors rely on reuse of homework exercises each time they teach a course and struggle with the level of plagiarism this practice generates.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_12:08:19", "killed": false, "user_key": "2b353f60884446e17960b6ae5c1b773a", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10844496": {"up_voted": false, "ip": "", "has_replies": true, "message": "Mr. Apostolidis, you are wholly in the wrong.  I too am a teacher (both at the high school and college level), and I would never dream of asserting copyright or IP rights over my students' work.  At best, your argument is profoundly lazy on both a professional and intellectual level.  I go to the effort of rewriting exam and homework materials for every new class, and consider it part of the job.  I see no reason you shouldn't do so as well, or at the very least, reuse materials on a rotating 5- to 10-year schedule.<br><br>Frankly, I don't think any teacher or professor who would espouse that point of view belongs in the profession, because whatever your professional qualifications might be, your argument is a betrayal of some of the fundamental premises of a liberal education, and has no place in such institutions.  Shame on you.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_15:20:15", "killed": false, "user_key": "cb5377d0606edbe9743433ddce59f97b", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 2, "is_first_child": false, "email": "", "parent_post_id": 10844032, "depth": 1, "points": 0, "author_is_creator": false, "is_realtime": false}, "10744056": {"up_voted": false, "ip": "", "has_replies": true, "message": "Why bother?  It seems like the fight was for the sake of a fight.  I mean, is it THAT important that your homework were online?  Why not just show future employers with a portfolio?  (generally speaking, I don't think employers after graduation will really care about 2nd year homework assignment code)<br><br>As a side note, I think it should be ok for Dr. Bresson to reuse assignments.  If he comes up with an assignment that really teaches students, why should he have to change it every year?  Don't get me wrong - I totally think that you posting the homework is fine and should be allowed...I just don't see what the point is of making such a big deal about it.  <br><br>To further this point, I am even more liberal than you and believe assignment answers should be posted by students before the assignment is due (definitely considered cheating currently but I don't think it should).  I support this website <a href=\"http://www.studypipe.com\" rel=\"nofollow\">http://www.studypipe.com</a> that actually allows students to anonymously share answers online.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_13:17:40", "killed": false, "user_key": "3b2ea995c19e30264de7ceaae37f4b0c", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10782422": {"up_voted": false, "ip": "", "has_replies": false, "message": "I have enjoyed reading this story. As a teacher myself, I can see where the professor is coming from and the slippery slope you have set him on. As a former student, I can see where you, the creator and designer, want to display your work. <br>I feel like he is fighting because he doesn't want to make more work for himself... Coming up with new assignments every year so people can't just copy your work. I applaud your fighting for what is right. Change is the only thing that is constant, and you are forcing him to re-think and modify the thing he has worked hard to create. <br>The world will be better because of this. It just means more work for your professor. But he's a smart guy, and he will adapt and overcome. Good for you for sticking to your guns! I wish you the best of luck in the future.<br><br>M. Heer", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_22:44:58", "killed": false, "user_key": "e63abd3d55f2c71ef5ee3a3f0c18489e", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10844375": {"up_voted": false, "ip": "", "has_replies": false, "message": "Lol?<br><br>Simple English?  Brandish a Thesaurus?<br><br>I hope you're either foreign or in middle school, because otherwise you have no excuse for being stupid.  This is one of the simplest-written pieces I've done in a while... just because you're too stupid to understand it doesn't mean it was written at a high level.<br><br>Maybe you should learn to carry a thesaurus and dictionary with you at all times to translate what you don't understand.<br><br>--Kyle", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_15:14:01", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10843638, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "10820313": {"up_voted": false, "ip": "", "has_replies": false, "message": "Thank you, on behalf of student everywhere. It's absurd that so many professors have been able to remain stagnant in the way they teach their courses, such that students are nearly restricted from learning anything directly applicable to their field.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-12_19:11:34", "killed": false, "user_key": "b6bb462cbf416a9f01effc0e12d61a93", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10869896": {"up_voted": false, "ip": "", "has_replies": true, "message": "Kyle, you don't have nothing to be ashamed of. You are the one in the right side here.. this guy Joe is an absolute academic dishonesty... hopefully one day someone will kick him from his position, cause if he is a teacher.. he doesn't deserves it at all. And yeah... what a baseless argument.<br><br>Kyle, thanks for giving that hard fight! Very nice and polite answers, and congratulations on your victory for knowledge freedom :)", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_20:10:30", "killed": false, "user_key": "a2f078717bcc7fd84e495461e93b504e", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 3, "is_first_child": false, "email": "", "parent_post_id": 10839808, "depth": 1, "points": 0, "author_is_creator": false, "is_realtime": false}, "10794085": {"up_voted": false, "ip": "", "has_replies": false, "message": "This points out, in a loose manner, to a long standing concern that I have had with how computer science is taught.  I have been out of school for a long time, so it is possible that I am out of touch with reality.  But, it seems to me that students are an underutilized resource for the open software efforts such as LINUX.<br><br>What I would like to suggest is that student assignments be based on solving a current issue, versus rehashing prior projects.  Essentially our current approach is to re-invent the wheel.  What I would suggest, if LINUX does not have driver for a printer/monitor or other device, why not have that as an individual student assignment and/or class project?  It would be a win-win approach.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-12_08:55:36", "killed": false, "user_key": "Steve_R", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10845495": {"up_voted": false, "ip": "", "has_replies": false, "message": "Hey Kyle,<br>Saw it got slashdotted and as a responsible alum might, had to come by and offer my congratulations!  When I arrived in 2003, budget cuts had forced senior tenured professors back into the classroom instead of TA's doing that work for them, they were generally pretty grumpy about it.  I think this may be a vestige of that along with an evolving digital age.  I have to agree this was definitely a case of academic laziness on the part of Prof. Beeson, and academic dishonesty and immorality with the threats.  That said, I understand his concern as being at least maybe half heatedly legit although his actions sour his motivations. He was one of my favorite professors, through all this I hope its not lost he is not a bad man, nor do I think he is a bad professor, in fact one of the better professors on offer at SJSU imo. He is probably too close to the situation to appreciate that the code generated from his class was something you felt exceptional or otherwise worthy to be included in your online portfolio which reflects very well upon him.  I was able to learn with great success in a couple of his elective classes that have me growing an amazing carrer by over-delivering my pay and experience grade due in some small part based on my time in his classes.  Please, by no means, am I trying to in any way diminish his actions as anything other than wholly inappropriate imo, just dont throw out the baby with the bath water I guess. Once again congrats.  Hope to meet you in the club next time I run through.<br><br>Bryan- BSCS SJSU 2007", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_16:11:33", "killed": false, "user_key": "aa6ea3b1f7db6b36c57ea992e681b0dc", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10782693": {"up_voted": false, "ip": "", "has_replies": false, "message": "@student_a It seems that it was the prof that started the \"tussle\". And from what was posted I think that Mr. Brady approached this situation in a polite and respectful manner. <br><br>But the point is that profs should not be able to stop students from posting their code solutions online, or penalize their students for doing so.<br><br>Way to hang in there Kyle!", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_22:55:18", "killed": false, "user_key": "f48f6ce2d0943a821b93dfd7050e8fc6", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10773122, "depth": 1, "points": 0, "author_is_creator": false, "is_realtime": false}, "10747751": {"up_voted": false, "ip": "", "has_replies": false, "message": "Your introductory-level Java is unlikely to wow employers.  If you want to do that, you should work for an Open Source project or on a real project.  But more power to you for making life harder on a guy who tried to teach you something.  You really kicked \"the man's\" ass on that one.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_14:43:13", "killed": false, "user_key": "e8a0835e9f869c8c53304ba99e46b427", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10844392": {"up_voted": false, "ip": "", "has_replies": false, "message": "Exactly one of the points I was making.<br><br>Congratulations on having a horrible point of view.<br><br>--Kyle", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_15:14:48", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": true, "email": "", "parent_post_id": 10844032, "depth": 1, "points": 0, "author_is_creator": true, "is_realtime": false}, "11031761": {"up_voted": false, "ip": "", "has_replies": false, "message": "i am posting a link to this debate for the students visiting my site. how great that you maintained a sense of calm and wit during this. ludicrous is the right word.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-17_00:01:50", "killed": false, "user_key": "6ae1d9643d0eda156c7ebeb342d04322", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "11492970": {"up_voted": false, "ip": "", "has_replies": false, "message": "Amen!<br><br>--Kyle", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-20_00:12:38", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": 11480225, "depth": 4, "points": 0, "author_is_creator": true, "is_realtime": false}, "12677228": {"up_voted": false, "ip": "", "has_replies": false, "message": "With free software, all software should be free (gratis and libre) but the support and modifications of that free software can be the for-pay industry.<br><br>It ought to be similar with education.  All the tangible parts of education should be freely available.  All of it.<br><br>- The student's homework, essays, research.<br>- The lesson plans, the lesson materials, lecture videos.<br><br>No copyrights, no patents, no special cases.<br><br>The real value that is added is with the educational process itself.  The classroom time, the study groups, the environment, etc.  Oh, and the scrap of paper you get that says you paid a huge amount of money and you are now eligible to compete for a job.<br><br>Professors who worry about \"cheaters\" (exercising their free speech rights) are just too lazy to change their lesson plan every year.  They shouldn't have a job.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-07-15_01:40:02", "killed": false, "user_key": "13a7d788f0f36744b238fd0d1b68c9cc", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "4 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10839533": {"up_voted": false, "ip": "", "has_replies": false, "message": "Congrats on winning your \"fight.\" Hopefully the outcome will cause more Computer Science majors to post their code online. Honestly, I never thought about it as you did. I always just hurry and try to do the hw/project, struggle, and just stash it away in some dark corner or trash can so I never have to see it again. I think your way is more helpful though. (:", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_11:19:16", "killed": false, "user_key": "22f33dbae649687e8e569f07f9a3a599", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "11034789": {"up_voted": false, "ip": "", "has_replies": true, "message": "I don't agree with Prof Horstmann's conclusions, at least not a hundred percent.<br><br>In JAVA, yes, \"if (someboolean == false)\" may not be as \"readable\" but in the real world...especially if it's PHP and not JAVA....it's not a bad thing (of course it should be \"if(someboolean === false)\" instead for PHP since it doesn't have the same ordinal data types as JAVA).", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-17_02:57:57", "killed": false, "user_key": "8fc9298dcb8acc9a0411623cafd5da50", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 3, "is_first_child": false, "email": "", "parent_post_id": 11034552, "depth": 1, "points": 0, "author_is_creator": false, "is_realtime": false}, "10904101": {"up_voted": false, "ip": "", "has_replies": true, "message": "Hey Kyle, SJSU CS Alum here again, I seem to recall some clause (if memory serves) somewhat CS specific regarding any code/invention created by the student as part of a class or similar was some sort of work product with ownership going to the university.  Maybe Im pulling out of my hind end, but Im sure I saw that somewhere sometime, maybe not at SJSU though.  I figured you might have come across something of that nature during this incident, or may it didnt apply in this situation, curious if you came across anything of the sort?<br><br>B- SJSU BSCS 2007", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-14_20:59:29", "killed": false, "user_key": "aa6ea3b1f7db6b36c57ea992e681b0dc", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10870258": {"up_voted": false, "ip": "", "has_replies": false, "message": "This is an interesting issue.  I went to a rather expensive private university in Boston area and had the priviledge of TA-ing for one of the really good professors.  As part of this class, I had to develop all the assignments.  It was definitely more work than reusing past assignments, however, at the same time, it made us constantly evaluate the purpose of the assignment.  <br><br>We weren't as focused on whether students could copy the code but more on whether they were able to internalize the concept and employ it in a different setting.  This isn't always easy but it is worth it both for the teachers and the students.  We were always able to hone in on the challenging topics (based on the questions from the assignments) and focus more time/effort helping students learn.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-13_20:34:41", "killed": false, "user_key": "4ff4f38c0f7272a8c30edf2d005e9b6d", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "11034995": {"up_voted": false, "ip": "", "has_replies": true, "message": "Yeah I just went over and read what he wrote...<br><br>I said something about that too.  This was my first time doing Java, and I was learning on the fly.  I didn't figure it out until a bit later that !var would work.  If you go through the code from Project 1 -&gt; Project [last], you can see a pretty strong progression of structure, syntax, and style.<br><br>Thanks ;-)<br><br>--Kyle", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-17_03:13:17", "killed": false, "user_key": "bradyk", "has_been_anonymized": false, "edited": false, "author_is_moderator": true, "from_request_user": false, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 2, "is_first_child": false, "email": "", "parent_post_id": 11034789, "depth": 2, "points": 0, "author_is_creator": true, "is_realtime": false}, "13748670": {"up_voted": false, "ip": "", "has_replies": false, "message": "I go to SJSU and I feel your pain. The school is a national discrace as it has so many problems that the top heavy administration is unwilling to deal with. Our campus library is the main San Jose Public Library which is usually crowded with the homelsee all year round. We have antiquated labs from the 1950's and a faculty that is still braging  during class time about how they took on the administration during the Vietnam War but is scared to tackle the real problems of today. If you were considering going to this school think again and go anywhere else even a good junior college is one step up from this school . I hope they loose acredidation as it might wake them up.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-07-31_13:47:32", "killed": false, "user_key": "uknownstudent", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": false, "votable": true, "date": "4 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10741110": {"up_voted": false, "ip": "", "has_replies": true, "message": "Furthermore, I think the fact that Dr. Beesan now must create new assignments for his courses is a good thing. As a college student myself too often do I find myself thinking that professors are simply using assignments and paper topics that they have recycled for years. Sometimes forcing creativity and change is a good thing. I commend Kyle for not allowing Dr. Beesan to simply re-use assignments over and over again.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_11:58:07", "killed": false, "user_key": "twitter-18013831", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": false, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 1, "is_first_child": false, "email": "", "parent_post_id": 10736505, "depth": 1, "points": 0, "author_is_creator": false, "is_realtime": false}, "11005303": {"up_voted": false, "ip": "", "has_replies": false, "message": "I don't even care if posting the code will help other students... It's his right, Period. But, you are just trying to justify a bunch of lazy and mediocre teachers. In fact, there are a tons of ways to know if a student copied a code, but it's just teachers are lazy and they don't even check the code.<br><br>You can do when of things to reuse a homework: Modify the statement in a key point where you can recognize a new implementation of the whole algorithm or a deep understanding of it. If you can't get to that, then, add something else to the homework, something else that requieres to know how the algorithm works.<br><br>If you just want to use the same homework, well... chances of cheating are always there, he can even pay another student to do it's homework for him.. It doesn't matter.. it's the same shit, if you want to cheat, you cheat, however you want. Now, make a good list of question, regarding the implementation of the algorithms, and seat with each student, ask each a couple of questions to see if he really understands the code. ASk the student to turn around, break the code at certain point, and ask him to fix it. Ask him for details of implementation, why he thought of his implementation of that way, etc. There is a plenty of questions you can do... and if indeed the student can answer them all, and fixes the code, and everything else is right.. he either made the code by himself or copied someone else's code and fully understood it. If he fully understood it.. What's wrong? How fucking cares? He did what he got to do, understand the whole thing and that's what really matters.. Someday at work he will have problems trying to implement the algorithm and is going to regret about having the code copied. Even if I implement an algorithm myself, and i'm going to use it 10 years later, i'll have to reread the whole thing again and understand it once again, but if I understood it the first time, i'll be easier the second.<br><br>Just stop justifying lazy teachers.. teaching is such an important profession, you need more than a Ph.D to be a teacher, you need the feel to be a teacher, you need to recognize the important of your job, you must give a lot of time to your classes because that's your job, what you are paid for.<br><br>So.. Alex don't come here to call someone \"smug jerk\" just because he wants to share his knowledge, you are the real smug jerk trying to justify things because you are a lazy person and just think of knowlegde as a matter of doing a homework.. how naive.", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-16_15:22:04", "killed": false, "user_key": "a2f078717bcc7fd84e495461e93b504e", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "5 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": 10879408, "depth": 3, "points": 0, "author_is_creator": false, "is_realtime": false}, "10769016": {"up_voted": false, "ip": "", "has_replies": false, "message": "I actually have done the same, all my old homeworks from CS classes are available in my public subversion repo. I can actually tell when certain assignments are given out each year because I see a huge spike in Google referrals to those pages with keywords that indicate people are clearly trying to cheat. I can see his argument that it can dangerous if the professor isn't smart enough to add slight variations each time they reuse a problem. Of course students are usually far more industrious when it comes to cheating than to actually doing the work, and they will find old answers even without the aid of the Internet. Luckily these specific assignments are not only different each year, they are keyed to each student.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_19:55:49", "killed": false, "user_key": "cf611565f0b79abd0b3dc200ad867661", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10736505": {"up_voted": false, "ip": "", "has_replies": true, "message": "I would tend to agree with Mr. Dorfman.  I appreciate open source as much as the next guy, but I certainly understand the professors point of view.  It is not a matter of current students looking at your bits of code, but future students.  Now because the answers to his assignments are public, he is in a position where he has to make all new assignments each course session.  As far as being able to show your code to future employers at east, there are obviously simple ways to accommodate the professor while at the same time keeping your code available for others to view at your discretion.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_09:47:32", "killed": false, "user_key": "67c5890959dffad8f3edc0ad29771641", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 3, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}, "10761339": {"up_voted": false, "ip": "", "has_replies": false, "message": "I'm on the fence about the overall issues involved here.  But you must see the difference between pressuring a professor to update his assignments and making sure that no assignment can bear even a passing resemblance to a previous assignment.<br><br>By the way, your commendation is exactly the opposite of what Kyle himself is saying: that he never had any intention of making it easier for students to cheat.  You're admitting to the potential for future shenanigans, even if Kyle isn't.", "is_last_child": true, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_17:05:15", "killed": false, "user_key": "e4b8032efbe7fd5b205187abf97abb6c", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": 10741110, "depth": 2, "points": 0, "author_is_creator": false, "is_realtime": false}, "10768382": {"up_voted": false, "ip": "", "has_replies": false, "message": "Great Post!!!<br><br>Some people are lazy. I'm not just talking about Dr. Beeson or any future student that wishes to copy code. But here's the deal: <br>1) Those whose code has been published knowingly have a much easier time knowing when someone else copies it. So they are MORE protected.<br>2) Just because people can find the answers doesn't necessarily mean they will copy them or that the professor must \"retool\" his lessons every year.<br><br>I've taken programming courses and, unless you know what you are doing, it's a VERY BAD thing to try to copy. Because once questions or a test comes, you're just lost. Then guess what the teacher knows you've been doing if your \"work\" is great? Alternatively, if you HAVE learned what you need to know and you find you must look an example up, you'll be smart enough to simply apply the logic to your own code rather than copying it! Either way, it means that the teacher really isn't in much jeopardy by letting students post code.<br><br>Finally, I really don't like all of these peoples' hard-line ideas about copy protection. Some of it is just ludicrous. I mean, why is it that a patent (something that could potentially earn an individual or business billions more than a copyright) is up after only 20 years, but a copyright is basically forever? It has to do with money, big business, and lobbying groups. Yeah, try to lessen the length of a copyright with the RIAA around--- and try to extend the years of patent protection when the military needs to borrow the tech!!! Not gonna happen.", "is_last_child": false, "can_reply": true, "down_voted": false, "real_date": "2009-06-11_19:31:32", "killed": false, "user_key": "0e14a9902bed58b468be10240f965422", "has_been_anonymized": false, "edited": false, "author_is_moderator": false, "from_request_user": null, "votable": true, "date": "6 months ago", "approved": true, "num_replies": 0, "is_first_child": false, "email": "", "parent_post_id": null, "depth": 0, "points": 0, "author_is_creator": false, "is_realtime": false}}, "integration": {"receiver_url": "", "theme": 4, "reply_position": false, "disqus_logo": false}, "timer": {"timer_url": "http://localhost:8005", "thread_id": "21227305", "user_id": "anonymous", "forum_id": "21979", "hash": 4369878879783275856}, "thread": {"total_posts": 0, "paginate": false, "per_page": 0, "slug": "how_i_won_a_copyfight", "num_pages": 1, "days_alive": 0, "realtime_paused": true, "id": 21227305, "num_posts": 62, "closed": false, "queued": false, "killed": false}, "reactions_limit": 10, "context": {"show_reply": true, "use_fb_connect": true, "forum_facebook_key": "96cf4cba61ea5bb97f2be75c98ac0171", "use_yahoo": false, "subscribed": false, "use_twitter_signin": true, "use_openid": true, "realtime_speed": 5000}, "reactions_start": 0, "settings": {"debug": false, "disqus_url": "http://disqus.com", "media_url": "http://media.disqus.com"}, "media_url": "http://media.disqus.com"};
	/* */ this.jsonData.cookie_messages = {"user_created": null, "post_has_profile": null, "post_twitter": null, "post_not_approved": null}; this.jsonData.session = {"url": null, "name": null, "email": null}; /* */

	
	this.curPageId = 'dsq-comments';

	this.frames = {};
};

var disqus_popup_reference = null;

if(typeof DsqLocal == 'undefined') {
	DsqLocal = {};
}



/**
 * Dsq.Strings: UI strings
 */
Dsq.Strings = new function() {
	this.ADD_NEW_COMMENT = "Add New Comment";
	this.LOG_INTO_DISQUS = "Log into DISQUS";
	this.USE_MEDIA = "Use Media";
	this.LOGOUT = "Logout";
	this.SHARING_OPTIONS = "Sharing options";
	this.SHARE_ON = "Share on";
	this.TWEET_THIS_COMMENT = "Tweet this comment";
	this.SHARE_ON_NEWSFEED = "Share on news feed";
	this.SEND_UPDATE_TO_YAHOO = "Send update to Yahoo!";
	this.REBLOG_ON = "Reblog on";
	this.CONFIGURE_OPTIONS = "Configure options";
	this.POST_AS = "Post as";
	this.SORT_BY = "Sort by";
	this.SUBSCRIBE_BY_EMAIL = "Subscribe by email";
	this.SUBSCRIBE_BY_RSS = "Subscribe by RSS";
	this.POPULAR_NOW = "Popular now";
	this.BEST_RATING = "Best Rating";
	this.NEWEST_FIRST = "Newest first";
	this.OLDEST_FIRST = "Oldest first";
	this.HIGHLIGHTED = "Highlighted";
	this.UNSUBSCRIBE = "Unsubscribe";
	this.REQUIRED = "Required";
	this.OPTIONAL = "Optional";
	this.YOU_ARE_COMMENTING_AS_A = "You are commenting as a";
	this.LOGIN_BELOW = "Login below";
	this.PLEASE_LOGIN_BELOW_TO_COMMENT = "Please login below to comment.";
	this.SUBSCRIBE_TO_ALL_COMMENTS_BY_EMAIL = "Subscribe to all comments by email";
	this.DO_NOT_SUBSCRIBE_TO_COMMENTS = "Do not subscribe to comments";
	this.REALTIME_UPDATING_IS = "Real-time updating is";
	this.ENABLED = "enabled";
	this.PAUSED = "paused";
	this.PAUSE = "Pause";
	this.RESUME = "Resume";
	this.SHOW = "Show";
	this.JUST_NOW = "Just now";
	this.REPLY = "Reply";
	this.EDIT = "Edit";
	this.FLAG = "Flag";
	this.MODERATE = "Moderate";
	this.CANCEL = "Cancel";
	this.REPLYING_TO = "Replying to";
	this.REPORT_MISSING_REACTIONS = "Report missing reactions";
	this.POST_A_COMMENT = "Post a comment";
	this.FLAG_INAPPROPRIATE_COMMENT = "Flag inappropriate comment";
	this.FLAGGED = "Flagged";
	this.NO = "No";
	this.YES = "Yes";
	this.NEVER_MIND = "Never mind";
	this.ARE_YOU_SURE_YOU_WOULD_LIKE_TO_REPORT_THIS_COMMENT_TO_A_MODERATOR = "Are you sure you would like to report this comment to a moderator";
	this.THIS_WILL_FLAG_COMMENTS_FOR_MODERATORS_TO_TAKE_ACTION = "This will flag comments for moderators to take action";
	this.TO_RATE_PLEASE_LOG_IN = "To rate, please log in";
	this.JUST_A_MOMENT = "Just a moment...";
	this.GUEST = "Guest";
	this.NAME = "Name";
	this.EMAIL = "Email";
  this.WEBSITE = "Website";
  this.SETTINGS = "Settings";
  this.MODERATOR_OPTIONS = "Moderator options: ";
  this.MODERATE_OPTIONS = "Moderate Options";

  // Thread moderator actions
  this.CLOSE_THREAD = "Close thread";
  this.OPEN_THREAD = "Open thread";
  this.REMOVE_THREAD = "Remove thread";
  this.RESTORE_THREAD = "Restore thread";
  this.ACTIONS = "Actions";
};
// Dsq.Strings

/**
 * Dsq.FmtStrings: functions that return interpolated UI strings
 */
Dsq.FmtStrings = new function() {
	// Seems we have to use named interpolation for Django to translate. Investigate more.
	this.LOGGED_IN_AS = function(username) {
		return Dsq.Utils.interpolate('Logged in as %(username)s', {username:username});
	};

	this.LOGOUT_FROM = function(disqus) {
		return Dsq.Utils.interpolate('Logout from %(disqus)s', {disqus:disqus});
	};

	this.SHOWING_COMMENTS_FULL = function(total, num) {
		if (num === 1) {
			return Dsq.Utils.interpolate("Showing <span id='dsq-num-posts'>%(num)s</span> of <span id='dsq-total-posts'>%(total)s</span> comment", {num:num, total:total});
		} else {
			return Dsq.Utils.interpolate("Showing <span id='dsq-num-posts'>%(num)s</span> of <span id='dsq-total-posts'>%(total)s</span> comments", {num:num, total:total});
		}
	};

	this.SHOWING_COMMENTS_WITHOUT_PAGINATION = function(num) {
		if (num === 1) {
			return Dsq.Utils.interpolate("Showing <span id='dsq-num-posts'>%(num)s</span> comment", {num:num});
		} else {
			return Dsq.Utils.interpolate("Showing <span id='dsq-num-posts'>%(num)s</span> comments", {num:num});
		}
	};

	this.NUMBER_OF_COMMENTS = function(num) {
		return Dsq.Utils.interpolate(
			(num == 1
				? '%(num)s comment'
				: '%(num)s comments'
			), {num:num});
	};

	this.NUMBER_OF_LIKES = function(num) {
		return Dsq.Utils.interpolate(
			(num == 1
				? '%(num)s like'
				: '%(num)s likes'
			), {num:num});
	};

	this.NUMBER_OF_POINTS = function(num) {
		return Dsq.Utils.interpolate(
			(num == 1
				? '%(num)s point'
				: '%(num)s points'
			), {num:num});
	};
};
// Dsq.FmtStrings





Dsq.CSRF_TOKEN = '3a1994e3330279e78957da82fb64f754';
Dsq.COMMENTS_RE = /(<li.*?id="?dsq-comment-(\d+)"?.*?>)((?:.|\s)*?)(<\/li>)/gim;
Dsq.POST_RE = /(<div.*?id="?dsq-comment-header-(\d+)"?.*?>)((?:.|\s)*?)(<\/div>)\s*(<div.*?class="?dsq-comment-body"?.*?>)((?:.|\s)*)(<\/div>)/gim;
Dsq.POST_BODY_RE = /\s*(<div.*?id="?dsq-comment-message-(\d+)"?.*?>)((?:.|\s)*)(<\/div>)/gim;
// HACK: Safari ends with "-->" while other browsers end with "--&gt;" as expected.
Dsq.MEDIA_POST_RE = /&lt;!--\[(.*?)\]--(?:>|&gt;)/gim;



var FragmentPacket = function(reader, writer, writer_url, is_child, receiveCallback) {
	var that = this;
	this.reader = reader;
	this.writer = writer;
	this.writer_url = writer_url;

	this.is_child = is_child || false;
	this.receiveCallback = receiveCallback;

	this._lastHash = null;

	this._accumMsg = '';

	this._lastSeqno = 0;

	this.MAX_DATA_LEN	= 1024;

	this.WAIT_TIME		= 10;

	this.READY		= 0x1;
	this.WRITING	= 0x2;
	this.FIN		= 0x4;
	this.ACK		= 0x8;

};

FragmentPacket.prototype.createListener = function() {
	var that = this;
	var listener = function() {
		that.recv();
	};
	return window.setInterval(listener, 10);
};

FragmentPacket.prototype.log = function(msg) {



};

FragmentPacket.prototype.recv = function() {
	var hash;
	if (/MSIE/.test(navigator.userAgent)) {

		hash = this.reader.name;
	} else {

		var hashIndex = this.reader.location.href.indexOf('#');
		if (hashIndex == -1) {
			return;
		}
		hash = this.reader.location.href.substring(hashIndex+1);
	}
	var flags = parseInt(hash.substring(0, 4), 10);
	var seqno = parseInt(hash.substring(4, 24), 10);
	var data  = hash.substring(24);

	if (this._lastHash !== hash) {
		this._lastHash = hash;
		this.log('recv: ' + hash);

		this.log(' flags: ' + flags);
		this.log(' seqno: ' + seqno + ' len: ' + hash.substring(4, 24).length + ' (' + hash.substring(4, 24) + ')');
		this.log(' data: ' + data + ' len: ' + data.length);

		this._lastSeqno = seqno;

		if (flags & this.WRITING) {
			this._accumMsg += data;
			this.sendFlag(this.ACK, seqno);
			if (flags & this.FIN) {
				this.log('recv finished: ' + decodeURIComponent(this._accumMsg));
				this.receiveCallback(decodeURIComponent(this._accumMsg));

				this._accumMsg = '';

				this.sendFlag(this.READY | this.ACK, this._lastSeqno);
			}
		}
	}

	return {
		flags: flags,
		seqno: seqno,
		data: data
	};
};

FragmentPacket.prototype.sendRawPacket = function(packet) {
	if (/MSIE/.test(navigator.userAgent)) {
		this.writer.name = packet;
	} else {

		this.writer.location.href = this.writer_url + '#' + packet;
	}

};

FragmentPacket.prototype.sendFlag = function(flag, seqno) {
	this.sendRawPacket(this._zerofill(flag, 4) + this._zerofill(seqno, 20));
};

FragmentPacket.prototype.send = function(msg) {
	this._send(0, encodeURIComponent(msg));
};

FragmentPacket.prototype._send = function(packetNum, msg) {
	var that = this;
	var recvBuf = this.recv();

	if (packetNum === 0) {

		if (!(recvBuf.flags & this.READY)) {
			this.log('client is not ready, waiting...');
			window.setTimeout(function() { that._send(packetNum, msg); }, this.WAIT_TIME);
			return;
		}
	} else {

		if (!( (recvBuf.flags & this.ACK) && (recvBuf.seqno === this._lastSeqno) )) {
			this.log('waiting for ack from client...');
			window.setTimeout(function() { that._send(packetNum, msg); }, this.WAIT_TIME);
			return;
		} else {
			this.log('received ack: ' + this._lastSeqno + ' ' + recvBuf.seqno);
		}
	}

	var flags = this.WRITING;
	var num_packets = Math.ceil(msg.length / this.MAX_DATA_LEN);
	this.log('num_packets: ' + num_packets);

	if (num_packets === packetNum) {

		this.log('message successfully sent!');
		this.sendFlag(this.READY | this.ACK, this._lastSeqno);
		return true;
	}

	this._lastSeqno++;

	if (packetNum == num_packets-1) {
		flags |= this.FIN;
	}

	var data = msg.substring(packetNum * this.MAX_DATA_LEN, (packetNum+1) * this.MAX_DATA_LEN);
	var packet = this._zerofill(flags, 4) + this._zerofill(this._lastSeqno, 20) + data;

	this.log('sending raw packet: ' + packet);
	this.sendRawPacket(packet);

	return this._send(packetNum + 1, msg);
};

FragmentPacket.prototype._zerofill = function(num, width) {
	var retval = num.toString();
	var retval_len = retval.length;
	for (var i = 0; i < width - retval_len; i++) {
		retval = '0' + retval;
	}
	return retval;
};

var PostMessagePacket = function(receiver, receiveCallback, id, receiverId) {
	var that = this;
	this.receiver = receiver;
	this.receiveCallback = receiveCallback;
	this.id = id;


	this.receiverId = receiverId;
};

PostMessagePacket.prototype.createListener = function() {
	var that = this;

	var listener = function(e) {

		if (!that.id) {
			that.id = e.data;
			return;
		}


		var id = e.data.split(';')[0];
		if (id !== that.id) {
			return;
		}
		var data = e.data.substring(e.data.indexOf(';') + 1);

		that.receiveCallback(data);
	};

	if (typeof window.attachEvent == 'function') {
		window.attachEvent('onmessage', listener);
	} else if (typeof window.addEventListener == 'function') {
		window.addEventListener('message', listener, false);
	} else {
		throw new Error('No method found to create event listener for PostMessagePacket.');
	}
};

PostMessagePacket.prototype.send = function(msg) {



	var needs_reget = false;
	try {
		if (typeof this.receiver.id == 'undefined' || typeof this.receiver.postMessage == 'undefined') {
			needs_reget = true;
		}
	} catch(e) {


	}
	if (needs_reget && typeof this.receiverId != 'undefined') {
		this.receiver = document.getElementById(this.receiverId).contentWindow;
	}

	var packet;
	if (!msg) {

		packet = this.id;
	} else {
		packet = this.id + ';' + msg;
	}
	this.receiver.postMessage(packet, '*');
};

PostMessagePacket._last_unique_id = null;
PostMessagePacket._get_unique_id = function() {
	var id = (new Date()).getTime();
	if (id == PostMessagePacket._last_unique_id) {
		id++;
	}
	PostMessagePacket._last_unique_id = id;
	return id.toString();
};

var JsonRpc = function() {

	this.ids = {};

	this.objectToJSON = function(obj) {
		var json = '';
		var results = [];

		if (obj === undefined || obj === null) {
			return 'null';
		}

		switch (obj.constructor) {
			case Object:
				for (var property in obj) {
					if (obj.hasOwnProperty(property)) {
						results.push(this.objectToJSON(property) + ': ' + this.objectToJSON(obj[property]));
					}
				}
				json = '{' + results.join(', ') + '}';
				break;
			case Array:
				for (var i = 0; i < obj.length; i++) {
					results.push(this.objectToJSON(obj[i]));
				}
				json = '[' + results.join(', ') + ']';
				break;
			case Number:
			case Boolean:
				json = obj.toString();
				break;
			case String:

				var specialChars = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\\': '\\\\'};

				json = obj.replace(/[\x00-\x1f\\]/g, function(match) {
					var ch = specialChars[match];
					return ch ? ch : '\\u00' + match.charCodeAt().toPaddedString(2, 16);
				});

				json = '"' + json.replace(/"/g, '\\"') + '"';
				break;
			default:

				json = 'null';
				break;
		}

		return json;
	};

	this.createHandler = function(send_func, registered_funcs) {
		var that = this;
		var handler = function(message) {

			try {
				var rpc = eval('(' + message + ')');
			} catch(e) {
				alert('bad JSON: ' + message);
				return;
			}
			if (rpc.method) {

				if (!registered_funcs[rpc.method]) {
					return;
				}

				var retval = registered_funcs[rpc.method].apply(null, rpc.params);
				if (rpc.id) {
					var response = {
						result: retval,
						error: null,	// TODO
						id: rpc.id
					};
					send_func(that.objectToJSON(response));
				}
			} else if(rpc.result) {

				if (!that.ids[rpc.id]) {
					return;
				}

				that.ids[rpc.id](rpc.result);
				delete that.ids[rpc.id];
			}
		};
		return handler;
	};

	this.execute = function(send_func, method, params, response_callback) {
		response_callback = response_callback || null;
		var id = (response_callback) ? (new Date()).getTime() : null;

		var request = {
			method: method,
			params: params,
			id: id
		};

		send_func(this.objectToJSON(request));

		if (id) {
			this.ids[id] = response_callback;
		}
	};
};
JsonRpc = new JsonRpc();

var ParentMessenger = function(childUrl, receiverUrl, container, receiveCallback) {


	if (navigator.userAgent.indexOf('Safari') >= 0 && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf('Version/') + 8), 10) == 3) {
		throw new Error("unsupported.");
	} else if (window.opera) {
		throw new Error("unsupported.");
	}



	if (!receiverUrl &&
		navigator.userAgent.indexOf('Gecko') >= 0 &&
		parseFloat(navigator.userAgent.slice(navigator.userAgent.indexOf('rv:') + 3, navigator.userAgent.indexOf('rv:') + 6)) < 1.9) {
		throw new Error("unsupported.");
	}


	if (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) {


		if (document.domain == window.location.hostname) {
			receiverUrl = '';
		}
	}

	var that = this;
	this.childUrl = childUrl;
	this.receiverUrl = receiverUrl;
	this.container = container || document.body;

	this.packetHandler = null;


	this._ready = false;
	this._error = false;


	var _createReceiverForFragmentPacket = function() {

		that.receiver = document.createElement('iframe');
		that.receiver.src = receiverUrl;
		that.receiver.id = 'receiver_' + (new Date()).getTime();
		that.receiver.name = that.receiver.id;

		that.receiver.frameBorder = '0';
		that.receiver.frameSpacing = '0';
		that.receiver.style.borderStyle = 'none';

		var receiver_onload = function() {
			var receiver = document.getElementById(that.receiver.id).contentWindow;

			try {
				receiver.document.body.innerHTML = '';
			} catch(e) {

				that._error = true;
			}
			receiver.document.body.style.padding = '0px';
			receiver.document.body.style.margin = '0px';

			var child = receiver.document.createElement('iframe');
			child.id = 'child';
			child.name = 'child';
			child.src = that.childUrl;

			child.frameBorder = '0';
			child.frameSpacing = '0';
			child.style.borderStyle = 'none';
			child.style.width = '100%';
			child.style.height = '100%';
			receiver.document.body.appendChild(child);

			that.child = receiver.document.getElementById('child').contentWindow;
			that.receiver = receiver;

			that.packetHandler = new FragmentPacket(that.receiver, that.child, that.childUrl, false, receiveCallback);

			that._listener = that.packetHandler.createListener();

			that.packetHandler.sendFlag(that.packetHandler.READY, 0);

			that._ready = true;
		};

		that.receiver.onreadystatechange = function() {
			if (this.readyState == 'complete') {
				receiver_onload();
			}
		};

		that.receiver.onload = receiver_onload;







		if (Dsq.Utils.ie) {
			if (that.container.clientWidth === 0) {

				var _waitForWidth = function() {
					if (that.container.clientWidth > 0) {
						Dsq.Utils.fixIframesIE(that.container.id);
					} else {
						window.setTimeout(_waitForWidth, 100);
					}
				};
				_waitForWidth();

				that._once = false;
				that.receiver.onresize = function() {
					if (!that._once) {
						Dsq.Utils.fixIframesIE(that.container.id);
					}
					that._once = true;
				};
			}
		}

		that.container.appendChild(that.receiver);
	};


	var _createReceiverForPostMessage = function() {

		var receiver_onload = function() {

			that.packetHandler.send();
			that._ready = true;
		};

		var id = PostMessagePacket._get_unique_id();
		var receiverId = 'child_' + id;


		ParentMessenger['_receiver_onload_' + receiverId] = receiver_onload;

		that.container.innerHTML += '<iframe ' +
			'src="' + childUrl + '" ' +
			'id="' + receiverId + '" ' +
			'name="' + receiverId + '" ' +
			'onload="ParentMessenger._receiver_onload_' + receiverId +'();" ' +
			'></iframe>';

		that.receiver = document.getElementById(receiverId).contentWindow;
		that.packetHandler = new PostMessagePacket(that.receiver, receiveCallback, id, receiverId);
		that._listener = that.packetHandler.createListener();
	};

	if (typeof window.postMessage == 'function') {
		_createReceiverForPostMessage();
	} else {
		_createReceiverForFragmentPacket();
	}

};

ParentMessenger.prototype.sendMessage = function(message) {
	var that = this;
	if (!this._ready) {

		window.setTimeout(function() { that.sendMessage(message); }, 10);
		return;
	}
	this.packetHandler.send(message);
	return true;
};

Dsq.NewFrames = function(url) {
	this.url = url;
};

Dsq.NewFrames.prototype.init = function(onFailure) {
	var that = this;

	try {
		this.messenger = new ParentMessenger(this.url, Dsq.jsonData.integration.receiver_url, this.container, this.receive_callback);
	} catch(e) {
		if (typeof onFailure == 'function') {
			onFailure();
		}
	}

	if (typeof onFailure == 'function') {
		var iId = window.setInterval(function() {
			if (typeof that.messenger == 'undefined') {
				window.clearInterval(iId);
				return;
			}
			if (that.messenger._ready) {
				window.clearInterval(iId);
			} else if (that.messenger._error) {
				window.clearInterval(iId);
				onFailure();
			}
		}, 10);
	}
};

Dsq.NewFrames.prototype._execute = function(method, args, callback) {
	var that = this;
	if (typeof that.messenger == 'undefined') {
		return false;
	}
	JsonRpc.execute(
		function(msg) { that.messenger.sendMessage(msg); },
		method,
		args || [],
		callback);
	return true;
};

Dsq.ReplyFrame = function(container, parent_post_id) {
	var that = this;
	this.container = container;
	this.parent_post_id = parent_post_id;

	var sendFunc = function(msg) {

		Dsq.Debug.log('Dsq.ReplyFrame.sendFunc');
		that.messenger.sendMessage(msg);
	};


	var postComment_onSuccess = function(response) {
		Dsq.jsonData.posts[response.message.id] = response.message.post_meta;
		if (!Dsq.jsonData.users[response.message.post_meta.user_key]) {
			Dsq.jsonData.users[response.message.post_meta.user_key] = response.message.user_meta;
		}


		var reply_position = (typeof(disqus_insert_wrt_sort) == 'undefined' 
			? (Dsq.jsonData.forum.reply_position ? -1 : null) 
			: (Dsq.jsonData.request.sort == 2 ? null : -1));
		
		if (response.message.post_meta.approved) {
			Dsq.Post.insert(response.message.post_meta.parent_post_id || reply_position, response.message.id, response.message.post_meta.message);
		}

		Dsq.Templates.postComment_onSuccess(response, parent_post_id, response.message.id);
	};

	var postComment_onFailure = function(response) {
		Dsq.Popup.popModal(response.message, 'Error');
		Dsq.Templates.postComment_onFailure(response, parent_post_id, response.message.id);
	};

	var editComment_onSuccess = function(response) {
		var post_id = parent_post_id;
		var message = Dsq.$('dsq-comment-message-' + post_id);
		
		message.innerHTML = response.message;
		Dsq.Templates.toggleEdit(post_id);
		Dsq.Templates.setLoadingButton(false);
	};
	
	var editComment_onFailure = function(response) {
		var post_id = parent_post_id;
		
		Dsq.Popup.popModal('Sorry, there was an error editing this comment.', 'Edit Error');
		Dsq.Templates.toggleEdit(post_id);
		Dsq.Templates.setLoadingButton(false);
	};

	var getUserByEmail_onSuccess = function(response) {
		var msg = response.message;
		var fields = Dsq.Templates.getFormFields(parent_post_id);

		if (msg.username) {

			Dsq.Templates.lightboxAuthenticate(parent_post_id, 'login', {
				'username': msg.username,
				'display_name': msg.display_name,
				'avatar_url': msg.avatar_url,
				'verified': msg.verified,
				'email': fields.email.value
			});
		} else {

			Dsq.Templates.lightboxAuthenticate(parent_post_id, 'register');
		}
	};

	var validateAuth_onSuccess = function(response, auth_choice) {
		Dsq.Templates.postComment(parent_post_id, null, true, auth_choice);
	};

	var validateAuth_onFailure = function(response, auth_choice) {
		var pid = parent_post_id ? '-' + parent_post_id : '';
		var msg = response.message;

		if (auth_choice == 'register') {
			var fields = ['email', 'username', 'password'];

			for (var i = 0; i < fields.length; i++) {
				var field = fields[i];
				var errorDiv = Dsq.$('dsq-' + field + '-errors' + pid);

				if (msg[field]) {
					errorDiv.innerHTML = msg[field];
				} else {
					errorDiv.innerHTML = '';
				}
			}
		} else if (auth_choice == 'login') {
			Dsq.$('dsq-lightbox-errors' + pid).innerHTML = '<p>We couldn\'t log you in. Please verify your login.</p>';
		}
		
		Dsq.Templates.setLoadingButton(false);
	};

	this.receive_callback = JsonRpc.createHandler(sendFunc, {
		'postComment.onSuccess': postComment_onSuccess,
		'postComment.onFailure': postComment_onFailure,
		'editComment.onSuccess': editComment_onSuccess,
		'editComment.onFailure': editComment_onFailure,		
		'getUserByEmail.onSuccess': getUserByEmail_onSuccess,
		'validateAuth.onSuccess': validateAuth_onSuccess,
		'validateAuth.onFailure': validateAuth_onFailure,
		'reload': function() { window.location.reload(); }
	});

	this.url = Dsq.Urls.REPLY +
		'?' + (new Date()).getTime() +
		'&f=kyle-brady' +
		'&t=how_i_won_a_copyfight' +
		'&ff=' + Dsq.Thread.ff +
		'&default_text=' + disqus_default_text +
		'&ifrs=' + encodeURIComponent(disqus_iframe_css);
	if (this.parent_post_id) {
		this.url += '&parent_post=' + this.parent_post_id;
	}
};

Dsq.ReplyFrame.prototype = new Dsq.NewFrames(Dsq.ReplyFrame.url);

Dsq.ReplyFrame.prototype.post = function(author_name, author_email, author_url, authenticate, sharing_services, subscribe) {
	this._execute('postComment', [author_name, author_email, author_url, authenticate, sharing_services, subscribe]);
};

Dsq.ReplyFrame.prototype.edit = function(post_id, message) {
	this._execute('editComment', [post_id, message]);
};

Dsq.ReplyFrame.prototype.setState = function(parent_post_id, depth) {
	this._execute('setState', [parent_post_id, depth]);
};

Dsq.ReplyFrame.prototype.getUserByEmail = function(email) {
	this._execute('getUserByEmail', [email]);
};

Dsq.ReplyFrame.prototype.validateAuth = function(auth_choice, email, username, password) {
	this._execute('validateAuth', [auth_choice, email, username, password]);
};

Dsq.ReplyFrame.prototype.authenticateFacebook = function(session, forum_url) {
	this._execute('authenticateFacebook', [session, forum_url]);
};

	Dsq.Facebook = function() {
	var that = this;

	var handleSessionData = function(session) {

		var forum_url = Dsq.jsonData.forum.url;




		if (typeof disqus_facebook_forum != 'undefined') {
			forum_url = disqus_facebook_forum;
		}
		Dsq.frames.reply_0.authenticateFacebook(session, forum_url);
	};

	var onLogin = function() {
		FB.Connect.getSignedPublicSessionData(handleSessionData);
	};

	this.login = function() {
		FB.Connect.requireSession(onLogin, true);
	};
};
Dsq.Facebook = new Dsq.Facebook();


	






Dsq.Themes = {};

Dsq.Themes.narcissus = new function() {
	this.addPostContainer = 'dsq-form-area';
	this.textareaContainer = 'dsq-textarea-wrapper';



	
	this.header = function() {
		var comments_count, total_posts, num_posts;
		var html = '';
		var missing_perm_tmpl;

		if (Dsq.jsonData.request.missing_perm) {
			missing_perm_tmpl = Dsq.Templates.missingPermissions();
			if (missing_perm_tmpl) {
				html += '<div class="dsq-missing-permissions">' + missing_perm_tmpl + '</div>';
			}
		}

		total_posts = Dsq.jsonData.thread.total_posts;
		num_posts = Dsq.jsonData.thread.num_posts;

		if (total_posts) {
			comments_count = Dsq.FmtStrings.SHOWING_COMMENTS_FULL(total_posts, num_posts);
		} else {
			comments_count = Dsq.FmtStrings.SHOWING_COMMENTS_WITHOUT_PAGINATION(num_posts);
		}

		html += ' \
		<div id="dsq-comments-title"> \
			<h3>' + comments_count + '</h3> \
		</div> \
		';

		html += ' \
		<div class="dsq-options"> \
			<span class="dsq-item-sort">'
				+ Dsq.Strings.SORT_BY + ' \
				<select id="dsq-sort-select" onchange="Dsq.Thread.sortBy(this.value);"> \
					<option value="hot" ' + (Dsq.jsonData.request.sort == 4 ? 'selected="selected"' : '') + '>' + Dsq.Strings.POPULAR_NOW + '</option> \
					<option value="best" ' + (Dsq.jsonData.request.sort == 3 ? 'selected="selected"' : '') + '>' + Dsq.Strings.BEST_RATING + '</option> \
					<option value="newest" ' + (Dsq.jsonData.request.sort == 2 ? 'selected="selected"' : '') + '>' + Dsq.Strings.NEWEST_FIRST + '</option> \
					<option value="oldest" ' + (Dsq.jsonData.request.sort == 1 ? 'selected="selected"' : '') + '>' + Dsq.Strings.OLDEST_FIRST + '</option> \
				</select> \
				&nbsp; \
			</span> \
			<span class="dsq-subscribe-email"> \
				<img src="http://media.disqus.com/images/embed/email.png" style="width:12px;height:12px;vertical-align:middle"> \
				<span id="dsq-subscribe">'
					+ (Dsq.jsonData.context.subscribed
						? '<a href="#" onclick="Dsq.Thread.subscribe(0); return false">' + Dsq.Strings.UNSUBSCRIBE + '</a>'
						: '<a href="#" onclick="Dsq.Thread.subscribe(1); return false">' + Dsq.Strings.SUBSCRIBE_BY_EMAIL + '</a>')
				+ '</span> \
			</span> \
			<span class="dsq-subscribe-rss" style="width:12px;height:12px;vertical-align:middle"> \
				<img src="http://media.disqus.com/images/embed/bullet-feed.png" alt="" /> \
				<a href="http://kyle-brady.disqus.com/how_i_won_a_copyfight/latest.rss">' + Dsq.Strings.SUBSCRIBE_BY_RSS + '</a> \
			</span> \
		</div> \
		';

		
		
			html += Dsq.Templates.realtime();
			html += Dsq.Templates.showThreadSettings();
			html = Dsq.Templates.postBox() + html;

		
		

		return html;

	};
	
	this.footer = function() {
		var html = '';

		html += Dsq.Templates.pagination();


		html += Dsq.Templates.reactions();

		
			html += Dsq.Templates.trackbacks();
		


		if (Dsq.jsonData.request.is_global_moderator) {
 			html += ' \
				<div class="dsq-global-moderator-extras">'
					+ '<strong>shortname:</strong> ' + Dsq.jsonData.forum.url
					+ '<strong>thread id:</strong> ' + Dsq.jsonData.thread.id
					+ '<strong>thread slug:</strong> ' + Dsq.jsonData.thread.slug
				+ '</div> \
			';
		}

		return html;
	};
	
	this.realtime = function() {
		var html = '';
		
		if (Dsq.jsonData.realtime_enabled) {
			html += '<div id="dsq-realtime-options" class="dsq-options">'
					 + Dsq.Strings.REALTIME_UPDATING_IS + ' <strong id="dsq-realtime-status" style="text-transform: lowercase">' + Dsq.Strings.ENABLED + '</strong>. \
					 <a href="#" id="dsq-realtime-toggle" style="text-transform: capitalize"></a> \
					</div>';
		}

		if (!Dsq.jsonData.forum.streaming_realtime) {
			html += ' \
				<div style="display: none" id="dsq-realtime-alert" class="dsq-realtime-alert"><span id="dsq-realtime-queued"></span> <a href="#" id="dsq-realtime-show"></a></div> \
			';
		}
		
		return html;
	};

	this.showThreadSettings = function() {
		if (!Dsq.jsonData.request.is_moderator) {
			return '';
		}

		html = '<div id="dsq-thread-settings" class="dsq-thread-settings">' + Dsq.Strings.MODERATOR_OPTIONS;
		html += '<a href="#" onclick="Dsq.Thread.showSettings(); return false;">' + Dsq.Strings.SETTINGS + '</a>';
		html += '<a href="#" onclick="Dsq.Thread.showModeratorActions(); return false;">' + Dsq.Strings.MODERATE + '</a>';
		if (Dsq.jsonData.forum.reactions_enabled && Dsq.jsonData.reactions.length === 0) {
			html += '<a href="#" onclick="Dsq.Reaction.reportMissingReactions(); return false;">'
						+ Dsq.Strings.REPORT_MISSING_REACTIONS
						+ '</a>';
		}
		html +='</div>';

		return html;
	};

	this.postBox = function(post_id, use_fallback_iframe) {


		var html;
		var display_sharing_options = Dsq.jsonData.request.is_authenticated;

		if (!Dsq.jsonData.request.is_authenticated && Dsq.jsonData.forum.disqus_auth_disabled && !Dsq.jsonData.forum.allow_anon_post) {
			return '';
		}
		
		if (Dsq.jsonData.request.is_remote) {


			if (!Dsq.jsonData.request.sharing.hasOwnProperty(Dsq.jsonData.request.remote_domain)) {
				display_sharing_options = false;
			}
		}
		
		if (post_id) {
			var _meta = Dsq.jsonData.posts[post_id];
			var userData = Dsq.jsonData['users'][_meta.user_key];				
		}
		
		var pid = post_id ? '-' + post_id : '';

		var _requestUserInfo = function() {
			var html;



			var user_has_email = false;

			html = '<div class="dsq-request-user-info"> <!-- // If authenticated --> \
				<a href="' + Dsq.jsonData.settings.disqus_url + Dsq.Urls.LOGOUT + '?ctkn=' + Dsq.CSRF_TOKEN + '" class="dsq-request-user-logout">' + Dsq.Strings.LOGOUT + '</a> \
				<table> \
					<tr> \
						<td rowspan="2">'
							+ (!Dsq.jsonData.forum.disqus_auth_disabled ? '<a href="' + Dsq.jsonData.settings.disqus_url + Dsq.Urls.REQUEST_USER_PROFILE + '">' : '')
								+ '<img src="' + Dsq.Urls.REQUEST_USER_AVATAR + '" width="48" height="48" class="dsq-request-user-avatar">'
							+ (!Dsq.jsonData.forum.disqus_auth_disabled ? '</a>' : '')
						+ '</td> \
						<td class="dsq-request-user-name">'
								+ (Dsq.jsonData.request.is_remote
									 ? '<span class="dsq-badge-small dsq-badge-' + Dsq.jsonData.request.remote_domain + '">' + Dsq.jsonData.request.remote_domain + '</span>'
									 : (Dsq.jsonData.request.is_verified
											? '<span class="dsq-badge-small dsq-badge-verified">Verified</span>'
											: '<span class="dsq-badge-small dsq-badge-registered">Registered</span>'))
							+ (!Dsq.jsonData.forum.disqus_auth_disabled ? ' <a href="' + Dsq.jsonData.settings.disqus_url + Dsq.Urls.REQUEST_USER_PROFILE + '">' : '') 
								+ Dsq.jsonData.request.display_username 
							+ (!Dsq.jsonData.forum.disqus_auth_disabled ? '</a>' : '')
							+  (Dsq.jsonData.request.is_remote && user_has_email ? ' <small>(<a href="#" onclick="Dsq.Popup.remoteAccountSettings(); return false;">change settings</a>)</small>' : '')
							+  (!Dsq.jsonData.request.is_remote && !Dsq.jsonData.forum.disqus_auth_disabled ? ' <small>(<a href="' + Dsq.jsonData.settings.disqus_url + '/profile/info/" target="_blank">change name</a> or <a href="' + Dsq.jsonData.settings.disqus_url + '/profile/avatar/" target="_blank">picture</a>)</small>' : '')
						+ '</td> \
					</tr> \
					<tr> \
						<td class="dsq-request-user-stats"> \
							<span><big>' + Dsq.jsonData.request.comments_count + '</big> ' + (Dsq.jsonData.request.comments_count == 1 ? 'comment' : 'comments') + '</span> \
							<span><big>' + Dsq.jsonData.request.likes_count + '</big> ' + (Dsq.jsonData.request.likes_count == 1 ? 'like' : 'likes') + '</span> \
							<span><big>' + Dsq.jsonData.request.points + '</big> ' + (Dsq.jsonData.request.points == 1 ? 'point' : 'points') + '</span> \
						</td> \
					</tr> \
				</table> \
			</div> \
			';
			return html;
		};

		var _loginOptions = function() {
			var html;
			html = ' \
			<div class="dsq-authenticate"> \
				<p class="dsq-autheneticate-copy">'
				+ (Dsq.jsonData.forum.allow_anon_post
					? Dsq.Strings.YOU_ARE_COMMENTING_AS_A + ' <a class="dsq-help" title="Click for more information" href="#" onclick="Dsq.Popup.helpBadges(); return false">Guest</a>. ' + Dsq.Strings.OPTIONAL + ': ' + Dsq.Strings.LOGIN_BELOW + '.'
					: Dsq.Strings.REQUIRED + ': ' + Dsq.Strings.PLEASE_LOGIN_BELOW_TO_COMMENT + '.')
				+ '</p> \
				<ul class="dsq-login-buttons">'
					+ (!Dsq.jsonData.forum.disqus_auth_disabled ? '<li class="dsq-login-button"><a href="#" onclick="Dsq.Popup.login(); return false"><img src="http://media.disqus.com/images/themes/narcissus/login-disqus.gif" /></a></li>' : '')
					+ (Dsq.jsonData.context.use_fb_connect ? '<li class="dsq-login-button"><a href="#" onclick="Dsq.Facebook.login(); return false;"><img src="http://media.disqus.com/images/themes/narcissus/login-facebook.gif" /></a></li>' : '')
					+ (Dsq.jsonData.context.use_twitter_signin ? '<li class="dsq-login-button"><a href="#" onclick="Dsq.Twitter.startTwitterConnect(); return false"><img src="http://media.disqus.com/images/themes/narcissus/login-twitter.gif" /></a></li>' : '')
					+ (Dsq.jsonData.context.use_openid ? '<li class="dsq-login-button"><a href="#" onclick="Dsq.OpenID.requestURL(); return false" ><img src="http://media.disqus.com/images/themes/narcissus/login-openid.gif" /></a></li>' : '')
					+ (Dsq.jsonData.context.use_yahoo ? '<li class="dsq-login-button"><a href="#" onclick="Dsq.Yahoo.startYahooConnect(); return false"><img src="http://media.disqus.com/images/themes/narcissus/login-yahoo.gif" /></a></li>' : '')
				+ '</ul> \
			</div> \
			';
			return html;
		};

		if (!Dsq.jsonData.context.show_reply) {


			if (!Dsq.jsonData.request.is_authenticated) {



				return '<div id="dsq-form-area" style="display:none"><div id="dsq-textarea-wrapper"></div></div>' + _loginOptions();
			} else {
				return '';
			}
		}

		html = ' \
		<div id="' + (post_id 
			? 'dsq-reply-post-' + post_id
			: 'dsq-new-post')
		 	+ '" class="dsq-post-area"> \
			<div class="dsq-dc-logo"> \
				<a href="http://disqus.com/comments" target="_blank"><img src="http://media.disqus.com/images/themes/narcissus/disqus-logo.png"></a> \
			</div>'
			+ (post_id 
				? '<h3>' + Dsq.Strings.REPLYING_TO + ' ' + userData.display_name + '</h3>'
				: '<h3>' + Dsq.Strings.ADD_NEW_COMMENT + '</h3>')
			+ (Dsq.jsonData.request.is_authenticated 
				? _requestUserInfo()
				: _loginOptions() )
			+ '<div id="dsq-form-area' + pid + '">'
			+ '<div class="dsq-textarea"> \
				<div class="dsq-textarea-wrapper" id="dsq-textarea-wrapper' + pid + '"></div> \
			</div>'
			+ (!Dsq.jsonData.request.is_authenticated
			? ' \
			<div class="dsq-post-fields"> \
				<form action="." method="GET" onsubmit="Dsq.Templates.postComment(' + post_id + ', this, false); return false;"> \
				<table> \
					<tr> \
						<td class="dsq-post-fields-left"><div class="dsq-input-wrapper"><input id="dsq-field-name' + pid + '" type="text" value="' + (disqus_def_name ? disqus_def_name : (Dsq.jsonData.session.name ? Dsq.jsonData.session.name : Dsq.Strings.NAME + '" class="dsq-placeholder')) + '" onfocus="Dsq.Templates.handlePlaceholder(event, this, \'name\')" onblur="Dsq.Templates.handlePlaceholder(event, this, \'name\')" /></div></td> \
						<td class="dsq-post-fields-right"><div class="dsq-input-wrapper"><input id="dsq-field-website' + pid + '" type="text" value="' + (Dsq.jsonData.session.url ? Dsq.jsonData.session.url : Dsq.Strings.WEBSITE + ' (' + Dsq.Strings.OPTIONAL.toLowerCase() + ')" class="dsq-placeholder') + '" onfocus="Dsq.Templates.handlePlaceholder(event, this, \'website\')" onblur="Dsq.Templates.handlePlaceholder(event, this, \'website\')" /></div></td> \
					</tr> \
					<tr> \
						<td class="dsq-post-fields-left"><div class="dsq-input-wrapper"><input id="dsq-field-email' + pid + '" type="text" value="' + (disqus_def_email ? disqus_def_email : (Dsq.jsonData.session.email ? Dsq.jsonData.session.email : Dsq.Strings.EMAIL + '" class="dsq-placeholder')) + '" onfocus="Dsq.Templates.handlePlaceholder(event, this, \'email\')" onblur="Dsq.Templates.handlePlaceholder(event, this, \'email\')" /></div></td> \
						<td class="dsq-post-fields-right"> \
							<div class="dsq-subscribe"> \
								<a href="#" onclick="Dsq.Templates.chooseSubscribe(' + post_id + '); return false" class="dsq-subscribe-menu"><span id="dsq-subscribe-select' + pid + '">' + (Dsq.jsonData.request.subscribe_on_post ? Dsq.Strings.SUBSCRIBE_TO_ALL_COMMENTS_BY_EMAIL : Dsq.Strings.DO_NOT_SUBSCRIBE_TO_COMMENTS) + '</span> <small>&#9660;</small></a> \
								<ul class="dsq-panel" id="dsq-subscribe-menu' + pid + '"> \
									<li><a href="#" onclick="Dsq.Templates.setSubscribe(2, this, ' + post_id + '); return false">Subscribe to all comments by email</a></li> \
									<li><a href="#" onclick="Dsq.Templates.setSubscribe(0, this, ' + post_id + '); return false">Do not subscribe to comments</a></li> \
								</ul> \
								<input id="dsq-subscribe-on-post' + pid + '" type="hidden" value="' + Dsq.jsonData.request.subscribe_on_post + '" /> \
							</div> \
						</td> \
					</tr> \
				</table> \
				</form> \
			</div>'
			: '')
			+ '<div class="dsq-post-footer"> \
				<div class="dsq-sharing-options" ' + (!display_sharing_options ? 'style="display:none;"' : '') + '> \
					<button class="dsq-button-small" onfocus="document.getElementById(\'dsq-post-button' + pid + '\').focus();"><span>' + Dsq.Strings.SHARING_OPTIONS + ' <small>&#9660;</small></span></button> \
					<div class="dsq-panel"> '
						+ (Dsq.jsonData.request.sharing.twitter !== undefined
								&& Dsq.jsonData.request.sharing.twitter.enabled === true
							? '<div><input type="checkbox" id="dsq-sharing-twitter' + pid + '"'
								  + (Dsq.jsonData.request.sharing.twitter.auto === true ? 'checked=true' : '') + '/> \
									<label for="dsq-sharing-twitter' + pid + '">' + Dsq.Strings.SHARE_ON + ' Twitter</label> \
								 </div>'
							: '')
						+ (Dsq.jsonData.request.sharing.facebook
								&& (Dsq.jsonData.request.sharing.facebook.enabled === true ||
										(Dsq.jsonData.request.is_remote && Dsq.jsonData.request.remote_domain == 'facebook'))
							? '<div><input type="checkbox" id="dsq-sharing-facebook' + pid + '"'
									+ (Dsq.jsonData.request.sharing.facebook.auto === true ? 'checked=true' : '') + '/> \
									<label for="dsq-sharing-facebook' + pid + '">' + Dsq.Strings.SHARE_ON + ' Facebook</label> \
								 </div>'
							: '')
						+ (Dsq.jsonData.request.sharing.yahoo !== undefined
								&& Dsq.jsonData.request.sharing.yahoo.enabled === true
							? '<div><input type="checkbox" id="dsq-sharing-yahoo' + pid + '"'
									+ (Dsq.jsonData.request.sharing.yahoo.auto === true ? 'checked=true' : '') + '/> \
									<label for="dsq-sharing-yahoo' + pid + '">' + Dsq.Strings.SHARE_ON + ' Yahoo!</label> \
								</div>'
							: '')
						+ (Dsq.jsonData.request.sharing.tumblr !== undefined
								&& Dsq.jsonData.request.sharing.tumblr.enabled === true
							? '<div><input type="checkbox" id="dsq-sharing-tumblr' + pid + '"'
									+ (Dsq.jsonData.request.sharing.tumblr.auto === true ? 'checked=true' : '') + '/> \
									<label for="dsq-sharing-tumblr' + pid + '">' + Dsq.Strings.SHARE_ON + ' Tumblr</label> \
								 </div>'
							: '')
						+ (Dsq.jsonData.request.sharing.wordpress !== undefined
								&& Dsq.jsonData.request.sharing.wordpress.enabled === true
							? '<div><input type="checkbox" id="dsq-sharing-wordpress' + pid + '"'
									+ (Dsq.jsonData.request.sharing.wordpress.auto === true ? 'checked=true' : '') + '/> \
									<label for="dsq-sharing-wordpress' + pid + '">' + Dsq.Strings.SHARE_ON + ' Wordpress</label> \
								 </div>'
							: '')
						+ (Dsq.jsonData.request.sharing.movabletype !== undefined
							  && Dsq.jsonData.request.sharing.movabletype.enabled === true
							? '<div><input type="checkbox" id="dsq-sharing-movabletype' + pid + '"'
									+ (Dsq.jsonData.request.sharing.movabletype.auto === true ? 'checked=true' : '') + '/> \
									<label for="dsq-sharing-movabletype' + pid + '">' + Dsq.Strings.SHARE_ON + ' Movable Type</label> \
							   </div>'
							: '')
						+ (Dsq.jsonData.request.sharing.typepad !== undefined
							  && Dsq.jsonData.request.sharing.typepad.enabled === true
							? '<div><input type="checkbox" id="dsq-sharing-typepad' + pid + '"'
									+ (Dsq.jsonData.request.sharing.typepad.auto === true ? 'checked=true' : '') + '/> \
								  <label for="dsq-sharing-typepad' + pid + '">' + Dsq.Strings.SHARE_ON + ' TypePad</label> \
							   </div>'
							: '')
						+ '<div><a href="' + Dsq.jsonData.settings.disqus_url + '/profile/connections/" target="_blank" class="dsq-configure-options">' + Dsq.Strings.CONFIGURE_OPTIONS + '</a></div>'
					+ '</div> \
				</div>'
				+ '<button class="dsq-button" id="dsq-post-button' + pid + '" onclick="Dsq.Templates.postComment(' + post_id + ', this, false)"><span>' + Dsq.Strings.POST_AS + ' '
				+ (Dsq.jsonData.request.display_username
					? Dsq.jsonData.request.display_username
					: Dsq.Strings.GUEST)
				+ '</span></button>'
				+ (post_id
					? '<button class="dsq-button" id="dsq-cancel-button' + pid + '" onclick="Dsq.Post.toggleReply(' + post_id +', this)"><span>' + Dsq.Strings.CANCEL + '</span></button>'
					: '')
			+ '</div>'
			+ '</div>' // end dsq-form-area
		+ '</div> \
		';
		
		return html;
	};




	this.appendPost = function(post_id) {
		var html = '<div id="dsq-append-post-' + post_id + '"></div>';
		return html;
	};

	this.postPrependHeader = function(post_id) {
		var html;
		var _meta = Dsq.jsonData.posts[post_id];
		var userData = Dsq.jsonData['users'][_meta.user_key];
		
		html = ' \
		<table> \
			<tr> \
				<td id="dsq-header-avatar-' + post_id + '" class="dsq-header-avatar" onmouseover="Dsq.Post.dropProfile(' + post_id + ')"> \
					<a id="dsq-avatar-' + post_id + '" class="dsq-avatar" href="' + userData.url + '" onclick="Dsq.Popup.popProfile(' + post_id + '); return false;">'
					+ (Dsq.jsonData.forum.show_avatar
					? '<img src="' + Dsq.jsonData.users[_meta.user_key].avatar + '" alt="" />'
					: '')
				+ '</a> \
				</td> \
				<td class="dsq-comment-header-meta"> \
		';

		
		return html;
	};
	
	this.postAppendHeader = function(post_id) {
		var _meta = Dsq.jsonData.posts[post_id];
		var html;
		var parent_display_name = '';
		
		if(_meta.parent_post_id) {

			var _parent_meta = Dsq.jsonData.posts[_meta.parent_post_id];

			if (_parent_meta) {
				var parentUserData = Dsq.jsonData['users'][_parent_meta.user_key];
				parent_display_name = parentUserData.display_name;
			}
		}

		html = ' \
		<img src="http://media.disqus.com/images/themes/narcissus/moderator.png" class="dsq-moderator-star" title="Moderator" /> \
		<span class="dsq-comment-header-time"><a href="#comment-' + post_id + '" onclick="Dsq.Popup.permalink(' + post_id + ')" title="Permalink">' + (_meta.is_realtime ? Dsq.Strings.JUST_NOW : _meta.date) + '</a></span> '
		+ (_meta.parent_post_id && parent_display_name
			? '<a href="#comment-' + _meta.parent_post_id + '" title="Jump to comment">in reply to ' + parent_display_name + '</a>'
			: '')
		+ '</td> \
		<td id="dsq-like-pts-' + post_id + '" class="dsq-comment-header-likes">'
		+ (_meta.points
			? _meta.points + Dsq.Utils.pluralize(_meta.points, ' person', ' people') + ' liked this.'
			: '')
		+ '</td> \
		</tr> \
		</table> \
		';
		return html;
	};

	this.preBody = function(post_id) {
		var html = '';
		return html;
	};

	this.postFooter = function(post_id) {
		var html;
		var _meta = Dsq.jsonData.posts[post_id];
		if(_meta.killed || !_meta.approved) { return ''; }
		
		html = ' \
		<div class="dsq-comment-footer" id="dsq-comment-footer-' + post_id + '"> \
			<div class="dsq-comment-footer-left">'
				+ (Dsq.jsonData.request.is_moderator || Dsq.jsonData.request.is_global_moderator
					? '<a href="#" onclick="Dsq.Templates.moderateOptions(' + post_id+ '); return false">' + Dsq.Strings.MODERATE + '</a>'
					: '')
				+ '<a href="#" id="dsq-post-report-' + post_id + '" class="dsq-post-report" onclick="Dsq.Post.report(' + post_id + ', false); return false;">' + Dsq.Strings.FLAG + '</a> \
			</div> \
			<div class="dsq-comment-footer-right">'
				+ (_meta.votable 
					? '<span id="dsq-like-' + post_id + '" class="dsq-like">'
					+ (!_meta.up_voted
						? '<button class="dsq-button-small" onclick="Dsq.Post.rate(this, ' + post_id + ', 1)" >Like</button>'
						: 'You liked this.&nbsp;&nbsp;')
					+ '</span>'
					: '')
				+ (_meta.can_reply && !_meta.has_replies && _meta.from_request_user
					? '<button class="dsq-button-small dsq-post-edit" onclick="Dsq.Post.edit(this, ' + post_id + ')" >' + Dsq.Strings.EDIT + '</button>'
					: '')
				+ (_meta.can_reply
					? '<span class="dsq-comment-footer-reply" id="dsq-comment-footer-reply-' + post_id + '" onclick="Dsq.Post.toggleReply(' + post_id +', this)"> \
						<button class="dsq-button-small">' + Dsq.Strings.REPLY + '</button> \
						<button class="dsq-comment-footer-reply-tab">' + Dsq.Strings.REPLY + '</button><span></span> \
					</span>'
					: '')
			+ '</div> \
		</div> \
		';
		
		return html;
	};



	
	this.showRetweets = function(id, limit, element_id /* Optional */) {
		var source, html = '';

		for (var i = 0, reaction; reaction = Dsq.jsonData.reactions[i]; i++) {
			if (reaction.id === id) {
				source = reaction.retweets;
			}
		}

		if (source) {
			if (limit === 0) {
				limit = source.length;
			}

			for (var j = 0; j < limit; j++) {
				var rt = source[j];
				html += '<a href="' + rt.url + '">' + rt.author_name + '</a>'	+ ((j === (limit - 1)) ? '.' : ', ');
			}
		}

		if (element_id === undefined) {
			return html;
		}

		var element = document.getElementById(element_id);
		element.innerHTML = html;
		return element;
	};

	this.showMoreReactions = function(reactions, has_more, start, limit) {
		var link = document.getElementById('dsq-show-more-reactions');
		var container = link.parentNode;
		container.removeChild(link);

		for (var i = 0, reaction; reaction = reactions[i]; i++) {
			var el = Dsq.Templates.generateReactionHTML(reaction);
			if (el) {
				container.innerHTML += el;
			}
		}

		if (has_more) {
			var d = Dsq.jsonData.settings.disqus_url;
			var f = Dsq.jsonData.forum.url;
			var t = Dsq.jsonData.thread.id;
			var s = start;
			var l = limit;

			var handler = 'Dsq.Utils.execScript(\'' + d + '/forums/' + f + '/more_reactions.js?t=' + t + '&s=' + s + '&l=' + l + '\', true); return false;';
			container.innerHTML += '<li id="dsq-show-more-reactions" class="dsq-show-more-reactions"><button class="dsq-button-small" onclick="' + handler + '">Show more reactions</button></li>';
		}
	};

	this.generateReactionHTML = function(reaction) {
		if (reaction.body === null || reaction.body == '') {
			return;
		}

		if (reaction.author_name === '') {
			reaction.author_name = '&nbsp;';
		}

		if (reaction.url === '') {
			reaction.url = reaction.get_service_url;
		}

		var item = '<li class="dsq-comment dsq-reaction" id="dsq-reaction-' + reaction.id + '">'
			+ '<div class="dsq-comment-header"> \
			<table> \
			<tr> \
			<td class="dsq-header-avatar"> \
			';

		if (reaction.author_url && reaction.author_url !== '') {
			item += '<a target="_blank" href="' + reaction.author_url +'" class="dsq-avatar">';
		}

		if (reaction.avatar_url && reaction.avatar_url !== '') {
			item += '<img src="' + reaction.avatar_url + '"/>';
		} else {

			item += '<img src="' + Dsq.jsonData.media_url + '/images/noavatar92.png"/>';
		}

		var service_icon = (reaction.get_service_name == 'trackback' || reaction.get_service_name == 'pingback' ? 'rss' : reaction.get_service_name.replace(' ', ''));
		item += (reaction.author_url && reaction.author_url !== ''
				? '</a>'
				: '')
			+ '</td>'
			+ '<td><cite class="dsq-comment-cite">' + reaction.author_name + '</cite> <span class="dsq-comment-header-time">' + reaction.date_created + '</span></td>'
			+ '<td class="dsq-comment-header-likes"></td>'
			+ '</tr></table></div>' // end dsq-comment-header
			+ '<div class="dsq-reaction-header" \
				<table> \
					<tr> \
						<td class="dsq-reaction-header-left">'
							+ '<img class="dsq-service-icon" src="' + Dsq.jsonData.media_url + '/images/reactions/services/' + service_icon + '.png" />'
							+ ' From <a class="dsq-service-name" target="_blank" href="' + reaction.url + '">' + reaction.get_service_name + '</a> '
							+ 'via <a href="' + reaction.source_url + '">' + (reaction.source == 'backtype' ? 'BackType' : 'UberVU') + '</a>'
						+ '</td>'
						+ '<td class="dsq-reaction-header-right">';

			if(reaction.retweets) {
				var num_retweets = reaction.retweets.length;
				if (num_retweets > 0) {
					if (num_retweets == 1) {
						item += 'One more retweet from <a href="' + reaction.retweets[0].url + '">'  + reaction.retweets[0].author_name + '</a>';
					} else {
						item += (num_retweets + ' more retweets from ');
						item += '<span id="dsq-reaction-retweets-' + reaction.id + '">';
						var n_tweets = (num_retweets > 3) ? 3 : num_retweets;
						item += Dsq.Templates.showRetweets(reaction.id, n_tweets);
						if (n_tweets != num_retweets) {
							item += '</span> <a onclick="Dsq.Templates.showRetweets(' + reaction.id + ', 0, \'dsq-reaction-retweets-' + reaction.id + '\');'
								+ 'this.parentNode.removeChild(this); return false;" href="#">Show all</a>';
						}
					}
				}
			}	
			item += '</td></tr> \
			</table> \
			</div>' // end dsq-reaction-header
			+ '<div class="dsq-comment-body"> \
				<div class="dsq-comment-message">' + reaction.body + '</div>'
			+ '</div> \
			<div class="dsq-comment-footer"> \
				<div class="dsq-comment-footer-left"> \
				</div>'
				+ (Dsq.jsonData.request.is_moderator || Dsq.jsonData.request.is_global_moderator 
					? ' \
					<div class="dsq-comment-footer-right"> \
						<button class="dsq-button-small dsq-hide-reaction" onclick="Dsq.Reaction.hide(' + reaction.id + ')">Hide</button> \
					</div>'
					: '')
			+ '</div>'
		item += '</li>'; /* Reaction HTML ends */
		return item;
	};

	this.reactions = function() {
		var html, reaction;

		if (Dsq.jsonData.reactions === undefined || Dsq.jsonData.reactions.length === 0) {
			return '';
		}

		html = '';
		for (var i = 0; reaction = Dsq.jsonData.reactions[i]; i++) {
			var item = Dsq.Templates.generateReactionHTML(reaction);
			if (item) {
				html += item;
			}
		}

		if (Dsq.jsonData.has_more_reactions) {
			var d = Dsq.jsonData.settings.disqus_url;
			var f = Dsq.jsonData.forum.url;
			var t = Dsq.jsonData.thread.id;
			var s = Dsq.jsonData.reactions_start;
			var l = Dsq.jsonData.reactions_limit;

			var handler = 'Dsq.Utils.execScript(\'' + d + '/forums/' + f + '/more_reactions.js?t=' + t + '&s=' + s + '&l=' + l + '\', true); return false;';
			html += '<li id="dsq-show-more-reactions" class="dsq-show-more-reactions"><button class="dsq-button-small" onclick="' + handler + '">Show more reactions</button></li>';
		}

		return '<h3 id="dsq-reactions-title" class="dsq-h3-reactions">Reactions</h3><ul id="dsq-reactions" class="dsq-reactions">' + html + '</ul>';
	};
	
	this._popupGeneric = function(content) {
		return ' \
		<div class="dsq-popup-container"> \
			<table> \
				<tbody> \
					<tr> \
						<td class="dsq-popup-tl"></td><td class="dsq-popup-b"></td><td class="dsq-popup-tr"></td> \
					</tr> \
					<tr> \
						<td class="dsq-popup-b"></td> \
						<td class="dsq-popup-body"> \
							<div class="dsq-popup-content"> \
								<div class="dsq-popup-title"> \
									<button class="dsq-button-small" style="float:right" onclick="Dsq.Popup._closePopup(null, true)">Close</button>' 
									+ content['header'] 
								+ '</div>'
								+ content['body']
							+ '</div> \
							<div class="powered-by"><a href="http://disqus.com/comments/">Powered by <img src="http://media.disqus.com/images/embed/disqus-logo.png" alt="Disqus Comments" style="margin-bottom:-5px" /></a></div> \
						</td> \
						<td class="dsq-popup-b"></td> \
					</tr> \
					<tr> \
						<td class="dsq-popup-bl"></td><td class="dsq-popup-b"></td><td class="dsq-popup-br"></td> \
					</tr> \
				</tbody> \
			</table> \
		</div> \
		';
	};



	
	this.chooseSubscribe = function(post_id) {

		var pid = post_id ? '-' + post_id : '';
		var menu = Dsq.$('dsq-subscribe-menu' + pid);
		
		menu.style.display = menu.style.display == 'block' ? 'none' : 'block';
		
	};
	
	this.setSubscribe = function(value, el, post_id) {

		var pid = post_id ? '-' + post_id : '';
		var input = Dsq.$('dsq-subscribe-on-post' + pid);
		var select = Dsq.$('dsq-subscribe-select' + pid);
		var menu = Dsq.$('dsq-subscribe-menu' + pid);
		
		select.innerHTML = el.innerHTML;
		input.value = value;
		this.chooseSubscribe(post_id);
	};
	
	this.getFormFields = function(post_id) {

		var fields = {};
		var pid = post_id ? '-' + post_id : '';
		var name = Dsq.$('dsq-field-name' + pid);
		var email = Dsq.$('dsq-field-email' + pid);
		var website = Dsq.$('dsq-field-website' + pid);
		var username = Dsq.$('dsq-field-username' + pid);
		var password = Dsq.$('dsq-field-password' + pid);

		fields = {
			'name': name,
			'email': email,
			'website': website,
			'username': username,
			'password': password
		}
		
		return fields;
	}
	
	this.validateFields = function(post_id) {
		
		if(Dsq.jsonData.request.is_authenticated) { return true; }
		
		var fields = Dsq.Templates.getFormFields(post_id);
		
		var nameField = fields.name;
		var websiteField = fields.website;
		var emailField = fields.email;
		
		websiteField.value = (websiteField.value == Dsq.Templates.placeholder['website']) ? '' : websiteField.value;
		
		var v = [{

			validator: Dsq.Validators.name,
			value: nameField.value
		}, {

			validator: Dsq.Validators.email,
			value: emailField.value
		}, {

			validator: Dsq.Validators.url,
			value: websiteField.value
		}];
		
		return Dsq.Validators.validate(v, function(e) { Dsq.Popup.popModal(e, 'Oops...') } );
	};
	
	this.checkExistingUser = function(post_id) {
		var fields = Dsq.Templates.getFormFields(post_id);		
		Dsq.Popup.loading(post_id);
		
		if (post_id) {
			Dsq.frames['reply_' + post_id].getUserByEmail(fields.email.value);
		} else {
			Dsq.frames['reply_0'].getUserByEmail(fields.email.value);
		}
	};

	this.validateAuth = function(el_clicked, post_id, auth_choice) {
		var fields = Dsq.Templates.getFormFields(post_id);
		var email = fields.email ? fields.email.value : '';
		var username = fields.username ? fields.username.value : '';
		var password = fields.password ? fields.password.value : '';
		
		Dsq.Templates.setLoadingButton(el_clicked, post_id);
		
		if (post_id) {
			Dsq.frames['reply_' + post_id].validateAuth(auth_choice, email, username, password);
		} else {
			Dsq.frames['reply_0'].validateAuth(auth_choice, email, username, password);
		}
	};

	this.lightboxUpdateEmail = function(post_id, new_email) {
		var fields = Dsq.Templates.getFormFields(post_id);
		fields.email.value = new_email;
	};

	this.lightboxAuthenticate = function(post_id, auth_choice, auth_data) {
		var title, body;
		var pid = post_id ? '-' + post_id : '';

		if(typeof(auth_data) == 'undefined') {
			var auth_data = Dsq.Templates.getFormFields(post_id);
		}

		d = auth_data;

		switch(auth_choice) {
			case 'register':
				var suggestedUsername = d.name.value.replace(/[^a-zA-Z0-9-]/g,'').toLowerCase();
			
				title = Dsq.jsonData.forum.allow_anon_post ? 'Optional:' : 'Required:';
				title += ' Register a <img src="http://media.disqus.com/images/embed/disqus-profile.png" alt=Disqus Profile" />';

				body = ' \
				<ul class="dsq-lightbox-register-reasons"> \
				<li>Verify your comments</li> \
				<li>Edit and delete comments</li> \
				<li>Manage comments and replies</li> \
				</ul> \
				';

				body += ' \
				<div class="dsq-lightbox-auth-fields"> \
					<table> \
						<tr> \
							<td>Email</td> \
							<td><input type="text" value="' + d.email.value + '" onchange="Dsq.Templates.lightboxUpdateEmail(' + post_id + ', this.value)" /><div id="dsq-email-errors' + pid + '"></div></td> \
						</tr> \
						<tr> \
							<td>Username</td> \
							<td><input id="dsq-field-username' + pid + '" type="text" value="' + suggestedUsername + '"/><div id="dsq-username-errors' + pid + '"></div></td> \
						</tr> \
						<tr> \
							<td>Password</td> \
							<td><input id="dsq-field-password' + pid + '" type="password" /><div id="dsq-password-errors' + pid + '"></div></td> \
						</tr> \
					</table> \
					<div class="dsq-lightbox-switch-auth"><a href="#" onclick="Dsq.Templates.lightboxAuthenticate(' + post_id + ',\'login\'); return false">Login instead</a></div> \
				</div> \
				<div id="dsq-lightbox-errors' + pid + '" class="dsq-lightbox-errors"></div> \
				<div class="dsq-lightbox-submit"> \
					<div class="dsq-lightbox-auth-post"><button class="dsq-button" onclick="Dsq.Templates.validateAuth(this, ' + post_id + ',\'' + auth_choice + '\')">Register and Post comment</button></div>'
					+ (Dsq.jsonData.forum.allow_anon_post
						? '<div class="dsq-lightbox-auth-skip"><button class="dsq-button-small" onclick="Dsq.Templates.postComment(' + post_id + ', this, true)">Just post as a Guest</button></div>'
						: '')
				+ '</div> \
				';
				break;
			case 'login':
				title = Dsq.jsonData.forum.allow_anon_post ? 'Optional:' : 'Required:';
				title += ' Login to your <img src="http://media.disqus.com/images/embed/disqus-profile.png" alt=Disqus Profile" />';
				body = '';
				
				if(d.avatar_url) {
					body += '<div class="dsq-lightbox-recognized"><table><tr>';
					body += '<td><img src="' + d.avatar_url + '" alt="" /></td>';
					body += '<td><span class="dsq-badge ' + (d.verified ? 'dsq-badge-verified' : 'dsq-badge-registered') + '">' + (d.verified ? 'Verified' : 'Registered') + '</span></td>';
					body += '<td>Hey <strong>' + d.display_name + '</strong>, is that you? Login below to claim this comment.';
					body += '</tr></table></div>';
				}

				body += ' \
				<div class="dsq-lightbox-auth-fields"> \
					<table> \
						<tr> \
							<td>Username or Email</td> \
							<td><input id="dsq-field-username' + pid + '" type="text" value="' + (d.avatar_url ? d.username : '') + '" /></td> \
						</tr> \
						<tr> \
							<td>Password <a href="http://disqus.com/forgot" target="_blank">(cannot log in?)</a></td> \
							<td><input id="dsq-field-password' + pid + '" type="password" /></td> \
						</tr> \
					</table> \
					<div class="dsq-lightbox-switch-auth"><a href="#" onclick="Dsq.Templates.lightboxAuthenticate(' + post_id + ',\'register\'); return false">Register instead</a></div> \
				</div> \
				<div id="dsq-lightbox-errors' + pid + '" class="dsq-lightbox-errors"></div> \
				<div class="dsq-lightbox-submit"> \
					<div class="dsq-lightbox-auth-post"><button class="dsq-button" onclick="Dsq.Templates.validateAuth(this, ' + post_id + ',\'' + auth_choice + '\')">Login and Post comment</button></div>'
					+ (Dsq.jsonData.forum.allow_anon_post
						? '<div class="dsq-lightbox-auth-skip"><button class="dsq-button-small" onclick="Dsq.Templates.postComment(' + post_id + ', this, true)">Just post as a Guest</button></div>'
						: '')
				+ '</div> \
				';
				break;
			default:
				break;
		}
		Dsq.Popup.lightbox(body, title, post_id);
		Dsq.$('dsq-field-username' + pid).focus();
	};
	
	this.buttonsToRestore = [];
	this.setLoadingButton = function(btn, post_id) {
		var pid = post_id ? '-' + post_id : '';
		if (btn) {

			var loadingBtn = document.createElement('button');
			loadingBtn.id = btn.id + '-loading';
			loadingBtn.innerHTML = '<img src="http://media.disqus.com/images/loading-lite.gif" alt="" /> Just a moment...';
			loadingBtn.className = btn.className + ' dsq-post-loading';
			btn.parentNode.appendChild(loadingBtn);
			btn.style.display = 'none';
			var cancelBtn = Dsq.$('dsq-cancel-button' + pid);
			if(cancelBtn) { cancelBtn.style.display = 'none'; this.buttonsToRestore.push(cancelBtn); }
			this.buttonsToRestore.push(btn);
		} else {

			var buttons = this.buttonsToRestore;
			for(var i = 0; i < buttons.length; i++) {
				buttons[i].style.display = 'inline';
				Dsq.Utils.deleteNode(Dsq.$(buttons[i].id + '-loading'));
			}
		}
		
	};

	this.postComment = function(post_id, el_clicked, force, auth_choice) {
		var append_id = post_id ? '-' + post_id : '';
		var fields = Dsq.Templates.getFormFields(post_id);

		if (Dsq.Templates.validateFields(post_id)) {

			if (!Dsq.jsonData.request.is_authenticated && !force &&
				((!Dsq.Utils.readCookie('skipped_auth') && !disqus_skip_auth && !Dsq.jsonData.forum.disqus_auth_disabled) || !Dsq.jsonData.forum.allow_anon_post)) {
				Dsq.Templates.checkExistingUser(post_id);
				return false;
			}
			var params = [];
			if (!Dsq.jsonData.request.is_authenticated) {
				params.push(fields.name.value,
					fields.email.value,
					fields.website.value);

				if (auth_choice == 'login' || auth_choice == 'register') {
					params.push({
						auth_choice: auth_choice,
						username: fields.username.value,
						password: fields.password.value,
						email: fields.email.value
					});
				} else {
					params.push(null);
				}

				params.push(null /* sharing options */, Dsq.$('dsq-subscribe-on-post' + append_id).value);
			} else {
				var service_checked = function(name) {
					var el = Dsq.$('dsq-sharing-' + name + append_id);
					return (el !== null && el.checked === true) ? '1' : '0';
				};
				params.push(null, null, null, null, {
					tw: service_checked('twitter'),
					fb: service_checked('facebook'),
					tr: service_checked('tumblr'),
					wp: service_checked('wordpress'),
					mt: service_checked('movabletype'),
					tp: service_checked('typepad'),
					yh: service_checked('yahoo')
				});
			}

			var frame = Dsq.frames['reply_' + (post_id ? post_id : 0)];
			frame.post.apply(frame, params);

			if (el_clicked) {
				Dsq.Templates.setLoadingButton(el_clicked, post_id);
			}
			
			if (force) {
				Dsq.Utils.createCookie('skipped_auth', true);	
			}
			
		} else {
			return false;
		}
	};

	this.editComment = function(el_clicked, post_id) {
		var edited_message = Dsq.$('dsq-edit-textarea-' + post_id).value;

		Dsq.Templates.setLoadingButton(el_clicked, post_id);
		Dsq.frames['edit_' + post_id].edit(post_id, edited_message);
	};

	this.toggleEdit = function(post_id) {
		var body = Dsq.$('dsq-comment-body-' + post_id);
		var message = Dsq.$('dsq-comment-message-' + post_id);

		if (!Dsq.Post.stateEditToggled[post_id]) {


			message.style.display = 'none';
			if (Dsq.$('dsq-edit-' + post_id)) {
				Dsq.$('dsq-edit-' + post_id).style.display = 'block';
			} else {

				var edit_area = document.createElement('div');
				edit_area.id = 'dsq-edit-' + post_id;
				edit_area.className = 'dsq-edit dsq-textarea';
				edit_area.innerHTML = ' \
				<div class="dsq-textarea-wrapper"> \
					<textarea class="dsq-edit-textarea" id="dsq-edit-textarea-' + post_id + '">' + message.innerHTML + '</textarea> \
				</div> \
				<div class="dsq-save-edit"> \
					<button onclick="Dsq.Templates.editComment(this, ' + post_id + ')" class="dsq-button-small">Save Edit</button> \
				</div> \
				<div id="dsq-edit-iframe-' + post_id + '" style="display: none"></div> \
				';

				body.appendChild(edit_area);

				if (!Dsq.frames['edit_' + post_id]) {
					var _meta = Dsq.jsonData.posts[post_id];
					Dsq.frames['edit_' + post_id] = new Dsq.ReplyFrame(Dsq.$('dsq-edit-iframe-' + post_id), post_id);
					Dsq.frames['edit_' + post_id].init();
					Dsq.frames['edit_' + post_id].setState(post_id, _meta.depth);
				}
			}
		} else {

			message.style.display = 'block';
			Dsq.$('dsq-edit-' + post_id).style.display = 'none';
		}
		
		Dsq.Post.stateEditToggled[post_id] = !Dsq.Post.stateEditToggled[post_id];
	};
	
	this.edit = function(el, post_id) {

		Dsq.Templates.toggleEdit(post_id);
	};

	this.toggleReply = function(post_id, button) {
		
		if(!this.stateReplyToggled[post_id]) {

			if (Dsq.$('dsq-reply-post-' + post_id)) {
				Dsq.$('dsq-append-post-' + post_id).style.display = 'block';
			} else {
				Dsq.$('dsq-append-post-' + post_id).innerHTML = Dsq.Templates.postBox(post_id);
				var container = Dsq.$('dsq-textarea-wrapper-' + post_id);
				if (!Dsq.frames['reply_' + post_id] && container) {
					var _meta = Dsq.jsonData.posts[post_id];
					Dsq.frames['reply_' + post_id] = new Dsq.ReplyFrame(container, post_id);
					Dsq.frames['reply_' + post_id].init(function() {

						Dsq.$('dsq-append-post-' + post_id).innerHTML = Dsq.Templates.postBox(post_id, true);
						Dsq.$('dsq-form-area-' + post_id).innerHTML = '';

						var theme = (typeof disqus_frame_theme == 'undefined') ? 'default' : disqus_frame_theme;
						Dsq.Iframes.showReplyIframeInContainer(Dsq.$('dsq-form-area-' + post_id), post_id, {theme: theme});

					});
					Dsq.frames['reply_' + post_id].setState(post_id, _meta.depth);
				}
			}
			Dsq.$('dsq-append-post-' + post_id).className = 'dsq-append-post';
			Dsq.$('dsq-comment-footer-reply-' + post_id).className = 'dsq-comment-footer-reply-active';
			
		} else {

			Dsq.$('dsq-append-post-' + post_id).style.display = 'none';
			Dsq.$('dsq-append-post-' + post_id).className = '';
			Dsq.$('dsq-comment-footer-reply-' + post_id).className = 'dsq-comment-footer-reply';
		}
		
		this.stateReplyToggled[post_id] = !this.stateReplyToggled[post_id];

		if(Dsq.Utils.ie && this.stateReplyToggled[post_id]) {

		}

		Dsq.Events.fire(Dsq.Events.REPLY_IFRAME_TOGGLED, {
			postId: post_id,
			opened: this.stateReplyToggled[post_id]
		});
	};
	
	this.moderateOptions = function(post_id) {
		var _meta = Dsq.jsonData.posts[post_id];
		var userData = Dsq.jsonData['users'][_meta.user_key];
		
		if(!Dsq.jsonData.request.is_moderator && !Dsq.jsonData.request.is_global_moderator) { return false; }

		var html;
		
		html = ' \
		<div class="dsq-moderate-options"> \
		<table>'
		+ (_meta.email ? '<tr><td>Email</td><td>' + _meta.email + '</td></tr>' : '')
		+ (_meta.ip ? '<tr><td>IP address</td><td>' + _meta.ip + '</td></tr>' : '')
		+ '<tr> \
			<td>Actions</td> \
			<td><ul>'
			+ (Dsq.jsonData.request.moderator_can_edit
				? '<li><a href="#" onclick="Dsq.Post.edit(this, ' + post_id + '); Dsq.Popup._closePopup(null, true); return false;">Edit Comment</a></li>'
				: '')
			+ '<li><a href="#" onclick="Dsq.Post.removePost(' + post_id + ', 1); Dsq.Popup._closePopup(null, true); return false;">Delete Comment</a></li> \
			<li><a href="#" onclick="Dsq.Post.reportSpam(' + post_id + '); Dsq.Popup._closePopup(null, true); return false;">Mark Spam</a></li> \
			<li><a href="#" onclick="Dsq.Popup.blacklist(' + post_id + '); return false">Block User</a></li> \
			</ul></td> \
			</table> \
		</div> \
		';
		
		html += '<p>Go to the full <a href="http://disqus.com/comments/moderate/" target="_blank">moderate panel</a> for more options.</p>';
		
		return Dsq.Popup.popModal(html, 'Moderate Options', post_id);
	};
	
	this.placeholder = {
		'class': 'dsq-placeholder',
		'name': Dsq.Strings.NAME,
		'email': Dsq.Strings.EMAIL,
		'website': Dsq.Strings.WEBSITE + ' (' + Dsq.Strings.OPTIONAL.toLowerCase() + ')'
	};
	
	this.handlePlaceholder = function(evt, el, key) {
		var placeholder = Dsq.Templates.placeholder[key];
		var className = Dsq.Templates.placeholder['class'];
		
		switch(evt.type) {
			case 'focus':
				if(el.value == placeholder) {
					el.value = '';
					el.className = '';
				}
				break;

			case 'blur':
				if(el.value == '') {
					el.value = placeholder;
					el.className = className;
				}
				break;
			default:
				break;
		}
	};
	
	this.paginate = function(page, el_clicked) {

		var extra_params = '';

		if(typeof disqus_per_page != 'undefined') {
			extra_params += '&per_page=' + disqus_per_page;
		}
		if(typeof disqus_sort != 'undefined') {
			extra_params += '&sort=' + disqus_sort;
		}

		Dsq.$('dsq-pagination').innerHTML += '<img src="http://media.disqus.com/images/loading-small.gif">';
		
		if(el_clicked) {
			Dsq.Templates.setLoadingButton(el_clicked);
		}
		
		Dsq.Utils.execScript('http://disqus.com/forums/kyle-brady/thread.js'
			+ '?slug='	+ 'how_i_won_a_copyfight'
			+ '&p='		+ page
			+ extra_params);
	};
	
	
	this.rate = function(el, id, vote) {


		if(Dsq.jsonData.request.is_authenticated || Dsq.jsonData.forum.allow_anon_votes) {
			if(vote == 1) {
				Dsq.$('dsq-like-' + id).innerHTML = '<img src="http://media.disqus.com/images/loading-small.gif">';
			}
			Dsq.Utils.execScript('http://disqus.com/forums/kyle-brady/vote.js'
				+ '?post_id='    + id
				+ '&vote='        + vote);
		} else {
			Dsq.Popup.login('To rate, please log in');
		}
	};

	this.voted = function(post_id, points, vote) {

		Dsq.$('dsq-like-pts-' + post_id).innerHTML = points + Dsq.Utils.pluralize(points, ' person', ' people') + ' liked this.';

		if(vote) {
			Dsq.$('dsq-like-' + post_id).innerHTML = 'You liked this.&nbsp;&nbsp;';
		}
	};




	this.postComment_onSuccess = function(response, parent_post_id, post_id) {
		var approved = response.message.post_meta.approved;

		if (parent_post_id) {
			Dsq.Post.toggleReply(parent_post_id);
		}

		Dsq.Popup._closePopup(null, true);
		
		if (approved) {
			Dsq.Post.incrementPostCount();
			Dsq.Post.outlineComment(post_id);
		} else {			
			var unapproved_msg = 'Thanks for posting!\
	 Your comment must be approved by a moderator before appearing here.\
			';
			Dsq.Popup.popModal(unapproved_msg, 'Comment awaiting approval', post_id);
		}

		var sharing_results = response.message.sharing_results;
		var sharing_errors = '';
		for (var service in sharing_results) {
			if (sharing_results.hasOwnProperty(service) === true) {
				if (sharing_results[service].error === true) {
					sharing_errors += service + ', ';
				}
			}
		}

		if (sharing_results.facebook && sharing_results.facebook.callback) {
			FB.ensureInit(function() {
				FB.Connect.streamPublish('', sharing_results.facebook.attachment);
			});
		}

		if (sharing_errors !== '') {
			var message = 'Your comment was posted, but there were errors sharing with the following connections: ';
			message += sharing_errors.replace(/,\s$/, '');
			message += '<p><a href="' + Dsq.jsonData.settings.disqus_url + '/profile/connections" target="_blank">Configure your connections here</a></p>'
			Dsq.Popup.popModal(message, 'Sharing options');
		}

		Dsq.Templates.setLoadingButton(false);
	};

	this.postComment_onFailure = function(response, parent_post_id, post_id) {

		Dsq.Templates.setLoadingButton(false);
	};
};




// TODO: It might be faster to use string methods to find all <li (...) </li> blocks and pass to Dsq.PostHandler manually.
Dsq.CommentsHandler = function(str, head, post_id, content, tail, offset, s) {
	var prepend_post = Dsq.Templates.prependPost(post_id);
	var append_post = Dsq.Templates.appendPost(post_id);

	content = content.replace(Dsq.POST_RE, Dsq.PostHandler);
	Dsq.Templates.postLoopCounter++;
	head = Dsq.Templates.Filters.commentContainer(post_id, head);
	return prepend_post + head + content + tail + append_post;
};

Dsq.PostHandler = function(str, h_head, post_id, h_content, h_tail, b_head, b_content, b_tail, offset, s) {
	var prepend_header = Dsq.Templates.postPrependHeader(post_id);
	var append_header = Dsq.Templates.postAppendHeader(post_id);
	var prepend_body = Dsq.Templates.preBody(post_id);
	var append_body = Dsq.Templates.postBody(post_id);
	var append_footer = Dsq.Templates.postFooter(post_id);

	b_content = b_content.replace(Dsq.POST_BODY_RE, Dsq.PostBodyHandler);
	return h_head + prepend_header + h_content + append_header + h_tail + b_head + prepend_body + b_content + append_body + b_tail + append_footer;
};

Dsq.PostBodyHandler = function(str, head, post_id, content, tail, offset, s) {
	content = Dsq.Templates.Filters.commentContent(post_id, content);
	return head + content + tail;
};

Dsq.MediaPostHandler = function(str, args, offset, s) {
	args = args.split(' ');
	if(args[0] == 'seesmic') {
		return '<br />' + Dsq.Templates.mediaSeesmic(args[1], args[2]);
	}
	return '';
};


/**
 * Shorcuts
 */
Dsq.$ = function(element) { return document.getElementById(element); };
Dsq.$b = document.body || document.getElementsByTagName('body')[0];


/**
 * Dsq.Debug: Logging functions.
 */

Dsq.Debug = new function() {this.log=function(s){};this.profile=function(f){if(typeof f == 'function')return f();else return eval(f);};};


/**
 * Dsq.Urls: URL paths
 */
Dsq.Urls = new function() {
	this.LOGIN = '/profile/login/';
	this.LOGOUT = '/logout/';
	this.REPLY = 'http://kyle-brady.disqus.com/how_i_won_a_copyfight/reply.html';
	this.REQUEST_USER_PROFILE = '/AnonymousUser/';
	this.REQUEST_USER_AVATAR = 'http://media.disqus.com/images/noavatar92.png';
};
// Dsq.Urls

/**
 * Dsq.Validators: Validation for form fields
 */
Dsq.Validators = new function() {
	this.VALID_EMAIL_RE = /^[a-z0-9\-\_\+]+(\.[a-z0-9\-\_\+]+)*\@(([a-z0-9\-\_\+]+(\.[a-z0-9\-\_\+]+)*)+\.[a-z]{2,}|([0-9]+\.){3}[0-9]+)$/i;
	this.name = function(name) {
		var error = false;

		if(typeof Dsq.Templates.placeholder !== 'undefined' &&
		   name == Dsq.Templates.placeholder.name) {
			error = true;
		}
		if(name.length <= 1) {
			error = true;
		}

		if(error) {
			return "Please enter a name to comment.";
		} else {
			return true;
		}
	};
	this.email = function(addr) {
		if(Dsq.Validators.VALID_EMAIL_RE.test(addr)) {
			return true;
		} else {
			return "Please enter a valid email to comment.";
		}
	};
	this.url = function(addr) {
		if(!addr || addr.indexOf('.') != -1) {
			return true;
		} else {
			return "Please check your website URL (this field is optional).";
		}
	};

	this.validate = function(bulk_validation, failure_callback) {
		failure_callback = failure_callback || function(e){ alert(e); };

		for(var i = 0; i < bulk_validation.length; i++) {
			v = bulk_validation[i];
			ret = v.validator(v.value);
			if(ret !== true) {
				failure_callback(ret);
				return false;
			}
		}
		return true;
	};
};

/**
 * Dsq.Utils: Generic utility functions.
 */
Dsq.Utils = new function() {
	this.ie = /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent);
	this.ie7 = (document.all && !window.opera && window.XMLHttpRequest) ? true : false;
	this.ie6 = (!window.XMLHttpRequest) ? true: false;
	this.webkit = navigator.userAgent.indexOf('AppleWebKit/') >= 0;
	this.gebiFromElementCollectionCache = {};
	this._styleSheet = null;

	this.gebiFromElement = function(el, id, tag) {
		// This only method only helps IE.
		if(!this.ie) {
			return Dsq.$(id);
		} else {
			var cacheKey = el.id + '-' + tag;
			tag = tag || 'div';
			if(typeof this.gebiFromElementCollectionCache[cacheKey] != 'undefined') {
				collection = this.gebiFromElementCollectionCache[cacheKey];
			} else {
				collection = el.getElementsByTagName(tag);
				this.gebiFromElementCollectionCache[cacheKey] = collection;
			}

			for(var i = 0; i < collection.length; i++) {
				if(collection[i].id == id) {
					return collection[i];
				}
			}
			return null;
		}
	};

	this.execOnReady = function(func) {
		var node = document.createElement('document:ready');
		try {
			node.doScroll('left');
			func();
			node = null;
		} catch(err) {
			setTimeout(function() { Dsq.Utils.execOnReady(func); }, 10);
		}
	};


	// Courtesy of http://www.quirksmode.org/js/cookies.html
	this.createCookie = function(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	};

	this.readCookie = function(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	};

	this.eraseCookie = function(name) {
		Dsq.Utils.createCookie(name,"",-1);
	};

	this.deleteNode = function(node) {
		if(node) {
			this.deleteChildren(node);
			if(typeof node.outerHTML != 'undefined') { node.outerHTML = ''; }
			else if(node.parentNode) { node.parentNode.removeChild(node); }
			delete node;
		}
	};

	this.deleteChildren = function(node) {
		if(node) {
			for(var x = node.childNodes.length-1; x >= 0; x--) {
				var childNode = node.childNodes[x];
				if(childNode.hasChildNodes()) { this.deleteChildren(childNode); }
				if(typeof childNode.outerHTML != 'undefined') { childNode.outerHTML = ''; }
				else node.removeChild(childNode);
				delete childNode;
			}
		}
	};

	this.findPos = function(obj) {
		var curleft = 0;
		var curtop = 0;
		if (obj.offsetParent) {
			do {
				curleft += obj.offsetLeft;
				curtop += obj.offsetTop;
			} while (obj = obj.offsetParent);
		}
		return [curleft,curtop];
	};

	this.getWindowSize = function() {
		var windowWidth = -1;
		var windowHeight = -1;

		if(typeof(window.innerWidth) == 'number') { //Non-IE
			windowWidth = window.innerWidth;
			windowHeight = window.innerHeight;
		} else if(document.documentElement) { // IE 6+ in 'standards compliant mode'
			windowWidth = document.documentElement.clientWidth || document.body.clientWidth;
			windowHeight = document.documentElement.clientHeight || document.body.clientHeight;
		}

		return [windowWidth, windowHeight];
	}

	this.getScrollPos = function() {
		var scrollWidth, scrollTop;

		if(document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollWidth)) {
			scrollWidth = document.documentElement.scrollWidth;
			// IE is weird here.  If no doctype is provided, document.body.scrollTop is 0,
			// otherwise document.documentElement.scrollTop is 0.
			scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
		} else if(document.body.scrollTop && document.body.scrollWidth) {
			scrollWidth = document.body.scrollWidth;
			scrollTop = document.body.scrollTop;
		}

		return [scrollWidth, scrollTop];
	}

	this.addEventListener = function(instance, eventName, listener) {
		var listenerFn = listener;
		if (instance.addEventListener) {
			instance.addEventListener(eventName, listenerFn, false);
		} else if (instance.attachEvent) {
			listenerFn = function() {
				listener(window.event);
			};
			instance.attachEvent("on" + eventName, listenerFn);
		} else {
			throw new Error("Event registration not supported");
		}
		return {
			instance: instance,
			name: eventName,
			listener: listenerFn
		};
	};

	this.removeEventListener = function(event) {
		var instance = event.instance;
		if (instance.removeEventListener) {
			instance.removeEventListener(event.name, event.listener, false);
		} else if (instance.detachEvent) {
			instance.detachEvent("on" + event.name, event.listener);
		}
	};

	this.fixIframesIE = function(id) {
		var disqusThread = Dsq.$(disqus_container_id);
		var iframes = disqusThread.getElementsByTagName('iframe');

		if(id) {
			var container = Dsq.$(id);
		} else {
			var container = Dsq.$('dsq-content');
		}

		for(i = 0; i < iframes.length; i++) {
			if (container) {
				iframes[i].style.width = container.offsetWidth;
			}
		}
	};

	this.getElementsByClassName = function(oElm, strTagName, strClassName) {
	/* Credit: Jonathan Snook [http://www.snook.ca/jonathan], Robert Nyman [http://www.robertnyman.com] */
		var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
		var arrReturnElements = new Array();
		strClassName = strClassName.replace(/\-/g, "\\-");
		var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		var oElement;
		for(var i = 0; i < arrElements.length; i++) {
			oElement = arrElements[i];
			if(oRegExp.test(oElement.className)) {
				arrReturnElements.push(oElement);
			}
		}
		return (arrReturnElements);
	};

	this.postToUrl = function(url, post_data, opt_redirect) {
		var form = document.createElement('form');
		var iframe_container = document.createElement('div');
		var id = 'dsq-temp-iframe-' + (new Date()).getTime();

		form.method = 'POST';
		form.action = url;
		if (!opt_redirect) {
			form.target = id;
		}
		iframe_container.innerHTML = '<iframe style="display:none" name="' + id + '" id="' + id + '"></iframe>';

		for(var key in post_data) {
			if(post_data.hasOwnProperty(key)) {
				var input = document.createElement('input');
				input.name = key;
				input.type = 'hidden';
				input.value = post_data[key];

				form.appendChild(input);
			}
		}

		Dsq.$b.appendChild(iframe_container);
		Dsq.$b.appendChild(form);
		form.submit();
	};

	// Strips integer id from id of element in the form ('some-id-###')
	this.extractId = function(e) {
		var chunks = e.id.split('-');
		if(chunks.length <= 1) {
			return 0;
		} else {
			return parseInt(chunks[chunks.length-1]);
		}
	};

	this.getStyle = function(el, styleProp) {
		if(el.currentStyle) {
			var y = el.currentStyle[styleProp];
		} else if(window.getComputedStyle) {
			var y = document.defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
		}

		if(y == 'transparent' || y == '') {
			this.getStyle(el.parentNode, styleProp);
		} else {
			return y;
		}
	};

	this.execScript = function(url, append_qs, container) {
		var script = document.createElement('script');
		append_qs = typeof append_qs == 'undefined' ? true : append_qs;
		container = container || Dsq.container;

		if(append_qs) {
			var j = (url.indexOf('?') >= 0) ? '&' : '?';
			url += j + (new Date()).getTime();
		}
		script.type = 'text/javascript';
		script.charset = 'UTF-8';
		script.src = url;
		container.appendChild(script);
		return script;
	};

	this.pluralize = function(num, singular, plural) {
		return (num != 1) ? plural || 's' : singular || '';
	};

	this.getRequestParams = function(queryString /* optional */) {
		var pairs, tuple;
		var params = {};

		queryString = queryString || window.location.search.substring(1);
		pairs = queryString.split('&');

		for (var i = 0, pair; pair = pairs[i]; i++) {
			tuple = pair.split('=');
			params[tuple[0]] = (tuple[1] || true);
		}

		return params;
	};

	this.addCssRule = function(selector, styleText, index) {
		var stylesheet;
		index = index || 0;

		if(!this._styleSheet) {
			var styleEl = document.createElement('style');
			document.getElementsByTagName('head')[0].appendChild(styleEl);
			this._styleSheet = styleEl.sheet;
			if(!this._styleSheet) {
				// IE does not like our newly created stylesheet.
				this._styleSheet = document.styleSheets[document.styleSheets.length-1];
			}
		}
		stylesheet = this._styleSheet;

		if(stylesheet.insertRule) {
			var ruleText = selector + ' { ' + styleText + ' }';
			if(index == -1) {
				index = stylesheet.cssRules.length;
			}
			stylesheet.insertRule(ruleText, index);
		} else if(stylesheet.addRule) {
			stylesheet.addRule(selector, styleText, index);
		}
	};

	this.forEachIn = function(obj, callback) {
		for(var key in obj) {
			if(obj.hasOwnProperty(key)) {
				callback(key, obj[key]);
			}
		}
	};

	this._interpolateGlobalContext = {
		// values that get used a lot and are global to the request
		'profile_url': Dsq.Urls.REQUEST_USER_PROFILE,

		'disqus_url': Dsq.jsonData.settings.disqus_url,
		'media_url': Dsq.jsonData.settings.media_url,
		'request_username': Dsq.jsonData.request.username,
		'request_display_username': Dsq.jsonData.request.display_username,
		'forum_name': Dsq.jsonData.forum.name
	};

	this.renderFromContextStack = function(key, contexts) {
		// Returns the first instance of `key` in the array of objects `contexts` or else ''
		for (var i=0; i<contexts.length; i++) {
			if (contexts[i][key] !== undefined) {
				return String(contexts[i][key]);
			}
		}
		throw new Error('key ' + key + ' not found in context');
	};

	var that = this;
	this.interpolate = function(fmt, opt_localContext) {
		// Interpolate `fmt` named-format string with an assumed global context.
		// Based on `interpolate` in django.views.i18n
		var contextStack = [opt_localContext || {}, that._interpolateGlobalContext];
		return fmt.replace(/%\(\w+\)s/g, function(match){
			return that.renderFromContextStack(match.slice(2,-2), contextStack);
		});
	};

	this.stripTags = function(s) {
		// Removes HTML tags from `s`
		return s.replace(/(<([^>]+)>)/g,"");

	};

	this.assert = function(b) {
		if (!b) {
			throw new Error('Assertion error.');
		}
	};

};
// Dsq.Utils

/**
 * Dsq.Popup: Popup helper functions.
 */
Dsq.Popup = new function() {
	this.timeHide = new Array();
	this.timeShow = new Array();
	this.activePopup = {};
	this.profileCache = {};
	this.statusCache = {};

	this.showTimer = function(post_id) {
		// clear the hide timer
		clearTimeout(this.timeHide[post_id]);

		// start the timer
		if(!Dsq.Popup.profileIsOn && !Dsq.Thread.adminIsOn) {
			this.timeShow[post_id] = setTimeout("Dsq.Popup.popProfile(\"" + post_id + "\")", 400);
		}
	};

	this.hideTimer = function(post_id) {
		// clear the show timer
		clearTimeout(this.timeShow[post_id]);
	};

	this.updateProfile = function(username) {
		// Callback from /embed/profile.js
		if (this.statusCache[username]) {
			var statusEl = Dsq.$('dsq-profile-status-' + username);
			statusEl.innerHTML = this.statusCache[username];
			statusEl.style.display = 'block';
		}

		if (this.profileCache[username]) {
			var _cache = this.profileCache[username];

			var _genhtml = function(text) { return '<span><big>' + text + '</big></span>'; };
			var _no_comments = _genhtml(Dsq.FmtStrings.NUMBER_OF_COMMENTS(_cache.comments_count));
			var _no_likes = _genhtml(Dsq.FmtStrings.NUMBER_OF_LIKES(_cache.likes_count));
			var _no_points = _genhtml(Dsq.FmtStrings.NUMBER_OF_POINTS(_cache.points));

			var statsEl = Dsq.$('dsq-popup-profile-user-stats-' + username);
			statsEl.innerHTML = '';

			if (Dsq.jsonData.users[username].registered) {
				statsEl.innerHTML = _no_comments + _no_likes;
			}
			statsEl.innerHTML += _no_points;

			var activeSites = '';
			for (var i = 0; i < _cache.active_sites.length; i++) {
				var site = _cache.active_sites[i];
				activeSites += '<li><a href="' + site.url + '"> \
					<img src="' + site.favicon + '"/ width="16" height="16"/></a>\
					<a href="' + site.url + '">' + site.name + '</a></li>';
			}
			if (activeSites !== '') {
				Dsq.$('dsq-popup-profile-active-sites-' + username).innerHTML = activeSites;
			} else {
				Dsq.$('dsq-popup-profile-active-sites-' + username).innerHTML = 'This site.';
			}

			var moderatedSites = '';
			for (var i = 0; i < _cache.moderated_sites.length; i++) {
				var site = _cache.moderated_sites[i];
				moderatedSites += '<li><a href="' + site.url + '"> \
					<img src="' + site.favicon + '"/ width="16" height="16"/></a>\
					<a href="' + site.url + '">' + site.name + '</a></li>';
			}
			if (moderatedSites !== '') {
				Dsq.$('dsq-popup-profile-moderated-' + username).innerHTML = moderatedSites;
			} else {
				Dsq.$('dsq-popup-profile-moderated-wrapper-' + username).innerHTML = '';
			}
		}

		// Reposition popup after full HTML is rendered
		if(Dsq.Popup.activePopup && Dsq.Popup.activePopup.el) {
			Dsq.Popup.initPopup(Dsq.Popup.activePopup.el, Dsq.Popup.activePopup.id, Dsq.Popup.activePopup.type);
		}

	};

	this.showCookieMsgs = function() {
		var title = '';
		var message = '';
		var numAlerts = 0;

		Dsq.Utils.forEachIn(Dsq.jsonData.cookie_messages, function(k, v) {
			if (!v) return;

			switch(k) {
				// Cookie: Twitter
				case 'post_twitter':
					if (v === 'error') {
						title = 'Twitter Error!';
						message += '<li id="dsq-msg-twitter-error">Oops, we couldn\'t tweet this comment. Please check your <a href="http://disqus.com/account/services">account settings</a>.</li>';
					} else {
						var _msg = v.split(':');
						title = 'Tweeted!';
						message += '<li id="dsq-msg-twitter-success">Your comment was successfully tweeted. <a href="http://twitter.com/' + _msg[0] + '/status/' + _msg[1] + '">Click here to view the tweet</a>.</li>';
					}
					break;
				// Cookie: Unapproved Post
				case 'post_not_approved':
					title = 'Comment awaiting approval by a moderator';
					message += '<li id="dsq-msg-post-not-approved">Your comment must be approved by a moderator before appearing here.</li>';
					break;
				// Cookie: Profile Found
				case 'post_has_profile':
					title = 'Use your existing commenter profile';
					message += '<li id="dsq-msg-post-has-profile">You have just posted your commment as a <span class="dsq-badge-guest">Guest</span>, but you may already have a <span class="logo-disqus">Disqus</span> Profile.<br /><br /><a href="http://disqus.com/claim">Log in and claim this comment!</a></li>';
					break;
				case 'user_created':
					var _data = v.split(':');
					title = 'Profile created!';
					message += '<li id="dsq-msg-user-created">You have just created a <span class="logo-disqus">Disqus</span> Profile, the best way to claim, manage, and track your comments all over the web. \
					<br /><br />A confirmation is being sent to <strong>' + _data[1] + '</strong>. Please check for this email in order to verify your profile. \
					<ul class="dsq-list-tick"> \
						<li>Your username is <strong>' + _data[0] +'</strong>. <a href="http://disqus.com/people/' + _data[0] + '/" target="_blank">Click here to view your public profile</a>.</li> \
						<li>Be sure to set your profile picture, as well as connect your <span class="dsq-badge-facebook">Facebook</span> and <span class="dsq-badge-twitter">Twitter</span> accounts. <a href="http://disqus.com/account/" target="_blank">Click here for account settings</a>.</li> \
					</ul> \
					</li>'
					break;
				default:
					break;
			}
			numAlerts++;
		});

		if(numAlerts > 1) {
			message = '<ul class="dsq-list-bluebullet">' + message;
			message += '</ul>';
			title = 'Thanks for posting!';
		}
		if(numAlerts > 0) {
			if(typeof(disqus_cookie_msgs) == 'function') {
				disqus_cookie_msgs(message, title);
			} else {
				Dsq.Popup.popModal(message, title);
			}
		}
	};

	this.helpBadges = function(post_id) {
		var html = ' \
			<ul class="dsq-popup-help"> \
				<li><span class="dsq-badge dsq-badge-verified">Verified</span> has a <span class="logo-disqus">Disqus</span> Profile with a confirmed email address.</li> \
				<li><span class="dsq-badge dsq-badge-registered">Registered</span> has a <span class="logo-disqus">Disqus</span> Profile, but has not yet confirmed his or her email address.</li> \
				<li><span class="dsq-badge dsq-badge-guest">Guest</span> is not logged in with any account and has not claimed his or her comments.</li> \
				<li class="dsq-help-otheraccts">Other accounts</li> \
				<li><span class="dsq-badge dsq-badge-facebook">Facebook</span> is using his or her Facebook profile via Facebook Connect.</li> \
				<li><span class="dsq-badge dsq-badge-twitter">Twitter</span> is using his or her Twitter profile via Twitter Sign-in.</li> \
				<li><span class="dsq-badge dsq-badge-openid">OpenID</span> is using his or her OpenID.</li> \
			</ul> \
		';

		this.popModal(html, 'Help: Types of Commenters', post_id);
		return;
	};

	this.permalink = function(post_id) {
		var header = 'Link to this comment';
		var body = '<strong>You are anchored to</strong>:<br />' + document.location.protocol + '//' + document.location.host + document.location.pathname + document.location.search + '#comment-' + post_id;

		this.popModal(body, header, post_id);
	};

	this.login = function(header, body) {
		var h = header || 'Login or Register';
		var b = body || '';
		b += Dsq.Templates.frameLogin({id: 'dsq-popup-login'});
		b += '</iframe>'; // HACK: Sometimes there is something funky with the IFRAME SRC that causes no end tag
		this.popModal(b, h, null, true, 'dsq-popup-login');
	};

	this.blacklist = function(id) {
		var _meta = Dsq.jsonData.posts[id];
		var userData = Dsq.jsonData['users'][_meta.user_key];
		var title = 'Add to Blacklist';
		var message = ' \
		Adding this person to the blacklist will block him or her from commenting on this site. Check the following types that you would like to add to the blacklist:'
		+ (userData['registered'] ?
			'<div class="dsq-blacklist-option"> \
				<input id="dsq-blacklist-username" type="checkbox" checked> \
				<label for="dsq-blacklist-username"><strong>Username</strong>: ' + userData['username'] + '</label> \
			</div>'
			: '')
		+ (_meta.email ?
			'<div class="dsq-blacklist-option"> \
				<input id="dsq-blacklist-email" type="checkbox" checked> \
				<label for="dsq-blacklist-email"><strong>Email address</strong>: ' + _meta.email + '</label> \
			</div>'
			: '')
		+ '<div class="dsq-blacklist-option"> \
			<input id="dsq-blacklist-ip" type="checkbox" onclick="Dsq.$(\'dsq-blacklist-ip-warning\').style.display=\'block\'"> \
			<label for="dsq-blacklist-ip"><strong>IP address</strong>: ' + _meta.ip + '</label> \
		</div> \
		';

		message += ' \
			<p id="dsq-blacklist-ip-warning" style="display:none">	\
				Note: Blocking this person\'s IP address may also unintentionally prevent others, who share his/her IP address, from commenting on this site. \
				This may include people who are sharing the same computer, living in the same house, or using the same Internet provider. Only block an IP address as a last resort. \
			</p> \
		';

		message += ' \
			<p style="text-align:center"><button onclick="Dsq.Post.blockUser(' + id + '); this.disabled=true; this.innerHTML=\'Just one moment...\'">Add to Blacklist</button></p> \
		';

		Dsq.Popup.popModal(message, title);
	};

	this.remoteAccountSettings = function() {
		var body = '';
		// Set up IFrame.
		var params = {};
		var base_url = 'http://disqus.com/forums/kyle-brady/_auth/embed/remote_settings/';
		var attributes = {id: 'dsq-popup-account-settings'};
		if (typeof disqus_frame_theme != 'undefined') {
			params['theme'] = disqus_frame_theme;
		}

		body = Dsq.Templates._frameGeneric(base_url, params, attributes);
		this.popModal(body, 'Account Settings', null, true, 'dsq-popup-account-settings');
	};

	this.popModal = function(message, title, post_id, use_listener, extra_classes) {
		var container = document.createElement('div');
		var header, body;

		Dsq.Popup._closePopup(null, true);

		if(typeof(title) == 'undefined') { title = ''; }
		if(typeof(use_listener) == 'undefined') { use_listener = true; }

		if(post_id) {
			container.id = 'dsq-popup-message-' + post_id;
		} else {
			container.id = 'dsq-popup-message';
		}

		header = title;
		body = message;

		container.innerHTML = Dsq.Templates.popupModal(header, body);
		Dsq.Popup.initPopup(container, post_id, 'message', extra_classes);
		if(use_listener) {
			Dsq.Popup.popupListener = Dsq.Utils.addEventListener(document, 'mouseup', Dsq.Popup._closePopup);
		}
	};

	this.popAlert = this.popModal;

	this.loading = function(post_id) {
		var title = Dsq.Strings.JUST_A_MOMENT;
		var body = '<div style="text-align:center; padding: 5px 0 10px 0"><img src="http://media.disqus.com/images/loading.gif" alt="" /></div>'
		Dsq.Popup.lightbox(body, title, post_id);
	};

	this.lightbox = function(message, title, post_id) {
		// Wraps Dsq.Popup.popModal

		var overlay = document.createElement('div');
		overlay.id = 'dsq-overlay';
		overlay.className = 'dsq-overlay';
		Dsq.$b.appendChild(overlay);
		
		Dsq.Popup.popModal(message, title, post_id, false, 'dsq-lightbox');
	};

	this.popProfile = function(post_id, userKey) {
		var post = Dsq.jsonData['posts'][post_id];
		if (post && post.has_been_anonymized) {
			Dsq.Popup.popModal('This message was anonymized by its previous owner.', 'Anonymized', post_id);
			return;
		}

		if(post_id) {
			userKey = Dsq.jsonData['posts'][post_id].user_key;	
		}
		var userData = Dsq.jsonData['users'][userKey];
		var elId = 'dsq-popup-profile-' + userKey;
		var container = document.createElement('div');

		if(this.activePopup.el) {
			this._closePopup(null, true);
			if(this.activePopup.linkClicked) {
				this.activePopup.linkClicked = false;
				return;
			}
		}

		container.id = elId;
		container.innerHTML = Dsq.Templates.popupProfile(userKey);

		this.initPopup(container, post_id, 'profile');
		this.popupListener = Dsq.Utils.addEventListener(document, 'mouseup', this._closePopup);

		if(!this.profileCache[userKey]) {
			Dsq.Utils.execScript('http://disqus.com/embed/profile.js'
				+ '?username=' + userKey
				+ '&anon=' + (userData['registered'] ? 0 : 1)
				+ '&f=' + Dsq.jsonData['request'].forum);
		} else {
			this.updateProfile(userKey);
		}
	};

	this._closePopup = function(e, force) {
		var activePopup = Dsq.Popup.activePopup.el;
		var id = Dsq.Popup.activePopup.id;
		var link = 'dsq-avatar-' + id; // HACK: Specific to profile toggle target

		// HACK: This event should be gone if there is no active popup.
		if(!activePopup) {
			return;
		}
		if(force || !Dsq.Popup.isClicked(e, activePopup.id)) {
			// TODO: This is breaking iE?
			if(Dsq.Popup.popupListener) {
				Dsq.Utils.removeEventListener(Dsq.Popup.popupListener);
			}
			
			// Kill overlay
			var overlay = Dsq.$('dsq-overlay');
			if(overlay) { Dsq.Utils.deleteNode(overlay); }
			
			try {
				Dsq.Utils.deleteNode(activePopup);
			} catch(e) {
				// HACK: IE6 throws an error when using deleteNode() with a node containing a <table> in the html.
				activePopup.parentNode.removeChild(activePopup);
			}
			Dsq.Popup.activePopup = {};
		}

		if(!force && Dsq.Popup.isClicked(e, link)) {
 			Dsq.Popup.activePopup.linkClicked = true;
		}

	};

	this.initPopup = function(popup, post_id, type, extra_classes) {
		popup.className = 'dsq-popup dsq-popup-' + type + ' ' + (extra_classes ? extra_classes : '');
		if(Dsq.Utils.ie6 || Dsq.Utils.ie7) {
			// HACK: We can't modify the body before it's ready, so we need
			//       to use an IE-safe "DOMReady" workaround before loading
			//       our popup.
			Dsq.Utils.execOnReady(function() {Dsq.$b.appendChild(popup); });
		} else {
			Dsq.$b.appendChild(popup);
		}

		popup.style.display = 'block';

		var xPos = (Dsq.Utils.getWindowSize()[0] - popup.offsetWidth) / 2;
		var yPos = (Dsq.Utils.getWindowSize()[1] - popup.offsetHeight) / 2;

		if(Dsq.Utils.ie6) {
			yPos += Dsq.Utils.getScrollPos()[1];
		}

		popup.style.left = xPos + 'px';
		popup.style.top = yPos + 'px';

		Dsq.Popup.activePopup = {
			'el' : popup,
			'id' : post_id,
			'type': type,
			'linkClicked' : false
		};
	};

	this.isClicked = function(e, id) {
		var t = e.target || e.srcElement;
		while(t && t.parentNode) {
			if(t.id == id) {
				return true;
			}

			t = t.parentNode;
		}
		return false;
	};
};
// Dsq.Popup

/**
 * Dsq.Templates
 */
Dsq.Templates = new function() {
	/*
	 * Counter keeping track of the number of posts iterated over.
	 */
	this.postLoopCounter = 0;
	this.filters = {};
	this.addPostContainer = 'dsq-post-add';
	this.textareaContainer = 'dsq-post-add';

	this.registerTemplate = function(name, func) {
		this['$$_' + name] = func;

		if(typeof DsqLocal.Filters != 'undefined'
		&& typeof DsqLocal.Filters[name] == 'function') {
			// Push filters to this.filters to unify code.
			this.filters[name] = this.filters[name] || [];
			this.filters[name].push(DsqLocal.Filters[name]);
		}

		this[name] = function() {
			var ret;

			if(typeof DsqLocal.Templates != 'undefined'
			&& typeof DsqLocal.Templates[name] == 'function') {
				ret = DsqLocal.Templates[name].apply(this, arguments);
			}

			if(ret === undefined) {
				ret = this['$$_' + name].apply(this, arguments);
			}

			if(this.filters[name]) {
				var args = [ret];

				args.push.apply(args, arguments);
				for(var i = 0; i < this.filters[name].length; i++) {
					ret = this.filters[name][i].apply(this, args);
				}
			}

			return ret;
		};
	};

	this.registerFilter = function(name, func) {
		this.filters[name] = this.filters[name] || [];
		this.filters[name].push(func);
	};

	/**
	 * Dsq.Templates.Filters
	 */
	this.Filters = new function() {
		this.commentContainer = function(post_id, s) {
			var _meta = Dsq.jsonData.posts[post_id];
			var classes = [];
			if(Dsq.jsonData.request.page > 1) {
				classes.push('dsq-append');
			}

			//
			// Extra classes used for custom themes
			//

			if(_meta.depth) {
				classes.push('dsq-comment-child', 'dsq-depth-' + _meta.depth, 'dsq-parent-is-' + _meta.parent_post_id);
			}


			//

			if(_meta.author_is_creator) {
				// TODO: We need to deprecate the "special" class since it is not properly prefixed.
				classes.push('special', 'dsq-special');
			}
			if(_meta.author_is_moderator) {
				classes.push('dsq-moderator');
			}
			classes.push(['dsq-odd', 'dsq-even'][Dsq.Templates.postLoopCounter % 2]);

			s = s.substring(0, s.lastIndexOf('>'));
			return s + ' class="dsq-comment ' + classes.join(' ') + '" style="margin-left:' + _meta.depth*30 + 'px">';
		};

		this.commentContent = function(post_id, s) {
			var _meta = Dsq.jsonData.posts[post_id];
			if (_meta.killed) {
				return '<em>Comment removed.</em>';
			} else if (!_meta.approved) {
				return '<em>This comment was flagged for review.</em>';
			}

			s = s.replace(Dsq.MEDIA_POST_RE, Dsq.MediaPostHandler);
			return s;
		};
	};

	//
	// Thread
	//
	// TODO: These need to be stripped of all Django template tags.

	this.authPost = function() {
		if (!Dsq.jsonData.context.show_reply) {
			return '';
		}
		var result = [];
		result = result.concat([
				'<div id="dsq-auth"',
						Dsq.jsonData.integration.reply_position ? 'class="dsq-auth-bottom"' : '',
						'>',
					'<div class="dsq-by">',
						'<a href="http://disqus.com" target="_blank">',
							(Dsq.jsonData.integration.disqus_logo ?
								Dsq.Utils.interpolate('<img src="%(media_url)s/images/embed/by-disqus.png" alt="discussion by DISQUS">') :
								Dsq.Utils.interpolate('<img src="%(media_url)s/images/embed/dsq-button-120x19.png" alt="discussion by DISQUS">')
							),
						'</a>',
					'</div>',
					'<div class="dsq-auth-header">',
						'<h3 id="dsq-add-new-comment" class="dsq-h3-addcomment">',
								Dsq.Strings.ADD_NEW_COMMENT,
						'</h3>',
						'<div id="dsq-login">',
						(!Dsq.jsonData.request.is_authenticated && Dsq.jsonData.forum.allow_anon_post
								? '<p class="dsq-login-message" id="dsq-login-message">You are commenting as a <a class="dsq-help" title="Click for more information" href="#" onclick="Dsq.Popup.helpBadges(); return false">Guest</a>. You may select one to log into:</p>'
								: '')
		]);
		if (!Dsq.jsonData.request.is_authenticated) {
			result = result.concat([
							Dsq.Utils.interpolate(
								'<a id="dsq-login-toggle" href="%(disqus_url)s%(login_url)s?next=article:%(thread_id)s" onclick="Dsq.Popup.login(); return false"><img class="dsq-login-icon" src="%(media_url)s/images/dsq-profile-btn.png" title="%(log_into)s" alt="%(log_into)s"/></a>',
								{login_url: Dsq.Urls.LOGIN, thread_id: Dsq.jsonData.thread.id, log_into: Dsq.Strings.LOG_INTO_DISQUS}
								),
							'&nbsp; ',
							(Dsq.jsonData.context.use_fb_connect ?
								'<div id="dsq-fbc-login" onlogin="DisqusFbcParentController.onLogin()" size="medium" background="light" length="short" style="display:inline; margin-right:7px"></div>' :
								''
							),
							(Dsq.jsonData.context.use_twitter_signin ?
								Dsq.Utils.interpolate(
									'<div id="dsq-twitter-login" class="dsq-twitter-login" onclick="Dsq.Twitter.startTwitterConnect();" style="display:inline; cursor: pointer"><img src="%(media_url)s/images/twitter-signin-short.png" style="margin-right:7px" /></div>', {}) : ''),
							(Dsq.jsonData.context.use_openid ?
								Dsq.Utils.interpolate(
									'<div id="dsq-openid-login" class="dsq-openid-login" onclick="Dsq.OpenID.requestURL();" style="display:inline; cursor:pointer;"><img src="%(media_url)s/images/openid-login-button.png"/></div>', {}
								) : '')
			]);
		}
		result = result.concat([
						'</div>', // dsq-login
					'</div>', // dsq-auth-header
					'<div id="dsq-authenticated" class="dsq-authenticated" ',
						Dsq.jsonData.request.is_authenticated ? 'style="display:block"' : '',
						'>',
						'<div class="dsq-authenticated-pic">',
								Dsq.Utils.interpolate('<a href="%(url)s" title="%(request_display_username)s">' +
																			'<img class="dsq-post-avatar" src="%(avatar_url)s" alt="" /></a>',
																			{avatar_url: Dsq.Urls.REQUEST_USER_AVATAR,
																			url: (Dsq.jsonData.request.is_remote
																					 ? Dsq.jsonData.request.url
																					 : Dsq.jsonData.settings.disqus_url + Dsq.Urls.REQUEST_USER_PROFILE) }),
						'</div>',
						'<div class="dsq-authenticated-info">',
							'<ul>',
								'<li>',
									(Dsq.jsonData.request.is_remote
										? Dsq.FmtStrings.LOGGED_IN_AS(
												Dsq.Utils.interpolate('<a href="%(url)s" title="%(request_display_username)s">%(request_display_username)s</a>', {url:Dsq.jsonData.request.url})
										  )
										: Dsq.FmtStrings.LOGGED_IN_AS(
												Dsq.Utils.interpolate('<a href="%(disqus_url)s%(profile_url)s" title="%(request_display_username)s">%(request_display_username)s</a>')
											)
									),
								'</li>',
								'<li class="logout">',
									(!Dsq.jsonData.request.is_remote
										? Dsq.Utils.interpolate('<img class="dsq-login-icon" src="%(media_url)s/images/dsqicon12.png" alt="%(logged_in_as)s"/>&nbsp',
											{logged_in_as: Dsq.FmtStrings.LOGGED_IN_AS(Dsq.jsonData.request.display_username)})
										: ''),

									(!Dsq.jsonData.request.is_remote
										? Dsq.Utils.interpolate('<a href="%(disqus_url)s%(logout_url)s?ctkn=%(csrf_token)s" title="%(logout_from_disqus)s">',
											{logout_url: Dsq.Urls.LOGOUT, csrf_token: Dsq.CSRF_TOKEN, logout_from_disqus: Dsq.FmtStrings.LOGOUT_FROM('DISQUS')})
										: ((Dsq.jsonData.request.remote_domain == 'twitter')
												? Dsq.Utils.interpolate('using Twitter (<a href="%(disqus_url)s%(logout_url)s?ctkn=%(csrf_token)s" title="Logout">Logout</a>)',
												 {logout_url: Dsq.Urls.LOGOUT, csrf_token: Dsq.CSRF_TOKEN})
												: ((Dsq.jsonData.request.remote_domain == 'openid')
													 ? Dsq.Utils.interpolate('using OpenID (<a href="%(disqus_url)s%(logout_url)s?ctkn=%(csrf_token)s" title="Logout">Logout</a>)',
													 {logout_url: Dsq.Urls.LOGOUT, csrf_token: Dsq.CSRF_TOKEN})
													 : ''
													)
											)
									),

									(!Dsq.jsonData.request.is_remote ? Dsq.FmtStrings.LOGOUT_FROM('<span class="logo-disqus">DISQUS</span>') : ''),
									'</a>',
								'</li>',
							'</ul>',
						'</div>',
					'</div>'
		]);
		if (Dsq.jsonData.context.use_fb_connect) {
			result = result.concat([
					'<div id="dsq-fbc-authenticated" class="dsq-authenticated">',
						'<div id="dsq-fbc-profilepic" class="dsq-authenticated-pic" uid="loggedinuser" type="FB.XFBML.ProfilePic" size="square" facebook-logo="true"></div>',
						'<div class="dsq-authenticated-info">',
							'<ul>',
								'<li>',
									'Logged in as <span id="dsq-fbc-name" uid="loggedinuser" type="FB.XFBML.Name" linked="true" useyou="false"></span>',
								'</li>',
								'<li class="logout">using Facebook Connect <a href="#" onclick="javascript:DisqusFbcParentController.logout();return false;">(Logout)</a></li>',
							'</ul>',
						'</div>',
					'</div>'
			]);
		}
		result = result.concat([
				'</div>', // dsq-auth
				'<div id="dsq-toolbar-items">',
				'</div>'
		]);
		result = result.concat([
					//
					//
					//
				((!Dsq.jsonData.forum.allow_anon_post && !Dsq.jsonData.request.is_authenticated) ?
					// Needs to be translated:
					('<p id="dsq-no-anon-msg">Required: Please log into <span class="logo-disqus">Disqus</span> ' +
					(Dsq.jsonData.context.use_fb_connect ? 'or connect with Facebook ' : '') +
					(Dsq.jsonData.context.use_twitter_signin ? 'or sign in with Twitter ' : '') +
					(Dsq.jsonData.context.use_openid ? 'or sign in using OpenID ' : '') +
					Dsq.Utils.interpolate('to comment on <strong>%(forum_name)s</strong>.</p>')) :
					''
				),
				'<div id="dsq-post-add"></div>',
				'<div style="margin:10px 0">',
				((Dsq.jsonData.forum.use_media) ?
						'<a href="#" id="dsq-media-link" onclick="Dsq.Post.showMenu(this, false, \'media\'); return false">' + Dsq.Strings.USE_MEDIA + ' <small>&#9660;</small></a>' :
						''),
				'</div>'
		]);
		return result.join('');
	};


	this.header = function() {

		var html = '\<h3 id="dsq-comments-count" class="dsq-h3-commentcount">\
	 <span id="dsq-num-posts">62</span> Comments\
	 &nbsp;\
	 <span class="dsq-item-feed">\
	 <a href="http://kyle-brady.disqus.com/how_i_won_a_copyfight/latest.rss"><img src="http://media.disqus.com/images/embed/bullet-feed.png"></a>\
	 </span>\
	 </h3>\
	 <div id="dsq-options" style="margin:15px 0">\
	 <span class="dsq-item-sort">\
	 Sort by\
	 <select id="dsq-sort-select" onchange="Dsq.Thread.sortBy(this.value);">\
	 <option value="hot" selected="selected">Popular now</option>\
	 <option value="best" >Best Rating</option>\
	 <option value="newest" >Newest first</option>\
	 <option value="oldest" >Oldest first</option>\
	 </select>\
	 &nbsp;\
	 </span>\
	 <span class="dsq-item-cp"><a href="http://kyle-brady.disqus.com/how_i_won_a_copyfight/">Community Page</a>&nbsp;&nbsp;&nbsp;</span>\
	 <span class="dsq-item-subscribe">\
	 <img src="http://media.disqus.com/images/embed/email.png" style="width:12px;height:12px;vertical-align:middle">\
	 <span id="dsq-subscribe">\
	 <a href="#" onclick="Dsq.Thread.subscribe(1); return false">Subscribe by email</a>\
	 </span>\
	 </span>\
	 </div>\
	 <div id="dsq-alerts">\
	 </div>\
		';

		
			html = Dsq.Templates.authPost() + html;
		

		
		if (Dsq.jsonData.request.is_moderator) { 
			html = ' \
			<div class="dsq-alert-message dsq-upgrade-message"> \
				<strong>Disqus upgrade available.</strong> Hi ' + Dsq.jsonData.request.display_username + ', this message is being displayed to you because you are a moderator of this site. <a href="#" onclick="Dsq.$(\'dsq-upgrade-message\').style.display=\'block\';this.style.display=\'none\';return false">Click here for details.</a> \
				<div style="display:none; margin-top:10px;" id="dsq-upgrade-message"> \
					A new theme is available with added features. <a href="http://disqus.com/comments/settings/' + Dsq.jsonData.forum.url + '/?p=customize">To change your theme, click here</a> and choose the theme Narcissus. \
					If you do not upgrade, you are missing out on features such as: real-time commenting, new sign-in integrations, and an upgrade interface. \
					<strong>This message will automatically go away in one week.</strong> \
				</div> \
			</div> \
			' + html; 
		}
		return html;
	};

	this.footer = function() {
		var html = Dsq.Templates.pagination();

		

		html += Dsq.Templates.reactions();

		
			html += Dsq.Templates.trackbacks();
		

		return html;
	};

	this.pagination = function() {
		var html = '';
		
		if (Dsq.$('dsq-pagination')) { Dsq.$('dsq-pagination').innerHTML = ''; }
		if (!Dsq.jsonData.thread.paginate) { return ''; }

		//
		// TODO: num_paginator still uses the template tag for pagination, 
		// 		while append_paginator does it all in JavaScript.
		//		This should all be in JavaScript.
		//

		if (Dsq.jsonData.thread.num_pages > 1 && Dsq.jsonData.request.page < Dsq.jsonData.thread.num_pages) {
			html = ' \<a class="dsq-paginate-append-text" href="#" onclick="Dsq.Thread.paginate(Dsq.jsonData.request.page + 1, this); return false">Show more comments...</a>\
	 <button class="dsq-button-small dsq-paginate-append-button" onclick="Dsq.Thread.paginate(Dsq.jsonData.request.page + 1, this);">Load more comments</button>\
			';
		}
		
		if (Dsq.$('dsq-pagination')) {
			Dsq.$('dsq-pagination').innerHTML = html;
			return '';
		} else {
			return '<div id="dsq-pagination" class="dsq-pagination">' + html + '</div>';
		}
	};

	this.trackbacks = function() {
		var html = '';

		if(typeof DsqLocal != 'undefined' && DsqLocal.trackback_url && DsqLocal.trackbacks) {
			var trackbacks = DsqLocal.trackbacks;
			var trackback_url = DsqLocal.trackback_url;
		} else {
			var trackbacks = [
			
			
			];
			var trackback_url = 'http://kyle-brady.disqus.com/how_i_won_a_copyfight/trackback/';
		}

		html += '<div class="dsq-item-trackback">Trackback URL&nbsp;&nbsp;<input class="dsq-trackback-url" onclick="this.select()" readonly="true" value="' + trackback_url + '"></div>';

		if(trackbacks.length) {
			html += '<ul id="dsq-references">'
			for(var i = 0; i < trackbacks.length; i++) {
				var trackback = trackbacks[i];
				html += '<li><cite><a href="' + trackback.author_url + '" rel="nofollow">' + trackback.author_name + '</a></cite> \
						<p class="dsq-meta">' + trackback.date + '</p> \
						<p class="dsq-content">' + trackback.excerpt + '</p></li>';
			}
			html += '</ul>';
			html = '<h3 class="dsq-h3-trackbacks">Trackbacks</h3>' + html;
		}

		return html;
	}

	this.showRetweets = function(id, limit, element_id /* Optional */) {
		var source, html = '';

		for (var i = 0, reaction; reaction = Dsq.jsonData.reactions[i]; i++) {
			if (reaction.id === id) {
				source = reaction.retweets;
			}
		}

		if (source) {
			if (limit === 0) {
				limit = source.length;
			}

			for (var j = 0; j < limit; j++) {
				var rt = source[j];
				html += '<a href="' + rt.url + '">' + rt.author_name + '</a>'	+ ((j === (limit - 1)) ? '.' : ', ');
			}
		}

		if (element_id === undefined) {
			return html;
		}

		var element = document.getElementById(element_id);
		element.innerHTML = html;
		return element;
	};

	this.showMoreReactions = function(reactions, has_more, start, limit) {
		var link = document.getElementById('dsq-show-more-reactions');
		var container = link.parentNode;
		container.removeChild(link);

		for (var i = 0, reaction; reaction = reactions[i]; i++) {
			var el = Dsq.Templates.generateReactionHTML(reaction);
			if (el) {
				container.innerHTML += el;
			}
		}

		if (has_more) {
			var d = Dsq.jsonData.settings.disqus_url;
			var f = Dsq.jsonData.forum.url;
			var t = Dsq.jsonData.thread.id;
			var s = start;
			var l = limit;

			var handler = 'Dsq.Utils.execScript(\'' + d + '/forums/' + f + '/more_reactions.js?t=' + t + '&s=' + s + '&l=' + l + '\', true); return false;';
			container.innerHTML += '<li id="dsq-show-more-reactions"><a href="#" onclick="' + handler + '">Show more reactions</a></li>';
		}
	};

	this.generateReactionHTML = function(reaction) {
		if (reaction.body === null || reaction.body == '') {
			return;
		}

		if (reaction.author_name === '') {
			reaction.author_name = '&nbsp;';
		}

		if (reaction.url === '') {
			reaction.url = reaction.get_service_url;
		}

		/* Reaction HTML begins */
		var item = '<li class="dsq-reaction" id="dsq-reaction-' + reaction.id + '">'
			+ '<div class="dsq-reaction-header">'
			+ '<div class="dsq-header-avatar">';

		if (reaction.author_url && reaction.author_url !== '') {
			item += '<a target="_blank" href="' + reaction.author_url +'">';
		} else {
			item += '<a target="_blank" href="#" onclick="return false;">';
		}

		if (reaction.avatar_url && reaction.avatar_url !== '') {
			item += '<img src="' + reaction.avatar_url + '"/>';
		} else {
			item += '<img src="' + Dsq.jsonData.media_url + '/images/noavatar32.png"/>';
		}

		var service_icon = (reaction.get_service_name == 'trackback' || reaction.get_service_name == 'pingback' ? 'rss' : reaction.get_service_name.replace(' ', ''));
		item += '<img class="dsq-service-icon" src="' + Dsq.jsonData.media_url + '/images/reactions/services/' + service_icon + '.png"/>'
			+ '</a></div>'
			+ '<cite><span>' + reaction.author_name + '</span></cite>'
			+ '<span class="dsq-header-meta"><a class="dsq-header-time">' + reaction.date_created + '</a></span>'
			+ '</div><div class="dsq-reaction-body">'
			+ '<div class="dsq-reaction-message">' + reaction.body + '</div>'
			+ '<div class="dsq-reaction-footer">From <a class="dsq-service-name" target="_blank" href="' + reaction.url + '">' + reaction.get_service_name + '</a> '
			+ 'via <a href="' + reaction.source_url + '">' + (reaction.source == 'backtype' ? 'BackType' : 'UberVU') + '</a>'
			+ (Dsq.jsonData.request.is_moderator || Dsq.jsonData.request.is_global_moderator ? '&nbsp;&bull;&nbsp;<a class="dsq-hide-reaction" href="#" onclick="Dsq.Reaction.hide(' + reaction.id + '); return false;">Hide</a>' : '') + '</div></div>';

		if(reaction.retweets) {
			var num_retweets = reaction.retweets.length;
			if (num_retweets > 0) {
				item += '<div class="dsq-reaction-retweets">';
				if (num_retweets == 1) {
					item += 'One more retweet from <a href="' + reaction.retweets[0].url + '">'  + reaction.retweets[0].author_name + '</a>';
				} else {
					item += (num_retweets + ' more retweets from ');

					item += '<span id="dsq-reaction-retweets-' + reaction.id + '">';
					var n_tweets = (num_retweets > 15) ? 15 : num_retweets;
					item += Dsq.Templates.showRetweets(reaction.id, n_tweets);

					if (n_tweets != num_retweets) {
						item += '</span> <a onclick="Dsq.Templates.showRetweets(' + reaction.id + ', 0, \'dsq-reaction-retweets-' + reaction.id + '\');'
							+ 'this.parentNode.removeChild(this); return false;" href="#">Show all</a>';
					}
				}
				item += '</div>';
			}
		}

		item += '</li>'; /* Reaction HTML ends */
		return item;
	};

	this.reactions = function() {
		var html, reaction;

		if (Dsq.jsonData.reactions === undefined || Dsq.jsonData.reactions.length === 0) {
			return '';
		}

		html = '';
		for (var i = 0; reaction = Dsq.jsonData.reactions[i]; i++) {
			var item = Dsq.Templates.generateReactionHTML(reaction);
			if (item) {
				html += item;
			}
		}

		if (Dsq.jsonData.has_more_reactions) {
			var d = Dsq.jsonData.settings.disqus_url;
			var f = Dsq.jsonData.forum.url;
			var t = Dsq.jsonData.thread.id;
			var s = Dsq.jsonData.reactions_start;
			var l = Dsq.jsonData.reactions_limit;

			var handler = 'Dsq.Utils.execScript(\'' + d + '/forums/' + f + '/more_reactions.js?t=' + t + '&s=' + s + '&l=' + l + '\', true); return false;';
			html += '<li id="dsq-show-more-reactions"><a href="#" onclick="' + handler + '">Show more reactions</a></li>';
		}

		return '<h3 class="dsq-h3-reactions">Reactions</h3><ul id="dsq-reactions" class="dsq-reactions">' + html + '</ul>';
	};
	
	this.missingPermissions = function() {
		return '';
	};

	//
	// Post
	//

	this.prependPost = function(post_id) {
		var html = '<div id="comment-' + post_id + '"></div>';
		return html;
	};

	this.appendPost = function(post_id) {
		var html = '<div id="dsq-comment-reply-' + post_id + '"></div>';
		return html;
	};

	this.postPrependHeader = function(post_id) {
		var _meta = Dsq.jsonData.posts[post_id];
		var userData = Dsq.jsonData['users'][_meta.user_key];

		var _includeServices = function() {
			var userServices = Dsq.Post.getUserServices(null, post_id);
			var html = '';
			var hiddenThreshold = 3; // Define # of services to show before stuffing them in hidden div

			for(var i = 0; i < userServices.length; i++) {
				html +=
				(i == hiddenThreshold
					? '<li id="dsq-drop-hidden-' + post_id +'" class="dsq-drop-hidden"><ul>'
					: '')
				+ '<li class="dsq-drop-services"> \
					<a class="dsq-service-' + userServices[i].name.toLowerCase() + '" href="' + userServices[i].url + '" target="_blank"> \
						<img src="' + Dsq.jsonData.media_url + '/images/embed/services/' + userServices[i].name.toLowerCase() + '.png" alt="' + userServices[i].name.toLowerCase() + '">'
					+ userServices[i].name
					+ '</a> \
				</li>';
			}

			if(i >= hiddenThreshold) {
				html += '</ul></li> \
				<li id="dsq-drop-more-' + post_id + '" class="dsq-drop-more"><a href="#" onclick="Dsq.Post.dropProfileMore(this, '+ post_id + '); return false"><small>&#9660;</small></a></li> \
				';
			}
			return html;
		};

		return ' \
			<div class="dsq-header-avatar" id="dsq-header-avatar-' + post_id + '" onmouseover="Dsq.Post.dropProfile(' + post_id + ')"> \
				<a id="dsq-avatar-' + post_id + '" class="dsq-avatar" href="' + userData.url + '" onclick="Dsq.Popup.popProfile(' + post_id + '); return false;">'
			+ (Dsq.jsonData.forum.show_avatar
				? '<img src="' + Dsq.jsonData.users[_meta.user_key].avatar + '" alt="" />'
				: '')
			+ '</a>'
			+ '</div> \
		';
	};

	this.postAppendHeader = function(post_id) {
		var _meta = Dsq.jsonData.posts[post_id];

		return ''
			+ (_meta.author_is_moderator
				? '<img class="dsq-mod-star" src="http://media.disqus.com/images/bullet-star.png" title="Moderator" alt="" />'
				: '')
			+ '<span class="dsq-header-meta"> \
				<a id="dsq-time-' + post_id + '" class="dsq-header-time" href="#comment-' + post_id + '" title="Permalink">' + _meta.date + '</a> \
			</span>';
	};

	this.preBody = function(post_id) {
		return '';
	}

	this.postBody = function(post_id) {
		// TODO: Deprecate flagging conditional
		var _meta = Dsq.jsonData.posts[post_id];
		return ''
			+ (_meta.edited
				? '<p class="dsq-editedtxt">(Edited by a moderator)</p>'
				: '')
			;
	};

	this.postFooter = function(post_id) {
		// TODO: Use media should be conditional
		var _meta = Dsq.jsonData.posts[post_id];
		if(_meta.killed) { return ''; }

		return ' \
			<div class="dsq-comment-footer" id="dsq-comment-footer-' + post_id + '"> \
				<div id="dsq-points-' + post_id + '" class="dsq-likedtxt">'
				+ (_meta.points
					? _meta.points + Dsq.Utils.pluralize(_meta.points, ' person', ' people') + ' liked this comment.'
					: '')
				+ '</div>'
				+ '<ul class="dsq-comment-options dsq-list-style">'
				+ (_meta.votable
					? '<li class="dsq-list-first dsq-rate" id="dsq-rate-cont-' + post_id + '">'
					+ (!_meta.up_voted
						? '<a href="#" onclick="Dsq.Post.rate(this, ' + post_id + ', 1); return false;">Like</a>'
						: 'You liked this.') + '</li>'
					: '')
				+ '<li class="dsq-report' + (!_meta.votable ? ' dsq-list-first' : '') + '" id="dsq-post-report-' + post_id + '"><a href="#" class="dsq-post-report" onclick="Dsq.Post.report(' + post_id + ', false); return false;">Report</a></li> \
				</ul> \
				<ul class="dsq-list-style">'
				+ (_meta.can_reply
					? '<li class="dsq-list-first"><a href="#" id="dsq-reply-link-' + post_id +'" onclick="Dsq.Post.toggleReply(this, ' + post_id +'); return false;">Reply</a></li>'
					: '')
				+ (_meta.can_reply && !_meta.has_replies && _meta.from_request_user
					? '<li id="dsq-edit-el-' + post_id + '"><a id="dsq-edit-link-' + post_id + '" href="#" onclick="Dsq.Post.edit(this, ' + post_id + '); return false;">Edit</a></li>'
					: '')
				+ '<li class="' + (!_meta.can_reply ? 'dsq-list-first' : '') + '" id="dsq-more-el-' + post_id + '"><a id="dsq-more-link-' + post_id + '" href="#" onclick="Dsq.Post.showMenu(this, ' + post_id + ', \'more\'); return false">More <small>&#9660;</small></a></li>'
				+ (Dsq.jsonData.forum.use_media
					? '<li id="dsq-media-el-' + post_id +'" style="display:none"><a id="dsq-media-link-' + post_id + '" href="#" onclick="Dsq.Post.showMenu(this, ' + post_id + ', \'media\'); return false">Use Media <small>&#9660;</small></a></li>'
					: '')
				+ '</ul>'
				+ '<div id="dsq-reply-bar-' + post_id + '" class="dsq-reply-bar" style="display:none"> \
						<div id="dsq-reply-bar-items-' + post_id + '" class="dsq-reply-bar-items"> \
						</div> \
						<div id="dsq-reply-bar-auth-' + post_id + '" class="dsq-reply-bar-auth"> \
							 \
								 \
								 	<a href="#" class="dsq-help dsq-reply-req-opt" title="You are commenting as a Guest. You may choose to log into an existing DISQUS Profile, your Facebook, Twitter or OpenID account to comment on Kyle Brady: Blog" onclick="Dsq.Popup.helpBadges(); return false">Optional:</a> \
								 \
								<img class="dsq-login-icon" src="http://media.disqus.com/images/dsq-favicon-16x16.png" alt="" /> \
								<a id="dsq-reply-login-' + post_id + '" href="http://disqus.com/profile/login/?next=article:21227305" onclick="Dsq.Popup.login(); return false">Login</a> \
								 \
									&nbsp;or&nbsp; \
									<img class="fb_login_image" src="http://static.ak.fbcdn.net/images/fbconnect/login-buttons/connect_light_small_short.gif" alt="Facebook Connect"/> \
									<a href="#" onclick="FB.Connect.requireSession(DisqusFbcParentController.onLogin); return false;">Connect</a> \
								 \
								&nbsp;or&nbsp; \
									<img src="http://media.disqus.com/images/twitter-signin-icon.png" alt="" /> \
									<a href="#" onclick="Dsq.Twitter.startTwitterConnect(); return false">Sign-in</a> \
								 \
								&nbsp;or&nbsp; \
									 <img src="http://media.disqus.com/images/openid-login-icon.png" alt="" /> \
									 <a href="#" onclick="Dsq.OpenID.requestURL(); return false">OpenID</a> \
								 \
							 \
						</div> \
					</div> \
					<div id="dsq-reply-' + post_id + '"></div> \
			</div> \
		';
	};

	//
	// Iframes
	//

	this._makeAttributes = function(attributes) {
		// Makes a tag attributes string out of an object.
		// Caller is responsible for making sure nothing needs to be escaped.
		var result = [];
		for (key in attributes) {
			result.push(' ' + key + '="' + attributes[key] + '"');
		}
		result = result.join('');
		return result;
	};

	this._frameGeneric = function(base_url, params, attributes) {
		if(typeof(disqus_callback_params) == 'undefined') {
			disqus_callback_params = '';
		}

		var default_params = {
			// TODO: These should be moved to Dsq.jsonData.
			'f'				: 'kyle-brady',
			't'				: 'how_i_won_a_copyfight',
			// Do we need encodeURIComponent here?
			'ifrs'			: encodeURIComponent(disqus_iframe_css),
			'to_redirect'	: encodeURIComponent(window.location),
			'cbp'			: disqus_callback_params,
			'ff'			: Dsq.Thread.ff,
			'fc'			: Dsq.Thread.fc,
			'ac'			: Dsq.Thread.ac,
			'default_text'	: disqus_default_text
		};

		base_url += '?' + (new Date()).getTime();
		// Add params to default_params.
		if(params) {
			for(var key in params) {
				if(params.hasOwnProperty(key)) {
					default_params[key] = encodeURIComponent(params[key]);
				}
			}
		}
		// Build querystring.
		for(var key in default_params) {
			if(default_params[key] && default_params.hasOwnProperty(key)) {
				base_url += '&' + key + '=' + default_params[key];
			}
		}

		return [
			'<iframe marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0"',
			(' allowtransparency="true" src="' + base_url + '"'),
			this._makeAttributes(attributes),
			'</iframe>'].join('');
	};

	this.frameLogin = function(opt_attributes) {
		var params = {};
		var base_url = 'http://disqus.com/embed/login.html';
		var attributes = opt_attributes || {};
		attributes['class'] = 'dsq-post-login';

		if(typeof disqus_frame_theme != 'undefined') {
			params['theme'] = disqus_frame_theme;
		}
		return this._frameGeneric(base_url, params, attributes);
	};

	this.frameReply = function(post_id, extra_params, attributes) {
		// Returns the HTML for a reply iframe. Called by Dsq.Iframes.setReplyIframeToContainer
		var _meta = (typeof post_id != 'undefined') ? Dsq.jsonData.posts[post_id] : false;
		var base_url = Dsq.Urls.REPLY;
		var params = {
			'def_email'		: disqus_def_email,
			'def_name'		: disqus_def_name
		};
		if(extra_params) {
			for(var key in extra_params) {
				if(extra_params.hasOwnProperty(key)) {
					params[key] = extra_params[key];
				}
			}
		}
		if(_meta) {
			params['parent_post'] = post_id;
		}
		if(typeof disqus_per_page != 'undefined') {
			params['per_page'] = disqus_per_page;
		}
		if(typeof disqus_frame_theme != 'undefined') {
			params['theme'] = disqus_frame_theme;
		}
		if(Dsq.jsonData.request.is_authenticated) {
			attributes['class'] += '-authenticated';
		}
		return this._frameGeneric(base_url, params, attributes);
	};

	this.frameEdit = function(post_id) {
		var _meta = (typeof post_id != 'undefined') ? Dsq.jsonData.posts[post_id] : false;
		var base_url = 'http://disqus.com/embed/edit.html';
		var params = {
			'p' : post_id
		};
		return this._frameGeneric(base_url, params, {'class': 'dsq-post-edit', 'name': 'dsq-edit_' + post_id + '-frame'});
	};

	//
	// Menus
	//

	this.menuMore = function(post_id) {
		// TODO: "Remove post" button should hide menu.
		var _meta = Dsq.jsonData.posts[post_id];
		var userData = Dsq.jsonData['users'][_meta.user_key];
		return ' \
			<li><a href="#comment-' + post_id + '" onclick="Dsq.Popup.permalink(' + post_id + ')">Link</a></li> \
			<li><a href="#" onclick="Dsq.Popup.popProfile(' + post_id + '); return false;">Profile</a></li>'
	+ (Dsq.jsonData.request.is_moderator || Dsq.jsonData.request.is_global_moderator
		? '	<li class="dsq-menu-sep"></li>' + (_meta.email ? '<li class="dsq-admin-email">' + _meta.email + '</li>' : '')
		+ '	<li class="dsq-admin-ip">' + _meta.ip + '</li> \
			<li class="dsq-menu-sep"></li>'
		+ (Dsq.jsonData.request.moderator_can_edit
			? ' <li class="dsq-admin-edit"><a href="#" onclick="Dsq.Post.edit(this, ' + post_id + '); return false;">Edit Comment</a></li>'
			: '')
		+ ' <li class="dsq-remove"><a href="#" onclick="Dsq.Post.removePost(' + post_id + ', 1); return false;">Remove Comment</a></li> \
			<li class="dsq-report-spam"><a href="#" onclick="Dsq.Post.reportSpam(' + post_id + '); return false;">Mark Spam</a></li> \
			<li class="dsq-block-user"><a href="#" onclick="Dsq.Popup.blacklist(' + post_id + '); return false">Block User</a></li>'
		: '');
	};

	this.menuMedia = function(post_id) {
		return ' \
			<li><a href="#" onclick="Dsq.Post.toggleMediaReply(this, ' + post_id + ', \'seesmic\'); return false;">Record video</a></li> \
		';
	};

	this.dropProfile = function(post_id) {
		var _meta = Dsq.jsonData.posts[post_id];
		var userData = Dsq.jsonData['users'][_meta.user_key];

		var _includeServices = function() {
			var userServices = Dsq.Post.getUserServices(null, post_id);
			var html = '';
			var hiddenThreshold = 3; // Define # of services to show before stuffing them in hidden div

			for(var i = 0; i < userServices.length; i++) {
				html +=
				(i == hiddenThreshold
					? '<li id="dsq-drop-hidden-' + post_id +'" class="dsq-drop-hidden"><ul>'
					: '')
				+ '<li class="dsq-drop-services"> \
					<a class="dsq-service-' + userServices[i].name.toLowerCase() + '" href="' + userServices[i].url + '" target="_blank"> \
						<img src="' + Dsq.jsonData.media_url + '/images/embed/services/' + userServices[i].name.toLowerCase() + '.png" alt="' + userServices[i].name.toLowerCase() + '">'
					+ userServices[i].name
					+ '</a> \
				</li>';
			}

			if(i >= hiddenThreshold) {
				html += '</ul></li> \
				<li id="dsq-drop-more-' + post_id + '" class="dsq-drop-more"><a href="#" onclick="Dsq.Post.dropProfileMore(this, '+ post_id + '); return false"><small>&#9660;</small></a></li> \
				';
			}
			return html;
		};


		var menu = '<li class="dsq-drop-showlnk"><a href="#" onclick="Dsq.Popup.popProfile(' + post_id + '); return false;">Expand &#8663;</a></li>';
		var pointsMessage = '';
		if (userData['registered']) {
			pointsMessage = 'with ' + userData['points'] + ' points (more points are better).';
		}

		if (userData['is_remote']) {
			var domain = userData['remote_domain_name'];
			menu += '<li class="dsq-drop-badge" title="' + userData['display_name'] + ' is a ' + domain + ' user ' + pointsMessage + '" onclick="Dsq.Popup.helpBadges()">';
			menu += '<span class="dsq-badge-' + domain.toLowerCase() + '">' + domain + '</span></li>';
		} else if (userData['registered']) {
			if (userData['verified']) {
				menu += '<li class="dsq-drop-badge" title="' + userData['display_name'] + ' has a verified commenter profile ' + pointsMessage + '" onclick="Dsq.Popup.helpBadges()">';
				menu += '<span class="dsq-badge-verified">Verified</span></li>';
			} else {
				menu += '<li class="dsq-drop-badge" title="' + userData['display_name'] + ' has a registered, but unverified, commenter profile ' + pointsMessage + '" onclick="Dsq.Popup.helpBadges()">';
				menu += '<span class="dsq-badge-registered">Registered</span></li>';
			}
		} else {
			menu += '<li class="dsq-drop-badge" title="' + userData['display_name'] + ' has not claimed this commenter profile." onclick="Dsq.Popup.helpBadges()"><span class="dsq-badge-guest">Guest</span></li>';
		}

		menu += _includeServices();
		return menu;
	};

	//
	// Popups
	//

	this._popupGeneric = function(content) {
		return ' \
		<div class="dsq-popup-content"> \
			<div class="dsq-popup-top"></div> \
			<div class="dsq-popup-body" class="clearfix"> \
				<div class="dsq-popup-body-padding"> \
					<div class="dsq-popup-header"> \
						<a class="dsq-close-link" href="#" onclick="Dsq.Popup._closePopup(null, true); return false"><img src="http://media.disqus.com/images/modal-close.png" alt="" /></a>'
						+ content['header']
					+ '</div>'
					+ content['body']
					+ '<div class="powered-by"><a href="http://disqus.com/comments/">Powered by <img src="http://media.disqus.com/images/embed/disqus-logo.png" alt="Disqus Comments" style="margin-bottom:-5px" /></a></div> \
				</div> <!-- padding --> \
			</div> <!-- body --> \
			<div class="dsq-popup-bottom"></div> \
		</div> \
		';
	};

	this.popupProfile = function(user_key) {
		var userServices = Dsq.Post.getUserServices(user_key, null);
		var userData = Dsq.jsonData['users'][user_key];
		var headerHtml = '';
		var bodyHtml = '';
		var content = {};

		var _includeServices = function() {
			var html = '';
			for(var i = 0; i < userServices.length; i++) {
				html +=
				(i == 0
					? '<h4>Connections</h4><ul>'
					: '')
				+ '<li> \
					<img src="' + Dsq.jsonData.media_url + '/images/embed/services/' + userServices[i].name.toLowerCase() + '.png" alt="' + userServices[i].name.toLowerCase() + '" title="' + userServices[i].name.toLowerCase() + '" /> \
					<a class="dsq-service-' + userServices[i].name.toLowerCase() + '" href="' + userServices[i].url + '" target="_blank">'
					+ userServices[i].name
					+ '</a> \
				</li>'
				+ (i+1 == userServices.length ? '</ul>' : '');
			}
			return html;
		};

		headerHtml = ' \
			<table> \
				<tr> \
					<td> \
						<a class="dsq-profile-userurl" href="' + userData.url + '"><img class="dsq-popup-profile-avatar" src="' + userData['avatar'] + '" alt="" /></a> \
					</td> \
					<td> \
						<div class="dsq-popup-profile-user"> \
							<h3>' + userData['display_name'] + '</h3> \
							<div class="dsq-popup-profile-user-stats" id="dsq-popup-profile-user-stats-' + user_key + '">Loading...</div> \
						</div> \
					</td> \
				</tr> \
			</table> \
		';

		bodyHtml = ' \
			<div class="dsq-popup-profile-state"> \
				This is a&nbsp;<span class="'
					+ (userData['registered']
						? (userData['verified']
							? ' dsq-badge-verified'
							: (userData['is_remote']
								? ' dsq-badge-' + userData['remote_domain_name'].toLowerCase()
								: ' dsq-badge-registered')
							)
							: ' dsq-badge-guest') + '">'
			+ (userData['registered']
				? (userData['verified']
					? 'Verified'
					: (userData['is_remote']
						 ? userData['remote_domain_name']
						 : 'Registered')
					)
				: 'Guest')
			+ '</span>&nbsp;commenter profile.'
			+ '&nbsp;<a class="dsq-profile-userurl" href="' + userData.url + '"><strong>View more comments </strong></a>'
			+ (!userData['points']
				? '<p class="dsq-popup-notice">If this is you, <a href="http://disqus.com/profile" target="_blank">claim it now</a> to manage your comments.</p>'
				: '')
			+ ((userData['registered'] && !userData['verified'] && (Dsq.jsonData.request.username && (Dsq.jsonData.request.username == userData['username'])) && !userData['is_remote'])
				? '<p class="dsq-popup-notice"><strong>Alert</strong>: You have not verified this account. <a href="http://disqus.com/verify">Verify it now.</a></p>'
				: '')
			+ '</div> \
			<div id="dsq-profile-status-' + user_key + '" class="dsq-popup-profile-status" style="display:none"></div> \
			<div class="dsq-popup-profile-snapshot"> \
				<table> \
					<tr> \
						<td> \
							<div id="dsq-popup-profile-active-sites-wrapper-' + user_key + '"> \
								<h4>Most active sites</h4> \
								<ul id="dsq-popup-profile-active-sites-' + user_key + '"> \
									<li>Loading...</li> \
								</ul> \
							</div> \
						</td> \
						<td>'
							+ _includeServices()
							+ '<div id="dsq-popup-profile-moderated-wrapper-' + user_key + '"> \
								<h4>Moderator of</h4> \
								<ul id="dsq-popup-profile-moderated-' + user_key + '"> \
									<li>Loading...</li> \
								</ul> \
							</div> \
						</td> \
					</tr> \
				</table> \
			</div> \
			';

		content = {
			'header': headerHtml,
			'body': bodyHtml
		};

		return this._popupGeneric(content);
	};

	this.popupReblog = function() {
		var headerHtml = '';
		var bodyHtml = '';
		var content = {};

		headerHtml = ' \
			<cite><span>Reblog this comment</span></cite> \
		';

		bodyHtml = ' \
			<div id="dsq-reblog-form" class="dsq-reblog-form"> \
			</div> \
		';

		content = {
			'header': headerHtml,
			'body': bodyHtml
		};

		return this._popupGeneric(content);
	};

	this.popupModal = function(title, message) {
		var headerHtml = '';
		var bodyHtml = '';
		var content = {};

		headerHtml = ' \
			<h3>' + title + '</h3> \
		';

		bodyHtml = message;

		content = {
			'header': headerHtml,
			'body': bodyHtml
		};

		return this._popupGeneric(content);
	};

	this.alertContent = function(name, post_id) {
		var alert = {
			'post_not_approved': {
				'title': 'Comment awaiting approval by a moderator',
				'message': 'Thanks for posting. Your comment must be approved by a moderator before appearing here.'
			},
			'post_has_profile': {
				'title': 'Use your existing commenter profile',
				'message': 'You have just posted your commment as a <span class="dsq-badge dsq-badge-guest">Guest</span>, but you may already have a <span class="dsq-badge dsq-badge-registered">Registered</span> commenter profile.<br /><br /><a href="http://disqus.com/claim">Log in and claim this comment!</a>'
			}
		};
		return alert[name] || false;
	};

	//
	// Actions
	//

	this.voted = function(post_id, points, vote) {
		// Update number of points
		Dsq.$('dsq-points-' + post_id).innerHTML = points + Dsq.Utils.pluralize(points, ' person', ' people') + ' liked this comment.';

		// Update link text
		if(vote) {
			Dsq.$('dsq-rate-cont-' + post_id).innerHTML = 'You liked this.';
		}
	};

	this.subscribed = function(status) {
		var title, message;

		if(status) {
			title = 'Subscribed!';
			message = 'You have subscribed to this comment thread. New comments will be sent directly to your email inbox, where you may read and respond by email.';
			Dsq.$('dsq-subscribe').innerHTML = ' \
				<a href="#" onclick="Dsq.Thread.subscribe(0); return false">Unsubscribe</a> \
			';
		} else {
			title = 'Unsubscribed';
			message = 'You have unsubscribed to this comment thread. New comments will no longer be sent to your email inbox.';
			Dsq.$('dsq-subscribe').innerHTML = ' \
				<a href="#" onclick="Dsq.Thread.subscribe(1); return false">Subscribe by email</a> \
			';
		}

		Dsq.Popup.popModal(message, title);

	};
	
	this.highlighted = function() {
		Dsq.Popup.popModal('This comment has been highlighted.', 'Highlighted comment');
	};

	//
	// Media
	//

	this.mediaSeesmic = function(id, thumb) {
		return ' \
			<div id="dsq-seesmic-' + id + '_preview" class="dsq-seesmic-preview"><a href="http://www.seesmic.com/video/' + id + '" target="_blank" class="see_link">&nbsp;</a> \
				<div style="display:block;width:160px; height:120px; border:none; background-image:url(http://t.seesmic.com/thumbnail/' + thumb + ')"> \
					<div id="dsq-seesmic-' + id + '_hide" class="seePlayOverlay" style="display:none;"><img onclick="see_play_video(\'' + id + '\',false)" src="http://media.disqus.com/images/seesmic/stopOverlay.png" width="50" height="50" style="cursor:pointer; cursor:hand; padding-top: 30px; padding-left: 50px" alt="" /></div> \
					<div id="dsq-seesmic-' + id + '_show" class="seePlayOverlay"><img onclick="see_play_video(\'' + id + '\',true)" src="http://media.disqus.com/images/seesmic/playOverlay.png" width="50" height="50" style="cursor:pointer; cursor:hand; border:none; padding-top: 30px; padding-left: 50px" alt="" /></div> \
				</div> \
			</div> \
			<div id="' + id + '_content" style="display:block; width:100%; padding-top:5px"></div> \
		';
	};

	//
	// Callbacks
	//

	this.postComment_onSuccess = function(parent_post_id) {
		// Increment post count
		var num_posts = Dsq.$('dsq-num-posts');
		var total_posts = Dsq.$('dsq-total-posts');
		
		if (num_posts) { 
			num_posts.innerHTML = parseInt(num_posts.innerHTML) + 1;
		}
		if (total_posts) { 
			total_posts.innerHTML = parseInt(total_posts.innerHTML) + 1;
		}
	};
};
// Dsq.Templates


/**
 * Dsq.Post
 */
Dsq.Post = new function() {
	this.openedMenu = {};
	this.menuEventListener = null;
	this.stateReplyToggled = {};
	this.stateEditToggled = {};
	this.stateRecordLink = {};

	/**
	 * Inserts a new post into the document.
	 *
	 * @param after_id {Number}	Insert a post before specified id.  If after_id
	 *							evaluates to false, then post in the front.  If
	 *							after_id is -1, post at the end.
	 */
	this.insert = function(after_id, id, message, author) {
		// Skeleton template from thread_posts.html.
		var skeleton = ' \
			<li id="dsq-comment-%(id)s"> \
				<div id="dsq-comment-header-%(id)s" class="dsq-comment-header"> \
					<cite id="dsq-cite-%(id)s" class="dsq-comment-cite"> \
						<a id="dsq-author-user-%(id)s" href="%(author_url)s" target="_blank" rel="nofollow">%(author_name)s</a> \
					</cite> \
				</div> \
				<div id="dsq-comment-body-%(id)s" class="dsq-comment-body"> \
					<div id="dsq-comment-message-%(id)s" class="dsq-comment-message">%(message)s</div> \
				</div> \
			</li> \
		';
		var _meta = Dsq.jsonData.posts[id];
		var _user_meta = Dsq.jsonData.users[_meta.user_key];
		var markup = Dsq.Utils.interpolate(skeleton, {
			id: id,
			message: message,
			author_url: _user_meta.blog,
			author_name: _user_meta.display_name
		});
		var div = document.createElement('div');
		markup = markup.replace(Dsq.COMMENTS_RE, Dsq.CommentsHandler);
		div.innerHTML = markup;

		if (after_id === -1) {
			Dsq.$('dsq-comments').appendChild(div);
		} else if (!after_id) {
			Dsq.$('dsq-comments').insertBefore(div, Dsq.$('dsq-comments').firstChild);
		} else if (Dsq.$('dsq-comment-' + after_id)) {
			// Get next node after "after_id", so we can insert before it.
			// If "after_id" is the last comment, the target node is the
			// last node.
			
			// var append_post_id = Dsq.Templates.appendPost(after_id).replace('<div id="','').replace('"></div>', '');
			var append_post_id = 'dsq-append-post-' + after_id;
			var node = Dsq.$(append_post_id);
			while (node = node.nextSibling) {
				if (!node || node.nodeType == 1) { // 1 == Node.ELEMENT_NODE
					break;
				}
			}
			if (!node) {
				node = Dsq.$(append_post_id);
			}
			node.parentNode.insertBefore(div, node);
		}
	};

	this.incrementPostCount = function() {
		
		var num_posts = Dsq.$('dsq-num-posts');
		var total_posts = Dsq.$('dsq-total-posts');

		if (num_posts) {
			num_posts.innerHTML = parseInt(num_posts.innerHTML, 10) + 1;
		}
		if (total_posts) {
			total_posts.innerHTML = parseInt(total_posts.innerHTML, 10) + 1;
		}
	}
	
	this.outlineComment = function(post_id) {
		Dsq.$('dsq-comment-' + post_id).className += ' dsq-comment-outline';
		setTimeout("(function () { Dsq.Post.clearOutlineComment(" + post_id + ") })()", 3000);
	};
	
	this.clearOutlineComment = function(post_id) {
		Dsq.$('dsq-comment-' + post_id).className = Dsq.$('dsq-comment-' + post_id).className.replace('dsq-comment-outline', '');
	};

	this.showMenu = function(el, id, name) {
		var anchorPos = Dsq.Utils.findPos(el);
		var menu = document.createElement('ul');

		if(this.openedMenu) {
			if(this.openedMenu.linkClicked) {
				this.openedMenu.linkClicked = false;
				return;
			}
		}

		switch(name) {
			case 'more':
				menu.innerHTML = Dsq.Templates.menuMore(id);
				break;
			case 'media':
				menu.innerHTML = Dsq.Templates.menuMedia(id);
				break;
			default:
				break;
		}

		// Add menu to document body
		menu.id = 'dsq-menu-' + id;
		menu.className = 'dsq-menu';
		Dsq.$b.appendChild(menu);

		// Position and show
		anchorPos[1] += 15;
		menu.style.left = anchorPos[0] + 'px';
		menu.style.top = anchorPos[1] + 'px';
		menu.style.display = 'block';

		// Set global reference
		this.openedMenu = {
			'el' : menu,
			'id' : id,
			'name' : name,
			'linkClicked' : false
		};

		// Set listener
		this.menuEventListener = Dsq.Utils.addEventListener(document, 'mouseup', this._hideMenu);
	};

	this._hideMenu = function(e) {
		var el = e.target || e.srcElement;
		var openedMenu = Dsq.Post.openedMenu.el;
		var id = Dsq.Post.openedMenu.id;

		if(!id) {
			var link = 'dsq-' + Dsq.Post.openedMenu.name + '-link';
		} else {
			var link = 'dsq-' + Dsq.Post.openedMenu.name + '-link-' + id;
		}

		if(!openedMenu) {
			return;
		}

		if(!Dsq.Popup.isClicked(e, openedMenu.id)) {
			openedMenu.style.display = 'none';
			Dsq.Utils.removeEventListener(Dsq.Post.menuEventListener);
			Dsq.Utils.deleteNode(openedMenu);

		} else {
			// Hide the menu if a link was clicked inside the menu.  We can't
			// completely remove the menu until the onclick event on the link
			// fires, but the menuEventListener will prevent multiple menus
			// from polluting the DOM.
			if(el && typeof el.href != 'undefined') {
				openedMenu.style.display = 'none';
				Dsq.Post.openedMenu.el = null;
			}
		}

		if(Dsq.Popup.isClicked(e, link)) {
 			Dsq.Post.openedMenu.linkClicked = true;
		}
	};


	this.getUserServices = function(user_key, id) {
		if(!user_key && id) {
			var _meta = Dsq.jsonData.posts[id];
			user_key = _meta.user_key;
		}
		var userData = Dsq.jsonData['users'][user_key];
		var userServices = [];

		// Keep a full list of supported services. This is the order they will display in the drop-profile.
		// Each service must have a corresponding case in _buildServiceUrl()
		var supportedServices = ['blog', 'twitter', 'facebook', 'tumblr'];

		function _buildServiceUrl(serviceName) {
			var data = userData[serviceName];
			var services = {
				blog:		function(d) { return d; },
				twitter:	function(d) { return d; },
				facebook:	function(d) { return d; },
				tumblr:		function(d) { return 'http://' + d + '.tumblr.com'; }
			};
			return services[serviceName](data);
		}

		for(var i = 0; i < supportedServices.length; i++) {
			if(userData[supportedServices[i]]) {
				var serviceUrl = _buildServiceUrl(supportedServices[i]);
				userServices.push({'name' : supportedServices[i], 'url' : serviceUrl});
			}
		}
		return userServices;
	}

	this.dropProfile = function(id) {
		var dp = Dsq.$('dsq-drop-profile-' + id);

		// IE6 needs JS to display/hide. All other browsers use CSS.
		if(dp) {
			if(Dsq.Utils.ie6) dp.style.display = (dp.style.display == 'inline') ? 'none' : 'inline';
			return false;
		} else {
			dp = document.createElement('ul');
		}

		dp.id = 'dsq-drop-profile-' + id;
		dp.className = 'dsq-drop-profile';

		if(Dsq.Utils.ie6) { dp.style.display = 'inline'; }

		var container = Dsq.$('dsq-header-avatar-' + id);
		dp.innerHTML = Dsq.Templates.dropProfile(id);
		container.appendChild(dp);
	};

	this.dropProfileMore = function(el, id) {
		var hiddenItems = Dsq.$('dsq-drop-hidden-' + id);

		hiddenItems.style.display = 'inline';
		el.parentNode.style.display = 'none';
	};

	this._updateReplyLinks = function(el, id) {
		// Update "reply / cancel" links based on state.
		var displayDict = {};

		if(id) {
			if(this.stateReplyToggled[id]) {
				el.innerHTML = 'Cancel';
				displayDict['media'] = 'inline';
				displayDict['edit'] = 'none';
			} else {
				el.innerHTML = 'Reply';
				displayDict['media'] = 'none';
				displayDict['edit'] = 'inline';
			}
		}

		for(var key in displayDict) {
			if(displayDict.hasOwnProperty(key)) {
				var	linkEl = Dsq.$('dsq-' + key + '-el-' + id),
					spacer = Dsq.$('dsq-' + key + '-spacer-' + id);

				if(linkEl) {
					linkEl.style.display = displayDict[key];
					if(spacer) spacer.style.display = displayDict[key];
				}
			}
		}
	};

	this._updateMediaLinks = function(el, id) {
		// Update "use media / cancel" links based on state.
		var appendId = (id) ? ('-' + id) : '';
		var link = Dsq.$('dsq-media-link' + appendId);

		if(this.stateRecordLink[id]) {
			link.innerHTML = 'Cancel Media';
			link.onclick = function() { Dsq.Post.toggleMediaReply(link, id); return false; };
		} else {
			link.innerHTML = 'Use Media <small>&#9660;</small>';
			link.onclick = function() { Dsq.Post.showMenu(link, id, 'media'); return false; };
		}
	};

	this.toggleReply = function(el, id) {
		// Create reply IFrame
		if (window.disqus_use_postmessage) {
			if (!this.stateReplyToggled[id]) {
				Dsq.$('dsq-reply-' + id).style.display = 'block';
				Dsq.$('dsq-reply-bar-' + id).style.display = 'block';
				// Create IFrame if it doesn't exist.
				if (!Dsq.frames['reply_' + id]) {
					var _meta = Dsq.jsonData.posts[id];
					Dsq.frames['reply_' + id] = new Dsq.ReplyFrame(Dsq.$('dsq-reply-frame-' + id), id);
					Dsq.frames['reply_' + id].init();
					Dsq.frames['reply_' + id].setState(id, _meta.depth);
				}
			} else {
				Dsq.$('dsq-reply-' + id).style.display = 'none';
				Dsq.$('dsq-reply-bar-' + id).style.display = 'none';
			}
		} else {
			// DEPRECATED
			if(!this.stateReplyToggled[id]) {
				// Reply toolbar
				Dsq.$('dsq-reply-bar-' + id).style.display = 'block';
				Dsq.Iframes.showReplyIframeInContainerIfAllowed(Dsq.$('dsq-reply-' + id), id);
			} else {
				Dsq.$('dsq-reply-bar-' + id).style.display = 'none';
				Dsq.Iframes.hideAllInContainer(Dsq.$('dsq-reply-' + id));
				if(this.stateRecordLink[id]) {
					// HACK: Cancel media before canceling self.
					this.toggleMediaReply(Dsq.$('dsq-media-link-' + id), id);
				}
			}
		}

		this.stateReplyToggled[id] = !this.stateReplyToggled[id];
		this._updateReplyLinks(el, id);

		if(Dsq.Utils.ie) { Dsq.Utils.fixIframesIE('dsq-reply-' + id); }

		Dsq.Events.fire(Dsq.Events.REPLY_IFRAME_TOGGLED, {
			postId: id,
			opened: this.stateReplyToggled[id]
		});
	};

	this.toggleMediaReply = function(el, id, xtype) {
		id = id || 0;
		if(id) {
			var container = Dsq.$('dsq-reply-' + id);
		} else {
			var container = Dsq.$('dsq-post-add');
		}

		if(!this.stateRecordLink[id]) {
			Dsq.Iframes.showReplyIframeInContainer(container, id, {xtype:xtype}, 'dsq-post-video');
		} else {
			Dsq.Iframes.showReplyIframeInContainer(container, id);
		}
		this.stateRecordLink[id] = !this.stateRecordLink[id];
		this._updateMediaLinks(el, id);

		if(Dsq.Utils.ie) { Dsq.Utils.fixIframesIE(); }
	};

	this.edit = function(el, id) {
		Dsq.$('dsq-comment-message-' + id).innerHTML = Dsq.Templates.frameEdit(id);
		el.parentNode.style.display = 'none';
		if(Dsq.Utils.ie) { Dsq.Utils.fixIframesIE('dsq-comment-message-' + id); }
	};

    this.rate = function(el, id, vote) {
		if(Dsq.jsonData.request.is_authenticated || Dsq.jsonData.forum.allow_anon_votes) {
			if(vote == 1) {
                Dsq.$('dsq-rate-cont-' + id).innerHTML = '<img src="http://media.disqus.com/images/loading-small.gif">';
            }

            Dsq.Utils.execScript('http://disqus.com/forums/kyle-brady/vote.js'
                + '?post_id='    + id
                + '&vote='        + vote);

		} else {
			Dsq.Popup.login(Dsq.Strings.TO_RATE_PLEASE_LOG_IN);
		}
    };

	this.report = function(id, confirmed) {
		if(confirmed) {
			Dsq.Utils.postToUrl('http://disqus.com/forums/kyle-brady/how_i_won_a_copyfight/post_report/', {'post_id': id});
			Dsq.Popup.popModal('Thank you. This comment has been flagged for moderator attention.', 'Successfully flagged');
			Dsq.Utils.deleteNode(Dsq.$('dsq-post-report-' + id));
		} else {
			var title = Dsq.Strings.FLAG_INAPPROPRIATE_COMMENT;
			var message = Dsq.Strings.ARE_YOU_SURE_YOU_WOULD_LIKE_TO_REPORT_THIS_COMMENT_TO_A_MODERATOR + '? \
			<br /><br /> \
			<button onclick="Dsq.Popup._closePopup(null, true)"><strong>' + Dsq.Strings.NO + '</strong>, ' + Dsq.Strings.NEVER_MIND + '</button>&nbsp;&nbsp;&nbsp;<button onclick="Dsq.Post.report(' + id + ', true);"><strong>' + Dsq.Strings.YES + '</strong>, ' + Dsq.Strings.FLAG_INAPPROPRIATE_COMMENT + '</button><br /><br />'
			+ Dsq.Strings.THIS_WILL_FLAG_COMMENTS_FOR_MODERATORS_TO_TAKE_ACTION + '. \
			';

			Dsq.Popup.popModal(message, title, id);
		}
	};



	this.showAlert = function(id, msg) {
		var msgEl = Dsq.$('dsq-comment-message-' + id);
		var alert = '<div class="dsq-comment-alert">' + msg + '</div>';

		msgEl.innerHTML = alert + msgEl.innerHTML;
	};

};
// Dsq.Post


/**
 * Dsq.Thread
 */
Dsq.Thread = new function() {
	this.fc = null;
	this.ff = null;
	this.ac = null;

	
	this.adminIsOn = false;

	
	
	

	this.hlComment = null;
	this.hlCommentClass = null;

	this.getNextComment = function(el) {
		var start_id = el.id;
		while(el = el.nextSibling) {
			if(el.id && el.id.indexOf('dsq-comment-') != -1 && el.id != start_id) {
				return el;
			}
		}
		return null;
	};

	this.getActiveCommentId = function() {
		if (document.URL.indexOf('#comment-') >= 0) {
			var anchor = document.URL.slice(document.URL.indexOf('#') + 1);
			return anchor.replace('comment-', '');
		}
		return null;
	};

	this.highlightAnchor = function() {
		var i = this.getActiveCommentId();
		if (i == null) return false;
		var id = 'dsq-comment-' + i;
		var hash = window.location.hash;

		// Toggle the hash incase the comment isn't available when the page loads
		// for WebKit-based browsers.
		if (Dsq.Utils.webkit) {
			window.location.hash = '';
			window.location.hash = hash;
		}

		this.hlComment = Dsq.$(id);
		// Adding this conditional guard pending #289
		if (!this.hlComment) {
			return;
		}
		this.hlCommentClass = this.hlComment.className;
		this.hlComment.className += ' dsq-hl-anchor';

		setTimeout("Dsq.Thread.highlightClear()", 3000);
	};

	this.highlightClear = function() {
		if (!this.hlComment) {
			return;
		}
		this.hlComment.className = this.hlCommentClass;
	};

	this.login = function(toggle) {
		// toggle id is #dsq-reply-login-[id]
		var postId;
		if(toggle.id.indexOf('dsq-reply-login') != -1) {
			postId = toggle.id.slice(16);
			var container = Dsq.$('dsq-reply-' + postId);
		} else {
			var container = Dsq.$('dsq-post-add');
		}

		if(toggle) {
			if(toggle.className == 'dsq-login-active') {
				Dsq.Iframes.showReplyIframeInContainerIfAllowed(container, postId);
				toggle.className = '';
			} else {
				Dsq.Iframes.showLoginIframeInContainer(container, postId);
				toggle.className = 'dsq-login-active';
			}
		} else {
			Dsq.Iframes.showLoginIframeInContainer(container, postId);
		}

		if(Dsq.Utils.ie) { Dsq.Utils.fixIframesIE(); }
	};


	this.paginate = function(page, el_clicked, per_page) {
		// Use extra_params to pass any override parameters that we need to persist.
		var extra_params = '';

		// "Per page" can either be overriden by providing it as an argument
		// (per-call) or setting the disqus_per_page override variable (global).
		if(typeof per_page == 'undefined') {
			per_page = null;
		}
		if(typeof disqus_per_page != 'undefined' && per_page === null) {
			per_page = disqus_per_page;
		}

		if(typeof disqus_sort != 'undefined') {
			extra_params += '&sort=' + disqus_sort;
		}
		if(per_page !== null) {
			extra_params += '&per_page=' + per_page;
		}

		Dsq.$('dsq-pagination').innerHTML += '<img src="http://media.disqus.com/images/loading-small.gif">';
		
		if(el_clicked) {
			el_clicked.style.display = 'none';
		}
		
		Dsq.Utils.execScript('http://disqus.com/forums/kyle-brady/thread.js'
			+ '?slug='	+ 'how_i_won_a_copyfight'
			+ '&p='		+ page
			+ extra_params);
	};

	this.sortBy = function(sort) {
		var disqus_script = document.createElement('script');
		var disqus_date = new Date();

		if (location.hash != '') {
			location.hash = '#disqus_thread';
		}

		if(typeof(disqus_url) == 'undefined') {
			disqus_url = disqus_href;
		}
		disqus_script.type = 'text/javascript';
		disqus_script.src = 'http://disqus.com/forums/kyle-brady/thread.js'
			+ '?slug='	+ 'how_i_won_a_copyfight'
			+ '&sort='	+ sort
			+ '&title='
			+ '&'		+ disqus_date.getTime();

		Dsq.$('dsq-comments').innerHTML = '<img src="http://media.disqus.com/images/loading.gif">';
		Dsq.container.appendChild(disqus_script);
	};

	this.subscribe = function(status, email) {
		// `status` is an int -- 1 to subscribe, 0 to unsubscribe
		if(Dsq.jsonData.request.is_authenticated || email) {
			// If authenticated user OR anonymous email provided

			if(email) {
				Dsq.Popup._closePopup(null, true);
			}

			Dsq.Utils.execScript('http://disqus.com/forums/kyle-brady/subscribe.js'
				+'?status=' 	+ status
				+ '&slug='		+ 'how_i_won_a_copyfight'
				+ '&email=' 	+ encodeURIComponent(email));

		} else if(!email) {
			// If anonymous user and no email has been provided yet, prompt for email

			var title = 'Subscribe to this comment thread';
			var message = ' \
				New comments will be sent directly to your email inbox! \
				<div class="dsq-subscribe-submit"> \
					<p><strong>Enter your email address below.</strong></p> \
					<input type="text" id="dsq-subscribe-email"> \
					<button onclick="Dsq.Thread.subscribe(1, Dsq.$(\'dsq-subscribe-email\').value)">Subscribe</button> \
				</div> \
			';

			Dsq.Popup.popModal(message, title);
		}
	};

	this.showSettings = function() {
		if (!Dsq.jsonData.request.is_moderator) {
			return;
		}

		/* The form has to be re-designed when more options will come out. */
		var html = 'Automatically close comments after <input size="3" id="dsq-thread-days-alive" value="' + Dsq.jsonData.thread.days_alive + '" type="text" /> days. Existing comments will still be displayed.<br /><br />(Using 0 days will disable this feature)<br /><br />'
								 + '<button onclick="Dsq.Thread.updateDaysAlive();" class="dsq-button-small"><span>Save</span></button>'
								 + '<span id="dsq-thread-settings-status" class="dsq-options-status"></span>';

		Dsq.Popup.popModal(html, 'Settings');
	};

  this.showModeratorActions = function() {
      if (!Dsq.jsonData.request.is_moderator) {
          return;
      }

      var html = '<div class="dsq-moderate-options"><table><tr>' +
                 '<td>' + Dsq.Strings.ACTIONS + '</td><td><ul>';
      html += '<li><a href="#" onclick="Dsq.Thread.toggleClosed(); return false;">' +
              (Dsq.jsonData.thread.closed ? Dsq.Strings.OPEN_THREAD : Dsq.Strings.CLOSE_THREAD) +
              '</a></li>';
      html += '<li><a href="#" onclick="Dsq.Thread.toggleKilled(); return false;">' +
              (Dsq.jsonData.thread.killed ? Dsq.Strings.RESTORE_THREAD : Dsq.Strings.REMOVE_THREAD) +
              '</a></li>';
      html += '</ul></td></tr></table></div>' +
              '<p>Go to the full <a href="http://disqus.com/comments/moderate-threads/" target="_blank">moderate panel</a> for more options.</p>';
      Dsq.Popup.popModal(html, Dsq.Strings.MODERATE_OPTIONS);
  };

	this.updateDaysAlive = function() {
		  var days = Dsq.$('dsq-thread-days-alive').value;
		  var status = Dsq.$('dsq-thread-settings-status');
		  Dsq.Utils.postToUrl('http://disqus.com/forums/kyle-brady/update_days_alive.js', {days:days,thread:Dsq.jsonData.thread.id});
		  status.innerHTML = 'Saved!';
		  window.setTimeout(function() { status.innerHTML = ''; }, 1000);
	};

  this.toggleClosed = function() {
      Dsq.Utils.postToUrl('http://disqus.com/forums/kyle-brady/toggle_thread_closed.js', {thread:Dsq.jsonData.thread.id});
      window.setTimeout(function() { window.location.reload(); }, 500);
  };

  this.toggleKilled = function() {
      Dsq.Utils.postToUrl('http://disqus.com/forums/kyle-brady/toggle_thread_killed.js', {thread:Dsq.jsonData.thread.id});
      window.setTimeout(function() { window.location.reload(); }, 500);
  };
};
// Dsq.Thread

Dsq.Events = function() {
	var obj = {};

	// Private
	var handlers = {};
	var getHandlers = function(event) {
		if (handlers[event] === undefined) {
			handlers[event] = [];
		}
		return handlers[event];
	};

	// Public
	// Value keys : postId, node, xtype
	obj.REPLY_IFRAME_CREATED = 1;
	// Value keys : postId, opened
	obj.REPLY_IFRAME_TOGGLED = 2;
	obj.fire = function(event, opt_value) {
		if (!event) {
			throw new Error('Unknown event');
		}
		var value = opt_value || {};
		for (var i=0; i<getHandlers(event).length; i++) {
			getHandlers(event)[i](value);
		}
	};
	obj.addHandler = function(event, callback) {
		getHandlers(event).push(callback);
	};

	return obj;
}();

/**
 * Dsq.Realtime
 */
Dsq.Realtime = new function() {
	var initialized = false;
	var interval = null;
	var last_checked = Dsq.jsonData.request.timestamp;
	var new_posts = [];
	var ongoing_request = false;
	var prev_script = null;

	function updateNewPostCount() {
		Dsq.$('dsq-realtime-alert').style.display = new_posts.length ? 'block' : 'none';

		Dsq.$('dsq-realtime-queued').innerHTML = new_posts.length
		+ ' new '
		+ Dsq.Utils.pluralize(new_posts.length, 'comment', 'comments')
		+ Dsq.Utils.pluralize(new_posts.length, ' was', ' were')
		+ ' just posted.';

		Dsq.$('dsq-realtime-show').innerHTML = '(' + Dsq.Strings.SHOW + ')';
	}

	function insertNewPosts() {
		var post_id = null;
		var after_id = Dsq.$('dsq-sort-select').value === 'oldest' ? -1 : null;

		for (var i=0; i<new_posts.length; i++) {
			post_id = new_posts[i];
			Dsq.Post.insert(after_id, post_id, Dsq.jsonData.posts[post_id].message);
			Dsq.Post.incrementPostCount();
			Dsq.Post.outlineComment(post_id);
		}
		new_posts = [];
	}

	this.enableInterval = function() {
		interval = setInterval(Dsq.Realtime.check, Dsq.jsonData.context.realtime_speed);
		Dsq.$('dsq-realtime-status').innerHTML = Dsq.Strings.ENABLED;
		Dsq.$('dsq-realtime-toggle').innerHTML = '(' + Dsq.Strings.PAUSE + ')';
	}

	this.disableInterval = function() {
		if (interval) {
			clearInterval(interval);
			interval = null;
		}
		Dsq.$('dsq-realtime-status').innerHTML = Dsq.Strings.PAUSED;
		Dsq.$('dsq-realtime-toggle').innerHTML = '(' + Dsq.Strings.RESUME + ')';
	}

	this.toggleInterval = function() {
		if (!interval) {
			Dsq.Realtime.enableInterval();
		} else {
			Dsq.Realtime.disableInterval();
		}
		return false;
	}

	this.initialize = function() {
		if (!initialized) {
			initialized = true;
			Dsq.$('dsq-realtime-toggle').onclick = this.toggleInterval;
			if (!Dsq.jsonData.forum.streaming_realtime) {
				Dsq.$('dsq-realtime-show').onclick = this.show;
				updateNewPostCount();
			}
			if (Dsq.jsonData.thread.realtime_paused) {
				Dsq.Realtime.disableInterval();
			} else {
				Dsq.Realtime.enableInterval();
			}
		}
	}

	this.show = function() {
		insertNewPosts();
		updateNewPostCount();
		return false;
	}

	this.check = function() {
		if (!ongoing_request && Dsq.jsonData.realtime_enabled) {
			if (prev_script) {
				prev_script.parentNode.removeChild(prev_script);
			}
			ongoing_request = true;
			prev_script = Dsq.Utils.execScript('http://disqus.com/forums/21227305/realtime.js?timestamp=' + last_checked);
		}
	};

	this.update = function(timestamp, posts, users) {
		ongoing_request = false;
		last_checked = timestamp;

		if (users) {
			for (var user_id in users) {
				if (users.hasOwnProperty(user_id)) {
					if (!Dsq.jsonData.users[user_id]) {
						Dsq.jsonData.users[user_id] = users[user_id];
					}
				}
			}
		}

		if (posts) {
			for (var post_id in posts) {
				if (posts.hasOwnProperty(post_id)) {
					if (!Dsq.jsonData.posts[post_id]) {
						Dsq.jsonData.posts[post_id] = posts[post_id];
						new_posts.push(post_id);
					}
				}
			}

			if (Dsq.jsonData.forum.streaming_realtime) {
				insertNewPosts();
			} else {
				updateNewPostCount();
			}
		}
	};

}();

// DEPRECATED
Dsq.Iframes = function() {
	// Different style of object from the above. Hoping to switch to this for some reason.
	var obj = {};

	// Private
	var showIframeInContainer = function(container, id, markup) {
		// Look through container for iframes, hiding them, except show one that matches id
		// If none of them matched id, create a new iframe using markup and insert it.
		// Returns the iframe node if and only if it was newly created.
		var found = false;
		for (var i=0; i<container.childNodes.length; i++) {
			var child = container.childNodes[i];
			if (child.nodeName == 'IFRAME') {
				if (child.id == id) {
					child.style.display = 'block';
					found = true;
				} else {
					child.style.display = 'none';
				}
			}
		}
		if (found) {
			return;
		}
		// The iframe wasn't found, so construct it and add it to the container.
		// Don't use innerHTML because it might reload iframes
		var div = document.createElement('div');
		div.innerHTML = markup;
		var iframe = div.childNodes[0];
		div.removeChild(iframe);
		container.appendChild(iframe);
		return iframe;
	};

	// Public
	obj.makeReplyIframeId = function(opt_postId, opt_xtype) {
		var id = 'dsq-post-add-iframe';
		if (opt_xtype) {
			id += '-' + opt_xtype;
		}
		if (opt_postId) {
			id += '-' + opt_postId;
		}
		return id;
	};
	obj.makeLoginIframeId = function(opt_postId) {
		if (!opt_postId) {
			return 'dsq-login-iframe';
		}
		return 'dsq-login-iframe-' + opt_postId;
	};
	obj.makeReplyIframeName = function(opt_postId, opt_xtype) {
		var name = 'dsq-reply-frame';
		if (opt_xtype) {
			name += '-' + opt_xtype;
		}
		if (opt_postId) {
			name += '-' + opt_postId;
		}
		return name;
	};
	obj.showReplyIframeInContainer = function(container, opt_postId, opt_extraParams, opt_className) {
		// Construct the id so we can check if it's already present.
		// Hide any other iframes we find, and show this one if it's found.
		var params = opt_extraParams || {};
		// use xtype in the id and name so we can distinguish media replies from text replies:
		var id = Dsq.Iframes.makeReplyIframeId(opt_postId, params.xtype);
		var name = Dsq.Iframes.makeReplyIframeName(opt_postId, params.xtype);
		var attributes = {
			'id': id,
			'name': name,
			'class': opt_className || 'dsq-post-reply'
			};
		var markup = Dsq.Templates.frameReply(opt_postId, opt_extraParams, attributes);
		var iframe = showIframeInContainer(container, id, markup);
		// It was newly created
		if (iframe) {
			Dsq.Events.fire(Dsq.Events.REPLY_IFRAME_CREATED, {
				postId: opt_postId,
				node: iframe,
				xtype: params.xtype
			});
		}
	};
	obj.showLoginIframeInContainer = function(container, opt_postId) {
		var id = Dsq.Iframes.makeLoginIframeId(opt_postId);
		var markup = Dsq.Templates.frameLogin({id: id});
		showIframeInContainer(container, id, markup);
	};
	obj.showReplyIframeInContainerIfAllowed = function(container, opt_postId) {
		if (Dsq.jsonData.context.show_reply) {
			obj.showReplyIframeInContainer(container, opt_postId);
		} else {
			obj.hideAllInContainer(container);
		}
	};
	obj.hideAllInContainer = function(container) {
		for (var i=0; i<container.childNodes.length; i++) {
			var child = container.childNodes[i];
			if (child.nodeName == 'IFRAME') {
				child.style.display = 'none';
			}
		}
	};

	return obj;
}();

Dsq.Twitter = new function() {
	var that = this;

	this.startTwitterConnect = function() {
		var popupParams = 'location=0,status=0,width=800,height=400';
		that._twitterWindow = window.open(Dsq.jsonData.settings.disqus_url + '/_ax/twitter/begin/', 'twitterWindow', popupParams);
		that._twitterInterval = window.setInterval(that.completeTwitterConnect, 1000);
	};

	this.completeTwitterConnect = function() {
		if (that._twitterWindow.closed) {
			window.clearInterval(that._twitterInterval);
			window.location.reload();
		}
	};
};

Dsq.Yahoo = new function() {
	var that = this;

	this.startYahooConnect = function() {
		var popupParams = 'location=0,status=0,width=800,height=400';
		that._yahooWindow = window.open(Dsq.jsonData.settings.disqus_url + '/_ax/yahoo/begin/', 'yahooWindow', popupParams);
		that._yahooInterval = window.setInterval(that.completeYahooConnect, 1000);
	};

	this.completeYahooConnect = function() {
		if (that._yahooWindow.closed) {
			window.clearInterval(that._yahooInterval);
			window.location.reload();
		}
	};
};

Dsq.OpenID = new function() {
	var that = this;

	this.requestURL = function() {
		var message = '<table class="dsq-openid-form"><tr><td style="vertical-align:top;" rowspan="2"><img src="' + Dsq.jsonData.settings.media_url + '/images/openid-icon-100x100.png" /></td>';
		message += '<td><label for="dsq-openid-url">OpenID URL:</label></td><td><input type="text" id="dsq-openid-url" /></td></tr>';
		message += '<tr><td><label for="dsq-openid-username">Display name:</label></td><td><input type="text" id="dsq-openid-username" /></td></tr>';
		message += '<tr><td class="dsq-openid-submit" colspan="3"><input type="button" value="Sign in" onclick="Dsq.OpenID.startConnect();" /></td></tr>';
		message += "</table>";

		Dsq.Popup.popModal(message, 'Sign in using OpenID');
	};

	this.startConnect = function() {
		var isblank = function(str) {
			return /^\s*$/.test(str);
		};

		var openid_url = Dsq.$('dsq-openid-url').value;
		var username = Dsq.$('dsq-openid-username').value;

		if (isblank(openid_url)) {
			return;
		}

		var popupParams = 'location=0,status=0,width=800,height=500';
		var url = Dsq.jsonData.settings.disqus_url + '/_ax/openid/begin/' + '?url=' + encodeURIComponent(openid_url) + '&username=' + encodeURIComponent(username);
		that._openidWindow = window.open(url, 'openidWindow', popupParams);
		that._openidInterval = window.setInterval(that.completeConnect, 1000);
	};

	this.completeConnect = function() {
		if (that._openidWindow.closed) {
			window.clearInterval(that._openidInterval);
			window.location.reload();
		}
	};
};

Dsq.Reaction = new function() {
	var that = this;

	this.hide = function(id) {
		Dsq.Utils.execScript('http://disqus.com/forums/kyle-brady/hidereaction.js?' + 'reaction_id=' + id);
	};

	this.reportMissingReactions = function() {
		if (!Dsq.jsonData.request.is_moderator || !Dsq.jsonData.forum.reactions_enabled) {
			return;
		}

		if (Dsq.jsonData.thread.queued) {
			Dsq.Popup.popModal('Your report has been received. The system will automatically search for new reactions; if any are found, they will be displayed on this comment thread.<br/><br/>Thank&nbsp;you.',
												 'Reported missing reactions');
			return;
		}

		Dsq.Utils.execScript(Dsq.jsonData.settings.disqus_url + '/forums/kyle-brady/queueurl.js');
	};
};

Dsq.CNN = function() {
	var obj = {};

	obj.authenticate = function() {
		var url = Dsq.jsonData.settings.disqus_url + "/saml/cnn/try/";
		Dsq.Utils.postToUrl(url, {'target': document.location}, true);
	};

	return obj;
}();


if(Dsq.Utils.ie6) {
	(function() {
		DSQ_HEADER_AVATAR_RE = /<div class="dsq-header-avatar"(.*?)>/gim;
		Dsq.Templates.registerFilter('postPrependHeader', function(html, post_id) {
			// Add "onmouseout" for dsq-header-avatar for dropProfile
			// functionality since IE6 cannot use :hover.
			function _headerAvatarReplace(content, inner, _unused, html) {
				return '<div class="dsq-header-avatar" '
					+ inner
					+ ' onmouseout="Dsq.Post.dropProfile(' + post_id + ')">';
			}
			html = html.replace(DSQ_HEADER_AVATAR_RE, _headerAvatarReplace);
			return html;
		});
	})();
}





	// TODO: Move Seesmic code outside of the main script.  Don't let this script clobber the global namespace.
	if(typeof seesmic == 'undefined') { var seesmic = {}; }
	seesmic.widget = new function () {
		this.callback = function (data) {
			playerVersion = data.disqusplayer;
		};
	};

	
	var scriptEl = document.createElement('script');
	scriptEl.setAttribute('type', 'text/javascript');
	scriptEl.setAttribute('src', 'http://seesmic.com/version.js?callback=seesmic.widget.callback');
	document.getElementsByTagName('head')[0].appendChild(scriptEl);

	
	var scriptEl = document.createElement('script');
	scriptEl.setAttribute('type', 'text/javascript');
	scriptEl.setAttribute('src', 'http://media.disqus.com/javascript/library/swfobject.js');
	document.getElementsByTagName('head')[0].appendChild(scriptEl);

	function see_play_video(_videoUri, _add) {
		var swf = !!playerVersion ? playerVersion : 'http://seesmic.com/embeds/StandalonePlayer.swf';

		flashcontentDiv = Dsq.$(_videoUri + '_content');
		previewDiv = Dsq.$('dsq-seesmic-' + _videoUri + '_preview');
		hideDiv = Dsq.$('dsq-seesmic-' + _videoUri + '_hide');
		showDiv = Dsq.$('dsq-seesmic-' + _videoUri + '_show');
		if(_add) {
			// push flash widget
			var so = new SWFObject(swf, 'sotester', '300', '270', '9', '#000000');
			so.addVariable('video', _videoUri);
			so.addParam('allowFullScreen', 'true');
			so.addParam('allowScriptAccess','always');
			so.useExpressInstall('swfobject/expressinstall.swf');
			so.write(_videoUri + '_content');

			previewDiv.style.display = 'none';
			hideDiv.style.display = 'block';
			showDiv.style.display = 'none';
		}
		else {
			flashcontentDiv.innerHTML = '';
			previewDiv.style.display = 'block';
			hideDiv.style.display = 'none';
			showDiv.style.display = 'block';
		}
	};





(function() {
	//
	// Load theme.  This overrides the base templates with template functions
	// from the respective themes.
	//
	if (Dsq.jsonData.integration.theme == 4) {
		var theme = 'narcissus';
		// HACK: Set variable on window to use post message.
		window.disqus_use_postmessage = true;

		
		for(var prop in Dsq.Themes[theme]) {
			if(Dsq.Themes[theme] && Dsq.Themes[theme].hasOwnProperty(prop)) {
				Dsq.Templates[prop] = Dsq.Themes[theme][prop];
			}
		}
		
		for(var prop in Dsq.Post) {
			if(Dsq.Themes[theme] && Dsq.Themes[theme].hasOwnProperty(prop)) {
				Dsq.Post[prop] = Dsq.Themes[theme][prop];
			}
		}
	}

	//
	// Register templates.  This must be done after all themes are loaded.
	//
	Dsq.Templates.registerTemplate('authPost', Dsq.Templates.authPost);
	Dsq.Templates.registerTemplate('header', Dsq.Templates.header);
	Dsq.Templates.registerTemplate('footer', Dsq.Templates.footer);
	Dsq.Templates.registerTemplate('trackbacks', Dsq.Templates.trackbacks);
	Dsq.Templates.registerTemplate('reactions', Dsq.Templates.reactions);
	Dsq.Templates.registerTemplate('prependPost', Dsq.Templates.prependPost);
	Dsq.Templates.registerTemplate('appendPost', Dsq.Templates.appendPost);
	Dsq.Templates.registerTemplate('postPrependHeader', Dsq.Templates.postPrependHeader);
	Dsq.Templates.registerTemplate('postAppendHeader', Dsq.Templates.postAppendHeader);
	Dsq.Templates.registerTemplate('preBody', Dsq.Templates.preBody);
	Dsq.Templates.registerTemplate('postBody', Dsq.Templates.postBody);
	Dsq.Templates.registerTemplate('postFooter', Dsq.Templates.postFooter);
	Dsq.Templates.registerTemplate('_popupGeneric', Dsq.Templates._popupGeneric);
	Dsq.Templates.registerTemplate('voted', Dsq.Templates.voted);
	Dsq.Templates.registerTemplate('popupProfile', Dsq.Templates.popupProfile);
	Dsq.Templates.registerTemplate('postBox', Dsq.Templates.postBox);
	Dsq.Templates.registerTemplate('pagination', Dsq.Templates.pagination);
	Dsq.Templates.registerTemplate('postComment_onSuccess', Dsq.Templates.postComment_onSuccess);

})();

Dsq.container.className = "clearfix";
Dsq.container.innerHTML = ' \
<ul id="dsq-comments">\
	 <li id="dsq-comment-10731959">\
	 <div id="dsq-comment-header-10731959" class="dsq-comment-header">\
	 <cite id="dsq-cite-10731959" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10731959" href="http://www.zuhaiblog.com" target="_blank" rel="nofollow">zuhaib</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10731959" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10731959" class="dsq-comment-message">I just posted over a Boing Boing, as someone who took CS146 and Dr. Beeson\'s class I give you a big pat on the back as well.  I thought about doing the same after the classes ended, some of the codes I thought I did well on or I thought had use outside the classroom but stopped because I did not want to be helping cheating.<br>But by putting the ground work you have opened up an avenue for those tho wish to post their code can and I think that is great.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10733089">\
	 <div id="dsq-comment-header-10733089" class="dsq-comment-header">\
	 <cite id="dsq-cite-10733089" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10733089" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10733089" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10733089" class="dsq-comment-message">Thanks!<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10736505">\
	 <div id="dsq-comment-header-10736505" class="dsq-comment-header">\
	 <cite id="dsq-cite-10736505" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10736505">ForksNKnives</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10736505" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10736505" class="dsq-comment-message">I would tend to agree with Mr. Dorfman.  I appreciate open source as much as the next guy, but I certainly understand the professors point of view.  It is not a matter of current students looking at your bits of code, but future students.  Now because the answers to his assignments are public, he is in a position where he has to make all new assignments each course session.  As far as being able to show your code to future employers at east, there are obviously simple ways to accommodate the professor while at the same time keeping your code available for others to view at your discretion.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10736921">\
	 <div id="dsq-comment-header-10736921" class="dsq-comment-header">\
	 <cite id="dsq-cite-10736921" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10736921" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10736921" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10736921" class="dsq-comment-message">Yes, if the goal was just to make code available for future employers, there were other options.<br><br>But this was also about me being able to do what I want with something I created... my property, my rights, my decision.<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10741110">\
	 <div id="dsq-comment-header-10741110" class="dsq-comment-header">\
	 <cite id="dsq-cite-10741110" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10741110" href="http://twitter.com/andrewspittle" target="_blank" rel="nofollow">Andrew Spittle</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10741110" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10741110" class="dsq-comment-message">Furthermore, I think the fact that Dr. Beesan now must create new assignments for his courses is a good thing. As a college student myself too often do I find myself thinking that professors are simply using assignments and paper topics that they have recycled for years. Sometimes forcing creativity and change is a good thing. I commend Kyle for not allowing Dr. Beesan to simply re-use assignments over and over again.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10761339">\
	 <div id="dsq-comment-header-10761339" class="dsq-comment-header">\
	 <cite id="dsq-cite-10761339" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10761339" href="http://neonderbycars.blogspot.com/" target="_blank" rel="nofollow">Bryce</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10761339" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10761339" class="dsq-comment-message">I\'m on the fence about the overall issues involved here.  But you must see the difference between pressuring a professor to update his assignments and making sure that no assignment can bear even a passing resemblance to a previous assignment.<br><br>By the way, your commendation is exactly the opposite of what Kyle himself is saying: that he never had any intention of making it easier for students to cheat.  You\'re admitting to the potential for future shenanigans, even if Kyle isn\'t.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10737061">\
	 <div id="dsq-comment-header-10737061" class="dsq-comment-header">\
	 <cite id="dsq-cite-10737061" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10737061">kjinx</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10737061" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10737061" class="dsq-comment-message">Re: michael_dorfman -- "...... All that was accomplished is that the professor now needs to spend time every year retooling all of the homework problems so students can\'t easily copy from the now web-published version of) last year\'s answers."<br><br>Which is precisely why the professor raised such a fuss in the first place. Having created these assignments once, he did not want to put in the "extra?" work to generate new ones (I speak here from experience having been a prof myself). It\'s just "academic laziness" disingenuously masquerading as concern for "academic Integrity". He might have approached the issue with the student by explaining his concern about having to redo the assignment (ie. "just been honest"), instead he attempted to bully the student with threats. The student stood his ground ... excellent .... and learning occurred, to wit: "Do not let authority figures bully you, remain respectful, but stick to your guns when you believe you are in the right." Could very well be a more valuable lesson than anything having to do with coding.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10947843">\
	 <div id="dsq-comment-header-10947843" class="dsq-comment-header">\
	 <cite id="dsq-cite-10947843" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10947843">Bob</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10947843" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10947843" class="dsq-comment-message">Well said, Kjnx. As someone who has taught graduate classes I can tell you that it can be a lot of work to create new assignments every semester, so from that point I can see why the professor would not want the results posted. However, the professor in question should have just ask nicely, been honest, and explained his reasoning. But instead of trying to bully his student under a serious threat of academic integrity. This action should be noted in the professors record. I don\'t mean to say the professor should be disciplined for doing this once, but it is a serious breach of conduct if this is a normal pattern of behavior.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10738116">\
	 <div id="dsq-comment-header-10738116" class="dsq-comment-header">\
	 <cite id="dsq-cite-10738116" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10738116">trolley</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10738116" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10738116" class="dsq-comment-message">No comments in your code...tsktsk! ;)<br><br>Good for you for sticking up for yourself.<br><br>I like your SVN web interface. What software is that?</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10738761">\
	 <div id="dsq-comment-header-10738761" class="dsq-comment-header">\
	 <cite id="dsq-cite-10738761" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10738761" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10738761" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10738761" class="dsq-comment-message">Yeah, well I tried to comment in the beginning of the class, and gave up... we had one of these projects due every week or so, and I had to move to fast to be able to care about comments.  ;-)<br><br>I think I did a fairly decent job of making it "readable code" though...<br><br>The SVN UI is "WebSVN": <a href="http://websvn.tigris.org/" rel="nofollow">http://websvn.tigris.org/</a>  It\'s made by the same people who do TortoiseSVN and a bunch of other stuff...  it\'s pretty cool, and very easy to setup.<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10741453">\
	 <div id="dsq-comment-header-10741453" class="dsq-comment-header">\
	 <cite id="dsq-cite-10741453" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10741453">Andrew</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10741453" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10741453" class="dsq-comment-message">I find it startling that this issue arose at all.  At this same institution, it is common practice for students to retain copies of their classwork for use in personal portfolios.  If an art instructor indicated that students could not share the results of their efforts on assigned work to anyone outside of the class, post photos on Facebook after they had been submitted for course work, etc. there would be an uproar.  How is code different from artwork, essays or mathematical proofs?<br><br>I suspect that too many instructors rely on reuse of homework exercises each time they teach a course and struggle with the level of plagiarism this practice generates.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10744056">\
	 <div id="dsq-comment-header-10744056" class="dsq-comment-header">\
	 <cite id="dsq-cite-10744056" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10744056" href="http://www.studypipe.com/" target="_blank" rel="nofollow">StudyPipe</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10744056" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10744056" class="dsq-comment-message">Why bother?  It seems like the fight was for the sake of a fight.  I mean, is it THAT important that your homework were online?  Why not just show future employers with a portfolio?  (generally speaking, I don\'t think employers after graduation will really care about 2nd year homework assignment code)<br><br>As a side note, I think it should be ok for Dr. Bresson to reuse assignments.  If he comes up with an assignment that really teaches students, why should he have to change it every year?  Don\'t get me wrong - I totally think that you posting the homework is fine and should be allowed...I just don\'t see what the point is of making such a big deal about it.  <br><br>To further this point, I am even more liberal than you and believe assignment answers should be posted by students before the assignment is due (definitely considered cheating currently but I don\'t think it should).  I support this website <a href="http://www.studypipe.com" rel="nofollow">http://www.studypipe.com</a> that actually allows students to anonymously share answers online.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10744109">\
	 <div id="dsq-comment-header-10744109" class="dsq-comment-header">\
	 <cite id="dsq-cite-10744109" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10744109" href="http://www.studypipe.com/" target="_blank" rel="nofollow">StudyPipe</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10744109" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10744109" class="dsq-comment-message">Ok, just reading some more of these comments.  I can see that the principle of it is important - so good work.  I can understand the reasoning for sticking up for yourself.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10747751">\
	 <div id="dsq-comment-header-10747751" class="dsq-comment-header">\
	 <cite id="dsq-cite-10747751" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10747751">Alex Gartrell</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10747751" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10747751" class="dsq-comment-message">Your introductory-level Java is unlikely to wow employers.  If you want to do that, you should work for an Open Source project or on a real project.  But more power to you for making life harder on a guy who tried to teach you something.  You really kicked "the man\'s" ass on that one.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10764445">\
	 <div id="dsq-comment-header-10764445" class="dsq-comment-header">\
	 <cite id="dsq-cite-10764445" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10764445">Rob Williams</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10764445" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10764445" class="dsq-comment-message">Excellent!  Thank you for having the courage to act and then following through with it.  I especially thank you for making it public, because such struggles need to be known to establish precedents and to encourage others.<br><br>I also applaud Dr. Louden for his sensible, measured response and eventual follow-through.<br><br>Dr. Beeson should be ashamed, not because he held a different view, but because he actively, emotionally vilified you in the process.  Such behavior reflects very poorly on himself and his institution--that is NOT the academic spirit of inquiry and debate that should dominate such interactions.  Instead, such behavior is typical of an authoritarian police state.  It makes me think of the cops that recently tazed the 72-year-old grandmother or the tiny Chihuahua (and then shot it).</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10768262">\
	 <div id="dsq-comment-header-10768262" class="dsq-comment-header">\
	 <cite id="dsq-cite-10768262" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10768262">Jorge Reyes-Spindola</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10768262" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10768262" class="dsq-comment-message">Dear Kyle:<br>One thing that I believe really helped your case was that you were articulate and polite in all of your correspondence.  You stated your points clearly and concisely without accusations or name-calling. Would that everybody be as polite as you.  Congratulations on your victory.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10773128">\
	 <div id="dsq-comment-header-10773128" class="dsq-comment-header">\
	 <cite id="dsq-cite-10773128" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10773128" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10773128" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10773128" class="dsq-comment-message">True, and thanks.<br><br>However, I\'m not always that polite.  When it comes to legal situations or other important issues, I am, but I can fly off the handle just as easily in other situations.<br><br>Just wanted to point out that if you look hard enough, you\'ll find I\'m not always that polite ;-)<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10768314">\
	 <div id="dsq-comment-header-10768314" class="dsq-comment-header">\
	 <cite id="dsq-cite-10768314" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10768314" href="http://www.runwiththelaw.com" target="_blank" rel="nofollow">GregSJ</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10768314" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10768314" class="dsq-comment-message">Congrats on the victory.  Always good to see when common sense prevails.<br><br>BTW you made <a href="http://techdirt.com" rel="nofollow">techdirt.com</a> as well.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10768382">\
	 <div id="dsq-comment-header-10768382" class="dsq-comment-header">\
	 <cite id="dsq-cite-10768382" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10768382">Jonthecomposer</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10768382" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10768382" class="dsq-comment-message">Great Post!!!<br><br>Some people are lazy. I\'m not just talking about Dr. Beeson or any future student that wishes to copy code. But here\'s the deal: <br>1) Those whose code has been published knowingly have a much easier time knowing when someone else copies it. So they are MORE protected.<br>2) Just because people can find the answers doesn\'t necessarily mean they will copy them or that the professor must "retool" his lessons every year.<br><br>I\'ve taken programming courses and, unless you know what you are doing, it\'s a VERY BAD thing to try to copy. Because once questions or a test comes, you\'re just lost. Then guess what the teacher knows you\'ve been doing if your "work" is great? Alternatively, if you HAVE learned what you need to know and you find you must look an example up, you\'ll be smart enough to simply apply the logic to your own code rather than copying it! Either way, it means that the teacher really isn\'t in much jeopardy by letting students post code.<br><br>Finally, I really don\'t like all of these peoples\' hard-line ideas about copy protection. Some of it is just ludicrous. I mean, why is it that a patent (something that could potentially earn an individual or business billions more than a copyright) is up after only 20 years, but a copyright is basically forever? It has to do with money, big business, and lobbying groups. Yeah, try to lessen the length of a copyright with the RIAA around--- and try to extend the years of patent protection when the military needs to borrow the tech!!! Not gonna happen.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10769016">\
	 <div id="dsq-comment-header-10769016" class="dsq-comment-header">\
	 <cite id="dsq-cite-10769016" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10769016" href="http://coderanger.net/" target="_blank" rel="nofollow">Noah Kantrowitz</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10769016" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10769016" class="dsq-comment-message">I actually have done the same, all my old homeworks from CS classes are available in my public subversion repo. I can actually tell when certain assignments are given out each year because I see a huge spike in Google referrals to those pages with keywords that indicate people are clearly trying to cheat. I can see his argument that it can dangerous if the professor isn\'t smart enough to add slight variations each time they reuse a problem. Of course students are usually far more industrious when it comes to cheating than to actually doing the work, and they will find old answers even without the aid of the Internet. Luckily these specific assignments are not only different each year, they are keyed to each student.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10773122">\
	 <div id="dsq-comment-header-10773122" class="dsq-comment-header">\
	 <cite id="dsq-cite-10773122" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10773122">student_a</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10773122" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10773122" class="dsq-comment-message">All this tussle for some basic algorithm recreations? I bet you think you\'re the man now. You need to learn to respect your elders, son.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10782693">\
	 <div id="dsq-comment-header-10782693" class="dsq-comment-header">\
	 <cite id="dsq-cite-10782693" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10782693">js</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10782693" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10782693" class="dsq-comment-message">@student_a It seems that it was the prof that started the "tussle". And from what was posted I think that Mr. Brady approached this situation in a polite and respectful manner. <br><br>But the point is that profs should not be able to stop students from posting their code solutions online, or penalize their students for doing so.<br><br>Way to hang in there Kyle!</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10782422">\
	 <div id="dsq-comment-header-10782422" class="dsq-comment-header">\
	 <cite id="dsq-cite-10782422" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10782422">M. Heer</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10782422" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10782422" class="dsq-comment-message">I have enjoyed reading this story. As a teacher myself, I can see where the professor is coming from and the slippery slope you have set him on. As a former student, I can see where you, the creator and designer, want to display your work. <br>I feel like he is fighting because he doesn\'t want to make more work for himself... Coming up with new assignments every year so people can\'t just copy your work. I applaud your fighting for what is right. Change is the only thing that is constant, and you are forcing him to re-think and modify the thing he has worked hard to create. <br>The world will be better because of this. It just means more work for your professor. But he\'s a smart guy, and he will adapt and overcome. Good for you for sticking to your guns! I wish you the best of luck in the future.<br><br>M. Heer</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10790473">\
	 <div id="dsq-comment-header-10790473" class="dsq-comment-header">\
	 <cite id="dsq-cite-10790473" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10790473">Donkey Face</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10790473" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10790473" class="dsq-comment-message">and now Hacker News</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10790538">\
	 <div id="dsq-comment-header-10790538" class="dsq-comment-header">\
	 <cite id="dsq-cite-10790538" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10790538" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10790538" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10790538" class="dsq-comment-message">Noted, thanks!<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10794085">\
	 <div id="dsq-comment-header-10794085" class="dsq-comment-header">\
	 <cite id="dsq-cite-10794085" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10794085" href="http://srynas.blogspot.com/" target="_blank" rel="nofollow">Steve R.</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10794085" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10794085" class="dsq-comment-message">This points out, in a loose manner, to a long standing concern that I have had with how computer science is taught.  I have been out of school for a long time, so it is possible that I am out of touch with reality.  But, it seems to me that students are an underutilized resource for the open software efforts such as LINUX.<br><br>What I would like to suggest is that student assignments be based on solving a current issue, versus rehashing prior projects.  Essentially our current approach is to re-invent the wheel.  What I would suggest, if LINUX does not have driver for a printer/monitor or other device, why not have that as an individual student assignment and/or class project?  It would be a win-win approach.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10804228">\
	 <div id="dsq-comment-header-10804228" class="dsq-comment-header">\
	 <cite id="dsq-cite-10804228" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10804228" href="http://www.facebook.com/people/Desiree-Cox/709657736" target="_blank" rel="nofollow">Desiree Cox</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10804228" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10804228" class="dsq-comment-message">Poor Dr. Beeson. If he hadn\'t responded in the first place, he wouldn\'t have helped make his test answers so famous.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10820313">\
	 <div id="dsq-comment-header-10820313" class="dsq-comment-header">\
	 <cite id="dsq-cite-10820313" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10820313" href="http://www.kevingisi.com/" target="_blank" rel="nofollow">Kevin W. Gisi</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10820313" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10820313" class="dsq-comment-message">Thank you, on behalf of student everywhere. It\'s absurd that so many professors have been able to remain stagnant in the way they teach their courses, such that students are nearly restricted from learning anything directly applicable to their field.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10839533">\
	 <div id="dsq-comment-header-10839533" class="dsq-comment-header">\
	 <cite id="dsq-cite-10839533" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10839533">Jikim</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10839533" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10839533" class="dsq-comment-message">Congrats on winning your "fight." Hopefully the outcome will cause more Computer Science majors to post their code online. Honestly, I never thought about it as you did. I always just hurry and try to do the hw/project, struggle, and just stash it away in some dark corner or trash can so I never have to see it again. I think your way is more helpful though. (:</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10839808">\
	 <div id="dsq-comment-header-10839808" class="dsq-comment-header">\
	 <cite id="dsq-cite-10839808" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10839808">Joe</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10839808" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10839808" class="dsq-comment-message">This is obviously an act of academic dishonesty. From section 1.1.7, you may not aid others in cheating. Whether or not that was your intention is not at issue. You know---in fact, it seems to have been part of your motivation for posting your solutions---that professors reuse assignments. Thus you also know that unless the professor discovers your solutions and changes his assignments, your solutions *will* aid future students in cheating. What you have done is to blackmail a professor into teaching the way *you* think he should teach, and then to claim that you have been treated unfairly. Professors have a hard enough job without having to deal with issues like this; if you tried to blackmail me, I would respond explosively too.<br><br>*You* should be ashamed.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10841281">\
	 <div id="dsq-comment-header-10841281" class="dsq-comment-header">\
	 <cite id="dsq-cite-10841281" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10841281" href="http://twitter.com/DocAustin" target="_blank" rel="nofollow">Steve Elmore</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10841281" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10841281" class="dsq-comment-message">Joe, that is an absurd assertion, especially after the SJSU Judicial Affairs Office agreed with Kyle\'s position. A professor teaching a course should, as a matter of good practice, update assignments after each term specifically to prevent plagiarism, and also to keep course content relevant and current. Reusing assignments year after year is intellectual and academic laziness, a disservice to the students and a failure to maintain doctoral rigor. Additionally, peer reviewed solutions to any problem in a foundational course are widely available on the Internet, so it makes little difference if an assignment is posted publicly by a student after the due date. As long as a student gives proper attribution, uses peer reviewed sources and does not plagiarize, I don\'t care what they read or where they get their ideas. We (academics) are trying to teach problem solving and the student\'s work will speak for itself. There was no blackmail here; this was an honest difference of opinion and Kyle prevailed (and conducted himself admirably).</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10844296">\
	 <div id="dsq-comment-header-10844296" class="dsq-comment-header">\
	 <cite id="dsq-cite-10844296" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10844296" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10844296" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10844296" class="dsq-comment-message">Well,<br><br>I\'m going to go ahead and guess you\'re a CS Prof. at SJSU trolling here.<br><br>And I\'m not going to even counterpoint you, because your argument is baseless.<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10869896">\
	 <div id="dsq-comment-header-10869896" class="dsq-comment-header">\
	 <cite id="dsq-cite-10869896" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10869896" href="http://acadavid.info/" target="_blank" rel="nofollow">acadavid</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10869896" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10869896" class="dsq-comment-message">Kyle, you don\'t have nothing to be ashamed of. You are the one in the right side here.. this guy Joe is an absolute academic dishonesty... hopefully one day someone will kick him from his position, cause if he is a teacher.. he doesn\'t deserves it at all. And yeah... what a baseless argument.<br><br>Kyle, thanks for giving that hard fight! Very nice and polite answers, and congratulations on your victory for knowledge freedom :)</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10879408">\
	 <div id="dsq-comment-header-10879408" class="dsq-comment-header">\
	 <cite id="dsq-cite-10879408" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10879408">alex</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10879408" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10879408" class="dsq-comment-message">I think I agree to an extent with Joe here. Dijkstra\'s algorithm and Binary Search Trees aren\'t going to change much from year to year, so I think it\'s unfair to call it lazy to reuse assignments. <br><br>Now, every year that the class is taught Beeson has two options. Make a minor modification to an assignment or completely rewrite it. If he opts to make a minor adjustment, then a student who has access to the previous years answers can simply tweak the source code to match the new behavior. They don\'t have to fully understand what they\'re doing, or why the algorithm works. They just need to figure out what part of the .java to hack and then they learn nothing from the assignment. <br><br>It seems reasonable to not want to have to rewrite assignments every year. The algorithms aren\'t changing year to year, and students aren\'t going to learn more from year 2010\'s version of the problem then they are 2009\'s. This is an intro to algorithms course, not a bleeding edge research course where the curriculum is going to change every year based on new research. The basic algorithms this year are going to be the same ones that are being used next year. <br><br>And then there\'s the question of how much you\'re actually helping people by posting your answers. For me, the actually having to figure out how to translate the psuedocode into real working code, and understanding the concept behind the algorithms were the useful skills. I don\'t believe that post your source code aids either. Learning to put down an algorithm from the psuedocode is something you learn through doing. Once you learn that skill you don\'t need the answers from someone else, because the answers are all right in the book. And in the case where I couldn\'t figure something out I went to Beeson\'s office hours and he was able to help me figure out what I was doing wrong. <br><br>It might be useful to other students who\'ve taken the class to see another approach to the problem so they can see how others did it, but you can just send emails back and forth or talk about the problem in the CS club room to do that. Realistically, I doubt many people outside of the people taking the class are going to be very interested in your particular implementation of the Bellman-Ford algorithm, and the people who are taking the class would get more out of the assignment if they were to figure it out on their own. <br><br>I don\'t disagree that you have the right to post your solutions on the internet and be a smug jerk about it. You\'re in the right here, but you\'re still a smug jerk at the end of the day. If I were in your situation I would take down the answers. Not as matter of freedom to do what you want with your code, but as a courtesy.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10880574">\
	 <div id="dsq-comment-header-10880574" class="dsq-comment-header">\
	 <cite id="dsq-cite-10880574" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10880574" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10880574" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10880574" class="dsq-comment-message">Whatever.<br><br>I\'m not being a smug jerk.  Just doing what I want with my property, as I\'m allowed to.<br><br>I\'m not taking down the answers... courtesy to who?  The Professor?<br><br>Please.  They\'re paid to work with students, and it\'s not really my problem if this means he feels he can\'t reuse his assignments each semester.<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-11005303">\
	 <div id="dsq-comment-header-11005303" class="dsq-comment-header">\
	 <cite id="dsq-cite-11005303" class="dsq-comment-cite">\
	 <a id="dsq-author-user-11005303" href="http://acadavid.info/" target="_blank" rel="nofollow">acadavid</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-11005303" class="dsq-comment-body">\
	 <div id="dsq-comment-message-11005303" class="dsq-comment-message">I don\'t even care if posting the code will help other students... It\'s his right, Period. But, you are just trying to justify a bunch of lazy and mediocre teachers. In fact, there are a tons of ways to know if a student copied a code, but it\'s just teachers are lazy and they don\'t even check the code.<br><br>You can do when of things to reuse a homework: Modify the statement in a key point where you can recognize a new implementation of the whole algorithm or a deep understanding of it. If you can\'t get to that, then, add something else to the homework, something else that requieres to know how the algorithm works.<br><br>If you just want to use the same homework, well... chances of cheating are always there, he can even pay another student to do it\'s homework for him.. It doesn\'t matter.. it\'s the same shit, if you want to cheat, you cheat, however you want. Now, make a good list of question, regarding the implementation of the algorithms, and seat with each student, ask each a couple of questions to see if he really understands the code. ASk the student to turn around, break the code at certain point, and ask him to fix it. Ask him for details of implementation, why he thought of his implementation of that way, etc. There is a plenty of questions you can do... and if indeed the student can answer them all, and fixes the code, and everything else is right.. he either made the code by himself or copied someone else\'s code and fully understood it. If he fully understood it.. What\'s wrong? How fucking cares? He did what he got to do, understand the whole thing and that\'s what really matters.. Someday at work he will have problems trying to implement the algorithm and is going to regret about having the code copied. Even if I implement an algorithm myself, and i\'m going to use it 10 years later, i\'ll have to reread the whole thing again and understand it once again, but if I understood it the first time, i\'ll be easier the second.<br><br>Just stop justifying lazy teachers.. teaching is such an important profession, you need more than a Ph.D to be a teacher, you need the feel to be a teacher, you need to recognize the important of your job, you must give a lot of time to your classes because that\'s your job, what you are paid for.<br><br>So.. Alex don\'t come here to call someone "smug jerk" just because he wants to share his knowledge, you are the real smug jerk trying to justify things because you are a lazy person and just think of knowlegde as a matter of doing a homework.. how naive.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10843126">\
	 <div id="dsq-comment-header-10843126" class="dsq-comment-header">\
	 <cite id="dsq-cite-10843126" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10843126" href="http://www.facebook.com/people/Kyle-Thomas-Wilson/34702744" target="_blank" rel="nofollow">Kyle Thomas Wilson</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10843126" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10843126" class="dsq-comment-message">I had Beeson for windows programming in Fall \'08 as well as other classes and posted all of my source code also. I guess I\'m just lucky he didn\'t know about my website ( <a href="http://kylewilson.info/2008/10/09/windows-programming/" rel="nofollow">http://kylewilson.info/2008/10/09/windows-progr...</a> ). I found your article via Ars Technica <a href="http://arstechnica.com/open-source/news/2009/06/academic-source-code-dust-up-symptom-of-cs-education-ills.ars" rel="nofollow">http://arstechnica.com/open-source/news/2009/06...</a><br><br>This whole thing just reeks of laziness to me. Can\'t be bothered either to change part of the programming assignments from year to year or even to check carefully for plagiarism compared to previous submitted assignments. I\'m glad Judicial Affairs ruled on your side.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10844326">\
	 <div id="dsq-comment-header-10844326" class="dsq-comment-header">\
	 <cite id="dsq-cite-10844326" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10844326" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10844326" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10844326" class="dsq-comment-message">Thanks.<br><br>I had two things going for me that probably didn\'t help... the first being that I have a Google PageRank and show up when you use the right keywords.  A more probably reason, however, is that a student found out about what I was doing, wasn\'t happy, and could have easily told Beeson.<br><br>But I know I\'m not the only one ;-)  The others just weren\'t discovered.<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10843178">\
	 <div id="dsq-comment-header-10843178" class="dsq-comment-header">\
	 <cite id="dsq-cite-10843178" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10843178">MoFoQ</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10843178" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10843178" class="dsq-comment-message">yea, I had Beeson too, not one of the most "pleasant" characters and I guess after this, can definitely be considered as one of the "old dogs" who doesn\'t understand the desire to post your own work for the public good.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10843638">\
	 <div id="dsq-comment-header-10843638" class="dsq-comment-header">\
	 <cite id="dsq-cite-10843638" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10843638">Meh</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10843638" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10843638" class="dsq-comment-message">Hey,<br><br>Good job but for the sake of not coming off as a ponce, learn to write in simple English and never brandish a thesaurus and dictionary like weapon in the future it just lessens the impact of your writing.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10844375">\
	 <div id="dsq-comment-header-10844375" class="dsq-comment-header">\
	 <cite id="dsq-cite-10844375" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10844375" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10844375" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10844375" class="dsq-comment-message">Lol?<br><br>Simple English?  Brandish a Thesaurus?<br><br>I hope you\'re either foreign or in middle school, because otherwise you have no excuse for being stupid.  This is one of the simplest-written pieces I\'ve done in a while... just because you\'re too stupid to understand it doesn\'t mean it was written at a high level.<br><br>Maybe you should learn to carry a thesaurus and dictionary with you at all times to translate what you don\'t understand.<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10844032">\
	 <div id="dsq-comment-header-10844032" class="dsq-comment-header">\
	 <cite id="dsq-cite-10844032" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10844032">Markos Nt. Apostolidis</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10844032" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10844032" class="dsq-comment-message">I am a Professor of computer science from a private university in Greece, EU (cooperating, as a franchise, with a British university) and I do not allow my students to post their answers to homework questions online or otherwise make their code available to anyone else. The code written for the purposes of education is the intellectual property of the university or the professor (depending on who wrote the initial homework questions). The reason is simple: if students were allowed to post their code, we (the professors) should change our questions for each new class, something we have no intention of doing as it is time-consuming and easily avoided by treating the students\' answers as our intellectual property.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10844392">\
	 <div id="dsq-comment-header-10844392" class="dsq-comment-header">\
	 <cite id="dsq-cite-10844392" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10844392" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10844392" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10844392" class="dsq-comment-message">Exactly one of the points I was making.<br><br>Congratulations on having a horrible point of view.<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10844496">\
	 <div id="dsq-comment-header-10844496" class="dsq-comment-header">\
	 <cite id="dsq-cite-10844496" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10844496">A.P.</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10844496" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10844496" class="dsq-comment-message">Mr. Apostolidis, you are wholly in the wrong.  I too am a teacher (both at the high school and college level), and I would never dream of asserting copyright or IP rights over my students\' work.  At best, your argument is profoundly lazy on both a professional and intellectual level.  I go to the effort of rewriting exam and homework materials for every new class, and consider it part of the job.  I see no reason you shouldn\'t do so as well, or at the very least, reuse materials on a rotating 5- to 10-year schedule.<br><br>Frankly, I don\'t think any teacher or professor who would espouse that point of view belongs in the profession, because whatever your professional qualifications might be, your argument is a betrayal of some of the fundamental premises of a liberal education, and has no place in such institutions.  Shame on you.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10845058">\
	 <div id="dsq-comment-header-10845058" class="dsq-comment-header">\
	 <cite id="dsq-cite-10845058" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10845058" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10845058" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10845058" class="dsq-comment-message">Ah, but he\'s in Greece.<br><br>Not exactly known for being "liberal", is it?<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10845239">\
	 <div id="dsq-comment-header-10845239" class="dsq-comment-header">\
	 <cite id="dsq-cite-10845239" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10845239">A.P.</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10845239" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10845239" class="dsq-comment-message">True, though I mean to use the word "liberal" specifically as pertinent to those principles of education that come from the classical liberalism of the Enlightenment -- which don\'t necessarily map onto present-day political liberalism.  (Having said that, I am also a liberal in the political sense, and damn proud of it.)<br><br>And Greece does have a strong authoritarian streak, which is an unfortunate irony all things considered...</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10845495">\
	 <div id="dsq-comment-header-10845495" class="dsq-comment-header">\
	 <cite id="dsq-cite-10845495" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10845495" href="http://archalien.com/" target="_blank" rel="nofollow">Bryan</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10845495" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10845495" class="dsq-comment-message">Hey Kyle,<br>Saw it got slashdotted and as a responsible alum might, had to come by and offer my congratulations!  When I arrived in 2003, budget cuts had forced senior tenured professors back into the classroom instead of TA\'s doing that work for them, they were generally pretty grumpy about it.  I think this may be a vestige of that along with an evolving digital age.  I have to agree this was definitely a case of academic laziness on the part of Prof. Beeson, and academic dishonesty and immorality with the threats.  That said, I understand his concern as being at least maybe half heatedly legit although his actions sour his motivations. He was one of my favorite professors, through all this I hope its not lost he is not a bad man, nor do I think he is a bad professor, in fact one of the better professors on offer at SJSU imo. He is probably too close to the situation to appreciate that the code generated from his class was something you felt exceptional or otherwise worthy to be included in your online portfolio which reflects very well upon him.  I was able to learn with great success in a couple of his elective classes that have me growing an amazing carrer by over-delivering my pay and experience grade due in some small part based on my time in his classes.  Please, by no means, am I trying to in any way diminish his actions as anything other than wholly inappropriate imo, just dont throw out the baby with the bath water I guess. Once again congrats.  Hope to meet you in the club next time I run through.<br><br>Bryan- BSCS SJSU 2007</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10870258">\
	 <div id="dsq-comment-header-10870258" class="dsq-comment-header">\
	 <cite id="dsq-cite-10870258" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10870258">SJKim</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10870258" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10870258" class="dsq-comment-message">This is an interesting issue.  I went to a rather expensive private university in Boston area and had the priviledge of TA-ing for one of the really good professors.  As part of this class, I had to develop all the assignments.  It was definitely more work than reusing past assignments, however, at the same time, it made us constantly evaluate the purpose of the assignment.  <br><br>We weren\'t as focused on whether students could copy the code but more on whether they were able to internalize the concept and employ it in a different setting.  This isn\'t always easy but it is worth it both for the teachers and the students.  We were always able to hone in on the challenging topics (based on the questions from the assignments) and focus more time/effort helping students learn.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10881946">\
	 <div id="dsq-comment-header-10881946" class="dsq-comment-header">\
	 <cite id="dsq-cite-10881946" class="dsq-comment-cite">\
	 <span id="dsq-author-user-10881946">ivo</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10881946" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10881946" class="dsq-comment-message">It\'s physically impossible to prevent the professor from giving you a penalty for causing this trouble - he can just "be in a bad mood" every time he grades anything you do.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10886216">\
	 <div id="dsq-comment-header-10886216" class="dsq-comment-header">\
	 <cite id="dsq-cite-10886216" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10886216" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10886216" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10886216" class="dsq-comment-message">Are you dumb?<br><br>This is code, so there\'s really no subjectivity.  It works, or it doesn\'t.<br><br>And, do you really think, after all this, I\'m going to put up with being graded down for bullshit?<br><br>Please.<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10904101">\
	 <div id="dsq-comment-header-10904101" class="dsq-comment-header">\
	 <cite id="dsq-cite-10904101" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10904101" href="http://archalien.com/" target="_blank" rel="nofollow">Bryan</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10904101" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10904101" class="dsq-comment-message">Hey Kyle, SJSU CS Alum here again, I seem to recall some clause (if memory serves) somewhat CS specific regarding any code/invention created by the student as part of a class or similar was some sort of work product with ownership going to the university.  Maybe Im pulling out of my hind end, but Im sure I saw that somewhere sometime, maybe not at SJSU though.  I figured you might have come across something of that nature during this incident, or may it didnt apply in this situation, curious if you came across anything of the sort?<br><br>B- SJSU BSCS 2007</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10904139">\
	 <div id="dsq-comment-header-10904139" class="dsq-comment-header">\
	 <cite id="dsq-cite-10904139" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10904139" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10904139" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10904139" class="dsq-comment-message">I never signed anything to that effect, nor was I told about it.<br><br>I also feel like it would have came up when Judicial Affairs came down with a proclamation. ;-)<br><br>From what I know, it\'s research universities and private schools that tend to do this... not so much SJSU.<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-10952161">\
	 <div id="dsq-comment-header-10952161" class="dsq-comment-header">\
	 <cite id="dsq-cite-10952161" class="dsq-comment-cite">\
	 <a id="dsq-author-user-10952161" href="http://twitter.com/enviroresearch" target="_blank" rel="nofollow">bruce j. edmonds III</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-10952161" class="dsq-comment-body">\
	 <div id="dsq-comment-message-10952161" class="dsq-comment-message">Nice Blog...interesting "CopyFight" with the Professor...I am old school "did not finish my PhD" back in the early 90s...my thoughts on this issue: the old model of higher education "Ivy covered brick structures" is fast changing...Open Source and online publications first changed the newspaper media, and now the intellectual world...no one in their right mind wants a hunk of dead tree thrown on their lawn @ dawn with news that is one to two days old...a rather failed business model...now in intellectual circles research is undergoing a massive 360\' degree about face...I feel it is all for the good...err remember those Monks in the Dark Ages who held all the books in the World in their libraries...books chained to the desk..and they decided who "got to see them" or some rich Lord or Baron in a rather smelly castle decided who could read what book or research document...just like the printing press changed all that muck...online publications (including this rather well written blog) have changed the information systems of the third planet back from the Sun...good luck and may the force be with u...</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-11031761">\
	 <div id="dsq-comment-header-11031761" class="dsq-comment-header">\
	 <cite id="dsq-cite-11031761" class="dsq-comment-cite">\
	 <a id="dsq-author-user-11031761" href="http://www.psitutor.org/" target="_blank" rel="nofollow">Char</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-11031761" class="dsq-comment-body">\
	 <div id="dsq-comment-message-11031761" class="dsq-comment-message">i am posting a link to this debate for the students visiting my site. how great that you maintained a sense of calm and wit during this. ludicrous is the right word.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-11034552">\
	 <div id="dsq-comment-header-11034552" class="dsq-comment-header">\
	 <cite id="dsq-cite-11034552" class="dsq-comment-cite">\
	 <a id="dsq-author-user-11034552" href="http://gregoire.org/" target="_blank" rel="nofollow">Paul Gregoire</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-11034552" class="dsq-comment-body">\
	 <div id="dsq-comment-message-11034552" class="dsq-comment-message">Kyle, I heard about your blog from Cay Horstmanns post (<a href="http://weblogs.java.net/blog/cayhorstmann/archive/2009/06/my_department_i.html" rel="nofollow">http://weblogs.java.net/blog/cayhorstmann/archi...</a>) and I looked at your TicTacToe code. My honest opinion is that its ok for an early novice, but it will certainly not help you get a job. Most Engineers that I know would tear your short piece of code to bits. Lastly, I understand your professors point of view but he should not have threatened to fail you; that is complete bs. Good luck to you in the future.<br><br>Paul<br><a href="http://twitter.com/mondain" rel="nofollow">http://twitter.com/mondain</a></div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-11034688">\
	 <div id="dsq-comment-header-11034688" class="dsq-comment-header">\
	 <cite id="dsq-cite-11034688" class="dsq-comment-cite">\
	 <a id="dsq-author-user-11034688" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-11034688" class="dsq-comment-body">\
	 <div id="dsq-comment-message-11034688" class="dsq-comment-message">Hey Paul,<br><br>Well, I agree.  I had to take down the problem descriptions and things associated with them for the moment to prevent Beeson from having any valid claims on this...<br><br>But if they were up, it would have been obvious why this is kind of hacky code:  we received a handful of assignments at the beginning of the semester and had to solve them in a week (maybe two) or we\'d be dropped from the class.  Along with the rest of the semester\'s activities, you can imagine why the code isn\'t that great ;-)  The implementation of the Google PageRank algorithm [ <a href="http://projects.kyle-brady.com/svn/filedetails.php?repname=sjsuProjects&path=%252Fcs146%252FGoogle%252Ftrunk%252FGoogle.java" rel="nofollow">http://projects.kyle-brady.com/svn/filedetails....</a> ] is probably more impressive.<br><br>That being said, I\'m really not expecting it to help me get a job.  And if I were, I definitely wouldn\'t be pointing them to this code without some sort of context, the way you came across it.<br><br>Thanks for the feedback though<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-11034789">\
	 <div id="dsq-comment-header-11034789" class="dsq-comment-header">\
	 <cite id="dsq-cite-11034789" class="dsq-comment-cite">\
	 <span id="dsq-author-user-11034789">MoFoQ</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-11034789" class="dsq-comment-body">\
	 <div id="dsq-comment-message-11034789" class="dsq-comment-message">I don\'t agree with Prof Horstmann\'s conclusions, at least not a hundred percent.<br><br>In JAVA, yes, "if (someboolean == false)" may not be as "readable" but in the real world...especially if it\'s PHP and not JAVA....it\'s not a bad thing (of course it should be "if(someboolean === false)" instead for PHP since it doesn\'t have the same ordinal data types as JAVA).</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-11034995">\
	 <div id="dsq-comment-header-11034995" class="dsq-comment-header">\
	 <cite id="dsq-cite-11034995" class="dsq-comment-cite">\
	 <a id="dsq-author-user-11034995" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-11034995" class="dsq-comment-body">\
	 <div id="dsq-comment-message-11034995" class="dsq-comment-message">Yeah I just went over and read what he wrote...<br><br>I said something about that too.  This was my first time doing Java, and I was learning on the fly.  I didn\'t figure it out until a bit later that !var would work.  If you go through the code from Project 1 -&gt; Project [last], you can see a pretty strong progression of structure, syntax, and style.<br><br>Thanks ;-)<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-11480225">\
	 <div id="dsq-comment-header-11480225" class="dsq-comment-header">\
	 <cite id="dsq-cite-11480225" class="dsq-comment-cite">\
	 <span id="dsq-author-user-11480225">MoFoQ</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-11480225" class="dsq-comment-body">\
	 <div id="dsq-comment-message-11480225" class="dsq-comment-message">yea, and to a potential employer, the capacity to grow and learn is more valuable than an old dog who can\'t/won\'t learn new tricks.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-11492970">\
	 <div id="dsq-comment-header-11492970" class="dsq-comment-header">\
	 <cite id="dsq-cite-11492970" class="dsq-comment-cite">\
	 <a id="dsq-author-user-11492970" href="http://www.kyle-brady.com" target="_blank" rel="nofollow">Kyle Brady</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-11492970" class="dsq-comment-body">\
	 <div id="dsq-comment-message-11492970" class="dsq-comment-message">Amen!<br><br>--Kyle</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-12677228">\
	 <div id="dsq-comment-header-12677228" class="dsq-comment-header">\
	 <cite id="dsq-cite-12677228" class="dsq-comment-cite">\
	 <a id="dsq-author-user-12677228" href="http://spiralofhope.com/" target="_blank" rel="nofollow">spiralofhope</a>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-12677228" class="dsq-comment-body">\
	 <div id="dsq-comment-message-12677228" class="dsq-comment-message">With free software, all software should be free (gratis and libre) but the support and modifications of that free software can be the for-pay industry.<br><br>It ought to be similar with education.  All the tangible parts of education should be freely available.  All of it.<br><br>- The student\'s homework, essays, research.<br>- The lesson plans, the lesson materials, lecture videos.<br><br>No copyrights, no patents, no special cases.<br><br>The real value that is added is with the educational process itself.  The classroom time, the study groups, the environment, etc.  Oh, and the scrap of paper you get that says you paid a huge amount of money and you are now eligible to compete for a job.<br><br>Professors who worry about "cheaters" (exercising their free speech rights) are just too lazy to change their lesson plan every year.  They shouldn\'t have a job.</div>\
	 </div>\
	 </li>\
	 <li id="dsq-comment-13748670">\
	 <div id="dsq-comment-header-13748670" class="dsq-comment-header">\
	 <cite id="dsq-cite-13748670" class="dsq-comment-cite">\
	 <span id="dsq-author-user-13748670">uknownstudent</span>\
	 </cite>\
	 </div>\
	 <div id="dsq-comment-body-13748670" class="dsq-comment-body">\
	 <div id="dsq-comment-message-13748670" class="dsq-comment-message">I go to SJSU and I feel your pain. The school is a national discrace as it has so many problems that the top heavy administration is unwilling to deal with. Our campus library is the main San Jose Public Library which is usually crowded with the homelsee all year round. We have antiquated labs from the 1950\'s and a faculty that is still braging  during class time about how they took on the administration during the Vietnam War but is scared to tackle the real problems of today. If you were considering going to this school think again and go anywhere else even a good junior college is one step up from this school . I hope they loose acredidation as it might wake them up.</div>\
	 </div>\
	 </li>\
	 </ul>\
';

(function() {
	
	





Dsq.Debug.profile(function() {
	if(Dsq.jsonData.request.page == 1 && Dsq.jsonData.request.is_initial_load) {
		Dsq.container.innerHTML = Dsq.Templates.header() + Dsq.container.innerHTML + Dsq.Templates.footer();
	}
	Dsq.$(Dsq.curPageId).innerHTML = Dsq.$(Dsq.curPageId).innerHTML.replace(Dsq.COMMENTS_RE, Dsq.CommentsHandler);
}); // Dsq.Debug.Profile

// HACK: Resetting cache because we're done with.
Dsq.Utils.gebiFromElementCollectionCache = null;


	
	
	var dsq_styleEl = document.getElementById(disqus_container_id);
	var dsq_anchorEl = document.getElementsByTagName('a')[0];
	
	Dsq.Thread.fc = Dsq.Utils.getStyle(dsq_styleEl, 'color');
	if(dsq_anchorEl) { Dsq.Thread.ac = Dsq.Utils.getStyle(dsq_anchorEl, 'color'); }
	Dsq.Thread.ff = Dsq.Utils.getStyle(dsq_styleEl, (Dsq.Utils.ie || window.opera ? 'fontFamily' : 'font-family'));
	// For Safari / Opera: strip quotes.
	Dsq.Thread.ff = Dsq.Thread.ff.replace(/['"]/g, '');
	Dsq.Thread.fc = encodeURIComponent(Dsq.Thread.fc);
	Dsq.Thread.ac = encodeURIComponent(Dsq.Thread.ac);
	Dsq.Thread.ff = encodeURIComponent(Dsq.Thread.ff);

	
	
	
	if(Dsq.$(Dsq.Templates.addPostContainer)) {
		// TODO: Check to see if theme uses postmessage.
		if (window.disqus_use_postmessage) {
			Dsq.frames['reply_0'] = new Dsq.ReplyFrame(Dsq.$(Dsq.Templates.textareaContainer));
			Dsq.frames['reply_0'].init(function() {
				// Use fallback iframe
				Dsq.$(Dsq.Templates.addPostContainer).innerHTML = '';
				var theme = (typeof disqus_frame_theme == 'undefined') ? 'default' : disqus_frame_theme;
				Dsq.Iframes.showReplyIframeInContainer(Dsq.$(Dsq.Templates.addPostContainer), null, {theme: theme});
				// if(Dsq.Utils.ie) { Dsq.Utils.fixIframesIE(); }
			});
		} else {
			// DEPRECATED
			Dsq.Iframes.showReplyIframeInContainer(Dsq.$('dsq-post-add'));
		}
	}

	
	

	
	if(document.location.hash != '') {
		document.location.hash = document.location.hash.substring(1);
	}

	Dsq.Popup.showCookieMsgs();

	
	if(document.location.search != '' && location.hash != '#disqus_thread') {
		var reply_id = Dsq.Utils.getRequestParams().dsq;
		if(reply_id) { document.location.hash = 'comment-' + reply_id; }
	}

	
	if((typeof OB_Script != 'undefined') && (typeof OB_versionNum != 'undefined')) {
		if(navigator.userAgent.indexOf("Firefox") != -1) {
			if(window.frames['dsq-reply-frame']) {
				window.frames['dsq-reply-frame'].location = Dsq.Urls.REPLY + (new Date()).getTime() + '&f=kyle-brady&t=how_i_won_a_copyfight&to_redirect=' + encodeURIComponent(window.location) + '&ifrs=' + encodeURIComponent(disqus_iframe_css);
			}
		}
	}

	if (Dsq.jsonData.integration.theme == 4) {
		if (Dsq.jsonData.realtime_enabled) {
			Dsq.Realtime.initialize();
		}
	}

	



	window.ExecuteWhen = (function () {
	var obj = {}
	
	// Private
	var running = false;
	var timer = null;
	var pending = [];
	var startTimer = function() {
		running = true;
		timer = setInterval(obj.heartBeat, 100);
	};
	var stopTimer = function() {
		running = false;
		clearInterval(timer);
	};
	
	// Public
	obj.add = function (condition, code) {
		pending.push([condition,code]);
		this.heartBeat(); //!
		if (!running) {
			startTimer();
		}
	};
	obj.heartBeat = function() {
		if (!pending.length) {
			stopTimer();
		}
		var newPending = [];
		for (var i=0; i<pending.length; i++) {
			var cond = pending[i][0];
			var code = pending[i][1];
			// FIXME: if cond or code throw an error, they never get removed from pending
			if (cond()){
				code();
			}
			else {
				newPending.push([cond, code]);
			}
		}
		pending = newPending;
	};
	return obj;
})();

// also used in embed_thread.js:
window.fbIsReady = function () {return window.FB && FB.init;};
// NOTE: This script gets executed again without threadEl
//       set when we are loaded again as the fbc_receiver.
//       In this case, we don't need the hidden container.

if(!window.FB || !FB.init) {
	if(window.Dsq && Dsq.container) {
		// container is not present when init.js is loaded from an xd-receiver iframe; in this case,
		// we don't need the FB_HiddenContainer anyway.
		var fbDiv = document.createElement('div');
		fbDiv.id = "FB_HiddenContainer";	// Required or else FeatureLoader will execute a document.write.
		fbDiv.style.position = 'absolute';	// This is intentionally not setting display to none as this breaks
		fbDiv.style.top = '-10000px';		// Flash in Safari.
		fbDiv.style.left = '-10000px';
		fbDiv.style.width = '0px';
		fbDiv.style.height = '0px';
		Dsq.container.appendChild(fbDiv);
	}
	var fbJS = document.createElement('script');
	fbJS.type = "text/javascript";
	fbJS.src = "http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php";
	document.getElementsByTagName('head')[0].appendChild(fbJS);

	ExecuteWhen.add(window.fbIsReady,
		function () {
			// HACK: This is a workaround FBC's single domain limitation by
			//		 allowing sites to create multiple forums with different
			//		 Facebook API keys.  This must be used in conjunction with
			//		 disqus_facebook_forum (see authenticateFacebook).
			var facebook_api_key = '96cf4cba61ea5bb97f2be75c98ac0171';
			if (typeof disqus_facebook_api_key != 'undefined') {
				facebook_api_key = disqus_facebook_api_key;
			}

			FB.init(facebook_api_key, window.facebookXdReceiverPath || null,
				{fetchSignedPublicSessionData: true});
		});
}


	


if(typeof(disqus_callback) == 'function') {
	var callback_params = Dsq.Utils.getRequestParams()['dsq_cbp'] || null;

	// We don't care about any errors in third-party code
	try {
		disqus_callback(callback_params);
	} catch (x) {
		if (typeof(console) != 'undefined' && typeof(console.log) == 'function') {
			// But it would be nice to let developers know about them
			console.log(x);
		}
		// pass
	}

	// HACK: We don't know if the callback wraps our container, which may
	// possibly result in a new DOM element.
	Dsq.container = document.getElementById('dsq-content');
}

})();




