var maps3dArr = new Array();


//Kuulab flashilt saadud äralaadimise käsu ning annab vastavale Map3D objektile edasi
function flashLoadedCallback(obId){
	for(MapOb in maps3dArr){
		if(obId == maps3dArr[MapOb].id){
			maps3dArr[MapOb].obj.flashLoaded();
		}
	}
}

//USED ADOBE FLASH DETECTION http://www.adobe.com/products/flashplayer/download/detection_kit/
function Map3D(w, h, id) {
	this.w = w ? w : 400;
	this.h = h ? h : 400;
	this.id = id ? id : "map" + new Date().getTime() + "" + maps3dArr.length;

	this.requiredMajorVersion = 8;
	this.requiredMinorVersion = 0;
	this.requiredRevision = 0;

	this.flashUrl = "map3d/Map3D.swf";

	this.flashHasLoaded = false;
	this.flashHasBeenDrawn = false;

	this.isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
	this.isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
	this.isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;

	maps3dArr.push({id:this.id, obj:this});
	
	this.draw = function(){
		if (this.checkVersion()) {
			var flashWrite = this.getFlashWrite();
			document.write(flashWrite);
			this.flashHasBeenDrawn = true;
		} else {
			var alternateContent = "<a href='http://www.adobe.com/go/getflash/' target='_blank' title='Need to install Flash Player'><img src='http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif' border='0'></a>";
			document.write(alternateContent);
		}
	}

	this.getFlashWrite = function(){
		var flashWrite = this.getFlashWriteStr(
					"src", this.flashUrl,
					"width", this.w,
					"height", this.h,
					"align", "middle",
					"id", this.id,
					"quality", "high",
					"bgcolor", "#FFFFFF",
					"name", this.id,
					"FlashVars", "obId=" + this.id,
					"allowScriptAccess","sameDomain",
					"type", "application/x-shockwave-flash",
					'codebase', 'http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab',
					"pluginspage", "http://www.adobe.com/go/getflashplayer"
		);
		return flashWrite;
	}


	this.thisMovie = function(movieName) {
		if (navigator.appName.indexOf("Microsoft") != -1) {
			return window[movieName]
		}
		else {
			return document[movieName]
		}
	}

	this.ControlVersion = function() {
		var version;
		var axo;
		var e;

		// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry

		try {
			// version will be set for 7.X or greater players
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
			version = axo.GetVariable("$version");
		} catch (e) {
		}

		if (!version){
			try {
				// version will be set for 6.X players only
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
				
				// installed player is some revision of 6.0
				// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
				// so we have to be careful. 
				
				// default to the first public version
				version = "WIN 6,0,21,0";

				// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
				axo.AllowScriptAccess = "always";

				// safe to call for 6.0r47 or greater
				version = axo.GetVariable("$version");

			} catch (e) {
			}
		}

		if (!version){
			try {
				// version will be set for 4.X or 5.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				version = axo.GetVariable("$version");
			} catch (e) {
			}
		}

		if (!version){
			try {
				// version will be set for 3.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				version = "WIN 3,0,18,0";
			} catch (e) {
			}
		}

		if (!version){
			try {
				// version will be set for 2.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
				version = "WIN 2,0,0,11";
			} catch (e) {
				version = -1;
			}
		}
		
		return version;
	}

	// JavaScript helper required to detect Flash Player PlugIn version information
	this.GetSwfVer = function (){
		// NS/Opera version >= 3 check for Flash plugin in plugin array
		var flashVer = -1;
		
		if (navigator.plugins != null && navigator.plugins.length > 0) {
			if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
				var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
				var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;			
				var descArray = flashDescription.split(" ");
				var tempArrayMajor = descArray[2].split(".");
				var versionMajor = tempArrayMajor[0];
				var versionMinor = tempArrayMajor[1];
				if ( descArray[3] != "" ) {
					tempArrayMinor = descArray[3].split("r");
				} else {
					tempArrayMinor = descArray[4].split("r");
				}
				var versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
				var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
			}
		}
		// MSN/WebTV 2.6 supports Flash 4
		else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
		// WebTV 2.5 supports Flash 3
		else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
		// older WebTV supports Flash 2
		else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
		else if ( this.isIE && this.isWin && !this.isOpera ) {
			flashVer = this.ControlVersion();
		}	
		return flashVer;
	}

	this.checkVersion = function (){
		var versionStr = this.GetSwfVer();
		if (versionStr == -1 ) {
			return false;
		} else if (versionStr != 0) {
			if(this.isIE && this.isWin && !this.isOpera) {
				// Given "WIN 2,0,0,11"
				var tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
				var tempString        = tempArray[1];			// "2,0,0,11"
				var versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
			} else {
				var versionArray      = versionStr.split(".");
			}
			var versionMajor      = versionArray[0];
			var versionMinor      = versionArray[1];
			var versionRevision   = versionArray[2];

				// is the major.revision >= requested major.revision AND the minor version >= requested minor
			if (versionMajor > parseFloat(this.requiredMajorVersion)) {
				return true;
			} else if (versionMajor == parseFloat(this.requiredMajorVersion)) {
				if (versionMinor > parseFloat(this.requiredMinorVersion))
					return true;
				else if (versionMinor == parseFloat(this.requiredMinorVersion)) {
					if (versionRevision >= parseFloat(this.requiredRevision))
						return true;
				}
			}
			return false;
		}
	}

	/*
	this.AC_AddExtension = function(src, ext){
	  if (src.indexOf('?') != -1)
		return src.replace(/\?/, ext+'?'); 
	  else
		return src + ext;
	}
	*/

	this.AC_Generateobj = function(objAttrs, params, embedAttrs) { 
		var str = '';
		if (this.isIE && this.isWin && !this.isOpera)
		{
			str += '<object ';
			for (var i in objAttrs)
				str += i + '="' + objAttrs[i] + '" ';
			str += ">";
			for (var i in params)
				str += '<param name="' + i + '" value="' + params[i] + '" /> ';
			str += '</object>';
		} else {
			str += '<embed ';
			for (var i in embedAttrs)
				str += i + '="' + embedAttrs[i] + '" ';
			str += '> </embed>';
		}
		return str;
	}

	this.getFlashWriteStr = function (){
	  var ret = 
		this.AC_GetArgs
		(  arguments, "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
		 , "application/x-shockwave-flash"
		);
	  return this.AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
	}

	this.AC_GetArgs = function (args, srcParamName, classid, mimeType){
	  var ret = new Object();
	  ret.embedAttrs = new Object();
	  ret.params = new Object();
	  ret.objAttrs = new Object();
	  for (var i=0; i < args.length; i=i+2){
		var currArg = args[i].toLowerCase();    

		switch (currArg){	
		  case "classid":
			break;
		  case "pluginspage":
			ret.embedAttrs[args[i]] = args[i+1];
			break;
		  case "src":
		  case "movie":	
			//args[i+1] = this.AC_AddExtension(args[i+1], ext);
			ret.embedAttrs["src"] = args[i+1];
			ret.params[srcParamName] = args[i+1];
			break;
		  case "onafterupdate":
		  case "onbeforeupdate":
		  case "onblur":
		  case "oncellchange":
		  case "onclick":
		  case "ondblClick":
		  case "ondrag":
		  case "ondragend":
		  case "ondragenter":
		  case "ondragleave":
		  case "ondragover":
		  case "ondrop":
		  case "onfinish":
		  case "onfocus":
		  case "onhelp":
		  case "onmousedown":
		  case "onmouseup":
		  case "onmouseover":
		  case "onmousemove":
		  case "onmouseout":
		  case "onkeypress":
		  case "onkeydown":
		  case "onkeyup":
		  case "onload":
		  case "onlosecapture":
		  case "onpropertychange":
		  case "onreadystatechange":
		  case "onrowsdelete":
		  case "onrowenter":
		  case "onrowexit":
		  case "onrowsinserted":
		  case "onstart":
		  case "onscroll":
		  case "onbeforeeditfocus":
		  case "onactivate":
		  case "onbeforedeactivate":
		  case "ondeactivate":
		  case "type":
		  case "codebase":
		  case "id":
			ret.objAttrs[args[i]] = args[i+1];
			break;
		  case "width":
		  case "height":
		  case "align":
		  case "vspace": 
		  case "hspace":
		  case "class":
		  case "title":
		  case "accesskey":
		  case "name":
		  case "tabindex":
			ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
			break;
		  default:
			ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
		}
	  }
	  ret.objAttrs["classid"] = classid;
	  if (mimeType) ret.embedAttrs["type"] = mimeType;
	  return ret;
	}




	//=============== API COMMANDS ==============

	//=============== FROM FLASH ================
	this.flashLoaded = function(){
		this.flashHasLoaded = true;
		if(this.firstMapObject){this.setMap2(this.firstMapObject)};
		if(this.firstDataXmlUrl){this.setData(this.firstDataXmlUrl)};
	}

	//=============== TO FLASH ==================
	this.setMap = function(e1, n1, e2, n2, url) {
		var mapObject = {e1:e1, n1:n1, e2:e2, n2:n2, url:url};
		if(this.flashHasLoaded){
			this.thisMovie(this.id).setMap(mapObject);
		} else {
			this.firstMapObject = mapObject;
		}
	}

	this.setMap2 = function(mapObject) {
		if(this.flashHasLoaded){
			this.thisMovie(this.id).setMap(mapObject);
		} else {
			this.firstMapObject = mapObject;
		}
	}

	this.setData = function(dataXmlUrl) {
		if(this.flashHasLoaded){
			this.thisMovie(this.id).setData(dataXmlUrl);
		} else {
			this.firstDataXmlUrl = dataXmlUrl;
		}
	}

	this.change3DView = function(to3d){
		if(this.flashHasLoaded){
			this.thisMovie(this.id).change3DView(to3d);
		}
	}

	this.clearData = function(){
		if(this.flashHasLoaded){
			this.thisMovie(this.id).clearData();
		}
	}

	this.play = function(){
		if(this.flashHasLoaded){
			this.thisMovie(this.id).play();
		}
	}

	this.pause = function(){
		if(this.flashHasLoaded){
			this.thisMovie(this.id).pause();
		}
	}

	this.playPause = function(){
		if(this.flashHasLoaded){
			this.thisMovie(this.id).playPause();
		}
	}

	this.nextFrame = function(){
		if(this.flashHasLoaded){
			this.thisMovie(this.id).nextFrame();
		}
	}

	this.prevFrame = function(){
		if(this.flashHasLoaded){
			this.thisMovie(this.id).prevFrame();
		}
	}
}
