/**
 * jQuery Flickr plugin
 * https://github.com/katsuma/jquery-flickr-plugin
 * required jQuery 1.5 and above
 *
 * Copyright (c) 2011 ryo katsuma
 * Licensed under the MIT:
 * http://www.opensource.org/licenses/mit-license.php
 */
/**
 * jQuery Flickr plugin + Custom
 * required jQuery 1.6.1 and above
 *
 * Copyright (c) 2011 Mil Hayashi
 * Licensed under the MIT:
 * http://www.opensource.org/licenses/mit-license.php
 */


$(function() {
	
//////////////////////////////////////////////////////////////////////////////////////////////////●設定項目
	var pMax_num = $(".th_container").length;  //1ページに表示する数。デフォルトはコンテナの数
	var setUserName = 'huku_niigata.';               //Flickr ユーザーネーム
	var max_view_num = 8;                      //最大の読み込み枚数。全ての画像を読み込む時は0
	
	function setFancyBox(tar){                 //FancyBoxの設定（表示は規定のインライン<div id="inlineContent1">表示のみ対応）
		$(tar).fancybox({
			'centerOnScroll' : true,
			'autoDimensions': true,
			'autoScale': false,
			'padding': 0,
			'overlayColor'	: '#CCC',
			'overlayOpacity': 0.6
		});
	};
	
//////////////////////////////////////////////////////////////////////////////////////////////////●設定項目ここまで


	
//////////////////////変数
	var pageL = 1;
	var pageNum = 0;
	var photoLength = 0;
	var descriptions = [];
	var titles = [];
	var pLargeUrls = [];
	var pLargeW = [];
	var pLargeH = [];
	var pSmalUrls = [];
	var pSmalW = [];
	var pSmalH = [];
	var pSmalX = [];
	var pSmalY = [];
	var tWS = $(".th_container").css("width");
	var tHS = $(".th_container").css("height");
	var tW = Number(tWS.slice(0,tWS.length-2));
	var tH = Number(tHS.slice(0,tHS.length-2));
	
  $.fn.flickr = function(options){
	var add_num = 0;
	
	var self = this;
	var defaults = {
	  top_url : 'http://flickr.com/',
	  api_url : 'http://api.flickr.com/services/rest/?',
	  api_key : '4e731e98b0a7ace3aeb376a911a394aa',
	  user_name : '',
	  user_id : '',
	  view_num : 0,
	  size : 'small',
	  photos : {}
	};
	var setting = $.extend(defaults, options);

	var methods = {
	  requestOptions : {
		api_key : setting.api_key,
		format : 'json'
	  },
	  
//////////////////////////////////////////////////////////////////////////////////////////////////ユーザー名からユーザーIDを取得
	  findByUsername : function(user_name){
		if(!user_name) {
		  throw new Error('Username param Exception');
		  return self;
		}
		var method = 'flickr.people.findByUsername';
		return $.ajax({
		  url: setting.api_url,
		  data : $.extend(this.requestOptions, { method : method, username : user_name }),
		  dataType: 'jsonp',
		  jsonp : 'jsoncallback',
		  success : function(data, status){
			if(!data.stat || data.stat!='ok') {
			  throw new Error('findByUsername Exception');
			  return;
			}
			setting.user_id = data.user.nsid;
		  }
		});
	  },
	  
//////////////////////////////////////////////////////////////////////////////////////////////////画像ID一覧取得
	  getPublicPhotos : function(user_id){
		var method = 'flickr.people.getPublicPhotos';
		var user_id = user_id || setting.user_id;
		return $.ajax({
		  url: setting.api_url,
		  data : $.extend(this.requestOptions, { method : method, user_id : user_id }),
		  dataType: 'jsonp',
		  jsonp : 'jsoncallback',
		  success: function(data, status){
			if(!data.stat || data.stat!='ok') {
			  throw new Error('getPublicPhotos Exception');
			  return;
			}
			setting.photos = data.photos.photo;
			photoLength = setting.photos.length;
			if(max_view_num > 0 && max_view_num<photoLength){photoLength = max_view_num;};
			if(photoLength<pMax_num){pMax_num = photoLength;}
			pageL= Math.ceil(photoLength/pMax_num);
		  }
		});
	  },
	  
//////////////////////////////////////////////////////////////////////////////////////////////////各画像のサイズ・URL等を取得
	  loadPhoto : function(photo,pNum){
		if(photo == null) {
		  throw new Error('Load photo Exception');
		  return;		  
		}
		var title = photo.title;
		var photoId = photo.id;
		var view_num = setting.view_num;
		var method = 'flickr.photos.getSizes';
		return $.ajax({
		  url: setting.api_url,
		  data : $.extend(this.requestOptions, { method : method, photo_id : photoId }),
		  dataType: 'jsonp',
		  jsonp : 'jsoncallback',
		  success : function(data, status){
			if(!data.stat || data.stat!='ok') {
			  throw new Error('getSize Exception');
			  return;
			}
			
			var sizeIndices = { square : 0, thumbnail : 1, small : 2, medium : 3, medium640 : 4, original : 5 };
			var sizeIndex = sizeIndices[setting.size] || 0;
			var sqData = data.sizes.size[sizeIndex];
			var sqDataL = data.sizes.size[4];
			if(sqData == null) return self;

			var jpgSource = sqData.source;
			var jpgUrl = sqData.url;
			pLargeUrls[pNum] = sqDataL.source;
			pLargeW[pNum] = sqDataL.width;
			pLargeH[pNum] = sqDataL.height;
			
			var thisTW = sqData.width;
			var thisTS = 1;
			var thisTH = sqData.height;
			var thisTX = 0;
			var thisTY = 0;
			
			if(thisTW>thisTH){
				thisTS = tH/thisTH;
				thisTH = tH;
				thisTW = Math.round(thisTW*thisTS);
				thisTX = (tW-thisTW)/2;
			}else{
				thisTS = tW/thisTW;
				thisTW = tW;
				thisTH = Math.round(thisTH*thisTS);
				thisTY = (tH-thisTH)/2;
			}
			var jpgId = jpgUrl.match(/(\d+)\/sizes/)[1];
			var user_name = setting.user_name;
			
			pSmalUrls[pNum]=jpgSource;
			pSmalW[pNum]=thisTW;
			pSmalH[pNum]=thisTH;
			pSmalX[pNum]=thisTX;
			pSmalY[pNum]=thisTY;
			if(pNum==pMax_num-1){setBtnFirst();}
		  }
		});
	  },
	  
//////////////////////////////////////////////////////////////////////////////////////////////////各画像の情報（descriptionやタイトル、アップロード日）
	  loadInfo : function(photo,iNum){
		if(photo == null) {
		  throw new Error('Load photo Exception');
		  return;		  
		}
		var title = photo.title;
		var photoId = photo.id;
		var method = 'flickr.photos.getInfo';
		return $.ajax({
		  url: setting.api_url,
		  data : $.extend(this.requestOptions, { method : method, photo_id : photoId }),
		  dataType: 'jsonp',
		  jsonp : 'jsoncallback',
		  success : function(data, status){
			if(!data.stat || data.stat!='ok') {
			  throw new Error('getSize Exception');
			  return;
			}
			///////////////アップロード日を取得・表記
			if(iNum==0){
				var dayString  =["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
				var dd=new Date();
				dd.setTime(data.photo.dateuploaded*1000);
				$("#fli_date").text((dd.getMonth()+1)+" / "+dd.getDate()+" ("+dayString[Number(dd.getDay())]+") updated");
			}
			var pTitle = data.photo.title._content;
			var pDes = data.photo.description._content;
			if(pDes != null){pDes = pDes.split("\n").join("<br />")};
			if(pTitle == null) return self;
			titles[iNum]=pTitle;
			descriptions[iNum]=pDes;
		  }
		});
	  },
	};

////////////////////////////////////////////初期表示分読み込み後
	function setBtnFirst(){
		$("#loadinginfo").fadeOut(300);
		$("#thBox li").each(function(i){ $(this).fadeOut(0); $("img",this).remove(); });
			$("#footer_P").text("pMax_num"+pMax_num);
		var maxNum = pMax_num;
		var n = 0;
		if(maxNum > photoLength-n*pMax_num){ maxNum = photoLength-n*pMax_num};
		for(var i=0;i<maxNum;i++){
			$(".th_container").eq(i).append('<img style="margin:'+ pSmalY[i+n*pMax_num] +'px 0 0 '+ pSmalX[i+n*pMax_num] +'px" width="'+ pSmalW[i+n*pMax_num] +'" height="'+ pSmalH[i+n*pMax_num] +'" src="' + pSmalUrls[i+n*pMax_num] + '"  class="image3" alt="' + titles[i+n*pMax_num] + '" />');
			$("#thBox li").eq(i).fadeIn(0);
		}
		setClickToChangeInline("#thList a");///クリック時関数を設定
	}
	
////////////////////////////////////////////全ての画像URL読み込み後
	function setBtn(){
		pageLinkIn();
	}
	
////////////////////////////////////////////サムネイルをクリックした時
	function setClickToChangeInline(target){
		$(target).each(function(i){
			$(this).click(function(){
				$("#fancybox-overlay").css({width:$(document).width(),height:$(document).height()});
				$("#inlineContent1").css({width:Number(pLargeW[i+pageNum*pMax_num])+365-20-60,height:Number(pLargeH[i+pageNum*pMax_num])+103-20-55});
				
				$("#iL_content_L").css({width:pLargeW[i+pageNum*pMax_num],height:pLargeH[i+pageNum*pMax_num]});
				$("#iL_img").css("opacity",0);
				$("#iL_title").text(titles[i+pageNum*pMax_num]);
				$("#iL_description").html(descriptions[i+pageNum*pMax_num]);
				$("#iL_img").attr("src",pLargeUrls[i+pageNum*pMax_num]);
				$("#iL_img").bind("load", function() {
					$("#iL_img").stop().animate({opacity:1},{duration:400});
				});
			});
		});
		setFancyBox(target);///FancyBOxを設定
	};
	
////////////////////////////////////////////ページリンクを表示
	function pageLinkIn(){
		if(pageL==1){  ////////////////////////////////////////////1ページの時

		}else{         ////////////////////////////////////////////2ページ以上の時
		
			////////////////////////////////////////////矢印クリック時
			$("#ar_L a").click(function(){
				if(pageNum-1>=0){
					if(pageNum==pageL-1){
						$("#ar_R .ar_out").fadeOut(fadeTime);
					}
					pageNum--;
					pageMove(pageNum);
					if(pageNum==0){
						$("#ar_L .ar_out").fadeIn(fadeTime);
					}else{
					}
				}
				return false
			});
			$("#ar_R a").click(function(){
				if(pageNum<pageL){
					if(pageNum==0){
						$("#ar_L .ar_out").fadeOut(fadeTime);
					}
					pageNum++;
					pageMove(pageNum);
					//$("#pageNum").text(pageNum+1);
					if(pageNum==pageL-1){
						$("#ar_R .ar_out").fadeIn(fadeTime);
					}else{
						$("#ar_R .ar_out").fadeOut(fadeTime);
					}
				}
				return false
			});
			
			////////////////////////////////////////////ページ移動時：サムネイル変更
			function pageMove(n){
				$("#thBox li").each(function(i){ $(this).fadeOut(0); $("img",this).remove(); });
				var maxNum = pMax_num;
				if(maxNum > photoLength-n*pMax_num){ maxNum = photoLength-n*pMax_num};
				for(var i=0;i<maxNum;i++){
					$(".th_container").eq(i).append('<img style="margin:'+ pSmalY[i+n*pMax_num] +'px 0 0 '+ pSmalX[i+n*pMax_num] +'px" width="'+ pSmalW[i+n*pMax_num] +'" height="'+ pSmalH[i+n*pMax_num] +'" src="' + pSmalUrls[i+n*pMax_num] + '"  class="image3" alt="' + titles[i+n*pMax_num] + '" />');
					$("#thBox li").eq(i).fadeIn(0);
				}
				pageLinkSet(Math.ceil((pageNum+1)/pageNumLinksMax));
			}
			
			////////////////////////////////////////////ページ移動時：ページリンク書き換え
			function pageLinkSet(pageNumLinks){
	
				$("#footer_P").text("pageNumLinks="+pageNumLinks+"　pageL="+pageL);
				///////////////////////////////ページリンク リセット配置
				var pageNum_html = '';
				$("#pageNum").html("");
				if(pageNumLinks!=1){ 
						pageNum_html+='<a href="#p'+((pageNumLinks-1)*5-1)+'">...</a>'
				}
				var pNS=(pageNumLinks-1)*pageNumLinksMax;
				var pNiMax=pageNumLinksMax;
				if(pageL<pageNumLinksMax){pNiMax = pageL}
				
				if(pNS+(pageNumLinksMax-1) > pageL && pageL>pageNumLinksMax){
					pNS = pNS-(pageNumLinksMax+(pNS-(pageL-1)))+1
				};
				for(var pNi=0; pNi<pNiMax; pNi++){
					var pNN=pNS+pNi;
					if(pNN<pageL){
						if(pNi!=0){
							pageNum_html+='.';
						}
						if(pNN==pageNum){
							pageNum_html+='<span class="outColor">&nbsp;'+String(pNN+1)+'&nbsp;</class>'
						}else{
							pageNum_html+='<a href="#p'+String(pNN)+'">&nbsp;'+String(pNN+1)+'&nbsp;</a>'
						}
					}
				}
				if(Math.ceil(pageL/pageNumLinksMax) >pageNumLinks){ 
						pageNum_html+='<a href="#p'+(pageNumLinks*pageNumLinksMax)+'">...</a>'
				}
				$("#pageNum").append(pageNum_html);
				
				///////////////////////////////ページ数リンク リンク設定
				$("#pageNum a").each(function(e){
					$(this).click(function(){
						pageNum = Number($(this).attr('href').slice(2,$(this).attr('href').length));
						/////////矢印変更
						if(pageNum==pageL-1){
							$("#ar_R .ar_out").fadeIn(fadeTime);
						}else{
							$("#ar_R .ar_out").fadeOut(fadeTime);
						}
						if(pageNum==0){
							$("#ar_L .ar_out").fadeIn(fadeTime);
						}else{
							$("#ar_L .ar_out").fadeOut(fadeTime);
						}
						pageMove(pageNum);
						return false;
					});
				});
			}
			
			///////////////////////////////////////////////////////////////////////////ペ−ジリンク表示
			var pageNumLinksMax = 5;
			var pageNumMax = pSmalUrls.length;
			var fadeTime = 300;
			pageLinkSet(1);
			$("#page_link").fadeIn(fadeTime);
			$("#ar_L .ar_out").fadeIn(fadeTime);
		}
	}


//////////////////////////////////////////////////////////////////////////////////////////////////順番に読み込みを実行、最後に関数実行
	$.when(methods.findByUsername(setting.user_name)).then(function(){
	  $.when(methods.getPublicPhotos()).then(function(){
		$.when.apply($, (function(){
		  var photos = setting.photos;
		  var functions = [];
		  var functions2 = [];
		  for(var ii=0; ii<photoLength; ii++) { functions2.push(methods.loadInfo(photos[ii],ii)); }
		  for(var i=0; i<photoLength; i++) { functions.push(methods.loadPhoto(photos[i],i)); }
		  return functions;
		})()).then(function(){
			setBtn();
		  return self;
		});
	  });

	});
  };
  

//////////////////////////////////////////////////////////////////////////////////////////////////実行
	$('#thList').flickr({ user_name: setUserName});
});

