﻿require("jquery", function () {

	/* ==========================================================
	* bootstrap-twipsy.js v1.3.0
	* http://twitter.github.com/bootstrap/javascript.html#twipsy
	* Adapted from the original jQuery.tipsy by Jason Frame
	* ==========================================================
	* Copyright 2011 Twitter, Inc.
	*
	* Licensed under the Apache License, Version 2.0 (the "License");
	* you may not use this file except in compliance with the License.
	* You may obtain a copy of the License at
	*
	* http://www.apache.org/licenses/LICENSE-2.0
	*
	* Unless required by applicable law or agreed to in writing, software
	* distributed under the License is distributed on an "AS IS" BASIS,
	* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	* See the License for the specific language governing permissions and
	* limitations under the License.
	* ========================================================== */

	!function ($) {

		/* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
		* ======================================================= */

		var transitionEnd

		$(document).ready(function () {

			$.support.transition = (function () {
				var thisBody = document.body || document.documentElement
		  , thisStyle = thisBody.style
		  , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined
				return support
			})()

			// set CSS transition event type
			if ($.support.transition) {
				transitionEnd = "TransitionEnd"
				if ($.browser.webkit) {
					transitionEnd = "webkitTransitionEnd"
				} else if ($.browser.mozilla) {
					transitionEnd = "transitionend"
				} else if ($.browser.opera) {
					transitionEnd = "oTransitionEnd"
				}
			}

		})


		/* TWIPSY PUBLIC CLASS DEFINITION
		* ============================== */

		var Twipsy = function (element, options) {
			this.$element = $(element)
			this.options = options
			this.enabled = true
			this.fixTitle()
		}

		Twipsy.prototype = {

			show: function () {
				var pos
		  , actualWidth
		  , actualHeight
		  , placement
		  , $tip
		  , tp

				if (this.getTitle() && this.enabled) {
					$tip = this.tip()
					this.setContent()

					if (this.options.animate) {
						$tip.addClass('fade')
					}

					$tip
			.remove()
			.css({ top: 0, left: 0, display: 'block' })
			.prependTo(document.body)

					pos = $.extend({}, this.$element.offset(), {
						width: this.$element[0].offsetWidth
		  , height: this.$element[0].offsetHeight
					})

					actualWidth = $tip[0].offsetWidth
					actualHeight = $tip[0].offsetHeight

					placement = maybeCall(this.options.placement, this, [$tip[0], this.$element[0]])

					switch (placement) {
						case 'below':
							tp = { top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2 }
							break
						case 'above':
							tp = { top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2 }
							break
						case 'left':
							tp = { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset }
							break
						case 'right':
							tp = { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset }
							break
					}

					$tip
			.css(tp)
			.addClass(placement)
			.addClass('in')
				}
			}

	, setContent: function () {
		var $tip = this.tip()
		$tip.find('.twipsy-inner')[this.options.html ? 'html' : 'text'](this.getTitle())
		$tip[0].className = 'twipsy'
	}

	, hide: function () {
		var that = this
		  , $tip = this.tip()

		$tip.removeClass('in')

		function removeElement() {
			$tip.remove();
		}

		removeElement();
	}

	, fixTitle: function () {
		var $e = this.$element
		if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
			$e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
		}
	}

	, getTitle: function () {
		var title
		  , $e = this.$element
		  , o = this.options

		this.fixTitle()

		if (typeof o.title == 'string') {
			title = $e.attr(o.title == 'title' ? 'data-original-title' : o.title)
		} else if (typeof o.title == 'function') {
			title = o.title.call($e[0])
		}

		title = ('' + title).replace(/(^\s*|\s*$)/, "")

		return title || o.fallback
	}

	, tip: function () {
		if (!this.$tip) {
			this.$tip = $('<div class="twipsy" />').html('<div class="twipsy-arrow"></div><div class="twipsy-inner"></div>')
		}
		return this.$tip
	}

	, validate: function () {
		if (!this.$element[0].parentNode) {
			this.hide()
			this.$element = null
			this.options = null
		}
	}

	, enable: function () {
		this.enabled = true
	}

	, disable: function () {
		this.enabled = false
	}

	, toggleEnabled: function () {
		this.enabled = !this.enabled
	}

		}


		/* TWIPSY PRIVATE METHODS
		* ====================== */

		function maybeCall(thing, ctx, args) {
			return typeof thing == 'function' ? thing.apply(ctx, args) : thing
		}

		/* TWIPSY PLUGIN DEFINITION
		* ======================== */

		$.fn.twipsy = function (options) {
			$.fn.twipsy.initWith.call(this, options, Twipsy, 'twipsy')
			return this
		}

		$.fn.twipsy.initWith = function (options, Constructor, name) {
			var twipsy
		, binder
		, eventIn
		, eventOut

			if (options === true) {
				return this.data(name)
			} else if (typeof options == 'string') {
				twipsy = this.data(name)
				if (twipsy) {
					twipsy[options]()
				}
				return this
			}

			options = $.extend({}, $.fn[name].defaults, options)

			function get(ele) {
				var twipsy = $.data(ele, name)

				if (!twipsy) {
					twipsy = new Constructor(ele, $.fn.twipsy.elementOptions(ele, options))
					$.data(ele, name, twipsy)
				}

				return twipsy
			}

			function enter() {
				var twipsy = get(this)
				twipsy.hoverState = 'in'

				if (options.delayIn == 0) {
					twipsy.show()
				} else {
					twipsy.fixTitle()
					setTimeout(function () {
						if (twipsy.hoverState == 'in') {
							twipsy.show()
						}
					}, options.delayIn)
				}
			}

			function leave() {
				var twipsy = get(this)
				twipsy.hoverState = 'out'
				if (options.delayOut == 0) {
					twipsy.hide()
				} else {
					setTimeout(function () {
						if (twipsy.hoverState == 'out') {
							twipsy.hide()
						}
					}, options.delayOut)
				}
			}

			if (!options.live) {
				this.each(function () {
					get(this)
				})
			}

			if (options.trigger != 'manual') {
				binder = options.live ? 'live' : 'bind'
				eventIn = options.trigger == 'hover' ? 'mouseenter' : 'focus'
				eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur'
				this[binder](eventIn, enter)[binder](eventOut, leave)
			}

			return this
		}

		$.fn.twipsy.Twipsy = Twipsy

		$.fn.twipsy.defaults = {
			animate: true
	, delayIn: 0
	, delayOut: 0
	, fallback: ''
	, placement: 'above'
	, html: false
	, live: false
	, offset: 0
	, title: 'title'
	, trigger: 'hover'
		}

		$.fn.twipsy.elementOptions = function (ele, options) {
			return $.metadata ? $.extend({}, options, $(ele).metadata()) : options
		}

	} (window.jQuery || window.ender);

	// End Twipsy

	$("#lead-form").submit(function () {
		$.ajax({
			url: this.action,
			type: this.method,
			data: $(this).serialize(),
			statusCode: {
				200: function (xhr) {
					_gaq.push(['_trackEvent', 'Lead Form', 'Submission', window.location.hostname]);
					$("#lead-form").html("<p>Thank you for your interest in this domain! We will be in contact with you very soon.</p>");
					$(".instructions").hide();
					$("#lead-form-error").hide();
				},
				400: function (xhr, type, msg) {
					_gaq.push(['_trackEvent', 'Lead Form', 'Validation Error', window.location.hostname]);
					$("#lead-form-error").html("<p>" + msg + "</p>");
					Recaptcha.reload();
				},
				500: function () {
					_gaq.push(['_trackEvent', 'Lead Form', 'Server Error', window.location.hostname]);
					$("#lead-form-error").html("<p>An internal error ocurred while sending email</p>");
					Recaptcha.reload();
				}
			}
		});

		return false;
	});

	$(".tip").twipsy().click(function (e) {
		e.preventDefault()
	});

	require("fancybox", function () {
		$('.fbo')
	  .fancybox({
	  	'titleShow': false,
	  	'enableKeyboardNav': false
	  })
	  .click(function (e) {
	  	$("#inquire .title").addClass("hide");

	  	var target = $(this).hasClass("for-email") ? "#email-title" : "#inquire-title";
	  	$(target).removeClass("hide");
	  });
	});

	// Track lead form open events
	$("#email a.fbo, #buy a.fbo, #bottom a.fbo").click(function(e) {
		_gaq.push(['_trackEvent', 'Lead Form', 'Open', $.trim(e.target.text)]);
	});

	// Track outbound link clicks
	$("#roll a").click(function(e) {
		_gaq.push(['_trackEvent', 'Outbound Link', e.target.hostname, $.trim(e.target.text)]);
	});

	// Track chat requests
	$("#chat a").click(function(e) {
		_gaq.push(['_trackEvent', 'Live Chat', 'Chat Request', window.location.hostname]);
	});

});
