4 Replies Latest reply on May 23, 2014 10:50 AM by sinious

    editing swfobject.js code so hyperlinks inside the flash widget open in a new window

    ACECORP
      I have a flash calendar widget (code shown directly below) and I do not have access to anything other than the compiled .swf file (no access to .fla).
      The widget contains some hyperlinks to other websites, these links are dynamic and changes based on a number of things.
      There is also a corresponding swfobject.js file that is used to add functionality to the flash widget. The swfobject.js code is shown further down this post.
      Currently, the way the code is now, when I click any of the hyperlinks that are available to me in the widget, the destination website that hyperlink takes me to opens in THE SAME PAGE as the flash widget which is a big problem.
      I need to edit the code below so that any hyperlinks that are clicked inside of the flash widget open in a brand new browser window and do not take the user away from the original widget other than opening a new page with new content.
      Because the hyperlinks that are available are always changing, the swfobject code below uses some functions and parameters.
      I am hoping you can show me exactly what code I must insert, and exactly where I must insert it, in order to alter the behavior that happens so that when a user clicks one of the hyperlinks inside the flash widget, so that the content at the other end of the hyperlink opens in a new window, instead of opening in the same window.
      See code below.
      Thank you in advance for any help you can provide

      Flash Widget Code

      <!-- Embedded Calendar --> <div id="activecontent"> <script type="text/javascript" src="swfobject.js"></script> <div id="awccalendar"></div> <script type="text/javascript"> var so = new SWFObject("awc.swf", "awccalendar2", "700", "180", "8", "#ffffff"); so.addVariable('calendarid', '0'); so.addVariable('appurl', ''); // Flash Widget Initial Date should be ddmmyyyy so.addVariable('ldate', '20052014'); so.write('awccalendar'); </script> </div>  <!-- Embedded Calendar -->

       

       

      SWFOBJECT.JS CODE

      /** * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ * * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: * http://www.opensource.org/licenses/mit-license.php * */ if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(

       

       

       

       

        • 1. Re: editing swfobject.js code so hyperlinks inside the flash widget open in a new window
          sinious Most Valuable Participant

          The short of it is the only thing you're allowed to do is warn the person they're leaving your site. This is only because Microsoft introduced an onbeforeunload event for the sake of warning users they're going to lose unsaved data by leaving the page. Other browsers followed suit. This is subject to change because they did it, as usual, in a proprietary fashion. Unfortunately it's only one half of the solution and the other half isn't supplied, which is the location the user is going to. For privacy and security, the URL being loaded is not exposed by any property of the event. There are some hacky workarounds (if you were dealing with pure HTML) by sniffing out the active element, but you're loading a SWF, so you can't even do that. Unfortunately you can't do what you want.

           

          I do not believe there is any way for you to intercept the navigateToURL by wrapping it in another SWF. If someone else has figured out a way to do that, it might help, but I don't believe this is possible. Even if it is, it may break the SWF you need to watch by loading it inside a wrapper SWF.

           

          You're going to need to obtain that FLA..

          1 person found this helpful
          • 2. Re: editing swfobject.js code so hyperlinks inside the flash widget open in a new window
            ACECORP Level 1

            In that case, I will have no choice but to decompile the .swf to get the .fla because the original .fla is un-obtainable. Unless there is a way to edit the contents of the .swf file without decompiling it.

             

             

            I can see the code inside via various decompile tools and it seems that I would need to add the equivalent of <src target=_blank> to some of the lines I have shown below.

             

            • obj_xml.load(appurl + "loadconfig.aspx?calendarid=" + calendarid);  -- need to edit this so it opens in a new window using something similar to target = _blank

             

            • dest_page = appurl + "default.aspx"; -- need to edit this so it opens in a new window using something similar to target = _blank

             

             

            I know a lot of decompile tools can get you the code and the .fla but once you edit and re-compile and attempt to replace the original with the new & updated file, the decompiler did not necessarily generate the properly formatted flash pro project file, so compiling it back into an operational .swf often ends in failure.

             

            Do you know or can you recommend a tool that has a very good track record of re-compiling the decompiled modified.fla into a workable and usable .swf?

            • 3. Re: editing swfobject.js code so hyperlinks inside the flash widget open in a new window
              ACECORP Level 1

              Short of going down the .swf decompile pathway, are you absolutely sure that there is no code edit I can make to the swfobjects.js file or into the html widget code itself (the code that places the swf object on the web page) so that the appropriate part of the code can utilize an added structure like openLinksInNewWindow: "true"  to force the links to open on a new window?

              • 4. Re: editing swfobject.js code so hyperlinks inside the flash widget open in a new window
                sinious Most Valuable Participant

                In what you've shown, obj_xml.load(..) is most likely an URLLoader that is loading XML for display in the calendar, not a navigateToURL link. You don't need to worry about that, it's not changing the page location.

                 

                As for decompiling, I really haven't tried/needed to do it so I can't recommend a decompiler.

                 

                Yes I'm sure a navigateToURL cannot be intercepted by swfobject. At best you can experiment with trying to disable the SWF from launching by turning off allowScriptAccess.

                 

                Again, what I mentioned about a wrapper on the SWF may be possible. I don't have the time at the moment to see if a parent SWF can intercept a child SWF running navigateToURL.

                1 person found this helpful