// date dropdown widget
dojo.require("dijit.form.DateTextBox");
dojo.require("dojo.cookie");

/** 
 * ajax functionality for the dds search form
 */
dojo.declare( "DDS_SearchForm", null, {
	// summary:
	//	JS Extensions for the documents search form
	// description:
	// 	Ajax search, automatic search, dynamic loading of adv. searchform, ...
	
	automaticSearch: {
		// automatic search enabled?
		enabled: true,
		// how long to wait in ms for new user input before form submit is called.
		timeout: 500
	},
	
	waitingText: {
		nodeId: "DDS_Form_Searching_Indicator",
		wrapper: "<div class=\"box\">${text}</div>",
		error_wrapper: "<div class=\"error\">${text}</div>",
		results: '<p>Loading search results, please wait...</p>',
		searchform: '<p>Updating search form, please wait...</p>'
	},
	
	formId: "DDS_Form",
		
	constructor: function(id) {
		this.formId = id || this.formId;
		dojo.addOnLoad(this, "init");
	},
	
	init: function() {
		this.connectFormClickHandlers();
		dojo.connect(dojo.byId(this.formId), "submit", this, this.executeAjaxSubmit);
		this.initAutomaticSearch();
		this.initDateFields();
		
		dojo.subscribe("dds_form_html_update", this, function(node) {
			dojo.parser.parse(node);
			dojo.removeClass(node, 'loading');
			this.connectFormClickHandlers(node);
			this.initDateFields(node);
		});
	},
	
	// function which tries to get the "site and user id" - hash from the respective meta element
	getSiteAndUserIdHash: function() {
		var meta_tags = document.getElementsByTagName("meta");
		for(i=0; i < meta_tags.length; i++) {
		  if (meta_tags[i].getAttribute("name") == "SiteAndUserIdHash") {
			return meta_tags[i].getAttribute("content");
		  }
		}
		return " ";
	},
	
	connectFormClickHandlers: function(p) {
		var parent = this.formId;
		if (p) parent = p;
		dojo.query('input[type="submit"]', parent).connect("click", this, this.formButtonClick);
		dojo.query('#documents_table input[type="submit"]').connect("click", this, this.documents_tableButtonClick);
		dojo.query('.title_starts_with input[type="submit"]', parent).connect("click", this, this.titleStartsWithButtonClick);
		dojo.query('.limit_selector', parent).connect("click", this, this.paginationLimitButtonClick);
	},
	
	_lastButtonClick: null,
	formButtonClick: function(e) {
		// When clientX and Y are zero assume that user has pressed "Enter" to submit the form -> don't add button value to ajax request
		if (e.clientX > 0 && e.clientY > 0) {
			this._lastButtonClick = e.target;
		}
	},
	
	documents_tableButtonClick: function(e) {
		// button clicks inside #documents_table never change the searchform, therefore disable searchform rendering in this case.
		var formstate_input = dojo.query("#documents_form_state input")[0];
		formstate_input.value = formstate_input.value.replace('"ShowSearchForm":true', '"ShowSearchForm":false');
	},
	
	paginationLimitButtonClick: function(e) {
		this._setLimitCookie(e.target.value);
	},
	
	_setLimitCookie: function(value) {
		dojo.cookie("ddsOptionsLimit", value, {
			expires: 1000,
			path: "/"
		});
		console.info("Cookie ddsOptionsLimit set to "+value);
	},
	
	titleStartsWithButtonClick: function(e) {
		dojo.byId("TitleStartsWith_Hidden").value = e.target.value;
		dojo.query("td.active", e.target.parentNode.parentNode.parentNode).forEach(function(element) {
			dojo.removeClass(element, "active");
		});
		dojo.addClass(e.target.parentNode, "active");
	},
	
	showWaitingDiv: function(e) {			
		var content_text = "";
		var target_node = null;
		
		var submit_button_name = "";
		if (this._lastButtonClick != null) submit_button_name = this._lastButtonClick.name
		
		switch (submit_button_name) {
			case "SearchForm_Change_ShowAdvanced":
				content_text = this.waitingText.searchform;
				target_node = dojo.byId("documents_searchform");
				dojo.addClass(target_node, "loading");
				break;

			default:
				content_text = this.waitingText.results;				
				target_node = dojo.byId("documents_table");
				dojo.addClass(target_node, "loading");
				break;
		}
		var node = document.createElement("div");
		node.id = this.waitingText.nodeId;
		node.innerHTML = dojo.string.substitute(this.waitingText.wrapper, {
			text: content_text
		});
		dojo.place(node, target_node, "first");
	},
	
	current_xhr_request: null,
	
	executeAjaxSubmit: function(e) {
		if (this.current_xhr_request != null) {
			this.current_xhr_request.cancel();
			this.current_xhr_request = null;
		}
			
		// stop default submit event
		dojo.stopEvent(e);
		
		// display "waiting..." div
		this.showWaitingDiv(e);
		
		var xhr_request = {
			url: "/documents/webservice/dds_ws.ashx",
			form: this.formId,
			headers: {
				"DDS-Request-Type": "ajax/documents",
				"DDS-Return-Type": "ajax/json",
				"SiteAndUserIdHash": this.getSiteAndUserIdHash()
			},
			content : {},
			handleAs: "json",
			handle: this.ajaxLoadHandler
		};
			
		if (this._lastButtonClick != null) {
			xhr_request["content"][this._lastButtonClick.name] = this._lastButtonClick.value;
		}
				
		// do http request
		this.current_xhr_request = dojo.xhrPost(xhr_request);
				
		this._lastButtonClick = null;
	},
	
	ajaxLoadHandler: function(response, ioArgs) {
		// todo: get the "dds_searchform_obj" calls working with "this" (current object) somehow...
	
		// error
		if (response instanceof Error) {
			if (response.dojoType != null && response.dojoType == "cancel") {
				dojo.byId(dds_searchform_obj.waitingText.nodeId).innerHTML = "";
				return;
			}
			var msg = "Ajax-error: " + response.message;
			console.error(msg);
			console.debug(response);
			dojo.byId(dds_searchform_obj.waitingText.nodeId).innerHTML = dojo.string.substitute(dds_searchform_obj.waitingText.error_wrapper, { text: msg });
		}
		
		// success
		else {
			dds_searchform_obj.ajaxLoadSuccess(response, ioArgs);
		}
	},
	
	ajaxLoadSuccess: function (response, ioArgs) {
		console.info("Ajax request was successful.");
		for (var i=0; i<response.length; i++) {
			if (response[i] != null) {
				try {
					var node = dojo.byId(response[i].id);
					if (node != null) {
						node.innerHTML = response[i].content;
						node.innerHTML = node.childNodes[0].innerHTML;
						
						dojo.publish('dds_form_html_update', [node]);
					}
				}
				catch(error) {
					console.error(error);
				}
			}
		}
	},

	initAutomaticSearch: function() {
		if (this.automaticSearch.enabled === true) {
			// TODO...
			/*var searchstring = dojo.byId("SearchString");
			var eventtimer = null;
			dojo.connect(searchstring, "onkeyup", this, function(e) {
				if (searchstring.value.length >= 3) {
					if (eventtimer != null) clearTimeout(eventtimer);
					tmp_form_event = e;
					eventtimer = setTimeout("dojo.byId(\"" + this.formId + "\").submit(tmp_form_event)", this.automaticSearch.timeout);
				}
			});*/
		}
	},
	
	initDateFields: function(parent) {
		for (var i in this.widgets) {
			var widget = this.widgets[i];
			var test = dojo.query('#' + widget.dom_id, parent);
			if (!parent || test.length > 0) {
				this.initDateField(widget);
			}
		}
	},
	
	widgets: [{
			dom_id: "releaseDateString",
			widget_instance: null,
			widget_args: {
				name: "releaseDateString",
				datePattern: "yy-mm-dd"
			}
		},{
			dom_id: "revisionDateString",
			widget_instance: null,
			widget_args: {
				name: "revisionDateString",
				datePattern: "yy-mm-dd"
			}
		}
	],
	
	// init a dojo date dropdown
	initDateField: function(widget_obj) {
		// check that dom_id property is set
		if (widget_obj.dom_id != null) {	
			// load dom node (input)
			var input_node = dojo.byId(widget_obj.dom_id);
			
			// check we found something
			if (input_node != null) {
				if (dojo.hasClass(input_node, 'dijitReset')) {
					//console.log("DateTextBox Widget already initialised for #" + widget_obj.dom_id);
				}
				else {
					// destroy existing widget
					if (widget_obj.widget_instance != null) {
						widget_obj.widget_instance.destroy();
					}
					
					widget_obj.widget_instance = new dijit.form.DateTextBox(widget_obj.widget_args, input_node);
					
					var old_date_value = input_node.value;
					if (old_date_value != "0001-01-01") {
						var old_date = new Date();
						var year = old_date_value.substring(0,4);
						var month = old_date_value.substring(5,7);
						var day = old_date_value.substring(8,10);
						old_date.setYear(year);
						old_date.setMonth(month-1);
						old_date.setDate(day);
						widget_obj.widget_instance.setValue(old_date);
					}
					console.info("DateTextBox Widget initialised for #" + widget_obj.dom_id);
				}
			}
			else {
				//console.log("Nothing found with with id " + widget_obj.dom_id + "... cannot init date field.");
			}
		}
		else {
			console.error("Invalid widget_obj in DDS_SearchForm.initDateField()");
		}
	}
});

// create new dds ajax object
var dds_searchform_obj = new DDS_SearchForm("DDS_Form");

function DDS_Pagination_applyPaginationEvents(parent) {
	dojo.query(".pagination .pagination_options span.button", parent).connect("click", function(evt) {
		var node = evt.target.parentNode;
		if (dojo.hasClass(node, "hover")) dojo.removeClass(node, "hover");
		else dojo.addClass(node, "hover");
	});
}
dojo.addOnLoad(DDS_Pagination_applyPaginationEvents);
dojo.subscribe('dds_form_html_update', DDS_Pagination_applyPaginationEvents);

function DDS_AdvancedForm_StopReload(parent) {
	// find advanced form fieldset
	dojo.query("fieldset.advanced", parent).forEach(function(node) {
		// advanced form is not hidden
		if (!dojo.hasClass(node, "hidden")) {
			// connect onclick handler for "advanced searchform button"
			dojo.query("#searchform_toggle_advanced").connect("click", function(evt) {
				var advanced_form = evt.currentTarget.parentNode.parentNode;
				var formstate_input = dojo.query("#documents_form_state input")[0];

				// if the advanced form is hidden, then show it
				if (dojo.hasClass(advanced_form, "hidden")) {
					dojo.removeClass(advanced_form, "hidden");
					formstate_input.value = formstate_input.value.replace('"SearchForm_ShowAdvanced":false', '"SearchForm_ShowAdvanced":true');
					console.info("Advanced searchform shown.");
				}
				// else hide the advanced form
				else {
					dojo.addClass(advanced_form, "hidden");
					formstate_input.value = formstate_input.value.replace('"SearchForm_ShowAdvanced":true', '"SearchForm_ShowAdvanced":false');
					console.info("Advanced searchform hidden.");
				}
				
				// stop the default event (form submission)
				dojo.stopEvent(evt);
			});
		}
	});
}
dojo.addOnLoad(DDS_AdvancedForm_StopReload);
dojo.subscribe('dds_form_html_update', DDS_AdvancedForm_StopReload);
