// Public constants
var VSV_EVENT_VIEW3D_STARTED =					"VSV_EVENT_VIEW3D_STARTED";					// 3D view started
var VSV_EVENT_VIEW3D_CLICK_IMAGE =				"VSV_EVENT_VIEW3D_CLICK_IMAGE";				// Click 3D image
var VSV_EVENT_VIEW3D_CLICK_FULL =				"VSV_EVENT_VIEW3D_CLICK_FULL";				// Click 3D full
var VSV_EVENT_VIEW3D_ROTATE =					"VSV_EVENT_VIEW3D_ROTATE";					// 3D view rotate
var VSV_EVENT_VIEW3D_ROTATE_LEFT =				"VSV_EVENT_VIEW3D_ROTATE_LEFT";				// 3D view rotate left
var VSV_EVENT_VIEW3D_ROTATE_RIGHT =				"VSV_EVENT_VIEW3D_ROTATE_RIGHT";			// 3D view rotate right
var VSV_EVENT_VIEW3D_CLICK_AUTO_ROTATE =		"VSV_EVENT_VIEW3D_CLICK_AUTO_ROTATE";		// Click auto rotate
var VSV_EVENT_VIEW3D_ZOOM =						"VSV_EVENT_VIEW3D_ZOOM";					// 3D view zoom
var VSV_EVENT_VIEW2D_CLICK_IMAGE =				"VSV_EVENT_VIEW2D_CLICK_IMAGE";				// Click 2D image
var VSV_EVENT_VIEW2D_CLICK_CLOSE_PREVIEW =		"VSV_EVENT_VIEW2D_CLICK_CLOSE_PREVIEW";		// Click close preview
var VSV_EVENT_VIEW2D_CLICK_SHOW_INFO =			"VSV_EVENT_VIEW2D_CLICK_SHOW_INFO";			// Click show information
var VSV_EVENT_VIEW2D_CLICK_HIDE_INFO =			"VSV_EVENT_VIEW2D_CLICK_HIDE_INFO";			// Click hide information
var VSV_EVENT_VIEW2D_CLICK_EXTERNAL_LINK =		"VSV_EVENT_VIEW2D_CLICK_EXTERNAL_LINK";		// Click external link
var VSV_EVENT_VIEW2D_CLICK_BOOKMARK_ITEM =		"VSV_EVENT_VIEW2D_CLICK_BOOKMARK_ITEM";		// Click bookmark item
var VSV_EVENT_VIEW2D_CLICK_ADD_BOOKMARK_ITEM =	"VSV_EVENT_VIEW2D_CLICK_ADD_BOOKMARK_ITEM";	// Click add bookmark item
var VSV_EVENT_VIEW2D_CLICK_DEL_BOOKMARK_ITEM =	"VSV_EVENT_VIEW2D_CLICK_DEL_BOOKMARK_ITEM";	// Click delete bookmark item
var VSV_EVENT_VIEW2D_ZOOM =						"VSV_EVENT_VIEW2D_ZOOM";					// 2D view zoom
var VSV_EVENT_VIEW2D_SCROLL =					"VSV_EVENT_VIEW2D_SCROLL";					// 2D scroll
var VSV_EVENT_VIEW2D_CLICK_SLIDE_SHOW =			"VSV_EVENT_VIEW2D_CLICK_SLIDE_SHOW";		// Click slide show
var VSV_EVENT_VIEW2D_CLICK_DRIVE_VIEW =			"VSV_EVENT_VIEW2D_CLICK_DRIVE_VIEW";		// Click drive view
// APIs
var VSViewerAPI = {
	baseDir: "",
	viewerAPIName: "vsviewer.js",
	viewerName: "VSViewer2007",
	viewerID: "",
	viewerSrc: "",
	viewerOpt: "",
	acFlInstSrc: "playerProductInstall",
	requiredMajorVersion: 9,
	requiredMinorVersion: 0,
	requiredRevision: 0,
	hasProductInstall: false,
	hasRequestedVersion: false,
	callbackHandler: {},
	ready: false,
	/**
	 * Parse arguments and load additinal resources
	 *
	 * @param	none
	 * @retval	none
	 */
	load: function() {
		var re = new RegExp(VSViewerAPI.viewerAPIName + "[^/]*$");
		var so = document.getElementsByTagName("script");
		var arg;
		var scp;
		var ext = "";
		for (var si = 0; si < so.length; si++) {
			if (so[si].src && so[si].src.match(re)) {
				VSViewerAPI.baseDir = so[si].src.replace(re, "");
				if ((arg = String(so[si].src).match(/\?[a-z,]*/))) {
					VSViewerAPI.viewerOpt = String(arg).replace(/\?/, "");
					ext = "-" + VSViewerAPI.viewerOpt;
				}
				VSViewerAPI.viewerID = VSViewerAPI.viewerName + "_external";
				VSViewerAPI.viewerName = VSViewerAPI.viewerName + ext;
				//VSViewerAPI.viewerSrc = VSViewerAPI.baseDir + VSViewerAPI.viewerName;
				VSViewerAPI.viewerSrc = VSViewerAPI.baseDir + VSViewerAPI.viewerName + "?20080531"; 
				VSViewerAPI.acFlInstSrc = VSViewerAPI.baseDir + VSViewerAPI.acFlInstSrc;
				break;
			}
		}
	},
	/**
	 * Application ready
	 *
	 * @param	none
	 * @retval	none
	 */
	ready: function() {
		VSViewerAPI.ready = true;
	},
	/**
	 * Embed viewer
	 *
	 * @param	config:Object		JSON style configuration values
	 * @param	id:String			Image ID
	 * @retval	none
	 */
	embed: function(config, id) {
		// config:String  URL of configuration xml
		// id    :String  Immage id
		VSViewerAPI.hasProductInstall = DetectFlashVer(6, 0, 65);
		VSViewerAPI.hasRequestedVersion = DetectFlashVer(VSViewerAPI.requiredMajorVersion,
				VSViewerAPI.requiredMinorVersion, VSViewerAPI.requiredRevision);
		if (!config) {
			config = "";
		}
		if (!id) {
			id = "";
		}
		if (VSViewerAPI.hasProductInstall && !VSViewerAPI.hasRequestedVersion) {
			var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn";
			var MMredirectURL = window.location;
			document.title = document.title.slice(0, 47) + " - Flash Player Installation";
			var MMdoctitle = document.title;
			AC_FL_RunContent(
				"src", VSViewerAPI.acFlInstSrc,
				"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
				"width", "100%",
				"height", "100%",
				"align", "middle",
				"id", VSViewerAPI.viewerID,
				"quality", "high",
				"bgcolor", "#808080",
				"name", VSViewerAPI.viewerName,
				"allowScriptAccess","sameDomain",
				"type", "application/x-shockwave-flash",
				"pluginspage", "http://www.adobe.com/go/getflashplayer"
			);
		} else if (VSViewerAPI.hasRequestedVersion) {
			// if we've detected an acceptable version
			// embed the Flash Content SWF when all tests are passed
			AC_FL_RunContent(
				"src", VSViewerAPI.viewerSrc,
				"width", "100%",
				"height", "100%",
				"align", "middle",
				"id", VSViewerAPI.viewerID,
				"quality", "high",
				"bgcolor", "#808080",
				"name", VSViewerAPI.viewerName,
				"flashvars", 'config=' + escape(config)
						+ '&ua=' + navigator.appName
						+ '&id=' + escape(id)
						+ "&url=" + escape(window.location)
						+ "&opt=" + VSViewerAPI.viewerOpt,
				"allowScriptAccess", "always",
				"type", "application/x-shockwave-flash",
				"pluginspage", "http://www.adobe.com/go/getflashplayer"
			);
		} else {	// flash is too old or we can't detect the plugin
			// var alternateContent = 'Alternate HTML content should be placed here. '
/*			var alternateContent = ''
					+ 'VSViewerAPI content requires the Adobe Flash Player. '
					+ '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>';
*/
			var alternateContent = ''
					+ 'Viewサーチ北海道をごらんいただくには Adobe Flash Player が必要です。. '
					+ '<a href=http://www.adobe.com/go/getflash/>ダウンロード</a>';
			document.write('<div style="position:absolute;width:100%;">'
					+ '<center>' + alternateContent + '</center></div>');	// insert non-flash content
			AC_FL_RunContent(
				"src", VSViewerAPI.viewerSrc,
				"width", "100%",
				"height", "100%",
				"align", "middle",
				"id", VSViewerAPI.viewerID,
				"quality", "high",
				"bgcolor", "#808080",
				"name", VSViewerAPI.viewerName,
				"flashvars", 'config=' + escape(config)
						+ '&ua=' + navigator.appName
						+ '&id=' + escape(id)
						+ "&url=" + escape(window.location)
						+ "&opt=" + VSViewerAPI.viewerOpt,
				"allowScriptAccess", "always",
				"type", "application/x-shockwave-flash",
				"codebase", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0",
				"pluginspage", "http://www.adobe.com/go/getflashplayer"
			); //end AC code
		}
	},
	/**
	 * Register callback handler
	 *
	 * @param	type:String			Event type string
	 * @param	func:Function		Callback function
	 * @retval	none
	 */
	registerHandler: function(type, func) {
		if (type == null) {
			VSViewerAPI.callbackHandler = null;
		} else {
			if (!VSViewerAPI.callbackHandler) {
				VSViewerAPI.callbackHandler = new Object();
			}
			VSViewerAPI.callbackHandler[type] = func;
		}
	},
	view3D: {
		/**
		 * Enter 3D view and select image
		 *
		 * @param	id:String			Image ID
		 * @retval	swf specific value(success) or false(fail)
		 */
		enter: function(id) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.enterView3D(id) : false;
		},
		/**
		 * Select image
		 *
		 * @param	id:String			Image ID
		 * @retval	none
		 */
		selectImage: function(id) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view3DSelectImage(id) : false;
		},
		/**
		 * Select cluster
		 *
		 * @param	id:String			Cluster ID
		 * @retval	none
		 */
		selectCluster: function(id) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view3DSelectCluster(id) : false;
		}
	},
	view2D: {
		/**
		 * Enter 2D view and select and center image
		 *
		 * @param	id:String			Image ID
		 * @retval	none
		 */
		enter: function(id) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.enterView2D(id) : false;
		},
		/**
		 * Select image
		 *
		 * @param	id:String			Image ID
		 * @param	center:Boolean		Center image(true) or not(false)
		 * @param	preview:Boolean		Preview image(true) or not(false)
		 * @param	alpha:Number		Background alpha(0.0-1.0)
		 * @retval	none
		 */
		selectImage: function(id, center, preview, alpha) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view2DSelectImage(id, center, preview, alpha) : false;
		},
		/**
		 * Scroll image to center
		 *
		 * @param	id:String			Image ID
		 * @param	select:Boolean		Select image(true) or not(false)
		 * @param	preview:Boolean		Preview image(true) or not(false)
		 * @param	alpha:Number		Background alpha(0.0-1.0)
		 * @retval	none
		 */
		centerImage: function(id, select, preview, alpha) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view2DCenterImage(id, select, preview, alpha) : false;
		},
		/**
		 * Show image preview
		 *
		 * @param	id:String			Image ID
		 * @param	alpha:Number		Background alpha(0.0-1.0)
		 * @retval	none
		 */
		showPreview: function(id, alpha) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view2DShowPreview(id, alpha) : false;
		},
		/**
		 * Hide image preview
		 *
		 * @param	none
		 * @retval	none
		 */
		hidePreview: function() {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view2DHidePreview() : false;
		},
		/**
		 * Set bookmark items
		 *
		 * @param	ids:Array			Array of bookmark items ID
		 * @retval	none
		 */
		setBookmarkItems: function(ids) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view2DSetBookmarkItems(ids) : false;
		},
		/**
		 * Add bookmark item
		 *
		 * @param	id:String			Image ID
		 * @retval	none
		 */
		addBookmarkItem: function(id) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view2DAddBookmarkItem(id) : false;
		},
		/**
		 * Delete bookmark item
		 *
		 * @param	id:String			Image ID
		 * @retval	none
		 */
		delBookmarkItem: function(id) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view2DDelBookmarkItem(id) : false;
		},
		/**
		 * Notify information status
		 *
		 * @param	status:Boolean		information is shown(true), or not(false)
		 * @retval	none
		 */
		notifyInfoStatus: function(status) {
			var swf = document.getElementById(VSViewerAPI.viewerID);
			return (swf) ? swf.view2DNotifyInfoStatus(status) : false;
		}
	},
	/**
	 * Auto resize control
	 *
	 * @param   appl:Boolean        Application area auto resize on(true), or off(false)
	 * @param   view3D:Boolean      3D view area auto resize on(true), or off(false)
	 * @param	view2D:Boolean		2D view area, auto resize on(true), or off(false)
	 * @param	prev2D:Boolean		Preview area, auto resize on(true), or off(false)
	 * @param	bmhist2D:Boolean	Bookmark area, auto resize on(true), or off(false)
	 * @retval	none
	 */
	autoResize: function(appl, view3D, view2D, prev2D, bmhist2D) {
		var swf = document.getElementById(VSViewerAPI.viewerID);
		return (swf) ? swf.autoResize(appl, view3D, view2D, prev2D, bmhist2D) : false;
	},
	/**
	 * Auto update control
	 *
	 * @param   app:Boolean         Application area auto resize on(true), of off(false);
	 * @param   view3D:Boolean      3D view area auto update on(true), or off(false)
	 * @param	view2D:Boolean		2D view area, auto update on(true), or off(false)
	 * @param	prev2D:Boolean		Preview area, auto update on(true), or off(false)
	 * @param	bmhist2D:Boolean	Bookmark area, auto update on(true), or off(false)
	 * @retval	none
	 */
	autoUpdate: function(appl, view3D, view2D, prev2D, bmhist2D) {
		var swf = document.getElementById(VSViewerAPI.viewerID);
		return (swf) ? swf.autoUpdate(appl, view3D, view2D, prev2D, bmhist2D) : false;
	},
	/**
	 * Viewer callback
	 *
	 * @param	type:String			Event type string
	 * @param	value:Object		Event specific values
	 * @retval	callback function's return value
	 */
	viewerHandler: function(type, value) {
		if (VSViewerAPI.callbackHandler[type]) {
			value.type = type;
			return VSViewerAPI.callbackHandler[type](value);
		}
	}
};
VSViewerAPI.load();
