/**
 * Drents Archief / Webshop / API
 *
 * @author Rob Homan
 * @package Drents Archief
 * @subpackage Webshop
 * @since 0.1
 */
(function(DAAPI, $, undefined) {
	/**
	 * URL
	 */
	DAAPI.url = 'http://winkel.drentsarchief.nl/API';

	/**
	 * API key
	 */
	DAAPI.key = '07c3d2644f31c778b8f0fc1a2df7366bea4c2e679f0bedde1691806e4a18c6a3';

	/**
	 * Global prefix, can be used for HTML elements and CSS styling
	 */
	DAAPI.prefix = 'da-';

	/**
	 * Timeout for ajax requests
	 */
	DAAPI.timeout = 10 * 1000;

	/**
	 * Define elements
	 */
	DAAPI.elem = {};

	/**
	 * Intervals
	 */
	DAAPI.interval = {};

	/**
	 * Last clicked link
	 */
	DAAPI.clickedElem = null;

	/**
	 * Debug
	 *
	 * @param data
	 */
	DAAPI.debug = function(data) {
		console.log(data);
	};

	/**
	 * Set elements
	 */
	DAAPI.setElem = function() {
		DAAPI.elem = {
			window: $(window),
			doc: $(document),
			html: $('html'),
			body: $('body')
		}
	};

	/**
	 * Loader functions
	 */
	DAAPI.loader = {
		/**
		 * Show loader
		 */
		show: function(text) {
			var prefix = DAAPI.prefix + 'loader',
				text = text || 'Een ogenblik geduld';

			// Append overlay
			$('<div/>')
				.addClass(prefix + '-overlay')
				.appendTo(DAAPI.elem.body);

			// Append loader
			var loader = $('<div/>')
				.html('<span>...</span>' + text)
				.addClass(prefix)
				.appendTo(DAAPI.elem.body);

			loader.css({
				marginTop: -parseInt(loader.outerHeight() / 2),
				marginLeft: -parseInt(loader.outerWidth() / 2)
			});
		},

		/**
		 * Remove loader
		 */
		remove: function() {
			$('.' + DAAPI.prefix + 'loader').remove();
			$('.' + DAAPI.prefix + 'loader-overlay').remove();
		}
	};

	/**
	 * Dialog functions
	 */
	DAAPI.dialog = {
		/**
		 * Get dynamic width for a dialog
		 *
		 * @return int
		 */
		getWidth: function(max) {
			var width = DAAPI.elem.window.width() * 0.9,
				max = max > 0 ? max : DAAPI.elem.window.width();

			return width <= max ? width : max;
		},

		/**
		 * Get dynamic height for a dialog
		 *
		 * @return int
		 */
		getHeight: function(max) {
			var width = DAAPI.elem.window.height() * 0.9,
				max = max > 0 ? max : DAAPI.elem.window.height();

			return height <= max ? height : max;
		},

		/**
		 * Hides all dialogs
		 */
		hide: function() {
			$('.' + DAAPI.prefix + 'dialog').hide();
			$('.' + DAAPI.prefix + 'dialog-overlay').hide();
		},

		/**
		 * Centers all dialogs
		 */
		center: function() {
			var dialog = $('.' + DAAPI.prefix + 'dialog');

			dialog.css({
				marginTop: -parseInt(dialog.outerHeight() / 2),
				marginLeft: -parseInt(dialog.outerWidth() / 2)
			});
		},

		/**
		 * Removes all dialogs
		 */
		remove: function() {
			$('.' + DAAPI.prefix + 'dialog').remove();
			$('.' + DAAPI.prefix + 'dialog-overlay').remove();

			clearInterval(DAAPI.interval.dialogCenter);
		},

		/**
		 * Shows a dialog
		 *
		 * @param props
		 */
		show: function(props) {
			if (!props)
				props = {};

			var title = props.title ? props.title : '',
				html = props.html ? props.html : '',
				width = props.width > 0 ? props.width : 'auto',
				height = props.height > 0 ? props.height : 'auto',
				prefix = DAAPI.prefix + 'dialog';

			// Format buttons
			if (!$.isArray(props.buttons))
				props.buttons = [];

			// Append overlay
			var overlayEl = $('<div/>')
				.addClass(prefix + '-overlay')
				.appendTo(DAAPI.elem.body);

			// Append dialog
			var dialogEl = $('<div/>')
				.addClass(prefix)
				.css({
					width: width,
					height: height
				})
				.appendTo(DAAPI.elem.body);

			// Append close button
			var closeEl = $('<a/>')
				.attr('href', '#')
				.html('&times;')
				.addClass(prefix + '-close')
				.click(function(e) {
					e.preventDefault();

					DAAPI.dialog.remove();
				})
				.appendTo(dialogEl);

			// Append title
			var titleEl = $('<div/>')
				.addClass(prefix + '-title')
				.html(title)
				.appendTo(dialogEl);

			// Append content
			var contentEl = $('<div/>')
				.addClass(prefix + '-content')
				.html(html)
				.appendTo(dialogEl);

			// Append buttons
			if ($.isArray(props.buttons) && props.buttons.length > 0) {
				var buttonsEl = $('<div/>')
					.addClass(prefix + '-buttons')
					.appendTo(dialogEl);

				$.each(props.buttons, function(i, btnProps) {
					var buttonEl = $('<a/>')
						.attr('href', '#')
						.html(btnProps.text)
						.appendTo(buttonsEl)
						.click(function(e) {
							e.preventDefault();

							if (typeof(btnProps.click) === 'function') btnProps.click();
						});
				});
			}

			// Center
			DAAPI.dialog.center();

			clearInterval(DAAPI.interval.dialogCenter);

			DAAPI.interval.dialogCenter = setInterval(function() {
				DAAPI.dialog.center();
			}, 1000);
		}
	};

	/**
	 * Capitalizes first letter of a string
	 *
	 * @param string
	 * @returns {string}
	 */
	DAAPI.ucfirst = function(string) {
		return string.charAt(0).toUpperCase() + string.slice(1);
	};

	/**
	 * Triggers event. Can be used by custom clients to catch API events.
	 *
	 * @param name
	 * @param data
	 */
	DAAPI.triggerEvent = function(name, data) {
		var event = document.createEvent('Event');

		event.initEvent('daAPI' + DAAPI.ucfirst(name), true, true);
		event.customData = data;

		window.dispatchEvent(event);
	};

	/**
	 * Ajax error
	 *
	 * @param textStatus
	 */
	DAAPI.ajaxError = function(textStatus) {
		if(window.console)
			console.log(textStatus);
		/*var title = 'Fout opgetreden',
			html = 'Er is een fout opgetreden. Probeer nogmaals.';

		switch (textStatus) {
			case 'timeout':
				html = 'Uw verzoek is verlopen. Probeer nogmaals.';
				break;

			case 'abort':
				html = 'Uw verzoek werd afgebroken. Probeer nogmaals.';
				break;

			default:
				break;
		}

		DAAPI.dialog.show({
			title: title,
			html: html,
			width: 400
		});*/
	};

	/**
	 * JSON callback
	 *
	 * @param data
	 */
	DAAPI.jsonCallback = function(data) {
		if (data.status == 'OK') {
			switch (data.method) {
				case 'updateShoppingCart':
					DAAPI.triggerEvent('updateShoppingCart', data.shoppingCart);

					break;

				case 'showProduct':
					// Show a dialog
					DAAPI.dialog.show({
						title: data.title,
						html: data.html,
						width: 600,
						buttons: [
							{
								text: 'In winkelwagen',
								click: function() {
									$.ajax({
										timeout: DAAPI.timeout,
										type: 'GET',
										url: DAAPI.url + '/finishOrder/',
										cache: false,
										data: {
											id: DAAPI.clickedElem.attr('data-value'),
											apiKey: DAAPI.key
										},
										dataType: 'script',
										beforeSend: function() {
											DAAPI.dialog.remove();
											DAAPI.loader.show();
										},
										complete: function() {
											DAAPI.loader.remove();
										},
										error: function(jqXHR, textStatus, errorThrown) {
											DAAPI.ajaxError(textStatus);
										}
									});
								}
							}
						]
					});

					break;
				case 'showUnorderable':
					// Show a dialog
					DAAPI.dialog.show({
						title: data.title,
						html: data.html,
						width: 400
					});

					break;
				case 'finishOrder':
					// Show a dialog
					DAAPI.dialog.show({
						title: 'Product toegevoegd',
						html: 'Het product is aan de winkelwagen toegevoegd.',
						width: 400,
						buttons: [
							{
								text: 'Verder winkelen',
								click: function() {
									DAAPI.dialog.remove();
								}
							},
							{
								text: 'Afrekenen',
								click: function() {
									DAAPI.dialog.remove();

									window.open('http://winkel.drentsarchief.nl/winkelwagen/', '_blank');
								}
							}
						]
					});

					// Trigger event
					DAAPI.triggerEvent('updateShoppingCart', data.shoppingCart);

					break;
				default:
					break;
			}
		} else if (data.status == 'NOK') {
			DAAPI.dialog.show({
				title: data.title ? data.title : 'Fout opgetreden',
				html: data.message ? data.message : 'Er is een fout opgetreden. Probeer nogmaals.',
				width: 400
			});

			// Trigger event
			DAAPI.triggerEvent('error', data);
		}
	};

	/**
	 * Initialize
	 */
	DAAPI.init = function() {
		DAAPI.setElem();

		// Import CSS
		$('<link/>')
			.attr({
				type: 'text/css',
				rel: 'stylesheet'
			})
			.attr('href', 'http://winkel.drentsarchief.nl/layout/api/style/style.css?key=' + DAAPI.key)
			.appendTo('head');

		// Order product
		DAAPI.elem.body.delegate('#da-bestel', 'click', function(e) {
			e.preventDefault();

			DAAPI.clickedElem = $(this);

			$.ajax({
				timeout: DAAPI.timeout,
				type: 'GET',
				url: DAAPI.url + '/showProduct/',
				cache: false,
				data: {
					id: DAAPI.clickedElem.attr('data-value'),
					apiKey: DAAPI.key
				},
				dataType: 'script',
				beforeSend: function() {
					DAAPI.loader.show();
				},
				complete: function() {
					DAAPI.loader.remove();
				},
				error: function(jqXHR, textStatus, errorThrown) {
					DAAPI.ajaxError(textStatus);
				}
			});
		});

		// Send shopping cart session on page load
		$.ajax({
			timeout: DAAPI.timeout,
			type: 'GET',
			url: DAAPI.url + '/getShoppingCart/',
			cache: false,
			data: {
				apiKey: DAAPI.key
			},
			dataType: 'jsonp'
		});
	};

	/**
	 * jQuery event hook
	 */
	$(function() {
		DAAPI.init();
	});
}(window.DAAPI = window.DAAPI || {}, jQuery));
