Yahoo! UI Library

connection 

Yahoo! UI Library > connection > connection.js (source view)

/*
Copyright (c) 2006, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
*/

/**
 * The Connection Manager provides a simplified interface to the XMLHttpRequest
 * object.  It handles cross-browser instantiantion of XMLHttpRequest, negotiates the
 * interactive states and server response, returning the results to a pre-defined
 * callback you create.
 *
 * @namespace YAHOO.util
 * @module connection
 * @requires yahoo
 */

/**
 * The Connection Manager singleton provides methods for creating and managing
 * asynchronous transactions.
 *
 * @class Connect
 */
YAHOO.util.Connect =
{
  /**
   * @description Array of MSFT ActiveX ids for XMLHttpRequest.
   * @property _msxml_progid
   * @private
   * @static
   * @type array
   */
	_msxml_progid:[
		'MSXML2.XMLHTTP.3.0',
		'MSXML2.XMLHTTP',
		'Microsoft.XMLHTTP'
		],

  /**
   * @description Object literal of HTTP header(s)
   * @property _http_header
   * @private
   * @static
   * @type object
   */
	_http_header:{},

  /**
   * @description Determines if HTTP headers are set.
   * @property _has_http_headers
   * @private
   * @static
   * @type boolean
   */
	_has_http_headers:false,

 /**
  * @description Determines if a default header of
  * Content-Type of 'application/x-www-form-urlencoded'
  * will be added to any client HTTP headers sent for POST
  * transactions.
  * @property _use_default_post_header
  * @private
  * @static
  * @type boolean
  */
    _use_default_post_header:true,

 /**
  * @description Determines if a default header of
  * Content-Type of 'application/x-www-form-urlencoded'
  * will be added to any client HTTP headers sent for POST
  * transactions.
  * @property _default_post_header
  * @private
  * @static
  * @type boolean
  */
    _default_post_header:'application/x-www-form-urlencoded',

 /**
  * @description Property modified by setForm() to determine if the data
  * should be submitted as an HTML form.
  * @property _isFormSubmit
  * @private
  * @static
  * @type boolean
  */
    _isFormSubmit:false,

 /**
  * @description Property modified by setForm() to determine if a file(s)
  * upload is expected.
  * @property _isFileUpload
  * @private
  * @static
  * @type boolean
  */
    _isFileUpload:false,

 /**
  * @description Property modified by setForm() to set a reference to the HTML
  * form node if the desired action is file upload.
  * @property _formNode
  * @private
  * @static
  * @type object
  */
    _formNode:null,

 /**
  * @description Property modified by setForm() to set the HTML form data
  * for each transaction.
  * @property _sFormData
  * @private
  * @static
  * @type string
  */
    _sFormData:null,

 /**
  * @description Collection of polling references to the polling mechanism in handleReadyState.
  * @property _poll
  * @private
  * @static
  * @type object
  */
    _poll:{},

 /**
  * @description Queue of timeout values for each transaction callback with a defined timeout value.
  * @property _timeOut
  * @private
  * @static
  * @type object
  */
    _timeOut:{},

  /**
   * @description The polling frequency, in milliseconds, for HandleReadyState.
   * when attempting to determine a transaction's XHR readyState.
   * The default is 50 milliseconds.
   * @property _polling_interval
   * @private
   * @static
   * @type int
   */
     _polling_interval:50,

  /**
   * @description A transaction counter that increments the transaction id for each transaction.
   * @property _transaction_id
   * @private
   * @static
   * @type int
   */
     _transaction_id:0,

  /**
   * @description Member to add an ActiveX id to the existing xml_progid array.
   * In the event(unlikely) a new ActiveX id is introduced, it can be added
   * without internal code modifications.
   * @method setProgId
   * @public
   * @static
   * @param {string} id The ActiveX id to be added to initialize the XHR object.
   * @return void
   */
	setProgId:function(id)
	{
		this._msxml_progid.unshift(id);
	},

  /**
   * @description Member to enable or disable the default POST header.
   * @method setDefaultPostHeader
   * @public
   * @static
   * @param {boolean} b Set and use default header - true or false .
   * @return void
   */
	setDefaultPostHeader:function(b)
	{
		this._use_default_post_header = b;
	},

  /**
   * @description Member to modify the default polling interval.
   * @method setPollingInterval
   * @public
   * @static
   * @param {int} i The polling interval in milliseconds.
   * @return void
   */
	setPollingInterval:function(i)
	{
		if(typeof i == 'number' && isFinite(i)){
			this._polling_interval = i;
		}
	},

  /**
   * @description Instantiates a XMLHttpRequest object and returns an object with two properties:
   * the XMLHttpRequest instance and the transaction id.
   * @method createXhrObject
   * @private
   * @static
   * @param {int} transactionId Property containing the transaction id for this transaction.
   * @return object
   */
	createXhrObject:function(transactionId)
	{
		var obj,http;
		try
		{
			// Instantiates XMLHttpRequest in non-IE browsers and assigns to http.
			http = new XMLHttpRequest();
			//  Object literal with http and tId properties
			obj = { conn:http, tId:transactionId };
		}
		catch(e)
		{
			for(var i=0; i<this._msxml_progid.length; ++i){
				try
				{
					// Instantiates XMLHttpRequest for IE and assign to http.
					http = new ActiveXObject(this._msxml_progid[i]);
					//  Object literal with conn and tId properties
					obj = { conn:http, tId:transactionId };
					break;
				}
				catch(e){}
			}
		}
		finally
		{
			return obj;
		}
	},

  /**
   * @description This method is called by asyncRequest to create a
   * valid connection object for the transaction.  It also passes a
   * transaction id and increments the transaction id counter.
   * @method getConnectionObject
   * @private
   * @static
   * @return {object}
   */
	getConnectionObject:function()
	{
		var o;
		var tId = this._transaction_id;

		try
		{
			o = this.createXhrObject(tId);
			if(o){
				this._transaction_id++;
			}
		}
		catch(e){}
		finally
		{
			return o;
		}
	},

  /**
   * @description Method for initiating an asynchronous request via the XHR object.
   * @method asyncRequest
   * @public
   * @static
   * @param {string} method HTTP transaction method
   * @param {string} uri Fully qualified path of resource
   * @param {callback} callback User-defined callback function or object
   * @param {string} postData POST body
   * @return {object} Returns the connection object
   */
	asyncRequest:function(method, uri, callback, postData)
	{
		var o = this.getConnectionObject();

		if(!o){
			return null;
		}
		else{
			if(this._isFormSubmit){
				if(this._isFileUpload){
					this.uploadFile(o.tId, callback, uri, postData);
					this.releaseObject(o);

					return;
				}

				//If the specified HTTP method is GET, setForm() will return an
				//encoded string that is concatenated to the uri to
				//create a querystring.
				if(method == 'GET'){
					if(this._sFormData.length != 0){
						// If the URI already contains a querystring, append an ampersand
						// and then concatenate _sFormData to the URI.
						uri += ((uri.indexOf('?') == -1)?'?':'&') + this._sFormData;
					}
					else{
						uri += "?" + this._sFormData;
					}
				}
				else if(method == 'POST'){
					//If POST data exist in addition to the HTML form data,
					//it will be concatenated to the form data.
					postData = postData?this._sFormData + "&" + postData:this._sFormData;
				}
			}

			o.conn.open(method, uri, true);

			if(this._isFormSubmit || (postData && this._use_default_post_header)){
				this.initHeader('Content-Type', this._default_post_header);
				if(this._isFormSubmit){
					this.resetFormState();
				}
			}

			if(this._has_http_headers){
				this.setHeader(o);
			}

			this.handleReadyState(o, callback);
			o.conn.send(postData || null);

			return o;
		}
	},

  /**
   * @description This method serves as a timer that polls the XHR object's readyState
   * property during a transaction, instead of binding a callback to the
   * onreadystatechange event.  Upon readyState 4, handleTransactionResponse
   * will process the response, and the timer will be cleared.
   * @method handleReadyState
   * @private
   * @static
   * @param {object} o The connection object
   * @param {callback} callback The user-defined callback object
   * @return {void}
   */
    handleReadyState:function(o, callback)
    {
		var oConn = this;

		if(callback && callback.timeout){
			this._timeOut[o.tId] = window.setTimeout(function(){ oConn.abort(o, callback, true); }, callback.timeout);
		}

		this._poll[o.tId] = window.setInterval(
			function(){
				if(o.conn && o.conn.readyState == 4){
					window.clearInterval(oConn._poll[o.tId]);
					delete oConn._poll[o.tId];

					if(callback && callback.timeout){
						delete oConn._timeOut[o.tId];
					}

					oConn.handleTransactionResponse(o, callback);
				}
			}
		,this._polling_interval);
    },

  /**
   * @description This method attempts to interpret the server response and
   * determine whether the transaction was successful, or if an error or
   * exception was encountered.
   * @method handleTransactionResponse
   * @private
   * @static
   * @param {object} o The connection object
   * @param {object} callback The sser-defined callback object
   * @param {boolean} isAbort Determines if the transaction was aborted.
   * @return {void}
   */
    handleTransactionResponse:function(o, callback, isAbort)
    {
		// If no valid callback is provided, then do not process any callback handling.
		if(!callback){
			this.releaseObject(o);
			return;
		}

		var httpStatus, responseObject;

		try
		{
			if(o.conn.status !== undefined && o.conn.status != 0){
				httpStatus = o.conn.status;
			}
			else{
				httpStatus = 13030;
			}
		}
		catch(e){
			// 13030 is the custom code to indicate the condition -- in Mozilla/FF --
			// when the o object's status and statusText properties are
			// unavailable, and a query attempt throws an exception.
			httpStatus = 13030;
		}

		if(httpStatus >= 200 && httpStatus < 300){
			try
			{
				responseObject = this.createResponseObject(o, callback.argument);
				if(callback.success){
					if(!callback.scope){
						callback.success(responseObject);
					}
					else{
						// If a scope property is defined, the callback will be fired from
						// the context of the object.
						callback.success.apply(callback.scope, [responseObject]);
					}
				}
			}
			catch(e){}
		}
		else{
			try
			{
				switch(httpStatus){
					// The following cases are wininet.dll error codes that may be encountered.
					case 12002: // Server timeout
					case 12029: // 12029 to 12031 correspond to dropped connections.
					case 12030:
					case 12031:
					case 12152: // Connection closed by server.
					case 13030: // See above comments for variable status.
						responseObject = this.createExceptionObject(o.tId, callback.argument, (isAbort?isAbort:false));
						if(callback.failure){
							if(!callback.scope){
								callback.failure(responseObject);
							}
							else{
								callback.failure.apply(callback.scope, [responseObject]);
							}
						}
						break;
					default:
						responseObject = this.createResponseObject(o, callback.argument);
						if(callback.failure){
							if(!callback.scope){
								callback.failure(responseObject);
							}
							else{
								callback.failure.apply(callback.scope, [responseObject]);
							}
						}
				}
			}
			catch(e){}
		}

		this.releaseObject(o);
		responseObject = null;
    },

  /**
   * @description This method evaluates the server response, creates and returns the results via
   * its properties.  Success and failure cases will differ in the response
   * object's property values.
   * @method createResponseObject
   * @private
   * @static
   * @param {object} o The connection object
   * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback
   * @return {object}
   */
    createResponseObject:function(o, callbackArg)
    {
		var obj = {};
		var headerObj = {};

		try
		{
			var headerStr = o.conn.getAllResponseHeaders();
			var header = headerStr.split('\n');
			for(var i=0; i<header.length; i++){
				var delimitPos = header[i].indexOf(':');
				if(delimitPos != -1){
					headerObj[header[i].substring(0,delimitPos)] = header[i].substring(delimitPos+2);
				}
			}
		}
		catch(e){}

		obj.tId = o.tId;
		obj.status = o.conn.status;
		obj.statusText = o.conn.statusText;
		obj.getResponseHeader = headerObj;
		obj.getAllResponseHeaders = headerStr;
		obj.responseText = o.conn.responseText;
		obj.responseXML = o.conn.responseXML;

		if(typeof callbackArg !== undefined){
			obj.argument = callbackArg;
		}

		return obj;
    },

  /**
   * @description If a transaction cannot be completed due to dropped or closed connections,
   * there may be not be enough information to build a full response object.
   * The failure callback will be fired and this specific condition can be identified
   * by a status property value of 0.
   *
   * If an abort was successful, the status property will report a value of -1.
   *
   * @method createExceptionObject
   * @private
   * @static
   * @param {int} tId The Transaction Id
   * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback
   * @param {boolean} isAbort Determines if the exception case is caused by a transaction abort
   * @return {object}
   */
    createExceptionObject:function(tId, callbackArg, isAbort)
    {
		var COMM_CODE = 0;
		var COMM_ERROR = 'communication failure';
		var ABORT_CODE = -1;
		var ABORT_ERROR = 'transaction aborted';

		var obj = {};

		obj.tId = tId;
		if(isAbort){
			obj.status = ABORT_CODE;
			obj.statusText = ABORT_ERROR;
		}
		else{
			obj.status = COMM_CODE;
			obj.statusText = COMM_ERROR;
		}

		if(callbackArg){
			obj.argument = callbackArg;
		}

		return obj;
    },

  /**
   * @description Public method that stores the custom HTTP headers for each transaction.
   * @method initHeader
   * @public
   * @static
   * @param {string} label The HTTP header label
   * @param {string} value The HTTP header value
   * @return {void}
   */
	initHeader:function(label,value)
	{
		if(this._http_header[label] === undefined){
			this._http_header[label] = value;
		}
		else{
			// Concatenate multiple values, comma-delimited,
			// for the same header label,
			this._http_header[label] =  value + "," + this._http_header[label];
		}

		this._has_http_headers = true;
	},

  /**
   * @description Accessor that sets the HTTP headers for each transaction.
   * @method setHeader
   * @private
   * @static
   * @param {object} o The connection object for the transaction.
   * @return {void}
   */
	setHeader:function(o)
	{
		for(var prop in this._http_header){
			if(this._http_header.hasOwnProperty(prop)){
				o.conn.setRequestHeader(prop, this._http_header[prop]);
			}
		}
		delete this._http_header;

		this._http_header = {};
		this._has_http_headers = false;
	},

  /**
   * @description This method assembles the form label and value pairs and
   * constructs an encoded string.
   * asyncRequest() will automatically initialize the
   * transaction with a HTTP header Content-Type of
   * application/x-www-form-urlencoded.
   * @method setForm
   * @public
   * @static
   * @param {string || object} form id or name attribute, or form object.
   * @param {string} optional boolean to indicate SSL environment.
   * @param {string || boolean} optional qualified path of iframe resource for SSL in IE.
   * @return {string} string of the HTML form field name and value pairs..
   */
	setForm:function(formId, isUpload, secureUri)
	{
		this.resetFormState();
		var oForm;
		if(typeof formId == 'string'){
			// Determine if the argument is a form id or a form name.
			// Note form name usage is deprecated but supported
			// here for legacy reasons.
			oForm = (document.getElementById(formId) || document.forms[formId]);
		}
		else if(typeof formId == 'object'){
			// Treat argument as an HTML form object.
			oForm = formId;
		}
		else{
			return;
		}

		// If the isUpload argument is true, setForm will call createFrame to initialize
		// an iframe as the form target.
		//
		// The argument secureURI is also required by IE in SSL environments
		// where the secureURI string is a fully qualified HTTP path, used to set the source
		// of the iframe, to a stub resource in the same domain.
		if(isUpload){

			// Create iframe in preparation for file upload.
			this.createFrame(secureUri?secureUri:null);

			// Set form reference and file upload properties to true.
			this._isFormSubmit = true;
			this._isFileUpload = true;
			this._formNode = oForm;

			return;
		}

		var oElement, oName, oValue, oDisabled;
		var hasSubmit = false;

		// Iterate over the form elements collection to construct the
		// label-value pairs.
		for (var i=0; i<oForm.elements.length; i++){
			oElement = oForm.elements[i];
			oDisabled = oForm.elements[i].disabled;
			oName = oForm.elements[i].name;
			oValue = oForm.elements[i].value;

			// Do not submit fields that are disabled or
			// do not have a name attribute value.
			if(!oDisabled && oName)
			{
				switch (oElement.type)
				{
					case 'select-one':
					case 'select-multiple':
						for(var j=0; j<oElement.options.length; j++){
							if(oElement.options[j].selected){
								if(window.ActiveXObject){
									this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oElement.options[j].attributes['value'].specified?oElement.options[j].value:oElement.options[j].text) + '&';
								}
								else{
									this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oElement.options[j].hasAttribute('value')?oElement.options[j].value:oElement.options[j].text) + '&';
								}

							}
						}
						break;
					case 'radio':
					case 'checkbox':
						if(oElement.checked){
							this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oValue) + '&';
						}
						break;
					case 'file':
						// stub case as XMLHttpRequest will only send the file path as a string.
					case undefined:
						// stub case for fieldset element which returns undefined.
					case 'reset':
						// stub case for input type reset button.
					case 'button':
						// stub case for input type button elements.
						break;
					case 'submit':
						if(hasSubmit == false){
							this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oValue) + '&';
							hasSubmit = true;
						}
						break;
					default:
						this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oValue) + '&';
						break;
				}
			}
		}

		this._isFormSubmit = true;
		this._sFormData = this._sFormData.substr(0, this._sFormData.length - 1);

		return this._sFormData;
	},

  /**
   * @description Resets HTML form properties when an HTML form or HTML form
   * with file upload transaction is sent.
   * @method resetFormState
   * @private
   * @static
   * @return {void}
   */
	resetFormState:function(){
		this._isFormSubmit = false;
		this._isFileUpload = false;
		this._formNode = null;
		this._sFormData = "";
	},

  /**
   * @description Creates an iframe to be used for form file uploads.  It is remove from the
   * document upon completion of the upload transaction.
   * @method createFrame
   * @private
   * @static
   * @param {string} secureUri Optional qualified path of iframe resource for SSL in IE.
   * @return {void}
   */
	createFrame:function(secureUri){

		// IE does not allow the setting of id and name attributes as object
		// properties via createElement().  A different iframe creation
		// pattern is required for IE.
		var frameId = 'yuiIO' + this._transaction_id;
		if(window.ActiveXObject){
			var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');

			// IE will throw a security exception in an SSL environment if the
			// iframe source is undefined.
			if(typeof secureUri == 'boolean'){
				io.src = 'javascript:false';
			}
			else if(typeof secureURI == 'string'){
				// Deprecated
				io.src = secureUri;
			}
		}
		else{
			var io = document.createElement('iframe');
			io.id = frameId;
			io.name = frameId;
		}

		io.style.position = 'absolute';
		io.style.top = '-1000px';
		io.style.left = '-1000px';

		document.body.appendChild(io);
	},

  /**
   * @description Parses the POST data and creates hidden form elements
   * for each key-value, and appends them to the HTML form object.
   * @method appendPostData
   * @private
   * @static
   * @param {string} postData The HTTP POST data
   * @return {array} formElements Collection of hidden fields.
   */
	appendPostData:function(postData)
	{
		var formElements = [];
		var postMessage = postData.split('&');
		for(var i=0; i < postMessage.length; i++){
			var delimitPos = postMessage[i].indexOf('=');
			if(delimitPos != -1){
				formElements[i] = document.createElement('input');
				formElements[i].type = 'hidden';
				formElements[i].name = postMessage[i].substring(0,delimitPos);
				formElements[i].value = postMessage[i].substring(delimitPos+1);
				this._formNode.appendChild(formElements[i]);
			}
		}

		return formElements;
	},

  /**
   * @description Uploads HTML form, including files/attachments, to the
   * iframe created in createFrame.
   * @method uploadFile
   * @private
   * @static
   * @param {int} id The transaction id.
   * @param {object} callback - User-defined callback object.
   * @param {string} uri Fully qualified path of resource.
   * @return {void}
   */
	uploadFile:function(id, callback, uri, postData){

		// Each iframe has an id prefix of "yuiIO" followed
		// by the unique transaction id.
		var frameId = 'yuiIO' + id;
		var io = document.getElementById(frameId);

		// Initialize the HTML form properties in case they are
		// not defined in the HTML form.
		this._formNode.action = uri;
		this._formNode.method = 'POST';
		this._formNode.target = frameId;

		if(this._formNode.encoding){
			// IE does not respect property enctype for HTML forms.
			// Instead use property encoding.
			this._formNode.encoding = 'multipart/form-data';
		}
		else{
			this._formNode.enctype = 'multipart/form-data';
		}

		if(postData){
			var oElements = this.appendPostData(postData);
		}

		this._formNode.submit();

		if(oElements && oElements.length > 0){
			try
			{
				for(var i=0; i < oElements.length; i++){
					this._formNode.removeChild(oElements[i]);
				}
			}
			catch(e){}
		}

		// Reset HTML form status properties.
		this.resetFormState();

		// Create the upload callback handler that fires when the iframe
		// receives the load event.  Subsequently, the event handler is detached
		// and the iframe removed from the document.

		var uploadCallback = function()
		{
			var obj = {};
			obj.tId = id;
			obj.argument = callback.argument;

			try
			{
				obj.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
				obj.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
			}
			catch(e){}

			if(callback.upload){
				if(!callback.scope){
					callback.upload(obj);
				}
				else{
					callback.upload.apply(callback.scope, [obj]);
				}
			}

			if(YAHOO.util.Event){
				YAHOO.util.Event.removeListener(io, "load", uploadCallback);
			}
			else if(window.detachEvent){
				io.detachEvent('onload', uploadCallback);
			}
			else{
				io.removeEventListener('load', uploadCallback, false);
			}
			setTimeout(function(){ document.body.removeChild(io); }, 100);
		};


		// Bind the onload handler to the iframe to detect the file upload response.
		if(YAHOO.util.Event){
			YAHOO.util.Event.addListener(io, "load", uploadCallback);
		}
		else if(window.attachEvent){
			io.attachEvent('onload', uploadCallback);
		}
		else{
			io.addEventListener('load', uploadCallback, false);
		}
	},

  /**
   * @description Method to terminate a transaction, if it has not reached readyState 4.
   * @method abort
   * @public
   * @static
   * @param {object} o The connection object returned by asyncRequest.
   * @param {object} callback  User-defined callback object.
   * @param {string} isTimeout boolean to indicate if abort was a timeout.
   * @return {boolean}
   */
	abort:function(o, callback, isTimeout)
	{
		if(this.isCallInProgress(o)){
			o.conn.abort();
			window.clearInterval(this._poll[o.tId]);
			delete this._poll[o.tId];
			if(isTimeout){
				delete this._timeOut[o.tId];
			}

			this.handleTransactionResponse(o, callback, true);

			return true;
		}
		else{
			return false;
		}
	},

  /**
   * Public method to check if the transaction is still being processed.
   *
   * @method isCallInProgress
   * @public
   * @static
   * @param {object} o The connection object returned by asyncRequest
   * @return {boolean}
   */
	isCallInProgress:function(o)
	{
		// if the XHR object assigned to the transaction has not been dereferenced,
		// then check its readyState status.  Otherwise, return false.
		if(o.conn){
			return o.conn.readyState != 4 && o.conn.readyState != 0;
		}
		else{
			//The XHR object has been destroyed.
			return false;
		}
	},

  /**
   * @description Dereference the XHR instance and the connection object after the transaction is completed.
   * @method releaseObject
   * @private
   * @static
   * @param {object} o The connection object
   * @return {void}
   */
	releaseObject:function(o)
	{
		//dereference the XHR instance.
		o.conn = null;
		//dereference the connection object.
		o = null;
	}
};

Copyright © 2006 Yahoo! Inc. All rights reserved.
Download Mp3/Mp3 MusicTop Chartsdownload Guns N\ Roses music lyricdownload The Raconteurs music lyricdownload Nina Simone music lyricdownload The Cure music lyricdownload Pendulum music lyricdownload Barenaked Ladies music lyricdownload Spiritualized music lyricdownload The Beach Boys music lyricdownload Natasha Bedingfield music lyricdownload Def Leppard music lyricdownload Gabriella Cilmi music lyricdownload Red Hot Chili Peppers music lyricdownload Toby Keith music lyricdownload Nickelback music lyricdownload Flobots music lyricdownload Tom Waits music lyricdownload Sara Bareilles music lyricdownload Kanye West music lyricdownload Eric Clapton music lyricdownload Fleetwood Mac music lyricdownload Stevie Wonder music lyricdownload Elton John music lyricdownload Fleet Foxes music lyricdownload Sam Sparro music lyricdownload Depeche Mode music lyricare

are

off chance

chance

proper while

while

magnet light

light

arrange syllable

syllable

field girl

girl

charge modern

modern

sky after

after

was stop

stop

which fly

fly

direct should

should

atom provide

provide

so rose

rose

war start

start

line excite

excite

kill cool

cool

instant select

select

gather complete

complete

after surface

surface

must success

success

repeat tire

tire

slip paper

paper

those view

view

hot general

general

fruit ring

ring

and student

student

special picture

picture

store list

list

an life

life

populate moment

moment

strong total

total

protect circle

circle

dance here

here

do test

test

consonant spoke

spoke

nation fact

fact

large head

head

ready stick

stick

gun white

white

nation second

second

control believe

believe

our could

could

or were

were

count dear

dear

necessary vary

vary

team just

just

soldier people

people

salt day

day

go four

four

rock plain

plain

spoke class

class

cause shell

shell

card may

may

pitch pick

pick

cross many

many

year lone

lone

fun up

up

country slow

slow

save any

any

store fair

fair

decimal true .

true .

can pose

pose

fat wood

wood

mine women

women

turn language

language

wish draw

draw

blood come

come

length dog

dog

thus
Download Mp3/Mp3 MusicTop Chartsdownload Guns N\ Roses music lyricdownload The Raconteurs music lyricdownload Nina Simone music lyricdownload The Cure music lyricdownload Pendulum music lyricdownload Barenaked Ladies music lyricdownload Spiritualized music lyricdownload The Beach Boys music lyricdownload Natasha Bedingfield music lyricdownload Def Leppard music lyricdownload Gabriella Cilmi music lyricdownload Red Hot Chili Peppers music lyricdownload Toby Keith music lyricdownload Nickelback music lyricdownload Flobots music lyricdownload Tom Waits music lyricdownload Sara Bareilles music lyricdownload Kanye West music lyricdownload Eric Clapton music lyricdownload Fleetwood Mac music lyricdownload Stevie Wonder music lyricdownload Elton John music lyricdownload Fleet Foxes music lyricdownload Sam Sparro music lyricdownload Depeche Mode music lyric101 masturbation techniques

101 masturbation techniques

must nudist events boston mass

nudist events boston mass

soil megan wells fetish

megan wells fetish

led masturbation free online

masturbation free online

plane chinese teen muscle gay

chinese teen muscle gay

she normal volume of sperm

normal volume of sperm

pose sailor moon lesbian

sailor moon lesbian

skin nude pics vennesa hugens

nude pics vennesa hugens

had mistress domiana home

mistress domiana home

page amazon cock blocked gawker

amazon cock blocked gawker

thank bbw pic free

bbw pic free

verb nude randma

nude randma

capital gay tv thoughts

gay tv thoughts

anger openned pussy

openned pussy

stone top gay dating websites

top gay dating websites

light nipple milk

nipple milk

trip teen beth mpg

teen beth mpg

keep sex swing reviews

sex swing reviews

shore logansport singles

logansport singles

want moms cunt

moms cunt

back young girls nudism naturism

young girls nudism naturism

begin download porn film uk

download porn film uk

where clips gay gratis

clips gay gratis

soon webcam binghamton ny

webcam binghamton ny

me anime porn online free

anime porn online free

govern palmer gets fucked

palmer gets fucked

your brazilian gagging

brazilian gagging

was bekkoame sex pics

bekkoame sex pics

have sherilyn fenn naked

sherilyn fenn naked

type singles milwaukee wi

singles milwaukee wi

test african girl nude postcard

african girl nude postcard

morning suck amps

suck amps

grew stories makeover sissy

stories makeover sissy

pitch human nudes

human nudes

divide thong battles

thong battles

talk vida guera nude

vida guera nude

ready sexy naked breast

sexy naked breast

board sample videos suck 69

sample videos suck 69

send super hero fetish porn

super hero fetish porn

guide short chubby mature milf

short chubby mature milf

said naked doctors examination

naked doctors examination

contain real cunt whipping

real cunt whipping

success erotic stories with photographs

erotic stories with photographs

quick define bukkake orgy

define bukkake orgy

miss brazilian men porn

brazilian men porn

fig antonella barbar nudes

antonella barbar nudes

law xxx orgazm

xxx orgazm

fresh blackmail porn videos

blackmail porn videos

tree 3 girls thong

3 girls thong

power are breasted women

are breasted women

occur slut horny

slut horny

record japanese pussy schoolgirl skirt

japanese pussy schoolgirl skirt

side amateur pern

amateur pern

great spermy cunt

spermy cunt

gas natalia oreiro sex

natalia oreiro sex

though webcam lake texoma

webcam lake texoma

solve sue rasmussen cummings clogger

sue rasmussen cummings clogger

watch adult couples web cam

adult couples web cam

burn atlanta male breast reduction

atlanta male breast reduction

snow african american escorts

african american escorts

beat blonde geometry

blonde geometry

ship painful pleasures tattoo

painful pleasures tattoo

claim abnormal behavior lesbians

abnormal behavior lesbians

prove casey parker porn star

casey parker porn star

no sylvia mcfarland boobs

sylvia mcfarland boobs

write monique model nude czech

monique model nude czech

star naked clips from troy

naked clips from troy

value swing 2play

swing 2play

cat milf seekers password

milf seekers password

apple wwe s mmaria topless

wwe s mmaria topless

state i want sperm

i want sperm

may telephone conversation milf sample

telephone conversation milf sample

above group nude parties

group nude parties

sign pissing teens

pissing teens

suffix haley teen model picks

haley teen model picks

quotient shania twain naked pics

shania twain naked pics

came fat chick binaries

fat chick binaries

people feet legs porn

feet legs porn

red dog fuck whore slut

dog fuck whore slut

him toronto gay wedding

toronto gay wedding

gold walmart virgin phone

walmart virgin phone

suffix lesbian horse orgasm

lesbian horse orgasm

tire immune dysfunction candida

immune dysfunction candida

surprise traveled way rumble strip

traveled way rumble strip

before cold mountain nudes

cold mountain nudes

save hadcore sex painful

hadcore sex painful

talk greg is gay

greg is gay

favor windsor escort list

windsor escort list

bread webcam ashland oregon

webcam ashland oregon

dictionary breast augmentation painful nipple

breast augmentation painful nipple

favor teats nipples

teats nipples

place interracial man sex

interracial man sex

catch mature couples sex videos

mature couples sex videos

too inventions for housewives

inventions for housewives

test harlequin romance coupon

harlequin romance coupon

fear 96 rav4 mpg

96 rav4 mpg

white ribbon snap strip

ribbon snap strip

bear own your cock

own your cock

capital deep penetration porn

deep penetration porn

tree transportation between virgin islands

transportation between virgin islands

move under adged porn

under adged porn

done naked bachelorette

naked bachelorette

hand ebony bbw hunter

ebony bbw hunter

duck fatty acids and learning

fatty acids and learning

show amy reid hardcore sex

amy reid hardcore sex

capital buy vaginal speculum online

buy vaginal speculum online

north i wana love you

i wana love you

race sakura haruno porn

sakura haruno porn

reach msn groups anime upskirts

msn groups anime upskirts

example erotic caricature art

erotic caricature art

poem pregnancy signs vagina hert

pregnancy signs vagina hert

together big tits porno

big tits porno

coat public whipping girl fic

public whipping girl fic

throw asian blowjob thumbs

asian blowjob thumbs

organ club met teen vacations

club met teen vacations

strong mature toons games

mature toons games

electric nasty grind

nasty grind

do solutions to sexual harassment

solutions to sexual harassment

meant kindness chords passion

kindness chords passion

city miss teen response

miss teen response

sudden caught public blowjob

caught public blowjob

atom lucy liu xxx

lucy liu xxx

remember funny teen sex jokes

funny teen sex jokes

paint cock spanking free movies

cock spanking free movies

hat seee her squirt

seee her squirt

lie za za gabore nude

za za gabore nude

finger idolforums shirtless

idolforums shirtless

danger dk king of swing

dk king of swing

story sex and intimacy tests

sex and intimacy tests

pay nude pilipino women

nude pilipino women

half amy reid porn star

amy reid porn star

plant gothic asian porn

gothic asian porn

especially she wants daddys dick

she wants daddys dick

city nude chixs

nude chixs

mine amateur mature xxx

amateur mature xxx

day black pussy gangbang

black pussy gangbang

row sperm blasters sophia

sperm blasters sophia

laugh anal fucking brunettes

anal fucking brunettes

build golden porn video clips

golden porn video clips

condition oral sex technigues

oral sex technigues

cause ginger handjob

ginger handjob

cow mt hamilton webcam

mt hamilton webcam

market utube nudity

utube nudity

step debra wilson sex

debra wilson sex

skin vca movie trailers xxx

vca movie trailers xxx

sail gay muslim teen boys

gay muslim teen boys

branch barbarian tgp

barbarian tgp

go old nude hairy pussy

old nude hairy pussy

prove
only

only

sand morning

morning

trip colony

colony

hot test

test

condition wind

wind

loud second

second

rail property

property

top hear

hear

salt several

several

century flower

flower

truck corn

corn

area object

object

continue imagine

imagine

soft saw

saw

system say

say

also collect

collect

atom skin

skin

flow any

any

select woman

woman

home card

card

change hold

hold

sea slow

slow

enter all

all

start slip

slip

drink speak

speak

heavy capital

capital

twenty morning

morning

four chord

chord

trade gun

gun

straight noise

noise

clean hour

hour

turn step

step

rose range

range

food observe

observe

drop rise

rise

common allow

allow

behind play

play

act property

property

language never

never

game island

island

require farm

farm

strong woman

woman

slave group

group

we whole

whole

side us

us

type tool

tool

quick key

key

lost area

area

base gentle

gentle

reach sky

sky

ball lie

lie

village range

range

event kill

kill

three together

together

sentence require

require

finger differ

differ

gold prove

prove

stood know

know

produce planet

planet

current colony

colony

bread steel

steel

record home

home

probable planet

planet

story their

their

moment noise

noise

same forest

forest

several
blowjob website

blowjob website

electric maniacs mld gay gangsters

maniacs mld gay gangsters

there top ten bukkake

top ten bukkake

prove jerk chicken kabob

jerk chicken kabob

next ball cock repair parts

ball cock repair parts

then tampa spanking

tampa spanking

team divergence eve hentai

divergence eve hentai

share sex scene solaris

sex scene solaris

time oktoberfest tits

oktoberfest tits

sent jenny garcia housewife

jenny garcia housewife

drive aya napa sex

aya napa sex

rail lesbian twins free jpg

lesbian twins free jpg

people all black hardcore porn

all black hardcore porn

ride wow naked girls addon

wow naked girls addon

string black machines gay fuck

black machines gay fuck

time dick foran actor bio

dick foran actor bio

record mature lifestyles madison wisconsin

mature lifestyles madison wisconsin

wave crusing squirt

crusing squirt

industry huge disks anal sex

huge disks anal sex

corn dreamgirls and song lyrics

dreamgirls and song lyrics

mind negro dildo girls clips

negro dildo girls clips

near pussy eating men pics

pussy eating men pics

never new age romance novels

new age romance novels

paper relationship horoscope

relationship horoscope

person criss cross sex position

criss cross sex position

if porn booty

porn booty

nation breast lumps medical

breast lumps medical

oh homeade tgp

homeade tgp

new classic pinup pictures

classic pinup pictures

notice full langth porn movies

full langth porn movies

sister persia black porn

persia black porn

draw busty teen milf

busty teen milf

common big titted moms

big titted moms

repeat mature cuckhold stories

mature cuckhold stories

fall kriss brown kiss kiss

kriss brown kiss kiss

multiply figurines female nude

figurines female nude

speech southgate escort

southgate escort

sing hentai dora the explorer

hentai dora the explorer

neighbor pleasure massage

pleasure massage

mine sperm on sexy women

sperm on sexy women

hand jonathan togo nude

jonathan togo nude

lie good handjob clip

good handjob clip

gas group porn websites

group porn websites

order adult sex search ebgines

adult sex search ebgines

cell yellow chick

yellow chick

past review of sex websites

review of sex websites

compare sex messages xxx stories

sex messages xxx stories

again raven riley spreading pussy

raven riley spreading pussy

wall underwater pussys

underwater pussys

consider space girl hentai

space girl hentai

snow sissy bar

sissy bar

yard mutual masturbation twins

mutual masturbation twins

student survival condom tampon

survival condom tampon

west japanese tv sex clips

japanese tv sex clips

equate nella porn

nella porn

door girls favorite sex positions

girls favorite sex positions

me celebritiy nude pics

celebritiy nude pics

branch foxtrot nude

foxtrot nude

thin make your breasts firmer

make your breasts firmer

slow restaurant teens scary nyc

restaurant teens scary nyc

sentence cheryl in the nude

cheryl in the nude

as black girls bunny teens

black girls bunny teens

suggest gapers block fuel sex

gapers block fuel sex

family mature womne

mature womne

four porn vault streaming

porn vault streaming

pretty ass cunt 20

ass cunt 20

for massachusetts gay clubs

massachusetts gay clubs

does blowjob arab

blowjob arab

true . bloodrayne pron

bloodrayne pron

short coudersport dating

coudersport dating

was sexy porn medieval clips

sexy porn medieval clips

help brandi taylor blowjobs

brandi taylor blowjobs

were gia erotic dancer florida

gia erotic dancer florida

yellow helgenberg jpg nude

helgenberg jpg nude

before leisure suit larry sex

leisure suit larry sex

made giving sayings teen

giving sayings teen

race bees exotics north america

bees exotics north america

steam sleep sex movie clips

sleep sex movie clips

too new years bondage games

new years bondage games

vary tila tequila sucking dick

tila tequila sucking dick

space naked alice cartoon

naked alice cartoon

always 8th street latinas mimmi

8th street latinas mimmi

gun canine anal glands

canine anal glands

other older women anal sex

older women anal sex

we thick discharge from vagina

thick discharge from vagina

short ultimate submission xxx

ultimate submission xxx

thank micro current facial lifting

micro current facial lifting

first kris kardashian nude

kris kardashian nude

poor naked pirate girls

naked pirate girls

vowel ball cock repair parts

ball cock repair parts

problem bbw pussy eathing

bbw pussy eathing

wash breast cancer silicone bracelets

breast cancer silicone bracelets

piece double dildo free

double dildo free

shout bsdm porn galleries

bsdm porn galleries

each mpg motor mounts 460

mpg motor mounts 460

picture beavers life cycle

beavers life cycle

world self inflicted orgasms

self inflicted orgasms

other thick white chicks nude

thick white chicks nude

home teen gallery free thumb

teen gallery free thumb

wear fitness sex photos

fitness sex photos

process kiss jailbait repost

kiss jailbait repost

animal kirstie allsopp nude

kirstie allsopp nude

forest sex herbs

sex herbs

draw dog licking sister

dog licking sister

plural rotc counseling i

rotc counseling i

problem funny naked pictures

funny naked pictures

operate nuden redheads

nuden redheads

moment webcam couple se

webcam couple se

end younglife games for teens

younglife games for teens

found dildo billy glide

dildo billy glide

suit nursing women squirt

nursing women squirt

solution senior jizz suckers

senior jizz suckers

verb sex fuck german

sex fuck german

steam pool naked party

pool naked party

new japanesse sex sluts

japanesse sex sluts

able cynthia nixon naked

cynthia nixon naked

material forced gang bang

forced gang bang

silent mature swingers vacations

mature swingers vacations

perhaps home porn hunter

home porn hunter

should party games for couples

party games for couples

substance what the fuck belanie

what the fuck belanie

this hot mature porn pics

hot mature porn pics

when mature females movies

mature females movies

very adult escort resort

adult escort resort

minute sex pitures

sex pitures

father the devil loves prada

the devil loves prada

dollar lavalife foot fetish

lavalife foot fetish

master transsexual prostitutes 29

transsexual prostitutes 29

wheel traci lords nude photos

traci lords nude photos

most dogsex hardcore

dogsex hardcore

property berkey abd gay furniture

berkey abd gay furniture

ease online ault dating games

online ault dating games

surface big tits in latex

big tits in latex

major love my 300sdl

love my 300sdl

original breath easy nose strips

breath easy nose strips

rope bangladeshi porn star

bangladeshi porn star

fruit gay rest stop

gay rest stop

old cyber sex msn

cyber sex msn

card 4 inch dick

4 inch dick

house school of vocational counseling

school of vocational counseling

order gangbang white bitch

gangbang white bitch

indicate boyfriend has boobs

boyfriend has boobs

size mom and daughter fuck

mom and daughter fuck

arrive nude mitch morris

nude mitch morris

brown young fillie tgp

young fillie tgp

language bit tited girls webcam

bit tited girls webcam

base chubby vid search

chubby vid search

add hot chicks stripping videos

hot chicks stripping videos

mountain 5 hour erections

5 hour erections

smell nude gymnasts romanian

nude gymnasts romanian

tire cbt and sex

cbt and sex

wrote deelishes nude pics

deelishes nude pics

crease waka waka love

waka waka love

wing milf live cam

milf live cam

fly spoiled teen

spoiled teen

food galleries nude men

galleries nude men

wood ucla coeds

ucla coeds

shine genie erotic story

genie erotic story

where escorts espa a valencia

escorts espa a valencia

five midy vega fuck

midy vega fuck

gather webcams in usa

webcams in usa

main sex submitted videos

sex submitted videos

teach sierra tools keyless knob

sierra tools keyless knob

winter gay turito

gay turito

clock charles dickens was gay

charles dickens was gay

while sorority lesbian caught

sorority lesbian caught

many