root_class.as
22.5 KB
package {
import com.videoplayer.*;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Stage;
import flash.display.StageDisplayState;
import flash.events.FullScreenEvent;
import flash.events.SecurityErrorEvent;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.URLRequestMethod;
import flash.net.navigateToURL;
import flash.display.DisplayObject;
import flash.geom.ColorTransform;
import flash.external.ExternalInterface;
//import flash.system.Security;
public class root_class extends MovieClip {
private var urlArray:Array=["video/Shannon_micro.flv","video/Jacquie_micro.flv","video/Crooks_micro.flv"];
private var normColorHex:uint=0x5E9732;
private var selColorHex:uint=0x006857;
private var clickTag:String = "http://www.libro.ca/contact/contactus.html";// if nothing is passed in, it will go here
private var rulesURL:String = "http://www.libro.ca/beLibro/rules.html";
private var form1URL:String = "http://www.libro.ca/applications/fallCampaign09/FinancialQuestion.aspx";
private var form2URL:String = "http://www.libro.ca/applications/fallCampaign09/SendEmails.aspx";
//private var form1URL:String = "http://mmc.ca/share/form1.php";
//private var form2URL:String = "http://mmc.ca/share/form2.php";
private var streamingServer:String = null;//"rtmp://flash.streamingmediahosting.com/tenzingcom/"
private var client:Object;// client object to use for the NetStream object
private var idx:uint=0;//index of the currently playing video
private var uldr:URLLoader;
private var vidplyr:VideoPlayer;
private var selectedIcon:MovieClip;
// forms
private var form1:Object;
private var form2:Object;
private var id:String;
private var myRoot:MovieClip;
public function root_class() {
// clickTag
if (!(root.loaderInfo.parameters.clicktag==null)) {
clickTag=root.loaderInfo.parameters.clicktag;
} else if (!(root.loaderInfo.parameters.clickTAG==null)) {
clickTag=root.loaderInfo.parameters.clickTAG;
} else if (!(root.loaderInfo.parameters.Clicktag==null)) {
clickTag=root.loaderInfo.parameters.Clicktag;
} else if (!(root.loaderInfo.parameters.clickTag==null)) {
clickTag=root.loaderInfo.parameters.clickTag;
} else if (!(root.loaderInfo.parameters.ClickTag==null)) {
clickTag=root.loaderInfo.parameters.ClickTag;
}
myRoot=this.banner_mc;
// define form fields
var form_mc:MovieClip= myRoot.form1_mc;
var myID={id:0,field:null,valInd:null,required:null,valType:null,val:null,type:"hidden", obj:null};
var myName={id:1,field:form_mc.name_txt,valInd:form_mc.nameVal_mc,required:true,valType:"notEmpty",val:"",type:"regular", obj:null};
var myEmail={id:2,field:form_mc.email_txt,valInd:form_mc.emailVal_mc,required:true,valType:"email",val:"",type:"regular", obj:null};
var myCity={id:3,field:form_mc.city_txt,valInd:form_mc.cityVal_mc,required:true,valType:"notEmpty",val:"",type:"regular", obj:null};
var myLibro={id:4,field:form_mc.libro_chk,valInd:form_mc.libroVal_mc,required:false,valType:null,val:"0",type:"check", obj:null};
var myQuestion={id:5,field:form_mc.question_txt,valInd:form_mc.questionVal_mc,required:true,valType:"notEmpty",val:"",type:"multiline", obj:null};
form1={fields:[myID,myName,myEmail,myCity,myLibro,myQuestion], ID:myID, name:myName, email:myEmail, city:myCity, libro:myLibro, question:myQuestion};
form_mc= myRoot.form2_mc;
var myFrEmail0={id:10,field:form_mc.email0_txt,valInd:form_mc.email0Val_mc,required:false,valType:"email",val:"",type:"regular", obj:null};
var myFrEmail1={id:11,field:form_mc.email1_txt,valInd:form_mc.email1Val_mc,required:false,valType:"email",val:"",type:"regular", obj:null};
var myFrEmail2={id:12,field:form_mc.email2_txt,valInd:form_mc.email2Val_mc,required:false,valType:"email",val:"",type:"regular", obj:null};
var myFrEmail3={id:13,field:form_mc.email3_txt,valInd:form_mc.email3Val_mc,required:false,valType:"email",val:"",type:"regular", obj:null};
var myFrEmail4={id:14,field:form_mc.email4_txt,valInd:form_mc.email4Val_mc,required:false,valType:"email",val:"",type:"regular", obj:null};
form2={fields:[myFrEmail0,myFrEmail1,myFrEmail2,myFrEmail3,myFrEmail4], ID:myID, name:myName, friends:""};
// prepare video jukebox
vidplyr=new VideoPlayer(myRoot.jb_mc.moviePlayer_mc,streamingServer);
vidplyr.autoPlay=true;
vidplyr.scale("none");// scale values: none, fill, fit
vidplyr.autoHideController=false;
vidplyr.addEventListener(Event.COMPLETE, onVidComplete);
myRoot.jb_mc.moviePlayer_mc.stage.addEventListener( FullScreenEvent.FULL_SCREEN, onFullScrn );
myRoot.jb_mc.shadow_mc.mouseEnabled=false;
// initiate jukebox icons
for (var i=0; i<urlArray.length; i++) {
//trace(this+" adding icon:"+i);
var mc:MovieClip = myRoot.jb_mc["icon"+(i+1)+"_mc"];
mc.vidURL=urlArray[i];
mc.indx=i;
mc.gotoAndStop(i+1);
mc.addEventListener(MouseEvent.MOUSE_OVER, onIconOver);
mc.addEventListener(MouseEvent.MOUSE_OUT, onIconOut);
mc.addEventListener(MouseEvent.CLICK, onIconClick);
}
selectedIcon=myRoot.jb_mc.icon1_mc;
myRoot.jb_mc.moviePlayer_mc.posterPlay.visible=false;
//myRoot.jb_mc.closingCTA_mc.visible=false;
//myRoot.jb_mc.moviePlayer_mc.controller_mc.info_mc.stop();
//myRoot.jb_mc.moviePlayer_mc.controller_mc.fullscreenButton.visible=false;
//myRoot.jb_mc.closingCTA_mc.addFrameScript(7,stateVid2CTA);
//myRoot.jb_mc.closingCTA_mc.addFrameScript(90,stateWait); // 90 is 5 seconds
//myRoot.jb_mc.closingCTA_mc.hit_mc.mouseEnabled = true;
//myRoot.jb_mc.closingCTA_mc.hit_mc.buttonMode = true;
//myRoot.jb_mc.closingCTA_mc.hit_mc.addEventListener(MouseEvent.CLICK, onContactClick);
//myRoot.jb_mc.closingCTA_mc.gotoAndStop(1);
//stateExpanding();
stateWait();
// prepare forms
initForm(form1);
myRoot.form1_mc.send_btn.addEventListener(MouseEvent.CLICK, onSendForm1);
myRoot.form1_mc.rules_btn.addEventListener(MouseEvent.CLICK, onRulesClick);
myRoot.form1_mc.visible=false;
initForm(form2);
myRoot.form2_mc.send_btn.addEventListener(MouseEvent.CLICK, onSendForm2);
myRoot.form1_mc.visible=false;
resetValidationIndicators();
// prepare navigation
myRoot.action_mc.ask_btn.addEventListener(MouseEvent.CLICK, onAskClick);
myRoot.action_mc.choose_btn.addEventListener(MouseEvent.CLICK, onChooseClick);
myRoot.action_mc.contact_btn.addEventListener(MouseEvent.CLICK, onContactClick);
myRoot.action_mc.contact_btn.visible=false;
myRoot.action_mc.contact_mc.visible=false;
myRoot.action_mc.gotoAndStop(1);
trackPage("home");
myRoot.jb_mc.close_btn.addEventListener(MouseEvent.CLICK, closeExp);
//this.addEventListener(MouseEvent.ROLL_OUT, closeExp);
}
// navigation events ///////////////////////////////////////////////////////
private function onRulesClick(e:MouseEvent) {
//trace(this+" onRulesClick clicked");
trackEvent("microBtn", "click", "contestRules");
navigateToURL(new URLRequest(rulesURL), '_self');
}
private function onChooseClick(e:MouseEvent) {
trackEvent("microBtn", "click", "chooseVideo");
//trace(this+" onChooseClick clicked");
myRoot.action_mc.gotoAndStop(1);
myRoot.form1_mc.visible=false;
myRoot.form2_mc.visible=false;
myRoot.formThanks_mc.visible=false;
myRoot.jb_mc.visible=true;
showCTA();
}
private function onAskClick(e:MouseEvent) {
trackEvent("microBtn", "click", "askQuestion");
//trace(this+" onAskClick clicked");
myRoot.action_mc.gotoAndStop(2);
resetValidationIndicators();
myRoot.form1_mc.visible=true;
myRoot.form2_mc.visible=false;
myRoot.formThanks_mc.visible=false;
myRoot.fail_mc.visible=false;
myRoot.jb_mc.visible=false;
showCTA();
}
private function onContactClick(e:MouseEvent) {
trackEvent("microBtn", "click", "contact");
//trace(this+" onContactClick clicked");
navigateToURL(new URLRequest(clickTag), '_self');
}
private function showCTA() {
myRoot.action_mc.contact_btn.visible=true;
myRoot.action_mc.contact_mc.visible=true;
}
private function closeExp(e:MouseEvent) {
trackEvent("microBtn", "click", "closeVideo");
trace(this+" closeExp");
// if (ExternalInterface.available) {
// ExternalInterface.call("sendToJavaScript", "close");
// }
vidplyr.pauseVideo();
stateWait();
}
private function trackEvent(category:String, action:String, id:String){
if (ExternalInterface.available) {
try {
ExternalInterface.call("pageTracker._trackEvent", category, action, id);
} catch (error:SecurityError) {
this.output_txt.appendText("A SecurityError occurred: " + error.message + "\n");
} catch (error:Error) {
this.output_txt.appendText("An Error occurred: " + error.message + "\n");
}
} else {
this.output_txt.appendText("External interface is not available for this container.");
}
}
private function trackPage(id:String){
if (ExternalInterface.available) {
try {
ExternalInterface.call("pageTracker._trackPageview", ("/Be Libro Microsite/"+id) );
} catch (error:SecurityError) {
this.output_txt.appendText("A SecurityError occurred: " + error.message + "\n");
} catch (error:Error) {
this.output_txt.appendText("An Error occurred: " + error.message + "\n");
}
} else {
this.output_txt.appendText("External interface is not available for this container.");
}
}
// video juke box functions ///////////////////////////////////////////////////
private function onVidComplete(e:Event):void {
trackEvent("microVid", "player", "videoComplete");
trace(this + ": onVidComplete() called.");
//stateVidCTA();
stateWait();
}
private function tintMovieClip(mc:Sprite, colorNum:Number):void {
var colorTransform:ColorTransform=mc.transform.colorTransform;
colorTransform.color=colorNum;
mc.transform.colorTransform=colorTransform;
}
private function onIconClick(e:MouseEvent) {
trackEvent("microVid", "click", "icon");
var mc:MovieClip=MovieClip(e.currentTarget);
tintMovieClip(selectedIcon.back_mc, normColorHex);
selectedIcon=mc;
tintMovieClip(selectedIcon.back_mc, selColorHex);
trace(this+" onIconClick - selectedIcon.vidURL"+selectedIcon.vidURL);
vidplyr.setVideo(selectedIcon.vidURL);
//jb_mc.moviePlayer_mc.controller_mc.info_mc.gotoAndStop(selectedIcon.indx+1);
statePlay();
showCTA();
}
private function onIconOver(e:MouseEvent) {
var mc:MovieClip=MovieClip(e.currentTarget);
myRoot.jb_mc.setChildIndex(mc, myRoot.jb_mc.numChildren-1);
}
private function onIconOut(e:MouseEvent) {
var mc:MovieClip=MovieClip(e.currentTarget);
//trace(this+" onIconOut - jb_mc.numChildren:"+jb_mc.numChildren); // this increases & decreases without my code adding/removing objects. Certain mcs were duplicated. When I removed all the frames except frame 1, then this worked.
myRoot.jb_mc.setChildIndex(mc, 0);
}
private function onFullScrn(e:FullScreenEvent){
if (stage.displayState == StageDisplayState.NORMAL){
myRoot.jb_mc.close_btn.visible=true;
}else{
trackEvent("microVid", "click", "fullscreen");
myRoot.jb_mc.close_btn.visible=false;
}
}
// video state functions
private function stateExpanding():void {
//myRoot.jb_mc.closingCTA_mc.visible=false;
myRoot.jb_mc.moviePlayer_mc.visible=false;
myRoot.jb_mc.shadow_mc.visible=false;
myRoot.jb_mc.icon1_mc.visible=false;
myRoot.jb_mc.icon2_mc.visible=false;
myRoot.jb_mc.icon3_mc.visible=false;
myRoot.jb_mc.close_btn.visible=false;
}
private function stateVidCTA():void {
//myRoot.jb_mc.closingCTA_mc.visible=true;
//myRoot.jb_mc.closingCTA_mc.gotoAndPlay(1);
myRoot.jb_mc.close_btn.visible=true;
}
private function stateVid2CTA():void {
// happens a few frames after the first to allow for the tweening
myRoot.jb_mc.moviePlayer_mc.visible=false;
myRoot.jb_mc.shadow_mc.visible=false;
myRoot.jb_mc.close_btn.visible=true;
}
private function stateWait():void {
myRoot.jb_mc.moviePlayer_mc.visible=false;
myRoot.jb_mc.shadow_mc.visible=false;
//myRoot.jb_mc.closingCTA_mc.visible=false;
myRoot.jb_mc.close_btn.visible=false;
tintMovieClip(selectedIcon.back_mc, normColorHex);
}
private function statePlay():void {
//myRoot.jb_mc.closingCTA_mc.visible=false;
//myRoot.jb_mc.closingCTA_mc.gotoAndStop(1);
myRoot.jb_mc.moviePlayer_mc.visible=true;
myRoot.jb_mc.shadow_mc.visible=true;
myRoot.jb_mc.close_btn.visible=true;
}
// form functions /////////////////////////////////////////////////////////////////
private function initForm(form:Object):void {
// set default values and tab index
var f:Array=form.fields;
for (var i:int=0; i<f.length; i++) {
var t:String=f[i].type;
if(!(t=="hidden")){
f[i].obj = f[i];
switch (t) {
case "regular" :
f[i].field.text=f[i].val;
f[i].valInd.visible=false;
f[i].field.tabIndex=i+1;
break;
case "check" :
f[i].field.check_btn.addEventListener(MouseEvent.CLICK, onUncheckClick);
f[i].field.uncheck_btn.addEventListener(MouseEvent.CLICK, onCheckClick);
if (f[i].val=="0") {
f[i].field.check_btn.visible=false;
} else {
f[i].field.uncheck_btn.visible=false;
}
break;
case "multiline" :
f[i].field.text=f[i].val;
f[i].valInd.visible=false;
f[i].field.tabIndex=i+1;
break;
default :
trace(this+" initForm - Type of field could not be deterimined.");
}
}
}
}
private function onSendForm1(e:MouseEvent) {
//trace(this+" onSendForm1 clicked");
trackEvent("microForm", "click", "send form1 not validated");
resetValidationIndicators();
if (validateForm(form1.fields)) {
// collect data
var loader:URLLoader=new URLLoader ;
var req:URLRequest=new URLRequest(form1URL);
var variables:URLVariables=new URLVariables ;
//loader.dataFormat = URLLoaderDataFormat.VARIABLES;
req.method=URLRequestMethod.POST;
variables.name=escape(form1.fields[1].field.text);
variables.email=escape(form1.fields[2].field.text);
variables.city=escape(form1.fields[3].field.text);
variables.libro=escape(form1.fields[4].val);
variables.question=escape(form1.fields[5].field.text);
req.data=variables;
loader.load(req);
loader.addEventListener(Event.COMPLETE, onSend1Complete);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
}
// form1_mc.visible=false;
// form2_mc.visible=true;
}
private function onSendForm2(e:MouseEvent) {
trackEvent("microForm", "click", "send form2 not validated");
//trace(this+" onSendForm2 clicked");
resetValidationIndicators();
// Find all non-hidden && non-empty fields
var formFields:Array=form2.fields;
var formValid:Boolean=true;
var filledFields:Array=[];
for (var i:int=0; i<formFields.length; i++) {
var field:Object=formFields[i];
if( !(field.type=="hidden")&&(field.field.text.length>1) ){
filledFields.push(field);
}
}
// validate non-empty fields (need at least one valid email address)
if(filledFields.length==0){
formValid=false;
form2.fields[0].valInd.visible=true;
}
for (i=0; i<filledFields.length; i++) {
field=filledFields[i];
if (! fieldValidation(field)) {
formValid=false;
field.valInd.visible=true;
}
}
if (formValid) {
// collect data
var loader:URLLoader=new URLLoader ;
var req:URLRequest=new URLRequest(form2URL);
var variables:URLVariables=new URLVariables ;
//loader.dataFormat = URLLoaderDataFormat.VARIABLES;
req.method=URLRequestMethod.POST;
variables.ID=escape(id);
variables.name=escape(myRoot.form1_mc.name_txt.text);
var emails:String = filledFields[0].field.text;
for (i=1; i<filledFields.length; i++) {
emails+= ",";
emails+= filledFields[i].field.text;
}
variables.friends=escape(emails);
req.data=variables;
loader.load(req);
loader.addEventListener(Event.COMPLETE, onSend2Complete);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
}else{
myRoot.form2_mc.visible=true;
}
}
private function onSend1Complete(e:Event):void {
var stringArray:Array = e.target.data.split("<!DOCTYPE html");
trace(this+" onSend1Complete - xml returned:"+stringArray[0]);
var myXML:XML=new XML(stringArray[0]);
id=myXML.ID.text()[0];
if (int(id)>-1) {
trackEvent("microForm", "click", "send form1 successful");
myRoot.form1_mc.visible=false;
myRoot.form2_mc.visible=true;
} else {
//show which fields failed
myRoot.fail_mc.error_txt.text=this+" onSend1Complete:"+e.target.data;
//form1_mc.question_txt.appendText( "\n"+"listing fields:");
var invalidList=myXML.Invalid.Field;
for (var i:int=0; i<invalidList.length();i++){
var invalidField = invalidList[i].@name;
//myRoot.form1_mc.question_txt.appendText("\n"+invalidField);
//videosXML[idx].@url;
try{
myRoot.form1[invalidField].valInd.visible=true;
}catch(e:Error){
myRoot.fail_mc.visible=true;
myRoot.fail_mc.error_txt.append(" Error Catch:"+e);
}
}
}
}
private function onSend2Complete(e:Event):void {
var stringArray:Array = e.target.data.split("<!DOCTYPE html");
trace(this+" onSend1Complete - xml returned:"+stringArray[0]);
var myXML:XML=new XML(stringArray[0]);
var error=myXML.ErrorCode.text()[0];
if (int(error)>-1) {
trackEvent("microForm", "click", "send form2 successful");
myRoot.form1_mc.visible=false;
myRoot.form2_mc.visible=false;
myRoot.formThanks_mc.visible=true;
} else {
//fail_mc.error_txt.text=this+" onSend2Complete:"+e.target.data;
myRoot.fail_mc.error_txt.text="Error:";
var invalidList=myXML.Invalid.Field;
for (var i:int=0; i<invalidList.length();i++){
var invalidField = invalidList[i].@name;
if(invalidField=="friends"){
// just highlight the first in the list
try{
//form1.fields[invalidField].valInd.visible=true;
myRoot.form2.fields[0].valInd.visible=true;
myRoot.form2.fields[1].valInd.visible=true;
myRoot.form2.fields[2].valInd.visible=true;
myRoot.form2.fields[3].valInd.visible=true;
myRoot.form2.fields[4].valInd.visible=true;
myRoot.form2_mc.visible=true;
}catch(e:Error){
myRoot.fail_mc.visible=true;
myRoot.fail_mc.error_txt.append(" Error Catch:"+e);
}
}else{
myRoot.fail_mc.visible=true;
myRoot.fail_mc.error_txt.appendText("\nMissing:"+invalidField);
}
}
}
}
private function validateForm(formFields:Array):Boolean {
var formValid:Boolean=true;
for (var i:int=0; i<formFields.length; i++) {
var field:Object=formFields[i];
if(!(field.type=="hidden") && field.required){
if (! fieldValidation(field)) {
formValid=false;
field.valInd.visible=true;
//trace(this+" Please make sure all your email addresses are valid.");
}
}
}
return formValid;
}
private function fieldValidation(field:Object):Boolean{
var fieldValid:Boolean=true;
var valType:String = field.valType;
switch (valType) {
case "notEmpty" :
fieldValid=field.field.text.length>1;
break;
case "email" :
fieldValid=checkEmail(stripspaces(field.field.text));
break;
case "check" :
// no validation required
break;
default :
trace(this+" initForm - Type of validation could not be determined.");
}
return fieldValid;
}
private function resetValidationIndicators():void {
resetValidationIndicatorsForm(form1.fields);
resetValidationIndicatorsForm(form2.fields);
myRoot.form2_mc.visible=false;
myRoot.formThanks_mc.visible=false;
myRoot.fail_mc.visible=false;
}
private function resetValidationIndicatorsForm(formFields:Array):void {
for (var i:int=0; i<formFields.length; i++) {
if(!(formFields[i].type=="hidden")){formFields[i].valInd.visible=false;}
}
}
private function onCheckClick(e:MouseEvent) {
trace(this+" onCheckClick clicked: "+e.currentTarget.name);
myRoot.form1_mc.libro_chk.check_btn.visible=true;
myRoot.form1_mc.libro_chk.uncheck_btn.visible=false;
myRoot.form1.fields[4].val="1";
}
private function onUncheckClick(e:MouseEvent) {
trace(this+" onUncheckClick clicked: "+e.currentTarget.name);
myRoot.form1_mc.libro_chk.check_btn.visible=false;
myRoot.form1_mc.libro_chk.uncheck_btn.visible=true;
myRoot.form1.fields[4].val="0";
}
private function checkEmail(whichObj:String):Boolean {
//check for @ and .
//check @ preceeds last dot
//check that @ is not first
//email cannot have any spaces
trace(this+" checkEmail: "+whichObj);
var emailBool:Boolean;
if (whichObj.indexOf("@")==-1||whichObj.indexOf("@")==0) {//not present or first
emailBool=false;
} else {
emailBool=true;//if @ exists check for dot
if (whichObj.lastIndexOf(".")==-1||whichObj.lastIndexOf(".")==whichObj.length-1) {//not present or at very end
emailBool=false;
} else {
emailBool=true;//if both are true check @ preceeds dot
if (whichObj.lastIndexOf(".")<whichObj.indexOf("@")||whichObj.lastIndexOf(".")==whichObj.indexOf("@")+1) {//not before and not directly after
emailBool=false;
} else {
emailBool=true;
//lastly check it has NO spaces in it
for (var i:Number = 0; i < whichObj.length; i++) {
if (whichObj.charAt(i)==" ") {//if the character is a space
emailBool=false;
}
}
}
}
}
trace(this+" checkEmail -emailBool: " + emailBool);
return emailBool;
}
private function stripspaces(originalstring:String):String {
trace(this+"stripspaces: '"+originalstring+"'");
var original:Array=originalstring.split(" ");
return (original.join(""));
}
private function securityErrorHandler(e:SecurityErrorEvent):void {
trace("securityErrorHandler: " + e);
trackEvent("micro", "error", "securityErrorHandler: " + e);
myRoot.fail_mc.visible=true;
myRoot.fail_mc.error_txt.text=e;
}
private function ioErrorHandler(e:IOErrorEvent):void {
trace("ioErrorHandler: " + e);
trackEvent("micro", "error", "ioErrorHandler: " + e);
myRoot.fail_mc.visible=true;
myRoot.fail_mc.error_txt.text=this+" ioErrorHandler:"+e.text;
}
}
}