
// Globals

// Form element id to update with our guid
var form_guid_input_id = "unique_guid";
var client_swf_path_prefix = "/lp/common/js/";

// Major version of Flash required
var requiredMajorVersion = 9;
// Minor version of Flash required
var requiredMinorVersion = 0;
// Minor version of Flash required
var requiredRevision = 124;
// GUID KEY
var guidKey = "GFCMGUID";
// Timeout Fallback Timer
var fallbackTimer = 5000;
// SO Ready Flag
var so_ready = false;
// GUID Mask for reference and var scope.
var guid = "0000-0000-00000000-0000-000000000000";

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


var so_timeout_timer;

embed_guid_flash();

// Init here
window.onload=function() { 
	// Do we even have a form here?
	if (document.getElementById(form_guid_input_id)) {
		
		// Embed Flash
		// Initialize a timeout fallback
		so_timeout_timer = setTimeout(main_so_logic, fallbackTimer);
		
	} 
}; 



// Do not call this function from JS! FLASH is talking to us!
function flash_so_ready() {

        // Flag flash is ready to use
        so_ready = true;

        // Clear the timeout timer
        clearTimeout(so_timeout_timer);
        
        // Run our Logic
        main_so_logic();
        
    }
    
    // Either FLASH responded,
    // or in a Timerly fashion FLASH Timed out..
    // Some magic happens here. Hope I'll manage to explain it..
    function main_so_logic() {
        // DID Flash manage to load?
        if(so_ready) {
            
            // Yup, we have FLASH here, try to read the GUID
            so_temp = flash_so_load(guidKey);
            // Did FLASH return us a valid guid?
            if(is_guid(so_temp)) {
                // Set GUID = FLASH GUID
                guid = so_temp;
            
            // Nothing from FLASH :(
            } else {
                
                // JS GUID Maybe?
                js_temp = js_cookie_load(guidKey);
                
                // Is it any valid?
                if(is_guid(js_temp)) {
                    
                    // Yes! we have a valid JS GUID
                    // Set GUID = JS GUID
                    guid = js_temp;
                    // We have JS GUID here, we save it to FLASH here (Because FLASH is BETTER!)
                    flash_so_save(guidKey, guid);
                    
                }

            }
            
            // So we have FLASH, its empty, we also checked JS, nadda..
            // Generate a new GUID and save to FLASH
            if(!is_guid(guid)) {
                
                guid = generate_guid();
                flash_so_save(guidKey, guid);
        
            }
        
        // In this bummer scenario we dont have FLASH available or it failed to respond on time.
        } else {
            
            // Try to look for GUID in JS
            js_temp = js_cookie_load(guidKey);
            
            // Got anything valid?
            if(is_guid(js_temp)) {
            
                // Yup, valid JS GUID
                // Set GUID = JS GUID
                guid = js_temp;
            
            } 
            
            // What?! No Flash, No Guid in JS, No Nothing!!!
            // Generate a new GUID and save in JS
            if(!is_guid(guid)) {
        
                guid = generate_guid();
                js_cookie_save(guidKey, guid);
        
            }
            
        }
        
        // No matter what - we HAVE guid here.
        var el = document.getElementById(form_guid_input_id);
        // Tiny check here
        if(el) {
        	el.value = guid;
        }
    }
    
    // Following are all the GET/SET/GEN/VALID functions needed
    
    // GUID GENERATE
    function generate_guid() {
       return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
    }
    
    // GUID HELPER
    function S4() {
       return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
    }
    
    // GUID VALIDATOR
    function is_guid(guid)
    {
    	if(guid == "0000-0000-00000000-0000-000000000000") return false;
    	if(!guid) return false;
		GuidRegExp = /^[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?$/;
		return GuidRegExp.test(guid);
	}
   
    // JS COOKIE SET
    function js_cookie_save(name, value) {
    	 
    	 var today = new Date();
    	 var expire = new Date();
    	 expire.setTime(today.getTime() + 3600000 * 24 * 365 * 5); // 5 Years
    	 document.cookie = name+"="+escape(value)
    	                 + ";expires="+expire.toGMTString() + ";domain=" + cookie_domain + ";path=/";
    }
    
    // JS COOKIE GET
    function js_cookie_load(name) {
      	var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') c = c.substring(1,c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return null;
    }
    
    // FLASH SO SET
    function flash_so_save(name, value){
        var SharedObjectClient = getFlashMovieObject("SharedObjectClient");
        SharedObjectClient.saveLocal(name, value);
    }
    
    // FLASH SO GET
    function flash_so_load(name){
        var SharedObjectClient = getFlashMovieObject("SharedObjectClient");
        return SharedObjectClient.readLocal(name);    
    }
    
    function getFlashMovieObject(movieName) { 
    	if(document.embeds[movieName]) {
    		try {
    			if(document.embeds[movieName].length > 0) {
    				return document.embeds[movieName][0];
    			}
    		}
    		catch (e) {
    			return document.embeds[movieName];
    		}
    	}
    	if(window.document[movieName]) return window.document[movieName]; // IE 
    	if(window[movieName]) return window[movieName]; 
    	if(document[movieName]) return document[movieName]; 
    	return null; 
    }
    
    function embed_guid_flash() {

		 // Embed our flash!
		 // ***************************
    		var theBody = document.getElementsByTagName('body')[0];
    		//var oNewNode = document.createElement("div");
    		var flash_html = '<noscript><object style="display:none;" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="SharedObjectClient" width="0" height="0" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"> <param name="movie" value="' + client_swf_path_prefix + 'SharedObjectClient.swf" /> <param name="quality" value="high" /> <param name="allowScriptAccess" value="sameDomain" />  <embed src="SharedObjectClient.swf" quality="high" width="0" height="0" name="SharedObjectClient" play="true" loop="false" quality="high" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer"></embed></object></noscript>'
    		addHTML(flash_html);
		 // Version check for the Flash Player that has the ability to start Player Product Install (6.0r65)
		 var hasProductInstall = DetectFlashVer(6, 0, 65);
		 
		 // Version check based upon the values defined in globals
		 var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
		 
		 if ( hasProductInstall && !hasRequestedVersion ) {
		 	// DO NOT MODIFY THE FOLLOWING FOUR LINES
		 	// Location visited after installation is complete if installation is required
		 	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", client_swf_path_prefix + "expressInstall",
		 		"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
		 		"id", "SharedObjectClient",
		 		"quality", "high",
		 		"name", "SharedObjectClient",
		 		"allowScriptAccess","sameDomain",
		 		"type", "application/x-shockwave-flash",
		 		"pluginspage", "http://www.adobe.com/go/getflashplayer"
		 	);
		 } else if (hasRequestedVersion) {
		 	// if we've detected an acceptable version
		 	// embed the Flash Content SWF when all tests are passed
		 	AC_FL_RunContent(
		 			"src", client_swf_path_prefix + "SharedObjectClient",
		 			"width", "1px",
		 			"height", "1px",
		 			"display", "none",
		 			"id", "SharedObjectClient",
		 			"quality", "high",
		 			"name", "SharedObjectClient",
		 			"allowScriptAccess","sameDomain",
		 			"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. '
		   	+ 'This content requires the Adobe Flash Player. '
		    	+ '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>';
		   }
    }
    
    // Embedding code helper
 // Flash Player Version Detection - Rev 1.6
 // Detect Client Browser type
 // Copyright(c) 2005-2006 Adobe Macromedia Software, LLC. All rights reserved.

    function addHTML (html) {
    	  if (document.all)
    	    document.body.insertAdjacentHTML('beforeEnd', html);
    	  else if (document.createRange) {
    	    var range = document.createRange();
    	    range.setStartAfter(document.body.lastChild);
    	    var cFrag = range.createContextualFragment(html);
    	    document.body.appendChild(cFrag);
    	  }
    	  else if (document.layers) {
    	    var X = new Layer(window.innerWidth);
    	    X.document.open();
    	    X.document.write(html);
    	    X.document.close();
    	    X.top = document.height;
    	    document.height += X.document.height;
    	    X.visibility = 'show';
    	  }
    	}
    
 function ControlVersion()
 {
 	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
 function GetSwfVer(){
 	// NS/Opera version >= 3 check for Flash plugin in plugin array
 	var flashVer = -1;
 	var len = navigator.plugins.length;

 	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];
 			var versionRevision = descArray[3];
 			if (versionRevision == "") {
 				versionRevision = descArray[4];
 			}
 			if (versionRevision[0] == "d") {
 				versionRevision = versionRevision.substring(1);
 			} else if (versionRevision[0] == "r") {
 				versionRevision = versionRevision.substring(1);
 				if (versionRevision.indexOf("d") > 0) {
 					versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
 				}
 			} else if (versionRevision[0] == "b") {
 				versionRevision = versionRevision.substring(1);
 			}
 			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 ( isIE && isWin && !isOpera ) {
 		flashVer = ControlVersion();
 	}
 	return flashVer;
 }

 // When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
 function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
 {
 	versionStr = GetSwfVer();
 	if (versionStr == -1 ) {
 		return false;
 	} else if (versionStr != 0) {
 		if(isIE && isWin && !isOpera) {
 			// Given "WIN 2,0,0,11"
 			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
 			tempString        = tempArray[1];			// "2,0,0,11"
 			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
 		} else {
 			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(reqMajorVer)) {
 			return true;
 		} else if (versionMajor == parseFloat(reqMajorVer)) {
 			if (versionMinor > parseFloat(reqMinorVer))
 				return true;
 			else if (versionMinor == parseFloat(reqMinorVer)) {
 				if (versionRevision >= parseFloat(reqRevision))
 					return true;
 			}
 		}
 		return false;
 	}
 }

 function AC_AddExtension(src, ext)
 {
   var qIndex = src.indexOf('?');
   if ( qIndex != -1)
   {
     // Add the extention (if needed) before the query params
     var path = src.substring(0, qIndex);
     if (path.length >= ext.length && path.lastIndexOf(ext) == (path.length - ext.length))
       return src;
     else
       return src.replace(/\?/, ext+'?'); 
   }
   else
   {
     // Add the extension (if needed) to the end of the URL
     if (src.length >= ext.length && src.lastIndexOf(ext) == (src.length - ext.length))
       return src;  // Already have extension
     else
       return src + ext;
   }
 }

 function AC_Generateobj(objAttrs, params, embedAttrs) 
 { 
     var str = '';
     if (isIE && isWin && !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>';
     }
     addHTML(str);
 }

 function AC_FL_RunContent(){

   var ret = 
     AC_GetArgs
     (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
      , "application/x-shockwave-flash"
     );
   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 "id":
       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;
 }

