$(document).ready(function(){
	$('body').append('<span class="box-cores cor-link"></span>');
	$('body').append('<span class="box-cores cor-link-hover"></span>');
	$('body').append('<span class="box-cores cor-link-fundo-escuro"></span>');
	$('body').append('<span class="box-cores cor-link-fundo-escuro-hover"></span>');
	$('body').append('<span class="box-cores cor-fundo-claro"></span>');
	$('body').append('<span class="box-cores cor-fundo-claro-hover"></span>');
	$('body').append('<span class="box-cores cor-fundo-escuro"></span>');
	$('body').append('<span class="box-cores cor-fundo-escuro-hover"></span>');
	$('body').append('<span class="box-cores cor-tx-alternativo"></span>');
	$('body').append('<span class="box-cores cor-linha"></span>');
	$('body').append('<span class="box-cores cor-fundo-escuro-menu"></span>');
	
	$('.box-cores').hide();
});

(function($){

$.fn.menuHorizontal = function(){
		
        this.each(function(){   
			
            $('ul.menu-itens').find('.menu-subitens').hide();
            
            $('ul.menu-itens > li').hover(function(){
				
                $(this).children('.menu-subitens').show();
               
                // Implementacao para quebra de colunas
				var $menuSubitens = $(this).children('a').siblings(".menu-subitens");
	            $menuSubitens.css("width", $menuSubitens.children(".conteudo-subitens").children("ul").size() * 160);
                
                return false;
			},function(){
                
                $(this).children('.menu-subitens').hide();
                return false;
            });
				
		});

		return this;
	}
	
})(jQuery);

var LogoDoHeader = {
	init:function() {
		var that = this;
		this.tentativas = 0;
		this.maximoTentativas = 10;
		this.thread = setInterval(function(){ that.executa() }, 100);
	},
	executa:function() {
		if(this.tentativas>this.maximoTentativas) {
			clearInterval(this.thread);
			return;
		}
		if(!this.achou()) {
			this.tentativas++;
			return;
		}
		this.troca();
		clearInterval(this.thread);
	},
	achou:function() {
		var antiga = $('#glb-barra-widget #glb-barra-og img');
		return antiga.size()>0
	},
	troca:function() {
		var antiga = $('#glb-barra-widget #glb-barra-og img');
		var nova = $(document.createElement('img'));
		nova.attr('src','/media/commons/img/redeglobo.gif');
		antiga.before(nova);
		antiga.remove();
		nova.show();
		return true;
	}
}

$(document).ready(function() {
	LogoDoHeader.init();
} );
/*
 * jQuery UI 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI
 */
;jQuery.ui || (function($) {

var _remove = $.fn.remove,
	isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9);

//Helper functions and ui object
$.ui = {
	version: "1.7.2",

	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
	plugin: {
		add: function(module, option, set) {
			var proto = $.ui[module].prototype;
			for(var i in set) {
				proto.plugins[i] = proto.plugins[i] || [];
				proto.plugins[i].push([option, set[i]]);
			}
		},
		call: function(instance, name, args) {
			var set = instance.plugins[name];
			if(!set || !instance.element[0].parentNode) { return; }

			for (var i = 0; i < set.length; i++) {
				if (instance.options[set[i][0]]) {
					set[i][1].apply(instance.element, args);
				}
			}
		}
	},

	contains: function(a, b) {
		return document.compareDocumentPosition
			? a.compareDocumentPosition(b) & 16
			: a !== b && a.contains(b);
	},

	hasScroll: function(el, a) {

		//If overflow is hidden, the element might have extra content, but the user wants to hide it
		if ($(el).css('overflow') == 'hidden') { return false; }

		var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',
			has = false;

		if (el[scroll] > 0) { return true; }

		// TODO: determine which cases actually cause this to happen
		// if the element doesn't have the scroll set, see if it's possible to
		// set the scroll
		el[scroll] = 1;
		has = (el[scroll] > 0);
		el[scroll] = 0;
		return has;
	},

	isOverAxis: function(x, reference, size) {
		//Determines when x coordinate is over "b" element axis
		return (x > reference) && (x < (reference + size));
	},

	isOver: function(y, x, top, left, height, width) {
		//Determines when x, y coordinates is over "b" element
		return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);
	},

	keyCode: {
		BACKSPACE: 8,
		CAPS_LOCK: 20,
		COMMA: 188,
		CONTROL: 17,
		DELETE: 46,
		DOWN: 40,
		END: 35,
		ENTER: 13,
		ESCAPE: 27,
		HOME: 36,
		INSERT: 45,
		LEFT: 37,
		NUMPAD_ADD: 107,
		NUMPAD_DECIMAL: 110,
		NUMPAD_DIVIDE: 111,
		NUMPAD_ENTER: 108,
		NUMPAD_MULTIPLY: 106,
		NUMPAD_SUBTRACT: 109,
		PAGE_DOWN: 34,
		PAGE_UP: 33,
		PERIOD: 190,
		RIGHT: 39,
		SHIFT: 16,
		SPACE: 32,
		TAB: 9,
		UP: 38
	}
};

// WAI-ARIA normalization
if (isFF2) {
	var attr = $.attr,
		removeAttr = $.fn.removeAttr,
		ariaNS = "http://www.w3.org/2005/07/aaa",
		ariaState = /^aria-/,
		ariaRole = /^wairole:/;

	$.attr = function(elem, name, value) {
		var set = value !== undefined;

		return (name == 'role'
			? (set
				? attr.call(this, elem, name, "wairole:" + value)
				: (attr.apply(this, arguments) || "").replace(ariaRole, ""))
			: (ariaState.test(name)
				? (set
					? elem.setAttributeNS(ariaNS,
						name.replace(ariaState, "aaa:"), value)
					: attr.call(this, elem, name.replace(ariaState, "aaa:")))
				: attr.apply(this, arguments)));
	};

	$.fn.removeAttr = function(name) {
		return (ariaState.test(name)
			? this.each(function() {
				this.removeAttributeNS(ariaNS, name.replace(ariaState, ""));
			}) : removeAttr.call(this, name));
	};
}

//jQuery plugins
$.fn.extend({
	remove: function() {
		// Safari has a native remove event which actually removes DOM elements,
		// so we have to use triggerHandler instead of trigger (#3037).
		$("*", this).add(this).each(function() {
			$(this).triggerHandler("remove");
		});
		return _remove.apply(this, arguments );
	},

	enableSelection: function() {
		return this
			.attr('unselectable', 'off')
			.css('MozUserSelect', '')
			.unbind('selectstart.ui');
	},

	disableSelection: function() {
		return this
			.attr('unselectable', 'on')
			.css('MozUserSelect', 'none')
			.bind('selectstart.ui', function() { return false; });
	},

	scrollParent: function() {
		var scrollParent;
		if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
			scrollParent = this.parents().filter(function() {
				return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
			}).eq(0);
		} else {
			scrollParent = this.parents().filter(function() {
				return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
			}).eq(0);
		}

		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
	}
});


//Additional selectors
$.extend($.expr[':'], {
	data: function(elem, i, match) {
		return !!$.data(elem, match[3]);
	},

	focusable: function(element) {
		var nodeName = element.nodeName.toLowerCase(),
			tabIndex = $.attr(element, 'tabindex');
		return (/input|select|textarea|button|object/.test(nodeName)
			? !element.disabled
			: 'a' == nodeName || 'area' == nodeName
				? element.href || !isNaN(tabIndex)
				: !isNaN(tabIndex))
			// the element and all of its ancestors must be visible
			// the browser may report that the area is hidden
			&& !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
	},

	tabbable: function(element) {
		var tabIndex = $.attr(element, 'tabindex');
		return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable');
	}
});


// $.widget is a factory to create jQuery plugins
// taking some boilerplate code out of the plugin code
function getter(namespace, plugin, method, args) {
	function getMethods(type) {
		var methods = $[namespace][plugin][type] || [];
		return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);
	}

	var methods = getMethods('getter');
	if (args.length == 1 && typeof args[0] == 'string') {
		methods = methods.concat(getMethods('getterSetter'));
	}
	return ($.inArray(method, methods) != -1);
}

$.widget = function(name, prototype) {
	var namespace = name.split(".")[0];
	name = name.split(".")[1];

	// create plugin method
	$.fn[name] = function(options) {
		var isMethodCall = (typeof options == 'string'),
			args = Array.prototype.slice.call(arguments, 1);

		// prevent calls to internal methods
		if (isMethodCall && options.substring(0, 1) == '_') {
			return this;
		}

		// handle getter methods
		if (isMethodCall && getter(namespace, name, options, args)) {
			var instance = $.data(this[0], name);
			return (instance ? instance[options].apply(instance, args)
				: undefined);
		}

		// handle initialization and non-getter methods
		return this.each(function() {
			var instance = $.data(this, name);

			// constructor
			(!instance && !isMethodCall &&
				$.data(this, name, new $[namespace][name](this, options))._init());

			// method call
			(instance && isMethodCall && $.isFunction(instance[options]) &&
				instance[options].apply(instance, args));
		});
	};

	// create widget constructor
	$[namespace] = $[namespace] || {};
	$[namespace][name] = function(element, options) {
		var self = this;

		this.namespace = namespace;
		this.widgetName = name;
		this.widgetEventPrefix = $[namespace][name].eventPrefix || name;
		this.widgetBaseClass = namespace + '-' + name;

		this.options = $.extend({},
			$.widget.defaults,
			$[namespace][name].defaults,
			$.metadata && $.metadata.get(element)[name],
			options);

		this.element = $(element)
			.bind('setData.' + name, function(event, key, value) {
				if (event.target == element) {
					return self._setData(key, value);
				}
			})
			.bind('getData.' + name, function(event, key) {
				if (event.target == element) {
					return self._getData(key);
				}
			})
			.bind('remove', function() {
				return self.destroy();
			});
	};

	// add widget prototype
	$[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);

	// TODO: merge getter and getterSetter properties from widget prototype
	// and plugin prototype
	$[namespace][name].getterSetter = 'option';
};

$.widget.prototype = {
	_init: function() {},
	destroy: function() {
		this.element.removeData(this.widgetName)
			.removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')
			.removeAttr('aria-disabled');
	},

	option: function(key, value) {
		var options = key,
			self = this;

		if (typeof key == "string") {
			if (value === undefined) {
				return this._getData(key);
			}
			options = {};
			options[key] = value;
		}

		$.each(options, function(key, value) {
			self._setData(key, value);
		});
	},
	_getData: function(key) {
		return this.options[key];
	},
	_setData: function(key, value) {
		this.options[key] = value;

		if (key == 'disabled') {
			this.element
				[value ? 'addClass' : 'removeClass'](
					this.widgetBaseClass + '-disabled' + ' ' +
					this.namespace + '-state-disabled')
				.attr("aria-disabled", value);
		}
	},

	enable: function() {
		this._setData('disabled', false);
	},
	disable: function() {
		this._setData('disabled', true);
	},

	_trigger: function(type, event, data) {
		var callback = this.options[type],
			eventName = (type == this.widgetEventPrefix
				? type : this.widgetEventPrefix + type);

		event = $.Event(event);
		event.type = eventName;

		// copy original event properties over to the new event
		// this would happen if we could call $.event.fix instead of $.Event
		// but we don't have a way to force an event to be fixed multiple times
		if (event.originalEvent) {
			for (var i = $.event.props.length, prop; i;) {
				prop = $.event.props[--i];
				event[prop] = event.originalEvent[prop];
			}
		}

		this.element.trigger(event, data);

		return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false
			|| event.isDefaultPrevented());
	}
};

$.widget.defaults = {
	disabled: false
};


/** Mouse Interaction Plugin **/

$.ui.mouse = {
	_mouseInit: function() {
		var self = this;

		this.element
			.bind('mousedown.'+this.widgetName, function(event) {
				return self._mouseDown(event);
			})
			.bind('click.'+this.widgetName, function(event) {
				if(self._preventClickEvent) {
					self._preventClickEvent = false;
					event.stopImmediatePropagation();
					return false;
				}
			});

		// Prevent text selection in IE
		if ($.browser.msie) {
			this._mouseUnselectable = this.element.attr('unselectable');
			this.element.attr('unselectable', 'on');
		}

		this.started = false;
	},

	// TODO: make sure destroying one instance of mouse doesn't mess with
	// other instances of mouse
	_mouseDestroy: function() {
		this.element.unbind('.'+this.widgetName);

		// Restore text selection in IE
		($.browser.msie
			&& this.element.attr('unselectable', this._mouseUnselectable));
	},

	_mouseDown: function(event) {
		// don't let more than one widget handle mouseStart
		// TODO: figure out why we have to use originalEvent
		event.originalEvent = event.originalEvent || {};
		if (event.originalEvent.mouseHandled) { return; }

		// we may have missed mouseup (out of window)
		(this._mouseStarted && this._mouseUp(event));

		this._mouseDownEvent = event;

		var self = this,
			btnIsLeft = (event.which == 1),
			elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
			return true;
		}

		this.mouseDelayMet = !this.options.delay;
		if (!this.mouseDelayMet) {
			this._mouseDelayTimer = setTimeout(function() {
				self.mouseDelayMet = true;
			}, this.options.delay);
		}

		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
			this._mouseStarted = (this._mouseStart(event) !== false);
			if (!this._mouseStarted) {
				event.preventDefault();
				return true;
			}
		}

		// these delegates are required to keep context
		this._mouseMoveDelegate = function(event) {
			return self._mouseMove(event);
		};
		this._mouseUpDelegate = function(event) {
			return self._mouseUp(event);
		};
		$(document)
			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);

		// preventDefault() is used to prevent the selection of text here -
		// however, in Safari, this causes select boxes not to be selectable
		// anymore, so this fix is needed
		($.browser.safari || event.preventDefault());

		event.originalEvent.mouseHandled = true;
		return true;
	},

	_mouseMove: function(event) {
		// IE mouseup check - mouseup happened when mouse was out of window
		if ($.browser.msie && !event.button) {
			return this._mouseUp(event);
		}

		if (this._mouseStarted) {
			this._mouseDrag(event);
			return event.preventDefault();
		}

		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
			this._mouseStarted =
				(this._mouseStart(this._mouseDownEvent, event) !== false);
			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
		}

		return !this._mouseStarted;
	},

	_mouseUp: function(event) {
		$(document)
			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);

		if (this._mouseStarted) {
			this._mouseStarted = false;
			this._preventClickEvent = (event.target == this._mouseDownEvent.target);
			this._mouseStop(event);
		}

		return false;
	},

	_mouseDistanceMet: function(event) {
		return (Math.max(
				Math.abs(this._mouseDownEvent.pageX - event.pageX),
				Math.abs(this._mouseDownEvent.pageY - event.pageY)
			) >= this.options.distance
		);
	},

	_mouseDelayMet: function(event) {
		return this.mouseDelayMet;
	},

	// These are placeholder methods, to be overriden by extending plugin
	_mouseStart: function(event) {},
	_mouseDrag: function(event) {},
	_mouseStop: function(event) {},
	_mouseCapture: function(event) { return true; }
};

$.ui.mouse.defaults = {
	cancel: null,
	distance: 1,
	delay: 0
};

})(jQuery);

/*
 * jQuery UI Draggable 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Draggables
 *
 * Depends:
 *	ui.core.js
 */
(function($) {

$.widget("ui.draggable", $.extend({}, $.ui.mouse, {

	_init: function() {

		if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
			this.element[0].style.position = 'relative';

		(this.options.addClasses && this.element.addClass("ui-draggable"));
		(this.options.disabled && this.element.addClass("ui-draggable-disabled"));

		this._mouseInit();

	},

	destroy: function() {
		if(!this.element.data('draggable')) return;
		this.element
			.removeData("draggable")
			.unbind(".draggable")
			.removeClass("ui-draggable"
				+ " ui-draggable-dragging"
				+ " ui-draggable-disabled");
		this._mouseDestroy();
	},

	_mouseCapture: function(event) {

		var o = this.options;

		if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
			return false;

		//Quit if we're not on a valid handle
		this.handle = this._getHandle(event);
		if (!this.handle)
			return false;

		return true;

	},

	_mouseStart: function(event) {

		var o = this.options;

		//Create and append the visible helper
		this.helper = this._createHelper(event);

		//Cache the helper size
		this._cacheHelperProportions();

		//If ddmanager is used for droppables, set the global draggable
		if($.ui.ddmanager)
			$.ui.ddmanager.current = this;

		/*
		 * - Position generation -
		 * This block generates everything position related - it's the core of draggables.
		 */

		//Cache the margins of the original element
		this._cacheMargins();

		//Store the helper's css position
		this.cssPosition = this.helper.css("position");
		this.scrollParent = this.helper.scrollParent();

		//The element's absolute position on the page minus margins
		this.offset = this.element.offset();
		this.offset = {
			top: this.offset.top - this.margins.top,
			left: this.offset.left - this.margins.left
		};

		$.extend(this.offset, {
			click: { //Where the click happened, relative to the element
				left: event.pageX - this.offset.left,
				top: event.pageY - this.offset.top
			},
			parent: this._getParentOffset(),
			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
		});

		//Generate the original position
		this.originalPosition = this._generatePosition(event);
		this.originalPageX = event.pageX;
		this.originalPageY = event.pageY;

		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
		if(o.cursorAt)
			this._adjustOffsetFromHelper(o.cursorAt);

		//Set a containment if given in the options
		if(o.containment)
			this._setContainment();

		//Call plugins and callbacks
		this._trigger("start", event);

		//Recache the helper size
		this._cacheHelperProportions();

		//Prepare the droppable offsets
		if ($.ui.ddmanager && !o.dropBehaviour)
			$.ui.ddmanager.prepareOffsets(this, event);

		this.helper.addClass("ui-draggable-dragging");
		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
		return true;
	},

	_mouseDrag: function(event, noPropagation) {

		//Compute the helpers position
		this.position = this._generatePosition(event);
		this.positionAbs = this._convertPositionTo("absolute");

		//Call plugins and callbacks and use the resulting position if something is returned
		if (!noPropagation) {
			var ui = this._uiHash();
			this._trigger('drag', event, ui);
			this.position = ui.position;
		}

		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);

		return false;
	},

	_mouseStop: function(event) {

		//If we are using droppables, inform the manager about the drop
		var dropped = false;
		if ($.ui.ddmanager && !this.options.dropBehaviour)
			dropped = $.ui.ddmanager.drop(this, event);

		//if a drop comes from outside (a sortable)
		if(this.dropped) {
			dropped = this.dropped;
			this.dropped = false;
		}

		if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
			var self = this;
			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
				self._trigger("stop", event);
				self._clear();
			});
		} else {
			this._trigger("stop", event);
			this._clear();
		}

		return false;
	},

	_getHandle: function(event) {

		var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
		$(this.options.handle, this.element)
			.find("*")
			.andSelf()
			.each(function() {
				if(this == event.target) handle = true;
			});

		return handle;

	},

	_createHelper: function(event) {

		var o = this.options;
		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);

		if(!helper.parents('body').length)
			helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));

		if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
			helper.css("position", "absolute");

		return helper;

	},

	_adjustOffsetFromHelper: function(obj) {
		if(obj.left != undefined) this.offset.click.left = obj.left + this.margins.left;
		if(obj.right != undefined) this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
		if(obj.top != undefined) this.offset.click.top = obj.top + this.margins.top;
		if(obj.bottom != undefined) this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
	},

	_getParentOffset: function() {

		//Get the offsetParent and cache its position
		this.offsetParent = this.helper.offsetParent();
		var po = this.offsetParent.offset();

		// This is a special case where we need to modify a offset calculated on start, since the following happened:
		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
			po.left += this.scrollParent.scrollLeft();
			po.top += this.scrollParent.scrollTop();
		}

		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
			po = { top: 0, left: 0 };

		return {
			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
		};

	},

	_getRelativeOffset: function() {

		if(this.cssPosition == "relative") {
			var p = this.element.position();
			return {
				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
			};
		} else {
			return { top: 0, left: 0 };
		}

	},

	_cacheMargins: function() {
		this.margins = {
			left: (parseInt(this.element.css("marginLeft"),10) || 0),
			top: (parseInt(this.element.css("marginTop"),10) || 0)
		};
	},

	_cacheHelperProportions: function() {
		this.helperProportions = {
			width: this.helper.outerWidth(),
			height: this.helper.outerHeight()
		};
	},

	_setContainment: function() {

		var o = this.options;
		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
		if(o.containment == 'document' || o.containment == 'window') this.containment = [
			0 - this.offset.relative.left - this.offset.parent.left,
			0 - this.offset.relative.top - this.offset.parent.top,
			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
		];

		if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
			var ce = $(o.containment)[0]; if(!ce) return;
			var co = $(o.containment).offset();
			var over = ($(ce).css("overflow") != 'hidden');

			this.containment = [
				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
			];
		} else if(o.containment.constructor == Array) {
			this.containment = o.containment;
		}

	},

	_convertPositionTo: function(d, pos) {

		if(!pos) pos = this.position;
		var mod = d == "absolute" ? 1 : -1;
		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);

		return {
			top: (
				pos.top																	// The absolute mouse position
				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
			),
			left: (
				pos.left																// The absolute mouse position
				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
			)
		};

	},

	_generatePosition: function(event) {

		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);

		// This is another very weird special case that only happens for relative elements:
		// 1. If the css position is relative
		// 2. and the scroll parent is the document or similar to the offset parent
		// we have to refresh the relative offset during the scroll so there are no jumps
		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
			this.offset.relative = this._getRelativeOffset();
		}

		var pageX = event.pageX;
		var pageY = event.pageY;

		/*
		 * - Position constraining -
		 * Constrain the position to a mix of grid, containment.
		 */

		if(this.originalPosition) { //If we are not dragging yet, we won't check for options

			if(this.containment) {
				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
			}

			if(o.grid) {
				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;

				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
			}

		}

		return {
			top: (
				pageY																// The absolute mouse position
				- this.offset.click.top													// Click offset (relative to the element)
				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
			),
			left: (
				pageX																// The absolute mouse position
				- this.offset.click.left												// Click offset (relative to the element)
				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
			)
		};

	},

	_clear: function() {
		this.helper.removeClass("ui-draggable-dragging");
		if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
		//if($.ui.ddmanager) $.ui.ddmanager.current = null;
		this.helper = null;
		this.cancelHelperRemoval = false;
	},

	// From now on bulk stuff - mainly helpers

	_trigger: function(type, event, ui) {
		ui = ui || this._uiHash();
		$.ui.plugin.call(this, type, [event, ui]);
		if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
		return $.widget.prototype._trigger.call(this, type, event, ui);
	},

	plugins: {},

	_uiHash: function(event) {
		return {
			helper: this.helper,
			position: this.position,
			absolutePosition: this.positionAbs, //deprecated
			offset: this.positionAbs
		};
	}

}));

$.extend($.ui.draggable, {
	version: "1.7.2",
	eventPrefix: "drag",
	defaults: {
		addClasses: true,
		appendTo: "parent",
		axis: false,
		cancel: ":input,option",
		connectToSortable: false,
		containment: false,
		cursor: "auto",
		cursorAt: false,
		delay: 0,
		distance: 1,
		grid: false,
		handle: false,
		helper: "original",
		iframeFix: false,
		opacity: false,
		refreshPositions: false,
		revert: false,
		revertDuration: 500,
		scope: "default",
		scroll: true,
		scrollSensitivity: 20,
		scrollSpeed: 20,
		snap: false,
		snapMode: "both",
		snapTolerance: 20,
		stack: false,
		zIndex: false
	}
});

$.ui.plugin.add("draggable", "connectToSortable", {
	start: function(event, ui) {

		var inst = $(this).data("draggable"), o = inst.options,
			uiSortable = $.extend({}, ui, { item: inst.element });
		inst.sortables = [];
		$(o.connectToSortable).each(function() {
			var sortable = $.data(this, 'sortable');
			if (sortable && !sortable.options.disabled) {
				inst.sortables.push({
					instance: sortable,
					shouldRevert: sortable.options.revert
				});
				sortable._refreshItems();	//Do a one-time refresh at start to refresh the containerCache
				sortable._trigger("activate", event, uiSortable);
			}
		});

	},
	stop: function(event, ui) {

		//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
		var inst = $(this).data("draggable"),
			uiSortable = $.extend({}, ui, { item: inst.element });

		$.each(inst.sortables, function() {
			if(this.instance.isOver) {

				this.instance.isOver = 0;

				inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
				this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)

				//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
				if(this.shouldRevert) this.instance.options.revert = true;

				//Trigger the stop of the sortable
				this.instance._mouseStop(event);

				this.instance.options.helper = this.instance.options._helper;

				//If the helper has been the original item, restore properties in the sortable
				if(inst.options.helper == 'original')
					this.instance.currentItem.css({ top: 'auto', left: 'auto' });

			} else {
				this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
				this.instance._trigger("deactivate", event, uiSortable);
			}

		});

	},
	drag: function(event, ui) {

		var inst = $(this).data("draggable"), self = this;

		var checkPos = function(o) {
			var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
			var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
			var itemHeight = o.height, itemWidth = o.width;
			var itemTop = o.top, itemLeft = o.left;

			return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
		};

		$.each(inst.sortables, function(i) {
			
			//Copy over some variables to allow calling the sortable's native _intersectsWith
			this.instance.positionAbs = inst.positionAbs;
			this.instance.helperProportions = inst.helperProportions;
			this.instance.offset.click = inst.offset.click;
			
			if(this.instance._intersectsWith(this.instance.containerCache)) {

				//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
				if(!this.instance.isOver) {

					this.instance.isOver = 1;
					//Now we fake the start of dragging for the sortable instance,
					//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
					//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
					this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
					this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
					this.instance.options.helper = function() { return ui.helper[0]; };

					event.target = this.instance.currentItem[0];
					this.instance._mouseCapture(event, true);
					this.instance._mouseStart(event, true, true);

					//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
					this.instance.offset.click.top = inst.offset.click.top;
					this.instance.offset.click.left = inst.offset.click.left;
					this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
					this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;

					inst._trigger("toSortable", event);
					inst.dropped = this.instance.element; //draggable revert needs that
					//hack so receive/update callbacks work (mostly)
					inst.currentItem = inst.element;
					this.instance.fromOutside = inst;

				}

				//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
				if(this.instance.currentItem) this.instance._mouseDrag(event);

			} else {

				//If it doesn't intersect with the sortable, and it intersected before,
				//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
				if(this.instance.isOver) {

					this.instance.isOver = 0;
					this.instance.cancelHelperRemoval = true;
					
					//Prevent reverting on this forced stop
					this.instance.options.revert = false;
					
					// The out event needs to be triggered independently
					this.instance._trigger('out', event, this.instance._uiHash(this.instance));
					
					this.instance._mouseStop(event, true);
					this.instance.options.helper = this.instance.options._helper;

					//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
					this.instance.currentItem.remove();
					if(this.instance.placeholder) this.instance.placeholder.remove();

					inst._trigger("fromSortable", event);
					inst.dropped = false; //draggable revert needs that
				}

			};

		});

	}
});

$.ui.plugin.add("draggable", "cursor", {
	start: function(event, ui) {
		var t = $('body'), o = $(this).data('draggable').options;
		if (t.css("cursor")) o._cursor = t.css("cursor");
		t.css("cursor", o.cursor);
	},
	stop: function(event, ui) {
		var o = $(this).data('draggable').options;
		if (o._cursor) $('body').css("cursor", o._cursor);
	}
});

$.ui.plugin.add("draggable", "iframeFix", {
	start: function(event, ui) {
		var o = $(this).data('draggable').options;
		$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
			$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
			.css({
				width: this.offsetWidth+"px", height: this.offsetHeight+"px",
				position: "absolute", opacity: "0.001", zIndex: 1000
			})
			.css($(this).offset())
			.appendTo("body");
		});
	},
	stop: function(event, ui) {
		$("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
	}
});

$.ui.plugin.add("draggable", "opacity", {
	start: function(event, ui) {
		var t = $(ui.helper), o = $(this).data('draggable').options;
		if(t.css("opacity")) o._opacity = t.css("opacity");
		t.css('opacity', o.opacity);
	},
	stop: function(event, ui) {
		var o = $(this).data('draggable').options;
		if(o._opacity) $(ui.helper).css('opacity', o._opacity);
	}
});

$.ui.plugin.add("draggable", "scroll", {
	start: function(event, ui) {
		var i = $(this).data("draggable");
		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
	},
	drag: function(event, ui) {

		var i = $(this).data("draggable"), o = i.options, scrolled = false;

		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {

			if(!o.axis || o.axis != 'x') {
				if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
				else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
			}

			if(!o.axis || o.axis != 'y') {
				if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
				else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
			}

		} else {

			if(!o.axis || o.axis != 'x') {
				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
			}

			if(!o.axis || o.axis != 'y') {
				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
			}

		}

		if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
			$.ui.ddmanager.prepareOffsets(i, event);

	}
});

$.ui.plugin.add("draggable", "snap", {
	start: function(event, ui) {

		var i = $(this).data("draggable"), o = i.options;
		i.snapElements = [];

		$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
			var $t = $(this); var $o = $t.offset();
			if(this != i.element[0]) i.snapElements.push({
				item: this,
				width: $t.outerWidth(), height: $t.outerHeight(),
				top: $o.top, left: $o.left
			});
		});

	},
	drag: function(event, ui) {

		var inst = $(this).data("draggable"), o = inst.options;
		var d = o.snapTolerance;

		var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;

		for (var i = inst.snapElements.length - 1; i >= 0; i--){

			var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
				t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;

			//Yes, I know, this is insane ;)
			if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
				if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
				inst.snapElements[i].snapping = false;
				continue;
			}

			if(o.snapMode != 'inner') {
				var ts = Math.abs(t - y2) <= d;
				var bs = Math.abs(b - y1) <= d;
				var ls = Math.abs(l - x2) <= d;
				var rs = Math.abs(r - x1) <= d;
				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
			}

			var first = (ts || bs || ls || rs);

			if(o.snapMode != 'outer') {
				var ts = Math.abs(t - y1) <= d;
				var bs = Math.abs(b - y2) <= d;
				var ls = Math.abs(l - x1) <= d;
				var rs = Math.abs(r - x2) <= d;
				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
			}

			if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);

		};

	}
});

$.ui.plugin.add("draggable", "stack", {
	start: function(event, ui) {

		var o = $(this).data("draggable").options;

		var group = $.makeArray($(o.stack.group)).sort(function(a,b) {
			return (parseInt($(a).css("zIndex"),10) || o.stack.min) - (parseInt($(b).css("zIndex"),10) || o.stack.min);
		});

		$(group).each(function(i) {
			this.style.zIndex = o.stack.min + i;
		});

		this[0].style.zIndex = o.stack.min + group.length;

	}
});

$.ui.plugin.add("draggable", "zIndex", {
	start: function(event, ui) {
		var t = $(ui.helper), o = $(this).data("draggable").options;
		if(t.css("zIndex")) o._zIndex = t.css("zIndex");
		t.css('zIndex', o.zIndex);
	},
	stop: function(event, ui) {
		var o = $(this).data("draggable").options;
		if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
	}
});

})(jQuery);

/*
 * jQuery UI Resizable 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Resizables
 *
 * Depends:
 *	ui.core.js
 */
(function($) {

$.widget("ui.resizable", $.extend({}, $.ui.mouse, {

	_init: function() {

		var self = this, o = this.options;
		this.element.addClass("ui-resizable");

		$.extend(this, {
			_aspectRatio: !!(o.aspectRatio),
			aspectRatio: o.aspectRatio,
			originalElement: this.element,
			_proportionallyResizeElements: [],
			_helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
		});

		//Wrap the element if it cannot hold child nodes
		if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {

			//Opera fix for relative positioning
			if (/relative/.test(this.element.css('position')) && $.browser.opera)
				this.element.css({ position: 'relative', top: 'auto', left: 'auto' });

			//Create a wrapper element and set the wrapper to the new current internal element
			this.element.wrap(
				$('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
					position: this.element.css('position'),
					width: this.element.outerWidth(),
					height: this.element.outerHeight(),
					top: this.element.css('top'),
					left: this.element.css('left')
				})
			);

			//Overwrite the original this.element
			this.element = this.element.parent().data(
				"resizable", this.element.data('resizable')
			);

			this.elementIsWrapper = true;

			//Move margins to the wrapper
			this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
			this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});

			//Prevent Safari textarea resize
			this.originalResizeStyle = this.originalElement.css('resize');
			this.originalElement.css('resize', 'none');

			//Push the actual element to our proportionallyResize internal array
			this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));

			// avoid IE jump (hard set the margin)
			this.originalElement.css({ margin: this.originalElement.css('margin') });

			// fix handlers offset
			this._proportionallyResize();

		}

		this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
		if(this.handles.constructor == String) {

			if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
			var n = this.handles.split(","); this.handles = {};

			for(var i = 0; i < n.length; i++) {

				var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
				var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');

				// increase zIndex of sw, se, ne, nw axis
				//TODO : this modifies original option
				if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });

				//TODO : What's going on here?
				if ('se' == handle) {
					axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
				};

				//Insert into internal handles object and append to element
				this.handles[handle] = '.ui-resizable-'+handle;
				this.element.append(axis);
			}

		}

		this._renderAxis = function(target) {

			target = target || this.element;

			for(var i in this.handles) {

				if(this.handles[i].constructor == String)
					this.handles[i] = $(this.handles[i], this.element).show();

				//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {

					var axis = $(this.handles[i], this.element), padWrapper = 0;

					//Checking the correct pad and border
					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();

					//The padding type i have to apply...
					var padPos = [ 'padding',
						/ne|nw|n/.test(i) ? 'Top' :
						/se|sw|s/.test(i) ? 'Bottom' :
						/^e$/.test(i) ? 'Right' : 'Left' ].join("");

					target.css(padPos, padWrapper);

					this._proportionallyResize();

				}

				//TODO: What's that good for? There's not anything to be executed left
				if(!$(this.handles[i]).length)
					continue;

			}
		};

		//TODO: make renderAxis a prototype function
		this._renderAxis(this.element);

		this._handles = $('.ui-resizable-handle', this.element)
			.disableSelection();

		//Matching axis name
		this._handles.mouseover(function() {
			if (!self.resizing) {
				if (this.className)
					var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
				//Axis, default = se
				self.axis = axis && axis[1] ? axis[1] : 'se';
			}
		});

		//If we want to auto hide the elements
		if (o.autoHide) {
			this._handles.hide();
			$(this.element)
				.addClass("ui-resizable-autohide")
				.hover(function() {
					$(this).removeClass("ui-resizable-autohide");
					self._handles.show();
				},
				function(){
					if (!self.resizing) {
						$(this).addClass("ui-resizable-autohide");
						self._handles.hide();
					}
				});
		}

		//Initialize the mouse interaction
		this._mouseInit();

	},

	destroy: function() {

		this._mouseDestroy();

		var _destroy = function(exp) {
			$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
				.removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
		};

		//TODO: Unwrap at same DOM position
		if (this.elementIsWrapper) {
			_destroy(this.element);
			var wrapper = this.element;
			wrapper.parent().append(
				this.originalElement.css({
					position: wrapper.css('position'),
					width: wrapper.outerWidth(),
					height: wrapper.outerHeight(),
					top: wrapper.css('top'),
					left: wrapper.css('left')
				})
			).end().remove();
		}

		this.originalElement.css('resize', this.originalResizeStyle);
		_destroy(this.originalElement);

	},

	_mouseCapture: function(event) {

		var handle = false;
		for(var i in this.handles) {
			if($(this.handles[i])[0] == event.target) handle = true;
		}

		return this.options.disabled || !!handle;

	},

	_mouseStart: function(event) {

		var o = this.options, iniPos = this.element.position(), el = this.element;

		this.resizing = true;
		this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };

		// bugfix for http://dev.jquery.com/ticket/1749
		if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
			el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
		}

		//Opera fixing relative position
		if ($.browser.opera && (/relative/).test(el.css('position')))
			el.css({ position: 'relative', top: 'auto', left: 'auto' });

		this._renderProxy();

		var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));

		if (o.containment) {
			curleft += $(o.containment).scrollLeft() || 0;
			curtop += $(o.containment).scrollTop() || 0;
		}

		//Store needed variables
		this.offset = this.helper.offset();
		this.position = { left: curleft, top: curtop };
		this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
		this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
		this.originalPosition = { left: curleft, top: curtop };
		this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
		this.originalMousePosition = { left: event.pageX, top: event.pageY };

		//Aspect Ratio
		this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);

	    var cursor = $('.ui-resizable-' + this.axis).css('cursor');
	    $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);

		el.addClass("ui-resizable-resizing");
		this._propagate("start", event);
		return true;
	},

	_mouseDrag: function(event) {

		//Increase performance, avoid regex
		var el = this.helper, o = this.options, props = {},
			self = this, smp = this.originalMousePosition, a = this.axis;

		var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
		var trigger = this._change[a];
		if (!trigger) return false;

		// Calculate the attrs that will be change
		var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;

		if (this._aspectRatio || event.shiftKey)
			data = this._updateRatio(data, event);

		data = this._respectSize(data, event);

		// plugins callbacks need to be called first
		this._propagate("resize", event);

		el.css({
			top: this.position.top + "px", left: this.position.left + "px",
			width: this.size.width + "px", height: this.size.height + "px"
		});

		if (!this._helper && this._proportionallyResizeElements.length)
			this._proportionallyResize();

		this._updateCache(data);

		// calling the user callback at the end
		this._trigger('resize', event, this.ui());

		return false;
	},

	_mouseStop: function(event) {

		this.resizing = false;
		var o = this.options, self = this;

		if(this._helper) {
			var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
						soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
							soffsetw = ista ? 0 : self.sizeDiff.width;

			var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
				left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
				top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;

			if (!o.animate)
				this.element.css($.extend(s, { top: top, left: left }));

			self.helper.height(self.size.height);
			self.helper.width(self.size.width);

			if (this._helper && !o.animate) this._proportionallyResize();
		}

		$('body').css('cursor', 'auto');

		this.element.removeClass("ui-resizable-resizing");

		this._propagate("stop", event);

		if (this._helper) this.helper.remove();
		return false;

	},

	_updateCache: function(data) {
		var o = this.options;
		this.offset = this.helper.offset();
		if (isNumber(data.left)) this.position.left = data.left;
		if (isNumber(data.top)) this.position.top = data.top;
		if (isNumber(data.height)) this.size.height = data.height;
		if (isNumber(data.width)) this.size.width = data.width;
	},

	_updateRatio: function(data, event) {

		var o = this.options, cpos = this.position, csize = this.size, a = this.axis;

		if (data.height) data.width = (csize.height * this.aspectRatio);
		else if (data.width) data.height = (csize.width / this.aspectRatio);

		if (a == 'sw') {
			data.left = cpos.left + (csize.width - data.width);
			data.top = null;
		}
		if (a == 'nw') {
			data.top = cpos.top + (csize.height - data.height);
			data.left = cpos.left + (csize.width - data.width);
		}

		return data;
	},

	_respectSize: function(data, event) {

		var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
				ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
					isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);

		if (isminw) data.width = o.minWidth;
		if (isminh) data.height = o.minHeight;
		if (ismaxw) data.width = o.maxWidth;
		if (ismaxh) data.height = o.maxHeight;

		var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
		var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);

		if (isminw && cw) data.left = dw - o.minWidth;
		if (ismaxw && cw) data.left = dw - o.maxWidth;
		if (isminh && ch)	data.top = dh - o.minHeight;
		if (ismaxh && ch)	data.top = dh - o.maxHeight;

		// fixing jump error on top/left - bug #2330
		var isNotwh = !data.width && !data.height;
		if (isNotwh && !data.left && data.top) data.top = null;
		else if (isNotwh && !data.top && data.left) data.left = null;

		return data;
	},

	_proportionallyResize: function() {

		var o = this.options;
		if (!this._proportionallyResizeElements.length) return;
		var element = this.helper || this.element;

		for (var i=0; i < this._proportionallyResizeElements.length; i++) {

			var prel = this._proportionallyResizeElements[i];

			if (!this.borderDif) {
				var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
					p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];

				this.borderDif = $.map(b, function(v, i) {
					var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
					return border + padding;
				});
			}

			if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
				continue;

			prel.css({
				height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
				width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
			});

		};

	},

	_renderProxy: function() {

		var el = this.element, o = this.options;
		this.elementOffset = el.offset();

		if(this._helper) {

			this.helper = this.helper || $('<div style="overflow:hidden;"></div>');

			// fix ie6 offset TODO: This seems broken
			var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
			pxyoffset = ( ie6 ? 2 : -1 );

			this.helper.addClass(this._helper).css({
				width: this.element.outerWidth() + pxyoffset,
				height: this.element.outerHeight() + pxyoffset,
				position: 'absolute',
				left: this.elementOffset.left - ie6offset +'px',
				top: this.elementOffset.top - ie6offset +'px',
				zIndex: ++o.zIndex //TODO: Don't modify option
			});

			this.helper
				.appendTo("body")
				.disableSelection();

		} else {
			this.helper = this.element;
		}

	},

	_change: {
		e: function(event, dx, dy) {
			return { width: this.originalSize.width + dx };
		},
		w: function(event, dx, dy) {
			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
			return { left: sp.left + dx, width: cs.width - dx };
		},
		n: function(event, dx, dy) {
			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
			return { top: sp.top + dy, height: cs.height - dy };
		},
		s: function(event, dx, dy) {
			return { height: this.originalSize.height + dy };
		},
		se: function(event, dx, dy) {
			return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
		},
		sw: function(event, dx, dy) {
			return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
		},
		ne: function(event, dx, dy) {
			return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
		},
		nw: function(event, dx, dy) {
			return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
		}
	},

	_propagate: function(n, event) {
		$.ui.plugin.call(this, n, [event, this.ui()]);
		(n != "resize" && this._trigger(n, event, this.ui()));
	},

	plugins: {},

	ui: function() {
		return {
			originalElement: this.originalElement,
			element: this.element,
			helper: this.helper,
			position: this.position,
			size: this.size,
			originalSize: this.originalSize,
			originalPosition: this.originalPosition
		};
	}

}));

$.extend($.ui.resizable, {
	version: "1.7.2",
	eventPrefix: "resize",
	defaults: {
		alsoResize: false,
		animate: false,
		animateDuration: "slow",
		animateEasing: "swing",
		aspectRatio: false,
		autoHide: false,
		cancel: ":input,option",
		containment: false,
		delay: 0,
		distance: 1,
		ghost: false,
		grid: false,
		handles: "e,s,se",
		helper: false,
		maxHeight: null,
		maxWidth: null,
		minHeight: 10,
		minWidth: 10,
		zIndex: 1000
	}
});

/*
 * Resizable Extensions
 */

$.ui.plugin.add("resizable", "alsoResize", {

	start: function(event, ui) {

		var self = $(this).data("resizable"), o = self.options;

		_store = function(exp) {
			$(exp).each(function() {
				$(this).data("resizable-alsoresize", {
					width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10),
					left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10)
				});
			});
		};

		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0];	_store(o.alsoResize); }
			else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); }
		}else{
			_store(o.alsoResize);
		}
	},

	resize: function(event, ui){
		var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;

		var delta = {
			height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
			top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
		},

		_alsoResize = function(exp, c) {
			$(exp).each(function() {
				var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left'];

				$.each(css || ['width', 'height', 'top', 'left'], function(i, prop) {
					var sum = (start[prop]||0) + (delta[prop]||0);
					if (sum && sum >= 0)
						style[prop] = sum || null;
				});

				//Opera fixing relative position
				if (/relative/.test(el.css('position')) && $.browser.opera) {
					self._revertToRelativePosition = true;
					el.css({ position: 'absolute', top: 'auto', left: 'auto' });
				}

				el.css(style);
			});
		};

		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
			$.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); });
		}else{
			_alsoResize(o.alsoResize);
		}
	},

	stop: function(event, ui){
		var self = $(this).data("resizable");

		//Opera fixing relative position
		if (self._revertToRelativePosition && $.browser.opera) {
			self._revertToRelativePosition = false;
			el.css({ position: 'relative' });
		}

		$(this).removeData("resizable-alsoresize-start");
	}
});

$.ui.plugin.add("resizable", "animate", {

	stop: function(event, ui) {
		var self = $(this).data("resizable"), o = self.options;

		var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
					soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
						soffsetw = ista ? 0 : self.sizeDiff.width;

		var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
					left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
						top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;

		self.element.animate(
			$.extend(style, top && left ? { top: top, left: left } : {}), {
				duration: o.animateDuration,
				easing: o.animateEasing,
				step: function() {

					var data = {
						width: parseInt(self.element.css('width'), 10),
						height: parseInt(self.element.css('height'), 10),
						top: parseInt(self.element.css('top'), 10),
						left: parseInt(self.element.css('left'), 10)
					};

					if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });

					// propagating resize, and updating values for each animation step
					self._updateCache(data);
					self._propagate("resize", event);

				}
			}
		);
	}

});

$.ui.plugin.add("resizable", "containment", {

	start: function(event, ui) {
		var self = $(this).data("resizable"), o = self.options, el = self.element;
		var oc = o.containment,	ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
		if (!ce) return;

		self.containerElement = $(ce);

		if (/document/.test(oc) || oc == document) {
			self.containerOffset = { left: 0, top: 0 };
			self.containerPosition = { left: 0, top: 0 };

			self.parentData = {
				element: $(document), left: 0, top: 0,
				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
			};
		}

		// i'm a node, so compute top, left, right, bottom
		else {
			var element = $(ce), p = [];
			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });

			self.containerOffset = element.offset();
			self.containerPosition = element.position();
			self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };

			var co = self.containerOffset, ch = self.containerSize.height,	cw = self.containerSize.width,
						width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);

			self.parentData = {
				element: ce, left: co.left, top: co.top, width: width, height: height
			};
		}
	},

	resize: function(event, ui) {
		var self = $(this).data("resizable"), o = self.options,
				ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
				pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;

		if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;

		if (cp.left < (self._helper ? co.left : 0)) {
			self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
			if (pRatio) self.size.height = self.size.width / o.aspectRatio;
			self.position.left = o.helper ? co.left : 0;
		}

		if (cp.top < (self._helper ? co.top : 0)) {
			self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
			if (pRatio) self.size.width = self.size.height * o.aspectRatio;
			self.position.top = self._helper ? co.top : 0;
		}

		self.offset.left = self.parentData.left+self.position.left;
		self.offset.top = self.parentData.top+self.position.top;

		var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
					hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );

		var isParent = self.containerElement.get(0) == self.element.parent().get(0),
		    isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));

		if(isParent && isOffsetRelative) woset -= self.parentData.left;

		if (woset + self.size.width >= self.parentData.width) {
			self.size.width = self.parentData.width - woset;
			if (pRatio) self.size.height = self.size.width / self.aspectRatio;
		}

		if (hoset + self.size.height >= self.parentData.height) {
			self.size.height = self.parentData.height - hoset;
			if (pRatio) self.size.width = self.size.height * self.aspectRatio;
		}
	},

	stop: function(event, ui){
		var self = $(this).data("resizable"), o = self.options, cp = self.position,
				co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;

		var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;

		if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });

		if (self._helper && !o.animate && (/static/).test(ce.css('position')))
			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });

	}
});

$.ui.plugin.add("resizable", "ghost", {

	start: function(event, ui) {

		var self = $(this).data("resizable"), o = self.options, cs = self.size;

		self.ghost = self.originalElement.clone();
		self.ghost
			.css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
			.addClass('ui-resizable-ghost')
			.addClass(typeof o.ghost == 'string' ? o.ghost : '');

		self.ghost.appendTo(self.helper);

	},

	resize: function(event, ui){
		var self = $(this).data("resizable"), o = self.options;
		if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
	},

	stop: function(event, ui){
		var self = $(this).data("resizable"), o = self.options;
		if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
	}

});

$.ui.plugin.add("resizable", "grid", {

	resize: function(event, ui) {
		var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
		o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
		var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);

		if (/^(se|s|e)$/.test(a)) {
			self.size.width = os.width + ox;
			self.size.height = os.height + oy;
		}
		else if (/^(ne)$/.test(a)) {
			self.size.width = os.width + ox;
			self.size.height = os.height + oy;
			self.position.top = op.top - oy;
		}
		else if (/^(sw)$/.test(a)) {
			self.size.width = os.width + ox;
			self.size.height = os.height + oy;
			self.position.left = op.left - ox;
		}
		else {
			self.size.width = os.width + ox;
			self.size.height = os.height + oy;
			self.position.top = op.top - oy;
			self.position.left = op.left - ox;
		}
	}

});

var num = function(v) {
	return parseInt(v, 10) || 0;
};

var isNumber = function(value) {
	return !isNaN(parseInt(value, 10));
};

})(jQuery);

if (!this.JSON) {

// Create a JSON object only if one does not already exist. We create the
// object in a closure to avoid creating global variables.

    JSON = function () {

        function f(n) {
            // Format integers to have at least two digits.
            return n < 10 ? '0' + n : n;
        }

        Date.prototype.toJSON = function (key) {

            return this.getUTCFullYear()   + '-' +
                 f(this.getUTCMonth() + 1) + '-' +
                 f(this.getUTCDate())      + 'T' +
                 f(this.getUTCHours())     + ':' +
                 f(this.getUTCMinutes())   + ':' +
                 f(this.getUTCSeconds())   + 'Z';
        };

        var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
            escapeable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
            gap,
            indent,
            meta = {    // table of character substitutions
                '\b': '\\b',
                '\t': '\\t',
                '\n': '\\n',
                '\f': '\\f',
                '\r': '\\r',
                '"' : '\\"',
                '\\': '\\\\'
            },
            rep;


        function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

            escapeable.lastIndex = 0;
            return escapeable.test(string) ?
                '"' + string.replace(escapeable, function (a) {
                    var c = meta[a];
                    if (typeof c === 'string') {
                        return c;
                    }
                    return '\\u' + ('0000' +
                            (+(a.charCodeAt(0))).toString(16)).slice(-4);
                }) + '"' :
                '"' + string + '"';
        }


        function str(key, holder) {

// Produce a string from holder[key].

            var i,          // The loop counter.
                k,          // The member key.
                v,          // The member value.
                length,
                mind = gap,
                partial,
                value = holder[key];

// If the value has a toJSON method, call it to obtain a replacement value.

            if (value && typeof value === 'object' &&
                    typeof value.toJSON === 'function') {
                value = value.toJSON(key);
            }

// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.

            if (typeof rep === 'function') {
                value = rep.call(holder, key, value);
            }

// What happens next depends on the value's type.

            switch (typeof value) {
            case 'string':
                return quote(value);

            case 'number':

// JSON numbers must be finite. Encode non-finite numbers as null.

                return isFinite(value) ? String(value) : 'null';

            case 'boolean':
            case 'null':

// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce 'null'. The case is included here in
// the remote chance that this gets fixed someday.

                return String(value);

// If the type is 'object', we might be dealing with an object or an array or
// null.

            case 'object':

// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.

                if (!value) {
                    return 'null';
                }

// Make an array to hold the partial results of stringifying this object value.

                gap += indent;
                partial = [];

// If the object has a dontEnum length property, we'll treat it as an array.

                if (typeof value.length === 'number' &&
                        !(value.propertyIsEnumerable('length'))) {

// The object is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.

                    length = value.length;
                    for (i = 0; i < length; i += 1) {
                        partial[i] = str(i, value) || 'null';
                    }

// Join all of the elements together, separated with commas, and wrap them in
// brackets.

                    v = partial.length === 0 ? '[]' :
                        gap ? '[\n' + gap +
                                partial.join(',\n' + gap) + '\n' +
                                    mind + ']' :
                              '[' + partial.join(',') + ']';
                    gap = mind;
                    return v;
                }

// If the replacer is an array, use it to select the members to be stringified.

                if (rep && typeof rep === 'object') {
                    length = rep.length;
                    for (i = 0; i < length; i += 1) {
                        k = rep[i];
                        if (typeof k === 'string') {
                            v = str(k, value, rep);
                            if (v) {
                                partial.push(quote(k) + (gap ? ': ' : ':') + v);
                            }
                        }
                    }
                } else {

// Otherwise, iterate through all of the keys in the object.

                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = str(k, value, rep);
                            if (v) {
                                partial.push(quote(k) + (gap ? ': ' : ':') + v);
                            }
                        }
                    }
                }

// Join all of the member texts together, separated with commas,
// and wrap them in braces.

                v = partial.length === 0 ? '{}' :
                    gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
                            mind + '}' : '{' + partial.join(',') + '}';
                gap = mind;
                return v;
            }
        }

// Return the JSON object containing the stringify and parse methods.

        return {
            stringify: function (value, replacer, space) {

// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.

                var i;
                gap = '';
                indent = '';

// If the space parameter is a number, make an indent string containing that
// many spaces.

                if (typeof space === 'number') {
                    for (i = 0; i < space; i += 1) {
                        indent += ' ';
                    }

// If the space parameter is a string, it will be used as the indent string.

                } else if (typeof space === 'string') {
                    indent = space;
                }

// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.

                rep = replacer;
                if (replacer && typeof replacer !== 'function' &&
                        (typeof replacer !== 'object' ||
                         typeof replacer.length !== 'number')) {
                    throw new Error('JSON.stringify');
                }

// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.

                return str('', {'': value});
            },


            parse: function (text, reviver) {

// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.

                var j;

                function walk(holder, key) {

// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.

                    var k, v, value = holder[key];
                    if (value && typeof value === 'object') {
                        for (k in value) {
                            if (Object.hasOwnProperty.call(value, k)) {
                                v = walk(value, k);
                                if (v !== undefined) {
                                    value[k] = v;
                                } else {
                                    delete value[k];
                                }
                            }
                        }
                    }
                    return reviver.call(holder, key, value);
                }


// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.

                cx.lastIndex = 0;
                if (cx.test(text)) {
                    text = text.replace(cx, function (a) {
                        return '\\u' + ('0000' +
                                (+(a.charCodeAt(0))).toString(16)).slice(-4);
                    });
                }

// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.

// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.

                if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

                    j = eval('(' + text + ')');

// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.

                    return typeof reviver === 'function' ?
                        walk({'': j}, '') : j;
                }

// If the text is not JSON parseable, then a SyntaxError is thrown.

                throw new SyntaxError('JSON.parse');
            }
        };
    }();
}

(function($){

    //$.fn.glb = $.fn.glb || {};
	$.fn.glbWidgetSlide = function(options, browser) {

        var _options = $.extend({
            itemPerView: 1,
            slidePerView: 1,
            btnAnterior: '.seta-anterior',
            btnProximo: '.seta-proximo',
            list: ".widget-slide-listagem",
            bullets: ".item-navegacao a",
            browser: browser
        }, options);
        
        return this.each(function(){
            var $scope = $(this);
            var $btnAnterior = $(_options.btnAnterior, $scope);
            var $btnProximo = $(_options.btnProximo, $scope);
            var $list = $(_options.list, $scope);
            var $bullets = $(_options.bullets, $scope);

            var temporizador;
        	var counterScroll = 0;
        	var counterBtn = 0;

            var pdL = parseInt($("li", $list).css("padding-left").replace("px", ""), 10);
            var pdR = parseInt($("li", $list).css("padding-right").replace("px", ""), 10);

            /* Ajuste incial da lista */
        	var liWidth = $("li", $list).width() + pdL + pdR;
        	var liLength = $("li", $list).size();
            
	        $list.css({"width": 128 * liLength});

            var montaScroll = function(){
		        this.actionBtn();
		        this.marcaBullets();
		    };

            /* ajustando os botões de next e prev */
	        // Botao Anterior
            $btnAnterior.bind('click', function(){
                if( $(this).hasClass('botao-anterior-off') || counterScroll<=0)
                return false;

                counterScroll--;
                counterBtn = Math.max( counterBtn - _options.slidePerView, 0);

                marcaBullets();
                validadeBtn();
                animate();

                return false;
            });
            
            // Botao Proximo
            $btnProximo.bind('click', function(){
                if( $(this).hasClass('botao-proximo-off') ||  counterScroll>=Math.ceil(liLength/_options.itemPerView) )return false;

                counterScroll++;
                counterBtn = Math.min( counterBtn + _options.slidePerView, liLength - _options.slidePerView);
                
                marcaBullets();
                validadeBtn();
                animate();

                return false;                
            });

            // Ativa Botoes de navegacao
	        if( liLength > _options.itemPerView){
	            $btnProximo.removeClass("botao-proximo-off");
	            
	        }

            /* montando os bullets */
            var indexBullet = 0;
	        for(i=0; i < Math.ceil(liLength / _options.itemPerView); i++){
                var $bullet = $('<a href="#" rel="'+i+'">&bull;</a>');
	            $(".item-navegacao", $scope).append($bullet);
                $bullet.bind('click', function(){	            
		            clearTimeout(temporizador);
		                         
                    counterScroll = parseInt($(this).attr("rel"), 10);
                    
                    var i = parseInt($(this).attr("rel"), 10);
                    
                    if(indexBullet<i)
                        counterBtn = Math.min( counterBtn + (_options.slidePerView*(i-indexBullet)), liLength - _options.slidePerView);
                    else
                        counterBtn = Math.max( counterBtn - (_options.slidePerView*(indexBullet-i)), 0);
                        
                    indexBullet = i;
                    
                    marcaBullets();
                    animate();   
                    validadeBtn();
                    
		            return false;
		        });

                if(i==counterScroll)$bullet.addClass("ativo");
	        }

            /* função auxiliar para marcar bullet */
		    var marcaBullets = function(){
                var $bullets = $(_options.bullets, $scope);
                $bullets.removeClass('ativo');
                $bullets.eq( counterScroll ).addClass('ativo');                
                indexBullet = parseInt( $bullets.eq( counterScroll ).attr("rel"), 10);		        
            };

            /* função auxiliar para executar animação pelos botoes do slider */
            var doAnimate = function(){
                var x = - liWidth * counterBtn;
                if( _options.browser ){
                    $list.css('left', x );
                }else{
                    $list.stop().animate({ left : x  + "px" }, 750, "easeInOutQuad");
                }
            };
              
            /* função auxiliar para animar lista */     
            var animate = function(){
                clearTimeout(temporizador);
                temporizador = setTimeout(doAnimate);
            };     
            
            /* função auxiliar habilitar ou desabilitar os buttons */
            var validadeBtn = function(){        
                //Validando o prev
		        if( counterScroll > 0 ) $btnAnterior.removeClass( "botao-anterior-off" );
		        else $btnAnterior.addClass( "botao-anterior-off" );
                //Validando o next
		        if(counterScroll === Math.ceil(liLength / _options.itemPerView) - 1) $btnProximo.addClass( "botao-proximo-off" );
		        else $btnProximo.removeClass( "botao-proximo-off" );
            };       
    
        });
    }

})(jQuery);

(function($) {


var fc = $.fullCalendar = {};
var views = fc.views = {};


/* Defaults
-----------------------------------------------------------------------------*/

var defaults = {

    // display
    defaultView: 'month',
    aspectRatio: 1.35,
    header: {
        left: 'title',
        center: '',
        right: 'today prev,next'
    },
    weekends: true,
    
    // editing
    //editable: false,
    //disableDragging: false,
    //disableResizing: false,
    
    allDayDefault: true,
    
    // event ajax
    lazyFetching: true,
    startParam: 'start',
    endParam: 'end',
    
    // time formats
    titleFormat: {
        month: 'MMMM',
        week: "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
        day: 'dddd, MMM d, yyyy'
    },
    columnFormat: {
        month: 'dddd',
        week: 'ddd M/d',
        day: 'dddd M/d'
    },
    timeFormat: { // for event elements
        '': 'h(:mm)t' // default
    },
    
    // locale
    isRTL: false,
    firstDay: 0,
    monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
    monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Aug','Set','Out','Nov','Dez'],
    dayNames: ['Domingo','Segunda','Terça','Quarta','Quinta','Sexta','Sábado'],
    dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sab'],
    buttonText: {
        prev: ' ',
        next: ' ',
        prevYear: '&nbsp;&lt;&lt;&nbsp;',
        nextYear: '&nbsp;&gt;&gt;&nbsp;',
        today: 'hoje',
        month: 'mes',
        week: 'semana',
        day: 'dia'
    },
    
    // jquery-ui theming
    theme: false,
    buttonIcons: {
        prev: 'circle-triangle-w',
        next: 'circle-triangle-e'
    }
    
};

// right-to-left defaults
var rtlDefaults = {
    header: {
        left: 'prox,ant hoje',
        center: '',
        right: 'title'
    },
    buttonText: {
        prev: '&nbsp;&#9658;&nbsp;',
        next: '&nbsp;&#9668;&nbsp;',
        prevYear: '&nbsp;&gt;&gt;&nbsp;',
        nextYear: '&nbsp;&lt;&lt;&nbsp;'
    },
    buttonIcons: {
        prev: 'circle-triangle-e',
        next: 'circle-triangle-w'
    }
};

// function for adding/overriding defaults
var setDefaults = fc.setDefaults = function(d) {
    $.extend(true, defaults, d);
}



/* .fullCalendar jQuery function
-----------------------------------------------------------------------------*/

$.fn.fullCalendar = function(options) {

    // method calling
    if (typeof options == 'string') {
        var args = Array.prototype.slice.call(arguments, 1),
            res;
        this.each(function() {
            var data = $.data(this, 'fullCalendar');
            if (data) {
                var r = data[options].apply(this, args);
                if (res == undefined) {
                    res = r;
                }
            }
        });
        if (res != undefined) {
            return res;
        }
        return this;
    }

    // pluck the 'events' and 'eventSources' options
    var eventSources = options.eventSources || [];
    delete options.eventSources;

    if (options.events) {
        eventSources.push(options.events);
        delete options.events;
    }
    
    // first event source reserved for 'sticky' events
    eventSources.unshift([]);
    
    // initialize options
    options = $.extend(true, {},
        defaults,
        (options.isRTL || options.isRTL==undefined && defaults.isRTL) ? rtlDefaults : {},
        options
    );
    var tm = options.theme ? 'ui' : 'fc'; // for making theme classes
    
    
    this.each(function() {
    
    
        /* Instance Initialization
        -----------------------------------------------------------------------------*/
        
        // element
        var _element = this,
            element = $(_element).addClass('fc'),
            elementOuterWidth,
            content = $("<div class='fc-content " + tm + "-widget-content' style='position:relative'/>").prependTo(_element),
            suggestedViewHeight,
            resizeUID = 0,
            ignoreWindowResize = 0,
            date = new Date(),
            viewName,  // the current view name (TODO: look into getting rid of)
            view,      // the current view
            viewInstances = {},
            absoluteViewElement;
            
            
            
        if (options.isRTL) {
            element.addClass('fc-rtl');
        }
        if (options.theme) {
            element.addClass('ui-widget');
        }
            
        if (options.year != undefined && options.year != date.getFullYear()) {
            date.setDate(1);
            date.setMonth(0);
            date.setFullYear(options.year);
        }
        if (options.month != undefined && options.month != date.getMonth()) {
            date.setDate(1);
            date.setMonth(options.month);
        }
        if (options.date != undefined) {
            date.setDate(options.date);
        }
        
        /* View Rendering
        -----------------------------------------------------------------------------*/
        
        function changeView(v) {
            if (v != viewName) {
                ignoreWindowResize++; // because setMinHeight might change the height before render (and subsequently setSize) is reached
                
                var oldView = view,
                    newViewElement;
                    
                if (oldView) {
                    if (oldView.eventsChanged) {
                        eventsDirty();
                        oldView.eventDirty = oldView.eventsChanged = false;
                    }
                    if (oldView.beforeHide) {
                        oldView.beforeHide(); // called before changing min-height. if called after, scroll state is reset (in Opera)
                    }
                    setMinHeight(content, content.height());
                    oldView.element.hide();
                }else{
                    setMinHeight(content, 1); // needs to be 1 (not 0) for IE7, or else view dimensions miscalculated
                }
                content.css('overflow', 'hidden');
                
                if (viewInstances[v]) {
                    (view = viewInstances[v]).element.show();
                }else{
                    view = viewInstances[v] = $.fullCalendar.views[v](
                        newViewElement = absoluteViewElement =
                            $("<div class='fc-view fc-view-" + v + "' style='position:absolute'/>")
                                .appendTo(content),
                        options
                    );
                }
                
                if (header) {
                    // update 'active' view button
                    header.find('div.fc-button-' + viewName).removeClass(tm + '-state-active');
                    header.find('div.fc-button-' + v).addClass(tm + '-state-active');
                }
                
                view.name = viewName = v;
                render(); // after height has been set, will make absoluteViewElements position=relative, then set to null
                content.css('overflow', '');
                if (oldView) {
                    setMinHeight(content, 1);
                }
                if (!newViewElement && view.afterShow) {
                    view.afterShow(); // called after setting min-height/overflow, so in final scroll state (for Opera)
                }
                
                ignoreWindowResize--;
            }
        }
        
        
        function render(inc) {
    
            if (elementVisible()) {
                ignoreWindowResize++; // because view.renderEvents might temporarily change the height before setSize is reached
                
                if (suggestedViewHeight == undefined) {
                    calcSize();
                }
                
                if (!view.start || inc || date < view.start || date >= view.end) {
                    view.render(date, inc || 0); // responsible for clearing events
                    setSize(true);
                    
                    if (!eventStart || !options.lazyFetching || view.visStart < eventStart || view.visEnd > eventEnd) {
                        fetchAndRenderEvents();
                    }else{
                        view.renderEvents(events); // dont refetch
                    }
                }
                else if (view.sizeDirty || view.eventsDirty || !options.lazyFetching) {
                    view.clearEvents();
                    if (view.sizeDirty) {
                        setSize();
                    }
                    if (options.lazyFetching) {
                        view.renderEvents(events); // dont refetch
                    }else{
                        fetchAndRenderEvents();
                    }
                }
                elementOuterWidth = element.outerWidth();
                view.sizeDirty = false;
                view.eventsDirty = false;
                
                if (header) {
                    // update title text
                    header.find('span.fc-header-title').html(view.title);
                    // enable/disable 'today' button
                    var today = new Date();
                    if (today >= view.start && today < view.end) {
                        header.find('div.fc-button-today').addClass(tm + '-state-disabled');
                    }else{
                        header.find('div.fc-button-today').removeClass(tm + '-state-disabled');
                    }
                }
                
                ignoreWindowResize--;
                view.trigger('viewDisplay', _element);
            }
        }
        
        
        function elementVisible() {
            return _element.offsetWidth !== 0;
        }
        
        function bodyVisible() {
            return $('body')[0].offsetWidth !== 0;
        }
        
        
        // called when any event objects have been added/removed/changed, rerenders
        function eventsChanged() {
            eventsDirty();
            if (elementVisible()) {
                view.clearEvents();
                view.renderEvents(events);
                view.eventsDirty = false;
            }
        }
        
        // marks other views' events as dirty
        function eventsDirty() {
            $.each(viewInstances, function() {
                this.eventsDirty = true;
            });
        }
        
        // called when we know the element size has changed
        function sizeChanged() {
            sizesDirty();
            if (elementVisible()) {
                calcSize();
                setSize();
                view.rerenderEvents();
                view.sizeDirty = false;
            }
        }
        
        // marks other views' sizes as dirty
        function sizesDirty() {
            $.each(viewInstances, function() {
                this.sizeDirty = true;
            });
        }
        
        
        
        
        /* Event Sources and Fetching
        -----------------------------------------------------------------------------*/
        
        var events = [],
            eventStart, eventEnd;
        
        // Fetch from ALL sources. Clear 'events' array and populate
        function fetchEvents(callback) {
            events = [];
            eventStart = cloneDate(view.visStart);
            eventEnd = cloneDate(view.visEnd);
            var queued = eventSources.length,
                sourceDone = function() {
                    if (--queued == 0) {
                        if (callback) {
                            callback(events);
                        }
                    }
                }, i=0;
            for (; i<eventSources.length; i++) {
                fetchEventSource(eventSources[i], sourceDone);
            }
        }
        
        // Fetch from a particular source. Append to the 'events' array
        function fetchEventSource(src, callback) {                        
            var prevViewName = view.name,
                prevDate = cloneDate(date),
                reportEvents = function(a) {
                    for (var i=0; i<a.length; i++) {
                        normalizeEvent(a[i], options);
                        a[i].source = src;
                    }
                    events = events.concat(a);
                    if (callback) {
                        callback(a);
                    }

                },
                reportEventsAndPop = function(a) {
                    reportEvents(a);
                    popLoading();
                };
            if (typeof src == 'string') {
                var params = {};
                params[options.startParam] = Math.round(eventStart.getTime() / 1000);
                params[options.endParam] = Math.round(eventEnd.getTime() / 1000);
                if (options.cacheParam) {
                    params[options.cacheParam] = (new Date()).getTime(); // TODO: deprecate cacheParam
                }
                pushLoading();
                $.ajax({
                    url: src,
                    dataType: 'json',
                    data: params,
                    cache: options.cacheParam || false, // dont let jquery prevent caching if cacheParam is being used
                    success: reportEventsAndPop
                });
            }
            else if ($.isFunction(src)) {
                pushLoading();
                src(cloneDate(eventStart), cloneDate(eventEnd), reportEventsAndPop);
            }
            else {
                reportEvents(src); // src is an array
            }
        }
        
        
        // for convenience
        function fetchAndRenderEvents() {
            fetchEvents(function(events) {   
                view.renderEvents(events); // maintain 'this' in view
            });
        }
        
        
        
        /* Loading State
        -----------------------------------------------------------------------------*/
        
        var loadingLevel = 0;
        
        function pushLoading() {
            if (!loadingLevel++) {
                view.trigger('loading', _element, true);
            }
        }
        
        function popLoading() {
            if (!--loadingLevel) {
                view.trigger('loading', _element, false);
            }
        }
        
        
        
        /* Public Methods
        -----------------------------------------------------------------------------*/
        
        var publicMethods = {
        
            render: function() {
                calcSize();
                sizesDirty();
                eventsDirty();
                render();
            },
            
            changeView: changeView,
            
            getView: function() {
                return view;
            },
            
            getDate: function() {
                return date;
            },
            
            option: function(name, value) {
                if (value == undefined) {
                    return options[name];
                }
                if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') {
                    options[name] = value;
                    sizeChanged();
                }
            },
            
            destroy: function() {
                $(window).unbind('resize', windowResize);
                if (header) {
                    header.remove();
                }
                content.remove();
                $.removeData(_element, 'fullCalendar');
            },
            
            //
            // Navigation
            //
            
            prev: function() {
                render(-1);
            },
            
            next: function() {
                render(1);
            },
            
            prevYear: function() {
                addYears(date, -1);
                render();
            },
            
            nextYear: function() {
                addYears(date, 1);
                render();
            },
            
            today: function() {
                date = new Date();
                render();
            },
            
            gotoDate: function(year, month, dateNum) {
                if (typeof year == 'object') {
                    date = cloneDate(year); // provided 1 argument, a Date
                }else{
                    if (year != undefined) {
                        date.setFullYear(year);
                    }
                    if (month != undefined) {
                        date.setMonth(month);
                    }
                    if (dateNum != undefined) {
                        date.setDate(dateNum);
                    }
                }
                render();
            },
            
            incrementDate: function(years, months, days) {
                if (years != undefined) {
                    addYears(date, years);
                }
                if (months != undefined) {
                    addMonths(date, months);
                }
                if (days != undefined) {
                    addDays(date, days);
                }
                render();
            },
            
            //
            // Event Manipulation
            //
            
            updateEvent: function(event) { // update an existing event
                var i, len = events.length, e,
                    startDelta = event.start - event._start,
                    endDelta = event.end ?
                        (event.end - (event._end || view.defaultEventEnd(event))) // event._end would be null if event.end
                        : 0;                                                      // was null and event was just resized
                for (i=0; i<len; i++) {
                    e = events[i];
                    if (e._id == event._id && e != event) {
                        e.start = new Date(+e.start + startDelta);
                        if (event.end) {
                            if (e.end) {
                                e.end = new Date(+e.end + endDelta);
                            }else{
                                e.end = new Date(+view.defaultEventEnd(e) + endDelta);
                            }
                        }else{
                            e.end = null;
                        }
                        e.title = event.title;
                        e.url = event.url;
                        e.allDay = event.allDay;
                        e.className = event.className;
                        e.editable = event.editable;
                        normalizeEvent(e, options);
                    }
                }
                normalizeEvent(event, options);
                eventsChanged();
            },
            
            renderEvent: function(event, stick) { // render a new event
                normalizeEvent(event, options);
                if (!event.source) {
                    if (stick) {
                        (event.source = eventSources[0]).push(event);
                    }
                    events.push(event);
                }
                eventsChanged();
            },
            
            removeEvents: function(filter) {
                if (!filter) { // remove all
                    events = [];
                    // clear all array sources
                    for (var i=0; i<eventSources.length; i++) {
                        if (typeof eventSources[i] == 'object') {
                            eventSources[i] = [];
                        }
                    }
                }else{
                    if (!$.isFunction(filter)) { // an event ID
                        var id = filter + '';
                        filter = function(e) {
                            return e._id == id;
                        };
                    }
                    events = $.grep(events, filter, true);
                    // remove events from array sources
                    for (var i=0; i<eventSources.length; i++) {
                        if (typeof eventSources[i] == 'object') {
                            eventSources[i] = $.grep(eventSources[i], filter, true);
                        }
                    }
                }
                eventsChanged();
            },
            
            clientEvents: function(filter) {
                if ($.isFunction(filter)) {
                    return $.grep(events, filter);
                }
                else if (filter) { // an event ID
                    filter += '';
                    return $.grep(events, function(e) {
                        return e._id == filter;
                    });
                }
                return events; // else, return all
            },
            
            rerenderEvents: eventsChanged, // TODO: think of renaming eventsChanged
            
            //
            // Event Source
            //
        
            addEventSource: function(source) {
                eventSources.push(source);
                fetchEventSource(source, eventsChanged);
            },
        
            removeEventSource: function(source) {
                eventSources = $.grep(eventSources, function(src) {
                    return src != source;
                });
                // remove all client events from that source
                events = $.grep(events, function(e) {
                    return e.source != source;
                });
                eventsChanged();
            },
            
            refetchEvents: function() {
                fetchEvents(eventsChanged);
            }
            
        };
        
        $.data(this, 'fullCalendar', publicMethods);
        
        
        
        /* Header
        -----------------------------------------------------------------------------*/
        
        var header,
            sections = options.header;
        if (sections) {
            header = $("<table class='fc-header'/>")
                .append($("<tr/>")
                    .append($("<td class='fc-header-left'/>").append(buildSection(sections.left)))
                    .append($("<td class='fc-header-center'/>").append(buildSection(sections.center)))
                    .append($("<td class='fc-header-right'/>").append(buildSection(sections.right))))
                .prependTo(element);
        }
        function buildSection(buttonStr) {
            if (buttonStr) {
                var tr = $("<tr/>");
                $.each(buttonStr.split(' '), function(i) {
                    if (i > 0) {
                        tr.append("<td><span class='fc-header-space'/></td>");
                    }
                    var prevButton;
                    $.each(this.split(','), function(j, buttonName) {
                        if (buttonName == 'title') {
                            tr.append("<td><span class='fc-header-title fonte-cufon'>&nbsp;</span></td>");
                            if (prevButton) {
                                prevButton.addClass(tm + '-corner-right');
                            }
                            prevButton = null;
                        }else{
                            var buttonClick;
                            if (publicMethods[buttonName]) {
                                buttonClick = publicMethods[buttonName];
                            }
                            else if (views[buttonName]) {
                                buttonClick = function() {
                                    button.removeClass(tm + '-state-hover');
                                    changeView(buttonName)
                                };
                            }
                            if (buttonClick) {
                                if (prevButton) {
                                    prevButton.addClass(tm + '-no-right');
                                }
                                $('.fc-button-next, .fc-button-prev').live('click', function(){
                                    $('.capitulo-dados .data-capitulo').text('');
                                    $('.capitulo-dados .titulo-capitulo').text('');
                                })
                                var button,
                                    icon = options.theme ? smartProperty(options.buttonIcons, buttonName) : null,
                                    text = smartProperty(options.buttonText, buttonName);
                                if (icon) {
                                    button = $("<div class='fc-button-" + buttonName + " ui-state-default'>" +
                                        "<a><span class='ui-icon ui-icon-" + icon + "'/></a></div>");
                                }
                                else if (text) {
                                    button = $("<div class='fc-button-" + buttonName + " " + tm + "-state-default'>" +
                                        "<a><span>" + text + "</span></a></div>");
                                }
                                if (button) {
                                    button
                                        .click(function() {
                                            if (!button.hasClass(tm + '-state-disabled')) {
                                                buttonClick();
                                            }
                                        })
                                        .mousedown(function() {
                                            button
                                                .not('.' + tm + '-state-active')
                                                .not('.' + tm + '-state-disabled')
                                                .addClass(tm + '-state-down');
                                        })
                                        .mouseup(function() {
                                            button.removeClass(tm + '-state-down');
                                        })
                                        .hover(
                                            function() {
                                                button
                                                    .not('.' + tm + '-state-active')
                                                    .not('.' + tm + '-state-disabled')
                                                    .addClass(tm + '-state-hover');
                                            },
                                            function() {
                                                button
                                                    .removeClass(tm + '-state-hover')
                                                    .removeClass(tm + '-state-down');
                                            }
                                        )
                                        .appendTo($("<td/>").appendTo(tr));
                                    if (prevButton) {
                                        prevButton.addClass(tm + '-no-right');
                                    }else{
                                        button.addClass(tm + '-corner-left');
                                    }
                                    prevButton = button;
                                }
                            }
                        }
                    });
                    if (prevButton) {
                        prevButton.addClass(tm + '-corner-right');
                    }
                });
                return $("<table/>").append(tr);
            }
        }
        
        
        
        /* Resizing
        -----------------------------------------------------------------------------*/
        
        
        function calcSize() {
            if (options.contentHeight) {
                suggestedViewHeight = options.contentHeight;
            }
            else if (options.height) {
                suggestedViewHeight = options.height - (header ? header.height() : 0) - vsides(content[0]);
            }
            else {
                suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5));
            }
        }
        
        
        function setSize(dateChanged) {
            ignoreWindowResize++;
            view.setHeight(suggestedViewHeight, dateChanged);
            if (absoluteViewElement) {
                absoluteViewElement.css('position', 'relative');
                absoluteViewElement = null;
            }
            view.setWidth(content.width(), dateChanged);
            ignoreWindowResize--;
        }
        
        
        function windowResize() {
            if (!ignoreWindowResize) {
                if (view.start) { // view has already been rendered
                    var uid = ++resizeUID;
                    setTimeout(function() { // add a delay
                        if (uid == resizeUID && !ignoreWindowResize && elementVisible()) {
                            if (elementOuterWidth != (elementOuterWidth = element.outerWidth())) {
                                ignoreWindowResize++; // in case the windowResize callback changes the height
                                sizeChanged();
                                view.trigger('windowResize', _element);
                                ignoreWindowResize--;
                            }
                        }
                    }, 200);
                }else{
                    // calendar must have been initialized in a 0x0 iframe that has just been resized
                    lateRender();
                }
            }
        };
        $(window).resize(windowResize);
        
        
        // let's begin...
        changeView(options.defaultView);
        
        
        // needed for IE in a 0x0 iframe, b/c when it is resized, never triggers a windowResize
        if (!bodyVisible()) {
            lateRender();
        }
        
        
        // called when we know the calendar couldn't be rendered when it was initialized,
        // but we think it's ready now
        function lateRender() {
            setTimeout(function() { // IE7 needs this so dimensions are calculated correctly
                if (!view.start && bodyVisible()) { // !view.start makes sure this never happens more than once
                    render();
                }
            },0);
        }

    
    });
    
    return this;
    
};



/* Important Event Utilities
-----------------------------------------------------------------------------*/

var fakeID = 0;

function normalizeEvent(event, options) {
    event._id = event._id || (event.id == undefined ? '_fc' + fakeID++ : event.id + '');
    if (event.date) {
        if (!event.start) {
            event.start = event.date;
        }
        delete event.date;
    }
    event._start = cloneDate(event.start = parseDate(event.start));
    event.end = parseDate(event.end);
    if (event.end && event.end <= event.start) {
        event.end = null;
    }
    event._end = event.end ? cloneDate(event.end) : null;
    if (event.allDay == undefined) {
        event.allDay = options.allDayDefault;
    }
    if (event.className) {
        if (typeof event.className == 'string') {
            event.className = event.className.split(/\s+/);
        }
    }else{
        event.className = [];
    }
}
// TODO: if there is no title or start date, return false to indicate an invalid event


/* Grid-based Views: month, basicWeek, basicDay
-----------------------------------------------------------------------------*/

setDefaults({
    weekMode: 'fixed'
});

views.month = function(element, options) {
    return new Grid(element, options, {
        render: function(date, delta) {
            if (delta) {
                addMonths(date, delta);
                date.setDate(1);
            }
            // start/end
            var start = this.start = cloneDate(date, true);
            start.setDate(1);
            this.end = addMonths(cloneDate(start), 1);
            // visStart/visEnd
            var visStart = this.visStart = cloneDate(start),
                visEnd = this.visEnd = cloneDate(this.end),
                nwe = options.weekends ? 0 : 1;
            if (nwe) {
                skipWeekend(visStart);
                skipWeekend(visEnd, -1, true);
            }
            addDays(visStart, -((visStart.getDay() - Math.max(options.firstDay, nwe) + 7) % 7));
            addDays(visEnd, (7 - visEnd.getDay() + Math.max(options.firstDay, nwe)) % 7);
            // row count
            var rowCnt = Math.round((visEnd - visStart) / (DAY_MS * 7));
            if (options.weekMode == 'fixed') {
                addDays(visEnd, (6 - rowCnt) * 7);
                rowCnt = 6;
            }
            // title
            this.title = formatDate(
                start,
                this.option('titleFormat'),
                options
            );
            // render
            this.renderGrid(
                rowCnt, options.weekends ? 7 : 6,
                this.option('columnFormat'),
                true
            );
        }
    });
}

views.basicWeek = function(element, options) {
    return new Grid(element, options, {
        render: function(date, delta) {
            if (delta) {
                addDays(date, delta * 7);
            }
            var visStart = this.visStart = cloneDate(
                    this.start = addDays(cloneDate(date), -((date.getDay() - options.firstDay + 7) % 7))
                ),
                visEnd = this.visEnd = cloneDate(
                    this.end = addDays(cloneDate(visStart), 7)
                );
            if (!options.weekends) {
                skipWeekend(visStart);
                skipWeekend(visEnd, -1, true);
            }
            this.title = formatDates(
                visStart,
                addDays(cloneDate(visEnd), -1),
                this.option('titleFormat'),
                options
            );
            this.renderGrid(
                1, options.weekends ? 7 : 5,
                this.option('columnFormat'),
                false
            );
        }
    });
};

views.basicDay = function(element, options) {
    return new Grid(element, options, {
        render: function(date, delta) {
            if (delta) {
                addDays(date, delta);
                if (!options.weekends) {
                    skipWeekend(date, delta < 0 ? -1 : 1);
                }
            }
            this.title = formatDate(date, this.option('titleFormat'), options);
            this.start = this.visStart = cloneDate(date, true);
            this.end = this.visEnd = addDays(cloneDate(this.start), 1);
            this.renderGrid(
                1, 1,
                this.option('columnFormat'),
                false
            );
        }
    });
}


// rendering bugs

var tdHeightBug;


function Grid(element, options, methods) {
     
    var tm, firstDay,
        nwe,            // no weekends (int)
        rtl, dis, dit,  // day index sign / translate
        viewWidth, viewHeight,
        rowCnt, colCnt,
        colWidth,
        thead, tbody,
        cachedEvents=[],
        segmentContainer,
        dayContentPositions = new HorizontalPositionCache(function(dayOfWeek) {
            return tbody.find('td:eq(' + ((dayOfWeek - Math.max(firstDay,nwe)+colCnt) % colCnt) + ') div div')
        }),
        // ...
        
    // initialize superclass
    view = $.extend(this, viewMethods, methods, {
        renderGrid: renderGrid,
        renderEvents: renderEvents,
        rerenderEvents: rerenderEvents,
        clearEvents: clearEvents,
        setHeight: setHeight,
        setWidth: setWidth,
        defaultEventEnd: function(event) { // calculates an end if event doesnt have one, mostly for resizing
            return cloneDate(event.start);
        }
    });
    view.init(element, options);
    
    
    
    /* Grid Rendering
    -----------------------------------------------------------------------------*/
    
    
    element.addClass('fc-grid');
    if (element.disableSelection) {
        element.disableSelection();
    }

    function renderGrid(r, c, colFormat, showNumbers) {
        rowCnt = r;
        colCnt = c;
                    
        // update option-derived variables
        tm = options.theme ? 'ui' : 'fc';
        nwe = options.weekends ? 0 : 1;
        firstDay = options.firstDay;
        if (rtl = options.isRTL) {
            dis = -1;
            dit = colCnt - 1;
        }else{
            dis = 1;
            dit = 0;
        }
        
        var month = view.start.getMonth(),
            today = clearTime(new Date()),
            s, i, j, d = cloneDate(view.visStart);
        
        if (!tbody) { // first time, build all cells from scratch
                                              
            var table = $("<table/>").appendTo(element);
            s = "<thead><tr>";
            for (i=0; i<colCnt; i++) {
                s += "<th class='fc-" +
                    dayIDs[d.getDay()] + ' ' + // needs to be first
                    tm + '-state-default' +
                    (i==dit ? ' fc-leftmost' : '') +
                    "'>" + formatDate(d, colFormat, options) + "</th>";
                addDays(d, 1);
                if (nwe) {
                    skipWeekend(d);
                }
            }
            thead = $(s + "</tr></thead>").appendTo(table);
            
            s = "<tbody>";
            d = cloneDate(view.visStart);
            for (i=0; i<rowCnt; i++) {
                s += "<tr class='fc-week" + i + "'>";
                for (j=0; j<colCnt; j++) {
                    s += "<td class='fc-" +
                        dayIDs[d.getDay()] + ' ' + // needs to be first
                        tm + '-state-default fc-day' + (i*colCnt+j) +
                        (j==dit ? ' fc-leftmost' : '') +
                        (rowCnt>1 && d.getMonth() != month ? ' fc-other-month' : '') +
                        (+d == +today ?
                        ' fc-today '+tm+'-state-highlight' :
                        ' fc-not-today') + "'>" +
                        (showNumbers ? "<div class='fc-day-number'>" + d.getDate() + "</div>" : '') +
                        "<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></td>";
                    addDays(d, 1);
                    if (nwe) {
                        skipWeekend(d);
                    }
                }
                s += "</tr>";
            }
            
            tbody = $(s + "</tbody>").appendTo(table);
            tbody.find('td').click(dayClick);
            
            segmentContainer = $("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(element);
        
        }else{ // NOT first time, reuse as many cells as possible

            clearEvents();
        
            var prevRowCnt = tbody.find('tr').length;
            if (rowCnt < prevRowCnt) {
                tbody.find('tr:gt(' + (rowCnt-1) + ')').remove(); // remove extra rows
            }
            else if (rowCnt > prevRowCnt) { // needs to create new rows...
                s = '';
                for (i=prevRowCnt; i<rowCnt; i++) {
                    s += "<tr class='fc-week" + i + "'>";
                    for (j=0; j<colCnt; j++) {
                        s += "<td class='fc-" +
                            dayIDs[d.getDay()] + ' ' + // needs to be first
                            tm + '-state-default fc-new fc-day' + (i*colCnt+j) +
                            (j==dit ? ' fc-leftmost' : '') + "'>" +
                            (showNumbers ? "<div class='fc-day-number'></div>" : '') +
                            "<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div>" +
                            "</td>";
                        addDays(d, 1);
                        if (nwe) {
                            skipWeekend(d);
                        }
                    }
                    s += "</tr>";
                }
                tbody.append(s);
            }
            tbody.find('td.fc-new').removeClass('fc-new').click(dayClick);
            
            // re-label and re-class existing cells
            d = cloneDate(view.visStart);
            tbody.find('td').each(function() {
                var td = $(this);
                if (rowCnt > 1) {
                    if (d.getMonth() == month) {
                        td.removeClass('fc-other-month');
                    }else{
                        td.addClass('fc-other-month');
                    }
                }
                if (+d == +today) {
                    td.removeClass('fc-not-today')
                        .addClass('fc-today')
                        .addClass(tm + '-state-highlight');
                }else{
                    td.addClass('fc-not-today')
                        .removeClass('fc-today')
                        .removeClass(tm + '-state-highlight');
                }
                td.find('div.fc-day-number').text(d.getDate());
                addDays(d, 1);
                if (nwe) {
                    skipWeekend(d);
                }
            });
            
            if (rowCnt == 1) { // more changes likely (week or day view)
            
                // redo column header text and class
                d = cloneDate(view.visStart);
                thead.find('th').each(function() {
                    $(this).text(formatDate(d, colFormat, options));
                    this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
                    addDays(d, 1);
                    if (nwe) {
                        skipWeekend(d);
                    }
                });
                
                // redo cell day-of-weeks
                d = cloneDate(view.visStart);
                tbody.find('td').each(function() {
                    this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
                    addDays(d, 1);
                    if (nwe) {
                        skipWeekend(d);
                    }
                });
                
            }
        
        }
    
    };
    
    
    function dayClick(ev) {
        var n = parseInt(this.className.match(/fc\-day(\d+)/)[1]),
            date = addDays(
                cloneDate(view.visStart),
                Math.floor(n/colCnt) * 7 + n % colCnt
            );
        view.trigger('dayClick', this, date, true, ev);
    }
    
    
    
    function setHeight(height) {
        viewHeight = height;
        var leftTDs = tbody.find('tr td:first-child'),
            tbodyHeight = viewHeight - thead.height(),
            rowHeight1, rowHeight2;
        if (options.weekMode == 'variable') {
            rowHeight1 = rowHeight2 = Math.floor(tbodyHeight / (rowCnt==1 ? 2 : 6));
        }else{
            rowHeight1 = Math.floor(tbodyHeight / rowCnt);
            rowHeight2 = tbodyHeight - rowHeight1*(rowCnt-1);
        }
        if (tdHeightBug == undefined) {
            // bug in firefox where cell height includes padding
            var tr = tbody.find('tr:first'),
                td = tr.find('td:first');
            td.height(rowHeight1);
            tdHeightBug = rowHeight1 != td.height();
        }
        if (tdHeightBug) {
            leftTDs.slice(0, -1).height(rowHeight1);
            leftTDs.slice(-1).height(rowHeight2);
        }else{
            setOuterHeight(leftTDs.slice(0, -1), rowHeight1);
            setOuterHeight(leftTDs.slice(-1), rowHeight2);
        }
    }
    
    
    function setWidth(width) {
        viewWidth = width;
        dayContentPositions.clear();
        setOuterWidth(
            thead.find('th').slice(0, -1),
            colWidth = Math.floor(viewWidth / colCnt)
        );
    }

    
    
    /* Event Rendering
    -----------------------------------------------------------------------------*/
    
    
    function renderEvents(events) {
        view.reportEvents(cachedEvents = events);
        hoje = events[0].hoje;
        renderSegs(compileSegs(events),hoje);
    }
    
    
    function rerenderEvents(modifiedEventId) {
        clearEvents();
        renderSegs(compileSegs(cachedEvents), modifiedEventId);
    }
    
    
    function clearEvents() {
        view._clearEvents(); // only clears the hashes
        segmentContainer.empty();
    }
    
    
    function compileSegs(events) {
        hoje = events[0].hoje;
        events = events[0].capitulos;
        var d1 = cloneDate(view.visStart),
            d2 = addDays(cloneDate(d1), colCnt),
            visEventsEnds = $.map(events, visEventEnd),
            i, row,
            j, level,
            k, seg,
            segs=[];
        for (i=0; i<rowCnt; i++) {
            row = stackSegs(view.sliceSegs(events, visEventsEnds, d1, d2));
            for (j=0; j<row.length; j++) {
                level = row[j];
                for (k=0; k<level.length; k++) {
                    seg = level[k];
                    seg.row = i;
                    seg.level = j;
                    segs.push(seg);
                }
            }
            addDays(d1, 7);
            addDays(d2, 7);
        }
        return segs;
    }
    
    
    
    function renderSegs(segs, hoje,modifiedEventId) {
        _renderDaySegs(
            segs,
            hoje,
            rowCnt,
            view,
            0,
            viewWidth,
            function(i) { return tbody.find('tr:eq('+i+')') },
            dayContentPositions.left,
            dayContentPositions.right,
            segmentContainer,
            bindSegHandlers,
            modifiedEventId
        );
    }
    
    
    
    function visEventEnd(event) { // returns exclusive 'visible' end, for rendering
        if (event.end) {
            var end = cloneDate(event.end);
            return (event.allDay || end.getHours() || end.getMinutes()) ? addDays(end, 1) : end;
        }else{
            dataClone = cloneDate(event.start);
            return addDays(dataClone, 1);
        }
    }
    
    
    
    function bindSegHandlers(event, eventElement, seg) {
        view.eventElementHandlers(event, eventElement);
        if (event.editable || event.editable == undefined && options.editable) {
            draggableEvent(event, eventElement);
            if (seg.isEnd) {
                view.resizableDayEvent(event, eventElement, colWidth);
            }
        }
    }
    
    
    
    /* Event Dragging
    -----------------------------------------------------------------------------*/
    
    
    function draggableEvent(event, eventElement) {
        if (!options.disableDragging && eventElement.draggable) {
            var matrix;
            eventElement.draggable({
                zIndex: 9,
                delay: 50,
                opacity: view.option('dragOpacity'),
                revertDuration: options.dragRevertDuration,
                start: function(ev, ui) {
                    view.hideEvents(event, eventElement);
                    view.trigger('eventDragStart', eventElement, event, ev, ui);
                    matrix = new HoverMatrix(function(cell) {
                        eventElement.draggable('option', 'revert', !cell || !cell.rowDelta && !cell.colDelta);
                        if (cell) {
                            view.showOverlay(cell);
                        }else{
                            view.hideOverlay();
                        }
                    });
                    tbody.find('tr').each(function() {
                        matrix.row(this);
                    });
                    var tds = tbody.find('tr:first td');
                    if (rtl) {
                        tds = $(tds.get().reverse());
                    }
                    tds.each(function() {
                        matrix.col(this);
                    });
                    matrix.mouse(ev.pageX, ev.pageY);
                },
                drag: function(ev) {
                    matrix.mouse(ev.pageX, ev.pageY);
                },
                stop: function(ev, ui) {
                    view.hideOverlay();
                    view.trigger('eventDragStop', eventElement, event, ev, ui);
                    var cell = matrix.cell;
                    if (!cell || !cell.rowDelta && !cell.colDelta) {
                        if ($.browser.msie) {
                            eventElement.css('filter', ''); // clear IE opacity side-effects
                        }
                        view.showEvents(event, eventElement);
                    }else{
                        eventElement.find('a').removeAttr('href'); // prevents safari from visiting the link
                        view.eventDrop(this, event, cell.rowDelta*7+cell.colDelta*dis, 0, event.allDay, ev, ui);
                    }
                }
            });
        }
    }
    
    
    // event resizing w/ 'view' methods...

};


function _renderDaySegs(segs, hoje,rowCnt, view, minLeft, maxLeft, getRow, dayContentLeft, dayContentRight, segmentContainer, bindSegHandlers, modifiedEventId) {

    var options=view.options,
        rtl=view.options.isRTL,
        i, segCnt=segs.length, seg,
        event,
        className,
        left, right,
        html='',
        eventElements,
        eventElement,
        triggerRes,
        hsideCache={},
        vmarginCache={},
        key, val,
        rowI, top, levelI, levelHeight,
        rowDivs=[],
        rowDivTops=[];

    // calculate desired position/dimensions, create html
    for (i=0; i<segCnt; i++) {
        seg = segs[i];
        event = seg.event;
        className = 'fc-event fc-event-hori ';
        if (rtl) {
            if (seg.isStart) {
                className += 'fc-corner-right ';
            }
            if (seg.isEnd) {
                className += 'fc-corner-left ';
            }
            left = seg.isEnd ? dayContentLeft(seg.end.getDay()-1) : minLeft;
            right = seg.isStart ? dayContentRight(seg.start.getDay()) : maxLeft;
        }else{
            if (seg.isStart) {
                className += 'fc-corner-left ';
            }
            if (seg.isEnd) {
                className += 'fc-corner-right ';
            }
            left = seg.isStart ? dayContentLeft(seg.start.getDay()) : minLeft;
            right = seg.isEnd ? dayContentRight(seg.end.getDay()-1) : maxLeft;
        }
        
        var classHoje = '';

        var eventoDiaHoje = new Date(event.start).getDate();
        var eventoMesHoje = new Date(event.start).getMonth();
        var eventoAnoHoje = new Date(event.start).getYear();
        var diaHoje = new Date(hoje).getDate();
        var mesHoje = new Date(hoje).getMonth();
        var anoHoje = new Date(hoje).getYear();

        if(diaHoje == eventoDiaHoje && mesHoje == eventoMesHoje && anoHoje == eventoAnoHoje){
            $('.fc-today .fc-day-number').css("visibility","hidden");
            classHoje = 'capitulo-hoje ';
        }       

        if(event.foto160 === null){
             html +=
            "<div class='conteudo-texto " + classHoje + className + "' style='position:absolute;z-index:8;left:"+left+"px'>" +
                "<a" + (event.url ? " href='" + htmlEscape(event.url) + "'" : '') + ">" +
                    "<span class='fc-event-titulo'>"+event.titulo+"</span>" +
                    "<span class='fc-event-data'>"+event.start +"</span>" +
                    "<span class='fc-event-title'></span>" +
                    "<span class='fc-event-day'>" + new Date(event.start).getDate() + "</span>" +                    
                    (diaHoje == eventoDiaHoje && mesHoje == eventoMesHoje && anoHoje == eventoAnoHoje ? "<span class='fc-event-hoje'>hoje</span>" : '' )+
                "</a>" +
            "</div>";
        }else if(event.foto160 != null){
            html +=
            
            "<div class='conteudo-foto " + classHoje + className + "' style='position:absolute;z-index:8;left:"+left+"px'>" +
                "<a style='z-index: 9'"  + (event.url ? " href='" + htmlEscape(event.url) + "'" : '') + ">" +
                    "<span class='overlay-foto'></span>" +
                    (event.foto160 ? "<img src=" + event.foto160 + "></img>" :'') +
                    "<span class='fc-event-titulo'>"+event.titulo+"</span>" +
                    "<span class='fc-event-data'>"+event.start +"</span>" +
                    "<span class='fc-event-title'></span>" +
                    "<span class='fc-event-day'>" + new Date(event.start).getDate() + "</span>" +
                    (diaHoje == eventoDiaHoje && mesHoje == eventoMesHoje && anoHoje == eventoAnoHoje ? "<span class='fc-event-hoje'>hoje</span>" : '' )+
                "</a>" +
            "</div>";
        }

        var tituloHoje;
        var dataHoje;
        if(diaHoje == eventoDiaHoje && mesHoje == eventoMesHoje && anoHoje == eventoAnoHoje){
            tituloHoje =  event.titulo;     
            var dataHoje = formatDate(new Date(event.start), 'ddd d');
            $('.capitulo-dados .data-capitulo').text(dataHoje);
            $('.capitulo-dados .titulo-capitulo').text(tituloHoje);         
        }
        seg.left = left-2; 
        seg.outerWidth = right - left;
    }
    segmentContainer[0].innerHTML = html; // faster than html()
    eventElements = segmentContainer.children();
    
    // retrieve elements, run through eventRender callback, bind handlers
    for (i=0; i<segCnt; i++) {
        seg = segs[i];
        eventElement = $(eventElements[i]); // faster than eq()
        event = seg.event;
        triggerRes = view.trigger('eventRender', event, event, eventElement);
        if (triggerRes === false) {
            eventElement.remove();
        }else{
            if (triggerRes && triggerRes !== true) {
                eventElement.remove();
                eventElement = $(triggerRes)
                    .css({
                        position: 'absolute',
                        left: seg.left
                    })
                    .appendTo(segmentContainer);
            }
            seg.element = eventElement;
            if (event._id === modifiedEventId) {
                bindSegHandlers(event, eventElement, seg);
            }else{
                eventElement[0]._fci = i; // for lazySegBind
            }
            view.reportEventElement(event, eventElement);
        }
    }
    
    lazySegBind(segmentContainer, segs, bindSegHandlers);
    
    // record event horizontal sides
    for (i=0; i<segCnt; i++) {
        seg = segs[i];
        if (eventElement = seg.element) {
            val = hsideCache[key = seg.key = cssKey(eventElement[0])];
            seg.hsides = val == undefined ? (hsideCache[key] = hsides(eventElement[0], true)) : val;
        }
    }
    
    /*
    // set event widths
    for (i=0; i<segCnt; i++) {
        seg = segs[i];
        if (eventElement = seg.element) {
            eventElement[0].style.width = seg.outerWidth - seg.hsides + 'px';
        }
    }
    */
    
    /*
    // record event heights
    for (i=0; i<segCnt; i++) {
        seg = segs[i];
        if (eventElement = seg.element) {
            val = vmarginCache[key = seg.key];
            seg.outerHeight = eventElement[0].offsetHeight + (
                val == undefined ? (vmarginCache[key] = vmargins(eventElement[0])) : val
            );
        }
    }
    */
    
    // set row heights, calculate event tops (in relation to row top)
    for (i=0, rowI=0; rowI<rowCnt; rowI++) {
        top = levelI = levelHeight = 0;
        while (i<segCnt && (seg = segs[i]).row == rowI) {
            if (seg.level != levelI) {
                top += levelHeight;
                levelHeight = 0;
                levelI++;
            }
            levelHeight = Math.max(levelHeight, seg.outerHeight||0);
            seg.top = top;
            i++;
        }
        rowDivs[rowI] = getRow(rowI).find('td:first div.fc-day-content > div') // optimal selector?
            .height(top + levelHeight);
    }
    
    // calculate row tops
    for (rowI=0; rowI<rowCnt; rowI++) {
        rowDivTops[rowI] = rowDivs[rowI][0].offsetTop;
    }
    
    
    // set dimensions
    for (i=0; i<segCnt; i++) {
        seg = segs[i];
        if (eventElement = seg.element) {
            eventElement[0].style.left = seg.left + 'px';                           
            eventElement[0].style.top = rowDivTops[seg.row] + seg.top - 20 + 'px';
            eventElement[0].style.height = $('td.fc-state-default').innerHeight() + 'px';
            eventElement[0].style.width = $('td.fc-state-default').innerWidth() + 'px';
            event = seg.event;
            view.trigger('eventAfterRender', event, event, eventElement);
        }
    }
    
}



/* Agenda Views: agendaWeek/agendaDay
-----------------------------------------------------------------------------*/

setDefaults({
    allDaySlot: true,
    allDayText: 'all-day',
    firstHour: 6,
    slotMinutes: 30,
    defaultEventMinutes: 120,
    axisFormat: 'h(:mm)tt',
    timeFormat: {
        agenda: 'h:mm{ - h:mm}'
    },
    dragOpacity: {
        agenda: .5
    },
    minTime: 0,
    maxTime: 24
});

views.agendaWeek = function(element, options) {
    return new Agenda(element, options, {
        render: function(date, delta) {
            if (delta) {
                addDays(date, delta * 7);
            }
            var visStart = this.visStart = cloneDate(
                    this.start = addDays(cloneDate(date), -((date.getDay() - options.firstDay + 7) % 7))
                ),
                visEnd = this.visEnd = cloneDate(
                    this.end = addDays(cloneDate(visStart), 7)
                );
            if (!options.weekends) {
                skipWeekend(visStart);
                skipWeekend(visEnd, -1, true);
            }
            this.title = formatDates(
                visStart,
                addDays(cloneDate(visEnd), -1),
                this.option('titleFormat'),
                options
            );
            this.renderAgenda(
                options.weekends ? 7 : 5,
                this.option('columnFormat')
            );
        }
    });
};

views.agendaDay = function(element, options) {
    return new Agenda(element, options, {
        render: function(date, delta) {
            if (delta) {
                addDays(date, delta);
                if (!options.weekends) {
                    skipWeekend(date, delta < 0 ? -1 : 1);
                }
            }
            this.title = formatDate(date, this.option('titleFormat'), options);
            this.start = this.visStart = cloneDate(date, true);
            this.end = this.visEnd = addDays(cloneDate(this.start), 1);
            this.renderAgenda(
                1,
                this.option('columnFormat')
            );
        }
    });
};

function Agenda(element, options, methods) {

    var head, body, bodyContent, bodyTable, bg,
        colCnt,
        axisWidth, colWidth, slotHeight,
        viewWidth, viewHeight,
        savedScrollTop,
        cachedEvents=[],
        daySegmentContainer,
        slotSegmentContainer,
        tm, firstDay,
        nwe,            // no weekends (int)
        rtl, dis, dit,  // day index sign / translate
        minMinute, maxMinute,
        colContentPositions = new HorizontalPositionCache(function(col) {
            return bg.find('td:eq(' + col + ') div div');
        }),
        slotTopCache = {},
        // ...
        
    view = $.extend(this, viewMethods, methods, {
        renderAgenda: renderAgenda,
        renderEvents: renderEvents,
        rerenderEvents: rerenderEvents,
        clearEvents: clearEvents,
        setHeight: setHeight,
        setWidth: setWidth,
        beforeHide: function() {
            savedScrollTop = body.scrollTop();
        },
        afterShow: function() {
            body.scrollTop(savedScrollTop);
        },
        defaultEventEnd: function(event) {
            var start = cloneDate(event.start);
            if (event.allDay) {
                return start;
            }
            return addMinutes(start, options.defaultEventMinutes);
        }
    });
    view.init(element, options);
    
    
    
    /* Time-slot rendering
    -----------------------------------------------------------------------------*/
    
    
    element.addClass('fc-agenda');
    if (element.disableSelection) {
        element.disableSelection();
    }
    
    function renderAgenda(c, colFormat) {
        colCnt = c;
        
        // update option-derived variables
        tm = options.theme ? 'ui' : 'fc';
        nwe = options.weekends ? 0 : 1;
        firstDay = options.firstDay;
        if (rtl = options.isRTL) {
            dis = -1;
            dit = colCnt - 1;
        }else{
            dis = 1;
            dit = 0;
        }
        minMinute = parseTime(options.minTime);
        maxMinute = parseTime(options.maxTime);
        
        var d0 = rtl ? addDays(cloneDate(view.visEnd), -1) : cloneDate(view.visStart),
            d = cloneDate(d0),
            today = clearTime(new Date());
        
        if (!head) { // first time rendering, build from scratch
        
            var i,
                minutes,
                slotNormal = options.slotMinutes % 15 == 0, //...
            
            // head
            s = "<div class='fc-agenda-head' style='position:relative;z-index:4'>" +
                "<table style='width:100%'>" +
                "<tr class='fc-first" + (options.allDaySlot ? '' : ' fc-last') + "'>" +
                "<th class='fc-leftmost " +
                    tm + "-state-default'>&nbsp;</th>";
            for (i=0; i<colCnt; i++) {
                s += "<th class='fc-" +
                    dayIDs[d.getDay()] + ' ' + // needs to be first
                    tm + '-state-default' +
                    "'>" + formatDate(d, colFormat, options) + "</th>";
                addDays(d, dis);
                if (nwe) {
                    skipWeekend(d, dis);
                }
            }
            s += "<th class='" + tm + "-state-default'>&nbsp;</th></tr>";
            if (options.allDaySlot) {
                s += "<tr class='fc-all-day'>" +
                        "<th class='fc-axis fc-leftmost " + tm + "-state-default'>" + options.allDayText + "</th>" +
                        "<td colspan='" + colCnt + "' class='" + tm + "-state-default'>" +
                            "<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></td>" +
                        "<th class='" + tm + "-state-default'>&nbsp;</th>" +
                    "</tr><tr class='fc-divider fc-last'><th colspan='" + (colCnt+2) + "' class='" +
                        tm + "-state-default fc-leftmost'><div/></th></tr>";
            }
            s+= "</table></div>";
            head = $(s).appendTo(element);
            head.find('td').click(slotClick);
            
            // all-day event container
            daySegmentContainer = $("<div class='conteudo-datas' style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(head);
            
            // body
            d = zeroDate();
            var maxd = addMinutes(cloneDate(d), maxMinute);
            addMinutes(d, minMinute);
            s = "<table>";
            for (i=0; d < maxd; i++) {
                minutes = d.getMinutes();
                s += "<tr class='" +
                    (i==0 ? 'fc-first' : (minutes==0 ? '' : 'fc-minor')) +
                    "'><th class='fc-axis fc-leftmost " + tm + "-state-default'>" +
                    ((!slotNormal || minutes==0) ? formatDate(d, options.axisFormat) : '&nbsp;') + 
                    "</th><td class='fc-slot" + i + ' ' +
                        tm + "-state-default'><div style='position:relative'>&nbsp;</div></td></tr>";
                addMinutes(d, options.slotMinutes);
            }
            s += "</table>";
            body = $("<div class='fc-agenda-body' style='position:relative;z-index:2;overflow:auto'/>")
                .append(bodyContent = $("<div style='position:relative;overflow:hidden'>")
                    .append(bodyTable = $(s)))
                .appendTo(element);
            body.find('td').click(slotClick);
            
            // slot event container
            slotSegmentContainer = $("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(bodyContent);
            
            // background stripes
            d = cloneDate(d0);
            s = "<div class='fc-agenda-bg' style='position:absolute;z-index:1'>" +
                "<table style='width:100%;height:100%'><tr class='fc-first'>";
            for (i=0; i<colCnt; i++) {
                s += "<td class='fc-" +
                    dayIDs[d.getDay()] + ' ' + // needs to be first
                    tm + '-state-default ' +
                    (i==0 ? 'fc-leftmost ' : '') +
                    (+d == +today ? tm + '-state-highlight fc-today' : 'fc-not-today') +
                    "'><div class='fc-day-content'><div>&nbsp;</div></div></td>";
                addDays(d, dis);
                if (nwe) {
                    skipWeekend(d, dis);
                }
            }
            s += "</tr></table></div>";
            bg = $(s).appendTo(element);
            
        }else{ // skeleton already built, just modify it
        
            clearEvents();
            
            // redo column header text and class
            head.find('tr:first th').slice(1, -1).each(function() {
                $(this).text(formatDate(d, colFormat, options));
                this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
                addDays(d, dis);
                if (nwe) {
                    skipWeekend(d, dis);
                }
            });
            
            // change classes of background stripes
            d = cloneDate(d0);
            bg.find('td').each(function() {
                this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
                if (+d == +today) {
                    $(this)
                        .removeClass('fc-not-today')
                        .addClass('fc-today')
                        .addClass(tm + '-state-highlight');
                }else{
                    $(this)
                        .addClass('fc-not-today')
                        .removeClass('fc-today')
                        .removeClass(tm + '-state-highlight');
                }
                addDays(d, dis);
                if (nwe) {
                    skipWeekend(d, dis);
                }
            });
        
        }
        
    };
    
    
    function resetScroll() {
        var d0 = zeroDate(),
            scrollDate = cloneDate(d0);
        scrollDate.setHours(options.firstHour);
        var top = timePosition(d0, scrollDate) + 1, // +1 for the border
            scroll = function() {
                body.scrollTop(top);
            };
        scroll();
        setTimeout(scroll, 0); // overrides any previous scroll state made by the browser
    }
    
    
    function setHeight(height, dateChanged) {
        viewHeight = height;
        slotTopCache = {};
        
        body.height(height - head.height());
        
        slotHeight = body.find('tr:first div').height() + 1;
        
        bg.css({
            top: head.find('tr').height(),
            height: height
        });
        
        if (dateChanged) {
            resetScroll();
        }
    }
    
    
    function setWidth(width) {
        viewWidth = width;
        colContentPositions.clear();
        
        body.width(width);
        bodyTable.width('');
        
        var topTDs = head.find('tr:first th'),
            stripeTDs = bg.find('td'),
            clientWidth = body[0].clientWidth;
            
        bodyTable.width(clientWidth);
        
        // time-axis width
        axisWidth = 0;
        setOuterWidth(
            head.find('tr:lt(2) th:first').add(body.find('tr:first th'))
                .width('')
                .each(function() {
                    axisWidth = Math.max(axisWidth, $(this).outerWidth());
                }),
            axisWidth
        );
        
        // column width
        colWidth = Math.floor((clientWidth - axisWidth) / colCnt);
        setOuterWidth(stripeTDs.slice(0, -1), colWidth);
        setOuterWidth(topTDs.slice(1, -2), colWidth);
        setOuterWidth(topTDs.slice(-2, -1), clientWidth - axisWidth - colWidth*(colCnt-1));
        
        bg.css({
            left: axisWidth,
            width: clientWidth - axisWidth
        });
    }
    
    
    
    
    function slotClick(ev) {
        var col = Math.floor((ev.pageX - bg.offset().left) / colWidth),
            date = addDays(cloneDate(view.visStart), dit + dis*col),
            rowMatch = this.className.match(/fc-slot(\d+)/);
        if (rowMatch) {
            var mins = parseInt(rowMatch[1]) * options.slotMinutes,
                hours = Math.floor(mins/60);
            date.setHours(hours);
            date.setMinutes(mins%60 + minMinute);
            view.trigger('dayClick', this, date, false, ev);
        }else{
            view.trigger('dayClick', this, date, true, ev);
        }
    }
    
    
    
    /* Event Rendering
    -----------------------------------------------------------------------------*/
    
    function renderEvents(events, modifiedEventId) {
        view.reportEvents(cachedEvents = events);
        var i, len=events.length,
            dayEvents=[],
            slotEvents=[];
        for (i=0; i<len; i++) {
            if (events[i].allDay) {
                dayEvents.push(events[i]);
            }else{
                slotEvents.push(events[i]);
            }
        }
        renderDaySegs(compileDaySegs(dayEvents), modifiedEventId);
        renderSlotSegs(compileSlotSegs(slotEvents), modifiedEventId);
    }
    
    
    function rerenderEvents(modifiedEventId) {
        clearEvents();
        renderEvents(cachedEvents, modifiedEventId);
    }
    
    
    function clearEvents() {
        view._clearEvents(); // only clears the hashes
        daySegmentContainer.empty();
        slotSegmentContainer.empty();
    }
    
    
    
    
    
    function compileDaySegs(events) {
        var levels = stackSegs(view.sliceSegs(events, $.map(events, visEventEnd), view.visStart, view.visEnd)),
            i, levelCnt=levels.length, level,
            j, seg,
            segs=[];
        for (i=0; i<levelCnt; i++) {
            level = levels[i];
            for (j=0; j<level.length; j++) {
                seg = level[j];
                seg.row = 0;
                seg.level = i;
                segs.push(seg);
            }
        }
        return segs;
    }
    
    
    function compileSlotSegs(events) {
        var d = addMinutes(cloneDate(view.visStart), minMinute),
            visEventEnds = $.map(events, visEventEnd),
            i, col,
            j, level,
            k, seg,
            segs=[];
        for (i=0; i<colCnt; i++) {
            col = stackSegs(view.sliceSegs(events, visEventEnds, d, addMinutes(cloneDate(d), maxMinute-minMinute)));
            countForwardSegs(col);
            for (j=0; j<col.length; j++) {
                level = col[j];
                for (k=0; k<level.length; k++) {
                    seg = level[k];
                    seg.col = i;
                    seg.level = j;
                    segs.push(seg);
                }
            }
            addDays(d, 1, true);
        }
        return segs;
    }
    
    
    
    
    // renders 'all-day' events at the top
    
    function renderDaySegs(segs, modifiedEventId) {
        if (options.allDaySlot) {
            _renderDaySegs(
                segs,
                1,
                view,
                axisWidth,
                viewWidth,
                function() {
                    return head.find('tr.fc-all-day')
                },
                function(dayOfWeek) {
                    return axisWidth + colContentPositions.left(day2col(dayOfWeek));
                },
                function(dayOfWeek) {
                    return axisWidth + colContentPositions.right(day2col(dayOfWeek));
                },
                daySegmentContainer,
                bindDaySegHandlers,
                modifiedEventId
            );
            setHeight(viewHeight); // might have pushed the body down, so resize
        }
    }
    
    
    
    // renders events in the 'time slots' at the bottom
    
    function renderSlotSegs(segs, modifiedEventId) {
    
        var i, segCnt=segs.length, seg,
            event,
            className,
            top, bottom,
            colI, levelI, forward,
            leftmost,
            availWidth,
            outerWidth,
            left,
            html='',
            eventElements,
            eventElement,
            triggerRes,
            vsideCache={},
            hsideCache={},
            key, val,
            titleSpan,
            height;
            
        // calculate position/dimensions, create html
        for (i=0; i<segCnt; i++) {
            seg = segs[i];
            event = seg.event;
            className = 'fc-event fc-event-vert ';
            if (seg.isStart) {
                className += 'fc-corner-top ';
            }
            if (seg.isEnd) {
                className += 'fc-corner-bottom ';
            }
            top = timePosition(seg.start, seg.start);
            bottom = timePosition(seg.start, seg.end);
            colI = seg.col;
            levelI = seg.level;
            forward = seg.forward || 0;
            leftmost = axisWidth + colContentPositions.left(colI*dis + dit);
            availWidth = axisWidth + colContentPositions.right(colI*dis + dit) - leftmost;
            availWidth = Math.min(availWidth-6, availWidth*.95); // TODO: move this to CSS
            if (levelI) {
                // indented and thin
                outerWidth = availWidth / (levelI + forward + 1);
            }else{
                if (forward) {
                    // moderately wide, aligned left still
                    outerWidth = ((availWidth / (forward + 1)) - (12/2)) * 2; // 12 is the predicted width of resizer =
                }else{
                    // can be entire width, aligned left
                    outerWidth = availWidth;
                }
            }
            left = leftmost +                                  // leftmost possible
                (availWidth / (levelI + forward + 1) * levelI) // indentation
                * dis + (rtl ? availWidth - outerWidth : 0);   // rtl
            seg.top = top;
            seg.left = left;
            seg.outerWidth = outerWidth;
            seg.outerHeight = bottom - top;
            html +=
                "<div class='" + className + event.className.join(' ') + "' style='position:absolute;z-index:8;top:" + top + "px;left:" + left + "px'>" +
                    "<a" + (event.url ? " href='" + htmlEscape(event.url) + "'" : '') + ">" +
                        "<span class='fc-event-bg'></span>" +
                        "<span class='fc-event-time'>" + htmlEscape(formatDates(event.start, event.end, view.option('timeFormat'))) + "</span>" +
                        "<span class='fc-event-title'>" + htmlEscape(event.title) + "</span>" +
                    "</a>" +
                    ((event.editable || event.editable == undefined && options.editable) && !options.disableResizing && $.fn.resizable ?
                        "<div class='ui-resizable-handle ui-resizable-s'>=</div>"
                        : '') +
                "</div>";
        }
        slotSegmentContainer[0].innerHTML = html; // faster than html()
        eventElements = slotSegmentContainer.children();
        
        // retrieve elements, run through eventRender callback, bind event handlers
        for (i=0; i<segCnt; i++) {
            seg = segs[i];
            event = seg.event;
            eventElement = $(eventElements[i]); // faster than eq()
            triggerRes = view.trigger('eventRender', event, event, eventElement);
            if (triggerRes === false) {
                eventElement.remove();
            }else{
                if (triggerRes && triggerRes !== true) {
                    eventElement.remove();
                    eventElement = $(triggerRes)
                        .css({
                            position: 'absolute',
                            top: seg.top,
                            left: seg.left
                        })
                        .appendTo(slotSegmentContainer);
                }
                seg.element = eventElement;
                if (event._id === modifiedEventId) {
                    bindSlotSegHandlers(event, eventElement, seg);
                }else{
                    eventElement[0]._fci = i; // for lazySegBind
                }
                view.reportEventElement(event, eventElement);
            }
        }
        
        lazySegBind(slotSegmentContainer, segs, bindSlotSegHandlers);
        
        // record event sides and title positions
        for (i=0; i<segCnt; i++) {
            seg = segs[i];
            if (eventElement = seg.element) {
                val = vsideCache[key = seg.key = cssKey(eventElement[0])];
                seg.vsides = val == undefined ? (vsideCache[key] = vsides(eventElement[0], true)) : val;
                val = hsideCache[key];
                seg.hsides = val == undefined ? (hsideCache[key] = hsides(eventElement[0], true)) : val;
                titleSpan = eventElement.find('span.fc-event-title');
                if (titleSpan.length) {
                    seg.titleTop = titleSpan[0].offsetTop;
                }
            }
        }
        
        // set all positions/dimensions at once
        for (i=0; i<segCnt; i++) {
            seg = segs[i];
            if (eventElement = seg.element) {
                eventElement[0].style.width = seg.outerWidth - seg.hsides + 'px';
                eventElement[0].style.height = (height = seg.outerHeight - seg.vsides) + 'px';
                event = seg.event;
                if (seg.titleTop != undefined && height - seg.titleTop < 10) {
                    // not enough room for title, put it in the time header
                    eventElement.find('span.fc-event-time')
                        .text(formatDate(event.start, view.option('timeFormat')) + ' - ' + event.title);
                    eventElement.find('span.fc-event-title')
                        .remove();
                }
                view.trigger('eventAfterRender', event, event, eventElement);
            }
        }
                    
    }
    
    
    
    
    
    function visEventEnd(event) { // returns exclusive 'visible' end, for rendering
        if (event.allDay) {
            if (event.end) {
                var end = cloneDate(event.end);
                return (event.allDay || end.getHours() || end.getMinutes()) ? addDays(end, 1) : end;
            }else{
                dataClone = cloneDate(event.start);
                return addDays(dataClone, 1);
            }
        }
        if (event.end) {
            return cloneDate(event.end);
        }else{
            return addMinutes(cloneDate(event.start), options.defaultEventMinutes);
        }
    }
    
    
    
    function bindDaySegHandlers(event, eventElement, seg) {
        view.eventElementHandlers(event, eventElement);
        if (event.editable || event.editable == undefined && options.editable) {
            draggableDayEvent(event, eventElement, seg.isStart);
            if (seg.isEnd) {
                view.resizableDayEvent(event, eventElement, colWidth);
            }
        }
    }
    
    
    
    function bindSlotSegHandlers(event, eventElement, seg) {
        view.eventElementHandlers(event, eventElement);
        if (event.editable || event.editable == undefined && options.editable) {
            var timeElement = eventElement.find('span.fc-event-time');
            draggableSlotEvent(event, eventElement, timeElement);
            if (seg.isEnd) {
                resizableSlotEvent(event, eventElement, timeElement);
            }
        }
    }

    
    
    
    /* Event Dragging
    -----------------------------------------------------------------------------*/
    
    
    
    // when event starts out FULL-DAY
    
    function draggableDayEvent(event, eventElement, isStart) {
        if (!options.disableDragging && eventElement.draggable) {
            var origPosition, origWidth,
                resetElement,
                allDay=true,
                matrix;
            eventElement.draggable({
                zIndex: 9,
                opacity: view.option('dragOpacity', 'month'), // use whatever the month view was using
                revertDuration: options.dragRevertDuration,
                start: function(ev, ui) {
                    view.hideEvents(event, eventElement);
                    view.trigger('eventDragStart', eventElement, event, ev, ui);
                    origPosition = eventElement.position();
                    origWidth = eventElement.width();
                    resetElement = function() {
                        if (!allDay) {
                            eventElement
                                .width(origWidth)
                                .height('')
                                .draggable('option', 'grid', null);
                            allDay = true;
                        }
                    };
                    matrix = new HoverMatrix(function(cell) {
                        eventElement.draggable('option', 'revert', !cell || !cell.rowDelta && !cell.colDelta);
                        if (cell) {
                            if (!cell.row) { // on full-days
                                resetElement();
                                view.showOverlay(cell);
                            }else{ // mouse is over bottom slots
                                if (isStart && allDay) {
                                    // convert event to temporary slot-event
                                    setOuterHeight(
                                        eventElement.width(colWidth - 10), // don't use entire width
                                        slotHeight * Math.round(
                                            (event.end ? ((event.end - event.start)/MINUTE_MS) : options.defaultEventMinutes)
                                            /options.slotMinutes)
                                    );
                                    eventElement.draggable('option', 'grid', [colWidth, 1]);
                                    allDay = false;
                                }
                                view.hideOverlay();
                            }
                        }else{ // mouse is outside of everything
                            view.hideOverlay();
                        }
                    });
                    matrix.row(head.find('td'));
                    bg.find('td').each(function() {
                        matrix.col(this);
                    });
                    matrix.row(body);
                    matrix.mouse(ev.pageX, ev.pageY);
                },
                drag: function(ev, ui) {
                    matrix.mouse(ev.pageX, ev.pageY);
                },
                stop: function(ev, ui) {
                    view.hideOverlay();
                    view.trigger('eventDragStop', eventElement, event, ev, ui);
                    var cell = matrix.cell,
                        dayDelta = dis * (
                            allDay ? // can't trust cell.colDelta when using slot grid
                            (cell ? cell.colDelta : 0) :
                            Math.floor((ui.position.left - origPosition.left) / colWidth)
                        );
                    if (!cell || !dayDelta && !cell.rowDelta) {
                        // over nothing (has reverted)
                        resetElement();
                        if ($.browser.msie) {
                            eventElement.css('filter', ''); // clear IE opacity side-effects
                        }
                        view.showEvents(event, eventElement);
                    }else{
                        eventElement.find('a').removeAttr('href'); // prevents safari from visiting the link
                        view.eventDrop(
                            this, event, dayDelta,
                            allDay ? 0 : // minute delta
                                Math.round((eventElement.offset().top - bodyContent.offset().top) / slotHeight)
                                * options.slotMinutes
                                + minMinute
                                - (event.start.getHours() * 60 + event.start.getMinutes()),
                            allDay, ev, ui
                        );
                    }
                }
            });
        }
    }
    
    
    
    // when event starts out IN TIMESLOTS
    
    function draggableSlotEvent(event, eventElement, timeElement) {
        if (!options.disableDragging && eventElement.draggable) {
            var origPosition,
                resetElement,
                prevSlotDelta, slotDelta,
                allDay=false,
                matrix;
            eventElement.draggable({
                zIndex: 9,
                scroll: false,
                grid: [colWidth, slotHeight],
                axis: colCnt==1 ? 'y' : false,
                opacity: view.option('dragOpacity'),
                revertDuration: options.dragRevertDuration,
                start: function(ev, ui) {
                    view.hideEvents(event, eventElement);
                    view.trigger('eventDragStart', eventElement, event, ev, ui);
                    if ($.browser.msie) {
                        eventElement.find('span.fc-event-bg').hide(); // nested opacities mess up in IE, just hide
                    }
                    origPosition = eventElement.position();
                    resetElement = function() {
                        // convert back to original slot-event
                        if (allDay) {
                            timeElement.css('display', ''); // show() was causing display=inline
                            eventElement.draggable('option', 'grid', [colWidth, slotHeight]);
                            allDay = false;
                        }
                    };
                    prevSlotDelta = 0;
                    matrix = new HoverMatrix(function(cell) {
                        eventElement.draggable('option', 'revert', !cell);
                        if (cell) {
                            if (!cell.row && options.allDaySlot) { // over full days
                                if (!allDay) {
                                    // convert to temporary all-day event
                                    allDay = true;
                                    timeElement.hide();
                                    eventElement.draggable('option', 'grid', null);
                                }
                                view.showOverlay(cell);
                            }else{ // on slots
                                resetElement();
                                view.hideOverlay();
                            }
                        }else{
                            view.hideOverlay();
                        }
                    });
                    if (options.allDaySlot) {
                        matrix.row(head.find('td'));
                    }
                    bg.find('td').each(function() {
                        matrix.col(this);
                    });
                    matrix.row(body);
                    matrix.mouse(ev.pageX, ev.pageY);
                },
                drag: function(ev, ui) {
                    slotDelta = Math.round((ui.position.top - origPosition.top) / slotHeight);
                    if (slotDelta != prevSlotDelta) {
                        if (!allDay) {
                            // update time header
                            var minuteDelta = slotDelta*options.slotMinutes,
                                newStart = addMinutes(cloneDate(event.start), minuteDelta),
                                newEnd;
                            if (event.end) {
                                newEnd = addMinutes(cloneDate(event.end), minuteDelta);
                            }
                            timeElement.text(formatDates(newStart, newEnd, view.option('timeFormat')));
                        }
                        prevSlotDelta = slotDelta;
                    }
                    matrix.mouse(ev.pageX, ev.pageY);
                },
                stop: function(ev, ui) {
                    view.hideOverlay();
                    view.trigger('eventDragStop', eventElement, event, ev, ui);
                    var cell = matrix.cell,
                        dayDelta = dis * (
                            allDay ? // can't trust cell.colDelta when using slot grid
                            (cell ? cell.colDelta : 0) : 
                            Math.floor((ui.position.left - origPosition.left) / colWidth)
                        );
                    if (!cell || !slotDelta && !dayDelta) {
                        resetElement();
                        if ($.browser.msie) {
                            eventElement
                                .css('filter', '') // clear IE opacity side-effects
                                .find('span.fc-event-bg').css('display', ''); // .show() made display=inline
                        }
                        eventElement.css(origPosition); // sometimes fast drags make event revert to wrong position
                        view.showEvents(event, eventElement);
                    }else{
                        view.eventDrop(
                            this, event, dayDelta,
                            allDay ? 0 : slotDelta * options.slotMinutes, // minute delta
                            allDay, ev, ui
                        );
                    }
                }
            });
        }
    }
    
    
    
    
    /* Event Resizing
    -----------------------------------------------------------------------------*/
    
    // for TIMESLOT events

    function resizableSlotEvent(event, eventElement, timeElement) {
        if (!options.disableResizing && eventElement.resizable) {
            var slotDelta, prevSlotDelta;
            eventElement.resizable({
                handles: {
                    s: 'div.ui-resizable-s'
                },
                grid: slotHeight,
                start: function(ev, ui) {
                    slotDelta = prevSlotDelta = 0;
                    view.hideEvents(event, eventElement);
                    if ($.browser.msie && $.browser.version == '6.0') {
                        eventElement.css('overflow', 'hidden');
                    }
                    eventElement.css('z-index', 9);
                    view.trigger('eventResizeStart', this, event, ev, ui);
                },
                resize: function(ev, ui) {
                    // don't rely on ui.size.height, doesn't take grid into account
                    slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight);
                    if (slotDelta != prevSlotDelta) {
                        timeElement.text(
                            formatDates(
                                event.start,
                                (!slotDelta && !event.end) ? null : // no change, so don't display time range
                                    addMinutes(view.eventEnd(event), options.slotMinutes*slotDelta),
                                view.option('timeFormat')
                            )
                        );
                        prevSlotDelta = slotDelta;
                    }
                },
                stop: function(ev, ui) {
                    view.trigger('eventResizeStop', this, event, ev, ui);
                    if (slotDelta) {
                        view.eventResize(this, event, 0, options.slotMinutes*slotDelta, ev, ui);
                    }else{
                        eventElement.css('z-index', 8);
                        view.showEvents(event, eventElement);
                        // BUG: if event was really short, need to put title back in span
                    }
                }
            });
        }
    }
    
    
    
    
    /* Misc
    -----------------------------------------------------------------------------*/
    
    // get the Y coordinate of the given time on the given day (both Date objects)
    
    function timePosition(day, time) { // both date objects. day holds 00:00 of current day
        day = cloneDate(day, true);
        if (time < addMinutes(cloneDate(day), minMinute)) {
            return 0;
        }
        if (time >= addMinutes(cloneDate(day), maxMinute)) {
            return bodyContent.height();
        }
        var slotMinutes = options.slotMinutes,
            minutes = time.getHours()*60 + time.getMinutes() - minMinute,
            slotI = Math.floor(minutes / slotMinutes),
            slotTop = slotTopCache[slotI];
        if (slotTop == undefined) {
            slotTop = slotTopCache[slotI] = body.find('tr:eq(' + slotI + ') td div')[0].offsetTop;
        }
        return Math.max(0, Math.round(
            slotTop - 1 + slotHeight * ((minutes % slotMinutes) / slotMinutes)
        ));
    }
    
    
    
    
    function day2col(dayOfWeek) {
        return ((dayOfWeek - Math.max(firstDay,nwe)+colCnt) % colCnt)*dis+dit;
    }
    

}


// count the number of colliding, higher-level segments (for event squishing)

function countForwardSegs(levels) {
    var i, j, k, level, segForward, segBack;
    for (i=levels.length-1; i>0; i--) {
        level = levels[i];
        for (j=0; j<level.length; j++) {
            segForward = level[j];
            for (k=0; k<levels[i-1].length; k++) {
                segBack = levels[i-1][k];
                if (segsCollide(segForward, segBack)) {
                    segBack.forward = Math.max(segBack.forward||0, (segForward.forward||0)+1);
                }
            }
        }
    }
}


/* Methods & Utilities for All Views
-----------------------------------------------------------------------------*/

var viewMethods = {

    // TODO: maybe change the 'vis' variables to 'excl'

    /*
     * Objects inheriting these methods must implement the following properties/methods:
     * - title
     * - start
     * - end
     * - visStart
     * - visEnd
     * - defaultEventEnd(event)
     * - render(events)
     * - rerenderEvents()
     *
     *
     * z-index reservations:
     * 3 - day-overlay
     * 8 - events
     * 9 - dragging/resizing events
     *
     */
    
    

    init: function(element, options) {
        this.element = element;
        this.options = options;
        this.eventsByID = {};
        this.eventElements = [];
        this.eventElementsByID = {};
    },
    
    
    
    // triggers an event handler, always append view as last arg
    
    trigger: function(name, thisObj) {
        if (this.options[name]) {
            return this.options[name].apply(thisObj || this, Array.prototype.slice.call(arguments, 2).concat([this]));
        }
    },
    
    
    
    // returns a Date object for an event's end
    
    eventEnd: function(event) {
        return event.end ? cloneDate(event.end) : this.defaultEventEnd(event); // TODO: make sure always using copies
    },
    
    
    
    // report when view receives new events
    
    reportEvents: function(events) { 
         // events are already normalized at this point
        hoje = events[0].hoje;
        events = events[0].capitulos;
        var i, len=events.length, event,
            eventsByID = this.eventsByID = {};
        
        for (i=0; i<len; i++) {
            event = events[i];            
            if (eventsByID[event.id]) {
                eventsByID[event.id].push(event);
            }else{
                eventsByID[event.id] = [event];
            }
        }
    },
    
    
    
    // report when view creates an element for an event

    reportEventElement: function(event, element) {
        this.eventElements.push(element);
        var eventElementsByID = this.eventElementsByID;
        if (eventElementsByID[event._id]) {
            eventElementsByID[event._id].push(element);
        }else{
            eventElementsByID[event._id] = [element];
        }
    },
    
    
    
    // event element manipulation
    
    _clearEvents: function() { // only resets hashes
        this.eventElements = [];
        this.eventElementsByID = {};
    },
    
    showEvents: function(event, exceptElement) {
        this._eee(event, exceptElement, 'show');
    },
    
    hideEvents: function(event, exceptElement) {
        this._eee(event, exceptElement, 'hide');
    },
    
    _eee: function(event, exceptElement, funcName) { // event-element-each
        var elements = this.eventElementsByID[event._id],
            i, len = elements.length;
        for (i=0; i<len; i++) {
            if (elements[i][0] != exceptElement[0]) { // AHAHAHAHAHAHAHAH
                elements[i][funcName]();
            }
        }
    },
    
    
    
    // event modification reporting
    
    eventDrop: function(e, event, dayDelta, minuteDelta, allDay, ev, ui) {
        var view = this,
            oldAllDay = event.allDay,
            eventId = event._id;
        view.moveEvents(view.eventsByID[eventId], dayDelta, minuteDelta, allDay);
        view.trigger('eventDrop', e, event, dayDelta, minuteDelta, allDay, function() { // TODO: change docs
            // TODO: investigate cases where this inverse technique might not work
            view.moveEvents(view.eventsByID[eventId], -dayDelta, -minuteDelta, oldAllDay);
            view.rerenderEvents();
        }, ev, ui);
        view.eventsChanged = true;
        view.rerenderEvents(eventId);
    },
    
    eventResize: function(e, event, dayDelta, minuteDelta, ev, ui) {
        var view = this,
            eventId = event._id;
        view.elongateEvents(view.eventsByID[eventId], dayDelta, minuteDelta);
        view.trigger('eventResize', e, event, dayDelta, minuteDelta, function() {
            // TODO: investigate cases where this inverse technique might not work
            view.elongateEvents(view.eventsByID[eventId], -dayDelta, -minuteDelta);
            view.rerenderEvents();
        }, ev, ui);
        view.eventsChanged = true;
        view.rerenderEvents(eventId);
    },
    
    
    
    // event modification
    
    moveEvents: function(events, dayDelta, minuteDelta, allDay) {
        minuteDelta = minuteDelta || 0;
        for (var e, len=events.length, i=0; i<len; i++) {
            e = events[i];
            if (allDay != undefined) {
                e.allDay = allDay;
            }
            addMinutes(addDays(e.start, dayDelta, true), minuteDelta);
            if (e.end) {
                e.end = addMinutes(addDays(e.end, dayDelta, true), minuteDelta);
            }
            normalizeEvent(e, this.options);
        }
    },
    
    elongateEvents: function(events, dayDelta, minuteDelta) {
        minuteDelta = minuteDelta || 0;
        for (var e, len=events.length, i=0; i<len; i++) {
            e = events[i];
            e.end = addMinutes(addDays(this.eventEnd(e), dayDelta, true), minuteDelta);
            normalizeEvent(e, this.options);
        }
    },
    
    
    
    // semi-transparent overlay (while dragging)
    
    showOverlay: function(props) {
        if (!this.dayOverlay) {
            this.dayOverlay = $("<div class='fc-cell-overlay' style='position:absolute;z-index:3;display:none'/>")
                .appendTo(this.element);
        }
        var o = this.element.offset();
        this.dayOverlay
            .css({
                top: props.top - o.top,
                left: props.left - o.left,
                width: props.width,
                height: props.height
            })
            .show();
    },
    
    hideOverlay: function() {
        if (this.dayOverlay) {
            this.dayOverlay.hide();
        }
    },
    
    
    
    // common horizontal event resizing

    resizableDayEvent: function(event, eventElement, colWidth) {
        var view = this;
        if (!view.options.disableResizing && eventElement.resizable) {
            eventElement.resizable({
                handles: view.options.isRTL ? {w:'div.ui-resizable-w'} : {e:'div.ui-resizable-e'},
                grid: colWidth,
                minWidth: colWidth/2, // need this or else IE throws errors when too small
                containment: view.element.parent().parent(), // the main element...
                             // ... a fix. wouldn't allow extending to last column in agenda views (jq ui bug?)
                start: function(ev, ui) {
                    eventElement.css('z-index', 9);
                    view.hideEvents(event, eventElement);
                    view.trigger('eventResizeStart', this, event, ev, ui);
                },
                stop: function(ev, ui) {
                    view.trigger('eventResizeStop', this, event, ev, ui);
                    // ui.size.width wasn't working with grid correctly, use .width()
                    var dayDelta = Math.round((eventElement.width() - ui.originalSize.width) / colWidth);
                    if (dayDelta) {
                        view.eventResize(this, event, dayDelta, 0, ev, ui);
                    }else{
                        eventElement.css('z-index', 8);
                        view.showEvents(event, eventElement);
                    }
                }
            });
        }
    },
    
    
    
    // attaches eventClick, eventMouseover, eventMouseout
    
    eventElementHandlers: function(event, eventElement) {
        var view = this;
        eventElement
            .click(function(ev) {
                if (!eventElement.hasClass('ui-draggable-dragging') &&
                    !eventElement.hasClass('ui-resizable-resizing')) {
                        return view.trigger('eventClick', this, event, ev);
                    }
            })
            .hover(
                function(ev) {
                    view.trigger('eventMouseover', this, event, ev);
                },
                function(ev) {
                    view.trigger('eventMouseout', this, event, ev);
                }
            );
    },
    
    
    
    // get a property from the 'options' object, using smart view naming
    
    option: function(name, viewName) {
        var v = this.options[name];
        if (typeof v == 'object') {
            return smartProperty(v, viewName || this.name);
        }
        return v;
    },
    
    
    
    // event rendering utilities
    
    sliceSegs: function(events, visEventEnds, start, end) {
        var segs = [],
            i, len=events.length, event,
            eventStart, eventEnd,
            segStart, segEnd,
            isStart, isEnd;
        for (i=0; i<len; i++) {
            event = events[i];
            eventStart = new Date(event.start);
            eventEnd = visEventEnds[i];
            if (eventEnd > start && eventStart < end) {
                if (eventStart < start) {
                    segStart = cloneDate(start);
                    isStart = false;
                }else{
                    segStart = eventStart;
                    isStart = true;
                }
                if (eventEnd > end) {
                    segEnd = cloneDate(end);
                    isEnd = false;
                }else{
                    segEnd = eventEnd;
                    isEnd = true;
                }
                segs.push({
                    event: event,
                    start: segStart,
                    end: segEnd,
                    isStart: isStart,
                    isEnd: isEnd,
                    msLength: segEnd - segStart
                });
            }
        } 
        return segs.sort(segCmp);
    }
    

};



function lazySegBind(container, segs, bindHandlers) {
    container.unbind('mouseover').mouseover(function(ev) {
        var parent=ev.target, e,
            i, seg;
        while (parent != this) {
            e = parent;
            parent = parent.parentNode;
        }
        if ((i = e._fci) != undefined) {
            e._fci = undefined;
            seg = segs[i];
            bindHandlers(seg.event, seg.element, seg);
            $(ev.target).trigger(ev);
        }
        ev.stopPropagation();
    });
}



// event rendering calculation utilities

function stackSegs(segs) {
    var levels = [],
        i, len = segs.length, seg,
        j, collide, k;
    for (i=0; i<len; i++) {
        seg = segs[i];
        j = 0; // the level index where seg should belong
        while (true) {
            collide = false;
            if (levels[j]) {
                for (k=0; k<levels[j].length; k++) {
                    if (segsCollide(levels[j][k], seg)) {
                        collide = true;
                        break;
                    }
                }
            }
            if (collide) {
                j++;
            }else{
                break;
            }
        }
        if (levels[j]) {
            levels[j].push(seg);
        }else{
            levels[j] = [seg];
        }
    }
    return levels;
}

function segCmp(a, b) {
    return  (b.msLength - a.msLength) * 100 + (new Date(a.event.start) - new Date(b.event.start));
}

function segsCollide(seg1, seg2) {
    return seg1.end > seg2.start && seg1.start < seg2.end;
}




/* Date Math
-----------------------------------------------------------------------------*/

var DAY_MS = 86400000,
    HOUR_MS = 3600000,
    MINUTE_MS = 60000;

function addYears(d, n, keepTime) {
    d.setFullYear(d.getFullYear() + n);
    if (!keepTime) {
        clearTime(d);
    }
    return d;
}

function addMonths(d, n, keepTime) { // prevents day overflow/underflow
    if (+d) { // prevent infinite looping on invalid dates
        var m = d.getMonth() + n,
            check = cloneDate(d);
        check.setDate(1);
        check.setMonth(m);
        d.setMonth(m);
        if (!keepTime) {
            clearTime(d);
        }
        while (d.getMonth() != check.getMonth()) {
            d.setDate(d.getDate() + (d < check ? 1 : -1));
        }
    }
    return d;
}

function addDays(d, n, keepTime) { // deals with daylight savings
    if (+d) {
        var dd = d.getDate() + n,
            check = cloneDate(d);
        check.setHours(9); // set to middle of day
        check.setDate(dd);
        d.setDate(dd);
        if (!keepTime) {
            clearTime(d);
        }
        fixDate(d, check);
    }
    return d;
}
fc.addDays = addDays;

function fixDate(d, check) { // force d to be on check's YMD, for daylight savings purposes
    if (+d) { // prevent infinite looping on invalid dates
        while (d.getDate() != check.getDate()) {
            d.setTime(+d + (d < check ? 1 : -1) * HOUR_MS);
        }
    }
}

function addMinutes(d, n) {
    d.setMinutes(d.getMinutes() + n);
    return d;
}

function clearTime(d) {
    d.setHours(0);
    d.setMinutes(0);
    d.setSeconds(0); 
    d.setMilliseconds(0);
    return d;
}

function cloneDate(d, dontKeepTime) {
    if (dontKeepTime) {
        return clearTime(new Date(+d));
    }
    dRetorno = new Date(d);
    dMRetorno = +dRetorno;
    dataRetorno = new Date(dMRetorno);
    return dataRetorno;
}

function zeroDate() { // returns a Date with time 00:00:00 and dateOfMonth=1
    var i=0, d;
    do {
        d = new Date(1970, i++, 1);
    } while (d.getHours() != 0);
    return d;
}

function skipWeekend(date, inc, excl) {
    inc = inc || 1;
    while (date.getDay()==0 || (excl && date.getDay()==1)) {
        addDays(date, inc);
    }
    return date;
}



/* Date Parsing
-----------------------------------------------------------------------------*/

var parseDate = fc.parseDate = function(s) {
    if (typeof s == 'object') { // already a Date object
        return s;
    }
    if (typeof s == 'number') { // a UNIX timestamp
        return new Date(s * 1000);
    }
    if (typeof s == 'string') {
        if (s.match(/^\d+$/)) { // a UNIX timestamp
            return new Date(parseInt(s) * 1000);
        }
        return parseISO8601(s, true) || (s ? new Date(s) : null);
    }
    // TODO: never return invalid dates (like from new Date(<string>)), return null instead
    return null;
}

var parseISO8601 = fc.parseISO8601 = function(s, ignoreTimezone) {
    // derived from http://delete.me.uk/2005/03/iso8601.html
    // TODO: for a know glitch/feature, read tests/issue_206_parseDate_dst.html
    var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?$/);
    if (!m) {
        return null;
    }
    var date = new Date(m[1], 0, 1),
        check = new Date(m[1], 0, 1, 9, 0),
        offset = 0;
    if (m[3]) {
        date.setMonth(m[3] - 1);
        check.setMonth(m[3] - 1);
    }
    if (m[5]) {
        date.setDate(m[5]);
        check.setDate(m[5]);
    }
    fixDate(date, check);
    if (m[7]) {
        date.setHours(m[7]);
    }
    if (m[8]) {
        date.setMinutes(m[8]);
    }
    if (m[10]) {
        date.setSeconds(m[10]);
    }
    if (m[12]) {
        date.setMilliseconds(Number("0." + m[12]) * 1000);
    }
    fixDate(date, check);
    if (!ignoreTimezone) {
        if (m[14]) {
            offset = Number(m[16]) * 60 + Number(m[17]);
            offset *= m[15] == '-' ? 1 : -1;
        }
        offset -= date.getTimezoneOffset();
    }
    return new Date(+date + (offset * 60 * 1000));
}

var parseTime = fc.parseTime = function(s) { // returns minutes since start of day
    if (typeof s == 'number') { // an hour
        return s * 60;
    }
    if (typeof s == 'object') { // a Date object
        return s.getHours() * 60 + s.getMinutes();
    }
    var m = s.match(/(\d+)(?::(\d+))?\s*(\w+)?/);
    if (m) {
        var h = parseInt(m[1]);
        if (m[3]) {
            h %= 12;
            if (m[3].toLowerCase().charAt(0) == 'p') {
                h += 12;
            }
        }
        return h * 60 + (m[2] ? parseInt(m[2]) : 0);
    }
};



/* Date Formatting
-----------------------------------------------------------------------------*/

var formatDate = fc.formatDate = function(date, format, options) {
    return formatDates(date, null, format, options);
}

var formatDates = fc.formatDates = function(date1, date2, format, options) {
    options = options || defaults;
    var date = date1,
        otherDate = date2,
        i, len = format.length, c,
        i2, formatter,
        res = '';
    for (i=0; i<len; i++) {
        c = format.charAt(i);
        if (c == "'") {
            for (i2=i+1; i2<len; i2++) {
                if (format.charAt(i2) == "'") {
                    if (date) {
                        if (i2 == i+1) {
                            res += "'";
                        }else{
                            res += format.substring(i+1, i2);
                        }
                        i = i2;
                    }
                    break;
                }
            }
        }
        else if (c == '(') {
            for (i2=i+1; i2<len; i2++) {
                if (format.charAt(i2) == ')') {
                    var subres = formatDate(date, format.substring(i+1, i2), options);
                    if (parseInt(subres.replace(/\D/, ''))) {
                        res += subres;
                    }
                    i = i2;
                    break;
                }
            }
        }
        else if (c == '[') {
            for (i2=i+1; i2<len; i2++) {
                if (format.charAt(i2) == ']') {
                    var subformat = format.substring(i+1, i2);
                    var subres = formatDate(date, subformat, options);
                    if (subres != formatDate(otherDate, subformat, options)) {
                        res += subres;
                    }
                    i = i2;
                    break;
                }
            }
        }
        else if (c == '{') {
            date = date2;
            otherDate = date1;
        }
        else if (c == '}') {
            date = date1;
            otherDate = date2;
        }
        else {
            for (i2=len; i2>i; i2--) {
                if (formatter = dateFormatters[format.substring(i, i2)]) {
                    if (date) {
                        res += formatter(date, options);
                    }
                    i = i2 - 1;
                    break;
                }
            }
            if (i2 == i) {
                if (date) {
                    res += c;
                }
            }
        }
    }
    return res;
}

var dateFormatters = {
    s    : function(d)    { return d.getSeconds() },
    ss    : function(d)    { return zeroPad(d.getSeconds()) },
    m    : function(d)    { return d.getMinutes() },
    mm    : function(d)    { return zeroPad(d.getMinutes()) },
    h    : function(d)    { return d.getHours() % 12 || 12 },
    hh    : function(d)    { return zeroPad(d.getHours() % 12 || 12) },
    H    : function(d)    { return d.getHours() },
    HH    : function(d)    { return zeroPad(d.getHours()) },
    d    : function(d)    { return d.getDate() },
    dd    : function(d)    { return zeroPad(d.getDate()) },
    ddd    : function(d,o)    { return o.dayNamesShort[d.getDay()] },
    dddd: function(d,o)    { return o.dayNames[d.getDay()] },
    M    : function(d)    { return d.getMonth() + 1 },
    MM    : function(d)    { return zeroPad(d.getMonth() + 1) },
    MMM    : function(d,o)    { return o.monthNamesShort[d.getMonth()] },
    MMMM: function(d,o)    { return o.monthNames[d.getMonth()] },
    yy    : function(d)    { return (d.getFullYear()+'').substring(2) },
    yyyy: function(d)    { return d.getFullYear() },
    t    : function(d)    { return d.getHours() < 12 ? 'a' : 'p' },
    tt    : function(d)    { return d.getHours() < 12 ? 'am' : 'pm' },
    T    : function(d)    { return d.getHours() < 12 ? 'A' : 'P' },
    TT    : function(d)    { return d.getHours() < 12 ? 'AM' : 'PM' },
    u    : function(d)    { return formatDate(d, "yyyy-MM-dd'T'HH:mm:ss'Z'") },
    S    : function(d)    {
        var date = d.getDate();
        if (date > 10 && date < 20) return 'th';
        return ['st', 'nd', 'rd'][date%10-1] || 'th';
    }
};



/* Element Dimensions
-----------------------------------------------------------------------------*/

function setOuterWidth(element, width, includeMargins) {
    element.each(function(i, _element) {
        _element.style.width = width - hsides(_element, includeMargins) + 'px';
    });
}

function setOuterHeight(element, height, includeMargins) {
    element.each(function(i, _element) {
        _element.style.height = height - vsides(_element, includeMargins) + 'px';
    });
}


function hsides(_element, includeMargins) {
    return (parseFloat(jQuery.curCSS(_element, 'paddingLeft', true)) || 0) +
           (parseFloat(jQuery.curCSS(_element, 'paddingRight', true)) || 0) +
           (parseFloat(jQuery.curCSS(_element, 'borderLeftWidth', true)) || 0) +
           (parseFloat(jQuery.curCSS(_element, 'borderRightWidth', true)) || 0) +
           (includeMargins ? hmargins(_element) : 0);
}

function hmargins(_element) {
    return (parseFloat(jQuery.curCSS(_element, 'marginLeft', true)) || 0) +
           (parseFloat(jQuery.curCSS(_element, 'marginRight', true)) || 0);
}

function vsides(_element, includeMargins) {
    return (parseFloat(jQuery.curCSS(_element, 'paddingTop', true)) || 0) +
           (parseFloat(jQuery.curCSS(_element, 'paddingBottom', true)) || 0) +
           (parseFloat(jQuery.curCSS(_element, 'borderTopWidth', true)) || 0) +
           (parseFloat(jQuery.curCSS(_element, 'borderBottomWidth', true)) || 0) +
           (includeMargins ? vmargins(_element) : 0);
}

function vmargins(_element) {
    return (parseFloat(jQuery.curCSS(_element, 'marginTop', true)) || 0) +
           (parseFloat(jQuery.curCSS(_element, 'marginBottom', true)) || 0);
}




function setMinHeight(element, h) {
    h = typeof h == 'number' ? h + 'px' : h;
    element[0].style.cssText += ';min-height:' + h + ';_height:' + h;
}



/* Position Calculation
-----------------------------------------------------------------------------*/
// nasty bugs in opera 9.25
// position()'s top returning incorrectly with TR/TD or elements within TD

var topBug;

function topCorrect(tr) { // tr/th/td or anything else
    if (topBug !== false) {
        var cell;
        if (tr.is('th,td')) {
            tr = (cell = tr).parent();
        }
        if (topBug == undefined && tr.is('tr')) {
            topBug = tr.position().top != tr.children().position().top;
        }
        if (topBug) {
            return tr.parent().position().top + (cell ? tr.position().top - cell.position().top : 0);
        }
    }
    return 0;
}



/* Hover Matrix
-----------------------------------------------------------------------------*/

function HoverMatrix(changeCallback) {

    var t=this,
        tops=[], lefts=[],
        prevRowE, prevColE,
        origRow, origCol,
        currRow, currCol;
    
    t.row = function(e) {
        prevRowE = $(e);
        tops.push(prevRowE.offset().top + topCorrect(prevRowE));
    };
    
    t.col = function(e) {
        prevColE = $(e);
        lefts.push(prevColE.offset().left);
    };

    t.mouse = function(x, y) {
        if (origRow == undefined) {
            tops.push(tops[tops.length-1] + prevRowE.outerHeight());
            lefts.push(lefts[lefts.length-1] + prevColE.outerWidth());
            currRow = currCol = -1;
        }
        var r, c;
        for (r=0; r<tops.length && y>=tops[r]; r++) ;
        for (c=0; c<lefts.length && x>=lefts[c]; c++) ;
        r = r >= tops.length ? -1 : r - 1;
        c = c >= lefts.length ? -1 : c - 1;
        if (r != currRow || c != currCol) {
            currRow = r;
            currCol = c;
            if (r == -1 || c == -1) {
                t.cell = null;
            }else{
                if (origRow == undefined) {
                    origRow = r;
                    origCol = c;
                }
                t.cell = {
                    row: r,
                    col: c,
                    top: tops[r],
                    left: lefts[c],
                    width: lefts[c+1] - lefts[c],
                    height: tops[r+1] - tops[r],
                    isOrig: r==origRow && c==origCol,
                    rowDelta: r-origRow,
                    colDelta: c-origCol
                };
            }
            changeCallback(t.cell);
        }
    };

}



/* Misc Utils
-----------------------------------------------------------------------------*/

var undefined,
    dayIDs = ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sab'],
    arrayPop = Array.prototype.pop;

function zeroPad(n) {
    return (n < 10 ? '0' : '') + n;
}

function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object
    if (obj[name] != undefined) {
        return obj[name];
    }
    var parts = name.split(/(?=[A-Z])/),
        i=parts.length-1, res;
    for (; i>=0; i--) {
        res = obj[parts[i].toLowerCase()];
        if (res != undefined) {
            return res;
        }
    }
    return obj[''];
}

function htmlEscape(s) {
    return s
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/'/g, '&#039;')
        .replace(/"/g, '&quot;')
}



function HorizontalPositionCache(getElement) {

    var t = this,
        elements = {},
        lefts = {},
        rights = {};
        
    function e(i) {
        return elements[i] =
            elements[i] || getElement(i);
    }
    
    t.left = function(i) {
        return lefts[i] =
            lefts[i] == undefined ? e(i).position().left : lefts[i];
    };
    
    t.right = function(i) {
        return rights[i] =
            rights[i] == undefined ? t.left(i) + e(i).width() : rights[i];
    };
    
    t.clear = function() {
        elements = {};
        lefts = {};
        rights = {};
    };
    
}



function cssKey(_element) {
    return _element.id + '/' + _element.className + '/' + _element.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig, '');
}




})(jQuery);
(function($){
         $.extend(
         	 $.fn,
             {
                submenuNovelas: function(options) {
                    var $submenuNovelas = $('.submenu-novelas');
                    var $conteudoSubmenu = $('#glb-submenu .submenu-novelas .conteudo-submenu');
                    var $itensMenu = $('.menu .menu-itens a');
                    var $ItemMarcador = $('.marcador-hover');
                    
                    var corMenu = $itensMenu.css('color');
                    var statusMenu = false;
                    var fadeOut = null;
                    var temMenuPersonagens = 0;
                    var temMenuCapitulos = 0;
                    var nomeNovela = jQuery.trim( $('.marca-produto').text() );
                    var isIE = null;
                    
                    // Return if not Internet Explorer
                    myBrowser = function(){
                        var userAgent = navigator.userAgent.toLowerCase();
                        
                        if( userAgent.indexOf("msie") != -1 ){
                            isIE = true;
                        }else{
                            isIE = false;
                            $('.conteudo-foto .overlay-foto').hide();
                        }
                    }
                           
				    changeMenu = function(){
                        $ItemMarcador.css('background-color', corMenu);
                        $submenuNovelas.find('.conteudo-central').css('border-top-color', corMenu);
                        $submenuNovelas.fadeTo(0, 0, function(){
                            $(this).show();
                        });
                        
                        // fade list personagem
                        $(".widget-slide-listagem li").hide();
                        
                        // call other methods
                        myBrowser();  
                        hoverMenu();
                        bindClickMenu();
                        mouseOverSubmenu();
                        resizeItemHover();
                        ativaBusca();
                        clearMenu();
				    }
                    
                    clearMenu = function(){
                        $submenuNovelas.fadeTo('fast', 0, function(){
                            $(this).hide();
                        });
                    }
                    
                    configCssBottom = function() {
                    	$('.menu .menu-itens li').each( function() {
                    		$(this).attr('css-bottom',$(this).children('a').next('.marcador-hover').css('bottom'));
                    	} );
                    }
                    
				    hoverMenu = function( elementoAnimado, quantidade ){                        
                        $('.menu .menu-itens li').mouseenter(function() {                                                                 
                            verticalAnimateSubmenu( $(this).children('a'), 0);
                        }).mouseleave(function() {
                        
                            var cssBottom = $(this).attr('css-bottom');
                            
                            if( !cssBottom ) return;
                            
                            var cssBottomPx = cssBottom.indexOf('px');
                            var cssBottomClean = parseInt( cssBottom.substr(0, cssBottomPx), 10);
                            
                            if( $(this).children('a').next('.marcador-hover').hasClass('ativo') ){
                                return false;
                            }else{
                                if( $(this).children('a').next('.marcador-hover').hasClass('pagina-ativa') ){
                                    verticalAnimateSubmenu( $(this).children('a'), -12 );
                                }else{
                                    verticalAnimateSubmenu( $(this).children('a'), cssBottomClean );
                                }
                            }
                            
                        });
				    }
				    
				    verticalAnimateSubmenu = function( elementoAnimado, quantidade ){
				        $(elementoAnimado).next('.marcador-hover').stop().animate({ "bottom": quantidade }, "fast", "easeOutQuad");
				    }
				    
				    bindClickMenu = function(){
				        $('.menu .menu-itens .navegavel, .marcador-hover').bind('click', function(){
				            
				            // Se ele clicar no elemento .NAVEGAVEL
				            if( $(this).hasClass('navegavel') ){
                                var itemSubmenu = $(this).attr('rel');
                                animateSubmenuFadeIn( $(this), itemSubmenu );
                            }
				            
				            // Se ele clicar no elemento .MARCADOR-HOVER
                            if( $(this).hasClass('marcador-hover') ){
                                var itemSubmenu = $(this).prev('a').attr('rel');
                                animateSubmenuFadeIn( $(this).prev('a'), itemSubmenu );
                            }
                            
                            // toggle submenu items
                            $('.item-submenu').stop().animate({ opacity: '0' }, 300, "easeInQuad", function(){                             
                                if( itemSubmenu == 'capitulos' ){
                                    $('.conteudo-personagens').hide();
                                    $('.conteudo-'+itemSubmenu).show();
                                }else if( itemSubmenu == 'personagens' ){
                                    $('.conteudo-capitulos').hide();
                                    $('.conteudo-'+itemSubmenu).show();
                                }
                                $('.conteudo-'+itemSubmenu).stop().animate({ opacity: '1' }, 300, "easeInQuad");
                            });
                            
                            return false;
                        });
				    }
				    
				    callSubmenuPersonagens = function(){
				        // Call jSon Personagens
                        $submenuNovelas.submenuNovelasPersonagens( temMenuPersonagens );
                        temMenuPersonagens = 1;
				        
				        // resize container for PERSONAGENS
                        $submenuNovelas.stop().animate({ "height": 375 }, "fast", "easeInQuad");
                        $conteudoSubmenu.stop().animate({ "height": 362 }, "fast", "easeInQuad");
                        $('.conteudo-central').stop().animate({ "height": 360 }, "fast", "easeOutQuad");
                        $conteudoSubmenu
                                        .children('.borda-lateral-esquerda, .borda-lateral-direita')
                                        .animate({ "height": 362 }, "fast", "easeInQuad");
				    }
				    
				    callSubmenuCapitulos = function(){
				        // resize container for CAPITULOS
                        $submenuNovelas.stop().animate({ "height": 550 }, "fast", "easeInQuad");
                        $conteudoSubmenu.stop().animate({ "height": 541 }, "fast", "easeOutQuad");
                        $('.conteudo-central').stop().animate({ "height": 539 }, "fast", "easeOutQuad");
                        $conteudoSubmenu
                                        .children('.borda-lateral-esquerda, .borda-lateral-direita')
                                        .animate({ "height": 541 }, "fast", "easeInQuad");
                        
                        var $path = jQuery.trim( $('.marca-produto').attr('href') );    
                        var url = $path + "menu/capitulos";              
                        
                        if(temMenuCapitulos === 0){
                            var corFundoEscuroMenu = $('.cor-fundo-escuro-menu').css('color');                      
                            $('#calendar').fullCalendar({
                                editable: false,
                                disableDragging:true,
                                header: {
                                    left: 'prev title next',
                                    center: ' ',
                                    right: ' '
                                },
                                eventMouseover: function(calEvent, jsEvent, view) {
                                
	                                if($(this).hasClass('conteudo-texto')){
	                                	$(this).find('.fc-event-title').text('veja o resumo'); 
	                                }
                                    
                                    $(this).find('.fc-event-day').removeClass('fc-event-day').addClass('fc-event-day-over');
                                    $(this).find('.fc-event-hoje').removeClass('fc-event-hoje').addClass('fc-event-hoje-over');      
                                    
                                    var dataFormatada = formataDataHeader(calEvent.start);
                                    $('.capitulo-dados .data-capitulo').text(dataFormatada);
                                    $('.capitulo-dados .titulo-capitulo').text(calEvent.titulo); 
                                    
                                    // Mouse Out no elemento com video
                                    if( $('.fc-view > div').children('.fc-event').hasClass('conteudo-foto') ){
                                      if( isIE == true ){
                                          $(this).find('.overlay-foto').hide();
                                      }else{
                                          $(this).find('img').stop().animate({ 'opacity':'1' }, 'normal', 'easeOutQuad');
                                      }
                                    }
                                    
                                    // Mouse Out no elemento com evento e sem video
                                    if( $(this).hasClass('conteudo-texto') ){
                                        if( isIE == true ){
                                            $(this).css('background',corMenu);
                                        }else{
                                           $(this).stop().animate({ 'backgroundColor':corMenu }, 'normal', 'easeOutQuad');
                                        }
                                    }
                                },  
                                eventMouseout: function(calEvent, jsEvent, view) {
                                    if($('.fc-view div').children('div.fc-event').hasClass('capitulo-hoje')){
                                        var tituloHoje = $('.capitulo-hoje .fc-event-titulo').text();
                                        var dataHoje = $('.capitulo-hoje .fc-event-data').text();
                                        dataHoje = formataDataHeader(dataHoje); 
                                        
                                        $('.capitulo-dados .data-capitulo').text(dataHoje);
                                        $('.capitulo-dados .titulo-capitulo').text(tituloHoje);
                                    }else{
                                        
                                        $('.capitulo-dados .data-capitulo').text('');
                                        $('.capitulo-dados .titulo-capitulo').text('');
                                    }
                                    
                                    // Mouse Out no elemento com video
                                    if( $('.fc-view > div').children('.fc-event').hasClass('conteudo-foto') ){
                                        if( isIE == true ){
                                            $(this).find('.overlay-foto').show();
                                        }else{
                                           $(this).find('img').stop().animate({ 'opacity':'0.1' }, 'normal', 'easeOutQuad');
                                        }
                                    }
                                    
                                    // Mouse Out no elemento com evento e sem video
                                    if( $(this).hasClass('conteudo-texto') ){
                                        if( isIE == true ){
                                            $(this).css('background',corFundoEscuroMenu);
                                        }else{
                                           $(this).stop().animate({ 'backgroundColor':corFundoEscuroMenu }, 'normal', 'easeOutQuad');
                                        }
                                    }
                                    
                                    $(this).find('.fc-event-title').text('');
                                    $(this).find('.fc-event-day-over').removeClass('fc-event-day-over').addClass('fc-event-day'); 
                                    $(this).find('.fc-event-hoje-over').removeClass('fc-event-hoje-over').addClass('fc-event-hoje');
                                    
                                },            
                                weekends:false,                                    
                                events: url,
                                height: 490,
                                contentHeight: 447
                            });  
                        }

                        temMenuCapitulos = 1;
                        
                        // Start Font Cufon on Month for Calendar
                        fonteCufonMesCapitulo();
				    }
				    
				    // Menu Items
				    activeItem = function( elementoClicado, itemSubmenu ){
				        $('.marcador-hover').removeClass("ativo");
				        $(elementoClicado).next('.marcador-hover').toggleClass("ativo");
				        $('.marcador-hover').not( $(elementoClicado).next('.marcador-hover')).stop().animate({ "bottom":"-15px" }, "fast", "easeOutQuad");
				        $(elementoClicado).next('.marcador-hover').animate({ "bottom":"0px" }, "fast", "easeOutQuad");
				        
				        // PERSONAGENS
                        if( itemSubmenu == "personagens"){
                            callSubmenuPersonagens();
                        }
                        // CAPITULOS
                        if( itemSubmenu == "capitulos"){
                             window.setTimeout( 'callSubmenuCapitulos()', 500);
                        }
                        
				    }

				    animateSubmenuFadeIn = function( elementoClicado, itemSubmenu ){
				        
				        // if menu hide
				        if( statusMenu == false ){
			                $.scrollTo( '.menu', 500, function(){
			                    $submenuNovelas.show();
		                        $submenuNovelas.stop().animate({ "opacity": 1 }, "fast", "easeInQuad", function(){
		                            activeItem( elementoClicado, itemSubmenu );
		                        });
    				        });
                            statusMenu = true;
				        }else{
				            if( $(elementoClicado).next('.marcador-hover').hasClass('ativo') ){
    				            animateSubmenuFadeOut();
				            }else{
				                activeItem( elementoClicado, itemSubmenu );
				            }
				        }
				        
				    }
				    animateSubmenuFadeOut = function( elementoClicado ){
				        $submenuNovelas.stop().animate({ "opacity": 0 }, "fast", "easeInQuad", function(){
				            $(this).hide();
				        });
				        activeItem( elementoClicado );
				        statusMenu = false;
				    }
				    
				    mouseOverSubmenu = function(){
				        /*$submenuNovelas.mouseenter(function(){
				            clearTimeout(fadeOut);
				        }).mouseleave(function(){
				            fadeOut = window.setTimeout( "animateSubmenuFadeOut()", 100000000000000);
				        })*/
				        
				        $('#glb-topo, #glb-corpo').live('click', function(){
				            animateSubmenuFadeOut();
				        })
				    }
				    
				    resizeItemHover = function(){
				        var $objResize = $('.menu ul.menu-novela li');
				        var liSize = 0;
				        jQuery.each($objResize, function(i) {
                            liAtual = $objResize[i];
                            liSize = $(liAtual).children('.fonte-cufon').width() + 8;
                            $(liAtual).children('.marcador-hover').css('width', liSize  );
                        });
				    }
                    
                    formataDataHeader = function(dataEvento){
                        var nData = new Date(dataEvento);
                        var dSemana = ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"];  
                        var dia = nData.getDate();
                        var diaSemana =  dSemana[nData.getDay()];  
                        var dataFormatada = diaSemana + " " + dia;
                        return dataFormatada ;                     
                    }
                    
                    fonteCufonMesCapitulo = function() {
                        try {
                            // Starting 1st time Font Cufon
                            Cufon.replace('.fc-header-title', { fontFamily: 'VAGRounded Lt' });
                        
                            // Bind Font Cufon on click
                            $('.fc-button-prev').live('click', function(){
                                Cufon.replace('.fc-header-title', { fontFamily: 'VAGRounded Lt' });
                            });
                            $('.fc-button-next').live('click', function(){
                                Cufon.replace('.fc-header-title', { fontFamily: 'VAGRounded Lt' });
                            });
                        } catch (error) {};
                    }
                    
                    // Ativa a busca
                    ativaBusca = function(){
                        $('.menu-novela').css('z-index','0');
                        $('.campo-busca').css('z-index','-1');

                        $('.item-busca').bind('click', function(){
                            // Close submenu layer
                            animateSubmenuFadeOut();
                            $('.campo-busca').show();
                		    $('.menu-novela').fadeTo(500,'0', function(){
                		        $(this).hide().css('z-index','-1');
                		    });
                		    $('.campo-busca').fadeTo(500,'1', function(){
                		        $(this).css('z-index','1');
                		    });
                		    return false;
                	    })
                	    $('.campo-busca a').bind('click', function(){
                		    $('.menu-novela').show();
                		    $('.menu-novela').fadeTo(500,'1', function(){
                		        $(this).css('z-index','1');
                		    })
                		    $('.campo-busca').fadeTo(500,'0', function(){
                		        $(this).hide().css('z-index','-1');
                		    });
                		    return false;
                	    })
                    };
                    
                	$(".campo-busca input").bind("focus", function(event) {
                		$('.campo-busca label').css('background-position','-90px 0');
                	});

                	$(".campo-busca input").bind("blur", function(event) {
                		$('.campo-busca label').css('background-position','0 0');
                	});	

                    // Menu Items
                    marcaMenu = function(){
                        var pagina = $('.cabecalho-titulo').attr('rel');
                        var elementoPagina = $('a.'+pagina);
                        $(elementoPagina).next('.marcador-hover').addClass('pagina-ativa');
                        if( $('.pagina-ativa').prev('a').attr('rel') == 'capitulos'  ||  $('.pagina-ativa').prev('a').attr('rel') == 'personagens' ){
                            $('.pagina-ativa').stop().animate({ "bottom": '-12px' }, "fast", "easeOutQuad");
                        }else{
                            $('.pagina-ativa').stop().animate({ "bottom": '0' }, "fast", "easeOutQuad");
                        }
                    }
				    
				    // Start classe
				    configCssBottom();
				    window.setTimeout( 'changeMenu()', 500);
                    marcaMenu();
                }
            }
        );
})(jQuery);
(function($){
         $.extend(
         	 $.fn,
             {
                submenuNovelasPersonagens: function(options) {
			    	var $tplPersonagens = $(".personagens .template-personagens");
			    	var $path = jQuery.trim( $('.marca-produto').attr('href') );
			    	var $urljson =  $path + "menu/personagens/";
			        var $posters = $(".widget-slide-listagem");
			        var numRepeat = 0;
			        var numRepeatLength = 10;
			        var loadSlider = null;	
			        
			        var tplPersonagens = [];  	
                    
                    isIE8 = function(){
                        var userAgent = navigator.userAgent.toLowerCase();
                        return userAgent.indexOf("msie 8") != -1;
                    }
                     
					loadJson = function(){
						$.ajax({
							url: $urljson,
							success: function(json) {
							    var dataJson = JSON.parse(json);
							    
							    // Carregando jSon
							    loadInfo(dataJson);
							}
						});
					},
					loadInfo = function(data){
					    var numItemJson = 0;
					    
					    $.each(data, function(index) {
					        			                
					        // Clonando o template
					        var $listaPersonagem = $tplPersonagens;
			                var $itemPersonagem = $listaPersonagem.clone();
				            $tplPersonagens.remove();
				            
				            var ator = this.ator;
				            var url = this.url;
				            var foto = this.foto;
				            var nome = this.nome;
				            
			                numItemJson++;
			             
			                var tpl = '<li>' +
                                '<div class="widget-slide-conteudo">' +
                                    '<div class="foto">' +
                                        '<a href="' + url + '" class="borda-interna">' +
                                            '<img height="177" width="127" src="' + foto + '" alt="' + nome + '" title="' + nome + '">' +
                                        '</a>' +
                                        '<span class="canto-ce"></span><span class="canto-cd"></span><span class="canto-re"></span><span class="canto-rd"></span>' +
                                    '</div>' +
                                     '<div class="conteudo-texto">' +
                                        '<span>' + ator + '</span>' +
                                        '<a href="' + url + '">' + nome + '</a>' +
                                    '</div>' +
                                '</div>' +
                            '</li>';
			                
				            tplPersonagens.push(tpl);
                            
					    });
					    $posters.append( tplPersonagens.join("") );
					    // timer for starting Slider
                        loadSlider = window.setInterval( function(){ this.hasSlider() }, 100);
					},
					hasSlider = function(){
					    if( $(".widget-slide-listagem li").length > 5 ){
					        clearInterval( loadSlider );
					        execFnSlider();
					        return false;
					    }else{
					        numRepeat++;
					        if( numRepeat > numRepeatLength ){
    					        clearInterval( loadSlider );
    					        return false;
    					    }
					    }
					},
					execFnSlider = function(){
					    // Plugin Slide para Personagem
					    $(".widget-box-slide.personagens").glbWidgetSlide({itemPerView: 7, slidePerView: 7, browser: isIE8() });
					    // remove loading
                        $('.loading-personagem').fadeTo('slow', 0);
					    
					    // show personagens
	                    $('.widget-box-slide.personagens').fadeTo('slow', 1);
					    $(".widget-slide-listagem li").show();
					}
					
					// Start classe
                    if(options === 0){
                         loadJson();
                    }
				    
		 		}
             }
         );
})(jQuery);


