//___________________________________________________________________
function HQVideoModule(params_obj){
// manages insertion of high quality video into placemarkers in the page

	var initialised_bool		= false;

	// flag skins that need larger players and detail size additions
	var overSizeSkins	= {
		'Halo_Skin_1'	: {
			height		:	51,
			width		:	22
		},
		'Halo_Skin_2'	: {
			height		:	51,
			width		:	22
		},
		'Halo_Skin_3'	: {
			height		:	51,
			width		:	22
		}
	}
	
	//---------------------------------------------------------------
	function extractValue(key_str,encoded_str,isInt_bool){
	// extracts the value of a paramter incoded into a video placemarker image
	
		var value_str;
		var find_rgx			= new RegExp(key_str+'-([^_]*)');
		var matches_arr			= encoded_str.match(find_rgx);
		try{
			value_str			= matches_arr[1];
		}catch(e){
			throw new Error('Key: "'+key_str+'" not found in Video URL');
		}
		value					= isInt_bool? parseInt(value_str) : value_str;
		return value;
	};
	//---------------------------------------------------------------
	function initialise(){
	
		if(!initialised_bool){
			MM_CheckFlashVersion('8,0,0,0','Content on this page requires a newer version of Macromedia Flash Player. Do you want to download it now?');
			initialised_bool	= true;
		}
	};
	//---------------------------------------------------------------
	function injectMovie(placemarker_htm,movieURL,height,width){

		var playerURL_str	= params_obj.componentsDir+params_obj.playerName;
		var skinURL_str		= params_obj.componentsDir+params_obj.defaultSkin;
		
		// determine correct player size
		var skinOversizing	= overSizeSkins[params_obj.defaultSkin];
		if(skinOversizing){
			height			+= skinOversizing.height;
			width			+= skinOversizing.width;
		}
		
		// create an overall container for each movie
		var container_htm	= document.createElement('div');
		
		container_htm.style.textAlign = 'center';
		var movieHTML = AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0','width',width,'height',height,'id','FLVPlayer','src',playerURL_str,'flashvars','&MM_ComponentVersion=1&skinName='+skinURL_str+'&streamName='+movieURL+'&autoPlay='+params_obj.autoPlay+'&autoRewind='+params_obj.autoRewind,'quality','high','scale','noscale','name','FLVPlayer','salign','lt','pluginspage','http://www.macromedia.com/go/getflashplayer','movie',playerURL_str ); 
		
		container_htm.innerHTML = movieHTML;
		placemarker_htm.parentNode.replaceChild(container_htm,placemarker_htm);
	};
	//_______________________________________________________________
	this.swapIn = function(URLS_obj,containerOperator_func){
	// scans for images that correspond to video and replaces them with video @ correct parameters
	// container operator can be used to add classnames, ids etc to video container
		
		// copy images to a new array (which isn't affected by document manipulations
		var img_arr					= Array();
		for(var index=0; index<document.images.length; index++){
			img_arr[index]			= document.images[index];
		}
		
		for(var index=0; index<img_arr.length; index++){
			
			// search for images that should be replaced
			var find_rgx			= new RegExp('/([^/]*'+params_obj.escapedPlacemarkerImage+'$)');
			var currImg				= img_arr[index];
			var matches_arr			= currImg.src.match(find_rgx);
			
			// if a matching image is found, extract parameters and build video
			if(matches_arr && matches_arr.length>1){
				var values_str		= matches_arr[1];
				var height			= extractValue('height',values_str,true);
				var width			= extractValue('width',values_str,true);
				var clip			= extractValue('clip',values_str);
				
				// create a container, build movie and insert into document
				var movieURL		= params_obj.videoDir + clip+'.flv';
				injectMovie(currImg,movieURL,height,width);
				
				// if present, execute callback on container
				if(containerOperator_func){
					containerOperator_func(container_htm);
				}
			}
		}	
	}
};	//_______________________________________________________________
//___________________________________________________________________
function MM_CheckFlashVersion(reqVerStr,msg){
  with(navigator){
    var isIE  = (appVersion.indexOf("MSIE") != -1 && userAgent.indexOf("Opera") == -1);
    var isWin = (appVersion.toLowerCase().indexOf("win") != -1);
    if (!isIE || !isWin){  
      var flashVer = -1;
      if (plugins && plugins.length > 0){
        var desc = plugins["Shockwave Flash"] ? plugins["Shockwave Flash"].description : "";
        desc = plugins["Shockwave Flash 2.0"] ? plugins["Shockwave Flash 2.0"].description : desc;
        if (desc == "") flashVer = -1;
        else{
          var descArr = desc.split(" ");
          var tempArrMajor = descArr[2].split(".");
          var verMajor = tempArrMajor[0];
          var tempArrMinor = (descArr[3] != "") ? descArr[3].split("r") : descArr[4].split("r");
          var verMinor = (tempArrMinor[1] > 0) ? tempArrMinor[1] : 0;
          flashVer =  parseFloat(verMajor + "." + verMinor);
        }
      }
      // WebTV has Flash Player 4 or lower -- too low for video
      else if (userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 4.0;

      var verArr = reqVerStr.split(",");
      var reqVer = parseFloat(verArr[0] + "." + verArr[2]);
  
      if (flashVer < reqVer){
        if (confirm(msg))
          window.location = "http://www.macromedia.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash";
      }
    }
  } 
}
//___________________________________________________________________
function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
    return src.replace(/\?/, ext+'?'); 
  else
    return src + ext;
}
//___________________________________________________________________

function AC_Generateobj(objAttrs, params, embedAttrs) 
{ 
  var str = '<object style="margin:auto;" ';
  for (var i in objAttrs)
    str += i + '="' + objAttrs[i] + '" ';
  str += '>';
  for (var i in params)
    str += '<param name="' + i + '" value="' + params[i] + '" /> ';
  str += '<embed ';
  for (var i in embedAttrs)
    str += i + '="' + embedAttrs[i] + '" ';
  str += ' ></embed></object>';

  return str;
}
//___________________________________________________________________

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

//___________________________________________________________________
function AC_SW_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
     , null
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

//___________________________________________________________________
function AC_GetArgs(args, ext, 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] = 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":
        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 "id":
      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;
}
//___________________________________________________________________
