﻿/*
 *	Pops - manages multiple popups on a page, requires jQuery PopUp plugin.
 * 
 *	var popups = new Pops();
 *	popups.add('name', 'Title', 'Content', {'option1': 'option1value'});
 *	popups['name'].show();
 */
var Pops = function(disableIE6fix) {
	var _setupComplete = false;
	var _this = this;
	var _container = 'popup_pane';
	var _$docElem = null;
	var _docElemOverflow = '';
	var _docElemScrollPos = [0, 0];
	var _docElemWidthMarginRight = [0, 0];
	var _effects = ['none', 'fast', 'flash', 'slow'];
	var _modalOpacity = 0.50;
	var _modalColour = '#000000';
	var _modalDelay = 50;
	var _modalStatus = false;
	var _modalRequired = false;
	//window.status = jQuery.browser.msie + ' - ' + jQuery.browser.version;
	var _iPad = !!(window._ && (_.DeviceType == 'tablet' || _.DeviceType == 'phone'));
	var _isIE6 = !!(jQuery.browser.msie && jQuery.browser.version.charAt(0) / 1 < 7);
	var _wasIsIE6 = _isIE6;
	if (disableIE6fix == true) _isIE6 = false;
	//window.status = jQuery.browser.msie + ' - ' + jQuery.browser.version + ' is: ' + _isIE6 + ' wasis: ' + _wasIsIE6;
	this.length = 0;

	this.add = function(name, title, content, options, fAfterAdded) {
		if (!_setupComplete) setupPops();
		var n = _this.length;
		var args = jQuery.extend({
			container: _container,
			title: (title || ''),
			name: 'pops_' + name,
			content: content,
			buttons: {
				top: {
					x: '<button onclick="popups[\'' + name + '\'].hide();" class="btnX"><span>X</span></button>' /* string HTML or Dom Element */
				},
				bottom: {}
			}
		}, options);
		var pop = jQuery.popup(args);
		_this[name] = _this[n] = {
			popup: pop,
			name: name,
			modal: ((args && args.modal) ? !!args.modal : false),
			isOpen: false,
			show: function(effect, speed) { _this.show(name, effect, speed); },
			hide: function(effect, speed) { _this.hide(name, effect, speed); },
			title: function(title) { if (title == undefined) return _this.getTitle(name); else _this.setTitle(name, title); },
			content: function(content) { if (content == undefined) return _this.getContent(content); else _this.setContent(name, content); _this.slide(name); },
			slide: function(pos, speed) { _this.slide(name, pos, speed); },
			toFront: function() { _this.popToFront(name); },
			onOpen: options.open || null,
			onClose: options.close || null
		};
		_this[name].popup.click(function() {
			var n = name;
			_this[name].toFront();
		});

		if (_this[name]) {
			_this.length++;
			_this[name].hide();
			if (fAfterAdded && fAfterAdded.call) fAfterAdded(_this[name]);
			return _this[name];
		}
		else {
			return new Error('failed to add popup');
		}
	}

	this.show = function(name, effect, speed) { // show named popup
		var popup = _this[name];
		if (popup) {
			effect = effect || 'fade';
			if (!$inArray(_effects, effect)) effect = 'fade';
			speed = speed || ((effect == 'slow') ? 1000 : ((effect == 'fast') ? 90 : 300));
			if (effect == 'slow' || effect == 'fast') effect = 'fade';
			if (!popup.isOpen) {
				popup.popup.popupOpen({ type: effect, speed: speed * 1.5 }, ((popup.onOpen && popup.onOpen.call) ? popup.onOpen : null));
			}
			//window.setTimeout(function() {
			popup.isOpen = true;
			window.setTimeout(function() {
				popup.toFront();
			}, 80);
			//}, _modalDelay);
			// add modal screen if needed
			//window.setTimeout(function() {
			if (popup.modal) {
				if (!_modalStatus) {
					modalShow({ type: effect, speed: speed * 0.7 });
				}
			}
			else if (!_modalStatus) {
				modalShow('non-modal');
			}
			//}, _modalDelay);
		}
	}

	this.hide = function(name, effect, speed) { // hide named popup
		var popup = _this[name];
		if (popup) {
			effect = effect || 'fade';
			if (!$inArray(_effects, effect)) effect = 'fade';
			speed = speed || ((effect == 'slow') ? 1000 : ((effect == 'fast') ? 90 : 300));
			if (effect == 'slow' || effect == 'fast') effect = 'fade';
			if (popup.isOpen) popup.popup.popupClose({ type: effect, speed: speed * 1.5 }, ((popup.onClose && popup.onClose.call) ? popup.onClose : null));
			popup.isOpen = false;
		}
		// remove modal screen if not needed and update _modalStatus
		if (!(_modalStatus = _this.modalInUse())) {
			modalHide({ type: effect, speed: speed * 0.7 });
			if (_this.getOpen().length) {
				modalShow('non-modal');
			}
		}
	}

	this.getTitle = function(name) { // hide named popup
		var popup = _this[name];
		if (popup) popup.popup.find('.top .title>h1').html();
	}

	this.setTitle = function(name, title) { // hide named popup
		var popup = _this[name];
		if (popup) popup.popup.find('.top .title>h1').html(title.toString());
	}

	this.getContent = function(name) { // hide named popup
		var popup = _this[name];
		if (popup) popup.popup.find('.middlemiddle .content>div').html();
	}

	this.setContent = function(name, content) { // hide named popup
		var popup = _this[name];
		if (popup) {
			popup.popup.find('.middlemiddle .content>div').html(content);
			//window.setTimeout(function() {
			_this.slide(name, null, 0);
			//}, 1);
		}
	}

	this.getOpen = function() { // returns list of open popups
		var list = [];
		for (var p = 0; p < _this.length; p++) {
			if (_this[p].isOpen) list.push(_this[p]);
		}
		return list;
	}

	this.modalInUse = function() { // updates modal status and returns result 
		var result = false;
		for (var p = 0; p < _this.length; p++) {
			if (_this[p].isOpen && _this[p].modal) {
				result = true;
				break;
			}
		}
		_modalRequired = result;
		return _modalRequired;
	}

	function focusBodyPane(e) {
		if (jq('#modal_pane').css('display') != 'none') {
			e.currentTarget.blur();
			return false;
		}
	}

	function modalShow(options) {
		if (options == 'non-modal') {
			var nm = true;
			options = jQuery.fn.extend({
				type: 'none',
				speed: 0
			}, options);
		}
		else {
			var nm = false;
			options = jQuery.fn.extend({
				type: 'fade',
				speed: 200
			}, options);
		}
		if (_iPad) {
			jQuery('#modal_pane')
                .css('width', self.innerWidth)
                .css('height', self.innerHeight);
		}
		if (_wasIsIE6) options.type = 'none';
		//jQuery('#modal_pane').fadeIn(options.speed);
		if (!nm) _modalStatus = true;
		var doAfter = function() { };
		if (options && options.type == 'fade') {
			jQuery('#modal_pane').stop(true).fadeIn(options.speed);
		}
		else {
			jQuery('#modal_pane').stop(true).show(1);
		}
		// non-modal
		if (nm) {
			jQuery('#modal_pane').css('visibility', 'hidden');
		}
		else {
			jQuery('#modal_pane').css('visibility', 'visible');
			if (!_isIE6 && _$docElem) {
				// stop documentElement scroll
				_docElemOverflow = _$docElem.css('overflow');
				_docElemWidthMarginRight = [_$docElem.width(), _$docElem.css('margin-right')];
				_docElemScrollPos = [_$docElem.scrollLeft(), _$docElem.scrollTop()];
				_$docElem.css('overflow', 'hidden');
				_$docElem.css('margin-right', (_$docElem.width() - _docElemWidthMarginRight[0]));
				_$docElem.scrollLeft(_docElemScrollPos[0]);
				_$docElem.scrollTop(_docElemScrollPos[1]);

			}
		}
		// ie6fix
		if (_isIE6) {
			jQuery('#modal_pane, #modal_pane iframe').height(jQuery(document.documentElement).height());
		}
	}

	function modalHide(options) {
		options = jQuery.fn.extend({
			type: 'fade',
			speed: 200
		}, options);
		if (_wasIsIE6) options.type = 'none';
		//jQuery('#modal_pane').fadeOut(options.speed);
		if (options && options.type == 'fade') {
			jQuery('#modal_pane').stop(true).fadeOut(options.speed, function() { _modalStatus = false; });
		}
		else {
			jQuery('#modal_pane').stop(true).hide(1, function() { _modalStatus = false; });
		}
		if (!_isIE6 && _$docElem) {
			// reset documentElement scroll
			_$docElem.css('overflow', (_docElemOverflow || 'auto'));
			_$docElem.scrollLeft(_docElemScrollPos[0]);
			_$docElem.scrollTop(_docElemScrollPos[1]);
			_$docElem.css('margin-right', _docElemWidthMarginRight[1]);
		}

	}
	
	this.modalToCentre = function() {
		jQuery('#popup_pane, #modal_pane')
            .css('left', jQuery(document).scrollLeft())
            .css('top', jQuery(document).scrollTop())
    }

	this.slide = function(name, pos, time) {
		var popup = _this[name];
		if (popup) {
			if (pos == 'clear_queue') {
				pos = null;
				popup.popup.clearQueue();
				popup.popup.stopAnim();
			}
			if (time != 0) time = time / 1 || 500;
			pos = pos || popCenterCoords(name);
			if (pos.x && pos.y) pos = [pos.x, pos.y];
			popup.popup.popSlide(pos, time);
		}
	}

	function popCenterCoords(name) {
		var coords = jQuery.dim('centerObj', 0, 0);
		var popup = _this[name];
		if (popup && popup.popup && popup.popup[0]) {
			coords = jQuery.dim('centerObj', popup.popup[0]);
		}
		return coords;
	}

	this.popToFront = function(name) {
		var popup = _this[name];
		if (popup) {
			var topZ = 2 * _this.length;
			for (var i = 0, pop; pop = _this[i]; i++) {
				if (pop.name == name) {
					pop.popup.css('z-index', topZ);
				}
				else {
					pop.popup.css('z-index', 1);
				}
			}
		}
	}

	function setupPops() {
		_$docElem = jQuery(document.documentElement);
		console.log('iPad/iPhone: ' + _iPad);
		if (!jQuery('#modal_pane').length) { // create modal screen
			console.warn(window.status = 'js pops setup!');
			//error var w = jQuery(document.body).wrapInner('<div id="body_pane" />');
			var bgColour = (_modalColour.charAt(0) == "#") ? _modalColour : '#000';
			var html = '\n\
					<div id="popup_pane"></div>\n\
				' +
				((_isIE6) ? '<div id="modal_pane" style="filter: progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=' + (_modalOpacity * 100) + ')"><iframe src="/blank.htm' + bgColour + '" style="position: absolute;" frameBorder="0" scrolling="no"></IFRAME></div>\n' : '<div id="modal_pane" style="opacity: ' + _modalOpacity + ';"></div>\n') +
				'<div id="body_pane">' + document.body.innerHTML + '</div>\n\
				<style type="text/css">\n\
				html, body {\n\
					width: 100%; height: 100%;\n\
					margin: 0; padding: 0;\n\
					overflow: hidden;\n\
				}\n\
				#body_pane {\n\
					overflow: auto;\n\
					background: white;\n\
					position: relative;\n\
					left: 0px; top: 0px;\n\
					width: 100%; height: 100%;\n\
					z-index: 100;\n\
					margin: 0; padding: 0;\n\
				} \n\
				#popup_pane {\n\
					position: absolute;\n\
					left: 0px; top: 0px;\n\
					width: 100%; height: 0px;\n\
					visibility:visible;\n\
					z-index: 9000;\n\
					margin: 0; padding: 0;\n\
					border: none;\n\
				}\n\
				#modal_pane {\n\
					background-image: none;\n\
					background-color: ' + _modalColour + ';\n\
					cursor: no-drop;\n\
					position: absolute;\n\
					z-index: 800;\n\
					width: 100%;\n\
					height: 100%;\n\
					margin: 0px;\n\
					opacity: ' + _modalOpacity + ';\n\
					filter: progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=' + _modalOpacity + ');\n\
					display: none;\n\
				}\n\
				#modal_pane iframe {\n\
					position: absolute;\n\
					width: 100%;\n\
					heght: 100%;\n\
					filter: progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=' + _modalOpacity + ');\n\
				}\n\
				p {\n\
					margin: 0; padding: 1px 0;\n\
				}\n\
				</style>\n\
			';
			document.body.innerHTML = html;
			//jQuery('#modal_pane').css('opacity', '0.44');
			jQuery('#body_pane').delegate('a, :input', "focus", focusBodyPane);
			jQuery('#modal_pane').click(function() {
				if (_modalStatus && !_this.modalInUse()) {
					window.setTimeout(function() {
						modalHide({ type: effect, speed: speed * 2 });
					}, _modalDelay);
				}
			});
			_setupComplete = true;
		}
		else if (!_setupComplete) {
			if (_isIE6) {
				var bgColour = (_modalColour.charAt(0) == "#") ? _modalColour : '#000';
				jQuery('#modal_pane')
					.css('filter', 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=' + (_modalOpacity * 100) + ')')
					.html('<iframe src="/blank.htm' + bgColour + '" style="position: absolute;" frameBorder="0" scrolling="no"></IFRAME>');
				//.css('filter', 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=' + (_modalOpacity * 100) + ')')
				//.html('<iframe src="/blank.htm' + bgColour + '" style="position: absolute; height: ' + (jQuery('#body_pane').height()) + 'px;" frameBorder="0" scrolling="no"></IFRAME>');
			}
			else if (_iPad) {
				jQuery('#modal_pane')
                    .css('width', self.innerWidth)
                    .css('height', self.innerHeight)
                    .add('#popup_pane')
                    .css('position', 'absolute');

				jQuery(window).scroll(function() {
					//console.log('scrollTop: ' + jQuery(document).scrollTop());
					this.modalToCentre();
				});
				jQuery('#popup_pane, #modal_pane').css('top');
			}
			else {
				jQuery('#modal_pane').css('opacity', _modalOpacity).css('-ie-opacity:', (_modalOpacity * 100))
			}
			//jQuery('#modal_pane').css('opacity', '0.44');
			jQuery('#body_pane').delegate('a, :input', "focus", focusBodyPane);
			jQuery('#modal_pane').click(function() {
				if (_modalStatus && !_this.modalInUse()) {
					window.setTimeout(function() {
						modalHide();
					}, _modalDelay);
				}
			});
			_setupComplete = true;
		}
	}

};
//						/* filter: progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=' + _modalOpacity * 100 + '); */\n\

/***********************************************/
