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

YAHOO.util.Connect={_msxml_progid:['MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'],
_http_headers:{},
_has_http_headers:false,
_use_default_post_header:true,
_default_post_header:'application/x-www-form-urlencoded; charset=UTF-8',
_use_default_xhr_header:true,
_default_xhr_header:'XMLHttpRequest',
_has_default_headers:true,
_default_headers:{},
_isFormSubmit:false,
_isFileUpload:false,
_formNode:null,
_sFormData:null,
_poll:{},
_timeOut:{},
_polling_interval:50,_transaction_id:0,
_submitElementValue:null,_hasSubmitListener:(function()

{if (YAHOO.util.Event)

	{YAHOO.util.Event.addListener(document,'click',function(e)
	
	{var obj=YAHOO.util.Event.getTarget(e);
	
	if(obj.type=='submit')

	{YAHOO.util.Connect._submitElementValue=encodeURIComponent(obj.name)+"="+encodeURIComponent(obj.value);}})

return true;}

return false;})(),setProgId:function(id)
{this._msxml_progid.unshift(id);},setDefaultPostHeader:function(b)
{this._use_default_post_header=b;},setDefaultXhrHeader:function(b)
{this._use_default_xhr_header=b;},setPollingInterval:function(i)

{if(typeof i=='number'&&isFinite(i))
{this._polling_interval=i;}},createXhrObject:function(transactionId)
{var obj,http;try
{http=new XMLHttpRequest();
obj={conn:http,tId:transactionId};}
catch(e)
{for(var i=0;i<this._msxml_progid.length;++i)
{try
{http=new ActiveXObject(this._msxml_progid[i]);
obj={conn:http,tId:transactionId};
break;}
catch(e){}}}
finally
{return obj;}},getConnectionObject:function()
{var o;var tId=this._transaction_id;
try
{o=this.createXhrObject(tId);
if(o){this._transaction_id++;}}
catch(e){}
finally
{return o;}},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(method.toUpperCase()=='GET')

		{if (this._sFormData.length!=0)
			{uri+=((uri.indexOf('?')==-1)?'?':'&')+this._sFormData;}
		else
			{uri+="?"+this._sFormData;}
		}

	else if (method.toUpperCase()=='POST')
		{postData=postData?this._sFormData+"&"+postData:this._sFormData;}
	
	}

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

if(this._use_default_xhr_header)
	{if(!this._default_headers['X-Requested-With'])
		{this.initHeader('X-Requested-With',this._default_xhr_header,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_default_headers||this._has_http_headers)
{this.setHeader(o);}
this.handleReadyState(o,callback);
o.conn.send(postData||null);
return o;}},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);},
handleTransactionResponse:function(o,callback,isAbort)
{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){httpStatus=13030;}
if(httpStatus>=200&&httpStatus<300||httpStatus===1223)
{responseObject=this.createResponseObject(o,callback.argument);
if(callback.success){if(!callback.scope)
{callback.success(responseObject);}
else{callback.success.apply(callback.scope,[responseObject]);}}}
else{switch(httpStatus)
{case 12002:case 12029:case 12030:case 12031:case 12152:
case 13030: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]);}}}}
this.releaseObject(o);responseObject=null;},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==1223)?204:o.conn.status;
obj.statusText=(o.conn.status==1223)?"No Content":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;},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;},initHeader:function(label,value,isDefault)
{var headerObj=(isDefault)?this._default_headers:this._http_headers;
if(headerObj[label]===undefined){headerObj[label]=value;}
else{headerObj[label]=value+","+headerObj[label];}
if(isDefault){this._has_default_headers=true;}
else{this._has_http_headers=true;}},setHeader:function(o)
{if(this._has_default_headers)
{for(var prop in this._default_headers)
{if(YAHOO.lang.hasOwnProperty(this._default_headers,prop))
{o.conn.setRequestHeader(prop,this._default_headers[prop]);}}}
if(this._has_http_headers)
{for(var prop in this._http_headers)
{if(YAHOO.lang.hasOwnProperty(this._http_headers,prop))
{o.conn.setRequestHeader(prop,this._http_headers[prop]);}}
delete this._http_headers;
this._http_headers={};
this._has_http_headers=false;}},resetDefaultHeaders:function()
{delete this._default_headers
this._default_headers={};
this._has_default_headers=false;},setForm:function(formId,isUpload,secureUri)
{this.resetFormState();var oForm;
if(typeof formId=='string')
{oForm=(document.getElementById(formId)||document.forms[formId]);}
else if(typeof formId=='object'){oForm=formId;}
else{return;}
if(isUpload)
{this.createFrame(secureUri?secureUri:null);
this._isFormSubmit=true;
this._isFileUpload=true;
this._formNode=oForm;return;}
var oElement,oName,oValue,oDisabled;var hasSubmit=false;
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;
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':
case undefined:
case'reset':
case'button':
break;
case'submit':
if(hasSubmit===false)
{if(this._hasSubmitListener)
{this._sFormData+=this._submitElementValue+'&';}
else{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;},resetFormState:function()
{this._isFormSubmit=false;this._isFileUpload=false;
this._formNode=null;this._sFormData="";},createFrame:function(secureUri)
{var frameId='yuiIO'+this._transaction_id;if(window.ActiveXObject)
{var io=document.createElement('<iframe id="'+frameId+'" name="'+frameId+'" />');
if(typeof secureUri=='boolean'){io.src='javascript:false';}
else if(typeof secureURI=='string'){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);},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;},uploadFile:function(id,callback,uri,postData)
{var frameId='yuiIO'+id;
var uploadEncoding='multipart/form-data';
var io=document.getElementById(frameId);
this._formNode.setAttribute('action',uri);
this._formNode.setAttribute('method','POST');
this._formNode.setAttribute("target",frameId);
if(this._formNode.encoding)
{this._formNode.encoding=uploadEncoding;}

else
	{this._formNode.enctype=uploadEncoding;}
if(postData){var oElements=this.appendPostData(postData);}
this._formNode.submit();
if(oElements&&oElements.length>0)
{for(var i=0;i<oElements.length;i++)
{this._formNode.removeChild(oElements[i]);}}
this.resetFormState();
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&&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);};
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);}},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;}},isCallInProgress:function(o)
{if(o.conn){return o.conn.readyState!==4&&o.conn.readyState!==0;}
else{return false;}},releaseObject:function(o)
{o.conn=null;o=null;}};
YAHOO.register("connection",YAHOO.util.Connect,{version:"2.2.2",build:"204"});
