var UrlsFetcher = {
	qualities : {17 : "144p", 36 : "240p", 18 : "360p", 22 : "720p", 37 : "1080p" },
	preference : [36, 18, 22, 37],
	usable : [],
	curQuality : 2,
	fv : "",
	urls : {},
	guids : [],
	guidDict :{},
	issuedRequests : 0,
	caughtResponses : 0,
    dataReceivedCallback : null,
	autoplay : ""
	};

UrlsFetcher.resetCurQuality = function () {
	UrlsFetcher.curQuality = 2;
	if ((Config.preferredQuality > 0) && (Config.preferredQuality < UrlsFetcher.preference.length)) {
		UrlsFetcher.curQuality = Config.preferredQuality;
		Main.log("Setting UrlsFetcher.curQuality= " + UrlsFetcher.curQuality);
	}	
};

UrlsFetcher.fetchUrlList = function() {
	Main.log(" --- UrlsFetcher.fetchUrlList --- ");

	UrlsFetcher.resetCurQuality();
	
	Data.sort = true;
	Data.createAccessMap = true;
	UrlsFetcher.issuedRequests = 0;
	UrlsFetcher.caughtResponses = 0;
	UrlsFetcher.guids = [];
	UrlsFetcher.fetchUrls(Config.serverUrl + "/urls.xml"); 
};
	
UrlsFetcher.fetchUrls = function(url) {
	Main.log("UrlsFetcher.fetchUrls url= " + url);
	
	$.ajax({
		url: url,
		type : "GET",
		success : function(data, status, XHR ) {
			Main.log("UrlsFetcher.fetchUrls Success Response - status= " + status + " mime= " + XHR.responseType + " data= "+ data);

			$(data).find("item").each(function () {
				var guid = $(this).find('guid').text();
				Main.log("UrlsFetcher.fetchUrls : guid= " + guid );
				UrlsFetcher.guids.push(guid);				
//				UrlsFetcher.getYtDescription(guid);
				}); // each
			// Done
			 UrlsFetcher.getAllDescription();
		},
		error : function (jqXHR, status, error) {
			Main.log("UrlsFetcher.fetchUrls Error Response - status= " + status + " error= "+ error);
		},
		parsererror : function () {
			Main.log("UrlsFetcher.fetchUrls parserError  " );

		}
	});
		
};

UrlsFetcher.appendGuid = function (guid) {
	Main.log("UrlsFetcher.appendGuid guid= " + guid + " UrlsFetcher.guids.length= " + UrlsFetcher.guids.length);

	UrlsFetcher.guids.push(guid);				
	UrlsFetcher.guidDict[guid] = {};
	UrlsFetcher.guidDict[guid]["num"] = (UrlsFetcher.guids.length);
	UrlsFetcher.guidDict[guid]["start"] = (UrlsFetcher.guids.length);
	UrlsFetcher.getYtDescription(guid);	
	Main.logToServer("Data.getVideoCount= " + Data.getVideoCount());
};



UrlsFetcher.getAllDescription = function () {
	Main.log("UrlsFetcher.getAllDescription guids.length= " + UrlsFetcher.guids.length);
	for (var i = 0; i < UrlsFetcher.guids.length; i++) {
		Main.log("Calling " + UrlsFetcher.guids[i]);
		var guid = UrlsFetcher.guids[i];
		UrlsFetcher.guidDict[guid] = {};
		UrlsFetcher.guidDict[guid]["num"] = (i+1);
		UrlsFetcher.guidDict[guid]["start"] = (i+1);

		UrlsFetcher.getYtDescription(guid);		
//		UrlsFetcher.getYtDescription(UrlsFetcher.guids[i]);		
	}
	Main.log("UrlsFetcher.getAllDescription Done" );
};

UrlsFetcher.handleResponse = function (success) {
	UrlsFetcher.caughtResponses++;
	Main.log("UrlsFetcher.handleResponse caughtResponses= " + UrlsFetcher.caughtResponses);
	
	if (UrlsFetcher.caughtResponses >= UrlsFetcher.issuedRequests) {
		//Done
		Main.logToServer("UrlsFetcher.handleResponse - Done: " + UrlsFetcher.caughtResponses);

		if (UrlsFetcher.autoplay == "") {
			Data.completed(false);
			if (UrlsFetcher.dataReceivedCallback) {
				UrlsFetcher.dataReceivedCallback();
			}
		}
		else {
//			Main.logToServer("UrlsFetcher.handleResponse Autoplay " + UrlsFetcher.autoplay);
			Main.log("UrlsFetcher.handleResponse Autoplay " + UrlsFetcher.autoplay);
			Spinner.hide();
		
			// autoplay: 
			if (success == true) {
//	        	Display.setVideoList(Main.selectedVideo, Main.selectedVideo); 
				
				Main.logToServer("UrlsFetcher.handleResponse play guid= " + UrlsFetcher.autoplay);
				var num = UrlsFetcher.guidDict[UrlsFetcher.autoplay]["num"];
				DirectAccess.selectNewChannel(num);

				var first_idx = (Data.getVideoCount() < Display.getNumberOfVideoListItems()) ?0: Data.getVideoCount() - Display.getNumberOfVideoListItems();
				Display.setVideoList(Main.selectedVideo, first_idx); 
				
			}
			else {
				// remove 
				Main.logToServer("Error - UrlsFetcher.handleResponse: remove guid= " + UrlsFetcher.autoplay);
				delete UrlsFetcher.guidDict[UrlsFetcher.autoplay];
			}
			
			UrlsFetcher.autoplay = "";

		}
	}
};

UrlsFetcher.getYtDescription = function (vid) {
	Main.log("UrlsFetcher.getYtDescription vid= " + vid);
	var url = 'http://gdata.youtube.com/feeds/api/videos/'+vid+'?v=2&alt=json';
	Main.log("UrlsFetcher.getYtDescription url= " + url);
	UrlsFetcher.issuedRequests ++;
	
	$.ajax({
		url: url,
		type : "GET",
		dataType: "json",
		success: function(data, status, XHR ) {
			var title = data.entry.title.$t;
			var description = data.entry.media$group.media$description.$t;
			var duration = data.entry.media$group.yt$duration.seconds;
			var guid = data.entry.media$group.yt$videoid.$t;

			var num = UrlsFetcher.guidDict[guid]["num"];
			var start = UrlsFetcher.guidDict[guid]["start"];
			
	        Data.addItem( [title], {link : "", prog: "", desc: description, guid : guid, start: start, 
				dur: duration, ispes : "false", isnew : "false", fps : 0, num : num});     
	        Main.log("UrlsFetcher.getYtDescription: guid= " + guid + "was inserted at= " + Data.directAccessMap[num]);
	        Main.logToServer("UrlsFetcher.getYtDescription: guid= " + guid + "was inserted at= " + Data.directAccessMap[num]);
	        UrlsFetcher.handleResponse(true);
			//insert into data-base
		},
		error : function(jqXHR, status, error) {
			Main.log("UrlsFetcher.getYtDescription: Error");
	        UrlsFetcher.handleResponse(false);
		}
	
	});

};

	
	
UrlsFetcher.getYtVideoUrl = function (vid) {
	Main.log("UrlsFetcher.getYtVideoUrl: vid= " + vid);

	//Reset
	UrlsFetcher.fv = "";
	UrlsFetcher.usable = [];
	UrlsFetcher.urls = {}; // reset
	UrlsFetcher.resetCurQuality();
//	UrlsFetcher.curQuality = 2;
	
	$.get('http://www.youtube.com/get_video_info?video_id=' + vid, function(data) {
		UrlsFetcher.fv = data;
		var status = UrlsFetcher.getQueryAttrib(UrlsFetcher.fv, "status");
		if (status == "fail") {
			var reason = UrlsFetcher.getQueryAttrib(UrlsFetcher.fv, "reason");
			Main.log("reason: " + reason);
			Main.log("fv= "+UrlsFetcher.fv);
			Display.showPopup(reason);
			return;
		}

		UrlsFetcher.extractYtUrl(vid);
		
	});
};
		
		
UrlsFetcher.getQueryAttrib = function (querystring, item) {
	var filter = new RegExp( item + "=([^&]+)" );
	return unescape( querystring.match(filter)[1] );
};

UrlsFetcher.extractYtUrl = function (vid) {
	var stream_map = UrlsFetcher.getQueryAttrib(UrlsFetcher.fv, "url_encoded_fmt_stream_map").split(",");
	var itags = [];
	
	for (var i = 0; i < stream_map.length; i++) {
		var url =
			UrlsFetcher.getQueryAttrib(stream_map[i], "url") + "&signature=" +
			UrlsFetcher.getQueryAttrib(stream_map[i], "sig");
		var itag= url.match(/itag=(\d+)/)[1];
		itags.push(itag);
		if ( itag in UrlsFetcher.qualities) {
			// store only the wanted itags
			UrlsFetcher.urls[itag] = url;
			UrlsFetcher.usable.push(itag);
		}
	};
	if (UrlsFetcher.usable.length == 0) {
		// Nothing to play
		Display.showPopup("No supported format found for this clip.");
		Player.stop();
        Spinner.hide();
		Display.resetAtStop();
		Display.show();
	}
	// Done: Play now
	Main.log(vid+ ": Available Qualities= "+ itags.toString());
	Main.logToServer(vid+ ": Available Qualities= "+ itags.toString());

	if (UrlsFetcher.usable.length == 0) {
		Display.showPopup ("Error: No Suitable Formats founds " );
		return;
	}
	var ok = false;
	
	
	while (!ok) {
		if (UrlsFetcher.preference[UrlsFetcher.curQuality] in UrlsFetcher.urls) {
			Player.setVideoURL(UrlsFetcher.urls[UrlsFetcher.preference[UrlsFetcher.curQuality]]);
			ok = true;
			Notify.showNotify("Quality: " + UrlsFetcher.qualities[UrlsFetcher.preference[UrlsFetcher.curQuality]], true);
		}
		else
			UrlsFetcher.curQuality --;
		if (UrlsFetcher.curQuality <0) {
			Player.setVideoURL(UrlsFetcher.urls[UrlsFetcher.usable[0]]);
			Notify.showNotify("Quality: " + UrlsFetcher.qualities[UrlsFetcher.usable[0]], true);
			ok = true;
		}
	}
	Player.playVideo(-1);

};