/*
 * jQuery PPR-Form Plugin
 *
 * @requires jQuery v1.2.2 or later
 * @requires jQuery Form Plugin
 *
 */
;(function($) {
	$.fn.pprForm = function(eventId) {
		if (!this.length) {
			return this;
		}

		var options = {
			beforeSend: function(xhr) {prepareRequest(xhr, eventId);},
			complete: handleResponse
		};

		this.ajaxForm(options);
		return this;
	};

        $.fn.pprChange = function(form, eventId, triggerKey, triggerVal) {
		if (!this.length) {
			return this;
		}

                if(!!$(this).data('ppr-change')) {
                    return;
                }

                $(this).data('ppr-change','done');

		var options = {
                        dataType: 'xml',
			beforeSend: function(xhr) {prepareRequest(xhr, eventId);},
			complete: handleResponse
		};

		this.change(function(e) {
			e.preventDefault();

			var trigger;

			if (!!triggerKey) {
				triggerVal = triggerVal || triggerKey;
				trigger = $('<input type="hidden" name="' + triggerKey + '" value="' + triggerVal + '" />').appendTo(form);
			}

			$(form).ajaxSubmit(options);

			if (!!trigger) {
				trigger.remove();
			}
		});

		return this;
	};

	$.fn.pprClick = function(form, eventId, triggerKey, triggerVal) {
		if (!this.length) {
			return this;
		}

                if(!!$(this).data('ppr-click')) {
                    return;
                }

                $(this).data('ppr-click','done');

		var options = {
                        dataType: 'xml',
			beforeSend: function(xhr) {prepareRequest(xhr, eventId);},
			complete: handleResponse
		};

		this.click(function(e) {
			e.preventDefault();

			var trigger;

			if (!!triggerKey) {
				triggerVal = triggerVal || triggerKey;
				trigger = $('<input type="hidden" name="' + triggerKey + '" value="' + triggerVal + '" />').appendTo(form);
			}

			$(form).ajaxSubmit(options);

			if (!!trigger) {
				trigger.remove();
			}
		});

		return this;
	};


	function prepareRequest(xhr, eventId) {
		if (!eventId) {
			return;
		}

		xhr.setRequestHeader("Ppr-Event", eventId);
	}

	function handleResponse(xhr, statuscode) {
            var responseXml = xhr.responseXML;
                for(i = 0; i < responseXml.documentElement.childNodes.length; i++) {
                        var node = responseXml.documentElement.childNodes[i];
                        if (node.nodeName == "fragment") {
                            var fragmentHtml = $(node.firstChild.data);
                            fragmentHtml.each(function(idx, el){
                                var updateElement = $('#' + $(el).attr('id').replace(/(\:)/g, "\\$1"));
                                updateElement.replaceWith(el);
                            });
                        } else if (node.nodeName == "script") {
                            try {
                                eval(node.firstChild.data);
                            } catch(ex) {
                                if(typeof console != "undefined") {
                                    console.log(ex);
                                }
                            }
                        } else if (node.nodeName == "exception") {
                            alert("Er is een exceptie opgetreden op de server: " + node.firstChild.data);
                        }
                }
	}
})(jQuery);
