/*
 * Metadata - jQuery plugin for parsing metadata from elements
 *
 * Copyright (c) 2006 John Resig, Yehuda Katz, Jï¿½Ã¶rn Zaefferer, Paul McLanahan
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id$
 *
 */

/**
 * Sets the type of metadata to use. Metadata is encoded in JSON, and each property
 * in the JSON will become a property of the element itself.
 *
 * There are three supported types of metadata storage:
 *
 *   attr:  Inside an attribute. The name parameter indicates *which* attribute.
 *
 *   class: Inside the class attribute, wrapped in curly braces: { }
 *
 *   elem:  Inside a child element (e.g. a script tag). The
 *          name parameter indicates *which* element.
 *
 * The metadata for an element is loaded the first time the element is accessed via jQuery.
 *
 * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements
 * matched by expr, then redefine the metadata type and run another $(expr) for other elements.
 *
 * @name $.metadata.setType
 *
 * @example <p id="one" class="some_class {item_id: 1, item_label: 'Label'}">This is a p</p>
 * @before $.metadata.setType("class")
 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
 * @desc Reads metadata from the class attribute
 *
 * @example <p id="one" class="some_class" data="{item_id: 1, item_label: 'Label'}">This is a p</p>
 * @before $.metadata.setType("attr", "data")
 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
 * @desc Reads metadata from a "data" attribute
 *
 * @example <p id="one" class="some_class"><script>{item_id: 1, item_label: 'Label'}</script>This is a p</p>
 * @before $.metadata.setType("elem", "script")
 * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label"
 * @desc Reads metadata from a nested script element
 *
 * @param String type The encoding type
 * @param String name The name of the attribute to be used to get metadata (optional)
 * @cat Plugins/Metadata
 * @descr Sets the type of encoding to be used when loading metadata for the first time
 * @type undefined
 * @see metadata()
 */

(function($) {

$.extend({
	metadata : {
		defaults : {
			type: 'class',
			name: 'metadata',
			cre: /({.*})/,
			single: 'metadata'
		},
		setType: function( type, name ){
			this.defaults.type = type;
			this.defaults.name = name;
		},
		get: function( elem, opts ){
			var settings = $.extend({},this.defaults,opts);
			// check for empty string in single property
			if ( !settings.single.length ) settings.single = 'metadata';

			var data = $.data(elem, settings.single);
			// returned cached data if it already exists
			if ( data ) return data;

			data = "{}";

			if ( settings.type == "class" ) {
				var m = settings.cre.exec( elem.className );
				if ( m )
					data = m[1];
			} else if ( settings.type == "elem" ) {
				if( !elem.getElementsByTagName )
					return undefined;
				var e = elem.getElementsByTagName(settings.name);
				if ( e.length )
					data = $.trim(e[0].innerHTML);
			} else if ( elem.getAttribute != undefined ) {
				var attr = elem.getAttribute( settings.name );
				if ( attr )
					data = attr;
			}

			if ( data.indexOf( '{' ) <0 )
			data = "{" + data + "}";

			data = eval("(" + data + ")");

			$.data( elem, settings.single, data );
			return data;
		}
	}
});

/**
 * Returns the metadata object for the first member of the jQuery object.
 *
 * @name metadata
 * @descr Returns element's metadata object
 * @param Object opts An object contianing settings to override the defaults
 * @type jQuery
 * @cat Plugins/Metadata
 */
$.fn.metadata = function( opts ){
	return $.metadata.get( this[0], opts );
};

})(jQuery);

/* url parser */
jQuery.url = function()
{
	var segments = {};

	var parsed = {};

	/**
    * Options object. Only the URI and strictMode values can be changed via the setters below.
    */
  	var options = {

		url : window.location, // default URI is the page in which the script is running

		strictMode: false, // 'loose' parsing by default

		key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], // keys available to query

		q: {
			name: "queryKey",
			parser: /(?:^|&)([^&=]*)=?([^&]*)/g
		},

		parser: {
			strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,  //less intuitive, more accurate to the specs
			loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // more intuitive, fails on relative paths and deviates from specs
		}

	};

    /**
     * Deals with the parsing of the URI according to the regex above.
 	 * Written by Steven Levithan - see credits at top.
     */
	var parseUri = function()
	{
		str = decodeURI( options.url );

		var m = options.parser[ options.strictMode ? "strict" : "loose" ].exec( str );
		var uri = {};
		var i = 14;

		while ( i-- ) {
			uri[ options.key[i] ] = m[i] || "";
		}

		uri[ options.q.name ] = {};
		uri[ options.key[12] ].replace( options.q.parser, function ( $0, $1, $2 ) {
			if ($1) {
				uri[options.q.name][$1] = $2;
			}
		});

		return uri;
	};

    /**
     * Returns the value of the passed in key from the parsed URI.
  	 *
	 * @param string key The key whose value is required
     */
	var key = function( key )
	{
		if ( ! parsed.length )
		{
			setUp(); // if the URI has not been parsed yet then do this first...
		}
		if ( key == "base" )
		{
			if ( parsed.port !== null && parsed.port !== "" )
			{
				return parsed.protocol+"://"+parsed.host+":"+parsed.port+"/";
			}
			else
			{
				return parsed.protocol+"://"+parsed.host+"/";
			}
		}

		return ( parsed[key] === "" ) ? null : parsed[key];
	};

	/**
     * Returns the value of the required query string parameter.
  	 *
	 * @param string item The parameter whose value is required
     */
	var param = function( item )
	{
		if ( ! parsed.length )
		{
			setUp(); // if the URI has not been parsed yet then do this first...
		}
		return ( parsed.queryKey[item] === null ) ? null : parsed.queryKey[item];
	};

    /**
     * 'Constructor' (not really!) function.
     *  Called whenever the URI changes to kick off re-parsing of the URI and splitting it up into segments.
     */
	var setUp = function()
	{
		parsed = parseUri();

		getSegments();
	};

    /**
     * Splits up the body of the URI into segments (i.e. sections delimited by '/')
     */
	var getSegments = function()
	{
		var p = parsed.path;
		segments = []; // clear out segments array
		segments = parsed.path.length == 1 ? {} : ( p.charAt( p.length - 1 ) == "/" ? p.substring( 1, p.length - 1 ) : path = p.substring( 1 ) ).split("/");
	};

	return {

	    /**
	     * Sets the parsing mode - either strict or loose. Set to loose by default.
	     *
	     * @param string mode The mode to set the parser to. Anything apart from a value of 'strict' will set it to loose!
	     */
		setMode : function( mode )
		{
			strictMode = mode == "strict" ? true : false;
			return this;
		},

		/**
	     * Sets URI to parse if you don't want to to parse the current page's URI.
		 * Calling the function with no value for newUri resets it to the current page's URI.
	     *
	     * @param string newUri The URI to parse.
	     */
		setUrl : function( newUri )
		{
			options.url = newUri === undefined ? window.location : newUri;
			setUp();
			return this;
		},

		/**
	     * Returns the value of the specified URI segment. Segments are numbered from 1 to the number of segments.
		 * For example the URI http://test.com/about/company/ segment(1) would return 'about'.
		 *
		 * If no integer is passed into the function it returns the number of segments in the URI.
	     *
	     * @param int pos The position of the segment to return. Can be empty.
	     */
		segment : function( pos )
		{
			if ( ! parsed.length )
			{
				setUp(); // if the URI has not been parsed yet then do this first...
			}
			if ( pos === undefined )
			{
				return segments.length;
			}
			return ( segments[pos] === "" || segments[pos] === undefined ) ? null : segments[pos];
		},

		attr : key, // provides public access to private 'key' function - see above

		param : param // provides public access to private 'param' function - see above

	};

}();

/*
 * Auto Expanding Text Area (1.2.2)
 * by Chrys Bader (www.chrysbader.com)
 * chrysb@gmail.com
 *
 * Special thanks to:
 * Jake Chapa - jake@hybridstudio.com
 * John Resig - jeresig@gmail.com
 *
 * Copyright (c) 2008 Chrys Bader (www.chrysbader.com)
 * Licensed under the GPL (GPL-LICENSE.txt) license.
 *
 *
 * NOTE: This script requires jQuery to work.  Download jQuery at www.jquery.com
 *
 */

(function(jQuery) {

	var self = null;

	jQuery.fn.autogrow = function(o)
	{
		return this.each(function() {
			new jQuery.autogrow(this, o);
		});
	};


    /**
     * The autogrow object.
     *
     * @constructor
     * @name jQuery.autogrow
     * @param Object e The textarea to create the autogrow for.
     * @param Hash o A set of key/value pairs to set as configuration properties.
     * @cat Plugins/autogrow
     */

	jQuery.autogrow = function (e, o)
	{
		this.options		  	= o || {};
		this.dummy			  	= null;
		this.interval	 	  	= null;
		this.line_height	  	= this.options.lineHeight || parseInt(jQuery(e).css('line-height'));
		this.min_height		  	= this.options.minHeight || parseInt(jQuery(e).css('min-height'));
		this.max_height		  	= this.options.maxHeight || parseInt(jQuery(e).css('max-height'));;
		this.textarea		  	= jQuery(e);

		if(this.line_height == NaN)
		  this.line_height = 0;

		// Only one textarea activated at a time, the one being used
		this.init();
	};

	jQuery.autogrow.fn = jQuery.autogrow.prototype = {
    autogrow: '1.2.2'
  };

 	jQuery.autogrow.fn.extend = jQuery.autogrow.extend = jQuery.extend;

	jQuery.autogrow.fn.extend({

		init: function() {
			var self = this;
			this.textarea.css({overflow: 'hidden', display: 'block'});
			this.textarea.bind('focus', function() { self.startExpand() } ).bind('blur', function() { self.stopExpand() });
			this.checkExpand();
		},

		startExpand: function() {
		  var self = this;
			this.interval = window.setInterval(function() {self.checkExpand()}, 400);
		},

		stopExpand: function() {
			clearInterval(this.interval);
		},

		checkExpand: function() {

			if (this.dummy == null)
			{
				this.dummy = jQuery('<div></div>');
				this.dummy.css({
												'font-size'  : this.textarea.css('font-size'),
												'font-family': this.textarea.css('font-family'),
												'width'      : this.textarea.css('width'),
												'padding'    : this.textarea.css('padding'),
												'line-height': this.line_height + 'px',
												'overflow-x' : 'hidden',
												'position'   : 'absolute',
												'top'        : 0,
												'left'		 : -9999
												}).appendTo('body');
			}

			// Strip HTML tags
			var html = this.textarea.val().replace(/(<|>)/g, '');

			// IE is different, as per usual
			if ($.browser.msie)
			{
				html = html.replace(/\n/g, '<BR>new');
			}
			else
			{
				html = html.replace(/\n/g, '<br>new');
			}

			if (this.dummy.html() != html)
			{
				this.dummy.html(html);

				if (this.max_height > 0 && (this.dummy.height() + this.line_height > this.max_height))
				{
					this.textarea.css('overflow-y', 'auto');
				}
				else
				{
					this.textarea.css('overflow-y', 'hidden');
					if (this.textarea.height() < this.dummy.height() + this.line_height || (this.dummy.height() < this.textarea.height()))
					{
						this.textarea.animate({height: (this.dummy.height() + this.line_height) + 'px'}, 100);
					}
				}
			}
		}

	 });
})(jQuery);

/*
 * jQuery AjaxQ - AJAX request queueing for jQuery
 *
 * Version: 0.0.1
 * Date: July 22, 2008
 *
 * Copyright (c) 2008 Oleg Podolsky (oleg.podolsky@gmail.com)
 * Licensed under the MIT (MIT-LICENSE.txt) license.
 *
 * http://plugins.jquery.com/project/ajaxq
 * http://code.google.com/p/jquery-ajaxq/
 */
(function($) {
	jQuery.ajaxq = function(queue, options) {
		// Initialize storage for request queues if it's not initialized yet
		if (typeof document.ajaxq == "undefined") document.ajaxq = {q:{}, r:null};

		// Initialize current queue if it's not initialized yet
		if (typeof document.ajaxq.q[queue] == "undefined") document.ajaxq.q[queue] = [];

		if (typeof options != "undefined") // Request settings are given, enqueue the new request
		{
			// Copy the original options, because options.complete is going to be overridden

			var optionsCopy = {};
			for (var o in options) optionsCopy[o] = options[o];
			options = optionsCopy;

			// Override the original callback

			var originalCompleteCallback = options.complete;

			options.complete = function (request, status)
			{
				// Dequeue the current request
				document.ajaxq.q[queue].shift ();
				document.ajaxq.r = null;

				// Run the original callback
				if (originalCompleteCallback) originalCompleteCallback (request, status);

				// Run the next request from the queue
				if (document.ajaxq.q[queue].length > 0) document.ajaxq.r = jQuery.ajax (document.ajaxq.q[queue][0]);
			};

			// Enqueue the request
			document.ajaxq.q[queue].push (options);

			// Also, if no request is currently running, start it
			if (document.ajaxq.q[queue].length == 1) document.ajaxq.r = jQuery.ajax (options);
		}
		else // No request settings are given, stop current request and clear the queue
		{
			if (document.ajaxq.r)
			{
				document.ajaxq.r.abort ();
				document.ajaxq.r = null;
			}

			document.ajaxq.q[queue] = [];
		}
	};
})();



/**
 * screenheight, return the actual height of the current window, returns scrollheight if that is bigger than the screen height
 */
(function($) {
	jQuery.screenheight = function() {
		if (jQuery.browser.msie && jQuery.browser.version < 7) {
			var scrollHeight = Math.max(
				document.documentElement.scrollHeight,
				document.body.scrollHeight
			);
			var offsetHeight = Math.max(
				document.documentElement.offsetHeight,
				document.body.offsetHeight
			);

			if (scrollHeight < offsetHeight) {
				return jQuery(window).height() + 'px';
			} else {
				return scrollHeight + 'px';
			}
		// handle "good" browsers
		} else {
			return jQuery(document).height() + 'px';
		}
	};
})();


/**
 * screenwidth return the actual width of the current window, returns scrollwidth if that is bigger than the screen width
 */
(function($) {
	jQuery.screenwidth = function() {
		// handle IE 6
		if (jQuery.browser.msie && jQuery.browser.version < 7) {
			var scrollWidth = Math.max(
				document.documentElement.scrollWidth,
				document.body.scrollWidth
			);
			var offsetWidth = Math.max(
				document.documentElement.offsetWidth,
				document.body.offsetWidth
			);

			if (scrollWidth < offsetWidth) {
				return jQuery(window).width() + 'px';
			} else {
				return scrollWidth + 'px';
			}
		// handle "good" browsers
		} else {
			return jQuery(document).width() + 'px';
		}
	};
})();

/**
 * Overlay
 */
(function($) {
	jQuery.overlay = function(options) {
		options = jQuery.extend({},jQuery.overlay.defaults,options);
		if(options.close){
			jQuery('.ui-overlay').remove();
		} else {
			jQuery('<div></div>').appendTo(document.body).addClass('ui-overlay');

			jQuery('<div></div>').appendTo('.ui-overlay')
				.addClass('ui-widget-overlay').css({
					width: jQuery.screenwidth(),
					height: jQuery.screenheight()
				});
		}
	};
	jQuery.overlay.defaults = {
		close: false
	};
})();

(function($) {
	jQuery.ajaxloader = function(options) {
		options = jQuery.extend({},jQuery.ajaxloader.defaults,options);

		if(options.close){
			jQuery('#ajaxloader').remove();
			jQuery.overlay({close:true});
		} else {

			if(options.overlay){
				jQuery.overlay();
			}
			if(options.appendto == 'body'){
				jQuery('<img />').appendTo(document.body).attr({
					id: 'ajaxloader',
					src: options.imglocation + options.img
				}).css({
						left: '50%',
						top: '50%',
						'margin-left': '-'+(options.width/2)+'px',
						'margin-top': '-'+(options.height/2)+'px',
						position: options.position,
						'z-index': '200'
				});
			} else {
				var cssoptions;
				if(options.position == 'center'){
					cssoptions = {
						left: '50%',
						top: '50%',
						'margin-left': '-'+(options.width/2)+'px',
						'margin-top': '-'+(options.height/2)+'px',
						position: options.position,
						'z-index': options.zindex
					};
				} else {
					cssoptions = {
						left: options.left,
						top: options.top,
						'margin-left': options.marginleft,
						'margin-top': options.margintop,
						'z-index': options.zindex
					};
				}

				jQuery('<img />').appendTo('#'+options.appendto).attr({
					id: 'ajaxloader',
					src: options.imglocation + options.img
				}).css(cssoptions);
			}
		}
	};

	jQuery.ajaxloader.defaults = {
		img: 'ajaxloader_loading.gif',
		imglocation: 'templates/backoffice/images/',
		appendto: 'body',
		width: 100,
		height: 100,
		position: 'fixed',
		overlay: true,
		close: false,
		zindex: 200,
		top: 0,
		left: 0,
		marginleft: 0,
		margintop: 0
	};
})();

/**
 * show error
 */
(function($) {
	jQuery.ShowError = function(message, options, f) {
		options = jQuery.extend({},jQuery.ShowError.defaults,options);
		jQuery.ajaxq('ajax');
		jQuery.ajaxloader({close:true});
		var alreadycreated = jQuery('#dialog').size();
		if(alreadycreated == 0){
			jQuery('<div></div>').appendTo(document.body).attr({
				id: 'dialog'
			});
			jQuery('#dialog').dialog({autoOpen: false});
		}

		jQuery('#dialog').dialog('option', 'buttons', {
			"Ok": function() {
				jQuery(this).dialog("close");
				if (typeof 1 == "function") f();
			}
		});
		jQuery('#dialog').dialog('option', 'title', options.title);
		jQuery('#dialog').dialog('option', 'height', options.height);
		jQuery('#dialog').dialog('option', 'width', options.width);
		jQuery('#dialog').dialog('option', 'position', options.position);
		jQuery('#dialog').dialog('option', 'modal', options.modal);

		jQuery('#dialog').html(message);
		jQuery('#dialog').dialog('open');
	};

	jQuery.ShowError.defaults = {
		height: 530,
		width: 1050,
		title: 'Error',
		position: [100, 100],
		modal: true
	};
})();


/**
 * show message
 */
(function($) {
	jQuery.message = function(message, options, f) {
		options = jQuery.extend({},jQuery.message.defaults,options);

		var alreadycreated = jQuery('#dialog').size();
		if(alreadycreated == 0){
			jQuery('<div></div>').appendTo(document.body).attr({
				id: 'dialog'
			});
			jQuery('#dialog').dialog({autoOpen: false});
		}

		jQuery('#dialog').dialog('option', 'buttons', {
			"Ok": function() {
				jQuery(this).dialog("close");
				if (typeof f == "function") f();
			}
		});

		jQuery('#dialog').dialog('option', 'title', options.title);
		jQuery('#dialog').dialog('option', 'height', options.height);
		jQuery('#dialog').dialog('option', 'width', options.width);
		jQuery('#dialog').dialog('option', 'position', options.position);
		jQuery('#dialog').dialog('option', 'modal', options.modal);

		jQuery('#dialog').html(message);
		jQuery('#dialog').dialog('open');
	};

	jQuery.message.defaults = {
		height: 'auto',
		width: 400,
		title: 'Bericht',
		position: 'center',
		modal: true
	};
})();


/**
 * Confirm box
 */
(function($) {
	jQuery.confirm = function(message, options, j, n) {

		if (typeof options == "function"){
			n = j;
			j = options;
			options = {};
		}
		options = jQuery.extend({},jQuery.confirm.defaults,options);

		var alreadycreated = jQuery('#dialog').size();
		if(alreadycreated == 0){
			jQuery('<div></div>').appendTo(document.body).attr({
				id: 'dialog'
			});
			jQuery('#dialog').dialog({autoOpen: false});
		}

		jQuery('#dialog').dialog('option', 'buttons', {
			"Nee": function() {
				jQuery('#dialog').dialog("close");
				if (typeof n == "function") n();
			},
			"Ja": function() {
				jQuery('#dialog').dialog("close");
				if (typeof j == "function") j();
			}
		});

		jQuery('#dialog').dialog('option', 'title', options.title);
		jQuery('#dialog').dialog('option', 'height', options.height);
		jQuery('#dialog').dialog('option', 'width', options.width);
		jQuery('#dialog').dialog('option', 'position', options.position);
		jQuery('#dialog').dialog('option', 'modal', options.modal);

		jQuery('#dialog').html(message);
		jQuery('#dialog').dialog('open');
	};

	jQuery.confirm.defaults = {
		height: 'auto',
		width: 400,
		title: 'Bevestig',
		position: 'center',
		modal: true
	};
})();

/**
 * popover
 */
(function($) {
	jQuery.popover = function(text, options) {
		options = jQuery.extend({},jQuery.popover.defaults,options);

		if(options.close){
			jQuery('#overlaycontent').remove();
			jQuery('#popovershadow').remove();
			jQuery.overlay({close:true});
		} else {
			jQuery.overlay();

			if (options.shadow) {
				jQuery('<div></div>').appendTo('.ui-overlay').attr({
					id: 'popovershadow'
				}).addClass('ui-widget-shadow ui-corner-all').css({
					width: (options.width+22),
					height: (options.height+22),
					left: options.left,
					top: options.top,
					'margin-left': (options.marginleft-11)+'px',
					'margin-top': (options.margintop-11)+'px',
					position: options.position,
					'z-index': options.zindex
				});
			}


			jQuery('<div></div>').appendTo(document.body).attr({
				id: 'overlaycontent'
			}).addClass('ui-widget ui-widget-content ui-corner-all').css({
				width: options.width,
				height: options.height,
				left: options.left,
				top: options.top,
				padding: 7,
				'margin-left': options.marginleft+'px',
				'margin-top': options.margintop+'px',
				position: options.position,
				'z-index': (options.zindex+10)
			});

			if(options.closebutton){
				jQuery('<img />').appendTo('#overlaycontent').attr({
					src: 'templates/backoffice/images/icons/Exit.png',
					id: 'closeicon'
				}).addClass('editicon').css({
					'float': 'right'
				});
				jQuery('#closeicon').click(function(){
					jQuery.popover('', {close:true});
				});
			}

			jQuery('<div></div>').appendTo('#overlaycontent').attr({
				id: 'overlaytext'
			}).addClass('ui-dialog-content ui-widget-content').css({
				background: 'none',
				border: 0
			});



			jQuery('#overlaytext').append(text);
		}
	};

	jQuery.popover.defaults = {
		shadow: true,
		width: 600,
		height: 300,
		margintop: -150,
		marginleft: -300,
		top: '50%',
		left: '50%',
		position: 'fixed',
		zindex: 2000,
		closebutton: true
	};
})();

/**
 * Confirm box
 */
(function($) {
	jQuery.messagediv = function(text, options) {
		options = jQuery.extend({},jQuery.messagediv.defaults,options);

			var divclass = options.error ? 'ui-state-error ui-corner-all' : 'ui-state-highlight ui-corner-all';

			jQuery('<div></div>').prependTo(options.prepend).attr({
				id: 'createdmessagediv'
			}).addClass('ui-widget').css({
				'padding-bottom': '10px'
			});

			jQuery('<div></div>').appendTo('#createdmessagediv').attr({
				id: 'createdmessagediv1'
			}).addClass(divclass).css({
				padding: '0.7em'
			});

			jQuery('<p></p>').appendTo('#createdmessagediv1').attr({
				id: 'createdmessagedivp'
			});

			var iconclass = options.error ? 'ui-icon ui-icon-alert' : 'ui-icon ui-icon-info';

			jQuery('<span></span>').appendTo('#createdmessagedivp').addClass(iconclass).css({
				'float': 'left',
				'margin-right': '.3em'
			});

			var infotext = options.error ? 'Fout' : 'Info';

			jQuery('#createdmessagedivp').append('<strong>'+infotext+':</strong> ' + text);

			setTimeout('jQuery("#createdmessagediv").slideUp("slow", function(){jQuery("#createdmessagediv").remove();});', options.timeout);
		
	};

	jQuery.messagediv.defaults = {
		error: false,
		timeout: 3000,
		prepend: '#inhoudvak'
	};
})();

/**
 * Confirm box
 */
(function($) {
	jQuery.flashuploader = function(fileinput, options) {
		options = jQuery.extend({},jQuery.flashuploader.defaults,options);
		
		var uploads = jQuery(fileinput).size();
		var sessieid = jQuery('#sessieid').val();

		jQuery.each(jQuery(fileinput), function(){
			if(jQuery('#'+this.id+':visible').size()>0){
				jQuery(this).uploadify({
					uploader				: 'templates/backoffice/scripts/uploadify.swf',
					script					: options.script,
					scriptData			:	{
						'sessie_id': sessieid,
						'functie': options.functie,
						'extra':	options.extraScriptData,
						'login':	options.login
					},
					auto						: options.auto,
					multi						: options.multi,
					fileDesc			  : options.fileDesc,
					fileExt				  : options.fileExt,
					folder					: options.folder,
					height					: options.height,
					width						: options.width,
					cancelImg				: options.cancelImg,
					wmode						: options.wmode,
					scriptAccess		: options.scriptAccess,
					fileDataName		: options.fileDataName,
					method					: options.method,
					queueSizeLimit	: options.queueSizeLimit,
					simUploadLimit	: options.simUploadLimit,
					queueID					: options.queueID,
					displayData			: options.displayData,
					onInit					: options.onInit,
					onSelect				: options.onSelect,
					onQueueFull			: options.onQueueFull,
					onCheck					: options.onCheck,
					onCancel				: options.onCancel,
					onError					: options.onError,
					onProgress			: options.onProgress,
					onComplete			: options.onComplete,
					onAllComplete		: options.onAllComplete
				});
			}
		});
	};

	
	var baseurl = jQuery('#baseurl').attr('href');
	
	jQuery.flashuploader.defaults = {
		script         : baseurl + 'uploaden.html',
		folder         : '',
		functie				 : '',
		login					 : true,
		auto					 : true,
		multi					 : false,
		height         : 30,
		width          : 110,
		extraScriptData: '',
		cancelImg      : 'templates/backoffice/images/cancel.png',
		wmode          : 'opaque',
		scriptAccess   : 'sameDomain',
		fileDataName   : 'Filedata',
		fileDesc			 : 'Alleen afbeeldingen',
		fileExt				 : '*.jpg;*.gif;*.png;*.jpeg',
		method         : 'POST',
		queueSizeLimit : 999,
		simUploadLimit : 1,
		queueID        : false,
		displayData    : 'percentage',
		onInit         : function() {},
		onSelect       : function() {},
		onQueueFull    : function() {},
		onCheck        : function() {},
		onCancel       : function() {},
		onError        : function() {},
		onProgress     : function() {},
		onComplete     : function() {},
		onAllComplete  : function() {}
	};
})();


//TODO: getPassword jquery script maken
function getRandomNum(lbound, ubound) {
	return (Math.floor(Math.random() * (ubound - lbound)) + lbound);
}

function getRandomChar(number, lower, upper, other, extra) {
	var numberChars = "0123456789";
	var lowerChars = "abcdefghijklmnopqrstuvwxyz";
	var upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var otherChars = "!@#$%&*?";
	var charSet = extra;
	if (number == true)
		charSet += numberChars;
	if (lower == true)
		charSet += lowerChars;
	if (upper == true)
		charSet += upperChars;
	if (other == true)
		charSet += otherChars;
	return charSet.charAt(getRandomNum(0, charSet.length));
}

function getPassword(length, extraChars, firstNumber, firstLower, firstUpper, firstOther,
	latterNumber, latterLower, latterUpper, latterOther) {
	var rc = "";
	if (length > 0)
		rc = rc + getRandomChar(firstNumber, firstLower, firstUpper, firstOther, extraChars);
	for (var idx = 1; idx < length; ++idx) {
		rc = rc + getRandomChar(latterNumber, latterLower, latterUpper, latterOther, extraChars);
	}
	return rc;
}




$.validator.addMethod("captcha", function(value, element, param) {	
	if ( this.optional(element) )
		return "dependency-mismatch";
	var previous = this.previousValue(element);
	if (!this.settings.messages[element.name] )
		this.settings.messages[element.name] = {};
	this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message;
	param = typeof param == "string" && {url:param} || param;
	if ( previous.old !== value ) {
		previous.old = value;
		var validator = this;
		this.startRequest(element);
		var data = {};
		data[element.name] = value;
		$.ajax($.extend(true, {
			url: param,
			mode: "abort",
			port: "validate" + element.name,
			dataType: "json",
			data: data,
			success: function(response) {
				var valid = response === true;
				var rand = getPassword(2, true, true, true, true, false, true, true, true, true);
				if ( valid ) {
					var submitted = validator.formSubmitted;
					validator.prepareElement(element);
					validator.formSubmitted = submitted;
					validator.successList.push(element);
					validator.showErrors();
				} else {
					jQuery('body').find('img[alt="Captcha"]').attr('src', 'captcha/default.html?value='+rand);
					var errors = {};
					errors[element.name] = previous.message = response || validator.defaultMessage( element, "captcha" );
					validator.showErrors(errors);					
				}
				previous.valid = valid;
				validator.stopRequest(element, valid);
			}
		}, param));
		return "pending";
	} else if( this.pending[element.name] ) {
		return "pending";
	}
	return previous.valid;
}, 'De ingevulde waarde is al in gebruik.');

/**
 * sprintf and vsprintf for jQuery
 * somewhat based on http://jan.moesen.nu/code/javascript/sprintf-and-printf-in-javascript/
 *
 * Copyright (c) 2008 Sabin Iacob (m0n5t3r) <iacobs@m0n5t3r.info>
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * @license http://www.gnu.org/licenses/gpl.html
 * @project jquery.sprintf
 */
(function($){
	var formats = {
		'%': function(val) {return '%';},
		'b': function(val) {return  parseInt(val, 10).toString(2);},
		'c': function(val) {return  String.fromCharCode(parseInt(val, 10));},
		'd': function(val) {return  parseInt(val, 10) ? parseInt(val, 10) : 0;},
		'u': function(val) {return  Math.abs(val);},
		'f': function(val, p) {return  (p > -1) ? Math.round(parseFloat(val) * Math.pow(10, p)) / Math.pow(10, p): parseFloat(val);},
		'o': function(val) {return  parseInt(val, 10).toString(8);},
		's': function(val) {return  val;},
		'x': function(val) {return  ('' + parseInt(val, 10).toString(16)).toLowerCase();},
		'X': function(val) {return  ('' + parseInt(val, 10).toString(16)).toUpperCase();}
	};

	var re = /%(?:(\d+)?(?:\.(\d+))?|\(([^)]+)\))([%bcdufosxX])/g;

	var dispatch = function(data){
		if(data.length == 1 && typeof data[0] == 'object') { //python-style printf
			data = data[0];
			return function(match, w, p, lbl, fmt, off, str) {
				return formats[fmt](data[lbl]);
			};
		} else { // regular, somewhat incomplete, printf
			var idx = 0; // oh, the beauty of closures :D
			return function(match, w, p, lbl, fmt, off, str) {
				return formats[fmt](data[idx++], p);
			};
		}
	};

	$.extend({
		sprintf: function(format) {
			var argv = Array.apply(null, arguments).slice(1);
			return format.replace(re, dispatch(argv));
		},
		vsprintf: function(format, data) {
			return format.replace(re, dispatch(data));
		}
	});
})(jQuery);
