/*
 * Script Name: Agenda Widget
 * Description: Provides a widget that displays the latest recommendations and sales from Agenda Daily 
 * Author: Peacock
 * Author URI: http://peacock.st
 *
 * Date: Tue May 3 18:04:00 2011
 */
(function() {

	// Localize jQuery variable
	var jQuery;
	var loaded = false;

	/******** Load jQuery if not present *********/
	if (window.jQuery === undefined || window.jQuery.fn.jquery !== '1.6') {
		var script_tag = document.createElement('script');
		script_tag.setAttribute('type', 'text/javascript');
		script_tag.setAttribute('src', 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js');
		script_tag.onload = scriptLoadHandler;
		script_tag.onreadystatechange = function () { // Same thing but for IE
			if ((this.readyState == 'complete' || this.readyState == 'loaded') && !loaded) {
				scriptLoadHandler();
				loaded = true;
			}
		};
		// Try to find the head, otherwise default to the documentElement
		(document.getElementsByTagName('head')[0] || document.documentElement).appendChild(script_tag);
	} else {
		// The jQuery version on the window is the one we want to use
		jQuery = window.jQuery;
		main();
	}

	/******** Called once jQuery has loaded ******/
	function scriptLoadHandler() {
		// fix for ie9 which calls scriptLoadHandler twice (onload and onreadystatechange)
		if (loaded) return;
		loaded = true;

		// Restore $ and window.jQuery to their previous values and store the
		// new jQuery in our local jQuery variable
		jQuery = window.jQuery.noConflict(true);

		// load jQuery plugins 

		/*!
		 * jQuery Tools v1.2.5 - The missing UI library for the Web
		 * 
		 * scrollable/scrollable.js
		 * scrollable/scrollable.autoscroll.js
		 * scrollable/scrollable.navigator.js
		 * 
		 * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
		 * 
		 * http://flowplayer.org/tools/
		 * 
		 */
		(function(a){a.tools=a.tools||{version:"@VERSION"},a.tools.scrollable={conf:{activeClass:"active",circular:!1,clonedClass:"cloned",disabledClass:"disabled",easing:"swing",initialIndex:0,item:null,items:".items",keyboard:!0,mousewheel:!1,next:".agenda-next",prev:".agenda-prev",speed:400,vertical:!1,touch:!0,wheelSpeed:0}};function b(a,b){var c=parseInt(a.css(b),10);if(c)return c;var d=a[0].currentStyle;return d&&d.width&&parseInt(d.width,10)}function c(b,c){var d=a(c);return d.length<2?d:b.parent().find(c)}var d;function e(b,e){var f=this,g=b.add(f),h=b.children(),i=0,j=e.vertical;d||(d=f),h.length>1&&(h=a(e.items,b)),a.extend(f,{getConf:function(){return e},getIndex:function(){return i},getSize:function(){return f.getItems().size()},getNaviButtons:function(){return m.add(n)},getRoot:function(){return b},getItemWrap:function(){return h},getItems:function(){return h.children(e.item).not("."+e.clonedClass)},move:function(a,b){return f.seekTo(i+a,b)},next:function(a){return f.move(1,a)},prev:function(a){return f.move(-1,a)},begin:function(a){return f.seekTo(0,a)},end:function(a){return f.seekTo(f.getSize()-1,a)},focus:function(){d=f;return f},addItem:function(b){b=a(b),e.circular?(h.children("."+e.clonedClass+":last").before(b),h.children("."+e.clonedClass+":first").replaceWith(b.clone().addClass(e.clonedClass))):h.append(b),g.trigger("onAddItem",[b]);return f},seekTo:function(b,c,k){b.jquery||(b*=1);if(e.circular&&b===0&&i==-1&&c!==0)return f;if(!e.circular&&b<0||b>f.getSize()||b<-1)return f;var l=b;b.jquery?b=f.getItems().index(b):l=f.getItems().eq(b);var m=a.Event("onBeforeSeek");if(!k){g.trigger(m,[b,c]);if(m.isDefaultPrevented()||!l.length)return f}var n=j?{top:-l.position().top}:{left:-l.position().left};i=b,d=f,c===undefined&&(c=e.speed),h.animate(n,c,e.easing,k||function(){g.trigger("onSeek",[b])});return f}}),a.each(["onBeforeSeek","onSeek","onAddItem"],function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}});if(e.circular){var k=f.getItems().slice(-1).clone().prependTo(h),l=f.getItems().eq(1).clone().appendTo(h);k.add(l).addClass(e.clonedClass),f.onBeforeSeek(function(a,b,c){if(!a.isDefaultPrevented()){if(b==-1){f.seekTo(k,c,function(){f.end(0)});return a.preventDefault()}b==f.getSize()&&f.seekTo(l,c,function(){f.begin(0)})}}),f.seekTo(0,0,function(){})}var m=c(b,e.prev).click(function(){f.prev()}),n=c(b,e.next).click(function(){f.next()});!e.circular&&f.getSize()>1&&(f.onBeforeSeek(function(a,b){setTimeout(function(){a.isDefaultPrevented()||(m.toggleClass(e.disabledClass,b<=0),n.toggleClass(e.disabledClass,b>=f.getSize()-1))},1)}),e.initialIndex||m.addClass(e.disabledClass)),e.mousewheel&&a.fn.mousewheel&&b.mousewheel(function(a,b){if(e.mousewheel){f.move(b<0?1:-1,e.wheelSpeed||50);return!1}});if(e.touch){var o={};h[0].ontouchstart=function(a){var b=a.touches[0];o.x=b.clientX,o.y=b.clientY},h[0].ontouchmove=function(a){if(a.touches.length==1&&!h.is(":animated")){var b=a.touches[0],c=o.x-b.clientX,d=o.y-b.clientY;f[j&&d>0||!j&&c>0?"next":"prev"](),a.preventDefault()}}}e.keyboard&&a(document).bind("keydown.scrollable",function(b){if(e.keyboard&&!b.altKey&&!b.ctrlKey&&!a(b.target).is(":input")){if(e.keyboard!="static"&&d!=f)return;var c=b.keyCode;if(j&&(c==38||c==40)){f.move(c==38?-1:1);return b.preventDefault()}if(!j&&(c==37||c==39)){f.move(c==37?-1:1);return b.preventDefault()}}}),e.initialIndex&&f.seekTo(e.initialIndex,0,function(){})}a.fn.scrollable=function(b){var c=this.data("scrollable");if(c)return c;b=a.extend({},a.tools.scrollable.conf,b),this.each(function(){c=new e(a(this),b),a(this).data("scrollable",c)});return b.api?c:this}})(jQuery);

		(function(a){var b=a.tools.scrollable;b.autoscroll={conf:{autoplay:!0,interval:3e3,autopause:!0}},a.fn.autoscroll=function(c){typeof c=="number"&&(c={interval:c});var d=a.extend({},b.autoscroll.conf,c),e;this.each(function(){var b=a(this).data("scrollable");b&&(e=b);var c,f=!0;b.play=function(){c||(f=!1,c=setInterval(function(){b.next()},d.interval))},b.pause=function(){c=clearInterval(c)},b.stop=function(){b.pause(),f=!0},d.autopause&&b.getRoot().add(b.getNaviButtons()).hover(b.pause,b.play),d.autoplay&&b.play()});return d.api?e:this}})(jQuery);

		(function(a){var b=a.tools.scrollable;b.navigator={conf:{navi:".navi",naviItem:null,activeClass:"active",indexed:!1,idPrefix:null,history:!1}};function c(b,c){var d=a(c);return d.length<2?d:b.parent().find(c)}a.fn.navigator=function(d){typeof d=="string"&&(d={navi:d}),d=a.extend({},b.navigator.conf,d);var e;this.each(function(){var b=a(this).data("scrollable"),f=d.navi.jquery?d.navi:c(b.getRoot(),d.navi),g=b.getNaviButtons(),h=d.activeClass,i=d.history&&a.fn.history;b&&(e=b),b.getNaviButtons=function(){return g.add(f)};function j(a,c,d){b.seekTo(c);if(i)location.hash&&(location.hash=a.attr("href").replace("#",""));else return d.preventDefault()}function k(){return f.find(d.naviItem||"> *")}function l(b){var c=a("<"+(d.naviItem||"a")+"/>").click(function(c){j(a(this),b,c)}).attr("href","#"+b);b===0&&c.addClass(h),d.indexed&&c.text(b+1),d.idPrefix&&c.attr("id",d.idPrefix+b);return c.appendTo(f)}k().length?k().each(function(b){a(this).click(function(c){j(a(this),b,c)})}):a.each(b.getItems(),function(a){l(a)}),b.onBeforeSeek(function(a,b){setTimeout(function(){if(!a.isDefaultPrevented()){var c=k().eq(b);!a.isDefaultPrevented()&&c.length&&k().removeClass(h).eq(b).addClass(h)}},1)});function m(a,b){var c=k().eq(b.replace("#",""));c.length||(c=k().filter("[href="+b+"]")),c.click()}b.onAddItem(function(a,c){c=l(b.getItems().index(c)),i&&c.history(m)}),i&&k().history(m)});return d.api?e:this}})(jQuery);

		/*
		 * vAlign plugin
		 */

		jQuery.fn.vAlign = function() {
			return this.each(function() {
				var obj = jQuery(this);

				var ah = obj.height();
				var ph = obj.parent().height();
				var mh = Math.ceil((ph-ah) / 2);
				obj.css('margin-top', mh);
			});
		};

		/*
		 * Truncate plugin 
		 * Truncates the text inside an element based on that elements parents height
		 */

		jQuery.fn.truncateToParent = function() {
			return this.each(function() {
				var obj = jQuery(this);
				var parent = jQuery(this).parent();

				while (obj.height() >= parent.height()) {
					obj.text(
						obj.text()
						.split(' ')
						.slice(0, -1)
						.join(' ') + '...'
					);
				}
			});
		};

		/*
		 * Resize Image to Parent jQuery plugin
		 */

		jQuery.fn.resizeToParent = function(options) {
			var defaults = {
				parent: 'div'
			}

			var options = jQuery.extend(defaults, options);

			return this.each(function() {
				var o = options;
				var obj = jQuery(this);

				// bind to image load
				obj.load(function() {
					var p = obj.parents(o.parent);
					
					// dimensions of the parent
					var parentWidth = p.width();
					var parentHeight = p.height();

					// dimensions of the image
					var imageWidth = obj.width();
					var imageHeight = obj.height();

					// step 1 - calculate the percentage difference between image width and container width
					var diff = imageWidth / parentWidth;

					// step 2 - if height divided by difference is smaller than container height, resize by height. otherwise resize by width
					if ((imageHeight / diff) < parentHeight) {
						obj.css({'width': 'auto', 'height': parentHeight});

						// set image variables to new dimensions
						imageWidth = imageWidth / (imageHeight / parentHeight);
						imageHeight = parentHeight;
					}
					else {
						obj.css({'height': 'auto', 'width': parentWidth});

						// set image variables to new dimensions
						imageWidth = parentWidth;
						imageHeight = imageHeight / diff;
					}

					// step 3 - center image in container
					var leftOffset = (imageWidth - parentWidth) / -2;
					var topOffset = (imageHeight - parentHeight) / -2;

					obj.css({'left': leftOffset, 'top': topOffset});	
				});
			});
		}

		// add easeOutQuint to jQuery
		jQuery.easing.easeOutQuint =  function (x, t, b, c, d) {
			if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
			return c/2*((t-=2)*t*t*t*t + 2) + b;
		}

		// Call our main function
		main();
	}

	/******** main function ********/
	function main() {
		jQuery(function() {
			loaded = true;
			//console.log(loaded);

			// set widget style (fat or slim)
			var style = (jQuery('#agenda-widget').hasClass('agenda-fat')) ? 'fat' : 'slim';
			
			// load css
			var cssURL = 'http://www.theagendadaily.com/widget/css/' + style + '.css';
			if (document.createStyleSheet) {
				// ensure IE compatibility... *sigh*
				document.createStyleSheet(cssURL);
			}
			else {
				jQuery('head').append('<link href="' + cssURL + '" rel="stylesheet" type="text/css">');
			}

			// set widget type (widget always has sales, recommendations is optional)
			var recommendations = false;
			if (jQuery('#agenda-widget').hasClass('agenda-rs')) {
				recommendations = true;
			}

			// set widget location
			var location = '';
			if (jQuery('#agenda-widget').hasClass('agenda-sydney')) {
				location = 'sydney';
			}
			else if (jQuery('#agenda-widget').hasClass('agenda-perth')) {
				location = 'perth';
			}
			else {
				location = 'melbourne';
			}

			// build widget
			var html = '<div class="agenda-content"><div class="agenda-buttons">';

			if (recommendations) {
				html += '<a href="#" class="agenda-recommendations-button"></a>';
				html += '<span class="agenda-buttons-spacer"></span>';
			}

			html += '<a href="#" class="agenda-sales-button"></a>';
			html += '</div>'; // end agenda-buttons

			if (recommendations) {
				html += '<div class="agenda-recommendations">';
				html += '<a class="agenda-top-nav agenda-prev"></a><a class="agenda-top-nav agenda-next"></a>';
				html += '<div class="agenda-navi"></div>';
				html += '<div class="agenda-scrollable"><div class="agenda-items"></div></div>';
				html += '</div>'; //end agenda-recommendations
			}

			html += '<div class="agenda-sales">';
			html += '<a class="agenda-top-nav agenda-prev"></a><a class="agenda-top-nav agenda-next"></a>';
			html += '<div class="agenda-navi"></div>';
			html += '<div class="agenda-scrollable"><div class="agenda-items"></div></div>';
			html += '</div>';
			html += '<div class="agenda-title-background"></div>';
			html += '</div>'; //end agenda-content

			jQuery('#agenda-widget').prepend(html);

			// sales
			jQuery.getJSON('http://www.theagendadaily.com/' + location + '/?feed=json_sales&jsonp=?', function(data) {
				var count = 0;
				var currentSales = false; // stores whether there's at least 1 current sale running

				jQuery.each(data, function(i, post) {
					if (post.current) {
						currentSales = true;
					}
				});

				jQuery.each(data, function(i, post) {
					// show the sale if it's current (running), or if it's the first sale and there are no other current sales
					if (post.current || (count == 0 && !currentSales)) {
						count++;

						var itemHTML = '<div class="agenda-item">';
						itemHTML += '<div class="agenda-venue-container"><a class="agenda-venue" href="' + post.permalink + '" target="_blank">' + post.venue_name + '</a></div>';
						itemHTML += '<div class="agenda-image-container"><a href="' + post.permalink + '" target="_blank"><img class="agenda-image" src="' + post.image_src[0] + '" /></a></div>';
						itemHTML += '<div class="agenda-sales-info">';
						itemHTML += '<p class="agenda-sale-price">$' + post.deal_price + '</p>';

						if (post.current) {
							itemHTML += '<a class="agenda-sale-button" href="' + post.permalink + '" target="_blank">Buy Now</a>';
						}
						else {
							itemHTML += '<a class="agenda-sale-button expired" href="' + post.permalink + '" target="_blank">Closed</a>';
						}

						itemHTML += '</div>'; //end agenda-sales-info

						/*
						// only displays savings if sale has a normal price
						if (post.normal_price != '') {
							itemHTML += '<div class="agenda-sale-savings-container"><span class="agenda-sale-savings">' + post.savings + '% savings</span></div>';
						}
						*/

						itemHTML += '<div class="agenda-title-container"><p class="agenda-title">' + post.title + '</p></div>';
						itemHTML += '</div>'; //end agenda-item

						var item = jQuery(itemHTML);
						var title = item.find('.agenda-title');
						
						jQuery('.agenda-sales .agenda-items').append(item);

						// these actions must be performed after elements are added to dom
						title.truncateToParent();
						title.vAlign();

						/*
						if (post.normal_price != '') {
							var salesInfo = item.find('.agenda-sales-info');
							var savingsContainer = item.find('.agenda-sale-savings-container');
							salesInfo.css({'top': salesInfo.position().top - savingsContainer.height()});
						}
						*/
					}
				});

				if (recommendations) {
					// recommendations
					jQuery.getJSON('http://www.theagendadaily.com/' + location + '/?feed=json_posts&jsonp=?', function(data) {
						jQuery.each(data, function(i, post) {
							var itemHTML = '<div class="agenda-item">';
							itemHTML += '<div class="agenda-venue-container"><a class="agenda-venue" href="' + post.permalink + '" target="_blank">' + post.venue_name + '</a></div>';
							itemHTML += '<div class="agenda-image-container"><a href="' + post.permalink + '" target="_blank"><img class="agenda-image" src="' + post.image_src[0] + '" /></a></div>';
							itemHTML += '<div class="agenda-title-container"><p class="agenda-title">' + post.title + '</p></div>';
							itemHTML += '</div>'; //end agenda-item

							var item = jQuery(itemHTML);
							var title = item.find('.agenda-title');

							jQuery('.agenda-recommendations .agenda-items').append(item);

							// these actions must be performed after elements are added to dom
							title.truncateToParent();
							title.vAlign();
						});

						//jQuery('.agenda-scrollable').scrollable({circular: true, keyboard: false}).autoscroll({interval: 7000});
						jQuery('.agenda-recommendations .agenda-scrollable').scrollable({easing: 'easeOutQuint', circular: true, keyboard: false}).autoscroll({interval: 7000}).navigator({indexed: true, navi: '.agenda-recommendations .agenda-navi'});
					
						// resize images to parent container. call it after scrollable has been initialised due to scrollable cloning elements
						jQuery('.agenda-recommendations .agenda-scrollable .agenda-image').resizeToParent();
					});
				}

				// only enable scrollable if more than 1 sale is running
				if (count > 1) {
					jQuery('.agenda-sales .agenda-scrollable').scrollable({easing: 'easeOutQuint', circular: true, keyboard: false}).autoscroll({interval: 7000}).navigator({indexed: true, navi: '.agenda-sales .agenda-navi'});
				}
				else {
					var salesInfo = jQuery('.agenda-sales .agenda-item .agenda-sales-info');
					var navi = jQuery('.agenda-sales .agenda-navi');
					
					// reposition sales info div
					salesInfo.css({'top': salesInfo.position().top + navi.height()});
					salesInfo.addClass('agenda-bottom-radius');

					// hide navigation
					jQuery('.agenda-sales .agenda-top-nav').hide();
					navi.hide();
				}

				// resize images to parent container. call it after scrollable has been initialised due to scrollable cloning elements
				jQuery('.agenda-sales .agenda-scrollable .agenda-image').resizeToParent();
			});

			// bind event handlers
			// note that we are modifying the css visiblity properties so that elements can be positioned and resized correctly.
			// this won't happen when display == none, so we set visibility instead.
			if (recommendations) {
				jQuery('.agenda-recommendations').css({display: 'block', visibility: 'hidden'});

				jQuery('.agenda-recommendations-button').live('click', function(e) {
					e.preventDefault();
					
					if (!jQuery(this).hasClass('agenda-active')) {
						jQuery('.agenda-sales-button').removeClass('agenda-active');
						jQuery(this).addClass('agenda-active');

						jQuery('.agenda-recommendations').css({display: 'none', visibility: 'visible'}).fadeIn();
						jQuery('.agenda-sales').fadeOut(400, function() { jQuery(this).css({display: 'block', visibility: 'hidden'}) });
					}
				});
			}
			
			jQuery('.agenda-sales-button').addClass('agenda-active');

			// still bind sales button regardless, otherwise the # anchor will take user to top of page if clicked
			jQuery('.agenda-sales-button').live('click', function(e) {
				e.preventDefault();

				if (!jQuery(this).hasClass('agenda-active')) {
					jQuery('.agenda-recommendations-button').removeClass('agenda-active');
					jQuery(this).addClass('agenda-active');

					jQuery('.agenda-sales').css({display: 'none', visibility: 'visible'}).fadeIn();
					jQuery('.agenda-recommendations').fadeOut(400, function() { jQuery(this).css({display: 'block', visibility: 'hidden'}) });
				}
			});

			// modify layout according to widget type
			if (!recommendations) {
				jQuery('.agenda-sales-button').addClass('agenda-wide');
			}

			// replace the word Agenda in bottom link with Agenda logo
			jQuery('.agenda-logo').html('<img src="http://www.theagendadaily.com/widget/images/agenda-logo.png" alt="Agenda" />');
		});
	}

})();
