/**
 * 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);

/*
 * Custom Form Group Validator
 */
(function($) {

$.extend($.fn, {
	validate_groups: 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;
		}
		
		// 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>');
		
		var 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;
						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 Expandable Blocks
 */
(function($) {

$.extend($.fn, {
	expandable_block: function() {
		
		this.each(function() {
			var b = $(this);
			
			var block_tail = '';
			
			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';
			}
			
			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();
				more_block.show();
				
				$(this).hide();
				less_link.show();
				
				return false;
			});
			
			less_link.bind('click',function() {
				more_block.hide();
				less_block.show();
				
				$(this).hide();
				more_link.show();
				
				return false;
			});
			
			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
 */
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);
}


/*
Define global behaviors
*/
$(document).ready(function() {
	
	
	$("#support_link").click( function(){	  
	  mpmetrics.track('support-click', {'user':'<?php echo ($user) ? $user->name: "anonymous"; ?>'});
	});
	$.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() {
		var field = $(this).next(':input:first');
		var placeholder = this;
		
		if (!field.length) {
			return;
		}
		
		if (field.val().length) {
			$(placeholder).hide();
			$(field).show();
		}
		
		$(this).focus(function() {
			$(placeholder).hide();
			$(field).show().focus();
		});
		
		field.blur(function() {
			if (!$(this).val().length) {
				$(field).hide();
				$(placeholder).show();
			}
		});
	});
	
	// 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();
});

/*
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;
	});
});