/**
 * @class imageViewer 图片预览控制类
 * @require ae.js
 */
AE.namespace("AE.widget.imageViewer");
AE.widget.imageViewer = function(){
	var _self            = this,
			// 图片引用HTMLElement
			imageEl          = null,
			// 图片原始宽度
			imgOrignalWidth  = 0,
			// 图片原始高度
			imgOrignalHeight = 0,
			// 原始图片高宽比
			rate;
			// 图片最小宽度
			imgMinWidth  = 100,
			// 图片最小高度
			imgMinHeight = 100,
			// 控制按钮配置数组
			btnConfigSet     = [],
			// 单一控制按钮默认配置
			defBtnConfig     = {
				// 控制按钮ID
				ctrlButtonId : '',
				// 触发事件类型
				eventType    : 'click',
				// 执行的动作名称,对应actions对象成员方法名
				actionName   : ''
			};
	
	/**
	 * @method init
	 * @param userBtnConfig 控制按钮配置数组
	 * @param {String} imgId 预览图片ID
	 * @param {String} containerId 图片显示DOM ID,可选
	 * @return void
	 */
	_self.init = function(userBtnConfig,imgId,containerId, minWidth){
		imageEl     = get(imgId);

		var imgObj = new Image();
		imgObj.onload = function(){
			imgOrignalWidth  = imgObj.width;
			imgOrignalHeight = imgObj.height;

			rate = (imgOrignalHeight > 0) ? imgOrignalWidth / imgOrignalHeight : 1;
			imgMinWidth = (minWidth > 0) ? minWidth : imgMinWidth;
			loadBtnConfig(userBtnConfig);
			bindAction(btnConfigSet);
	
			var containerEl = get(containerId);
			if(YL.isObject(containerEl)){
			resetContainerWH(containerEl);
			YUE.on(window,'resize',function(){resetContainerWH(containerEl)});
			}
		}
		imgObj.src = imageEl.src;
	};

	/**
	 * @public method execAction 执行actions内指定函数
	 * @param {String} fn 欲执行的动作名称 与actions成员变量名对应
	 * @return void
	 */
	_self.execAction = function(fn){
		var args = [];
		if(!YL.isFunction(actions[fn])){return;}
		for(var i = 1; i < arguments.length; i++){
			args.push(arguments[i])
		}
		actions[fn].apply(actions,args);
	}
	
	var actions = {
		reloadPage : function(){
			window.location.reload();
		},
		zoom : function(imgEl,zoomRate){
		  //alert(imgEl.width);
			if(imgEl.width > 0 && imgEl.height > 0){
				if (imgEl.width * (1 + zoomRate) >= imgMinWidth) {
					imgEl.width  = imgEl.width * (1 + zoomRate);
					//imgEl.height  = imgEl.height * (1 + zoomRate);
					imgEl.height = imgEl.width / rate;
				}
			}
		},
		zoomIn : function(zoomRate){
			if(!YL.isNumber(zoomRate)){zoomRate = 0.2;}
			actions.zoom(imageEl,zoomRate);
		},
		zoomOut : function(zoomRate){
			if(!YL.isNumber(zoomRate)){zoomRate = 0.2;}
			actions.zoom(imageEl,-zoomRate);
		},
		resetImg : function(){
			imageEl.width  = imgOrignalWidth;
			imageEl.height = imgOrignalHeight;
			YUD.setStyle(imageEl,'zoom','100%');
		}
	};

	/**
	 * @method loadBtnConfig 加载用户配置
	 * @param {Array} 控制按钮配置数组
	 * @return void
	 */
	var loadBtnConfig = function(userBtnConfig){
		for(var i = 0, j = userBtnConfig.length, singleBtnConfig; i < j; i++){
			singleBtnConfig = userBtnConfig[i];
			if(YL.isObject(singleBtnConfig)){
					btnConfigSet.push(YL.merge(defBtnConfig,singleBtnConfig));
			}
		}
	};

	/**
	 * @method bindAction 为控制按钮绑定事件监听器
	 * @param {Array} btnConfigs 控制按钮配置数组
	 * @return void
	 */
	var bindAction = function(btnConfigs){
		var btnConfig,btnId,btnEl,btnAction;
		for(var i = 0, j = btnConfigs.length; i < j; i++){
			btnConfig = btnConfigs[i];
			btnId     = btnConfig.ctrlButtonId;
			btnEl     = get(btnId);
			btnAction = actions[btnConfig.actionName]
			if(YL.isObject(btnEl) && YL.isFunction(btnAction)){
				YUE.on(btnEl,btnConfig.eventType,btnAction);
			}
		}
	};
	
	/**
	 * @metnod resetContainerWH 重设图片显示DOM大小,以屏蔽滚动条
	 * @param {HTMLElement} container 图片容器DOM
	 * @return void
	 */
	var resetContainerWH = function(container){
		if(!YL.isObject(container)){return;}
		var clientW     = YUD.getClientWidth(),
			clientH     = YUD.getClientHeight(),
			containerXY = YUD.getXY(container),
			newHeight   = clientH - containerXY[1];
		YUD.setStyle(container,'width',clientW + 'px');
		YUD.setStyle(container,'height',newHeight + 'px');
		if(container.parentNode.id == 'fllowResize'){
			YUD.setStyle(container.parentNode,'overflow','hidden');
			YUD.setStyle(container.parentNode,'height',newHeight + 'px');
		}
	};
}