/**
 * @author DREDroot
 *
 */
dojo.declare("dojom.Controller", null, 
{	
	pEntities :{},
	gridColumns:[],
	
	datamanager: null,
	divconstr: null,
	log: null,
	
	//prefix:'test_data',
	prefix:'/servlets',

	
	constructor: function ()
	{		
		this.getEntitiesUrl = this.prefix+'/getModel.htm';
		this.getSearchRowsUrl = this.prefix+'/search.htm';
		this.getSearchRowsUrlNextPage = this.prefix+'/getPage.htm';
		this.loadGridColumnsUrl = this.prefix+'/gridColumns.htm';
		
		this.loadCategoriesUrl = this.prefix+'/categories.htm';
		this.getGeometryOfFloatersUrl = this.prefix+'/';
		this.addCommentForEntityUrl = this.prefix+'/commentModel.htm';
		this.loginUrl = this.prefix+'/login.htm',
		this.logoutUrl = this.prefix+'/logout.htm',
		this.registerUrl = this.prefix+'/register.htm',
		this.saveUILayoutUrl = this.prefix+'/saveUILayout.htm';
		this.getMySearchRowsUrl = this.prefix+'/getMySearches.htm';
		this.addToMySearchesUrl = this.prefix+'/addToMySearches.htm';
		this.deleteFromMySearchesUrl = this.prefix+'/deleteFromMySearches.htm';
		this.postFeedbackUrl = this.prefix+'/postFeedback.htm';
		this.rateModelUrl = this.prefix+'/rateModel.htm';
		this.getAuthorUrl = this.prefix+'/author.htm';
		this.getStatisticsUrl = this.prefix+'/statistics.htm?stats_type=userStats';
		this.logUIErrorUrl = this.prefix+'/logUIError.htm';
		
		
		this.log = LOG.addClass('Controller');
		this.datamanager = new dojom.data.Manager();			
		
	},
	
	loadCategories : function (onLoad)
	{	
		var obj = this;
		try{	
			this.datamanager.getJsonFromUrl(this.loadCategoriesUrl,onLoad,'loadCategories');
		}catch(ex){obj.log.error('loadCategories.'+JSON.stringify(ex))}
	},
	
	getStatistics: function(onLoad)
	{		
		try{		
			this.datamanager.getJsonFromUrl(this.getStatisticsUrl,onLoad,'getStatistics');
		}catch(ex){this.log.error('getStatistics'+JSON.stringify(ex))}
	},
	
	loadGridColumns: function(onLoad)
	{
		var obj = this;
		try{
			this.datamanager.getJsonFromUrl(this.loadGridColumnsUrl,
				function(_data)
				{
					try{
						obj.gridColumns = _data;
						onLoad(_data)
					}catch(ex){obj.log.error('loadGridColumns /getJsonFromUrl/.'+JSON.stringify(ex))}
				},
				'loadGridColumns'
			);
		}catch(ex){obj.log.error('loadGridColumns.'+JSON.stringify(ex))}
	},
	
	getSearchRows : function (params,onLoad)
	{		
		var keywords = params['keywords'];
		var cat = params['category'];
		var tabid = params['tabId'];
		var sortOption = params['sortOption'];
		var byAuthor = params['byAuthor'];
		
		var obj = this;	
		try{	
			this.datamanager.getJsonFromUrl(
				this.getSearchRowsUrl
					+'?category='+cat
					+'&userRequest='+keywords
					+'&tabId='+tabid
					+ (sortOption ? '&sortOptions='+sortOption : '')
					+ (byAuthor ? '&byAuthor=1' : ''),
				function(_data)
				{	
					try{			
						var data = [];				
						for (var i=0;i<_data['data'].length;i++)				
							data.push(obj.getGridRowFromEntity(_data['data'][i]));
						
						_data['data'] = data;					
						onLoad(_data);
					}catch(ex){obj.log.error('getSearchRows /onLoad/.'+JSON.stringify(ex))}
				},
				'getSearchRows'
			);
		}catch(ex){obj.log.error('getSearchRows.'+JSON.stringify(ex))}
	},
	
	getSearchRowsNextPage : function (page,params,tabId,onLoad)
	{
		var obj = this;
		var keywords = params['keywords'];
		var cat = params['category'];
		var tabid = params['tabId'];
		var sortOption = params['sortOption'];
		var byAuthor = params['byAuthor'];
		try{
			this.datamanager.getJsonFromUrl(this.getSearchRowsUrlNextPage
				+'?category='+cat
				+'&userRequest='+keywords
				+'&tabId='+tabid
				+ (sortOption ? '&sortOptions='+sortOption : '')
				+ (byAuthor ? '&byAuthor=1' : '')
				+'&pageN='+page
				+'&tabId='+tabId,
				function(_data)
				{
					try{
						var data = [];
						for (var i=0;i<_data.length;i++)
							data.push(obj.getGridRowFromEntity(_data[i]));					
						onLoad({'data':data});
					}catch(ex){obj.log.error('getSearchRowsNextPage /onLoad/.'+JSON.stringify(ex))}
				},
				'getSearchRowsNextPage'
			);
		}catch(ex){obj.log.error('getSearchRowsNextPage.'+JSON.stringify(ex))}
	},
	
	getGridRowFromEntity: function(entity)
	{
		var obj = this;
		var x = 150;
		var tmp = [];
		try{
						
			tmp.push(entity['id']);
			for(var j=0;j<this.gridColumns.length;j++)
			{
				var cell = entity[this.gridColumns[j]['name']];
	
				if(cell && cell.length > x)
				{				
					var cellmass = cell.substring(0, x).split(' ');
					cell = '';
					for(var i=0; i<cellmass.length-1; i++)
						cell +=cellmass[i]+' ';
					
					cell =cell.substring(0, cell.length-1)+'...'
				}
				
				if(this.gridColumns[j]['name'] == 'store')
				{
					if(cell.substring(0, 3)== 'www')
						cell = cell.substring(4, cell.length);
				}
				
				tmp.push(cell);
			}
		}catch(ex){obj.log.error('getGridRowFromEntity.'+JSON.stringify(ex))}
		return tmp;
	},		
	
	loadEntity : function(id,onLoad)
	{
		var obj = this;
		try{
			this.datamanager.getJsonFromUrl(this.getEntitiesUrl+'?id='+id,
				function(data_)
				{
					try{
						var entity = new dojom.data.Entity();
						for(var key in data_){
					    	entity[key]=data_[key];
					    }
					    					
					    obj.pEntities[id] = entity;
					    onLoad();
					}catch(ex){obj.log.error('loadEntity /onLoad/.'+JSON.stringify(ex))}
				},
				'loadEntity'
			);
		}catch(ex){obj.log.error('loadEntity.'+JSON.stringify(ex))}
	},
	getEntity: function (id,onLoad)
	{
		var obj = this;
		try{
			if(this.pEntities[id]==null){
			 	this.loadEntity(id,onLoad);
		    }
		    return this.pEntities[id];
		}catch(ex){obj.log.error('getEntity.'+JSON.stringify(ex))}
	},	
	
	addCommentForEntity: function(id,comment,onLoad)
	{
		try{
			this.datamanager.sendDataToUrl(this.addCommentForEntityUrl,
					{'id':id,'comment':comment},
				onLoad,
				'addCommentForEntity'
			);
		}catch(ex){this.log.error('addCommentForEntity.'+JSON.stringify(ex))}
	},
	
	login: function(username,pass,onLoad)
	{
		try{
			this.datamanager.getJsonFromUrl(this.loginUrl+'?login='+username+'&passwd='+pass,onLoad,'login');	
		}catch(ex){this.log.error('login.'+JSON.stringify(ex))}
	},
	
	logout: function(onLoad)
	{
		if(!onLoad)
			onLoad = function(){};
		try{
			this.datamanager.getJsonFromUrl(this.logoutUrl,onLoad,'logout');
		}catch(ex){this.log.error('logout.'+JSON.stringify(ex))}
	},
	
	seveGeometryOfFloaters: function(data,onLoad)
	{		
		try{
			this.datamanager.getJsonFromUrl(this.saveUILayoutUrl+'?uilayout='+JSON.stringify(data),onLoad,'seveGeometryOfFloaters('+JSON.stringify(data)+')');
		}catch(ex){this.log.error('seveGeometryOfFloaters'+JSON.stringify(ex))}
	},	
	
	getMySearchRows: function(onLoad)
	{	
		var obj = this;
		try{
			this.datamanager.getJsonFromUrl(this.getMySearchRowsUrl,
				function(_data)
				{
					try{
						var data = [];
						for (var i=0;i<_data.length;i++)
							data.push(obj.getGridRowFromEntity(_data[i]));					
						onLoad({'data':data});
					}catch(ex){obj.log.error('getMySearchRows /onLoad/.'+JSON.stringify(ex))}
				},
				'getMySearchRows'
			);	
		}catch(ex){obj.log.error('getMySearchRows.'+JSON.stringify(ex))}
	},
	
	addToMySearches: function(data,onLoad)
	{	
		try{
			this.datamanager.getJsonFromUrl(this.addToMySearchesUrl
					+'?ids='+JSON.stringify(data),
				onLoad,
				'addToMySearches'
			);
		}catch(ex){this.log.error('addToMySearches.'+JSON.stringify(ex))}
	},
	
	deleteFromMySearches: function(data,onLoad)
	{
		try{
			this.datamanager.getJsonFromUrl(this.deleteFromMySearchesUrl
					+'?ids='+JSON.stringify(data),
				onLoad,
				'deleteFromMySearches'
			);
		}catch(ex){this.log.error('deleteFromMySearches.'+JSON.stringify(ex))}
	},	
	
	registration: function(params,onLoad)
	{
		try{
			this.datamanager.getJsonFromUrl(this.registerUrl+'?login='+params.login+'&passwd='
				+params.pass+'&email='+params.email+'&firstName='+params.fname+'&secondName='
				+params.sname+'&confirmationCode='+params.code,
				onLoad,
				'registration'
			);	
		}catch(ex){this.log.error('registration.'+JSON.stringify(ex))}
	},
	
	postFeedback: function(comment,model_id,onLoad)
	{	
		try{	
			this.log.debug('postFeedback. model_id:'+model_id);
			this.datamanager.sendDataToUrl(this.postFeedbackUrl,
				{'comment' :comment,'model_id'	:model_id},
				onLoad,
				'postFeedback'
			);
		}catch(ex){this.log.error('postFeedback.'+JSON.stringify(ex))}
	},
	
	setModelRate: function(id,rate,onLoad)
	{
		try{		
			this.datamanager.getJsonFromUrl(this.rateModelUrl+'?id='+id+'&rate='+rate,
				onLoad,
				'setModelRate'
			);
		}catch(ex){this.log.error('setModelRate'+JSON.stringify(ex))}
	},
	
	saveLogUIError: function(text)
	{
		try{			
			this.datamanager.sendDataToUrl(this.logUIErrorUrl,{'errorText':text},function(data){},'saveLogUIError');
		}catch(ex){this.log.error('saveLogUIError.'+JSON.stringify(ex))}
	},
	
	getAuthor: function(id,onLoad)
	{
		try{		
			this.datamanager.getJsonFromUrl(this.getAuthorUrl+'?id='+id,onLoad,'getAuthor');
		}catch(ex){this.log.error('getAuthor'+JSON.stringify(ex))}
	}	

});
