/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 5/25/2009
 * @author Ariel Flesler
 * @version 1.4.2
 *
 * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
 */
;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);

/*
 * JSizes - JQuery plugin v0.33
 *
 * Licensed under the revised BSD License.
 * Copyright 2008-2010 Bram Stein
 * All rights reserved.
 */
(function(b){var a=function(c){return parseInt(c,10)||0};b.each(["min","max"],function(d,c){b.fn[c+"Size"]=function(g){var f,e;if(g){if(g.width!==undefined){this.css(c+"-width",g.width)}if(g.height!==undefined){this.css(c+"-height",g.height)}return this}else{f=this.css(c+"-width");e=this.css(c+"-height");return{width:(c==="max"&&(f===undefined||f==="none"||a(f)===-1)&&Number.MAX_VALUE)||a(f),height:(c==="max"&&(e===undefined||e==="none"||a(e)===-1)&&Number.MAX_VALUE)||a(e)}}}});b.fn.isVisible=function(){return this.is(":visible")};b.each(["border","margin","padding"],function(d,c){b.fn[c]=function(e){if(e){if(e.top!==undefined){this.css(c+"-top"+(c==="border"?"-width":""),e.top)}if(e.bottom!==undefined){this.css(c+"-bottom"+(c==="border"?"-width":""),e.bottom)}if(e.left!==undefined){this.css(c+"-left"+(c==="border"?"-width":""),e.left)}if(e.right!==undefined){this.css(c+"-right"+(c==="border"?"-width":""),e.right)}return this}else{return{top:a(this.css(c+"-top"+(c==="border"?"-width":""))),bottom:a(this.css(c+"-bottom"+(c==="border"?"-width":""))),left:a(this.css(c+"-left"+(c==="border"?"-width":""))),right:a(this.css(c+"-right"+(c==="border"?"-width":"")))}}}})})(jQuery);

/*
 * Custom Form Group Validator
 */
(function($) {

$.extend($.fn, {
	validate_groups: function( options ) {
		
		var f = this;
		var custom_options = {};
		
		// if nothing is selected, return nothing; can't chain anyway
		if (!this.length) {
			options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
			return;
		}
		
		if (options.combine_entities) {
			
			// Create error boxes to the form group class
			//var error_box = $('<div class="error-box"><label class="error">Abc</label></div>');
			var error_box = $('<div class="error-box"></div>');
			var error_box_c;
			
			this.find('.stdform-entity').each(function() {
				if ($(this).hasClass('stackedform')) {
					$(this).find('.form-entity-fields').before(error_box.clone());
				} else {
					error_box_c = error_box.clone();
					
					error_box_c.css({
						'margin': '7px 0 0'
					});
					$(this).prepend(error_box_c);
				}
			});
			
			custom_options = {
				errorPlacement: function(error, element) {
					var ed = element.parents('.stdform-entity').find('.error-box');
					ed.append(error);
				},
				
				showErrors: function (errorMap, errorList) {
					this.defaultShowErrors();
					var e;
					
					// Determine if the error box should be shown
			   		if (errorList.length) {
						for (var i = 0; i < errorList.length; i++) {
							var e = $(errorList[i].element);
							
							error_box = e.parents(".stdform-entity").find(".error-box");
							
							if (!error_box.length) continue;
							
							//error_box.find('[for=' + e.attr('name') + ']').show();
							
							error_box.show();
						}
					}
			   		
			   		// Hide any error boxes that shouldn't be shown
			   		setTimeout(function() {
			   			$('.stdform-entity .error-box').each(function() {
			   				if (!$(this).find("label:visible").length) {
					   			$(this)
					   				.addClass('ok')
					   				.hide();
					   		}
			   			});
			   		},50);
				},
				
				success: function(label) {
				   	label.addClass("ok");
				   	
				   	f.find(".stdform-entity .error-box").each(function() {
				   		if (!$(this).find("label:not(.ok)").length) {
				   			$(this).hide();
				   		}
				   	});
				},

				errorClass: 'error',
				validClass: 'ok',
				
				
				highlight: function(element, errorClass, validClass) {
				     $(element).addClass(errorClass);
				     $(element).prev(".placeholder").addClass(errorClass);
				     $(element).removeClass("ok");
				     $(element).prev(".placeholder").removeClass("ok");
				  },
				  
				unhighlight: function(element, errorClass, validClass) {
					if ($(element).hasClass(".placeholder")){}//only update placeholders along with their actual input fields.
					else{
				     $(element).removeClass(errorClass);
				     $(element).prev(".placeholder").removeClass(errorClass);
				     $(element).addClass("ok");
				     $(element).prev(".placeholder").addClass("ok");
					}
				}
			}
		} else {
			// Modify error boxes to use the correct class
			this.find('.form-group .error-box')
				.addClass('group-error-box')
				.removeClass('error-box')
				.append('<div class="inside"><div class="ui-icon ui-icon-alert"></div></div>')
				.append('<div class="tick"></div>');
			
			custom_options = {
				errorPlacement: function(error, element) {
					var ed = element.parents('.form-group').find('.group-error-box .inside');
					ed.append(error);
			   	},
			   	
			   	showErrors: function (errorMap, errorList) {
			   		this.defaultShowErrors();
			   		
			   		var error_box;
			   		
			   		// Determine if the error box should be shown
			   		if (errorList.length) {
						for (var i = 0; i < errorList.length; i++) {
							error_box = $(errorList[i].element).parents(".form-group").find(".group-error-box");
							
							if (!error_box.length) continue;
							
							// Hide any remark boxes
							$('.form-group .group-remark-box').hide();
							
							error_box.show();
						}
					}
			   		
			   		// Hide any error boxes that shouldn't be shown
			   		setTimeout(function() {
			   			$('.form-group .group-error-box').each(function() {
			   				if (!$(this).find("label:visible").length) {
					   			$(this)
					   				.addClass('ok')
					   				.hide();
					   		}
			   			});
			   		},50);
			   	},
		
			   	success: function(label) {
				   	label.addClass("ok");
				   	
				   	f.find(".form-group .group-error-box").each(function() {
				   		if (!$(this).find("label:not(.ok)").length) {
				   			$(this).hide();
				   		}
				   	});
				}
			}
		}
		
		options = $.extend(options, custom_options);
		
		return this.validate(options);
	}
	
});

})(jQuery);


/*
 * Custom Form Validator for Marketplace
 */
(function($) {

$.extend($.fn, {
	validate_rows: function( options ) {
		
		var f = this;
		
		// if nothing is selected, return nothing; can't chain anyway
		if (!this.length) {
			options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
			return;
		}
		
		var custom_options = {
			errorPlacement: function(error, element) {
				var ed = element.parents('.form-item:first');
				ed.append(error);
		   	},
		   	
			showErrors: function (errorMap, errorList) {
		   		this.defaultShowErrors();
		   		
		   		// Determine if the row should be errored
		   		if (errorList.length) {
					for (var i = 0; i < errorList.length; i++) {
						var dom = $(errorList[i].element).parents(".form-item:first");
						
						if (!dom.length) continue;
						dom.addClass('form-item-error');
					}
				}
		   		
		   		// Hide any error rows that shouldn't be shown
		   		setTimeout(function() {
		   			$('.form-item').each(function() {
		   				if (!$(this).find("label.error:visible").length) {
				   			$(this).removeClass('form-item-error');
				   		}
		   			});
		   		},50);
		   	}
		}
		
		options = $.extend(options, custom_options);
		
		return this.validate(options);
	}
	
});

})(jQuery);

/*
 * Custom Form Validator
 */
(function($) {

$.extend($.fn, {
	validate_form: function( options ) {
		
		var f = this;
		
		// if nothing is selected, return nothing; can't chain anyway
		if (!this.length) {
			options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
			return;
		}
		
		var error_box = $('<div class="error-box"><div class="inside"></div></div>');
		var edit_terms = $('#edit-terms:checked');
		
		f.prepend(error_box);
	
		var custom_options = {

			errorPlacement: function(error, element) {
				error_box.find('.inside').append(error);
		   	},
		   	
		   	showErrors: function (errorMap, errorList) {
		   		this.defaultShowErrors();
		   		
		   		// Determine if the error box should be shown
		   		if (errorList.length) {
						error_box
							.removeClass('ok')
							.show();
				}
		   		
		   		// Hide any error boxes that shouldn't be shown
		   		setTimeout(function() {
		   			if (!error_box.find("label:not(.ok)").length) {
		   				error_box
			   				.addClass('ok')
			   				.hide();
		   			}
		   		},50);
		   	},
		   	
		   	// Hide any error boxes that shouldn't be shown
		   	success: function(label) {
		   		label.addClass("ok");
		   		
		   		if (!error_box.find("label:not(.ok)").length) {
		   			
		   			error_box.addClass('ok').hide();	
		   		}
			}
		}
		
		options = $.extend(options, custom_options);
		
		return this.validate(options);
	}
	
});

})(jQuery);

/*
 * Custom Expandable Blocks
 */
(function($) {

$.extend($.fn, {
	expandable_block: function() {
		
		this.each(function() {
			var b = $(this);
			
			var block_tail = '';
			
			var animation;
			
			if ($(this).hasClass('expandable-block-a')) {
				var block_tail = '.expandable-block-a';
			} else if ($(this).hasClass('expandable-block-b')) {
				var block_tail = '.expandable-block-b';
			} else if ($(this).hasClass('expandable-block-c')) {
				var block_tail = '.expandable-block-c';
			} else if ($(this).hasClass('expandable-block-d')) {
				var block_tail = '.expandable-block-d';
			}
			
			if ($(this).hasClass('expandable-block-slidedown')) {
				animation = 'slidedown';
			} else if ($(this).hasClass('expandable-block-slidedown')) {
				animation = 'slideup';
			}
			
			var more_block = $(this).find('.expandable-block-more'+block_tail);
			var less_block = $(this).find('.expandable-block-less'+block_tail);
			
			var more_link = $(this).find('.expandable-block-showmore'+block_tail);
			var less_link = $(this).find('.expandable-block-showless'+block_tail);
			
			more_link.bind('click',function() {
				less_block.hide();
				
				if (animation == 'slidedown') {
					more_block.slideDown();
				} else if (animation == 'slideup') {
					more_block.slideUp();
				} else {
					more_block.show();
				}
				
				$(this).hide();
				less_link.show();
				
				return false;
			});
			
			less_link.bind('click',function() {
				
				if (animation == 'slidedown') {
					more_block.slideUp();
				} else if (animation == 'slideup') {
					more_block.slideDown();
				} else {
					more_block.hide();
				}
				
				less_block.show();
				
				$(this).hide();
				more_link.show();
				
				return false;
			});

			var more_link2 = $(this).find('.expandable-block-showmore_same_link'+block_tail);
						
			more_link2.toggle(function() {
				var linkstr = $(this).text();
				$(this).text(linkstr.replace('Show','Hide'));
				if (animation == 'slidedown') {
					more_block.slideDown();
				} else if (animation == 'slideup') {
					more_block.slideUp();
				} else {
					more_block.show();
				}
			}, function () {
				var linkstr = $(this).text();
				$(this).text(linkstr.replace('Hide','Show'));
				if (animation == 'slidedown') {
					more_block.slideUp();
				} else if (animation == 'slideup') {
					more_block.slideDown();
				} else {
					more_block.hide();
				}			
				
			});
			
			if ($(this).hasClass('expandable-block-state-more')) {
				more_link.click();
			}
		});
		
		return this;
	}
	
});

})(jQuery);

// Set up global jQuery validation rules
$.validator.addMethod("toggled_required", function (value, element) {
	var group = $(element).parents(".form-group-toggle:first");
	
	if (!group.length) {
		return true;
	}
	
	if (!value.length && group.find(":radio.form-group-toggle-enabler:checked").length) {
		return false;
	}
	
	return true;
});

$.validator.addMethod("phone", function (value, element) {
	
	var regex = /\(\d{3}\) \d{3}\-\d{4}/;
	
	return value.match(regex);
});

// Set up global Recaptcha styling
var RecaptchaOptions = { theme : "white" };

/*
 * Define global functions
 */
if ($.jGrowl) {
	function openStatusBox (message, type) {
		var theme;
		
		if (type == 'error') {
			theme = 'ui-state-error';
		} else {
			theme = 'ui-state-highlight';
		}
		
		var e_h;
		
		$.jGrowl(message, {
			'theme': theme,
			'position': 'center'
		});
	}
}

function openDateRangeSelector (input, close_fcn) {
	
	closeDateRangeSelector();
	
	var width = 494;
	var b = $('<div id="daterangeselector" style="width: ' + width + 'px; display: none"></div>')
		.data('input',input);
	
	var r = $('<div class="range-block"></div>').appendTo(b);
	var apply_button = $('<button class="form-submit2">Apply</button>')
		.click(function() {
			closeDateRangeSelector();
			if (close_fcn) close_fcn();
		});
	
	var clear_button = $('<button class="form-submit2">Reset</button>')
		.click(function() {
			b.find('.from-block .date-selector, .to-block .date-selector').datepicker('disable');
			closeDateRangeSelector();
			if (close_fcn) close_fcn();
		});
	
	r.append('<div class="from-block"><strong>Start Date:</strong><div class="date-selector"></div></div>');
	r.append('<div class="to-block"><strong>End Date:</strong><div class="date-selector"></div></div>');
	
	$('<div class="button-block"></div>')
		.append(apply_button)
		.append(clear_button)
		.appendTo(b);
	
	var from_opt = {};
	var to_opt = {};
	
	// Parse any existing date string
	var date_str = input.val();
	
	if (date_str.indexOf('> ') === 0) {
		from_opt.defaultDate = $.datepicker.parseDate('mm/dd/yy',date_str.substr(2,10));
	} else if (date_str.indexOf('< ') === 0) {
		to_opt.defaultDate = $.datepicker.parseDate('mm/dd/yy',date_str.substr(2,10));
	} else if (date_str.indexOf(' - ') === 10) {
		from_opt.defaultDate = $.datepicker.parseDate('mm/dd/yy',date_str.substr(0,10));
		to_opt.defaultDate = $.datepicker.parseDate('mm/dd/yy',date_str.substr(13,10));
	}
	
	b.find('.from-block .date-selector').datepicker(from_opt);
	if (!from_opt.defaultDate) {
		b.find('.from-block .date-selector').datepicker('disable');
	}
	
	b.find('.to-block .date-selector').datepicker(to_opt);
	if (!to_opt.defaultDate) {
		b.find('.to-block .date-selector').datepicker('disable');
	}
	
	b.find('.from-block .date-selector, .to-block .date-selector')
		.mousedown(function() {
			$(this).datepicker('enable');
		});
	
	var offset = input.offset();
	
	var l = offset.left;
	
	if ($(window).width() - l < width) {
		// Drop down to the left
		l = offset.left - width + input.outerWidth();
	}
	
	b.css({
		'left': l,
		'top': offset.top + input.outerHeight(true)
	});
	
	$('body').append(b);
	
	b.fadeIn();
}

function closeDateRangeSelector (close_fcn) {
	
	var b = $('#daterangeselector');
	
	if (!b.length) {
		return;
	}
	
	var input = b.data('input');
	
	var from_picker = b.find('.from-block .date-selector');
	var to_picker = b.find('.to-block .date-selector');
	
	var from, to;
	
	if (!from_picker.datepicker('isDisabled')) {
		from = $.datepicker.formatDate('mm/dd/yy',b.find('.from-block .date-selector').datepicker('getDate'));
	}
	
	if (!to_picker.datepicker('isDisabled')) {
		to = $.datepicker.formatDate('mm/dd/yy',b.find('.to-block .date-selector').datepicker('getDate'));
	}
	
	var date_str;
	
	if (from && to) {
		date_str = from + ' - ' + to;
	} else if (from) {
		date_str = '> ' + from;
	} else if (to) {
		date_str = '< ' + to;
	} else {
		date_str = '';
	}
	
	input.val(date_str);
	
	$('#daterangeselector').remove();
}

function isValidURL(s, check_protocol) {
	
	if (check_protocol) {
		var regexp = /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
	} else {
		var regexp = /(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
	}
	return regexp.test(s);
}

/**
 * Initialize a placeholder field.
 * 
 * @param placeholder A jQuery object representing the placeholder field.
 */
function _init_placeholder (placeholder) {
	var field = placeholder.next(':input:first');
	
	if (!field.length) {
		return;
	}
	
	if (field.val().length) {
		placeholder.hide();
		field.show();
	} else {
		placeholder.show();
		field.hide();
	}
	
	placeholder.focus(function() {
		placeholder.hide();
		field.show().focus();
	});
	
	field.blur(function() {
		if (!$(this).val().length) {
			field.hide();
			placeholder.show();
		}
	});
}

/*
 * Form Group Remarks
 */
$(document).ready(function() {
	$('.form-group label.form-group-remark').each(function() {
		var group = $(this).parents('.form-group:first');
		
		if (!group.length) {
			return;
		}
		
		var remark = group.find('.group-remark-box');
		
		if (!remark.length) {
			// No remark box found, build one
			var remark = $('<div class="group-remark-box"><div class="inside"><div class="ui-icon ui-icon-alert"></div></div><div class="tick"></div></div>');
			
			group.prepend(remark);
		}
		
		// Move this into the remark box
		remark.find('.inside').append($(this));
		
		var target = $('#' + ($(this).attr('for')));
		
		if (!target.length) {
			return;
		}
		
		target.focus(function() {
			
			var errorbox = group.find('.group-error-box:visible');
			if (errorbox.length) {
				return;
			}
			
			remark.show();
		});
		
		target.blur(function() {
			remark.hide();
		});
	});
});

/*
 * StackedForm Remarks 
 */
$(document).ready(function() {
	$(".stackedform").hover( function () {
		$(this).find(".form-entity-description").css("color","#2B7B1B");
	}, function () {
		$(this).find(".form-entity-description").css("color","#8C8C8C");	
	});	
	
});

/*
Define global behaviors
*/
$(document).ready(function() {
	
	
	$("#support_link").click( function(){	  
	  mpmetrics.track('support-click', {'user':'<?php echo ($user) ? $user->name: "anonymous"; ?>'});
	});
	
	if ($.jGrowl) {
		$.jGrowl.defaults.position = 'center';
	}
	
	$('.ui-state-default').hover(function() {
		$(this).addClass('ui-state-hover');
	},function() {
		$(this).removeClass('ui-state-hover');
	});
	
	// Form-related actions
	
	// Fix IE form submit with enter key problem
    $('input').keydown(function(e){
        if (e.keyCode == 13) {
            $(this).parents('form').submit();
            return false;
        }
    });
	
	$('.form-group-toggle').each(function() {
		var b = $(this);
		
		if ($(this).find(':checked').is('.form-group-toggle-enabler')) {
			$(this).addClass('form-group-toggle-enabled');
		}
		
		$(this).find('.form-group-toggle-enabler').click(function() {
			$(b).addClass('form-group-toggle-enabled');
		});
		
		$(this).find('.form-group-toggle-disabler').click(function() {
			$(b).removeClass('form-group-toggle-enabled');
		});
	});
	
	$('.placeholder').each(function() {
		_init_placeholder($(this));
	});
	
	// Proposals field comments
	$('.proposal-comments-wrapper').each(function() {
		var wrapper = $(this);
		var form = $(this).find('.comments-field');
		var list = $(this).find('.proposal-field-comments ul');
		
		$(this).find('a.add-comments').click(function() {
			form.show();
			$(this).parent('div').hide();
			
			return false;
		});
		
		$(this).find('a.add-comments-cancel').click(function() {
			form
				.find('textarea:not(.placeholder)')
					.val('')
					.blur()
					.end()
				.hide();
			
			wrapper.find('.comments-field-toggle').show();
			
			return false;
		});
	});
	
	// Document controls
	$('.printable_link').click(function() {
		window.open($(this).attr('href'),"print_window","width=800,height=600,scrollbars=1,toolbar=1,menubar=1");
		
		return false;
	});
	
	// Drop-down menu
	$('.dropmenu-container .dropmenu-button').each(function() {
		var menu = $(this).next('ul');
		
		if (!menu.length) {
			return false;
		}
		
		$(this).click(function() {
			if (menu.is(':visible')) {
				menu.fadeOut(200);
				$(this).removeClass('dropmenu-button-active');
			} else {
				// Close all open drop menus
				$('.dropmenu-container .dropmenu-button.dropmenu-button-active').each(function() {
					var menu = $(this).next('ul');
					
					menu.fadeOut(200);
					$(this).removeClass('dropmenu-button-active');
				});
				
				menu.fadeIn(400);
				$(this).addClass('dropmenu-button-active');
			}
			
			return false;
		});
		
		menu.click(function() {
			return false;
		});
	});
	
	$(document).click(function() {
		// Close all open drop menus
		$('.dropmenu-container .dropmenu-button.dropmenu-button-active').each(function() {
			var menu = $(this).next('ul');
			
			menu.fadeOut(200);
			$(this).removeClass('dropmenu-button-active');
		});
	});
	
	// Expandable blocks
	$('.expandable-block').expandable_block();
	
	// Static tabs
	$('.standardbox-tabs a').click(function() {
		if ($(this).parent().hasClass('tab-disabled')) {
			return false;
		}
	});
	
	// AJAX tabs
	$('.standardbox-dynamic-tabs').each(function() {
		var b = $(this);
		
		// Get the content block
		var cc = $(this).find('.standardbox-ml');
		var c = cc.find('.standardbox-content');
		
		// Get the header block
		var hc = $(this).find('.standardbox-hl');
		if (!hc.length) {
			// Construct one for use if it doesn't exist already
			hc = $('<div class="standardbox-hl"><div class="standardbox-hr"><div class="standardbox-hcontent"></div></div></div>');
		}
		var h = hc.find('.standardbox-hcontent');
		
		$(this).find('.standardbox-tab a')
			.bind('tab-change',function() {
				// Remove the active attribute from other tabs
				b.find('.standardbox-tab.active-tab').removeClass('active-tab');
				
				// Add the active attribute to the current tab
				$(this).parents('.standardbox-tab:first').addClass('active-tab');
			})
			.click(function() {
				
				if ($(this).parent().hasClass('tab-disabled')) {
					return false;
				}
				
				var t = $(this).parents('.standardbox-tab:first');
				var n = t.prevAll('.standardbox-tab').length;
				var tc = c.find('.standardbox-tabcontent:eq(' + n + ')');
				
				// Trigger the tab change at this point
				$(this).trigger('tab-change');
				
				// Hide the initial tabbed content
				c.find('.standardbox-tabcontent-initial').hide();
				
				// Display the content
				c.find('.standardbox-tabcontent').hide();
				tc.show();
				
				// Don't retrieve contents again if this tab has already been retrieved
				if (!t.hasClass('tab-retrieved')) {
				
					// Load the content from the href attribute
					$.ajax({
						'url': $(this).attr('href'),
						dataType: 'json',
						success: function(response) {
							
							// Insert the content
							tc.html(response.content);
							
							// Append the header, if it exists
							if (response.header) {
								h.html(response.header);
								cc.before(hc);
							} else {
								// Or remove it if it doesn't exist
								hc.remove();
							}
							
							// Mark the tab as cached
							t.addClass('tab-retrieved');
							
							$('.placeholder').each(function() {
								_init_placeholder($(this));
							});

							$('.expandable-block').expandable_block();

							// Proposals field comments
							$('.proposal-comments-wrapper').each(function() {
								var wrapper = $(this);
								var form = $(this).find('.comments-field');
								var list = $(this).find('.proposal-field-comments ul');
								
								$(this).find('a.add-comments').click(function() {
									form.show();
									$(this).parent('div').hide();
									
									return false;
								});
								
								$(this).find('a.add-comments-cancel').click(function() {
									form
										.find('textarea:not(.placeholder)')
											.val('')
											.blur()
											.end()
										.hide();
									
									wrapper.find('.comments-field-toggle').show();
									
									return false;
								});
							});		
							
							if ($.datepicker) {
								$(".datefield").datepicker({dateFormat: 'yy-mm-dd'});
							}
							
							$(document).trigger('document-reload');
							
						}
					});
				}
				
				return false;
			});
		
			// Activate the active tab to start
			$(b).find('.standardbox-tab.active-tab a').click();
	});
	
	/**
	 * Default Datepicker for datefield class
	 */
	if ($.datepicker) {
		$(".datefield").datepicker({dateFormat: 'yy-mm-dd'});
	}
	
	/**
	 * Default validate call for standard form
	 */
	$(".standardform_validate").validate();


	
	$(".otheroptionfield").blur( function () {
		$(this).prev("label").find("input").val($(this).attr('rel')+':'+$(this).val());	
	}).click (function () {
		$(this).prev("label").find("input").attr('checked',true);
	});
	
	/**
	 * standardbox tab validation
	 */
	$("form.standardform_validate .standardbox-tabbed .next-btn").click(function (event) {
		event.preventDefault();
		var currtab = $('.standardbox-tabcontent:visible');
		if (validate_tab(currtab)) {
			$(".active-tab").next().find("a").click();
		} else {
			focus_validate_error(currtab);
		}
	});
	
	$("form.standardform_validate").submit(function () {
		if ($(".standardbox-tabbed").size()) {
			var tab = $('.standardbox-tabcontent');
			var status;
			tab.each(function () {
				status = validate_tab($(this));
				if (!status) {
					var index = tab.index($(this));
					$(".standardbox-tab:eq("+index+")").find("a").click();
					focus_validate_error(tab);
					return false;
					
				}
			});
		}
		
		//remove placeholders before submitting
		$(this).find(".placeholder").remove();
		
	});
	
	
	/**
	 * Ajax submit script for comment section
	 * 
	 */
	_init_communicate_sections();

});

function _init_communicate_sections() {
	$(".communicate_section").each(function () {   
		$('.placeholder').each(function() {
			_init_placeholder($(this));
		});		
		if ($(this).hasClass('init')) {
			return false;
		} 
		
		$(this).addClass('init');
		var section = $(this);
		var submit_note = section.find(".submit-note");
		var url = section.find(".submit_url").html();
		var id = section.find(".entity-id").html();
		var type = section.find(".entity-type").html();
		var response_section = section.find(".response-section");
		var replybox = section.find(".reply_box");
		var addnewlink = section.find(".addnewnote_control_section");		
		var addnewcontrol = section.find(".addnewnote_control");
		var cancellink = section.find(".cancel_comment");
		
		submit_note.click(function (event) {
			var data = section.find(".input-comment").val();
			event.preventDefault();
			$.ajax({
				type: "POST",
				url: url,
				dataType: 'html',
				data: "comment="+data+"&id="+id+"&type="+type,
				success: function (response) {
					response_section.prepend(response);
					replybox.slideUp(200);
					addnewlink.show();
				}
			});
		});
	
		addnewcontrol.click(function (event) {
			event.preventDefault();
			addnewlink.hide();
			replybox.slideDown(200);

		});
	
		cancellink.click(function(event) {
			event.preventDefault();
			addnewlink.fadeIn();
			replybox.slideUp(200);
		});
	});
	
	
}

function cursor_in_element (e, t) {
	if (!t.is(':visible')) {
		return false;
	}
	
	var offset = t.offset();
	
	if (!(e.pageX <= offset.left || e.pageX >= (offset.left + t.width()) ||
			e.pageY <= offset.top || e.pageY >= (offset.top + t.height()))) {
		return true;
	}
	
	return false;
}

/**
 * AJAX Image Uploader Plugin
 */
(function($) {
	$.fn.ajaxImageUpload = function (options) {
		var settings = {
			beforeSubmit: function() {},
			afterSave: function(response) {},
			success: function(response) {},
			error: function(response) {}
		};
		
		// Merge in any custom settings
		if (options) { 
			$.extend(settings, options);
		}
		
		return this.each(function() {

			var t = $(this);
			var field = $(this).find('input:hidden');
			var submit_url = $(this).find('.submit_url').html();
			var maxfilesize = $(this).find(".max_file_size").html();
			var form_id = field.attr('name') + '-dummy-form';
			var file = $('<input type="file" name="image_upload_file"/>');
			var loader = $(this).find('.ajax-loader');
			var title = $(this).find('.uploader-title');
			var thumb = $(this).find('.uploader-thumb');
			
			var dummyform = $('<form id="'+form_id+'" class="ajax-dummy-form" method="POST" action="'+submit_url+'" enctype="multipart/form-data"></form>');
			dummyform.append(file);
			$('body').append(dummyform);
			
			var offset = $(this).offset();
			
			$(this)
			.mousemove(function(e) {
				dummyform.css({'top': (e.pageY - 40) + 'px',
							   'left': (e.pageX - 20) + 'px'});
			}) 
			.hover(function(e) {
				dummyform.css({'width': '40px',
			   		   		   'height': '80px'});
				t.addClass("hover");
			},function(e) {
				if (!cursor_in_element(e,t)) {
					dummyform.css({'width': '0px',
						   		   'height': '0px'});
					t.removeClass("hover");
				}
			});
		
		dummyform
			.mousemove(function(e) {
				if (!cursor_in_element(e,t)) {
					dummyform.css({'width': '0px',
				   		   'height': '0px'});
					t.removeClass("hover");
				}
			})
			.mouseout(function(e) {
				if (!cursor_in_element(e,t)) {
					dummyform.css({'width': '0px',
				   		   'height': '0px'});
					t.removeClass("hover");
				}
			});
			
			thumb.find('img').load(function() {
				// We need to center the image vertically
				var oh = thumb.height();
				var ih = $(this).height();
				
				$(this).css({ marginTop: Math.round((oh - ih) / 2) + 'px' });
			});
			
			dummyform.ajaxForm({
				iframe: true,
				dataType: 'json',
				beforeSubmit: function() {
					var ext = dummyform.find("input").val().split('.').pop().toLowerCase();
					if($.inArray(ext, ['png','jpg','jpeg','gif']) == -1) {
					    alert('File types accepted: PNG, JPG, GIF (25MB max)');
					    return false;
					}
					settings.beforeSubmit();
					
					title.hide();
					thumb.hide();
					loader.show();
				},
				success: function (response) {
					if (response.error) {
						alert("There was a problem uploading your file: " + response.error);
					}
					
					settings.afterSave(response);
					
					
					if (response.thumb) {
						var img = $('<img class="image-thumb" />');
						
						img
							.load(function() {
								t.addClass('preload-image');
								
								loader.hide();
								thumb.show();
								
								// We need to center the image vertically
								var oh = thumb.height();
								var ih = $(this).height();
								
								$(this).css({ marginTop: Math.round((oh - ih) / 2) + 'px' });
								
								settings.success(response, t);
							})
							.attr('src', response.thumb);
						
						thumb
							.empty()
							.append(img);
					}
					
					field.val(response.path);
					
				},
				error: function(response) {
					settings.error();
				}
			});
			
			file.change(function() {
				dummyform.submit();
			});
		});
	};
	
})(jQuery);


$(document).ready(function() {
	
	$('.ajax-image-upload').ajaxImageUpload();
	
});

function getExtension(value) {
  var fileField = value;
  if (fileField.indexOf('\\') > -1) {
    fileField = fileField.substring(fileField.lastIndexOf('\\') + 1, fileField.length);
  }
  if (fileField.indexOf('/') > -1) {
    fileField = fileField.substring(fileField.lastIndexOf('/') + 1, fileField.length);
  }

  var extension;
  if (fileField.indexOf('.') > -1) {
    extension = fileField.substring(fileField.lastIndexOf('.') + 1, fileField.length);
  } else {
    extension = "";
  }
  return extension;
}

/**
 * AJAX Image Uploader Plugin (S3)
 */
function getExtension(value) {
	var fileField = value;
	if (fileField.indexOf('\\') > -1) {
		fileField = fileField.substring(fileField.lastIndexOf('\\') + 1, fileField.length);
	}
	if (fileField.indexOf('/') > -1) {
		fileField = fileField.substring(fileField.lastIndexOf('/') + 1, fileField.length);
	}
	
	var extension;
	if (fileField.indexOf('.') > -1) {
		extension = fileField.substring(fileField.lastIndexOf('.') + 1, fileField.length);
	} else {
		extension = "";
	}
	return extension;
}

(function($) {
	$.fn.ajaxImageUploadToS3 = function (options) {
		var settings = {
			beforeSubmit: function() {},
			afterSave: function(response) {},
			success: function(response) {},
			error: function(response) {}
		};
		
		// Merge in any custom settings
		if (options) { 
			$.extend(settings, options);
		}
		
		var getExtension = function(value) {
			var fileField = value;
			if (fileField.indexOf('\\') > -1) {
				fileField = fileField.substring(fileField.lastIndexOf('\\') + 1, fileField.length);
			}
			if (fileField.indexOf('/') > -1) {
				fileField = fileField.substring(fileField.lastIndexOf('/') + 1, fileField.length);
			}
			
			var extension;
			if (fileField.indexOf('.') > -1) {
				extension = fileField.substring(fileField.lastIndexOf('.') + 1, fileField.length);
			} else {
				extension = "";
			}
			return extension;
		}
		
		return this.each(function() {

			var t = $(this);
			var field = $(this).find('input:hidden');
			var bucket = $(this).find('.s3-bucket').html();
			var key_base = $(this).find('.s3-key_base').html();
			var key_dir = $(this).find('.s3-key_dir').html();
			
			if (!field.length) {
				var form_id = $(this).find('.name').html() + '-dummy-form';
			} else {
				var form_id = field.attr('name') + '-dummy-form';
			}
			
			var loader = $(this).find('.ajax-loader');
			var title = $(this).find('.uploader-title');
			var thumb = $(this).find('.uploader-thumb');
			
			// Fields to go into dummy form
			var field_file = $('<input type="file" name="file"/>');
			var field_accesskey = $('<input type="hidden" name="AWSAccessKeyId" value="' + $(this).find('.s3-AWSAccessKeyId').html() + '" />');
			var field_successaction = $('<input type="hidden" name="success_action_redirect" value="' + $(this).find('.s3-success_action_redirect').html() + '" />');
			var field_policy = $('<input type="hidden" name="Policy" value="' + $(this).find('.s3-Policy').html() + '" />');
			var field_signature = $('<input type="hidden" name="Signature" value="' + $(this).find('.s3-Signature').html() + '" />');
			var field_acl = $('<input type="hidden" name="acl" value="public-read" />');
			var field_key = $('<input type="hidden" name="key" />');
			var field_contenttype = $('<input type="hidden" name="Content-Type" />');
			
			var dummyform = $('<form id="'+form_id+'" class="ajax-dummy-form" method="POST" action="http://'+bucket+'.s3.amazonaws.com" enctype="multipart/form-data"></form>');
			
			dummyform.append(field_accesskey);
			dummyform.append(field_acl);
			dummyform.append(field_key);
			dummyform.append(field_contenttype);
			dummyform.append(field_successaction);
			dummyform.append(field_policy);
			dummyform.append(field_signature);
			dummyform.append(field_file);
			$('body').append(dummyform);
			
			var offset = $(this).offset();
			
			$(this)
			.mousemove(function(e) {
				dummyform.css({'top': (e.pageY - 40) + 'px',
							   'left': (e.pageX - 20) + 'px'});
			}) 
			.hover(function(e) {
				dummyform.css({'width': '40px',
			   		   		   'height': '80px'});
				t.addClass("hover");
			},function(e) {
				if (!cursor_in_element(e,t)) {
					dummyform.css({'width': '0px',
						   		   'height': '0px'});
					t.removeClass("hover");
				}
			});
		
		dummyform
			.mousemove(function(e) {
				if (!cursor_in_element(e,t)) {
					dummyform.css({'width': '0px',
				   		   'height': '0px'});
					t.removeClass("hover");
				}
			})
			.mouseout(function(e) {
				if (!cursor_in_element(e,t)) {
					dummyform.css({'width': '0px',
				   		   'height': '0px'});
					t.removeClass("hover");
				}
			});
			
			thumb.find('img').load(function() {
				// We need to center the image vertically
				var oh = thumb.height();
				var ih = $(this).height();
				
				$(this).css({ marginTop: Math.round((oh - ih) / 2) + 'px' });
			});
			
			dummyform.ajaxForm({
				iframe: true,
				dataType: 'json',
				beforeSubmit: function() {
					var ext = getExtension(dummyform.find(":file").val()).toLowerCase();
					
					if ( ext == "jpg" || ext == "jpeg" ) {
						contentType = "image/jpeg";
					} else if ( ext == "gif" ) {
						contentType = "image/gif";
					} else if ( ext == "png" ) {
						contentType = "image/png";
					} else {
						alert('File types accepted: PNG, JPG, GIF (25MB max)');
					    return false;
					}
					
					var timestamp = new Date().getTime();
					
					settings.beforeSubmit();
					
					field_contenttype.val(contentType);
					field_key.val(key_base + '/' + key_dir + '/' + timestamp + '.' + ext);
					
					title.hide();
					thumb.hide();
					loader.show();
				},
				success: function (response) {
					
					if (response.error) {
						alert("There was a problem uploading your file: " + response.error);
					}
					
					settings.afterSave(response);
					
					
					if (response.thumb) {
						var img = $('<img class="image-thumb" />');
						
						img
							.load(function() {
								t.addClass('preload-image');
								
								loader.hide();
								thumb.show();
								
								// We need to center the image vertically
								var oh = thumb.height();
								var ih = $(this).height();
								
								$(this).css({ marginTop: Math.round((oh - ih) / 2) + 'px' });
								
								settings.success(response, t);
							})
							.attr('src', response.thumb);
						
						thumb
							.empty()
							.append(img);
					}
					
					if (field.length) {
						field.val(response.path);
					}
					
				},
				error: function(xhr, response, error) {
					settings.error();
				}
			});
			
			field_file.change(function() {
				dummyform.submit();
			});
		});
	};
	
})(jQuery);


$(document).ready(function() {
	
	$('.ajax-image-upload-to-s3').ajaxImageUploadToS3();
	
});

/*
 * Validate the tab you supply 
 */
function validate_tab(tab) {
	var currtab = tab;
	var require_fields = currtab.find('.required:not(div)');
	var valid = true;
	require_fields.each(function () {
		if (!($(this).valid())) {
			valid = false;
		}
	});
	
	return valid;
}

function focus_validate_error(tab) {
	var currtab = tab;
	var require_field = currtab.find('.required.error:not(div):not(label):first');
	require_field.focus();
}

/**
 * Multi File Uploader
 */
function muploader_add() {
	var b = $(this).parents('.multi-uploader:first');
	var r = b.find('.upload-row:first').clone();
	var f = r.find('input');
	var fc = $('<input type="file" name="' + f.attr('name') + '" />');
	
	r.find('.upload-row-add').click(muploader_add);
	r.find('.upload-row-remove').click(muploader_remove);
	
	f.replaceWith(fc);
	
	b.append(r);
	
	return false;
}

function muploader_remove() {
	var b = $(this).parents('.multi-uploader:first');
	
	if (b.find('.upload-row').length == 1) {
		// Only one left, just clear the field
		var f = $(this).parents('.upload-row:first').find('input');
		var fc = $('<input type="file" name="' + f.attr('name') + '" />');
		
		f.replaceWith(fc);
		
	} else {
		// Remove the entire row
		$(this).parents('.upload-row:first').remove();
	}
	
	return false;
}

function muploader_init() {
	var b = $(this);
	
	$(this).find('.upload-row-add').click(muploader_add);
	$(this).find('.upload-row-remove').click(muploader_remove);
	
	$('.multi-uploader .existing-file-remove', b[0]).live('click',function() {
		if (!confirm('Are you sure you wish to do this?')) {
			return false;
		}
		
		if (b.find('.existing-file').length == 1) {
			$(this).parents('.existing-files:first').remove();
		}
		
		$(this).parents('.existing-file:first').remove();
		
		return false;
	});
}

$(document).ready(function() {
	
	/**
	 * Multiple file uploader
	 */
	$(".multi-uploader").each(muploader_init);
});

/*
Progress Block
*/
function pb_reload() {
	$.ajax({
		type: 'POST',
		data: '_pb=reload',
		success: function(html) {
			$('#pb').replaceWith(html);
		}
	});
}

function pb_cancel() {
	$('#pb #next_step, #pb #prev_step').removeClass('active');
	$('#pb').removeClass('next_extra');
}

function pb_next() {
	$.ajax({
		type: 'POST',
		data: '_pb=next',
		success: function(html) {
			$('#pb').replaceWith(html);
		}
	});
}

function pb_prev() {
	$.ajax({
		type: 'POST',
		data: '_pb=prev',
		success: function(html) {
			$('#pb').replaceWith(html);
		}
	});
}


$(document).ready(function() {
	$('#pb .pb_next_step').live('click',function() {
		if ($('#extra_block').length) {
			
			if ($('#pb').hasClass('next_extra')) {
				$('#pb').removeClass('next_extra');
				$(this).removeClass('active');
			} else {
				$('#pb').addClass('next_extra');
				$(this).addClass('active');
			}
			
		} else {
			pb_next();
		}
		
		return false;
	});
	
	$('#pb .pb_prev_step').live('click',function() {
		pb_prev();
		
		return false;
	});
	
	$('#pb .pb_cancel_link').live('click',function() {
		pb_cancel();
		
		return false;
	});
});

(function(jQuery) {
	jQuery.fn.typeWatch = function(o){
		// Options
		var options = jQuery.extend({
			wait : 750,
			callback : function() { },
			highlight : true,
			captureEnter : true,
			minTextLength : 2
		}, o);
			
		function checkElement(timer, override) {
			var elTxt = jQuery(timer.el).val();
		
			// Fire if text > options.minTextLength AND text != saved txt OR if override AND text > options.minTextLength
			if ((elTxt.length > options.minTextLength && elTxt.toUpperCase() != timer.text) 
			|| (override && elTxt.length > options.minTextLength)) {
				timer.text = elTxt.toUpperCase();
				timer.cb(elTxt);
			}
		};
		
		function watchElement(elem) {			
			// Must be text or textarea
			if (elem.type.toUpperCase() == "TEXT" || elem.nodeName.toUpperCase() == "TEXTAREA") {

				// Allocate timer element
				var timer = {
					timer : null, 
					text : jQuery(elem).val().toUpperCase(),
					cb : options.callback, 
					el : elem, 
					wait : options.wait
				};

				// Set focus action (highlight)
				if (options.highlight) {
					jQuery(elem).focus(
						function() {
							this.select();
						});
				}

				// Key watcher / clear and reset the timer
				var startWatch = function(evt) {
					var timerWait = timer.wait;
					var overrideBool = false;
					
					if (evt.keyCode == 13 && this.type.toUpperCase() == "TEXT") {
						timerWait = 1;
						overrideBool = true;
					}
					
					var timerCallbackFx = function()
					{
						checkElement(timer, overrideBool)
					}
					
					// Clear timer					
					clearTimeout(timer.timer);
					timer.timer = setTimeout(timerCallbackFx, timerWait);				
										
				};
				
				jQuery(elem).keydown(startWatch);
			}
		};
		
		// Watch Each Element
		return this.each(function(index){
			watchElement(this);
		});
		
	};

})(jQuery);

//fix for jquery textarea clone
(function (original) {
  $.fn.clone = function () {
    var result = original.apply (this, arguments),
    my_textareas = this.find('textarea'),
    result_textareas = result.find('textarea');

    for (var i = 0, l = my_textareas.length; i < l; ++i)
      $(result_textareas[i]).val ($(my_textareas[i]).val());

    return result;
  };
}) ($.fn.clone);

