(function (s) {
  var m = {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '"' : '\\"',
    '\\': '\\\\'
  };

  s.parseJSON = function (filter) {
    try {
      if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.
        test(this)) {
          var j = eval('(' + this + ')');
          if (typeof filter === 'function') {

            function walk(k, v) {
              if (v && typeof v === 'object') {
                for (var i in v) {
                  if (v.hasOwnProperty(i)) {
                    v[i] = walk(i, v[i]);
                  }
                }
              }
              return filter(k, v);
            }

            j = walk('', j);
          }
          return j;
        }
      } catch (e) {
      }
      throw new SyntaxError("parseJSON");
    };
  }
) (String.prototype);


	/* FORM VALIDATION */
	

(function($) {
	
	$.fn.deleteConfirmation = function(options) {
		var messageBox = '<div id="deleteConfirmation">' + options.message + '<br /><br /><input type="button" class="button" id="deleteYes" value="Yes" style="width:50px;" /> <input type="button" class="button" id="deleteNo" value="No" style="width:50px;" /> </div>';
		$.blockUI({
			message: messageBox, 
			overlayCSS: { backgroundColor: '#FFF' }, 
			css: { width: '275px', 
				border: 'none', 
				padding: '25px', 
				backgroundColor: '#222', 
				'-webkit-border-radius': '10px', 
				'-moz-border-radius': '10px', 
				color: '#FFF' }
		}); 
		
	    $('#deleteYes').click(function() { 
	        options.onClickYes.call(this);
	    }); 

	    $('#deleteNo').click(function() { 
	        $.unblockUI(); 
	    }); 
	};
	
	$.fn.specialChar = function() {
		var x = $(this).val().replace(/[^a-z_\u00D1\u00F10-9]*/ig,'');
		$(this).val(x);
	};

	$.fn.dialogBox = function(options) {
		if (typeof options.msg != 'undefined'){
			var sMsg = options.msg;
		} else if (typeof options.msgEl != 'undefined') {
			var sMsg = $('#' + options.msgEl).text();
		} else {
			var sMsg = 'Please define error message';
		}


		var messageBox = '<div id="dialogBox">' + $.trim(sMsg) + '</div>';
		$.blockUI({
			message: messageBox, 
			overlayCSS: { backgroundColor: '#FFF' }, 
			css: { width: '275px', 
				border: 'none', 
				padding: '15px', 
				backgroundColor: '#38AADC', 
				'-webkit-border-radius': '10px', 
				'-moz-border-radius': '10px', 
				color: '#FFF' }
		}); 
		setTimeout($.unblockUI, 7000); 
	};
	
	$.fn.flashMessage = function(options) {
		if (typeof options.renderTo === 'undefined'){
			options.renderTo = '#contentMessage';
		};
		if (typeof options.messageStatus === 'undefined'){
			options.messageStatus = 'pass';
		};

		
		var txt = options.message + '&nbsp;&nbsp;&nbsp;&nbsp;<a href="" id="closeMessage">[close]</a>';
		switch(options.messageStatus.toLowerCase())
		{
			case 'error':
				var x = '<span class="error">' + txt + '</span>';
				break;    
			case 'warning':
				var x = '<span class="warning">' + txt + '</span>';
				break;
			default:
				var x = '<span class="message">' + txt + '</span>';
		}			
		$(options.renderTo).empty().append(x).fadeIn();;
		$('#closeMessage').click(function(){
			$(options.renderTo).fadeOut();
			return false;	
		})
		window.location.href =  $.ListFirst(window.location.href, '#') +  '#page';
		
	};
	
	/* SIDE BAR MANIPULATION (WHEN LOGGED IN) */
	$.fn.sideBarMember = function() {
		var controller = $.trim($.ListGetAt(location.href, 4, '/')).toLowerCase();
		$('ul#sidebarNav ul').each(function(i){
		    var x = $(this).attr("id");
		    if(x == 'bar-' + controller) {
		    	$(this).addClass("show");
		    	$(this).show();
			} else {
				$(this).removeClass("show");
				$(this).hide();
			}
		})	
	}
	
	/* RECAPTHA FUNCTION */
	$.fn.showRecaptcha = function (publicKey, element, submitButton, themeName) {
		Recaptcha.create(publicKey, element, {
		    theme: themeName,
		    tabindex: 0,
		    //callback: Recaptcha.focus_response_field
		    callback: $.fn.callbackRecaptcha
		});
		document.getElementById(submitButton).style.visibility = "visible";
	};
	
	$.fn.callbackRecaptcha = function (){
		var recaptcha_challenge_field = $('#recaptcha_challenge_field').attr('value');
		$('#recaptcha_response_field')
			.addClass('required')
			.attr('title','Please enter captcha word.');
	};


	

	/*SIGNUP FUNCTION */
	$.fn.price = function() {
		$('#discount').bind('change', function(){
			var code = $(this).val();
			$.ajax({
				type: 'POST',
				url: '/ajax/discountValidation',
				dataType: 'json',
				data: {discountCode:code}, 
			 	success: function(obj){
					$("#total > strong").html(obj.total);
					$(this).unbind();
				}
			});

			return false;
		})
		
		$('form[name=newAccountPro]').validate({
			errorPlacement: function(error, element) {
			error.appendTo( element.next() );
			}, 
			errorClass : 'errorValidation',
			meta: 'validate',
			messages: {
				username: {
					required: 'Please enter your username.',
					remote: jQuery.format("Username {0} is already taken, please enter a different username."), 
					minlength: "Your username must consist of at least 3 characters"
				}, 
				email: {
					required: 'Please enter your email.',
					email: 'Please enter valid email.', 
					remote: jQuery.format("Email {0} is already used.")	
				}, 
				ccnum : {
					required: 'Valid cc num required.',
					creditcard: 'This is not a valid credit card number.'
				}, 
				captcha: {
					required: 'Please enter captcha code.',
					remote: 'Invalid captcha code.'
				}
			} 
			
			
		});
		
		$('form[name=newAccountPro] #username').keyup($.fn.specialChar);
		$('form[name=newAccountPro] #username').keyup(function(){
			var x = $(this).val();
			$('#usernameEnter').html(x).css({'font-weight':'bold'});
		})

	}
	
	
	
	/* SESSION */
	$.fn.session = function() {
		var warn = '.warnmsg';
		$('#memberLogin p label').addClass("xsmall left")
		$('#forgotLogin p label').addClass("xxsmall left")
		var loader = '<div class="formLoader"><p align="center"><img src="/images/ajax/loader1.gif" width="128" height="15" border="0" /></p> \
	    			<p align="center">Working on your request.</p></div>';
		
		var errorContainer = $('div.errorValidation');
		$("#memberLogin").validate({
			errorContainer: errorContainer,
			errorLabelContainer: $("ul", errorContainer),
			wrapper: 'li',
			meta: "validate",
			submitHandler: function(form) {
				jQuery(form).ajaxSubmit({
			        success: function(obj){
						if (parseInt(obj.status) == 0) {
							$(warn).empty().append(obj.message).show();
						} else {
							self.location.href=obj.redirect;
						}
			        },
			        dataType: 'json',
			        resetForm: false
				});
				return false;
			} 
		});
	
		$('#forgotPassword').click(function(){
			var href = $(this).attr('href');
			$.ajax({
				type: 'GET',
				url: href,
				dataType: 'html',
				beforeSend: function(){
				},
				success: function(html){
					$('#modalContent')
						.empty()
						.append(html);
				}
			});
			return false;
		})
		
		$("#forgotLogin").validate({
			errorLabelContainer: $('div.warnmsg'), 
			meta: "validate",
			submitHandler: function(form) {
				jQuery(form).ajaxSubmit({
			        beforeSubmit: function(){
						$('.formContainer').hide();
						$(form).append(loader);
			        },  
			        success: function(obj){
						var xStatus = parseInt(obj.status);
						if (xStatus == 0) {
							$(warn)
								.empty()
								.append(obj.message)
								.show();
							$('.formLoader').remove();
							$('.formContainer').show();
						} else {
							$('#modalContent')
								.empty()
								.append(obj.response);
						}
						
						
			        },
			        dataType: 'json',
			        resetForm: false
				});
			} 
		});	
	}	
	
	/* CONFIRM MERIT */
	$.fn.meritConfirm = function() {
		$('#messageBody').one('focus', function(){
			$(this).val('');	
		});

        $("#newMerit").makeAsyncUploader({
            upload_url: 'http://' + location.host + '/ajax/uploadSWF/', 
            flash_url: '/javascripts/swfupload.swf',
            button_image_url: '/images/blankButton.png',
            file_types: '*.jpg; *.gif; *.png; *.doc; *.pdf; *.xls; *.zip',
            button_text: '<div align="center"><font face="Arial" size="12">Upload File</font></div>'
        });
		var errorContainer = $('div.errorValidation');		
		$('#sendMerit').validate({
			errorContainer: errorContainer,
			errorLabelContainer: $("ul", errorContainer),
			wrapper: 'li',
			meta: "validate",
			submitHandler: function(form) {
				jQuery(form).ajaxSubmit({
			        success: function(obj){
						$('#modalContent').empty().append(obj);
						$('#sendAnotherMerit').click(function(){
							$.get('/merit/new', function(data) { 
								$('#modalContent')
									.empty()
									.append(data);

							})	
							return false;
						});
			        },
			        dataType: 'html'
				});
				return false;
			}
		});		
	};
	

	$.fn.meritSend = function() {
		/* ACTION : NEWNOTLOGGEDIN */
		$('#messageBody').one('focus', function(){
			$(this).val('');	
		});
	
		$('#captcha').css({'font-size':'20px', 'letter-spacing':'0.5em'});
	    $("#newMerit").makeAsyncUploader({
	        upload_url: 'http://' + location.host + '/ajax/uploadSWF/', 
	        flash_url: '/javascripts/swfupload.swf',
	        button_image_url: '/images/blankButton.png',
	        file_types: '*.jpg; *.gif; *.png; *.doc; *.pdf; *.xls; *.zip',
	        button_text: '<div align="center"><font face="Arial" size="12">Upload File</font></div>'
	    });
		
		var loader = '<p align="center"><img src="/images/ajax/loader1.gif" width="128" height="15" border="0" /></p> \
	    			<p align="center">Working on your request.</p>';
		
		
		var errorContainer = $('div.errorValidation');
		$('#sendMeritNotLoggedIn').validate({
			errorContainer: errorContainer,
			errorLabelContainer: $("ul", errorContainer),
			wrapper: 'li',
			meta: "validate",
			submitHandler: function(form) {
				jQuery(form).ajaxSubmit({
			        beforeSubmit : function() {
			        	$('.formContainer').replaceWith(loader);
			        }, 
			        success: function(obj){
						$('#modalContent').empty().append(obj);
						$('#sendAnotherMerit').click(function(){
							$.get('/merit/newNotLoggedIn', function(data) { 
								$('#modalContent')
									.empty()
									.append(data);
	
							})	
							return false;
						});
			        },
			        dataType: 'html'
				});
				return false;
			}
		});		
		
		/* ACTION : NEW */
		$('#sendMerit').validate({
			errorContainer: errorContainer,
			errorLabelContainer: $("ul", errorContainer),
			wrapper: 'li',
			meta: "validate",
			submitHandler: function(form) {
				jQuery(form).ajaxSubmit({
			        beforeSubmit : function() {
			        	$('.formContainer').replaceWith(loader).unbind();
			        },
			        success: function(obj){
						$('#modalContent').empty().append(obj);
						$('#sendAnotherMerit').click(function(){
							$.get('/merit/new', function(data) { 
								$('#modalContent')
									.empty()
									.append(data);
							});
							return false;
						});
			        },
			        dataType: 'html'
				});
				return false;
			}
		});		
	}


	
	// Cancel Request Merit From Received (flag as tovisible false)
	$.fn.meritRequested = function() {
		$('.deleteBtn').click(function(){
			var mRow = $(this).parent().parents().eq(0);
			var nRow = $(mRow).next().eq(0);
			var meritID = $.ListLast($(this).attr('id'), '-');
			$.fn.deleteConfirmation({
				message : 'Do you want to cancel this requested merit?', 
				onClickYes : function(){
					$.ajax({
						type: 'POST',
						url: '/ajax/meritRequestDestroy',
						dataType: 'json',
						data: {meritID:meritID}, 
						success: function(obj){
							if(parseInt(obj.status) == 1) {
								$(mRow).fadeOut('fast').remove();
								$(nRow).remove();
								$.unblockUI(); 
								$.fn.flashMessage({
									msg: obj.msg
								})
							}
						}
					});


				}
			});
		});
	}

	

	/* PROFILE FUNCTION */
	$.fn.profileID = function(obj){
		var xMain = $(obj).parent().parents();
		var xID = xMain.attr('id');
		var xLabel = xMain.find('tr#'+ xID + ' .labelName').text();
		var myObj = new Object();
		myObj.id = xID;
		myObj.label = xLabel;
		myObj.object = xMain;
		return myObj;
	}
	
	$.fn.profileDelete = function() {
		var obj = $.fn.profileID(this);
		var href = '/profile/destroy/' + obj.id;
		$.fn.deleteConfirmation({
			message : 'Are you sure you want to <br />delete the '+ obj.label +' tag?', 
			onClickYes : function(){
				$.ajax({
					type: 'GET',
					url: href,
					dataType: 'json',
					beforeSend: function(){
						
					},
					success: function(html){
						$('tr#' + obj.id + ',#lhs-profile-' + obj.id).fadeOut('slow').remove();
						$.fn.flashMessage({
							msg: html.msg
						})
						$.unblockUI(); 
					}
				});
				
				
			}
		});
	}


	
	$.fn.profileEdit = function() {
		var x = $('#fileProperty').val();
        $('#fileUpload').makeAsyncUploader({
            upload_url: '/ajax/fileUpload', 
            flash_url: '/javascripts/swfupload.swf',
            button_image_url: '/images/blankButton.png',
            file_types: '*.jpg; *.gif; *.png',
            post_params: {
            	username:$.ListGetAt(x, 1, '|'),
            	profileID:$.ListGetAt(x, 2, '|')
            	}
        });

		jQuery.validator.addMethod("alphanumeric", function(value, element) {
			return this.optional(element) || /^\w+$/i.test(value);
		}, "Letters, numbers, spaces or underscores only please");  

		var errorAddnewprofile = $('div.errorContainer');
		$('#editProfile').validate({
			errorContainer: errorAddnewprofile,
			errorLabelContainer: $("ol", errorAddnewprofile),	
			wrapper: 'li',
			meta: "validate"

		});
	}
		
	
})(jQuery);


jQuery.extend({
	LCase: function(s){
		s += "";
		return s.toLowerCase();
	}
	, ListFirst: function(l,d){
		l += ""; // cheap way to convert to a string
		if(!d){d = ",";}
		return l.split(d)[0];
	}
	, ListGetAt: function (l, p, d){
		l += ""; // cheap way to convert to a string
		if(!d){d = ",";}
		return l.split(d)[p - 1];
	}
	, ListLast: function(l,d){
		l += ""; // cheap way to convert to a string
		if(!d){d = ",";}
		// I don't know which of the two methods below would be preferable
		l = l.split(d);
		return l[l.length - 1];
		//return l.split(d)[l.split(d).length - 1];
	}
	, ListLen: function(l,d){
		l += ""; // cheap way to convert to a string
		if(!d){d = ",";}
		if(l.length){return l.split(d).length;}
		return 0;
	}
	, Replace: function(s,sb1,sb2,sc){
		s += "";
		if(!sc || sc.toUpperCase() != "ALL"){
			sc = "";
		} else {
			sc ="g";
		}
		var re = new RegExp(sb1,sc);
		return s.replace(re,sb2);
	}
	, ReplaceNoCase: function(s,sb1,sb2,sc){
		s += "";
		if(!sc || sc.toUpperCase() != "ALL"){
			sc = "i";
		} else {
			sc ="gi";
		}
		var re = new RegExp(sb1,sc);
		return s.replace(re,sb2);
	}
})