dojo.declare( "DDS_Popup", null, {

	document_info_url: "/documents/info.asp?",
	fetch_info_url: "/documents/webservice/fetch.ashx?",
	document_info_ajax_url: "/documents/info.asp?ajax=1&",
		
	// the container node which to look for a links in
	parent_container: null,
	
	// the current popup node (if there is one)
	current_popup: null,
	
	constructor: function() {
		dojo.require("dijit.Dialog");	
		dojo.require("dojo.io.script");

		dojo.addOnLoad(this, "init");
	},
	
	// load jquery media stuff	
	loadjQueryLibrary: function() {
		dojo.io.script.get({
			url:"http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js",
			checkString:'jQuery', // if "jQuery" is defined than script is loaded
			load: function(res,io) {
				dojo.io.script.get( { url: "/documents/scripts/jquery.media.js" });
			}
		});
	},
	
	init: function(parent_node) {
		this.loadjQueryLibrary();
			
		// transform links to popups
		this.transformLinksToPopups();
		
		// update popup links after ajax updates
		dojo.subscribe('dds_form_html_update', this, function(node) {
			var old_parent = this.parent_container;
			this.parent_container = node;
			this.transformLinksToPopups();
			this.parent_container = old_parent;
		});
	},

	showDocumentInfoPopup: function (click_event) {
		if (click_event == null) {
			console.error("Invalid node in DDS_Popup.showDocumentInfoPopup(), Event: " + click_event);
		}
		else {
			// stop default link event
			dojo.stopEvent(click_event);
			// create popup div
			var popup_node = this.createPopupDiv(click_event.currentTarget);
			// get ajax url
			var target_url = this.getAjaxUrl(click_event.currentTarget.href);
			
			var args = {
				title: "Document details",
				href: target_url
			};
			
			this.showPopup(args, popup_node);
		}
	},
	
	showFetchPopup: function(click_event) {
		if (click_event == null) {
			console.error("Invalid node in DDS_Popup.showFetchPopup(), Event: " + click_event);
		}
		else {
			// stop default link event
			dojo.stopEvent(click_event);
			// create popup div
			var popup_node = this.createPopupDiv(click_event.currentTarget);
			// get ajax url
			var target_url = click_event.currentTarget.href + "&embed=true";
			
			var args = {
				href: target_url
			};
			
			this.showPopup(args, popup_node);
		}
	},
	
	showDocumentUploadPopup: function(click_event) {
		if (click_event == null) {
			console.error("Invalid node in DDS_Popup.showDocumentUploadPopup(), Event: " + click_event);
		}
		else {
			// stop default link event
			dojo.stopEvent(click_event);
			// create popup div
			var popup_node = this.createPopupDiv(click_event.currentTarget);
			// get ajax url
			var target_url = click_event.currentTarget.href;
			
			var args = {
				href: target_url,
				onDownloadEnd: function() {
					console.debug('pop dl end');
					dojo.publish("DDS_Popup_DocumentUpload_Open", [this]);
				}
			};
			
			this.showPopup(args, popup_node);
		}
	},
	
	showPopup: function(args, parent) {
		if (!parent || !args || !args.href) {
			console.error("showPopup(): args parameter invalid/no url given.");
		}
		else {
			// close old popups
			this.closeCurrentPopup();
			
			// set common arguments
			if (!args.loadingMessage) args.loadingMessage = "<span class='loading'>Loading...</span>";
			if (!args.templateString) args.templateString = '<div class="dijitDialog" tabindex="-1" waiRole="dialog" waiState="labelledby-${id}_title">\r\n <div dojoAttachPoint="titleBar" class="dijitDialogTitleBar">\r\n <span dojoAttachPoint="titleNode" class="dijitDialogTitle" id="${id}_title">${title}</span>\r\n <span dojoAttachPoint="closeButtonNode" class="dijitDialogCloseIcon" dojoAttachEvent="onclick: onCancel">\r\n <span dojoAttachPoint="closeText" class="closeText">x</span>\r\n </span>\r\n </div>\r\n <div dojoAttachPoint="containerNode" class="dijitDialogPaneContent"></div>\r\n<span class="popup_close_bar" dojoAttachPoint="closeButtonNode" class="dijitDialogCloseIcon" dojoAttachEvent="onclick: onCancel" title=\"Click to close this popup\">Close</span></div>\r\n';
					
			// create popup content pane
			this.current_popup = new dijit.Dialog(args, parent);		
			this.current_popup.setAttribute("class", "documentInfoPopup");

			// insert mediaplayer(s) after the content has finished downloading
			dojo.connect(this.current_popup, "onDownloadEnd", function() {
				jQuery.fn.media.defaults.flvPlayer = '/documents/scripts/mediaplayer.swf';
				jQuery.fn.media.defaults.mp3Player = '/documents/scripts/mediaplayer.swf';
				
				jQuery('#fetch_media_player_wrapper a.media').media({
					caption: false,
					width: 670,
					height: 420,
					autoplay: true
				});
			});
			
			// destroy popup when it's closed
			dojo.connect(this.current_popup, "onCancel", this, this.closeCurrentPopup);

			// setup and show the popup
			this.current_popup.startup();
			this.current_popup.show();
		}
	},
	
	closeCurrentPopup: function() {
		this.closePopup(this.current_popup);
	},
	
	closePopup: function(node) {
		if (node instanceof dijit._Widget) {
			// destroy the widget...
			// this also destroys the parent container (the div created by this.createPopupDiv())
			node.destroyRecursive(); 
			console.info("Popup closed: " + node.id);
			node = null;
		}
	},
	
	getAjaxUrl: function(link_href) {
		var ajaxurl = link_href.replace(this.document_info_url, this.document_info_ajax_url);
		return ajaxurl;
	},
	
	createPopupDiv: function(reference_node) {
		var popup_node = document.createElement("div");
		dojo.place(popup_node, reference_node, "after");
		return popup_node;
	},
	
	checkParentContainer: function() {
		if (this.parent_container == null) this.parent_container = dojo.byId("documents_table");
		if (this.parent_container == null) this.parent_container = dojo.byId("DDS_Form");
		if (this.parent_container == null) this.parent_container = dojo.byId("tbmainLayout");
		if (this.parent_container == null) this.parent_container = dojo.byId("pageTable");
		if (this.parent_container == null) this.parent_container = dojo.byId("document_info");
		if (this.parent_container == null) {
			console.error("No parent container found. No links transformed into popups.");
			return;
		}
	},
	
	// attaches event handlers to all links pointing to documentsInfo in order to be opened up in popups
	transformLinksToPopups: function () {
		this.checkParentContainer();		
		
		var obj = this;
		var count = 0;
		dojo.query("a", this.parent_container).forEach(function(node) {
			if (node.href != null) {
				if (node.href.indexOf(obj.document_info_url) >= 0) {
					dojo.connect(node, "click", obj, obj.showDocumentInfoPopup);
					count++;
				}
				else if (dojo.hasClass(node, "popup") && node.href.indexOf(obj.fetch_info_url) >= 0) {
					dojo.connect(node, "click", obj, obj.showFetchPopup);
					count++;
				}
			}
		});
		
		dojo.query("#documents_upload_button").connect("click", obj, obj.showDocumentUploadPopup);
		
		if (count > 0) console.info("Transformed " + count + " links to popups.");
	}
});

var dds_popup = new DDS_Popup();

// wrappers for old functions
function highlightRow(node, state) { console.warn("function highlightRow() not deprecated..."); }
function showImage(image_url) { console.warn("function showImage() is deprecated..."); }
function show_image (image_url) { console.warn("function show_image() is deprecated..."); }
function returnShowImage (image_url) { console.warn("function returnShowImage() is deprecated..."); }
