function prepareCapture() {
  var obj  = document.getElementById('CapCtrl');
  if (obj) return obj;

  try {
    obj = document.createElement("OBJECT");
    if (obj) {
      obj.id       = "CapCtrl";
      obj.classid  = "CLSID:228D75E0-D347-4DD3-AA45-75F2924B7165";
      obj.style.width       = "0px";
      obj.style.height      = "0px";
      document.body.appendChild(obj);
      if (obj.object) return obj;
    }
  } catch(e) {
    //alert(e);
  }
  return null;
}

function doCapture(opts) {
  var defaults = {
	serviceURL: '',
	onComplete: null,
	onCompleteContext: window,
	onScanStart: null,
	onScanStartContext: window,
	onRecognizeStart: null,
	onRecognizeStartContext: window,
	onError : null,
	onErrorContext: window,
	map:{
		FirstName			: 'FirstName',
		LastName			: 'LastName',
		Title				: 'Title',
		Company				: 'Company',
		Address				: 'Address',
		City				: 'City',
		StreetAddress		: 'StreetAddress',
		State				: 'State',
		Postalcode			: 'Postalcode',
		Phone				: 'Phone',
		Fax					: 'Fax',
		Mobile				: 'Mobile',
		EMail				: 'EMail',
		WebSite				: 'WebSite'
	},
	
	// if parametr is true: fetching all data from service 
	// if parametr is false: fetching data only in map (or user defined map if provided)
	provideAllFields: false
  };
  var settings = {};
  
  var provideAllFields = (opts.provideAllFields!=undefined)? opts.provideAllFields:defaults.provideAllFields;
  
  // provide all fields from card or only that founds in map
  if (provideAllFields)
  {
	 settings = $.extend(true, {}, defaults, opts);
  } else
  {
	settings = $.extend({}, defaults, opts);
  }
  
  
  var obj = prepareCapture();
  if (obj && obj.object) 
  {
	
	// call onScanStart callback
	if ($.isFunction(settings.onScanStart))
	{
		settings.onScanStart.apply(settings.onScanStartContext);
	}
	setTimeout(function(){
		var requestFields = {};
		
		requestFields.scandata = obj.Scan();
		
		// call onRecognizeStart callback
		if ($.isFunction(settings.onRecognizeStart))
		{
			settings.onRecognizeStart.apply(settings.onRecognizeStartContext);
		}
		$.post(settings.serviceURL, requestFields, function(data){
			var fields = {};
			for (var i in data.fields)
			{
				if (settings.map[i])
				{
					fields[settings.map[i]] = data.fields[i];
				}
			}
			
			// call onComplete callback
			if ($.isFunction(settings.onComplete))
			{
				settings.onComplete.apply(settings.onCompleteContext, [{error:{code:0}, fields:fields}]);
			}
		}, 'json');
		
	}, 50);
	
  } else
  {
	if ($.isFunction(settings.onComplete))
	{
		settings.onComplete.apply(settings.onCompleteContext, [{error:{code:1}, fields:{}}]);
	}
  }
}
