var rest = new restWrapper();
//var msg = new message();
var constLimit = 20;
var constStart = 0;
var constFrequency = 'W';
var constTimehorizon = '1y';
var constSimple = false;		
var constIgnore = true;
var handleException = function(ex) {
		switch(ex.getCode()){
			case "10000000":
			case  10000000:
				registerUserFromElgg({userId:userId });
				break;
			case 25300003://"message":"The portfolio doesn't have any asset."
			case 25100010://{"error":{"code":25100010,"message":"There is no asset to be analyzed."}}
			case 21000007:
			case 10000020:
				errorMessage( ex.getMessage() );
				break;
			case 50000005:
			case 22000000:  //{"error":{"code":22000000,"message":"Failed to find the specific market data."}}
			case 50000001:
				break;
			case 23000020:
				break;
			case 60000009:
				break;
			case 23200004:
			case 23200005:
				errorMessage( "Failed to update the portfolio name." );
				break;			
			case 23200006:
				break;
			case 60000000:
				errorMessage( "System is busy. Please try again later.");
				break;
//			hugo add: format error data	
//			case 21000007:
//				var errorString = ex.getMessage();
//				var errorMsg =" is not a trade date";
//				var endStringNum = errorString.indexOf(errorMsg);
//				if(endStringNum != -1){
//					var errorData = errorString.substring(0,endStringNum);
//					errorMessage(new Date(errorData).format("MM/dd/yyyy") + errorMsg);
//				}
//				else{
//					errorMessage( ex.getMessage() );
//				}
//				
//				break;
			case 21100007:
				errorMessage( "You should buy the asset before you can sell it in the portfolio." );
				break;
			case 21000027:
				errorMessage( "The total number of shares of the asset you can sell should be no more than the total you have bought it in the portfolio." );
				break;
			case 21000030:
				errorMessage( "The sell date should not be earlier than the buy date." );
				break;
			case 25700001:
				break;
			default:
				professionalErrorMessage( ex.getMessage(),JSON.stringify(ex.getProfessionalMsg())+"<br/><br/><br/>" + JSON.stringify(ex.getsystemMessage()) );
				
		}					
} 

function registerUserFromElgg( options ){
	var userInput =  {'userId': options.userId};					
	var url = elggHost + "action/finportfolio/register";
	var settings = {
			type:'POST',					
			url: url ,
			data : userInput,
			dataType:'json',
			success:function( data ){
				if( data && data.status == 'SUCCESS' ){
					window.location.reload();
				}
			}			
		//	exception:handleException
		}
	$.ajax( settings );	
}

////////////Ranking/////////////////////////
function assetHoldingRanking(options){
	var url = "assets/analytics/rank/holding/"+options.start+"-"+options.end;
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

function assetReturnRanking(options){
	var url = "assets/analytics/rank/return/"+options.start+"-"+options.end;
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

function assetRiskRanking(options){
	var url = "assets/analytics/rank/risk/"+options.start+"-"+options.end;
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

function assetSharpeRatioRanking(options){
	var url = "assets/analytics/rank/sharperatio/"+options.start+"-"+options.end;
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

function assetTransactionSellRanking(options){	
	var url = "assets/analytics/rank/transaction/sell/"+options.start+"-"+options.end;
	url +=  options.timehorizon ? "?timehorizon="+options.timehorizon : "?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

function assetTransactionBuyRanking(options){	
	var url = "assets/analytics/rank/transaction/buy/"+options.start+"-"+options.end;
	url +=  options.timehorizon ? "?timehorizon="+options.timehorizon : "?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

function portfolioReturnRanking(options){	
	///portfolio/analytics/rank/return/10-20?userlist=1,2,3
	var url = "portfolio/analytics/rank/return/"+options.start+"-"+options.end;
	url +=  options.userlist ? "?userlist="+options.userlist : "";
//	url =  options.timehorizon ? url+"?timehorizon="+options.timehorizon : url+"?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
function portfolioRiskRanking(options){	
	///portfolio/analytics/rank/return/10-20?userlist=1,2,3
	var url = "portfolio/analytics/rank/risk/"+options.start+"-"+options.end;
	url +=  options.userlist ? "?userlist="+options.userlist : "";
//	url =  options.timehorizon ? url+"?timehorizon="+options.timehorizon : url+"?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
function portfolioSharpeRatioRanking(options){	
	///portfolio/analytics/rank/return/10-20?userlist=1,2,3
	var url = "portfolio/analytics/rank/sharperatio/"+options.start+"-"+options.end;
	url +=  options.userlist ? "?userlist="+options.userlist : "";
//	url =  options.timehorizon ? url+"?timehorizon="+options.timehorizon : url+"?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
function portfolioHoldingRanking(options){	
	///portfolio/analytics/rank/return/10-20?userlist=1,2,3
	var url = "portfolio/analytics/rank/holding/"+options.start+"-"+options.end;
	url +=  options.userlist ? "?userlist="+options.userlist : "";
//	url =  options.timehorizon ? url+"?timehorizon="+options.timehorizon : url+"?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
function portfolioTopRanking(options){	
	///portfolio/analytics/rank/return/10-20?userlist=1,2,3
	var url = "portfolio/analytics/rank?";
	url +=  options.top ? "&top="+options.top : "";
	url +=  options.userlist ? "&userlist="+options.userlist : "";
//	url =  options.timehorizon ? url+"?timehorizon="+options.timehorizon : url+"?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
////////////finplan//////////////
function finplanSuccessrateRanking(options){	
	///portfolio/analytics/rank/return/10-20?userlist=1,2,3
	var url = "finplans/analytics/rank/successrate/"+options.start+"-"+options.end;
	url +=  options.userlist ? "?userlist="+options.userlist : "";
//	url =  options.timehorizon ? url+"?timehorizon="+options.timehorizon : url+"?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
///////////user ranking/////////////
function userPortfolioReturnRanking(options){	
	///portfolio/analytics/rank/return/10-20?userlist=1,2,3
	var url = "users/portfolio/analytics/rank/return/"+options.start+"-"+options.end;
	url +=  options.userlist ? "?userlist="+options.userlist : "";
//	url =  options.timehorizon ? url+"?timehorizon="+options.timehorizon : url+"?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
function userPortfolioRiskRanking(options){	
	///portfolio/analytics/rank/return/10-20?userlist=1,2,3
	var url = "users/portfolio/analytics/rank/risk/"+options.start+"-"+options.end;
	url +=  options.userlist ? "?userlist="+options.userlist : "";
//	url =  options.timehorizon ? url+"?timehorizon="+options.timehorizon : url+"?timehorizon=3m";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
///////////////////////////////////////////		
function saaOptimization( options ) {	
	var url = "portfolio/saaoptimization";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestPost( settings );	
}


function optimization( options ) {
	var url = "portfolio/optimization";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestPost( settings );	
}
/**
 * get system portfolio by user group 
 * @param userGroup (free/premium)
 * @return system portfolio or null
 */ 
function getSysportfolio( options ) {
	var url = "portfolio/system/usergroup/"+options.userGroup;
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );
}

///////////////// portfolio //////////////////////////////////
function getUserPortfoliosOverview( options ) {
	var url = "users/"+options.userId+'/portfolio/overview';
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );
}

function getPortfolioMarketvalue(options){
	var url = "portfolio/"+options.portfolioId+"/analytics/marketvalue";
	if( options.params ) {
		url += options.params.startDate ? "?startdate="+ options.params.startDate : "";
		url += options.params.endDate ? "&enddate="+ options.params.endDate : "";
	}
	
	var defaults = {						
			service: url ,
			exception:function(){
                
            }
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );
}


function getRankInFriends(options){
	var url = "users/" + options.userId + "/portfolio/analytics/rank/return";
	url += options.userlist ? "?userlist="+ options.userlist : "";
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );
}

function getUserProfoliosAnalytics(options){
	var url = "users/" + options.userId + "/portfolio/analytics";
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}


//function userPortfolioRanking( options ){
//	
//	var url = "portfolio/analytics/rank?";
//	if( options.top ){
//		url += "top="+options.top;
//	}
//	if( options.userlist ){
//		url += "&userlist="+options.ids.toString();
//	}
//
//	var defaults = {						
//			service: url ,
//			exception:handleException
//		}	
//	var settings = $.extend({}, defaults, options);		
//	
//	rest.ajaxRestGet( settings );	
//}





//load portfolio
function getPortfolioBenchmarkSet( options ) {
	var portfolioIdListStr = options.ids.toString();
	var url = "portfolio/"+portfolioIdListStr+"/benchmarkset?";
	url += options.params && options.params['timehorizon'] ? "&timehorizon=" + options.params['timehorizon'] : "&timehorizon=" + constTimehorizon;
	url += options.params && options.params['frequency'] ? "&frequency=" + options.params['frequency'] : "&frequency=" + constFrequency;
		
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

/**
 * add user portfolio
 * @param options
 * @return succ or null
 */
function addPortfolio ( options ) {	
	var defaults = {			
			service: "portfolio",
			exception:handleException
		}
		
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestPost( settings );
}

/**
 * edit user portfolio
 * @param options
 * @return succ or null
 */
function editPortfolio ( options ) {	
	var defaults = {			
			service: "portfolio/"+options.portfolioId,
			exception:handleException
		}
		
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestPut( settings );
}
/**
 * delete user portfolio
 * @param type
 * @return succ or null
 */
//function deletePortfolio( delPlanPortfolioId  ) {	
//	var response = null;
//	rest.ajaxRestDelete({
//		async: false,
//		service: "portfolio/"+delPlanPortfolioId,
//		error: function(data){
//		},
//		success: function(data){
////			$("#debug").append("Succeed in deleting: " + JSON.stringify(data));		
//			response = data;
//		}
//	});
//	return response
//}


function deletePortfolio( options ) {	
	var url = "portfolio/" + options.delPlanPortfolioId;
	var defaults = {			
			service: url,
			exception:handleException
	}		
	var settings = $.extend({}, defaults, options);			
	rest.ajaxRestDelete( settings );	
}

/////////////////////////////////// transaction   /////////////////
//get transactions
function getTransactions( portfolioId, assetId ) {
	
	transactions = null;
	
	rest.ajaxRestGet({
		async: false,
		service: "portfolio/"+portfolioId+"/assets/"+assetId+"/transactions",
		success: function(data){	
			transactions =    typeof(data.transactions) != "undefined" ?  data : null;
		},
		error: function( data ) {
			// console.error  ("error  getting portfolio asset all transactions:" + JSON.stringify(data) );
		}
	});
	return transactions;
}


//////////////////////////////////style analyisis /////////////////
//portfolio style analysis
function styleAnalysis( options ) {	
	var defaults = {						
		service: "portfolio/"+options.portfolioId+"/analysis/style" ,
		exception:handleException		
	}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
////////////////////////////////// risk analyisis /////////////////
// portfolio risk  Analysis
function riskAnalysis( options ) {	
	
	var defaults = {						
		service: "portfolio/"+options.portfolioId+"/analytics/risk" ,
		exception:handleException		
	}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
////////////////////////////////  asset  //////////////////////////

function getAssetByTicker( options ){		
	var url = "assets/tickers/"+options.ticker;	
	var defaults = {						
			service: url,
			exception:handleException
	}
	
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );
}
//get asset fundamental data
function getFundamentalDailyData( options ){		
	var url = "assets/"+options.assetId+"/fundamentaldailydata";	
	if( options.date){
		url += "/date/"+options.date;
	}
	var defaults = {						
			service: url,
			exception:handleException
	}
	
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );
}

///////////////////////////////
//get asset search ready

function getAssetSearchCondition( options ){		
	var url = "assets/search/condition?";
	
	url += options.params && options.params['timehorizon'] ? "&timehorizon=" + options.params['timehorizon'] : "&timehorizon=" + constTimehorizon;
	url += options.params && options.params['frequency'] ? "&frequency=" + options.params['frequency'] : "&frequency=" + constFrequency;
	url += options.params && options.params['assettype'] ? "&assettype=" + options.params['assettype'] : "&assettype=" + 'all';
		

	var defaults = {						
			service: url,
			exception:handleException
	}
	
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );
}


//search assets
function searchAssets( options ) {	
		var searchConditions = "";
	
		if (options.params['assettype']) 
			searchConditions += "assettype" + "=" + options.params['assettype'];
		if (options.params['c_return']) 
			searchConditions += "&c_return=" + "[" + options.params['c_return'][0] + "," + options.params['c_return'][1] + "]";
		if (options.params['c_volatility']) 
			searchConditions += "&c_volatility=" + "[" + options.params['c_volatility'][0] + "," + options.params['c_volatility'][1] + "]";
		if (options.params['c_sharperatio']) 
			searchConditions += "&c_sharperatio=" + "[" + options.params['c_sharperatio'][0] + "," + options.params['c_sharperatio'][1] + "]";
		if (options.params['c_correlation'] && options.params['c_correlatewith']) 
			searchConditions += "&c_correlation=" + "[" + options.params['c_correlation'][0] + "," + options.params['c_correlation'][1] + "]" + "&c_correlatewith=" + options.params['c_correlatewith'];
		
		 searchConditions +=  options.params && options.params['keyword']  ?  "&keyword=" + options.params['keyword'] : '';
		 searchConditions += options.params && options.params['end'] ?  "&end="+options.params['end'] :  "&end="+constLimit;	
		 searchConditions += options.params && options.params['start']  ?   "&start="+options.params['start'] :  "&start="+constStart;
		 searchConditions += options.params && options.params['timehorizon'] ?  "&timehorizon="+options.params['timehorizon'] :  "&timehorizon="+constTimehorizon;	
		 searchConditions += options.params &&options.params['frequency']   ?  "&frequency="+options.params['frequency'] : "&frequency="+constFrequency;		
		
	//	searchConditions += "&limit="+constLimit+"&timehorizon="+constTimehorizon+"&frequency="+constFrequency;		
		
		var defaults = {						
			service: "assets/search?"+ searchConditions ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

//get asset statlist

function getAssetStatList( options ) {	
	var assetsIdListStr = options.ids.toString();
	var url = "assets/"+assetsIdListStr+"/statlist?"

	url += options.params && options.params['timehorizon'] ? "&timehorizon=" + options.params['timehorizon'] : "&timehorizon=" + constTimehorizon;
	url += options.params && options.params['frequency'] ? "&frequency=" + options.params['frequency'] : "&frequency=" + constFrequency;
	url += options.params && options.params['simple'] ? "&simple=" + options.params['simple'] : "&simple=" + constSimple;
	url += options.params && options.params['ignore'] ? "&ignore=" + options.params['ignore']: "&ignore=" + constIgnore;
	var defaults = {						
			service: url,
			exception:handleException
	}
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );
}

//get asset historical prices
function getHistoricalPrices( options ) {
	var url = "assets/types/" + options.assetType + "/tickers/" + options.ticker + "/analytics/price";
	url += "?startdate=" + options.startDate + "&enddate=" + options.endDate;
	
	var defaults = {
			service: url,
			exception:handleException	
	}
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );
}

//////////////////// investment profile ///////////////
/**
 * get user profile
 * @param userId
 * @return user profile or null
 */
function getUserProfile( options ) {
	var url = "users/"+options.userId+"/userprofiles";
	var defaults = {			
			service: url,
			exception:handleException			
	}		
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );		
}
/**
 * get user profile all information
 * @param userId
 * @return user profile or null
 */
function getUserProfileAll( options ) {		
	var defaults = {			
			service: "users/"+options.userId+"/userprofilesall",
			exception:handleException
	}
		
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );		
}

/**
 * get user tax information
 * @param userId
 * @return user tax information or null
 */
function getUserTaxInfo( options ) {
	var url = "users/"+options.userId+"/usertaxinfo";
	var defaults = {			
			service: url,
			exception:handleException			
	}		
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );		
}

/**
 * get profiletype
 * @param type
 * @return profiletype or null
 */
function getProfiletype( options ) {
	var url = "profiletypes/"+options.type.toLowerCase();
	var defaults = {			
			service: url,
			exception:handleException,
			cache: true
	}		
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );			
}

/**
 * get user goals
 * @param type
 * @return goals or null
 */
function getUserGoals( options ) {	
	var defaults = {			
			service: "users/"+options.userId+"/goals",
			exception:handleException
	}		
	var settings = $.extend({}, defaults, options);			
	rest.ajaxRestGet( settings );	
}

/**
 * delete goal
 * @param type
 * @return  
 */
function deleteGoal( options ) {	
	var url = "goals/" + options.goalId;
	var defaults = {			
			service: url,
			exception:handleException
	}		
	var settings = $.extend({}, defaults, options);			
	rest.ajaxRestDelete( settings );	
}
/**
 * add user profile 
 * @param userId, portfolio ( json format string)
 * @return succ/fail
 */ 
function addUserProfile ( options ) {
	
	var defaults = {			
			service: "users/"+options.userId+"/userprofiles",
			exception:handleException
		}		
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestPost( settings );
}

/**
 * edit user profile 
 * @param userId, portfolio ( json format string)
 * @return succ/fail
 */ 
function editUserProfile ( options ) {	
	var defaults = {			
			service: "users/"+options.userId+"/userprofiles/"+options.userProfileId,
			exception:handleException
		}
		
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestPut( settings );
}
/**
 * add goal 
 * @param  goal ( json format string)
 * @return succ/fail
 */ 
function addUserGoal ( options ) {		
	var url = "goals";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);			
	rest.ajaxRestPost( settings );	
}

/**
 * edit goal 
 * @param goalId, goal ( json format string)
 * @return succ/fail
 */ 
function editUserGoal ( options ) {		
	var url = "goals/"+options.goalId;
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);			
	rest.ajaxRestPut( settings );
}

/**
 * add user  
 * @param userInput :user information ( json format string)
 * @return  succ/fail
 */ 
function addUser ( options ) {
	var url = "users";
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestPost( settings );	
}

////////////////FinPlan///////////////////////////////////
/**
 * get finplan by plan id
 * @param planId
 * @return finplan or null
 */
function getFinPlan( options ) {
	var url = "users/"+options.userId+"/finplans/"+options.planId;
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );
}


/**
 *  finplan optimization
 * @param planId risk
 * @return finplan optimization result or null
 */
function finPlanOptimization( options ) {
	var url = "finplans/"+options.planId+"/successrate";
	url = options.risk ? url + "/"+options.risk : url
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestGet( settings );	
}
/**
 * get finplans by user id
 * @param userId
 * @return finplans or null
 */
function getUserFinPlans( options ) {
	var url = "users/"+options.userId+"/finplans";
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

/**
 * add new plan  
 * @param finPlanInput :plan information ( json format string)
 * @return  succ/fail
 */ 
function addFinPlan ( options ) {
	var url = "finplans";
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestPost( settings );
}

/**
 * add new planGoal  
 * @param planGoalInput ( json format string)
 * @return  succ/fail
 */ 
function addPlanGoal ( options ) {
	var url = "finplans/"+options.planId+"/goals/"+options.goalId;
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestPost( settings );	
}

/**
 * delete plan goal
 * @param type
 * @return profiletype or null
 */
function deleteFinPlanGoal( options  ) {	
	var url = "finplans/"+options.planId+"/goals/" + options.goalId;
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestDelete( settings );	
}

/**
 * delete plan goal
 * @param type
 * @return profiletype or null
 */
function deleteFinPlanPortfolio( options ) {	
	var url = "finplans/"+options.planId+"/portfolio/" + options.portfolioId;
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestDelete( settings );	
}
/**
 * add finplan portfolio
 * @param planId, portfolioId, planPortfolioInput ( json format string)
 * @return succ/fail
 */ 
function addFinPlanPortfolio ( options ) {  
	var url = "finplans/"+options.planId+"/portfolio/"+options.portfolioId;
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestPost( settings );	
}

/**
 * get finplan portfolio
 * @param planId, portfolioId, planPortfolioInput ( json format string)
 * @return succ/fail
 */ 
function getFinPlanPortfolio ( options ) {  
	var url = "finplans/"+options.planId+"/portfolio/"+options.portfolioId;
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}
/**
 * edit finplan portfolio
 * @param userId, portfolio ( json format string)
 * @return succ/fail
 */ 
function editFinPlanPortfolio ( options ) {  //
	var url = "finplans/"+options.planId+"/portfolio/"+options.portfolioId;
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestPut( settings );	
}

//////////hugo add portfolio api/////////

function getUserPortfolio ( options ) {
	var url = "users/"+options.userId+"/portfolio";
	var defaults = {						
			service: url ,
			exception:handleException
		}	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );	
}

//load portfolio
function getPortfolio( options ) {	
	var url;
    if( options.simple ){
        url =  "portfolio/" + options.portfolioId + "?simple=true";
    }else{
        url =  "portfolio/" + options.portfolioId;
    }
	
	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);	
	rest.ajaxRestGet( settings );
}


/***
 * get asset api
 * @param {Object} options
 */
function getAsset( options ) {	
	var defaults = {			
			service: "assets/" + options.assetId,
			exception:handleException
	}		
	var settings = $.extend({}, defaults, options);			
	rest.ajaxRestGet( settings );	
}

/***
 * add and update transaction api
 * @param {Object} options
 */
function addTransaction ( options ) {	
	addTransactions( options )
}

/***
 * add and update transaction api
 * @param {Object} options
 */
function addTransactions ( options ) {	
	var defaults = {			
			service: "transactions",
			exception:handleException
		}
		
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestPost( settings );
}
/***
 * get Transaction api
 * @param {Object} options
 */
function getTransaction( options ) {	
	var defaults = {			
			service: "portfolio/" + options.portfolioId + "/assets/" + options.assetId + "/transactions",
			exception:handleException
	}		
	var settings = $.extend({}, defaults, options);			
	rest.ajaxRestGet( settings );	
}

/**
 * edit Transaction
 * @param options
 * @return succ or null
 */
function editTransaction ( options ) {	
	var defaults = {			
			service: "transactions",
			exception:handleException
		}
		
	var settings = $.extend({}, defaults, options);		
	rest.ajaxRestPut( settings );
}

/***
 * del asset
 * @param {Object} options
 */
function DelAsset( options ) {	
	var url = "portfolio/" + options.portfolioId + "/assets/" + options.assetId ;
	var defaults = {			
			service: url,
			exception:handleException
	}		
	var settings = $.extend({}, defaults, options);			
	rest.ajaxRestDelete( settings );	
}

/***
 * del Transaction
 * @param {Object} options
 */
function DelTransaction( options ) {
    
    var url;
    if( options.cascade ){
        url = "transactions/" + options.transactionId + "?cascade=true";
    }else{
        url = "transactions/" + options.transactionId;
    }
	
	var defaults = {			
			service: url,
			exception:handleException
	}		
	var settings = $.extend({}, defaults, options);			
	rest.ajaxRestDelete( settings );	
}

/////////end hugo add api///////////

///////////////////////////////Extra.js/////////////////////////
/**
 * get assets correlation 
 * @param assetList
 * @return 
 * 
 *  */ 
function getCorrelation( options ) {  //assetsIdListStr, timeHorizon
//	var constFrequency = 'M';
//	var constTimehorizon = '3y';
	
	var assetsIdListStr = options.ids.toString();
	
	var timeHorizon = options.params && options.params.timehorizon ? options.params.timehorizon : constTimehorizon;
	
	var url = "assets/"+assetsIdListStr+"/analytics/correlation/"+timeHorizon;
	

	var defaults = {						
			service: url ,
			exception:handleException
		}
	
	var settings = $.extend({}, defaults, options);		
	
	rest.ajaxRestGet( settings );
}


function convertAssetsCorrelationToArray( ids,correlation ) {  //assetsIdListStr, timeHorizon	
	
//	try {
//		correlation = getCorrelation(assetsIdListStr, timeHorizon);		
//		if ( correlation != null ) {
			var assetCorrelationsArray = new Array();
			if ( correlation.hasOwnProperty("correlCovar")) {			 
			    	assetsIdArray = ids;											
				
			 		correlCovarArray = correlation.correlCovar.correlCovarArray;
			 		
				for (index in assetsIdArray) {
			 			assetCorrelationsArray[index] = new Array();
						assetCorrelationsArray[index][index] =  1.00;	
			 		}			
			
			 		var iCount = 0;
					var jCount = 0;
			 		for (var hCount = 0; hCount < correlCovarArray.length; hCount++) {
						
						for(  kCount  in assetsIdArray ) {
							if ( correlCovarArray[hCount].asset1.assetId == assetsIdArray[kCount]) { iCount = kCount  } 
							if ( correlCovarArray[hCount].asset2.assetId == assetsIdArray[kCount]) { jCount = kCount  } 						
						}	
						assetCorrelationsArray[iCount][jCount] =  correlCovarArray[hCount].correlation.toFixed(2);
			
						assetCorrelationsArray[jCount][iCount] =  correlCovarArray[hCount].correlation.toFixed(2);
			 		}
						
			 	} 
			return assetCorrelationsArray;
//		} else {
//			return null;
//		}
		
//	} catch (ex){
//		errorMessage( ex.getMessage )
//	}
	
	
}

////////////////////////////////////////message/////////////////////////////////////////////
//errorMessage, infoMessage, warningMessage, yesnoMessage.
function errorMessage( errorMessage ){
	var params = {
		dialogClass: 'error_tips tips_ico_p_error',
		open: true,
		msgText: errorMessage,
		modal: true,
		buttons: {
			OK: function(){
				$(this).dialog("close")
			}
		}
	};
	
	if( arguments[1] == false ){
		params.open = false;
	} 
	T_MsgDialog( params ); 	
}

function professionalErrorMessage(errorMessage, professionalMessage){
	var input_default_val = "Please write your feedback.";
	var professionalHtml = "<div id='js_error_detail'>" +
								"<input tyle='text' value='' class='js_cusmsg cus_input'  size='500'/> &nbsp;" +
		        		  		"<a href='javascript:;' class='js_more action_link'>Click here for more detail</a>" + 
		        		  		"<div class='js_message displayNone'>"+
								"<textarea class='talk_content' disabled='disabled'>"+ professionalMessage +"</textarea></div>" +
						  	"</div>";	
	
	var params = {
		open: true,
		msgText: errorMessage,
		professionalMsg:professionalHtml,
		modal: true,
		dialogClass: 'error_tips professional_tips tips_ico_p_error',
		buttons: {
			"Send Report": function(){
				$(this).dialog("close");
				var cusMsg = $(".js_cusmsg","#js_error_detail").val();
				if(cusMsg != input_default_val && cusMsg != ""){
					cusMsg = "<strong>user message:</strong>&nbsp;&nbsp;" + cusMsg + "<br/>";
				}else{
					cusMsg ="";
				}
				
				var _professionalMessage = cusMsg + professionalMessage;
				RestFeedBackSend({
					txt: encodeURIComponent(_professionalMessage),
					errorMessage: errorMessage,
					userAgent: GetUserAgent(),
					userIp: GetUserIp(),
					userTime: new Date().format("yyyy-MM-dd H:mm:ss")
				});
			},
			Close:function(){
				$(this).dialog("close");
			}
		}
	};

	T_MsgDialog(params);
	
	$(".js_more","#js_error_detail").click(function(){
		var $this = $(this);
		var $parents = $this.closest("#js_error_detail");
		$parents.children(".js_message").toggle();
	});
	klg_InputTips($(".js_cusmsg","#js_error_detail"),input_default_val);
}

//function infoMessage( errorMessage){
//	var params = {dialogId: "infoMessageId",open:true ,msgText:errorMessage, dialogClass: 'info_tips', title: 'Tips',buttons:{
//		OK:function(){$(this).dialog("close")}
//	} };
//	if( arguments[1] == false ){
//		params.open = false;
//	} 
//	T_MsgDialog( params ); 
//}

function successMessage( errorMessage ){
    
	var params = {
		dialogId: "successMessageId",
		open: true,
		minHeight:50,
		msgText: errorMessage,
		dialogClass: 'success_tips',
		title: ''
	};
	if( arguments[1] == false ){
		params.open = false;
	} 
	T_MsgDialog( params ); 
	setTimeout(function(){$("#"+params.dialogId).dialog("close")},2000);
}

function warningMessage( errorMessage ){
	T_MsgDialog({
		dialogId: "warningMessageId",
		dialogClass: 'error_tips tips_ico_p_warn',
		autoOpen: true,
		msgText: errorMessage,
		buttons: {
			OK: function(){
				$(this).dialog("close")
			}
		}
	}) ;
}

function confirmDialog( options ){	
	var defaults = {
		dialogId: "confirmDialogId",
		open: true,
		dialogClass: 'info_tips tips_ico_p_help',
		title: 'Confirm Dialog',
		buttons: {}
	};
		if (options.ok) {
            defaults.buttons.OK = options.ok;
        }
        
        if (options.yes) {
            defaults.buttons.Yes = options.yes;
        }
		
		if (options.cancel) {
            defaults.buttons.Cancel = options.cancel;
        }
            
        if (options.no) {
            defaults.buttons.No = options.no;
        }
        
	var settings = $.extend({}, defaults, options);
	T_MsgDialog( settings ); 
}



function infoMessage( errorMessage){
	var params = {
		dialogId: "infoMessageId",
		open: true,
		msgText: errorMessage,
		dialogClass: 'info_tips tips_ico_p_info',
		title: 'Tips',
		buttons: {
			OK: function(){
				$(this).dialog("close")
			}
		}
	};
	if( arguments[1] == false ){
		params.open = false;
	} 
	T_MsgDialog( params ); 
}

function T_MsgDialog(option){
    var defaults = {
        dialogId: "dialogId",
        dialogClass: 'error_tips',
        title: 'We are sorry that we are having a problem.',
        resizable: false,
        minHeight: 100,
        width: 423,
        autoOpen: false,
		open : true,
		professionalMsg:""
    }
    for(var i in defaults){
        if(typeof option[i] == "undefined"){
            option[i] = defaults[i];
        }
    }//end for
	
	var msgText = "<div id='"+ option.dialogId +"'>" +
				  "<img src='"+ elggHost +"mod/ThemeClassic/graphics/images/appbg.gif' class='tips_ico_p' />" + 
				  "<div class='tips_msg'>"+ option.msgText + option.professionalMsg + "</div></div>";
	
	 $("div#"+option.dialogId).length > 0 ? $("div#"+option.dialogId).html( "<img src='"+ elggHost +"mod/ThemeClassic/graphics/images/appbg.gif' class='tips_ico_p tips_ico_p_error' /><div class='tips_msg'>"+ option.msgText + option.professionalMsg + "</div>" ) : $("body").append( msgText );
    
//	 $("#js_error_detail").click
	
	if( option.open ) {
		 $("#"+option.dialogId).dialog(option).dialog("open");
	} else {
		 $("#"+option.dialogId).dialog(option);
	}
   
	}//end T_MsgDialog

function systemFeedBackSend( options ){
	 if( options.txt )	{
		 options.txt =  "Internal System Message: " +options.txt;
	 }
	RestFeedBackSend( options );
}
function RestFeedBackSend( options )
{
	var defaults = {						
			page:  GetRequestUri() ,
			mood:"angry",
			about:"rest_bug",
			id:$("#feedback_id").val().replace(/^\s+|\s+$/g,""),
			txt:'',
			errorMessage:''
		}
 if( options.txt )	{
	 options.txt =  options.txt.replace(/^\s+|\s+$/g,"") ;
 }
 var settings = $.extend({}, defaults, options);		  
	// fire the AJAX query
	jQuery.ajax({
		url: elggHost + "mod/feedback/actions/klg_rest_error_feedback.php",
		type: "POST",
		data: settings,
		cache: false,
		dataType: "html"
	});
}
//初始化对话框
function InitLoginDialog(jqueryString){
    $(jqueryString).dialog({
        dialogClass: "info_tips info_tips_pri",
        width: 250,
        autoOpen : false,
        resizable: false,
        draggable : false,
        buttons: {
			Cancel: function(){ $(this).dialog('close');}
        }
    });
}
//增加点击link的响应
function OnClickLink(jqueryString)
{
	$(jqueryString).click(function(){		
		if(loginUserId < 0)
		{	
			var localUrl = window.location.href;
			$("#js_login_container").dialog('option', 'title', 'Sorry,Please login first.');
			$("#js_login_container").dialog('open');
			$("#localUrl").attr('value', localUrl);
			return false;
		}
		
		})
}

//////////////////////////////////get url param//////////////
//example getUrlParam('id') or getUrlParam('id','#')
function getUrlParam(){
	var url=top.window.location.href;
	var u,params,StrBack='';
	if(arguments[arguments.length-1]=="#")
	   u=url.split("#");
	else
	   u=url.split("?");
	if (u.length==1) params='';
	else params=u[1];
	
	if(params!=''){
	   gg=params.split("&");
	   var MaxI=gg.length;
	   str = arguments[0]+"=";
	   for(i=0;i<MaxI;i++){
	      if(gg[i].indexOf(str)==0) {
	        StrBack=gg[i].replace(str,"");
	        break;
	      }
	   }
	}
	return StrBack;
}
