(function($){

	var defaults = {
			zoom: 0,
			ui_disabled: false,
			urlList: null,
			src: ""
			};
	var settings = {};
	var img_object = {};
	var container;
	var current_zoom = 1;
	var dx;
	var dy;
	var dragged = false;
	var zoomButton;
	var zoomIn;
	var zoomOut;
	var zoomCommon;

	$.fn.iviewer  = function(options)
	{

		settings = $.extend(defaults, options);

		if(settings.urlList == null) return;

		settings.src = settings.urlList[0];

		if(!settings.src) return;

		current_zoom = settings.zoom;
		container = this;
		update_container_info();
		container.css("overflow","hidden"); //init container

		$(window).resize(function(){ update_container_info();});

		//初期処理(mainItem内、mainThumbnail内を消去)
		if($("#mainItem *").length > 0){
			$("#mainItem *").remove();
		}
		if($(".mainThumbnail *").length > 0){
			$(".mainThumbnail a").remove();
			$(".mainThumbnail li").remove();
		}
		//イメージ表示
		container.addClass("iviewer_cursor");
		container.append("<img id='test' src=\""+settings.src+"\"/>");
		img_object.object = $(this).children("img")
								.css("position","absolute")
						    	.css("top","0px")
								.css("left","0px")
								.mousedown(drag_start)
								.mousemove(drag)
								.mouseup(drag_end)
								.mouseleave(drag_end);

		//サムネイル表示
		for(var i=0; i<settings.urlList.length; i++){
			if(settings.urlList[i] != null && settings.urlList[i] != ""){
				var src = settings.urlList[i].replace("/L/", "/5/");
				src = src.replace("A450.jpg", "A80.jpg");
				$(".mainThumbnail")
					.append("<li><a href=\""+settings.urlList[i]+"\"><img height=\"40\" width=\"40\" id=\"subImage1\" id=\"subImage"+(i+1)+"\" src=\""+src+"\" style=\"visibility: visible;\" /></a></li>");
			}
		}

		img_object.display_width = img_object.orig_width = 800;
		img_object.display_height = img_object.orig_height = 800;
		if( (img_object.display_width > settings.width) || (img_object.display_height > settings.height) ){
			fit();
		}else{
			moveTo(img_object.display_width/2, img_object.display_height/2);
		}

		//拡大縮小ボタン
		if(!settings.ui_disabled){
			$("<div>").addClass("iviewer_zoom_in")
					.addClass("iviewer_common")
					.addClass("iviewer_button")
					.appendTo(container);

			$("<div>").addClass("iviewer_zoom_out")
					.addClass("iviewer_common")
					.addClass("iviewer_button")
					.appendTo(container);
		}

		zoomButton = $('div.iviewer_button');
		zoomIn = $('div.iviewer_zoom_in');
		zoomOut = $('div.iviewer_zoom_out');
		zoomCommon = $(".iviewer_common").css("top",$(".mainThumbnail").height());

		$(zoomButton).hide();
		$(zoomIn).show();

		//イベント
		$(".mainThumbnail li a").click(function(){
			var changeSrc = $(this).attr("href");
			$("#mainItem img").attr("src", changeSrc);
			if(current_zoom > 0){
				$(zoomIn).show();
				$(zoomOut).hide();
				set_zoom(-1);
			}else if(current_zoom < 0){
				$(zoomIn).hide();
				$(zoomOut).show();
				set_zoom(1);
			}
			return false;
		});
		$(zoomIn).mousedown(function() {
			$(zoomOut).show();
			$(zoomIn).hide();
			set_zoom(1);
		});
		$(zoomOut).mousedown(function() {
			$(zoomIn).show();
			$(zoomOut).hide();
			set_zoom(-1);
		});
	};

	/**
	 * update container indfo
	 */
	function update_container_info() {
		settings.width = container.width();
		settings.height = container.height();
	}

	/**
	 * fit image in the container
	 */
	function fit() {
		var aspect_ratio = img_object.orig_width / img_object.orig_height;
		var window_ratio = settings.width / settings.height;
		var choose_left = (aspect_ratio > window_ratio);
		if (choose_left) {
			img_object.display_width = settings.width;
			img_object.display_height = settings.width / aspect_ratio;
		} else {
			img_object.display_width = settings.height * aspect_ratio;
			img_object.display_height = settings.height;
		}
		img_object.object.attr("width", img_object.display_width)
						.attr("height", img_object.display_height);
		center();
	}

	/**
	 * move a point in container to the center of display area
	 *
	 * @param x a point in container
	 * @param y a point in container
	 */
	function moveTo(x, y) {
		var dx = x - Math.round(settings.width / 2);
		var dy = y - Math.round(settings.height / 2);
		var new_x = parseInt(img_object.object.css("left")) - dx;
		var new_y = parseInt(img_object.object.css("top")) - dy;
		setCoords(new_x, new_y);
	}

	/**
	 * center image in container
	 */
	function center() {
		img_object.object.css("top",-Math.round((img_object.display_height - settings.height) / 2))
						.css("left",-Math.round((img_object.display_width - settings.width) / 2));
	}

	/**
	 * callback for handling mousdown event to start dragging image
	 */
	function drag_start(e) {
		dragged = true;
		container.addClass("iviewer_drag_cursor");
		dx = e.pageX - parseInt($(this).css("left"));
		dy = e.pageY - parseInt($(this).css("top"));
		return false;
	}

	/**
	 * callback for handling mousmove event to drag image
	 */
	function drag(e) {
		if (dragged) {
			var ltop = e.pageY - dy;
			var lleft = e.pageX - dx;
			setCoords(lleft, ltop);
			return false;
		}
	}

	/**
	 * callback for handling stop drag
	 */
	function drag_end(e) {
		container.removeClass("iviewer_drag_cursor");
		dragged = false;
	}

	/**
	 * set image scale to the new_zoom
	 */
	function set_zoom(new_zoom) {
        var new_x;
        var new_y;
        var new_width;
        var new_height;

        var old_x = -parseInt(img_object.object.css("left")) + Math.round(settings.width/2);
        var old_y = -parseInt(img_object.object.css("top")) + Math.round(settings.height/2);


        if(new_zoom < 0) {
			new_x = old_x / (Math.abs(new_zoom) + 1);
			new_y = old_y / (Math.abs(new_zoom) + 1);
			new_img_src = img_object.object.attr("src").replace("800.", "450.");
			new_width = 450;
			new_height = 450;
			current_zoom = 0;
		} else if (new_zoom > 0) {
			new_x = old_x * (Math.abs(new_zoom) + 1);
			new_y = old_y * (Math.abs(new_zoom) + 1);
			new_img_src = img_object.object.attr("src").replace("450.", "800.");
			new_width = 800;
			new_height = 800;
			current_zoom = new_zoom;
		} else {
			new_x = old_x;
			new_y = old_y;
			new_width = img_object.display_width;
			new_height = img_object.display_width;
		}

		img_object.object.attr("width", new_width)
						.attr("height", new_height)
						.attr("src",new_img_src);


		img_object.display_width = new_width;
		img_object.display_height = new_height;

		setCoords(new_x, new_y);
	}

	/**
	 * set coordinates of upper left corner of image object
	 */
	function setCoords(x, y) {
		if (y > 0) y = 0;
		if (x > 0) x = 0;
		if (y + img_object.display_height < settings.height) y = settings.height - img_object.display_height;
		if (x + img_object.display_width < settings.width) x = settings.width - img_object.display_width;
		if (img_object.display_width <= settings.width) x = -(img_object.display_width - settings.width) / 2;
		if (img_object.display_height <= settings.height) y = -(img_object.display_height - settings.height) / 2;
		img_object.object.css("top", y + "px").css("left", x + "px");
	}
})(jQuery);