/**
 * NHN Flash UI common - Flash Contents
 * v1.0 lastUpdate : 2007. 6. 14 (modified by hooriza - 200080716)
 * @fileOverview
 * @author hooriza
 */
if (typeof nhn == 'undefined') nhn = {};

/**
 * 플래시 객체를 컨트롤하기 위한 컴포넌트
 * @namespace
 */ 
nhn.Flash = (function(){
	/** @lends nhn.Flash */
	var Flash = {};

	var bIE = /MSIE/i.test(navigator.userAgent);
	var bFF = /FireFox/i.test(navigator.userAgent);
	var bChrome = /Chrome/i.test(navigator.userAgent);
	
	var sClassPrefix = 'NHN_FLASH_OBJECT';
	
	var bind = function(oElement, sEvent, fpHandler) {
		
		if (typeof oElement.attachEvent != 'undefined')
			oElement.attachEvent('on' + sEvent, fpHandler);
		else
			oElement.addEventListener(sEvent, fpHandler, true);
		
	};

	// for 'Out of memory line at 56' error _add 2007. 6. 12
	var unloadHandler = function() {
		
		obj = document.getElementsByTagName('OBJECT');

		for (var i = 0, theObj; theObj = obj[i]; i++) {

			theObj.style.display = 'none';

			for (var prop in theObj)
				if (typeof(theObj[prop]) == 'function')
					try { theObj[prop] = null; } catch(e) {}

		}
		
	};
	
	var wheelHandler = function(oEvent) {
		
		oEvent = oEvent || window.event;
		
		var nDelta = oEvent.wheelDelta / (bChrome ? 360 : 120);
		if (!nDelta) nDelta = -oEvent.detail / 3;
		
		var oEl = oEvent.target || oEvent.srcElement;
		if (!(new RegExp('(^|\b)' + sClassPrefix + '_([a-z0-9_$]+)(\b|$)', 'i').test(oEl.className))) return;
		
		var sMethod = RegExp.$2;

		var nX = 'layerX' in oEvent ? oEvent.layerX : oEvent.offsetX;
		var nY = 'layerY' in oEvent ? oEvent.layerY : oEvent.offsetY;

		try {
			
			if (!oEl[sMethod](nDelta, nX, nY)) {

				if (oEvent.preventDefault) oEvent.preventDefault();
				else oEvent.returnValue = false;

			}
			
		} catch(e) { }
		
	};
	
	/**
	 * Flash Object를 HTML에 삽입하기 위한 마크업 코드를 생성한다.
	 * @memberOf nhn.Flash
	 * @param {String} sURL
	 * @param {String} sID
	 * @param {Number} nWidth
	 * @param {Number} nHeight
	 * @param {String} sWmode
	 * @param {String} sFlashVars
	 * @param {String} sBgColor
	 * @return {HTMLElement} 플래시 객체를 삽입하기 위한 마크업 코드
	 */
	 var getCode = function(sURL, sID, nWidth, nHeight, sWmode, sFlashVars, sBgColor) {
		
		var oOptions = {
			id : '',
			width : '100%',
			height : '100%',
			wmode : 'transparent',
			flashVars : '',
			bgColor : '#FFFFFF',
			wheelHandler : 'flashWheelListener'
		};
		
		if (typeof sID == 'object') {
			
			for (var k in sID)
				oOptions[k] = sID[k];
				
		} else {
			
			oOptions.id = sID;
			oOptions.width = nWidth;
			oOptions.height = nHeight;
			oOptions.wmode = sWmode;
			oOptions.flashVars = sFlashVars;
			oOptions.bgColor = sBgColor;
			
		}

		var sClsID = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000';
		var sCodeBase = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0';

		var sCode = '';
		var sStyle = 'position:relative !important;';
		var sClassName = sClassPrefix + '_' + oOptions.wheelHandler;

		if (bIE) {

			sCode =
				'<object classid="' + sClsID + '" codebase="' + sCodeBase + '" class="' + sClassName + '" style="' + sStyle + '" ' +
				' width="' + oOptions.width + '" height="' + oOptions.height + '" id="' + oOptions.id + '" align="middle">' +
					'<param name="allowScriptAccess" value="always" />' +
					'<param name="quality" value="high" />' +
					'<param name="movie" value="' + sURL + '" />' +
					'<param name="wmode" value="' + oOptions.wmode + '" />' +
					'<param name="bgcolor" value="' + oOptions.bgColor + '" />' +
					'<param name="FlashVars" value="' + oOptions.flashVars + '">' +
				'</object>';

		} else {

			sCode =
				'<embed src="' + sURL + '" quality="high" class="' + sClassName + '" style="' + sStyle + '" wmode="' + oOptions.wmode + '" FlashVars="' + oOptions.flashVars + '" bgcolor="' + oOptions.bgColor + '"' +
				' width="' + oOptions.width + '" height="' + oOptions.height + '" name="' + oOptions.id + '" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />'; 

		}

		if (bind) {
			bind(window, 'unload', unloadHandler);
			bind(document, !bFF ? 'mousewheel' : 'DOMMouseScroll', wheelHandler);
			bind = null;
		}

		return sCode;

	};
	
	/**
	 * DOM에 로드된 Flash 객체를 구한다
	 * @memberOf nhn.Flash
	 * @param {String} sID 플래시 객체의 id
	 * @param {Document} oDoc 플래시 객체를 찾을 document (생락가능)
	 */
	var find = function(sID, oDoc) {
		oDoc = oDoc || document;
		return oDoc[sID] || oDoc.all[sID];
	};
	
	/**
	 * 브라우저에 설치된 플래시의 버전정보를 구한다.
	 * @memberOf nhn.Flash
	 * @return {Number} 버전
	 */
	var version = function() {
		
		if (typeof arguments.callee._cache != 'undefined') return arguments.callee._cache;
		
		var addons = navigator.plugins;
		var mimes = navigator.mimeTypes;
		var version = -1;
		
		var addon, mime;
		
		if (addon = addons['Shockwave Flash']) {
			
			var v = addon.description;
			if (typeof v == 'string' && /\b([0-9]+(\.[0-9]+)*)/.test(v)) version = parseFloat(RegExp.$1);
			
		} else if (addon = addons['Shockwave Flash 2.0']) {
			
			version = 2;
			
		} else if (mime = mimes['application/x-shockwave-flash']) {
			
			version = 0;
			
			try {
				var v = mime.enabledPlugin.description;
				if (typeof v == 'string' && /\b([0-9]+(\.[0-9]+)*)/.test(v)) version = parseFloat(RegExp.$1);
			} catch(e) {}
				
		} else {
			
			for (var i = 15; i > 1; i--) {
	
				try {
					new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i);
					version = i;
					break;
				} catch(e) {}
					
			}
			
		}
	
		arguments.callee._cache = version;
		return arguments.callee._cache;
		
	};

	Flash.getCode = getCode;
	Flash.find = find;
	Flash.version = version;
	
	return Flash;

})();
