﻿/**
 * the PopupHandler class
 * sets up links with 'rel=popup' attribute to be opened in a popup-window, with several options
 *
 * @author Klaas Dieleman, <klaas[AT]efocus.nl>
 * @since 18 mar 2010
 * @version 1.0
 * @copyright eFocus
 * @uses jQuery 1.4.2, <http://www.jquery.com>
 */
function PopupHandler(){
	this.initialize();
};

PopupHandler.prototype = {
	/**
	 * adds PopupHandler object to Window collection as 'PopupHandler'
	 */
	initialize: function(){
		window['PopupHandler'] = this;
	},
	
	/**
	 * sets up links to be handled by PopupHandler
	 */
	init: function() {
		
		this.arrLinks = this.getLinks();
		this.linkOptions = {
			'width'			: '500',
			'height'		: '500',
			'top'			: '10',
			'left'			: '10',
			'addressbar'	: 'no',
			'statusbar'		: 'no',
			'menubar'		: 'no',
			'toolbar'		: 'no',
			'resizable'		: 'no',
			'scrollbars'	: 'yes',
			'url'			: ''
		};
		
		this.arrLinks.each(function(index, item) {
			PopupHandler.parseOptions(item);
			PopupHandler.setEventListeners(item);
		});
		
    },
    
    /**
     * get all <a>-tags in the DOM with a 'rel'-attribute containing 'popup'
     * @return arrLinks; array of link elements
     */
    getLinks: function() {
		var arrLinks = jQuery("a[rel^='popup']");
		return arrLinks;
    },
    
    /**
     * adds options to given link, reading from specified options in the 'rel'-attribute
     * @param element; link to add options to
     */
    parseOptions: function(elLink) {
		elLink.linkOptions = {};
		var arrGivenOptions = [];
		var arrParsedOptions = [];
		
		arrGivenOptions = String(jQuery(elLink).attr('rel')).replace(/ /g, '').split(';');
		arrGivenOptions.splice(0,1);
		
		for(i in arrGivenOptions) {
			var strOptionName = String(arrGivenOptions[i]).split('=')[0];
			var strOptionValue = String(arrGivenOptions[i]).split('=')[1];
			arrParsedOptions[strOptionName] = strOptionValue;
		}
		
		for(i in this.linkOptions) {
			if(arrParsedOptions[i] != undefined) {
				
				var blnOptionFormatInvalid = true;
				
				switch(i) {
					case 'width':
						blnOptionFormatInvalid = isNaN(arrParsedOptions[i]);
						break;
					case 'height':
						blnOptionFormatInvalid = isNaN(arrParsedOptions[i]);
						break;
					case 'top':
						blnOptionFormatInvalid = isNaN(arrParsedOptions[i]);
						break;
					case 'left':
						blnOptionFormatInvalid = isNaN(arrParsedOptions[i]);
						break;
					case 'addressbar':
						if(arrParsedOptions[i] == 'yes' || arrParsedOptions[i] == 'no') blnOptionFormatInvalid = false;
						break;
					case 'statusbar':
						if(arrParsedOptions[i] == 'yes' || arrParsedOptions[i] == 'no') blnOptionFormatInvalid = false;
						break;
					case 'menubar':
						if(arrParsedOptions[i] == 'yes' || arrParsedOptions[i] == 'no') blnOptionFormatInvalid = false;
						break;
					case 'toolbar':
						if(arrParsedOptions[i] == 'yes' || arrParsedOptions[i] == 'no') blnOptionFormatInvalid = false;
						break;
					case 'resizable':
						if(arrParsedOptions[i] == 'yes' || arrParsedOptions[i] == 'no') blnOptionFormatInvalid = false;
						break;
					case 'scrollbars':
						if(arrParsedOptions[i] == 'yes' || arrParsedOptions[i] == 'no') blnOptionFormatInvalid = false;
						break;
					default:
						elLink.linkOptions[i] = this.linkOptions[i];
				}
				
				if(blnOptionFormatInvalid) {
					elLink.linkOptions[i] = this.linkOptions[i];
				} else {
					elLink.linkOptions[i] = arrParsedOptions[i];
				}
				
			} else {
				elLink.linkOptions[i] = this.linkOptions[i];
			}
		}
		
		elLink.linkOptions.url = jQuery(elLink).attr('href');
		
    },
    
    /**
     * binds click-event to given link
     * @param element; link to add event listeners to
     */
    setEventListeners: function(elLink) {
		jQuery(elLink).click(function(eventObject) {
			eventObject.preventDefault();
			PopupHandler.openPopup(elLink);
		});
    },
    
    /**
     * opens popup window from given link, regarding its options
     * @param element; link from which to open popup
     */
    openPopup: function(elLink) {
		var strWindowOptions = '';
		
		strWindowOptions += 'width=' + elLink.linkOptions.width;
		strWindowOptions += ',height=' + elLink.linkOptions.height;
		strWindowOptions += ',top=' + elLink.linkOptions.top;
		strWindowOptions += ',left=' + elLink.linkOptions.left;
		strWindowOptions += ',location=' + elLink.linkOptions.addressbar;
		strWindowOptions += ',status=' + elLink.linkOptions.statusbar;
		strWindowOptions += ',menubar=' + elLink.linkOptions.menubar;
		strWindowOptions += ',toolbar=' + elLink.linkOptions.toolbar;
		strWindowOptions += ',resizable=' + elLink.linkOptions.resizable;
		strWindowOptions += ',scrollbars=' + elLink.linkOptions.scrollbars;
		
		window.open(elLink.linkOptions.url, '', strWindowOptions);
		
    }
}

// instantiate PopupHandler-object to be available as collection in the Window-object
new PopupHandler();
