whole_func_string: function grabContent(e) {
  				var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent;
  
  				// Check if browser supports direct plaintext access
  				if (e.clipboardData || dom.doc.dataTransfer) {
  					textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text');
  
  					if (ed.pasteAsPlainText) {
  						e.preventDefault();
  						process({content : dom.encode(textContent).replace(/\r?\n/g, '<br />')});
  						return;
  					}
  				}
  
  				if (dom.get('_mcePaste'))
  					return;
  
  				// Create container to paste into
  				n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF');
  
  				// If contentEditable mode we need to find out the position of the closest element
  				if (body != ed.getDoc().body)
  					posY = dom.getPos(ed.selection.getStart(), body).y;
  				else
  					posY = body.scrollTop + dom.getViewPort(ed.getWin()).y;
  
  				// Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles
  				// If also needs to be in view on IE or the paste would fail
  				dom.setStyles(n, {
  					position : 'absolute',
  					left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div
  					top : posY - 25,
  					width : 1,
  					height : 1,
  					overflow : 'hidden'
  				});
  
  				if (tinymce.isIE) {
  					// Store away the old range
  					oldRng = sel.getRng();
  
  					// Select the container
  					rng = dom.doc.body.createTextRange();
  					rng.moveToElementText(n);
  					rng.execCommand('Paste');
  
  					// Remove container
  					dom.remove(n);
  
  					// Check if the contents was changed, if it wasn't then clipboard extraction failed probably due
  					// to IE security settings so we pass the junk though better than nothing right
  					if (n.innerHTML === '\uFEFF\uFEFF') {
  						ed.execCommand('mcePasteWord');
  						e.preventDefault();
  						return;
  					}
  
  					// Restore the old range and clear the contents before pasting
  					sel.setRng(oldRng);
  					sel.setContent('');
  
  					// For some odd reason we need to detach the the mceInsertContent call from the paste event
  					// It's like IE has a reference to the parent element that you paste in and the selection gets messed up
  					// when it tries to restore the selection
  					setTimeout(function() {
  						// Process contents
  						process({content : n.innerHTML});
  					}, 0);
  
  					// Block the real paste event
  					return tinymce.dom.Event.cancel(e);
  				} else {
  					function block(e) {
  						e.preventDefault();
  					};
  
  					// Block mousedown and click to prevent selection change
  					dom.bind(ed.getDoc(), 'mousedown', block);
  					dom.bind(ed.getDoc(), 'keydown', block);
  
  					or = ed.selection.getRng();
  
  					// Move select contents inside DIV
  					n = n.firstChild;
  					rng = ed.getDoc().createRange();
  					rng.setStart(n, 0);
  					rng.setEnd(n, 2);
  					sel.setRng(rng);
  
  					// Wait a while and grab the pasted contents
  					window.setTimeout(function() {
  						var h = '', nl;
  
  						// Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit
  						if (!dom.select('div.mcePaste > div.mcePaste').length) {
  							nl = dom.select('div.mcePaste');
  
  							// WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string
  							each(nl, function(n) {
  								var child = n.firstChild;
  
  								// WebKit inserts a DIV container with lots of odd styles
  								if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) {
  									dom.remove(child, 1);
  								}
  
  								// Remove apply style spans
  								each(dom.select('span.Apple-style-span', n), function(n) {
  									dom.remove(n, 1);
  								});
  
  								// Remove bogus br elements
  								each(dom.select('br[data-mce-bogus]', n), function(n) {
  									dom.remove(n);
  								});
  
  								// WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV
  								if (n.parentNode.className != 'mcePaste')
  									h += n.innerHTML;
  							});
  						} else {
  							// Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc
  							// So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same
  							h = '<p>' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '</p><p>').replace(/\r?\n/g, '<br />') + '</p>';
  						}
  
  						// Remove the nodes
  						each(dom.select('div.mcePaste'), function(n) {
  							dom.remove(n);
  						});
  
  						// Restore the old selection
  						if (or)
  							sel.setRng(or);
  
  						process({content : h});
  
  						// Unblock events ones we got the contents
  						dom.unbind(ed.getDoc(), 'mousedown', block);
  						dom.unbind(ed.getDoc(), 'keydown', block);
  					}, 0);
  				}
  			}
func_code_string: function grabContent(e) {
  				var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent;
  
  				// Check if browser supports direct plaintext access
  				if (e.clipboardData || dom.doc.dataTransfer) {
  					textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text');
  
  					if (ed.pasteAsPlainText) {
  						e.preventDefault();
  						process({content : dom.encode(textContent).replace(/\r?\n/g, '<br />')});
  						return;
  					}
  				}
  
  				if (dom.get('_mcePaste'))
  					return;
  
  				// Create container to paste into
  				n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF');
  
  				// If contentEditable mode we need to find out the position of the closest element
  				if (body != ed.getDoc().body)
  					posY = dom.getPos(ed.selection.getStart(), body).y;
  				else
  					posY = body.scrollTop + dom.getViewPort(ed.getWin()).y;
  
  				// Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles
  				// If also needs to be in view on IE or the paste would fail
  				dom.setStyles(n, {
  					position : 'absolute',
  					left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div
  					top : posY - 25,
  					width : 1,
  					height : 1,
  					overflow : 'hidden'
  				});
  
  				if (tinymce.isIE) {
  					// Store away the old range
  					oldRng = sel.getRng();
  
  					// Select the container
  					rng = dom.doc.body.createTextRange();
  					rng.moveToElementText(n);
  					rng.execCommand('Paste');
  
  					// Remove container
  					dom.remove(n);
  
  					// Check if the contents was changed, if it wasn't then clipboard extraction failed probably due
  					// to IE security settings so we pass the junk though better than nothing right
  					if (n.innerHTML === '\uFEFF\uFEFF') {
  						ed.execCommand('mcePasteWord');
  						e.preventDefault();
  						return;
  					}
  
  					// Restore the old range and clear the contents before pasting
  					sel.setRng(oldRng);
  					sel.setContent('');
  
  					// For some odd reason we need to detach the the mceInsertContent call from the paste event
  					// It's like IE has a reference to the parent element that you paste in and the selection gets messed up
  					// when it tries to restore the selection
  					setTimeout(function() {
  						// Process contents
  						process({content : n.innerHTML});
  					}, 0);
  
  					// Block the real paste event
  					return tinymce.dom.Event.cancel(e);
  				} else {
  					function block(e) {
  						e.preventDefault();
  					};
  
  					// Block mousedown and click to prevent selection change
  					dom.bind(ed.getDoc(), 'mousedown', block);
  					dom.bind(ed.getDoc(), 'keydown', block);
  
  					or = ed.selection.getRng();
  
  					// Move select contents inside DIV
  					n = n.firstChild;
  					rng = ed.getDoc().createRange();
  					rng.setStart(n, 0);
  					rng.setEnd(n, 2);
  					sel.setRng(rng);
  
  					// Wait a while and grab the pasted contents
  					window.setTimeout(function() {
  						var h = '', nl;
  
  						// Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit
  						if (!dom.select('div.mcePaste > div.mcePaste').length) {
  							nl = dom.select('div.mcePaste');
  
  							// WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string
  							each(nl, function(n) {
  								var child = n.firstChild;
  
  								// WebKit inserts a DIV container with lots of odd styles
  								if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) {
  									dom.remove(child, 1);
  								}
  
  								// Remove apply style spans
  								each(dom.select('span.Apple-style-span', n), function(n) {
  									dom.remove(n, 1);
  								});
  
  								// Remove bogus br elements
  								each(dom.select('br[data-mce-bogus]', n), function(n) {
  									dom.remove(n);
  								});
  
  								// WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV
  								if (n.parentNode.className != 'mcePaste')
  									h += n.innerHTML;
  							});
  						} else {
  							// Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc
  							// So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same
  							h = '<p>' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '</p><p>').replace(/\r?\n/g, '<br />') + '</p>';
  						}
  
  						// Remove the nodes
  						each(dom.select('div.mcePaste'), function(n) {
  							dom.remove(n);
  						});
  
  						// Restore the old selection
  						if (or)
  							sel.setRng(or);
  
  						process({content : h});
  
  						// Unblock events ones we got the contents
  						dom.unbind(ed.getDoc(), 'mousedown', block);
  						dom.unbind(ed.getDoc(), 'keydown', block);
  					}, 0);
  				}
  			}
func_documentation_string: This function grabs the contents from the clipboard by adding a hidden div and placing the caret inside it and after the browser paste is done it grabs that contents and processes that