
var topWindow=window,windowCount=0;while(windowCount<10){windowCount++;try{if(topWindow==topWindow.parent)break;topWindow.parent.paraturePermissionTest=true;topWindow=topWindow.parent;}catch(e){break;}}
if(typeof topWindow.PARATURE=='undefined')topWindow.PARATURE={};if(typeof topWindow.PARATURE.ajax=='undefined')topWindow.PARATURE.ajax={};if(typeof PARATURE=='undefined')PARATURE=topWindow.PARATURE;var ajaxGateway=function(configs){if(typeof(configs)=='undefined'){configs={};}
var me=this;var defaultBatchMessages=true;var defaultPostUrl="/jsonrequest/RequestHandler.aspx";var defaultMaxOpenConnectionCount=1;me.queuedMessages=[];me.openConnections=[];me.canceledMessages=[];me.nMessages=0;me.pumpTimeout=null;me.config={};me.config.maxOpenConnectionCount=(typeof(configs.maxOpenConnectionCount)!='undefined'&&!isNaN(configs.maxOpenConnectionCount))?configs.maxOpenConnectionCount:defaultMaxOpenConnectionCount;me.config.postUrl=(typeof(configs.postUrl)!='undefined')?configs.postUrl:defaultPostUrl;me.config.batchMessages=(typeof(configs.batchMessages)!='undefined')?configs.batchMessages:defaultBatchMessages;me.config.messagePump=new PARATURE.messagePump();me.registerSingle=function(callbackFunction){return me.config.messagePump.registerSingle(callbackFunction,"AjaxIn");}
me.registerPermanent=function(callbackFunction){return me.config.messagePump.registerPermanent(callbackFunction,"AjaxIn");}
me.register=me.registerPermanent;me.unregister=me.config.messagePump.unregister;me.send=me.config.messagePump.send;me.createMessage=function(){return me.config.messagePump.create("AjaxOut");}
me.messageHandler=function(message){var messageObject={Id:me.nMessages++,ServiceName:message.ServiceName,OperationName:message.OperationName,SessionId:message.SessionId,Arguments:{},CallbackHandler:message.CallbackHandler,InternalArguments:null};if(typeof(message.InternalArguments)!="undefined"){messageObject.InternalArguments=message.InternalArguments;}
for(var o in message.Arguments){if(message.Arguments.hasOwnProperty(o)){messageObject.Arguments[o]=YAHOO.lang.JSON.stringify(message.Arguments[o]);}}
me.queuedMessages.push(messageObject);if(me.openConnections.length<me.config.maxOpenConnectionCount&&me.pumpTimeout==null){me.pumpTimeout=setTimeout(me.pumpMessage,1);}else if(me.openConnections.length<me.config.maxOpenConnectionCount&&me.pumpTimeout!=null){clearTimeout(me.pumpTimeout);me.pumpTimeout=setTimeout(me.pumpMessage,1);}};me.config.messagePump.registerPermanent(me.messageHandler,"AjaxOut");me.pumpMessage=function(){function cloneObject(obj){for(var o in obj){this[o]=obj[o];}}
me.pumpTimeout=null;if(me.openConnections.length>=me.config.maxOpenConnectionCount){return;}
var ajaxClient=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");var messageObject=me.queuedMessages.shift();var localMessages=[messageObject];var payload=[new cloneObject(messageObject)];delete payload[0].CallbackHandler;delete payload[0].InternalArguments;if(me.config.batchMessages){while(messageObject=me.queuedMessages.shift()){localMessages.push(messageObject);payload.push(new cloneObject(messageObject));delete payload[payload.length-1].CallbackHandler;delete payload[payload.length-1].InternalArguments;}}
ajaxClient.onreadystatechange=me.generateResponseHandler(ajaxClient,me,localMessages);me.openConnections.push(ajaxClient);ajaxClient.open("POST",me.config.postUrl,true);ajaxClient.setRequestHeader("Content-type","text/html; charset=utf-8");payload=YAHOO.lang.JSON.stringify(payload);ajaxClient.send(payload);};me.generateResponseHandler=function(connection,gateway,messages){return function(){try{if(connection.readyState!=4){return;}
for(var i=0;i<gateway.openConnections.length;i++){if(gateway.openConnections[i]==connection){gateway.openConnections.splice(i,1);break;}}
if(gateway.queuedMessages.length>0){if(me.pumpTimeout!=null){clearTimeout(me.pumpTimeout);}
me.pumpTimeout=setTimeout(gateway.pumpMessage,1);}
try{var returnedMessages=eval(connection.responseText);}catch(e){connection=null;for(var i=0;i<messages.length;i++){var messageObject=messages[i];var message=me.config.messagePump.create("AjaxIn");message.ServiceName=messageObject.ServiceName;message.OperationName=messageObject.OperationName;message.CallWasSuccessful=false;message.ErrorMessage="Error parsing response message bundle.";message.data=null;message.InternalArguments=messageObject.InternalArguments;me.config.messagePump.send(message,messageObject.CallbackHandler);}
throw"Error parsing response message bundle.";}
connection=null;if(returnedMessages.length!=messages.length){for(var i=0;i<messages.length;i++){var messageObject=messages[i];var message=me.config.messagePump.create("AjaxIn");message.ServiceName=messageObject.ServiceName;message.OperationName=messageObject.OperationName;message.CallWasSuccessful=false;message.ErrorMessage="Error parsing response message bundle.";message.data=null;message.InternalArguments=messageObject.InternalArguments;me.config.messagePump.send(message,messageObject.CallbackHandler);}
throw"Returned bundle length is not the same length as request bundle length.";}
for(var i=0;i<messages.length;i++){var messageObject=messages[i];for(var j=0;j<returnedMessages.length;j++){if(messageObject.Id==returnedMessages[j].Id){var message=me.config.messagePump.create("AjaxIn");message.ServiceName=messageObject.ServiceName;message.OperationName=messageObject.OperationName;message.CallWasSuccessful=returnedMessages[j].CallWasSuccessful;message.ErrorMessage=returnedMessages[j].ErrorMessage;message.data=returnedMessages[j].ReturnData;message.InternalArguments=messageObject.InternalArguments;me.config.messagePump.send(message,messageObject.CallbackHandler);break;}}}}catch(e){}};};}
PARATURE.messagePump=function(settings){var me=this;if(typeof settings=='undefined')settings=Array();function def(key,def_val){if(typeof(settings[key])=='undefined')settings[key]=def_val;}
def("tbd","something");var permanentMessageHandlers=Array();var singleMessageHandlers=Array();var nHandlers=0;function registerPermanent(callback,comparitor){if(typeof comparitor=='undefined')comparitor=null;var handler={id:nHandlers++,callback:callback,comparitor:comparitor}
permanentMessageHandlers.push(handler);return handler.id;}
function registerSingle(callback,comparitor){if(typeof comparitor=='undefined')comparitor=null;var handler={id:nHandlers++,callback:callback,comparitor:comparitor}
singleMessageHandlers.push(handler);return handler.id;}
function unregister(handle){for(var n=0;n<permanentMessageHandlers.length;n++){if(permanentMessageHandlers[n].id==handle){permanentMessageHandlers.splice(n,1);return;}}
for(var n=0;n<singleMessageHandlers.length;n++){if(singleMessageHandlers[n].id==handle){singleMessageHandlers.splice(n,1);return;}}}
function create(type){if(typeof type=='undefined')type='';return{type:type};}
function isString(a){return(typeof(a)==='string')?true:(typeof(a)==='object')?a.constructor.toString().match(/string/i)!==null:false;}
function isRegex(a){return(typeof(a)==='function'||typeof(a)==='object')?a.constructor.toString().match(/regexp/i)!==null:false;}
function send(message,handlerId){if(typeof(handlerId)!='undefined'){for(var i=0;i<singleMessageHandlers.length;i++){if(handlerId==singleMessageHandlers[i].id){try{singleMessageHandlers[i].callback(message);}catch(e){}
singleMessageHandlers.splice(i,1);return;}}
for(var i=0;i<permanentMessageHandlers.length;i++){if(handlerId==permanentMessageHandlers[i].id){try{permanentMessageHandlers[i].callback(message);}catch(e){}
return;}}}else{var toBeRemoved=[],inSingle=false,inPerm=false;for(var i=0;i<singleMessageHandlers.length;i++){if(singleMessageHandlers[i].comparitor==null||singleMessageHandlers[i].comparitor==message.type){try{singleMessageHandlers[i].callback(message);}catch(e){}
toBeRemoved.push(singleMessageHandlers[i]);inSingle=true;}}
for(var i=0;i<permanentMessageHandlers.length;i++){if(permanentMessageHandlers[i].comparitor==null||permanentMessageHandlers[i].comparitor==message.type){try{permanentMessageHandlers[i].callback(message);}catch(e){toBeRemoved.push(permanentMessageHandlers[i]);inPerm=true;}}}
if(toBeRemoved.length>0){for(var i=0;i<toBeRemoved.length;i++){if(inSingle){var index=singleMessageHandlers.indexOf(toBeRemoved[i]);if(index!=-1){singleMessageHandlers.splice(index,1);}}
if(inPerm){var index=permanentMessageHandlers.indexOf(toBeRemoved[i]);if(index!=-1){permanentMessageHandlers.splice(index,1);}}}}}}
return{registerPermanent:registerPermanent,registerSingle:registerSingle,unregister:unregister,create:create,send:send}}
if(typeof topWindow.PARATURE.ajax.gateway=='undefined')topWindow.PARATURE.ajax.gateway=new ajaxGateway();