(function($){
	$.fn.tccomments = function(options) {
		return this.each(function() {
			var settings = {
				useCaptcha: true,
				contentURL: '',
				currentPage: 1,
				maxPages: 0,
				publicKey: '',
				maxCommentLength: 0,
				reCaptchaObj: '',
				reCaptchaOptions: {
					theme: 'custom',
					custom_theme_widget: 'reCaptcha'
				},
				lblPrev: '',
				lblNext: '',
				lblNoComments: '',
				lblErrHeading: '',
				lblErrCaptcha: '',
				lblErrName: '',
				lblErrComment: '',
				lblErrRetry: '',
				lblErrPost: ''
			};
			
			if (options) {
	      $.extend(settings, options);
			}
			
			var container = $(this);
			
			var timestamp = new Date();
			
			if (settings.maxCommentLength > 0) {
				container
					.find('.commentForm form textarea')
					.keydown(function(){
						counter(container,settings.maxCommentLength);
					})
					.keyup(function(){
						counter(container,settings.maxCommentLength);
					});
			}
			
			$.getJSON(unescape(settings.contentURL),{'t': container.find('input[name=t]').val(),'uid': container.find('input[name=uid]').val(),'p': settings.currentPage,'timestamp': timestamp.getTime()},function(data){
				if (data.error == undefined) {
					checkDOM(container);
	
					if (data.maxpages > 1) {
						initPager(container,settings,data.maxpages);
					} else {
						container
							.find('.browseBoxWrap')
							.hide()
							.prev('.dotted_line')
							.hide();
					}
					
					updateCommentContent(container,data.content);
				} else {
					updateCommentError(container,settings,data.error);
				}
			});

			formOptions = {
				success: function(responseText,statusText,jqForm){
					container = jqForm.parents('.tccomments');
					responseHandler(container,responseText,statusText,settings);
				},
				dataType: 'json'
			};
			
			container
				.find('.commentForm form')
				.submit(function(){
					$(this).ajaxSubmit(formOptions);
					
					return false;
				});
		});
	};
	
	function counter(container,maxCommentLength) {
		if (container.find('.commentForm form textarea').val().length > maxCommentLength) {
			container
			  .find('.commentForm form textarea')
				.val(
					container
					  .find('.commentForm form textarea')
						.val()
						.substring(0,maxCommentLength)
				);

			container
			  .find('.counter span')
			  .html('0');
		} else {
			remainingLetters = maxCommentLength - parseInt(container.find('.commentForm form textarea').val().length);
			
			container
			  .find('.counter span')
			  .html(remainingLetters.toString());
		}
	}
		
	function responseHandler(container,responseText,statusText,settings) {
		if (responseText.errors == undefined) {
			container
			  .find('form')
			  .clearForm();
			container
				.find('.error')
				.remove();
			if (settings.maxCommentLength > 0) {
				container
				  .find('.counter span')
				  .html(settings.maxCommentLength);
			}
			
			updateComments(container,settings,1);
		} else {
			if (container.find('.commentForm .error').length < 1) {
				container
					.find('.commentForm')
					.prepend($('<div></div>')
					  .addClass('error')
					);
			}
			
			if (container.find('.commentForm .error ul').children().length > 0) {
				container
					.find('.commentForm .error ul')
					.empty();
			}
			
			var text = '';
			$.each(responseText.errors,function(){
				switch (this.toString()) {
					case 'name':
					  text = settings.lblErrName;
					  break;
					case 'email':
					  text = settings.lblErrEmail;
					  break;
					case 'captcha':
					  text = settings.lblErrCaptcha;
					  break;
					case 'comment':
					  text = settings.lblErrComment;
					  break;
				}
				
				container
				  .find('.commentForm .error')
				  .append($('<div></div>')
				    .html(text)
					);
			});
		}
		
		if (settings.useCaptcha == true) {
			settings.reCaptchaObj.reload();
		}
	}
		
	function checkDOM(container) {
		if (container.find('.commentContent').length < 1) {
			container
			  .append($('<div></div>')
					.addClass('commentContent')
					.hide()
				);
		}
		
		if (container.find('.browseBoxWrap').length < 1) {
			container
			  .append($('<div></div>')
					.addClass('dotted_line')
					.hide()
				)
				.append($('<div></div>')
				  .addClass('browseBoxWrap')
				  .append($('<div></div>')
				    .addClass('browseLinksWrap')
					)
					.hide()
				);
		}
	}
		
	function updateComments(container,settings,p) {
		var timestamp = new Date();
		if (p == 'n') {
			p = settings.currentPage + 1;
		} else if (p == 'p') {
			p = settings.currentPage - 1;
		}
    $.getJSON(unescape(settings.contentURL),{'t': container.find('input[name=t]').val(),'uid': container.find('input[name=uid]').val(),'p': p,'timestamp': timestamp.getTime()},function(data){
			if (data.error == undefined) {
				checkDOM(container);
				updatePager(container,settings,p,data.maxpages);
				updateCommentContent(container,data.content);
			} else {
				updateCommentError(container,data.error);
			}
    });
	};
	
	function initPager(container,settings,mp) {
		if (mp > 10) {
			offset = 10;
		} else {
			offset = mp;
		}

		for(i=1;i<=offset;i=i+1) {
			if (i == settings.currentPage) {
				container
				  .find('.browseLinksWrap')
					.append($('<span></span>')
						.addClass('activeLinkWrap page p'+i)
						.append($('<a></a>')
						  .click(function(){
								updateComments(container,settings,parseInt($(this).html()));
						  })
							.attr({'href':'javascript:void(0);'})
							.html(i)
						)
					);
			} else {
				container
				  .find('.browseLinksWrap')
					.append($('<span></span>')
						.addClass('inactiveLinkWrap page p'+i)
						.append(jQuery('<a></a>')
						  .click(function(){
								updateComments(container,settings,parseInt($(this).html()));
						  })
							.attr({'href':'javascript:void(0);'})
							.html(i)
						)
					);
			}
		}

		if (mp > 1) {
			container
			  .find('.browseLinksWrap')
				.append(jQuery('<span></span>')
					.addClass('inactiveLinkWrap pnext')
					.append(jQuery('<a></a>')
					  .click(function(){
							updateComments(container,settings,'n');
					  })
						.attr({'href':'javascript:void(0);'})
						.html(settings.lblNext)
					)
				);
		}

		settings.maxPages = mp;

		jQuery(container)
		  .find('.browseBoxWrap')
			.show()
			.prev('.dotted_line')
			.show();
	}
	
	function togglePager(obj) {
		if(!obj.hasClass('activeLinkWrap')) {
			obj
				.parent()
				.children()
				.each(function(){
				if ($(this).hasClass('activeLinkWrap')) {
					$(this)
						.removeClass('activeLinkWrap')
						.addClass('inactiveLinkWrap');
				}
			});
			obj
				.removeClass('inactiveLinkWrap')
				.addClass('activeLinkWrap');
		}
	}
	
	function updatePager(container,settings,p,mp) {
		if (mp > 1) {
			container
			  .find('.browseBoxWrap')
				.show()
				.prev('.dotted_line')
				.show();
		} else {
			container
			  .find('.browseBoxWrap')
				.hide()
				.prev('.dotted_line')
				.hide();
		}

		settings.maxPages = mp;

		maxPages = container
			.find('.browseBoxWrap .page')
			.length;
		

		if (p > 1) {
			if (container.find('.browseLinksWrap .pprev').length < 1) {
				container
				  .find('.browseLinksWrap')
					.prepend($('<span></span>')
						.addClass('inactiveLinkWrap pprev')
						.append($('<a></a>')
						  .click(function(){
								updateComments(container,settings,'p');
						  })
							.attr({'href':'javascript:void(0);'})
							.html(settings.lblPrev)
						)
					);
			} else {
				container
					.find('.browseLinksWrap .pprev a')
					.unbind()
					.click(function(){
						updateComments(container,settings,'p');
					});												
			}
		} else {
			container
			  .find('.browseLinksWrap .pprev')
				.remove();
		}

		if (mp != maxPages) {
			if (mp > maxPages) {
				var content;
				if (mp > 10) {
					offset = 10;
				} else {
					offset = mp;
				}

				if (container.find('.browseLinksWrap .p'+maxPages).length > 0) {
					for(i=(maxPages+1);i<=offset;i=i+1) {
						container
							.find('.browseLinksWrap .p'+(i-1))
							.after($('<span></span>')
								.addClass('inactiveLinkWrap page p'+i)
								.append($('<a></a>')
								  .click(function(){
										updateComments(container,settings,parseInt($(this).html()));
								  })
									.attr({'href':'javascript:void(0);'})
									.html(i)
								)
						);
					}
				} else {
					for(i=1;i<=offset;i=i+1) {
						container
						  .find('.browseLinksWrap')
							.append($('<span></span>')
								.addClass('inactiveLinkWrap page p'+i)
								.append($('<a></a>')
								  .click(function(){
										updateComments(container,settings,parseInt($(this).html()));
								  })
									.attr({'href':'javascript:void(0);'})
									.html(i)
								)
							);
					}
				}
			} else {
				for(i=(mp+1);i<=maxPages;i=i+1) {
					container
						.find('.browseLinksWrap .p'+i)
						.remove();
				}
			}
		}

		if (p > 10) {
			container
			  .find('.browseLinksWrap')
				.children()
				.removeClass('activeLinkWrap')
				.addClass('inactiveLinkWrap');
		} else {
			togglePager(container.find('.browseLinksWrap .p'+p));
		}

		if (mp > 1 && p < mp) {
			if (container.find('.browseLinksWrap .pnext').length < 1) {
				container
				  .find('.browseLinksWrap')
					.append($('<span></span>')
						.addClass('inactiveLinkWrap pnext')
						.append($('<a></a>')
						  .click(function(){
								updateComments(container,settings,'n');
						  })
							.attr({'href':'javascript:void(0);'})
							.html(settings.lblNext)
						)
					);
			} else {
				container
					.find('.browseLinksWrap .pnext a')
					.unbind()
					.click(function(){
						updateComments(container,settings,'n');
					});												
			}
		}	else {
			container
			  .find('.browseLinksWrap .pnext')
				.remove();
		}

		settings.currentPage = p;
	}
	
	function updateCommentContent(container,content) {
		container
		  .find('.commentContent')
			.hide()
			.before($('<div></div>')
				.addClass('loading')
			)
			.empty();
		$.each(content,function(){
			container
			  .find('.commentContent')
				.append(
					$('<div></div>')
						.addClass('dotted_line')
			);
			container
			  .find('.commentContent')
				.append(
					$('<div></div>')
						.addClass('commentEl')
						.append($('<div></div>')
							.addClass('name')
							.html(this.name)
						)
						.append($('<div></div>')
							.addClass('comment')
							.html(this.comment)
						)
			);
		});
		container
		  .find('.loading')
			.remove();
			
		container
		  .find('.commentContent')
			.show();
	}
	
	function updateCommentError(container,settings,error) {
		container
		  .find('.browseBoxWrap')
			.hide()
			.next('.csc-frame-rulerBefore')
			.hide();

		switch (error) {
			case 'nocomments':
				container
				  .find('.commentContent')
					.empty()
					.append($('<div></div>')
						.addClass('noComment')
						.html(settings.lblNoComments)
					);
				break;
		}
	}

})(jQuery);
