/** 
#---------------------------------------------------------------------------
#   Copyright (c) 2010 Kalengo, LLC. All Rights Reserved.
#   
#   This software is the confidential and proprietary information of
#   Kalengo, LLC. ("Confidential Information").  You shall not
#   disclose such Confidential Information and shall use it only in
#   accordance with the terms of the license agreement you entered into
#   with Kalengo.
#   
#   KALENGO MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
#   OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
#   THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
#   PURPOSE, OR NON-INFRINGEMENT. KALENGO SHALL NOT BE LIABLE FOR ANY
#   DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
#   DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
#   
#   CopyrightVersion 1.0
#   
#   
#   
#   $HeadURL$
#   $Author$
#   $Revision$   $Date$
#---------------------------------------------------------------------------
*/
var ajaxCallEntities = [];

function asyncAjaxCall(params,callback){	
	var startSetInterval = 1800000;		 
	var ajaxCallInterval = setInterval(function(){	
	 	startSetInterval = startSetInterval - 100;	
	 	var isAllAjaxCallDone = true;
	 	if( $.isArray( params ) ){
	 		for( var i in params ){
		 		if( !params[i].getEntityDone() ) {
		 			isAllAjaxCallDone = false; 
		 		}
		 	}
	 	} else {
	 		if( !params.getEntityDone() ) {
	 			isAllAjaxCallDone = false; 
	 		}
	 	}
	 	
	 	if( isAllAjaxCallDone ) {
	 		clearInterval( ajaxCallInterval );
	 		callback( params );
	 	}
		if (  startSetInterval < 0 ) { // time out
			// stop interval
			clearInterval( ajaxCallInterval );
			errorMessage("Service is not available. Please try again later.");					
		}
	 },100); 
}

function setRestAjaxOptions( params ,objAttrs){
//	var options = {};
	var ajaxOptions = {};	
	
	if( params ){
		////////url/////////////////
		if( params.url ) {
			ajaxOptions.service =  params.url;
		}
		if( params.data ) {
			ajaxOptions.data =  params.data;
		}
		///////////// success /////////////////
		if(  params.success ) {
			ajaxOptions.success = function( data){
				if( data ){
					objAttrs.ajaxEntity = data;				
				}
				params.success( data );
			}
		} 
		else {
			ajaxOptions.success = function( data){
				if( data ){
					objAttrs.ajaxEntity = data;	
				}			
			}			
		}
		////////error/////////////////
		if( params.error ) {
			ajaxOptions.exception =  params.error;
		} else if( params.exception ) {
			ajaxOptions.exception =  params.exception;
		}
		else {
			ajaxOptions.exception =  handleException;
		}		
		////////  beforeSend/////////////////
		if( params.beforeSend ) {			
			ajaxOptions.beforeSend =  params.beforeSend;
		} 
		else {
//			ajaxOptions.beforeSend =  function(){};
		}		
		////////  complete/////////////////
		if( params.complete ) {
			ajaxOptions.complete =  function(XMLHttpRequest, textStatus){
				objAttrs.isAjaxCallDone = true;		
				params.complete(XMLHttpRequest, textStatus);
			}
		} 
		else {
			ajaxOptions.complete =  function(XMLHttpRequest, textStatus){
				objAttrs.isAjaxCallDone = true;				
			}
		}
	}
	return ajaxOptions;
}
/////////////////////////////////////////////////////////////////////////////////////
/********Asset Sreener************/
function AssetSearchConditionEntity( params ){	
	var url = "assets/search/condition?";
	if( params && params.optional ){		
		url += params.optional ['timehorizon'] ? "&th=" + params.optional ['timehorizon'] : "";
		url += params.optional ['frequency'] ? "&freq=" + params.optional ['frequency'] : "";
		url += params.optional ['assettype'] ? "&assettype=" + params.optional['assettype'] : "";
	}
	
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function AssetSearchEntity( params ){	
	var url = "assets/search?";
	
	if( params && params.optional ){
		if( params.optional['count'] && params.optional['count'] === true ){
			url = 'assets/search/total?';
		} else {			
			url += params.optional['limit'] ?  "&limit="+params.optional['limit'] :  "";	
			url += params.optional['start']  ?   "&start="+params.optional['start'] :  "";
		}
		url += params.optional['assettype'] ? "&assettype" + "=" + params.optional['assettype'] : "";
		
		url += params.optional['c_mean'] ? "&c_mean=" + "[" + params.optional['c_mean'][0] + "," + params.optional['c_mean'][1] + "]" : "";
		
		url += params.optional['c_stdev'] ? "&c_stdev=" + "[" + params.optional['c_stdev'][0] + "," + params.optional['c_stdev'][1] + "]" : "";
	
		url += params.optional['c_sharperatio'] ? "&c_sharperatio=" + "[" + params.optional['c_sharperatio'][0] + "," + params.optional['c_sharperatio'][1] + "]" : "";
	
		url += params.optional['c_correlation'] && params.optional['c_correlatewith'] ? "&c_correlation=" + "[" + params.optional['c_correlation'][0] + "," + params.optional['c_correlation'][1] + "]" + "&c_correlatewith=" + params.optional['c_correlatewith'] : "";

		url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
		url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";		
		
	}

	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function AssetsEntity( params ){		
	if( params && params.required && params.required.tickerList && params.required.tickerList.length > 0 ){
		var url = "assets/"+params.required.tickerList.join(',')+"?";
		
		if( params && params.optional ){		
			url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
			url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";			
		} 
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function AssetsStatsEntity( params ){	
	if( params && params.required && params.required.tickerList && params.required.tickerList.length > 0 ){
		var url = "assets/"+params.required.tickerList.join(',')+"/stats?";
		
		if( params && params.optional ){		
			url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
			url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";			
		} 
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function AssetsCorrelationsEntity( params ){	
	if( params && params.required && params.required.tickerList && params.required.tickerList.length > 0 ){
		var url = "assets/"+params.required.tickerList.join(',')+"/correl?";
		
		if( params && params.optional ){		
			url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
			url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";			
		} 
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function AssetsDailydataEntity( params ){	
	if( params && params.required && params.required.tickerList && params.required.tickerList.length > 0 ){
		var url = "assets/"+params.required.tickerList.join(',')+"/dailydata?";		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function AssetsOverviewnEntity( params ){	
	if( params && params.required && params.required.tickerList && params.required.tickerList.length > 0 ){
		var url = "assets/"+params.required.tickerList.toString()+"/overview?";		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}


function UserPortfoliosHoldingsEntity( params ){	
	if( params && params.required && params.required.tickerList && params.required.tickerList.length > 0 ){
		var url = "users/"+params.required.userId+"/portfolios/holding";		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}


function UserPortfoliosEntity( params ){	
	if( params && params.required && params.required.userId ){
		var url = "users/"+params.required.userId+"/portfolios";
		if( params && params.optional ){		
			url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
			url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";			
		} 		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function UserPortfoliosOverviewEntity( params ){
	if( params && params.required && params.required.userId ){
		var url = "users/"+params.required.userId+"/portfolios/overview";		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function PortfolioOverviewEntity( params ){	
	if( params && params.required && params.required.portfolioId ){
		var url = "portfolios/"+params.required.portfolioId+"/overview";		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}
function PortfoliosRiskAnalysisEntity( params ){	
	if( params && params.required && params.required.portfolioId ){
		var url = "portfolios/"+params.required.portfolioId+"/analysis/risk";	
		if( params && params.optional ){	
			url += params.optional['benchmarkset'] ?  "&bms="+params.optional['benchmarkset'] :  "";	
			url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
			url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";			
		}		
	}	
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function PortfoliosStyleAnalysisEntity( params ){	
	if( params && params.required && params.required.portfolioId ){
		var url = "portfolios/"+params.required.portfolioId+"/analysis/style";	
		if( params && params.optional ){	
			url += params.optional['benchmarkset'] ?  "&bms="+params.optional['benchmarkset'] :  "";	
			url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
			url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";			
		} 		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function PortfolioEntity( params ){	
	if( params && params.required && params.required.portfolioId ){
		var url = "portfolios/"+params.required.portfolioId;	
		if( params && params.optional ){	
			url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
			url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";			
		} 		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}


function PortfolioOptimizationEntity( params ){	
	if( params && params.required && params.required.portfolioId ){
		var url = "portfolios/"+params.required.portfolioId+"/analysis/optimization?";	
		if( params && params.optional ){	
			url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
			url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";			
		} 	
		if( params.optional && params.optional.scopes ){
			params.data = JSON.stringify( params.optional.scopes );
		}		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPost( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function PortfolioAdvancedOptimizationEntity( params ){	
	if( params && params.required && params.required.settings && params.required.settings.length >= 2 ){
		var url = "portfolios/analysis/optimization?";
		if( params && params.optional ){	
			url += params.optional['timehorizon'] ?  "&th="+params.optional['timehorizon'] :  "";	
			url += params.optional['frequency']   ?  "&freq="+params.optional['frequency'] : "";			
		}
		params.data = JSON.stringify( params.required.settings );
	}
 
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPost( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function UserPortfoliosMarketvalueEntity( params ){	
	if( params && params.required && params.required.userId ){
		var url = "users/"+params.required.userId+"/portfolios/analysis/marketvalue?";
		if( params && params.optional ){	
			url += params.optional['startDate'] ?  "&startdate="+params.optional['startDate'] :  "";	
			url += params.optional['endDate']   ?  "&enddate="+params.optional['endDate'] : "";			
		} 		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function PortfolioMarketvalueEntity( params ){	
	if( params && params.required && params.required.portfolioId ){
		var url = "portfolios/"+params.required.portfolioId+"/analysis/marketvalue?";
		if( params && params.optional ){	
			url += params.optional['startDate'] ?  "&startdate="+params.optional['startDate'] :  "";	
			url += params.optional['endDate']   ?  "&enddate="+params.optional['endDate'] : "";			
		}			
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}
function AssetsTimeseriesPriceEntity( params ){	
	if( params && params.required && params.required.tickerList ){
		var url = "assets/"+params.required.tickerList.toString()+"/analysis/price?";
		if( params && params.optional ){	
			url += params.optional['startDate'] ?  "&startdate="+params.optional['startDate'] :  "";	
			url += params.optional['endDate']   ?  "&enddate="+params.optional['endDate'] : "";			
		} 		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}
function PortfolioUpdateEntity( params ){	
	if( params && params.required && params.required.portfolioId && params.required.portfolioInfo ){
		var url = "portfolios/"+ params.required.portfolioId;	
		params.data = JSON.stringify( params.required.portfolioInfo );		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPut( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function PortfolioCreateEntity( params ){	
	if( params && params.required && params.required.userId && params.required.portfolioInfo ){
		var url = "users/"+ params.required.userId +"/portfolios";
		params.data = JSON.stringify( params.required.portfolioInfo);
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPost( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function PortfolioDeleteEntity( params ){
	if( params && params.required && params.required.portfolioId  ){
		var url = "portfolios/"+ params.required.portfolioId;			
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestDelete( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}
function UserStatsEntity( params ){	
	if( params && params.required && params.required.userList){
		var url = "users/"+params.required.userList.toString()+"/stats";		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function TransactionsCreateEntity( params ){	
	if( params && params.required && params.required.transactions ){
		var url = "transactions";
		params.data = JSON.stringify( params.required.transactions);
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPost( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function TransactionsUpdateEntity( params ){
	if( params && params.required && params.required.transactions ){
		var url = "transactions";
		params.data = JSON.stringify( params.required.transactions);
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPut( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function TransactionsDeleteEntity( params ){
	var ajaxEntity = null;
	var isAjaxCallDone = false;
	
	if( params && params.required && params.required.transactionIdList ){
		var url = "transactions/"+params.required.transactionIdList.toString()+"?";		
		if( params.optional ){
			url += params.optional['cascade'] ? '&cascade='+params.optional['cascade'] : "";
		}		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestDelete( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

////////////////////////////user profile/////////
function UserProfilesEntity( params ){
	if( params && params.required && params.required.userId ){
		var url = "users/"+params.required.userId+"/profiles";			
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function UserProfileUpdateEntity( params ){
	if( params && params.required && params.required.profileId && params.required.profileInfo ){
		var url = "profiles/"+params.required.profileId;
		params.data = JSON.stringify( params.required.profileInfo );
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPut( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function UserProfileCreateEntity( params ){
	if( params && params.required && params.required.userId && params.required.profileInfo ){
		var url = "users/"+params.required.userId+"/profiles";
		params.data = JSON.stringify( params.required.profileInfo);
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPost( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function UserGoalsEntity( params ){
	if( params && params.required && params.required.userId ){
		var url = "users/"+params.required.userId+"/goals";			
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function GoalCreateEntity( params ){
	if( params && params.required && params.required.userId && params.required.goalInfo ){
		var url = "users/"+params.required.userId +'/goals';			
		params.data = JSON.stringify( params.required.goalInfo );
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPost( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function GoalUpdateEntity( params ){
	if( params && params.required && params.required.goalId && params.required.goalInfo ){
		var url = "goals/"+params.required.goalId;	
		params.data = JSON.stringify( params.required.goalInfo );
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestPut( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function GoalDeleteEntity( params ){
	var ajaxEntity = null;
	var isAjaxCallDone = false;
	
	if( params && params.required && params.required.goalId ){
		var url = "goals/"+params.required.goalId;	
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestDelete( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function UserFinancialPlanningsEntity( params ){
	if( params && params.required && params.required.userId ){
		var url = "users/"+params.required.userId+"/finplans";				
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}


function PortfolioTransactionsEntity( params ){	
	if( params && params.required && params.required.portfolioId ){
		var url = "portfolios/"+params.required.portfolioId+"/transactions?";		
		if( params.optional ){		
			url += params.optional ['active'] ? "&active=" + params.optional ['active'] : "";
			url += params.optional ['action'] ? "&action=" + params.optional ['action'] : "";
			url += params.optional ['startdate'] ? "&startdate=" + params.optional['startDate'] : "";
			url += params.optional ['enddate'] ? "&enddate=" + params.optional['endDate'] : "";
		}			
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function AssetRankingsEntity( params ){	
	if( params && params.required && params.required.rankBy ){
		var url = "rank/assets/"+params.required.rankBy+"/";	
		url += params.optional && params.optional.start ? params.optional.start : '1';
		url += '-';
		url += params.optional && params.optional.end ? params.optional.end : '20';
		url += '?';
		url += params.optional && params.optional.desc === false ? '&desc='+params.optional.desc : '';		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function portfolioRankingsEntity( params ){
	if( params && params.required && params.required.rankBy ){
		var url = "rank/portfolios/"+params.required.rankBy+"/";	
		url += params.optional && params.optional.start ? params.optional.start : '1';
		url += '-';
		url += params.optional && params.optional.end ? params.optional.end : '20';
		url += '?';
		url += params.optional && params.optional.desc === false ? '&desc='+params.optional.desc : '';
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function FollowingRankingsEntity( params ){
	if( params && params.required && params.required.rankBy &&  params.required.userList){
		var url = "users/"+params.required.userList.toString()+"/rank/users/"+params.required.rankBy+"/";	
		url += params.optional && params.optional.start ? params.optional.start : '1';
		url += '-';
		url += params.optional && params.optional.end ? params.optional.end : '20';
		url += '?';
		url += params.optional && params.optional.desc === false ? '&desc='+params.optional.desc : '';			
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}
function UserRankingsEntity( params ){
	if( params && params.required && params.required.rankBy ){
		var url = "rank/users/"+params.required.rankBy+"/";	
		url += params.optional && params.optional.start ? params.optional.start : '1';
		url += '-';
		url += params.optional && params.optional.end ? params.optional.end : '20';
		url += '?';
		url += params.optional && params.optional.desc === false ? '&desc='+params.optional.desc : '';		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}

function PortfolioRankingsEntity( params ){
	if( params && params.required && params.required.rankBy ){
		var url = "rank/portfolios/"+params.required.rankBy+"/";	
		url += params.optional && params.optional.start ? params.optional.start : '1';
		url += '-';
		url += params.optional && params.optional.end ? params.optional.end : '20';
		url += '?';
		url += params.optional && params.optional.desc === false ? '&desc='+params.optional.desc : '';		
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}
function SimilarAssetsEntity( params ){	
	if( params && params.required && params.required.ticker ){
		var url = "assets/"+ticker+"/analysis/similarity";			
	}
	if( !params ) params = {};
	params['url'] = url;
	
	var objAttrs = {ajaxEntity : null, isAjaxCallDone : false};
	var settings = setRestAjaxOptions( params, objAttrs  );
	
	rest.ajaxRestGet( settings );
	
	this.getEntityDone = function(){
		return objAttrs.isAjaxCallDone;
	}
	this.getAjaxEntity = function(){		
		return objAttrs.ajaxEntity;
	}
}
