text: 
  /* ***************************************************************************
   * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a
   * copy of this software and associated documentation files (the "Software"),
   * to deal in the Software without restriction, including without limitation
   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   * and/or sell copies of the Software, and to permit persons to whom the
   * Software is furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in
   * all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   * DEALINGS IN THE SOFTWARE.
   * ***************************************************************************
   *
   * Authors: Hyunsook Park <hyunsook.park@samsung.com>
   *			Wonseop Kim <wonseop.kim@samsung.com>
  */
  
  ( function ( $, window, document, undefined ) {
  	var _canvas, _context;
  
  	function initCanvas() {
  		if (_context) {
  			return;
  		}
  		_canvas = document.createElement( 'canvas' );
  		_context = _canvas.getContext( '2d' );
  	}
  
  	function fileSystemErrorMessage( e ) {
  		var FileError = window.FileError,
  			msg = '';
  		switch ( e.code ) {
  		case FileError.QUOTA_EXCEEDED_ERR:
  			msg = 'QUOTA_EXCEEDED_ERR';
  			break;
  		case FileError.NOT_FOUND_ERR:
  			msg = 'NOT_FOUND_ERR';
  			break;
  		case FileError.SECURITY_ERR:
  			msg = 'SECURITY_ERR';
  			break;
  		case FileError.INVALID_MODIFICATION_ERR:
  			msg = 'INVALID_MODIFICATION_ERR';
  			break;
  		case FileError.INVALID_STATE_ERR:
  			msg = 'INVALID_STATE_ERR';
  			break;
  		default:
  			msg = 'Unknown Error';
  			break;
  		}
  		return msg;
  	}
  
  	function getInternalURLFromURL( url ) {
  		var internalURL = url.replace( /\//gi, "_" );
  		return internalURL;
  	}
  
  	function resize( imagewidth, imageheight, thumbwidth, thumbheight, fit ) {
  		var w = 0, h = 0, x = 0, y = 0,
  			widthratio = imagewidth / thumbwidth,
  			heightratio = imageheight / thumbheight,
  			maxratio = Math.max( widthratio, heightratio );
  
  		if ( fit ) {
  			w = thumbwidth;
  			h = thumbheight;
  		} else {
  			if ( maxratio > 1 ) {
  				w = imagewidth / maxratio;
  				h = imageheight / maxratio;
  			} else {
  				w = imagewidth;
  				h = imageheight;
  			}
  			x = ( thumbwidth - w ) / 2;
  			y = ( thumbheight - h ) / 2;
  		}
  
  		return { w: w, h: h, x: x, y: y };
  	}
  
  	function getThumbnail( img, thumbwidth, thumbheight, fit ) {
  		var dimensions, url;
  		initCanvas();
  		_canvas.width = thumbwidth;
  		_canvas.height = thumbheight;
  		dimensions = resize( img.width, img.height, thumbwidth, thumbheight, fit );
  		_context.fillStyle = "#000000";
  		_context.fillRect ( 0, 0, thumbwidth, thumbheight );
  		_context.drawImage( img, dimensions.x, dimensions.y, dimensions.w, dimensions.h );
  		url = _canvas.toDataURL();
  		return url;
  	}
  
  	$.imageloader = {
  		_grantedBytes: 1024 * 1024,
  		getThumbnail: function ( url, _callback ) {
  			var internalURL, canvasDataURI;
  			function errorHandler( e ) {
  				var msg = fileSystemErrorMessage( e );
  				if ( _callback ) {
  					_callback( ( msg === "NOT_FOUND_ERR" ) ? msg : null );
  				}
  			}
  
  			internalURL = getInternalURLFromURL( url );
  			try {
  				canvasDataURI = localStorage.getItem( internalURL );
  				if ( _callback ) {
  					_callback( ( canvasDataURI === null ) ? "NOT_FOUND_ERR" : canvasDataURI );
  				}
  			} catch ( e ) {
  				if ( _callback ) {
  					_callback( ( e.type === "non_object_property_load" ) ? "NOT_FOUND_ERR" : null );
  				}
  			}
  		},
  
  		setThumbnail: function ( url, _callback, thumbWidth, thumbHeight, fit ) {
  			var image, internalURL, canvasDataURI;
  			function errorHandler( e ) {
  				var msg = fileSystemErrorMessage( e );
  				if ( _callback ) {
  					_callback( ( msg === "NOT_FOUND_ERR" ) ? msg : null );
  				}
  			}
  
  			thumbWidth = thumbWidth || 128;
  			thumbHeight = thumbHeight || 128;
  			fit = fit || true;
  			image = new Image();
  			image.onload = function () {
  				internalURL = getInternalURLFromURL( url );
  				canvasDataURI = getThumbnail( this, thumbWidth, thumbHeight, fit );
  				try {
  					localStorage.setItem( internalURL, canvasDataURI );
  					if ( _callback ) {
  						_callback( canvasDataURI );
  					}
  				} catch ( e ) {
  					if ( _callback ) {
  						_callback( ( e.type === "non_object_property_load" ) ? "NOT_FOUND_ERR" : null );
  					}
  				}
  			};
  			image.src = url;
  		},
  
  		removeThumbnail: function ( url ) {
  			var internalURL;
  			function errorHandler( e ) {
  				fileSystemErrorMessage( e );
  			}
  
  			internalURL = getInternalURLFromURL( url );
  			try {
  				localStorage.removeItem( internalURL );
  			} catch ( e ) {
  				throw e;
  			}
  		}
  	};
  
  } ( jQuery, window, document ) );
  
  