var Diagnosis = function(){
	return {
		init:function(options){
			Diagnosis.searchEngine = options['search_engine'];
			Diagnosis.mainURL = options['url'];
			Diagnosis.reportId = options['rid'];
			Diagnosis.maxResults = options['max_results']?options['max_results']:500;
		},
		apiUrls:{
					links:{
							'yahoo':'http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&'
						  },
					pages:{
							'yahoo':'http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&'
					},
					resultsPerPage:{
							'yahoo':100
					}
		},
		searchEngine:'yahoo',
		progressBarId:'progressbar',
		mainURL:'',
		pagesList:[],
		backLinks:{},
		maxResults:100,
		totalActions:0,
		currentAction:0,
		totalLinks:0,
		totalPages:0,
		linksCheckingfrom:0,
		pagesCheckingFrom:0,
		working:0,
		linksIndex:0,
		pagesIndex:0,
		startLinkDiagnosis:function(){
			Diagnosis.showProgressBar();
			Diagnosis.getPagesAll();
		},
		completeLinkdiagnosis:function(){
			window.location.href = 'links.html?rid='+Diagnosis.reportId+'&do=result';
		},
		incrementActionPosision:function(inc){
			var i = typeof inc != 'undefined'?parseInt(inc):1;
			Diagnosis.currentAction += i;
			var v = Diagnosis.totalActions==0?0:Math.round((Diagnosis.currentAction/Diagnosis.totalActions)*100);
			v = v>100?100:v;
			Diagnosis.applyProgressBarValue(v);
		},
		applyProgressBarValue:function(v){
			var value = typeof v != 'undefined'?parseInt(v):0;
			var objProgesbar = jQuery('#'+Diagnosis.progressBarId);
			if (objProgesbar.length>0){
				//var fullwidth = objProgesbar.width();
				//var width = Math.round((v*fullwidth)/100);
				objProgesbar.find('.progressline').width(v+'%');
				objProgesbar.find('.progresstext').html(v+'%');
			}
		},
		applyProgressBarMessage:function(message){
			var message = Goingup.truncate(message,100)
			jQuery('#progressmessage').html(message);
		},
		showProgressBar:function(){
			var progressbarHtml = '<div id="progressbar"><div class="progressline" style="width:0%;"><span class="progresstext"></span></div></div>' +
									'<div id="progressmessage">Loading...</div>';
			var options = {
					msg_title:'Processing, please wait...',
					msg:progressbarHtml,
					buttons:'none'
   				} ;
			Goingup.Dialog.Show(options);
		},
		
		checkAllLinksAndPages:function(){
			//Diagnosis.totalActions += (Diagnosis.totalPages+Diagnosis.totalLinks);
			Goingup.Request({
					'url':'links.html',
					'method':'post',
					'mode':'none',
					params:{'do':'total_links_pages','rid':Diagnosis.reportId},
					callAfterSuccess:function(data){
								if (data.total_pages || data.total_links){
									Diagnosis.totalActions = Diagnosis.currentAction + parseInt(data.total_links) + parseInt(data.total_pages);
									Diagnosis.incrementActionPosision(0);
								}
		 						
		 						if (data.total_pages>0){
		 							var max = data.total_pages>25?5:Math.ceil(data.total_pages/5);
		 							for (var i=0; i<max; i++){
		 								Diagnosis.working++;
		 								Diagnosis.pagesCheckingFrom = i*5;
		 								Diagnosis.checkAllPages();
		 								
		 							}
		 						}
		 						
		 						if (data.total_links>0){
		 							var max = data.total_links>25?5:Math.ceil(data.total_links/5);
		 							for (var i=0; i<max; i++){
		 								Diagnosis.working++;
		 								Diagnosis.linksCheckingfrom = i*5;
		 								Diagnosis.checkAllLinks();
		 								
		 							}
		 						}
		 					}
			});			
		},
		checkAllPages:function(start){
			var start = Diagnosis.pagesCheckingFrom;
			var message = '';
			message += 'Checking found pages for pagerank and strength';
			Diagnosis.applyProgressBarMessage(message);
			var options = {
		 					params:{'do':'check_pages','start':start,'rid':Diagnosis.reportId},
		 					url:'links.html',
		 					method:'post',
		 					mode:'none',
		 					callAfterSuccess:function(data){
		 						Diagnosis.applyProgressBarMessage('&nbsp;');
		 						if (data.pages_checked>0){
		 							Diagnosis.incrementActionPosision(data.pages_checked);
		 							Diagnosis.pagesCheckingFrom += 5;
		 							Diagnosis.checkAllPages();
		 						}else{
		 							Diagnosis.working--;
		 							if (Diagnosis.working==0){
		 								Diagnosis.completeLinkdiagnosis();
		 								return false;
		 							}
		 						}
		 					}
			 			};
			Goingup.Request(options);			 			
		},
		checkAllLinks:function(start){
			var start = Diagnosis.linksCheckingfrom;
			var message = '';
			message += 'Checking found links for pagerank and strength';
			Diagnosis.applyProgressBarMessage(message);
			var options = {
		 					params:{'do':'check_links','start':start,'rid':Diagnosis.reportId},
		 					url:'links.html',
		 					method:'post',
		 					mode:'none',
		 					callAfterSuccess:function(data){
		 						Diagnosis.applyProgressBarMessage('&nbsp;');
		 						if (data.links_checked>0){
		 							Diagnosis.incrementActionPosision(data.links_checked);
		 							Diagnosis.linksCheckingfrom += 5;
		 							Diagnosis.checkAllLinks();
		 						}else{
		 							
		 							Diagnosis.working--;
		 							if (Diagnosis.working==0){
		 								Diagnosis.completeLinkdiagnosis();
		 								return false;
		 							}
		 						}
		 					}
			 			};
			/*if (count==subcount){
				options['callAfterSuccess'] = function(data){
		 			Diagnosis.getLinksPortion(url,search_engine,(subfrom+count),count);
		 		}
			}else{
				
			}*/
		 	Goingup.Request(options);
		},
		getLinksAll:function(){
			if (Diagnosis.linksIndex>=Diagnosis.pagesList.length){
				if (Diagnosis.working==0){
					Diagnosis.checkAllLinksAndPages();
				}
				return true;
			}
			
			var url = Diagnosis.pagesList[Diagnosis.linksIndex];
			Diagnosis.getLinksPortion(url, 1);
			 
			return true;
		},
		getLinksPortion:function(url,start){
			
			var search_engine = Diagnosis.searchEngine;
			var count = Diagnosis.apiUrls.resultsPerPage[search_engine];
			
			
			
			if (start>Diagnosis.maxResults){
				Diagnosis.linksIndex++;
				return Diagnosis.getLinksAll();
			}
			
			var params = {
				'query':url,
				'start':start,
				'results':count,
				'callback':'?'
			};
			
			var message = '';
			message += 'Searching links for '+url;
			Diagnosis.applyProgressBarMessage(message);
			
			var apiurl = Diagnosis.apiUrls['links'][Diagnosis.searchEngine];
			
			
			
			var strParams = 'query=link:'+url+' -site:'+Diagnosis.mainURL+'&omit_inlinks=1'+'&start='+start+'&results='+count+'&output=json&callback=?'
			Diagnosis.working++;
			$.getJSON(apiurl+strParams, function(data){
				var subtotal = data.ResultSet['totalResultsAvailable'];
				var subfrom = parseInt(data.ResultSet['firstResultPosition']);
				var subcount = parseInt(data.ResultSet['totalResultsReturned']);
				
				var search_engine = Diagnosis.searchEngine;
				var count = Diagnosis.apiUrls.resultsPerPage[search_engine];
				
				Diagnosis.totalActions += subcount;
				Diagnosis.incrementActionPosision();
				
				var pages = data.ResultSet['Result'];
				
				var urls = [];
				if (typeof pages != 'undefined' && pages.length>0){
					if (pages instanceof Array){
						for (var i=0; i<pages.length; i++){
							urls[urls.length] = pages[i]['Url']; 
						}
					}else{
						urls[urls.length] = pages['Url'];
					}
				 	var options = {
				 					params:{'do':'store_links','page_url':url,'rid':Diagnosis.reportId,'urls[]':urls},
				 					url:'links.html',
				 					method:'post',
				 					mode:'none',
				 					callAfterSuccess:function(){
				 						Diagnosis.applyProgressBarMessage('&nbsp;');					 		
				 						Diagnosis.working--;
				 						if (Diagnosis.working==0){
				 							Diagnosis.linksIndex++;
				 							Diagnosis.getLinksAll();
				 						}
				 					}
					 			};
						
					if (count==subcount){
						
			 			Diagnosis.getLinksPortion(url,(subfrom+count));
					}else{
						Diagnosis.linksIndex++;
			 			Diagnosis.getLinksAll()
					}
				 	Goingup.Request(options);
				}else{
					Diagnosis.working--;
					Diagnosis.linksIndex++;
					Diagnosis.getLinksAll();
				}
			});
			return true;
		},
		getPagesAll:function(){
			Diagnosis.getPagesPortion(1,100);
		},
		getPagesPortion:function(start){
			var url = Diagnosis.mainURL;
			var search_engine = Diagnosis.searchEngine;
			var count = Diagnosis.apiUrls.resultsPerPage[search_engine];
			
			if (start>Diagnosis.maxResults){
				return Diagnosis.getLinksAll();
			}
			
			var params = {
				'query':url,
				'start':start,
				'results':count,
				'callback':'?'
			};
			var message = '';
			message += 'Searching pages for '+url;
			Diagnosis.applyProgressBarMessage(message);
			
			var apiurl = Diagnosis.apiUrls['pages'][Diagnosis.searchEngine];
			var strParams = 'query=site:'+url+'&start='+start+'&results='+count+'&output=json&callback=?'
			Diagnosis.working++;
			$.getJSON(apiurl+strParams, function(data){
				var subtotal = data.ResultSet['totalResultsAvailable'];
				var subfrom = parseInt(data.ResultSet['firstResultPosition']);
				var subcount = parseInt(data.ResultSet['totalResultsReturned']);
				
				var url = Diagnosis.mainURL;
				var search_engine = Diagnosis.searchEngine;
				var count = Diagnosis.apiUrls.resultsPerPage[search_engine];
			
				Diagnosis.totalActions += subcount;
				Diagnosis.totalPages += subcount;
				if (start>1) Diagnosis.incrementActionPosision();
				
				var pages = data.ResultSet['Result'];
				var urls = [];
				if (typeof pages != 'undefined' && pages.length>0){
					if (pages instanceof Array){
						for (var i=0; i<pages.length; i++){
							urls[urls.length] = pages[i]['Url'];
							Diagnosis.pagesList[Diagnosis.pagesList.length] = pages[i]['Url']; 
						}
					}
					
				 	var options = {
				 					params:{'do':'store_pages','rid':Diagnosis.reportId,'urls[]':urls},
				 					url:'links.html',
				 					method:'post',
				 					mode:'none',
				 					callAfterSuccess:function(){
				 						Diagnosis.applyProgressBarMessage('&nbsp;');
				 						Diagnosis.working--;
				 						if (Diagnosis.working==0){
				 							Diagnosis.getLinksAll();
				 						}
				 					}
					 			};
									 			
					if (count==subcount){
			 			Diagnosis.getPagesPortion((subfrom+count));
					}else{
			 			Diagnosis.getLinksAll();
					}
				 	Goingup.Request(options);
				}else{
					Diagnosis.working--;
					if (Diagnosis.working==0){
						Diagnosis.getLinksAll();
					}
				}
			});
		}
	}
}();
	

jQuery(function(){
	jQuery('#fmForm').submit(function(event,params,options){
		if (typeof options == 'undefined'){
			var options = {
				show_inline_loader_for:'#btn_submit',
				callAfterSuccess:function(data){
					if (data.reportId && data.reportURL){
						 Diagnosis.init({
							  			'search_engine':'yahoo',
								  		'url':data.reportURL,
								  		'rid':data.reportId
							  			});
	  					 Diagnosis.startLinkDiagnosis();
					}
				},
				callAfterFailed:function(data){
					jQuery('#btn_submit').html('<button class="ld_button_check" type="submit"></button>');
				}
			}
		}
		return Goingup.Form.Submit(this,params,options);	
	});
});
