
(function(){YAHOO.namespace("vmbed");YAHOO.vmbed.VMBed={loaded:false};var VMBed=YAHOO.vmbed.VMBed;VMBed.URL=document.location.href;var url=/(.*)\?/.exec(VMBed.URL);if(url){VMBed.URL=url[1];}
url=/(.*)\//.exec(VMBed.URL);if(url){VMBed.URL=url[1];}
else{throw new Error("Cannot parse URL: "+document.location.href);}
VMBed.AJAX_URL="/mp";if(/debug/.test(document.location.href))
YAHOO.util.Event.throwErrors=true;VMBed.configLoadedEvent=new YAHOO.util.CustomEvent("vmbed_config_loaded",VMBed);var configResponse=function(response){var result;var error;if(response.responseText&&typeof response.responseText=="string"){try{result=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error.";}}
else{error="Server error.";}
if(result&&result.failureReason){error=result.failureReason;}
if(error)
throw new Error(error);YAHOO.vmbed.VMBed=YAHOO.lang.merge(VMBed,result);YAHOO.vmbed.VMBed.loaded=true;YAHOO.vmbed.VMBed.configLoadedEvent.fire();};YAHOO.util.Connect.asyncRequest
('POST',YAHOO.vmbed.VMBed.AJAX_URL+'/loadState',{success:configResponse,failure:configResponse,timeout:10000});VMBed.machineRentedEvent=new YAHOO.util.CustomEvent("vmbed_machine_rented",VMBed);VMBed.bookingCanceledEvent=new YAHOO.util.CustomEvent("vmbed_booking_canceled",VMBed);VMBed.machineSavedEvent=new YAHOO.util.CustomEvent("vmbed_machine_saved",VMBed);VMBed.machineDeletedEvent=new YAHOO.util.CustomEvent("vmbed_machine_deleted",VMBed);YAHOO.register("vmbed",YAHOO.vmbed.VMBed,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed");YAHOO.vmbed.ErrorCodes={loaded:false};var ErrorCodes=YAHOO.vmbed.ErrorCodes;ErrorCodes.map={100:"Username or password is incorrect",101:"The username provided is already in use",102:"The email provided is already in use",103:"The promotional code is not valid",104:"You do not have sufficient credit",105:"The machine is not available"};ErrorCodes.toString=function(code){if(ErrorCodes.map[code]){return ErrorCodes.map[code];}
else{return code;}};YAHOO.register("vmbed_error_codes",YAHOO.vmbed.ErrorCodes,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed");YAHOO.vmbed.User=function(name,attrs){this.name=name;this.attrs=attrs;this.emailAddress=attrs.emailAddress;this.fullCredit=attrs.fullCredit,this.availableCredit=attrs.availableCredit;this.IS_VERIFIED=attrs.IS_VERIFIED;this.SUBSCRIBED_OK=attrs.SUBSCRIBED_OK;this.HAS_HISTORY=attrs.HAS_HISTORY;this.WANTS_AUTO_ARCHIVE=attrs.WANTS_AUTO_ARCHIVE;this.WANTS_START_EMAIL=attrs.WANTS_START_EMAIL;this.WANTS_END_EMAIL=attrs.WANTS_END_EMAIL;};YAHOO.register("vmbed_user",YAHOO.vmbed.User,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed");YAHOO.vmbed.Session={user:null,state:"NO_USER"};var Session=YAHOO.vmbed.Session,VMBed=YAHOO.vmbed.VMBed;Session.AUTH_URL=YAHOO.vmbed.VMBed.AJAX_URL+"/authenticate";Session.SIGNUP_URL=YAHOO.vmbed.VMBed.AJAX_URL+"/signup";Session.is_unit_test=/~/.test(document.location.href);Session.NO_USER="NO_USER";Session.LOGGING_IN="LOGGING_IN";Session.FAILED="FAILED";Session.LOGGED_IN="LOGGED_IN";Session.LOGGED_OUT="LOGGED_OUT";Session.state=Session.NO_USER;Session.isNewUser=function(){if(Session.state==Session.NO_USER)
return true;return false;};Session.isNewlySignedUp=function(){if((Session.state==Session.LOGGED_IN)&&(Session.user)&&(!Session.user.IS_VERIFIED)&&(!Session.user.fullCredit)&&(!Session.user.HAS_HISTORY))
return true;return false;};Session.isNewlySignedUpAndVerified=function(){if((Session.state==Session.LOGGED_IN)&&(Session.user)&&(Session.user.IS_VERIFIED)&&(!Session.user.fullCredit)&&(!Session.user.HAS_HISTORY))
return true;return false;};Session.isReturningUser=function(){if(Session.state!=Session.NO_USER)
return true;return false;};Session.stateChangeEvent=new YAHOO.util.CustomEvent("vmbed_session_state_change",Session);Session.creditChangeEvent=new YAHOO.util.CustomEvent("vmbed_session_credit_change",Session);Session.triggerSignupMode=function(){Session._deleteCookie();window.location.reload(false);};Session.triggerLoginMode=function(){Session.user=null;Session.state=Session.LOGGED_OUT;Session.stateChangeEvent.fire();};Session.triggerLogout=function(){Session._clearCookie();window.location.reload(false);};Session.login=function(username,password,authToken,refresh){if(!username||(!password&&!authToken)){Session.state=Session.FAILED;Session.failureReason="Please specify a user name and password to log in.";Session.stateChangeEvent.fire();return true;}
if(typeof username!="string"){throw new Error("Incorrect username type: "+typeof username);}
if(password&&typeof password!="string"){throw new Error("Incorrect password type: "+typeof password);}
if(authToken&&typeof authToken!="string"){throw new Error("Incorrect authToken type: "+typeof authToken);}
if(!refresh){Session.state=Session.LOGGING_IN;Session.stateChangeEvent.fire();}
var data="username="+username;if(password)
data+="&password="+password;if(authToken)
data+="&authToken="+authToken;Session.auth_request=YAHOO.util.Connect.asyncRequest
('POST',Session.AUTH_URL,{success:Session._authSuccess,failure:Session._authFailure,timeout:10000},data);return true;};Session._authSuccess=function(response){if(!Session.auth_request){return true;}
if(Session.auth_request.tId!=response.tId)
return true;var priorState=Session.state;var priorUser=Session.user;var result;var error;if(response.responseText&&typeof response.responseText=="string"){try{result=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error.";}}
else{error="Server error.";}
if(result&&result.failureReason){error=result.failureReason;}
if(error){Session._clearCookie();Session.user=null;Session.state=Session.FAILED;Session.failureReason=error;}
else if(result){if(!result.user){throw new Error("Server response without a user");}
if(!result.authToken){throw new Error("Server response without an authToken");}
Session.user=new YAHOO.vmbed.User(result.user.name,result.user);Session.authToken=result.authToken;Session.state=Session.LOGGED_IN;}
if(Session._detectStateChange(priorState,priorUser)){Session.stateChangeEvent.fire();}
if(Session._detectCreditChange(priorUser)){Session.creditChangeEvent.fire();}
Session._startRefreshTimer();return true;};Session._authFailure=function(response){return true;};Session._deleteCookie=function(){var date=new Date();date.setTime(date.getTime()-(24*60*60*1000));var expires="; expires="+date.toGMTString();document.cookie="vmbed_session="+expires+"; path=/; domain=.vmbed.com";document.cookie="vmbed_session="+expires+"; path=/; domain=.vmserve.net";document.cookie="vmbed_session="+expires+"; path=/; domain=vmbed.homeip.net";};Session._clearCookie=function(){var date=new Date();date.setTime(date.getTime()+(365*24*60*60*1000));var expires="; expires="+date.toGMTString();document.cookie="vmbed_session=CLEARED"+expires+"; path=/; domain=.vmbed.com";document.cookie="vmbed_session=CLEARED"+expires+"; path=/; domain=.vmserve.net";document.cookie="vmbed_session=CLEARED"+expires+"; path=/; domain=vmbed.homeip.net";};Session.signup=function(username,password,verify,email,promo,notify){if(!username||!password||!verify||!email){Session.state=Session.FAILED;Session.failureReason="Please enter a value in each field.";Session.stateChangeEvent.fire();return true;}
if(password!=verify){Session.state=Session.FAILED;Session.failureReason="The passwords do not match.";Session.stateChangeEvent.fire();return true;}
if(typeof username!="string"){throw new Error("Incorrect username type: "+typeof username);}
if(typeof password!="string"){throw new Error("Incorrect password type: "+typeof password);}
if(typeof verify!="string"){throw new Error("Incorrect verify type: "+typeof verify);}
if(typeof email!="string"){throw new Error("Incorrect email type: "+typeof email);}
Session.state=Session.LOGGING_IN;Session.stateChangeEvent.fire();var data="username="+username;data+="&password="+password;data+="&verify="+verify;data+="&email="+email;data+="&promo="+promo;data+="&notify="+notify;Session.auth_request=YAHOO.util.Connect.asyncRequest
('POST',Session.SIGNUP_URL,{success:Session._authSuccess,failure:Session._authFailure,timeout:10000},data);return true;};Session._detectStateChange=function(priorState,priorUser){if(Session.state!=priorState)
return true;if((Session.user&&!priorUser)||(!Session.user&&priorUser)){return true;}
else if(Session.user&&priorUser){if(Session.user.IS_VERIFIED!=priorUser.IS_VERIFIED)
return true;else if(Session.user.SUBSCRIBED_OK!=priorUser.SUBSCRIBED_OK)
return true;}
return false;};Session._detectCreditChange=function(priorUser){if((Session.user&&!priorUser)||(!Session.user&&priorUser)){return true;}
else if(Session.user&&priorUser){if(Session.user.availableCredit!=priorUser.availableCredit)
return true;}
return false;};Session._refreshLogin=function(){if(Session.user&&Session.user.name&&Session.authToken){Session.login(Session.user.name,"",Session.authToken,true);}};Session._startRefreshTimer=function(){var delay;if(Session._creditChanged){delay=Session._creditChangedDelay;Session._creditChangedDelay*=2;if(Session._creditChangedDelay>60)
Session._creditChanged=false;}
else{if(!Session.user||(Session.user.IS_VERIFIED&&Session.user.SUBSCRIBED_OK))
delay=60;else
delay=5;}
if(Session._refreshTimeout)
clearTimeout(Session._refreshTimeout);Session._refreshTimeout=setTimeout(Session._refreshLogin,delay*1000);};Session._onCreditChange=function(){Session._creditChanged=true;Session._creditChangedDelay=1;Session._startRefreshTimer();};var match=/vmbed_session\=(.*?)\;/.exec(document.cookie);if(!match)
match=/vmbed_session\=(.*)/.exec(document.cookie);if(match){var sessionStr=match[1];if(sessionStr=="CLEARED"){Session.triggerLoginMode();}
else{var session;try{sessionStr=unescape(sessionStr);session=YAHOO.lang.JSON.parse(sessionStr);}
catch(e){throw new Error("Cannot parse the stored session: "+e+" "+sessionStr);}
Session.login(session.user.name,"",session.authToken);}}
VMBed.machineRentedEvent.subscribe(Session._onCreditChange);VMBed.bookingCanceledEvent.subscribe(Session._onCreditChange);VMBed.machineSavedEvent.subscribe(Session._onCreditChange);VMBed.machineDeletedEvent.subscribe(Session._onCreditChange);YAHOO.register("vmbed_session",YAHOO.vmbed.Session,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed");var Session=YAHOO.vmbed.Session;YAHOO.vmbed.Machine=function(name,attrs){this.name=name;this.attrs=attrs;this.id=attrs.id;this.tags=attrs.tags;this.rate=attrs.rate;this.fullCost=attrs.fullCost;this.storageCharge=attrs.storageCharge;this.firstUse=attrs.firstUse;this.mostRecentUse=attrs.mostRecentUse;this.availability=attrs.availability;this.busy=attrs.busy;this.owner=attrs.owner;this.public_dnsname=attrs.public_dnsname;this.public_ip_address=attrs.public_ip_address;this.HAS_RDP=attrs.HAS_RDP;this.HAS_VNC=attrs.HAS_VNC;this.IS_ARCHIVED=attrs.IS_ARCHIVED;this.processTags();this.saveFailedEvent=new YAHOO.util.CustomEvent("vmbed_save_failed",this);this.saveSuccessEvent=new YAHOO.util.CustomEvent("vmbed_save_success",this);this.deleteFailedEvent=new YAHOO.util.CustomEvent("vmbed_delete_failed",this);this.deleteSuccessEvent=new YAHOO.util.CustomEvent("vmbed_delete_success",this);this.saveSuccessEvent.subscribe(this.onSaveSuccess);this.deleteSuccessEvent.subscribe(this.onDeleteSuccess);};YAHOO.vmbed.Machine.prototype={processTags:function(){if(!this.tags){this.formattedTags='';return true;}
var tags=this.tags.split(';');var filtered=[];for(var i=0;i<tags.length;i++){var prod=/OS Product\=(.*)/.exec(tags[i]);if(prod){this.product=prod[1];continue;}
var provider=/OS Provider\=(.*)/.exec(tags[i]);if(provider){this.provider=provider[1];continue;}
var version=/OS Version\=(.*)/.exec(tags[i]);if(version){this.version=version[1];continue;}
filtered.push(tags[i]);}
this.formattedTags=filtered.join('; ');this.createTitle();this.createOS();this.findImg();return true;},createTitle:function(){this.title=this.name;},createOS:function(){this.os=this.provider+' '+this.product+', '+this.version;},findImg:function(){if(this.os&&/XP/.test(this.os)){this.imgSrc="images/xp_2.png";}
else if(this.os&&/Vista/.test(this.os)){this.imgSrc="images/vista.jpg";}
else{this.imgSrc="images/unknown.gif";}},onSaveSuccess:function(){this.IS_ARCHIVED=true;},onDeleteSuccess:function(){this.IS_ARCHIVED=false;}};YAHOO.register("vmbed_machine",YAHOO.vmbed.Machine,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed");YAHOO.vmbed.Booking=function(attrs){this.attrs=attrs;this.id=attrs.id;this.start_time=attrs.start_time;this.end_time=attrs.end_time;this.state=attrs.state;this.machine=new YAHOO.vmbed.Machine(attrs.machine.name,attrs.machine);this.IS_FAILURE=attrs.IS_FAILURE;this.cancelFailedEvent=new YAHOO.util.CustomEvent("vmbed_cancel_failed",this);this.cancelSuccessEvent=new YAHOO.util.CustomEvent("vmbed_cancel_success",this);};YAHOO.vmbed.Booking.prototype={hasStateChanged:function(from){if((this.state!=from.state)||(this.IS_FAILURE!=from.IS_FAILURE))
return true;return false;}};YAHOO.register("vmbed_booking",YAHOO.vmbed.Booking,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed");YAHOO.vmbed.BookingMgr={user:null};var Session=YAHOO.vmbed.Session,VMBed=YAHOO.vmbed.VMBed,Booking=YAHOO.vmbed.Booking,BookingMgr=YAHOO.vmbed.BookingMgr;BookingMgr.bookings=[];BookingMgr.bookingAddedEvent=new YAHOO.util.CustomEvent("vmbed_bmgr_add",BookingMgr);BookingMgr.bookingRemovedEvent=new YAHOO.util.CustomEvent("vmbed_bmgr_del",BookingMgr);BookingMgr.bookingStateChangedEvent=new YAHOO.util.CustomEvent("vmbed_bmgr_change",BookingMgr);BookingMgr._QUERY_URL=YAHOO.vmbed.VMBed.AJAX_URL+"/queryBookings";BookingMgr._update=function(){if(Session.state!=Session.LOGGED_IN)
return true;BookingMgr._updateFor=Session.user;var tzo=new Date().getTimezoneOffset();var data="&tzo="+tzo;BookingMgr._update_request=YAHOO.util.Connect.asyncRequest
('POST',BookingMgr._QUERY_URL,{success:BookingMgr._updateResponse,failure:BookingMgr._updateResponse,timeout:10000},data);return true;};BookingMgr._updateResponse=function(response){if(!response||!YAHOO.lang.isObject(response))
throw new Error("Invalid response");if(response.tId!=BookingMgr._update_request.tId)
return true;var data;var error;var refreshTime;if(response.responseText&&typeof response.responseText=="string"){try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error.";}}
else{error="Server error.";}
if(data&&data.failureReason){error=data.failureReason;}
if(error){if(Session.is_unit_test)
throw new Error(error);refreshTime=60;}
else{if(BookingMgr._updateFor.name!=Session.user.name)
return true;for(var i=0;i<data.bookings.length;i++){data.bookings[i]=new Booking(data.bookings[i]);}
var old=BookingMgr.bookings;var update=BookingMgr.bookings=data.bookings;for(var i=0;i<update.length;i++){var booking=update[i];var found=false;for(var j=0;!found&&j<old.length;j++){if(booking.id==old[j].id){found=true;old[j]._found=true;if(booking.hasStateChanged(old[j]))
BookingMgr.bookingStateChangedEvent.fire(old[j],booking);}}
if(!found){var prev=null,next=null;if(i!=0)
prev=update[i-1];if(i+1!=update.length)
next=update[i+1];BookingMgr.bookingAddedEvent.fire(booking,prev,next);}}
for(var i=0;i<old.length;i++){var booking=old[i];if(!booking._found)
BookingMgr.bookingRemovedEvent.fire(booking);}
refreshTime=data.refreshHint;if(!refreshTime)
refreshTime=60;}
if(BookingMgr._updateTimeout)
clearTimeout(BookingMgr._updateTimeout);BookingMgr._updateTimeout=setTimeout(BookingMgr._update,refreshTime*1000);return true;};BookingMgr._onSessionStateChange=function(){if(Session.state==Session.LOGGED_IN)
BookingMgr._update();else{if(BookingMgr.bookings.length){var old=BookingMgr.bookings;for(var i=0;i<old.length;i++){var booking=old[i];BookingMgr.bookingRemovedEvent.fire(booking);}
BookingMgr.bookings=[];}}
return true;};Session.stateChangeEvent.subscribe(BookingMgr._onSessionStateChange);if(Session.state==Session.LOGGED_IN)
BookingMgr._update();VMBed.machineRentedEvent.subscribe(BookingMgr._update);VMBed.bookingCanceledEvent.subscribe(BookingMgr._update);YAHOO.register("vmbed_booking_mgr",YAHOO.vmbed.BookingMgr,{version:"1",build:"0"});})();Date.CultureInfo={name:"en-US",englishName:"English (United States)",nativeName:"English (United States)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\+|after|from)/i,subtract:/^(\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\.?m?\.?|p\.?m?\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt)/i,ordinalSuffix:/^\s*(st|nd|rd|th)/i,timeContext:/^\s*(\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}};Date.getMonthNumberFromName=function(name){var n=Date.CultureInfo.monthNames,m=Date.CultureInfo.abbreviatedMonthNames,s=name.toLowerCase();for(var i=0;i<n.length;i++){if(n[i].toLowerCase()==s||m[i].toLowerCase()==s){return i;}}
return-1;};Date.getDayNumberFromName=function(name){var n=Date.CultureInfo.dayNames,m=Date.CultureInfo.abbreviatedDayNames,o=Date.CultureInfo.shortestDayNames,s=name.toLowerCase();for(var i=0;i<n.length;i++){if(n[i].toLowerCase()==s||m[i].toLowerCase()==s){return i;}}
return-1;};Date.isLeapYear=function(year){return(((year%4===0)&&(year%100!==0))||(year%400===0));};Date.getDaysInMonth=function(year,month){return[31,(Date.isLeapYear(year)?29:28),31,30,31,30,31,31,30,31,30,31][month];};Date.getTimezoneOffset=function(s,dst){return(dst||false)?Date.CultureInfo.abbreviatedTimeZoneDST[s.toUpperCase()]:Date.CultureInfo.abbreviatedTimeZoneStandard[s.toUpperCase()];};Date.getTimezoneAbbreviation=function(offset,dst){var n=(dst||false)?Date.CultureInfo.abbreviatedTimeZoneDST:Date.CultureInfo.abbreviatedTimeZoneStandard,p;for(p in n){if(n[p]===offset){return p;}}
return null;};Date.prototype.clone=function(){return new Date(this.getTime());};Date.prototype.compareTo=function(date){if(isNaN(this)){throw new Error(this);}
if(date instanceof Date&&!isNaN(date)){return(this>date)?1:(this<date)?-1:0;}else{throw new TypeError(date);}};Date.prototype.equals=function(date){return(this.compareTo(date)===0);};Date.prototype.between=function(start,end){var t=this.getTime();return t>=start.getTime()&&t<=end.getTime();};Date.prototype.addMilliseconds=function(value){this.setMilliseconds(this.getMilliseconds()+value);return this;};Date.prototype.addSeconds=function(value){return this.addMilliseconds(value*1000);};Date.prototype.addMinutes=function(value){return this.addMilliseconds(value*60000);};Date.prototype.addHours=function(value){return this.addMilliseconds(value*3600000);};Date.prototype.addDays=function(value){return this.addMilliseconds(value*86400000);};Date.prototype.addWeeks=function(value){return this.addMilliseconds(value*604800000);};Date.prototype.addMonths=function(value){var n=this.getDate();this.setDate(1);this.setMonth(this.getMonth()+value);this.setDate(Math.min(n,this.getDaysInMonth()));return this;};Date.prototype.addYears=function(value){return this.addMonths(value*12);};Date.prototype.add=function(config){if(typeof config=="number"){this._orient=config;return this;}
var x=config;if(x.millisecond||x.milliseconds){this.addMilliseconds(x.millisecond||x.milliseconds);}
if(x.second||x.seconds){this.addSeconds(x.second||x.seconds);}
if(x.minute||x.minutes){this.addMinutes(x.minute||x.minutes);}
if(x.hour||x.hours){this.addHours(x.hour||x.hours);}
if(x.month||x.months){this.addMonths(x.month||x.months);}
if(x.year||x.years){this.addYears(x.year||x.years);}
if(x.day||x.days){this.addDays(x.day||x.days);}
return this;};Date._validate=function(value,min,max,name){if(typeof value!="number"){throw new TypeError(value+" is not a Number.");}else if(value<min||value>max){throw new RangeError(value+" is not a valid value for "+name+".");}
return true;};Date.validateMillisecond=function(n){return Date._validate(n,0,999,"milliseconds");};Date.validateSecond=function(n){return Date._validate(n,0,59,"seconds");};Date.validateMinute=function(n){return Date._validate(n,0,59,"minutes");};Date.validateHour=function(n){return Date._validate(n,0,23,"hours");};Date.validateDay=function(n,year,month){return Date._validate(n,1,Date.getDaysInMonth(year,month),"days");};Date.validateMonth=function(n){return Date._validate(n,0,11,"months");};Date.validateYear=function(n){return Date._validate(n,1,9999,"seconds");};Date.prototype.set=function(config){var x=config;if(!x.millisecond&&x.millisecond!==0){x.millisecond=-1;}
if(!x.second&&x.second!==0){x.second=-1;}
if(!x.minute&&x.minute!==0){x.minute=-1;}
if(!x.hour&&x.hour!==0){x.hour=-1;}
if(!x.day&&x.day!==0){x.day=-1;}
if(!x.month&&x.month!==0){x.month=-1;}
if(!x.year&&x.year!==0){x.year=-1;}
if(x.millisecond!=-1&&Date.validateMillisecond(x.millisecond)){this.addMilliseconds(x.millisecond-this.getMilliseconds());}
if(x.second!=-1&&Date.validateSecond(x.second)){this.addSeconds(x.second-this.getSeconds());}
if(x.minute!=-1&&Date.validateMinute(x.minute)){this.addMinutes(x.minute-this.getMinutes());}
if(x.hour!=-1&&Date.validateHour(x.hour)){this.addHours(x.hour-this.getHours());}
if(x.month!==-1&&Date.validateMonth(x.month)){this.addMonths(x.month-this.getMonth());}
if(x.year!=-1&&Date.validateYear(x.year)){this.addYears(x.year-this.getFullYear());}
if(x.day!=-1&&Date.validateDay(x.day,this.getFullYear(),this.getMonth())){this.addDays(x.day-this.getDate());}
if(x.timezone){this.setTimezone(x.timezone);}
if(x.timezoneOffset){this.setTimezoneOffset(x.timezoneOffset);}
return this;};Date.prototype.clearTime=function(){this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);return this;};Date.prototype.isLeapYear=function(){var y=this.getFullYear();return(((y%4===0)&&(y%100!==0))||(y%400===0));};Date.prototype.isWeekday=function(){return!(this.is().sat()||this.is().sun());};Date.prototype.getDaysInMonth=function(){return Date.getDaysInMonth(this.getFullYear(),this.getMonth());};Date.prototype.moveToFirstDayOfMonth=function(){return this.set({day:1});};Date.prototype.moveToLastDayOfMonth=function(){return this.set({day:this.getDaysInMonth()});};Date.prototype.moveToDayOfWeek=function(day,orient){var diff=(day-this.getDay()+7*(orient||+1))%7;return this.addDays((diff===0)?diff+=7*(orient||+1):diff);};Date.prototype.moveToMonth=function(month,orient){var diff=(month-this.getMonth()+12*(orient||+1))%12;return this.addMonths((diff===0)?diff+=12*(orient||+1):diff);};Date.prototype.getDayOfYear=function(){return Math.floor((this-new Date(this.getFullYear(),0,1))/86400000);};Date.prototype.getWeekOfYear=function(firstDayOfWeek){var y=this.getFullYear(),m=this.getMonth(),d=this.getDate();var dow=firstDayOfWeek||Date.CultureInfo.firstDayOfWeek;var offset=7+1-new Date(y,0,1).getDay();if(offset==8){offset=1;}
var daynum=((Date.UTC(y,m,d,0,0,0)-Date.UTC(y,0,1,0,0,0))/86400000)+1;var w=Math.floor((daynum-offset+7)/7);if(w===dow){y--;var prevOffset=7+1-new Date(y,0,1).getDay();if(prevOffset==2||prevOffset==8){w=53;}else{w=52;}}
return w;};Date.prototype.isDST=function(){console.log('isDST');return this.toString().match(/(E|C|M|P)(S|D)T/)[2]=="D";};Date.prototype.getTimezone=function(){return Date.getTimezoneAbbreviation(this.getUTCOffset,this.isDST());};Date.prototype.setTimezoneOffset=function(s){var here=this.getTimezoneOffset(),there=Number(s)*-6/10;this.addMinutes(there-here);return this;};Date.prototype.setTimezone=function(s){return this.setTimezoneOffset(Date.getTimezoneOffset(s));};Date.prototype.getUTCOffset=function(){var n=this.getTimezoneOffset()*-10/6,r;if(n<0){r=(n-10000).toString();return r[0]+r.substr(2);}else{r=(n+10000).toString();return"+"+r.substr(1);}};Date.prototype.getDayName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedDayNames[this.getDay()]:Date.CultureInfo.dayNames[this.getDay()];};Date.prototype.getMonthName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedMonthNames[this.getMonth()]:Date.CultureInfo.monthNames[this.getMonth()];};Date.prototype._toString=Date.prototype.toString;Date.prototype.toString=function(format){var self=this;var p=function p(s){return(s.toString().length==1)?"0"+s:s;};return format?format.replace(/dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?/g,function(format){switch(format){case"hh":return p(self.getHours()<13?self.getHours():(self.getHours()-12));case"h":return self.getHours()<13?self.getHours():(self.getHours()-12);case"HH":return p(self.getHours());case"H":return self.getHours();case"mm":return p(self.getMinutes());case"m":return self.getMinutes();case"ss":return p(self.getSeconds());case"s":return self.getSeconds();case"yyyy":return self.getFullYear();case"yy":return self.getFullYear().toString().substring(2,4);case"dddd":return self.getDayName();case"ddd":return self.getDayName(true);case"dd":return p(self.getDate());case"d":return self.getDate().toString();case"MMMM":return self.getMonthName();case"MMM":return self.getMonthName(true);case"MM":return p((self.getMonth()+1));case"M":return self.getMonth()+1;case"t":return self.getHours()<12?Date.CultureInfo.amDesignator.substring(0,1):Date.CultureInfo.pmDesignator.substring(0,1);case"tt":return self.getHours()<12?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator;case"zzz":case"zz":case"z":return"";}}):this._toString();};Date.now=function(){return new Date();};Date.today=function(){return Date.now().clearTime();};Date.prototype._orient=+1;Date.prototype.next=function(){this._orient=+1;return this;};Date.prototype.last=Date.prototype.prev=Date.prototype.previous=function(){this._orient=-1;return this;};Date.prototype._is=false;Date.prototype.is=function(){this._is=true;return this;};Number.prototype._dateElement="day";Number.prototype.fromNow=function(){var c={};c[this._dateElement]=this;return Date.now().add(c);};Number.prototype.ago=function(){var c={};c[this._dateElement]=this*-1;return Date.now().add(c);};(function(){var $D=Date.prototype,$N=Number.prototype;var dx=("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),mx=("january february march april may june july august september october november december").split(/\s/),px=("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),de;var df=function(n){return function(){if(this._is){this._is=false;return this.getDay()==n;}
return this.moveToDayOfWeek(n,this._orient);};};for(var i=0;i<dx.length;i++){$D[dx[i]]=$D[dx[i].substring(0,3)]=df(i);}
var mf=function(n){return function(){if(this._is){this._is=false;return this.getMonth()===n;}
return this.moveToMonth(n,this._orient);};};for(var j=0;j<mx.length;j++){$D[mx[j]]=$D[mx[j].substring(0,3)]=mf(j);}
var ef=function(j){return function(){if(j.substring(j.length-1)!="s"){j+="s";}
return this["add"+j](this._orient);};};var nf=function(n){return function(){this._dateElement=n;return this;};};for(var k=0;k<px.length;k++){de=px[k].toLowerCase();$D[de]=$D[de+"s"]=ef(px[k]);$N[de]=$N[de+"s"]=nf(de);}}());Date.prototype.toJSONString=function(){return this.toString("yyyy-MM-ddThh:mm:ssZ");};Date.prototype.toShortDateString=function(){return this.toString(Date.CultureInfo.formatPatterns.shortDatePattern);};Date.prototype.toLongDateString=function(){return this.toString(Date.CultureInfo.formatPatterns.longDatePattern);};Date.prototype.toShortTimeString=function(){return this.toString(Date.CultureInfo.formatPatterns.shortTimePattern);};Date.prototype.toLongTimeString=function(){return this.toString(Date.CultureInfo.formatPatterns.longTimePattern);};Date.prototype.getOrdinal=function(){switch(this.getDate()){case 1:case 21:case 31:return"st";case 2:case 22:return"nd";case 3:case 23:return"rd";default:return"th";}};(function(){Date.Parsing={Exception:function(s){this.message="Parse error at '"+s.substring(0,10)+" ...'";}};var $P=Date.Parsing;var _=$P.Operators={rtoken:function(r){return function(s){var mx=s.match(r);if(mx){return([mx[0],s.substring(mx[0].length)]);}else{throw new $P.Exception(s);}};},token:function(s){return function(s){return _.rtoken(new RegExp("^\s*"+s+"\s*"))(s);};},stoken:function(s){return _.rtoken(new RegExp("^"+s));},until:function(p){return function(s){var qx=[],rx=null;while(s.length){try{rx=p.call(this,s);}catch(e){qx.push(rx[0]);s=rx[1];continue;}
break;}
return[qx,s];};},many:function(p){return function(s){var rx=[],r=null;while(s.length){try{r=p.call(this,s);}catch(e){return[rx,s];}
rx.push(r[0]);s=r[1];}
return[rx,s];};},optional:function(p){return function(s){var r=null;try{r=p.call(this,s);}catch(e){return[null,s];}
return[r[0],r[1]];};},not:function(p){return function(s){try{p.call(this,s);}catch(e){return[null,s];}
throw new $P.Exception(s);};},ignore:function(p){return p?function(s){var r=null;r=p.call(this,s);return[null,r[1]];}:null;},product:function(){var px=arguments[0],qx=Array.prototype.slice.call(arguments,1),rx=[];for(var i=0;i<px.length;i++){rx.push(_.each(px[i],qx));}
return rx;},cache:function(rule){var cache={},r=null;return function(s){try{r=cache[s]=(cache[s]||rule.call(this,s));}catch(e){r=cache[s]=e;}
if(r instanceof $P.Exception){throw r;}else{return r;}};},any:function(){var px=arguments;return function(s){var r=null;for(var i=0;i<px.length;i++){if(px[i]==null){continue;}
try{r=(px[i].call(this,s));}catch(e){r=null;}
if(r){return r;}}
throw new $P.Exception(s);};},each:function(){var px=arguments;return function(s){var rx=[],r=null;for(var i=0;i<px.length;i++){if(px[i]==null){continue;}
try{r=(px[i].call(this,s));}catch(e){throw new $P.Exception(s);}
rx.push(r[0]);s=r[1];}
return[rx,s];};},all:function(){var px=arguments,_=_;return _.each(_.optional(px));},sequence:function(px,d,c){d=d||_.rtoken(/^\s*/);c=c||null;if(px.length==1){return px[0];}
return function(s){var r=null,q=null;var rx=[];for(var i=0;i<px.length;i++){try{r=px[i].call(this,s);}catch(e){break;}
rx.push(r[0]);try{q=d.call(this,r[1]);}catch(ex){q=null;break;}
s=q[1];}
if(!r){throw new $P.Exception(s);}
if(q){throw new $P.Exception(q[1]);}
if(c){try{r=c.call(this,r[1]);}catch(ey){throw new $P.Exception(r[1]);}}
return[rx,(r?r[1]:s)];};},between:function(d1,p,d2){d2=d2||d1;var _fn=_.each(_.ignore(d1),p,_.ignore(d2));return function(s){var rx=_fn.call(this,s);return[[rx[0][0],r[0][2]],rx[1]];};},list:function(p,d,c){d=d||_.rtoken(/^\s*/);c=c||null;return(p instanceof Array?_.each(_.product(p.slice(0,-1),_.ignore(d)),p.slice(-1),_.ignore(c)):_.each(_.many(_.each(p,_.ignore(d))),px,_.ignore(c)));},set:function(px,d,c){d=d||_.rtoken(/^\s*/);c=c||null;return function(s){var r=null,p=null,q=null,rx=null,best=[[],s],last=false;for(var i=0;i<px.length;i++){q=null;p=null;r=null;last=(px.length==1);try{r=px[i].call(this,s);}catch(e){continue;}
rx=[[r[0]],r[1]];if(r[1].length>0&&!last){try{q=d.call(this,r[1]);}catch(ex){last=true;}}else{last=true;}
if(!last&&q[1].length===0){last=true;}
if(!last){var qx=[];for(var j=0;j<px.length;j++){if(i!=j){qx.push(px[j]);}}
p=_.set(qx,d).call(this,q[1]);if(p[0].length>0){rx[0]=rx[0].concat(p[0]);rx[1]=p[1];}}
if(rx[1].length<best[1].length){best=rx;}
if(best[1].length===0){break;}}
if(best[0].length===0){return best;}
if(c){try{q=c.call(this,best[1]);}catch(ey){throw new $P.Exception(best[1]);}
best[1]=q[1];}
return best;};},forward:function(gr,fname){return function(s){return gr[fname].call(this,s);};},replace:function(rule,repl){return function(s){var r=rule.call(this,s);return[repl,r[1]];};},process:function(rule,fn){return function(s){var r=rule.call(this,s);return[fn.call(this,r[0]),r[1]];};},min:function(min,rule){return function(s){var rx=rule.call(this,s);if(rx[0].length<min){throw new $P.Exception(s);}
return rx;};}};var _generator=function(op){return function(){var args=null,rx=[];if(arguments.length>1){args=Array.prototype.slice.call(arguments);}else if(arguments[0]instanceof Array){args=arguments[0];}
if(args){for(var i=0,px=args.shift();i<px.length;i++){args.unshift(px[i]);rx.push(op.apply(null,args));args.shift();return rx;}}else{return op.apply(null,arguments);}};};var gx="optional not ignore cache".split(/\s/);for(var i=0;i<gx.length;i++){_[gx[i]]=_generator(_[gx[i]]);}
var _vector=function(op){return function(){if(arguments[0]instanceof Array){return op.apply(null,arguments[0]);}else{return op.apply(null,arguments);}};};var vx="each any all".split(/\s/);for(var j=0;j<vx.length;j++){_[vx[j]]=_vector(_[vx[j]]);}}());(function(){var flattenAndCompact=function(ax){var rx=[];for(var i=0;i<ax.length;i++){if(ax[i]instanceof Array){rx=rx.concat(flattenAndCompact(ax[i]));}else{if(ax[i]){rx.push(ax[i]);}}}
return rx;};Date.Grammar={};Date.Translator={hour:function(s){return function(){this.hour=Number(s);};},minute:function(s){return function(){this.minute=Number(s);};},second:function(s){return function(){this.second=Number(s);};},meridian:function(s){return function(){this.meridian=s.slice(0,1).toLowerCase();};},timezone:function(s){return function(){var n=s.replace(/[^\d\+\-]/g,"");if(n.length){this.timezoneOffset=Number(n);}else{this.timezone=s.toLowerCase();}};},day:function(x){var s=x[0];return function(){this.day=Number(s.match(/\d+/)[0]);};},month:function(s){return function(){this.month=((s.length==3)?Date.getMonthNumberFromName(s):(Number(s)-1));};},year:function(s){return function(){var n=Number(s);this.year=((s.length>2)?n:(n+(((n+2000)<Date.CultureInfo.twoDigitYearMax)?2000:1900)));};},rday:function(s){return function(){switch(s){case"yesterday":this.days=-1;break;case"tomorrow":this.days=1;break;case"today":this.days=0;break;case"now":this.days=0;this.now=true;break;}};},finishExact:function(x){x=(x instanceof Array)?x:[x];var now=new Date();this.year=now.getFullYear();this.month=now.getMonth();this.day=1;this.hour=0;this.minute=0;this.second=0;for(var i=0;i<x.length;i++){if(x[i]){x[i].call(this);}}
this.hour=(this.meridian=="p"&&this.hour<13)?this.hour+12:this.hour;if(this.day>Date.getDaysInMonth(this.year,this.month)){throw new RangeError(this.day+" is not a valid value for days.");}
var r=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second);if(this.timezone){r.set({timezone:this.timezone});}else if(this.timezoneOffset){r.set({timezoneOffset:this.timezoneOffset});}
return r;},finish:function(x){x=(x instanceof Array)?flattenAndCompact(x):[x];if(x.length===0){return null;}
for(var i=0;i<x.length;i++){if(typeof x[i]=="function"){x[i].call(this);}}
if(this.now){return new Date();}
var today=Date.today();var method=null;var expression=!!(this.days!=null||this.orient||this.operator);if(expression){var gap,mod,orient;orient=((this.orient=="past"||this.operator=="subtract")?-1:1);if(this.weekday){this.unit="day";gap=(Date.getDayNumberFromName(this.weekday)-today.getDay());mod=7;this.days=gap?((gap+(orient*mod))%mod):(orient*mod);}
if(this.month){this.unit="month";gap=(this.month-today.getMonth());mod=12;this.months=gap?((gap+(orient*mod))%mod):(orient*mod);this.month=null;}
if(!this.unit){this.unit="day";}
if(this[this.unit+"s"]==null||this.operator!=null){if(!this.value){this.value=1;}
if(this.unit=="week"){this.unit="day";this.value=this.value*7;}
this[this.unit+"s"]=this.value*orient;}
return today.add(this);}else{if(this.meridian&&this.hour){this.hour=(this.hour<13&&this.meridian=="p")?this.hour+12:this.hour;}
if(this.weekday&&!this.day){this.day=(today.addDays((Date.getDayNumberFromName(this.weekday)-today.getDay()))).getDate();}
if(this.month&&!this.day){this.day=1;}
return today.set(this);}}};var _=Date.Parsing.Operators,g=Date.Grammar,t=Date.Translator,_fn;g.datePartDelimiter=_.rtoken(/^([\s\-\.\,\/\x27]+)/);g.timePartDelimiter=_.stoken(":");g.whiteSpace=_.rtoken(/^\s*/);g.generalDelimiter=_.rtoken(/^(([\s\,]|at|on)+)/);var _C={};g.ctoken=function(keys){var fn=_C[keys];if(!fn){var c=Date.CultureInfo.regexPatterns;var kx=keys.split(/\s+/),px=[];for(var i=0;i<kx.length;i++){px.push(_.replace(_.rtoken(c[kx[i]]),kx[i]));}
fn=_C[keys]=_.any.apply(null,px);}
return fn;};g.ctoken2=function(key){return _.rtoken(Date.CultureInfo.regexPatterns[key]);};g.h=_.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2]|[1-9])/),t.hour));g.hh=_.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2])/),t.hour));g.H=_.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3]|[0-9])/),t.hour));g.HH=_.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3])/),t.hour));g.m=_.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/),t.minute));g.mm=_.cache(_.process(_.rtoken(/^[0-5][0-9]/),t.minute));g.s=_.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/),t.second));g.ss=_.cache(_.process(_.rtoken(/^[0-5][0-9]/),t.second));g.hms=_.cache(_.sequence([g.H,g.mm,g.ss],g.timePartDelimiter));g.t=_.cache(_.process(g.ctoken2("shortMeridian"),t.meridian));g.tt=_.cache(_.process(g.ctoken2("longMeridian"),t.meridian));g.z=_.cache(_.process(_.rtoken(/^(\+|\-)?\s*\d\d\d\d?/),t.timezone));g.zz=_.cache(_.process(_.rtoken(/^(\+|\-)\s*\d\d\d\d/),t.timezone));g.zzz=_.cache(_.process(g.ctoken2("timezone"),t.timezone));g.timeSuffix=_.each(_.ignore(g.whiteSpace),_.set([g.tt,g.zzz]));g.time=_.each(_.optional(_.ignore(_.stoken("T"))),g.hms,g.timeSuffix);g.d=_.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1]|\d)/),_.optional(g.ctoken2("ordinalSuffix"))),t.day));g.dd=_.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1])/),_.optional(g.ctoken2("ordinalSuffix"))),t.day));g.ddd=g.dddd=_.cache(_.process(g.ctoken("sun mon tue wed thu fri sat"),function(s){return function(){this.weekday=s;};}));g.M=_.cache(_.process(_.rtoken(/^(1[0-2]|0\d|\d)/),t.month));g.MM=_.cache(_.process(_.rtoken(/^(1[0-2]|0\d)/),t.month));g.MMM=g.MMMM=_.cache(_.process(g.ctoken("jan feb mar apr may jun jul aug sep oct nov dec"),t.month));g.y=_.cache(_.process(_.rtoken(/^(\d\d?)/),t.year));g.yy=_.cache(_.process(_.rtoken(/^(\d\d)/),t.year));g.yyy=_.cache(_.process(_.rtoken(/^(\d\d?\d?\d?)/),t.year));g.yyyy=_.cache(_.process(_.rtoken(/^(\d\d\d\d)/),t.year));_fn=function(){return _.each(_.any.apply(null,arguments),_.not(g.ctoken2("timeContext")));};g.day=_fn(g.d,g.dd);g.month=_fn(g.M,g.MMM);g.year=_fn(g.yyyy,g.yy);g.orientation=_.process(g.ctoken("past future"),function(s){return function(){this.orient=s;};});g.operator=_.process(g.ctoken("add subtract"),function(s){return function(){this.operator=s;};});g.rday=_.process(g.ctoken("yesterday tomorrow today now"),t.rday);g.unit=_.process(g.ctoken("minute hour day week month year"),function(s){return function(){this.unit=s;};});g.value=_.process(_.rtoken(/^\d\d?(st|nd|rd|th)?/),function(s){return function(){this.value=s.replace(/\D/g,"");};});g.expression=_.set([g.rday,g.operator,g.value,g.unit,g.orientation,g.ddd,g.MMM]);_fn=function(){return _.set(arguments,g.datePartDelimiter);};g.mdy=_fn(g.ddd,g.month,g.day,g.year);g.ymd=_fn(g.ddd,g.year,g.month,g.day);g.dmy=_fn(g.ddd,g.day,g.month,g.year);g.date=function(s){return((g[Date.CultureInfo.dateElementOrder]||g.mdy).call(this,s));};g.format=_.process(_.many(_.any(_.process(_.rtoken(/^(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?)/),function(fmt){if(g[fmt]){return g[fmt];}else{throw Date.Parsing.Exception(fmt);}}),_.process(_.rtoken(/^[^dMyhHmstz]+/),function(s){return _.ignore(_.stoken(s));}))),function(rules){return _.process(_.each.apply(null,rules),t.finishExact);});var _F={};var _get=function(f){return _F[f]=(_F[f]||g.format(f)[0]);};g.formats=function(fx){if(fx instanceof Array){var rx=[];for(var i=0;i<fx.length;i++){rx.push(_get(fx[i]));}
return _.any.apply(null,rx);}else{return _get(fx);}};g._formats=g.formats(["yyyy-MM-ddTHH:mm:ss","ddd, MMM dd, yyyy H:mm:ss tt","ddd MMM d yyyy HH:mm:ss zzz","d"]);g._start=_.process(_.set([g.date,g.time,g.expression],g.generalDelimiter,g.whiteSpace),t.finish);g.start=function(s){try{var r=g._formats.call({},s);if(r[1].length===0){return r;}}catch(e){}
return g._start.call({},s);};}());Date._parse=Date.parse;Date.parse=function(s){var r=null;if(!s){return null;}
try{r=Date.Grammar.start.call({},s);}catch(e){return null;}
return((r[1].length===0)?r[0]:null);};Date.getParseFunction=function(fx){var fn=Date.Grammar.formats(fx);return function(s){var r=null;try{r=fn.call({},s);}catch(e){return null;}
return((r[1].length===0)?r[0]:null);};};Date.parseExact=function(s,fx){return Date.getParseFunction(fx)(s);};YAHOO.register("vmbed_date",Date,{version:"1",build:"0"});(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Collapsible=function(el,userConfig){YAHOO.vmbed.widget.Collapsible.superclass.constructor.call(this,el,userConfig);};var Collapsible=YAHOO.vmbed.widget.Collapsible,Module=YAHOO.widget.Module,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom,showIconTemplate,hideIconTemplate;Collapsible.CSS_COLLAPSIBLE="vmbed-col";YAHOO.lang.extend(Collapsible,Module,{init:function(el,userConfig){Collapsible.superclass.init.call(this,el,userConfig);this.initEvent.fire(Collapsible);Dom.addClass(this.element,Collapsible.CSS_COLLAPSIBLE);this.beforeInitEvent.fire(Collapsible);},initDefaultConfig:function(){Collapsible.superclass.initDefaultConfig.call(this);this.cfg.addProperty('show',{handler:this.configShow,value:false});},configShow:function(type,args,obj){if(!this.showIcon){if(!showIconTemplate){showIconTemplate=document.createElement("span");showIconTemplate.innerHTML="&#160;";showIconTemplate.className="icon show";}
this.showIcon=showIconTemplate.cloneNode(true);this.element.appendChild(this.showIcon);Event.on(this.showIcon,"click",this.show,this,true);}
if(!this.hideIcon){if(!hideIconTemplate){hideIconTemplate=document.createElement("span");hideIconTemplate.innerHTML="&#160;";hideIconTemplate.className="icon hide";}
this.hideIcon=hideIconTemplate.cloneNode(true);this.element.appendChild(this.hideIcon);Event.on(this.hideIcon,"click",this.hide,this,true);}
var val=args[0];if(val){this.show();}
else{this.hide();}},show:function(){this.hideIcon.style.display="block";this.showIcon.style.display="none";this.body.style.display="block";},hide:function(){this.hideIcon.style.display="none";this.showIcon.style.display="block";this.body.style.display="none";}});YAHOO.register("vmbed_collapsible",YAHOO.vmbed.widget.Collapsible,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.RentForm=function(){};var RentForm=YAHOO.vmbed.widget.RentForm;RentForm.prototype={checkAndUpdateForm:function(event){var begin_plus_hour=this.beginDate().clone().add(1).hours();if(begin_plus_hour.compareTo(this.endDate())>0){var point;var date;if(/Begin/.test(event.target.id)){date=begin_plus_hour;point='End';}
else{date=this.endDate().clone().add(-1).hours();point='Begin';}
var change=[[date.toString("yyyy-MM-dd"),this.getSelect("rent"+point+"Date")],[date.toString("HH:mm:ss"),this.getSelect("rent"+point+"Time")]];var matched=false;for(var i=0;i<=1;i++){var value=change[i][0];var select=change[i][1];var options=select.childNodes;for(var j=0;j<options.length;j++){if(options[j].value==value){options[j].selected=true;matched=true;break;}}
if(!matched)
break;}}},beginDate:function(){var begin=this.getValue("rentBeginDate")+" "+this.getValue("rentBeginTime");var begin_date=Date.parse(begin);return begin_date;},endDate:function(){var end=this.getValue("rentEndDate")+" "+this.getValue("rentEndTime");var end_date=Date.parse(end);return end_date;}};YAHOO.register("vmbed_rent_form",YAHOO.vmbed.widget.RentForm,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Chooser=function(id,userConfig){this.id=id;this.init(userConfig);};var Chooser=YAHOO.vmbed.widget.Chooser,Session=YAHOO.vmbed.Session,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;Chooser.URL=YAHOO.vmbed.VMBed.AJAX_URL+"/queryMachines";Chooser.prototype={init:function(userConfig){this.searchingEvent=new YAHOO.util.CustomEvent("searchStarted",this);this.resultChangeEvent=new YAHOO.util.CustomEvent("resultChange",this);this.resultChangeEvent.subscribe(this.onResultsChange,this);Session.stateChangeEvent.subscribe(this.onStateChange,this,true);this.result=[];this.searchInitialised=false;this.queryRequestId=0;},render:function(appendToNode){var form=document.createElement('div');form.id=this.id+'_form';Dom.addClass(form,"vmbed-gf vmbed-gf-narrow vmbed-rent-chooser");appendToNode.appendChild(form);form.innerHTML='<fieldset> '+'  <legend>Starting</legend>'+'  <ol>'+'    <li>'+'      <label for="'+this.id+'_rentBeginTime">Time:</label>'+'      <select id="'+this.id+'_rentBeginTime"></select>'+'    </li>'+'    <li>'+'      <label for="'+this.id+'_rentBeginDate">Day:</label>'+'      <select id="'+this.id+'_rentBeginDate"></select>'+'    </li>'+'  </ol>'+'</fieldset>'+'<fieldset> '+'  <legend>Ending</legend>'+'  <ol>'+'    <li>'+'      <label for="'+this.id+'_rentEndTime">Time:</label>'+'      <select id="'+this.id+'_rentEndTime"></select>'+'    </li>'+'    <li>'+'      <label for="'+this.id+'_rentEndDate">Day:</label>'+'      <select id="'+this.id+'_rentEndDate"></select>'+'    </li>'+'  </ol>'+'</fieldset>'+'<fieldset> '+'  <legend>Filters</legend>'+'  <p id="'+this.id+'_rentFilters">Loading...'+'  </p>'+'</fieldset>'+'<fieldset class="submit">'+'  <input id="'+this.id+'_rentSearchSubmit" class="submit" type="submit" value="Search">'+'</fieldset>'+'<div id="'+this.id+'_rentLoading" class="vmbed-rent-loading">Loading...</div>';this.fillForm();this.submitButton=new YAHOO.widget.Button(this.id+"_rentSearchSubmit");this.submitButton.on("click",this.onSubmit,this,true);var dd=[this.id+"_rentBeginTime",this.id+"_rentBeginDate",this.id+"_rentEndTime",this.id+"_rentEndDate"];Event.addListener(dd,"change",this.onFormChange,this,true);},fillForm:function(){var now=new Date();now.add(5).minutes();now.setMinutes(Math.floor(now.getMinutes()/15)*15);now.setSeconds(0);var start={time:now.toString("HH:mm:ss"),date:now.toString("yyyy-MM-dd")};now.add(1).hour();var end={time:now.toString("HH:mm:ss"),date:now.toString("yyyy-MM-dd")};var rentBeginDate=Dom.get(this.id+"_rentBeginDate");var rentEndDate=Dom.get(this.id+"_rentEndDate");var dateSelects=[rentBeginDate,rentEndDate];var rentBeginTime=Dom.get(this.id+"_rentBeginTime");var rentEndTime=Dom.get(this.id+"_rentEndTime");var timeSelects=[rentBeginTime,rentEndTime];var day=Date.today();var days=31;do{var dayText=day.toString("ddd, MMM d")+day.getOrdinal();var dayValue=day.toString("yyyy-MM-dd");for(var i=0;i<dateSelects.length;i++){var select=dateSelects[i];var newEl=document.createElement("option");select.appendChild(newEl);newEl.value=dayValue;newEl.text=dayText;if((select==rentBeginDate)&&(newEl.value==start.date))
newEl.selected=true;if((select==rentEndDate)&&(newEl.value==end.date))
newEl.selected=true;}
day.add(1).day();}while(days-->0);var day=Date.today();var today=Date.today();do{var dayText=day.toString("h:mm tt");if(day.toString("h")=="0")
dayText=day.toString("12:mm tt");var dayValue=day.toString("HH:mm:ss");for(var i=0;i<timeSelects.length;i++){var select=timeSelects[i];var newEl=document.createElement("option");select.appendChild(newEl);newEl.value=dayValue;newEl.text=dayText;if((select==rentBeginTime)&&(newEl.value==start.time))
newEl.selected=true;if((select==rentEndTime)&&(newEl.value==end.time))
newEl.selected=true;}
day.add(15).minutes();}while(day.getDayName()==today.getDayName());},onFormChange:function(event){this.checkAndUpdateForm(event);this.setQueryTimeout();},onSubmit:function(){this.runQuery();},onResultsChange:function(type,args,self){if(YAHOO.lang.isObject(self.filter)&&!self.searchInitialised)
self.updateSearch();},onStateChange:function(){if(Session.state==Session.LOGGED_IN)
this.runQuery();},updateSearch:function(){this.updateFilters();this.searchInitialised=true;},updateFilters:function(){var el=Dom.get(this.id+"_rentFilters");el.innerHTML="";var filterIds=[];var newEl;for(var i=0;i<this.filter.length;i++){var filter=this.filter[i];filter.enabled=false;var display=filter.display.replace(/ /g,'&nbsp;');newEl=document.createElement("a");newEl.id=filter.id;newEl.href="#";newEl.innerHTML=display;el.appendChild(newEl);filterIds.push(newEl.id);if(i+1!=this.filter.length)
el.innerHTML+=', ';}
YAHOO.util.Event.addListener(filterIds,"click",this.onFilterClick,this,false);},onFilterClick:function(e,me){Event.preventDefault(e);me.toggleFilter(this);},toggleFilter:function(el){for(var i=0;i<this.filter.length;i++){var filter=this.filter[i];if(filter.id!=el.id)
continue;filter.enabled=!filter.enabled;if(filter.enabled)
el.style["fontWeight"]="bold";else
el.style["fontWeight"]="normal";this.setQueryTimeout();break;}},getValue:function(paramName){return Dom.get(this.id+"_"+paramName).value;},getText:function(paramName){var el=Dom.get(this.id+"_"+paramName);var index=el.selectedIndex;var option=el.options[index];return option.text;},getSelect:function(paramName){var el=Dom.get(this.id+"_"+paramName);return el;},runQuery:function(){this.clearQueryTimeout();this.setLoading();this.searchingEvent.fire();this.queryRequestId++;var data="requestId="+this.queryRequestId;var tzo=new Date().getTimezoneOffset();data+="&tzo="+tzo;if(!this.searchInitialised)
data+="&loadFilters=1";var params=["rentBeginTime","rentBeginDate","rentEndTime","rentEndDate"];for(var i=0;i<params.length;i++){var el=Dom.get(this.id+"_"+params[i]);if(el&&el.value)
data+="&"+params[i]+"="+el.value;}
if(this.filter){for(var i=0;i<this.filter.length;i++){var filter=this.filter[i];if(filter.enabled)
data+="&rentFilter="+filter.id;}}
this.request=YAHOO.util.Connect.asyncRequest
('POST',Chooser.URL,{success:this.queryResponseFn,failure:this.queryResponseFn,timeout:10000,scope:this},data);return true;},queryResponseFn:function(response){this.cancelLoading();var data;var error;try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error.";}
if(!YAHOO.lang.isObject(data)){error="Data error.";}
if(error){this.failureReason=error;this.result=[];if(Session.is_unit_test)
throw new Error(error);this.resultChangeEvent.fire();}
else if(this.queryRequestId!=data.requestId){}
else{if(data.failureReason){this.failureReason=data.failureReason;this.result=[];}
else{this.failureReason="";this.result=data.result;}
if(!this.searchInitialised){this.filter=data.filter;}
this.resultChangeEvent.fire();}
return true;},setLoading:function(){Dom.setStyle(this.id+"_rentLoading","display","block");},cancelLoading:function(){Dom.setStyle(this.id+"_rentLoading","display","none");},setQueryTimeout:function(){if(this.queryTimeout)
clearTimeout(this.queryTimeout);var self=this;this.queryTimeout=setTimeout(function(){self.runQuery();},2000);},clearQueryTimeout:function(){if(this.queryTimeout)
clearTimeout(this.queryTimeout);this.queryTimeout=false;}};YAHOO.lang.augmentProto(YAHOO.vmbed.widget.Chooser,YAHOO.vmbed.widget.RentForm);YAHOO.register("vmbed_chooser",YAHOO.vmbed.widget.Chooser,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.RentIt=function(machine,parms){this.machine=machine;this.parms=parms;this.reservationFailedEvent=new YAHOO.util.CustomEvent("vmbed_reservation_failed",this);this.reservationSuccessEvent=new YAHOO.util.CustomEvent("vmbed_reservation_success",this);};var RentIt=YAHOO.vmbed.widget.RentIt,VMBed=YAHOO.vmbed.VMBed,Session=YAHOO.vmbed.Session,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;RentIt.URL=YAHOO.vmbed.VMBed.AJAX_URL+"/rentMachine";RentIt.prototype={render:function(){var dialog=new YAHOO.widget.SimpleDialog("rentit",{width:"220px",fixedcenter:true,visible:true,modal:true});dialog.rentit=this;var makeWarning=function(){dialog.cfg.queueProperty("buttons",[{text:"Ok",handler:function(){this.hide()},isDefault:true}]);dialog.cfg.setProperty("icon",YAHOO.widget.SimpleDialog.ICON_WARN);};if(Session.isNewUser()){dialog.setHeader("Sign up");dialog.setBody("<p>You need to sign up for a VMbed account in order to reserve machines.</p>");makeWarning();}
else if(Session.state!=Session.LOGGED_IN){dialog.setHeader("Login");dialog.setBody("<p>You need to log in to your VMbed account in order to reserve machines.</p>");makeWarning();}
else if(!Session.user.IS_VERIFIED){dialog.setHeader("Verify your email address");dialog.setBody("<p>We need to have a verified email address from you before you can rent a machine. Please check the email account that you used when signing up and follow the instructions in the email from VMbed. If you have not received an email please <a href=\"?page/contact\">contact us</a>.</p>");makeWarning();}
else if(!Session.user.SUBSCRIBED_OK&&(Session.user.credit<=0)){dialog.setHeader("Your subscription is not complete");dialog.setBody("<p>You need to complete your subscription before you can rent machines. If you believe your subscription should already be complete, please <a href=\"?page/contact\">contact us</a>.</p>");makeWarning();}
else if(Session.user.credit<this.machine.fullCost){dialog.setHeader("Insufficient credit");dialog.setBody("<p>You do not have enough credit to rent this machine for this length of time.</p>");makeWarning();}
else{dialog.setHeader("Verify reservation:");dialog.setBody("<p>You wish to reserve:</p>"+"<ul><li>"+this.machine.name+" "+"<li>Starting: "+this.parms.getText("rentBeginTime")+" on "+this.parms.getText("rentBeginDate")+" "+"<li>Ending: "+this.parms.getText("rentEndTime")+" on "+this.parms.getText("rentEndDate")+" "+"<li>Total Cost: $"+this.machine.fullCost.toFixed(2)+"</ul>"+"<p>Is this correct?</p>");dialog.cfg.queueProperty("buttons",[{text:"Yes",handler:function(){this.hide();var self=this;setTimeout(function(){self.destroy();},5000);this.rentit.rent();},isDefault:true},{text:"Cancel",handler:function(){var self=this;setTimeout(function(){self.destroy();},5000);this.hide();}}]);dialog.cfg.queueProperty("width","320px");}
dialog.render(document.body);dialog.show();},rent:function(){var dialog=new YAHOO.widget.SimpleDialog("rent",{width:"220px",effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:1},fixedcenter:true,visible:true,modal:true});dialog.setHeader("Reserving...");dialog.cfg.queueProperty("buttons",[{text:"Ok",handler:function(){this.hide();var self=this;setTimeout(function(){self.destroy();},5000);},isDefault:true}]);dialog.render(document.body);dialog.show();var data="machineId="+this.machine.id+"&"+"rentBeginTime="+this.parms.getValue("rentBeginTime")+"&"+"rentBeginDate="+this.parms.getValue("rentBeginDate")+"&"+"rentEndTime="+this.parms.getValue("rentEndTime")+"&"+"rentEndDate="+this.parms.getValue("rentEndDate");var tzo=new Date().getTimezoneOffset();data+="&tzo="+tzo;this.request=YAHOO.util.Connect.asyncRequest
('POST',RentIt.URL,{success:this.rentResponseFn,failure:this.rentResponseFn,timeout:10000,scope:this},data);this.statusDialog=dialog;return true;},rentResponseFn:function(response){var data;var error;try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error";}
if(YAHOO.lang.isObject(data)&&data.failureReason){error=data.failureReason;}
if(!YAHOO.lang.isObject(data)){error="Data error";}
dialog=this.statusDialog;if(error){dialog.setHeader("Reservation failed.");dialog.setBody("<p>Your reservation could not be completed: "+error+" If you continue to have problems making reservations, please <a href=\"?page/contact\">contact us</a>.</p>");dialog.cfg.setProperty("icon",YAHOO.widget.SimpleDialog.ICON_WARN);this.reservationFailedEvent.fire(this.machine,error);}
else{dialog.setHeader("Reserved.");dialog.setBody("<p>Your reservation for "+this.machine.name+" completed successfully.</p>");this.reservationSuccessEvent.fire(this.machine);VMBed.machineRentedEvent.fire(this.machine);}
return true;}};YAHOO.register("vmbed_rentit",YAHOO.vmbed.widget.RentIt,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Availability=function(userConfig){this.id=userConfig.id;this.machine=userConfig.machine;this.cellPixelWidth=32;this.timePixelWidth=240;var today=Date.today();var first=today.moveToFirstDayOfMonth();this.month=today;this.monthDisplayedOffset=0;this.init();};var Availability=YAHOO.vmbed.widget.Availability,ErrorCodes=YAHOO.vmbed.ErrorCodes,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;Availability.QUERY_URL=YAHOO.vmbed.VMBed.AJAX_URL+"/queryMachine";Availability.CHECK_URL=YAHOO.vmbed.VMBed.AJAX_URL+"/rentMachine";Availability.prototype={init:function(){var panel=new YAHOO.widget.Panel("availability",{width:"470px",visible:true,modal:true});panel.setHeader("Availability for "+this.machine.name);panel.setBody("");panel.render(document.body);this.panel=panel;this.drawRHS(panel.body);this.drawPicker(panel.body);this.fillMonth();this.fillForm();this.updateMonthSelector();this.selectMonthStart();this.getMachineAvailability();this.panel.center();panel.show();return true;},drawPicker:function(to){var picker=document.createElement('div');Dom.addClass(picker,"vmbed-availability-picker");to.appendChild(picker);this.drawCalander(picker);this.drawTime(picker);},drawCalander:function(to){var cal=document.createElement('div');Dom.addClass(cal,"vmbed-availability-cal");to.appendChild(cal);this.cal=cal;this.drawMonthSelector();this.drawGrid();},drawMonthSelector:function(){var cal=this.cal;var msel=document.createElement('div');msel.id=this.id+'_msel';Dom.addClass(msel,"vmbed-availability-msel");cal.appendChild(msel);msel.innerHTML="<div id=\""+this.id+"_msel_prev\" class=\"prev link\">&lt;&lt;&lt;&lt;</div>"+"<span id=\""+this.id+'_msel_month'+"\">&nbsp;</span>"+"<div id=\""+this.id+"_msel_next\" class=\"next link\">&gt;&gt;&gt;&gt;</div>";Event.on(this.id+"_msel_next","click",this.onClickNextMonth,this,this);Event.on(this.id+"_msel_prev","click",this.onClickPrevMonth,this,this);},drawGrid:function(){var cal=this.cal;var grid=document.createElement('div');grid.id=this.id+'_grid';Dom.addClass(grid,"vmbed-availability-grid");cal.appendChild(grid);var days=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var heading=document.createElement('div');heading.id=this.id+'_head_'+i;Dom.addClass(heading,"head");grid.appendChild(heading);for(var j=0;j<7;j++){var cell=document.createElement('div');cell.id=this.id+'_head_cell_'+j;Dom.addClass(cell,"cell");heading.appendChild(cell);cell.innerHTML=days[j];if(j==6)
Dom.addClass(cell,"last");}
for(var i=0;i<6;i++){var row=document.createElement('div');row.id=this.id+'_row_'+i;Dom.addClass(row,"row");grid.appendChild(row);for(var j=0;j<7;j++){var cell=document.createElement('div');cell.id=this.id+'_row_cell_'+i+'_'+j;Dom.addClass(cell,"cell");row.appendChild(cell);if(j==6)
Dom.addClass(cell,"last");if(i==5)
Dom.addClass(cell,"lastRow");Event.on(cell.id,"click",this.onCellClick,cell.id,this);}}
this.grid=grid;},drawTime:function(to){var time=document.createElement('div');time.id=this.id+'_time';Dom.addClass(time,"vmbed-availability-time");to.appendChild(time);this.timeDisplay=time;var stat=document.createElement('div');Dom.addClass(stat,"free");stat.style.width="60px";time.appendChild(stat);stat=document.createElement('div');Dom.addClass(stat,"taken");stat.style.width="42px";time.appendChild(stat);stat=document.createElement('div');Dom.addClass(stat,"free");stat.style.width="28px";time.appendChild(stat);stat=document.createElement('div');Dom.addClass(stat,"taken");stat.style.width="40px";time.appendChild(stat);stat=document.createElement('div');Dom.addClass(stat,"free");stat.style.width="70px";time.appendChild(stat);},drawRHS:function(to){var rhs=document.createElement('div');rhs.id=this.id+'_rhs';Dom.addClass(rhs,"vmbed-availability-rhs");to.appendChild(rhs);this.drawForm(rhs);this.drawStatus(rhs);},drawForm:function(to){var form=document.createElement('div');form.id=this.id+'_form';Dom.addClass(form,"vmbed-gf vmbed-gf-narrow vmbed-availability-form");to.appendChild(form);form.innerHTML='<fieldset> '+'  <legend>Starting</legend>'+'  <ol>'+'    <li>'+'      <label for="'+this.id+'_rentBeginTime">Time:</label>'+'      <select id="'+this.id+'_rentBeginTime"></select>'+'    </li>'+'    <li>'+'      <label for="'+this.id+'_rentBeginDate">Day:</label>'+'      <select id="'+this.id+'_rentBeginDate"></select>'+'    </li>'+'  </ol>'+'</fieldset>'+'<fieldset> '+'  <legend>Ending</legend>'+'  <ol>'+'    <li>'+'      <label for="'+this.id+'_rentEndTime">Time:</label>'+'      <select id="'+this.id+'_rentEndTime"></select>'+'    </li>'+'    <li>'+'      <label for="'+this.id+'_rentEndDate">Day:</label>'+'      <select id="'+this.id+'_rentEndDate"></select>'+'    </li>'+'  </ol>'+'</fieldset>'+'<fieldset class="submit">'+'  <input id="'+this.id+'_rentit" class="submit" type="submit" value="Rent">'+'</fieldset>';this.rentButton=new YAHOO.widget.Button(this.id+"_rentit");this.rentButton.on("click",this.onRentClick,this,true);this.rentButton.set("disabled",true);var dd=[this.id+"_rentBeginTime",this.id+"_rentBeginDate",this.id+"_rentEndTime",this.id+"_rentEndDate"];Event.addListener(dd,"change",this.onFormChange,this,true);return true;},drawStatus:function(to){var status=document.createElement('div');Dom.addClass(status,"vmbed-availability-status");status.innerHTML="&nbsp;";to.appendChild(status);this.status=status;},onRentClick:function(){var rentit=new YAHOO.vmbed.widget.RentIt(this.machine,this);rentit.render();rentit.reservationSuccessEvent.subscribe(this.onReservationSuccess,this);},onReservationSuccess:function(type,args,me){me.panel.destroy();},getValue:function(paramName){return Dom.get(this.id+"_"+paramName).value;},getText:function(paramName){var el=Dom.get(this.id+"_"+paramName);var index=el.selectedIndex;var option=el.options[index];return option.text;},getSelect:function(paramName){var el=Dom.get(this.id+"_"+paramName);return el;},fillMonth:function(){var first=this.month.clone().moveToFirstDayOfMonth();var startCellNumber=Date.getDayNumberFromName(first.getDayName());var endCellNumber=startCellNumber+Date.getDaysInMonth(first.getFullYear(),first.getMonth())-1;this.dayCells=[];for(var i=0;i<6;i++){for(var j=0;j<7;j++){var cellNumber=(i*7)+j;var cell=Dom.get(this.id+'_row_cell_'+i+'_'+j);if((cellNumber<startCellNumber)||(cellNumber>endCellNumber)){cell.innerHTML="";Dom.addClass(cell,"nonday");}
else{cell.innerHTML="<div class=\"day\">"+(1+cellNumber-startCellNumber)+"</div>";Dom.removeClass(cell,"nonday");this.dayCells.push(cell);}}}},onCellClick:function(event,cellId){var cell=Dom.get(cellId);for(var i=0;i<this.dayCells.length;i++){if(this.dayCells[i].id==cell.id){this.selectDay(cell,null);break;}}},selectDay:function(cell,day){if(!cell){cell=this.dayCells[day-1];}
if(!day){var dayNode=cell.firstChild;day=dayNode.innerHTML;}
if(this.selectedCell)
Dom.removeClass(this.selectedCell,"selected");Dom.addClass(cell,"selected");this.selectedCell=cell;this.selectedDay=day;var rentBeginDate=Dom.get(this.id+"_rentBeginDate");var rentEndDate=Dom.get(this.id+"_rentEndDate");var dateSelects=[rentBeginDate,rentEndDate];for(var i=0;i<dateSelects.length;i++){var select=dateSelects[i];var options=select.childNodes;for(var j=0;j<options.length;j++){option=options[j];if(new RegExp('-'+day+'$').test(option.value)){option.selected=true;break;}}}
var select=Dom.get(this.id+"_rentBeginTime")
select.firstChild.selected=true;var select=Dom.get(this.id+"_rentEndTime")
select.firstChild.selected=true;if(this.dailyUsageMap)
this.updateTimeDisplay(day);},updateTimeDisplay:function(day){var time=this.timeDisplay;while(time.lastChild)
time.removeChild(time.lastChild);var month=this.month.clone().moveToFirstDayOfMonth();month.add(day-1).day();var date=month.toString("yyyy-MM-dd");var dailyUsage=this.dailyUsageMap[date];var allFree=[];for(var k=0;k<dailyUsage.length;k++){var usage=dailyUsage[k];var state=document.createElement('div');state.id=this.id+"_time_"+k;Dom.addClass(state,"state");Dom.addClass(state,usage.state);state.style.width=usage.timePixels+"px";time.appendChild(state);if(usage.state=="free"){Event.on(state.id,"click",this.onTimeClick,usage,this);allFree.push(usage);}}
if(allFree.length>0){var index=Math.floor((allFree.length-1)/2);this.selectTime(allFree[index]);}},onTimeClick:function(event,usage){this.selectTime(usage);},selectTime:function(usage){var start=usage.start.clone();start.setMinutes(Math.ceil(start.getMinutes()/15)*15);var startText=start.toString("h:mm tt");if(start.toString("h")=="0")
startText=start.toString("12:mm tt");var end=usage.end.clone();end.setMinutes(Math.floor(end.getMinutes()/15)*15);var endText=end.toString("h:mm tt");if(end.toString("h")=="0")
endText=end.toString("12:mm tt");var select=Dom.get(this.id+"_rentBeginTime")
var options=select.childNodes;for(var j=0;j<options.length;j++){if(options[j].text==startText){options[j].selected=true;break;}}
var select=Dom.get(this.id+"_rentEndTime")
var options=select.childNodes;for(var j=0;j<options.length;j++){if(options[j].text==endText){options[j].selected=true;break;}}
var startValue=start.toString("yyyy-MM-dd");var select=Dom.get(this.id+"_rentBeginDate");var options=select.childNodes;for(var j=0;j<options.length;j++){if(options[j].value==startValue){options[j].selected=true;break;}}
var endValue=end.toString("yyyy-MM-dd");var select=Dom.get(this.id+"_rentEndDate");var options=select.childNodes;for(var j=0;j<options.length;j++){if(options[j].value==endValue){options[j].selected=true;break;}}
this.onFormChange();},fillForm:function(){var month;if(this.monthDisplayedOffset==0){month=Date.today();}
else{month=this.month;}
var day=month.clone();var rentBeginDate=Dom.get(this.id+"_rentBeginDate");var rentEndDate=Dom.get(this.id+"_rentEndDate");var dateSelects=[rentBeginDate,rentEndDate];var rentBeginTime=Dom.get(this.id+"_rentBeginTime");var rentEndTime=Dom.get(this.id+"_rentEndTime");var timeSelects=[rentBeginTime,rentEndTime];for(var i=0;i<dateSelects.length;i++){var select=dateSelects[i];while(select.lastChild)
select.removeChild(select.lastChild);}
do{var dayText=day.toString("ddd, MMM d")+day.getOrdinal();var dayValue=day.toString("yyyy-MM-dd");for(var i=0;i<dateSelects.length;i++){var select=dateSelects[i];var newEl=document.createElement("option");select.appendChild(newEl);newEl.value=dayValue;newEl.text=dayText;}
day.add(1).day();}while((day.getMonth()==month.getMonth())||(day.getDate()<5));if(!rentBeginTime.childNodes.length){var day=month.clone().clearTime();do{var dayText=day.toString("h:mm tt");if(day.toString("h")=="0")
dayText=day.toString("12:mm tt");var dayValue=day.toString("HH:mm:ss");for(var i=0;i<timeSelects.length;i++){var select=timeSelects[i];var newEl=document.createElement("option");select.appendChild(newEl);newEl.value=dayValue;newEl.text=dayText;}
day.add(15).minutes();}while(day.getDayName()==month.getDayName());}},updateMonthSelector:function(){var month=Dom.get(this.id+"_msel_month");month.innerHTML=this.month.getMonthName();var prevLink=Dom.get(this.id+"_msel_prev");var nextLink=Dom.get(this.id+"_msel_next");var prevMonth=this.month.clone().add(-1).month();var nextMonth=this.month.clone().add(1).month();prevLink.innerHTML="&lt;&nbsp;"+prevMonth.getMonthName();nextLink.innerHTML=nextMonth.getMonthName()+"&nbsp;&gt;";;if(this.monthDisplayedOffset==0){Dom.removeClass(prevLink,"active");Dom.addClass(prevLink,"inactive");}
else{Dom.removeClass(prevLink,"inactive");Dom.addClass(prevLink,"active");}
if(this.monthDisplayedOffset==2){Dom.removeClass(nextLink,"active");Dom.addClass(nextLink,"inactive");}
else{Dom.removeClass(nextLink,"inactive");Dom.addClass(nextLink,"active");}},onClickPrevMonth:function(){if(this.monthDisplayedOffset==0)
return true;this.monthDisplayedOffset--;this.month.add(-1).month();this.updateMonthSelector();this.fillMonth();this.fillForm();this.drawMonthlyUsage();this.selectMonthStart();},onClickNextMonth:function(){if(this.monthDisplayedOffset==2)
return true;this.monthDisplayedOffset++;this.month.add(1).month();this.updateMonthSelector();this.fillMonth();this.fillForm();this.drawMonthlyUsage();this.selectMonthStart();},selectMonthStart:function(){var day;if(this.monthDisplayedOffset==0){day=Date.today().getDate();}
else{day=1;}
this.selectDay(null,day);},getMachineAvailability:function(){var data="machineId="+this.machine.id;var tzo=new Date().getTimezoneOffset();data+="&tzo="+tzo;this.request=YAHOO.util.Connect.asyncRequest
('POST',Availability.QUERY_URL,{success:this.availabilityResponseFn,failure:this.availabilityResponseFn,timeout:10000,scope:this},data);return true;},availabilityResponseFn:function(response){var data;var error;try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error";}
if(YAHOO.lang.isObject(data)&&data.failureReason){error=ErrorCodes.toString(data.failureReason);}
if(!YAHOO.lang.isObject(data)){error="Data error";}
if(error){throw new Error("Error getting machine availability: "+error);}
else{this.machine=new YAHOO.vmbed.Machine(data.machine.name,data.machine);this.updateDailyAvailability();this.drawMonthlyUsage();if(this.selectedDay)
this.updateTimeDisplay(this.selectedDay);}
return true;},updateDailyAvailability:function(){var now=new Date();var day=Date.today().moveToFirstDayOfMonth();var first=day.clone();var usage_list=[{state:"past",start:first}];for(var i=0;i<this.machine.availability.length;i++){var usage=this.machine.availability[i];var date;if(i==0){if(usage.time!="now"||usage.day!="now"){throw new Error("Expect the first point to be now");}
date=now.clone();}
else{date=Date.parse(usage.day+" "+usage.time);}
usage.start=date;usage_list.push(usage);}
for(var i=0;i<usage_list.length-1;i++){usage_list[i].end=usage_list[i+1].start;}
usage_list[usage_list.length-1].end=first.clone().add(100).days();this.dailyUsageMap={};var count=0;while(count<93){var dayStarts=day.clone();var dayEnds=day.clone().add(1).day();var this_usage=[];for(var i=0;i<usage_list.length;i++){var usage=usage_list[i];if(usage.used)
continue;if((usage.start.compareTo(dayStarts)<=0)&&(usage.end.compareTo(dayStarts)>=0)&&(usage.end.compareTo(dayEnds)<=0)){this_usage.push({state:usage.state,start:dayStarts.clone(),end:usage.end.clone()});usage.used=true;}
else if((usage.start.compareTo(dayStarts)>=0)&&(usage.end.compareTo(dayEnds)<=0)){this_usage.push({state:usage.state,start:usage.start.clone(),end:usage.end.clone()});usage.used=true;}
else if((usage.start.compareTo(dayEnds)<=0)&&(usage.start.compareTo(dayStarts)>=0)){this_usage.push({state:usage.state,start:usage.start.clone(),end:dayEnds.clone()});}
else if((usage.start.compareTo(dayStarts)<0)&&(usage.end.compareTo(dayEnds)>0)){this_usage.push({state:usage.state,start:dayStarts.clone(),end:dayEnds.clone()});}}
this.dailyUsageMap[day.toString("yyyy-MM-dd")]=this_usage;day.add(1).day();count++;}
var day_ms=24*60*60*1000;for(var day in this.dailyUsageMap){var this_usage=this.dailyUsageMap[day];var cellTotalPixels=0;var timeTotalPixels=0;for(var i=0;i<this_usage.length;i++){var usage=this_usage[i];var ms=usage.end-usage.start;usage.cellPixels=Math.round(this.cellPixelWidth*(ms/day_ms));usage.timePixels=Math.round(this.timePixelWidth*(ms/day_ms));cellTotalPixels+=usage.cellPixels;timeTotalPixels+=usage.timePixels;}
this_usage[this_usage.length-1].cellPixels+=this.cellPixelWidth-cellTotalPixels;this_usage[this_usage.length-1].timePixels+=this.timePixelWidth-timeTotalPixels;}},drawMonthlyUsage:function(){var first=this.month.clone().moveToFirstDayOfMonth();var startCellNumber=Date.getDayNumberFromName(first.getDayName());var endCellNumber=startCellNumber+Date.getDaysInMonth(first.getFullYear(),first.getMonth())-1;var day=first;for(var i=0;i<6;i++){for(var j=0;j<7;j++){var cellNumber=(i*7)+j;if((cellNumber>=startCellNumber)&&(cellNumber<=endCellNumber)){var cell=Dom.get(this.id+'_row_cell_'+i+'_'+j);var dailyUsage=this.dailyUsageMap[day.toString("yyyy-MM-dd")];for(var k=0;k<dailyUsage.length;k++){var usage=dailyUsage[k];var state=document.createElement('div');Dom.addClass(state,"state");Dom.addClass(state,usage.state);state.style.width=usage.cellPixels+"px";cell.appendChild(state);}
day.add(1).day();}}}},onFormChange:function(event){if(event)
this.checkAndUpdateForm(event)
this.rentButton.set("disabled",true);this.checkParms();},checkParms:function(){this.status.innerHTML="Calculating cost...";var data="machineId="+this.machine.id+"&"+"rentBeginTime="+this.getValue("rentBeginTime")+"&"+"rentBeginDate="+this.getValue("rentBeginDate")+"&"+"rentEndTime="+this.getValue("rentEndTime")+"&"+"rentEndDate="+this.getValue("rentEndDate");var tzo=new Date().getTimezoneOffset();data+="&tzo="+tzo;data+="&check=1";this.request=YAHOO.util.Connect.asyncRequest
('POST',Availability.CHECK_URL,{success:this.checkResponseFn,failure:this.checkResponseFn,timeout:10000,scope:this},data);return true;},checkResponseFn:function(response){var data;var error;try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error";}
if(YAHOO.lang.isObject(data)&&data.failureReason){error=ErrorCodes.toString(data.failureReason);}
if(!YAHOO.lang.isObject(data)){error="Data error";}
if(error){this.status.innerHTML=error;}
else{this.machine.fullCost=data.machine.fullCost;this.status.innerHTML="Total cost: $"+this.machine.fullCost.toFixed(2);this.rentButton.set("disabled",false);}
return true;}};YAHOO.lang.augmentProto(YAHOO.vmbed.widget.Availability,YAHOO.vmbed.widget.RentForm);YAHOO.register("vmbed_availability",YAHOO.vmbed.widget.Availability,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.SaveMachine=function(userConfig){this.machine=userConfig.machine;this.save();};var SaveMachine=YAHOO.vmbed.widget.SaveMachine,VMBed=YAHOO.vmbed.VMBed,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;SaveMachine.URL=YAHOO.vmbed.VMBed.AJAX_URL+"/saveMachine";SaveMachine.prototype={save:function(){var dialog=new YAHOO.widget.SimpleDialog("save",{width:"220px",fixedcenter:true,visible:true,modal:true});dialog.setHeader("Saving...");dialog.cfg.queueProperty("buttons",[{text:"Ok",handler:dialog.destroy,isDefault:true}]);dialog.render(document.body);dialog.show();var data="machineId="+this.machine.id;var tzo=new Date().getTimezoneOffset();data+="&tzo="+tzo;this.request=YAHOO.util.Connect.asyncRequest
('POST',SaveMachine.URL,{success:this.saveResponseFn,failure:this.saveResponseFn,timeout:10000,scope:this},data);this.statusDialog=dialog;return true;},saveResponseFn:function(response){var data;var error;try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error";}
if(YAHOO.lang.isObject(data)&&data.failureReason){error=data.failureReason;}
if(!YAHOO.lang.isObject(data)){error="Data error";}
dialog=this.statusDialog;if(error){dialog.setHeader("Save failed.");dialog.setBody('<p>'+this.machine.name+" could not be saved: "+error+"</p>");dialog.cfg.setProperty("icon",YAHOO.widget.SimpleDialog.ICON_WARN);this.machine.saveFailedEvent.fire(error);}
else{dialog.setHeader(this.machine.name+" saved.");dialog.setBody('<p>'+this.machine.name+" will be saved until you choose to delete it. "+"The charge for storing this machine is "+this.machine.storageCharge.toFixed(2)+"/week.</p>");this.machine.saveSuccessEvent.fire();VMBed.machineSavedEvent.fire(this.machine);}
return true;}};YAHOO.register("vmbed_save_machine",YAHOO.vmbed.widget.SaveMachine,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.DeleteMachine=function(userConfig){this.machine=userConfig.machine;this.deleteMachine();};var DeleteMachine=YAHOO.vmbed.widget.DeleteMachine,VMBed=YAHOO.vmbed.VMBed,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;DeleteMachine.URL=YAHOO.vmbed.VMBed.AJAX_URL+"/deleteMachine";DeleteMachine.prototype={deleteMachine:function(){var dialog=new YAHOO.widget.SimpleDialog("delete",{width:"220px",fixedcenter:true,visible:true,modal:true});dialog.setHeader("Confirm Delete");dialog.setBody("<p>Are you sure you want to permanently delete "+this.machine.name+"?</p>");dialog.cfg.setProperty("icon",YAHOO.widget.SimpleDialog.ICON_WARN);var self=this;dialog.cfg.queueProperty("buttons",[{text:"Ok",handler:function(){self.sendDelete()},isDefault:true},{text:"Cancel",handler:function(){dialog.destroy()}}]);dialog.render(document.body);dialog.show();this.statusDialog=dialog;return true;},sendDelete:function(){var data="machineId="+this.machine.id;var tzo=new Date().getTimezoneOffset();data+="&tzo="+tzo;this.request=YAHOO.util.Connect.asyncRequest
('POST',DeleteMachine.URL,{success:this.deleteResponseFn,failure:this.deleteResponseFn,timeout:10000,scope:this},data);return true;},deleteResponseFn:function(response){var data;var error;try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error";}
if(YAHOO.lang.isObject(data)&&data.failureReason){error=data.failureReason;}
if(!YAHOO.lang.isObject(data)){error="Data error";}
dialog=this.statusDialog;if(error){dialog.setHeader("Delete failed.");dialog.setBody('<p>'+this.machine.name+" could not be deleted: "+error+"</p>");dialog.cfg.setProperty("icon",YAHOO.widget.SimpleDialog.ICON_WARN);this.machine.deleteFailedEvent.fire(error);}
else{dialog.setHeader(this.machine.name+" deleted.");dialog.setBody("<p>"+this.machine.name+" will be deleted within the next 24 hours. "+"You will no longer be charged for storing this machine.</p>");dialog.cfg.setProperty("icon",null);this.machine.deleteSuccessEvent.fire();VMBed.machineDeletedEvent.fire(this.machine);}
dialog.cfg.setProperty("buttons",[{text:"Ok",handler:function(){dialog.destroy()},isDefault:true}]);return true;}};YAHOO.register("vmbed_delete_machine",YAHOO.vmbed.widget.DeleteMachine,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.CancelBooking=function(userConfig){this.booking=userConfig.booking;this.cancel();};var CancelBooking=YAHOO.vmbed.widget.CancelBooking,VMBed=YAHOO.vmbed.VMBed,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;CancelBooking.URL=YAHOO.vmbed.VMBed.AJAX_URL+"/cancelBooking";CancelBooking.prototype={cancel:function(){var dialog=new YAHOO.widget.SimpleDialog("cancel",{width:"220px",effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:1},fixedcenter:true,visible:true,modal:true});dialog.setHeader("Canceling...");dialog.cfg.queueProperty("buttons",[{text:"Ok",handler:function(){this.hide();var self=this;setTimeout(function(){self.destroy();},5000);},isDefault:true}]);dialog.render(document.body);dialog.show();var data="bookingId="+this.booking.id;var tzo=new Date().getTimezoneOffset();data+="&tzo="+tzo;this.request=YAHOO.util.Connect.asyncRequest
('POST',CancelBooking.URL,{success:this.cancelResponseFn,failure:this.cancelResponseFn,timeout:10000,scope:this},data);this.statusDialog=dialog;return true;},cancelResponseFn:function(response){var data;var error;try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error";}
if(YAHOO.lang.isObject(data)&&data.failureReason){error=data.failureReason;}
if(!YAHOO.lang.isObject(data)){error="Data error";}
dialog=this.statusDialog;if(error){dialog.setHeader("Cancel failed.");dialog.setBody("<p>The booking could not be canceled: "+error+"</p>");dialog.cfg.setProperty("icon",YAHOO.widget.SimpleDialog.ICON_WARN);this.booking.cancelFailedEvent.fire(error);}
else{dialog.setHeader("Canceled.");dialog.setBody("<p>Because you canceled more than one hour before the "+"reservation start time your account will not be charged.</p>");this.booking.cancelSuccessEvent.fire();VMBed.bookingCanceledEvent.fire(this.machine);}
return true;}};YAHOO.register("vmbed_cancel_booking",YAHOO.vmbed.widget.CancelBooking,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.MachineMenu=function(userConfig){this.machine=userConfig.machine;this.forId=userConfig.forId;var me=this;YAHOO.util.Event.onContentReady(this.forId,function(){me.init();});};var Availability=YAHOO.vmbed.widget.Availability,MachineMenu=YAHOO.vmbed.widget.MachineMenu,SaveMachine=YAHOO.vmbed.widget.SaveMachine,DeleteMachine=YAHOO.vmbed.widget.DeleteMachine,Session=YAHOO.vmbed.Session,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;MachineMenu.menus={};MachineMenu.prototype={init:function(){if(Session.state==Session.LOGGED_IN)
this.activate();Session.stateChangeEvent.subscribe(this._onSessionChange,this);},_onSessionChange:function(type,args,me){me.onSessionChange();},onSessionChange:function(){if(Session.state==Session.LOGGED_IN)
this.activate();else
this.deactivate();},activate:function(){Dom.addClass(this.forId,"vmbed-mm");Event.on(this.forId,"mouseover",this.onMouseOver,this,true);Event.on(this.forId,"mouseout",this.onMouseOut,this,true);},deactivate:function(){Dom.removeClass(this.forId,"vmbed-mm");Event.removeListener(this.forId,"mouseover",this.onMouseOver);Event.removeListener(this.forId,"mouseout",this.onMouseOut);if(this.menu){this.menu.destroy();this.menu=null;}},onMouseOver:function(overEvent){if(this.popupTimeout){clearTimeout(this.popupTimeout);delete this.popupTimeout;}
if(YAHOO.env.ua.ie){this.popup(overEvent);}
else{var self=this;var copyEvent=overEvent;this.popupTimeout=setTimeout(function(){self.popup(copyEvent);delete this.popupTimeout;},500);}},onMouseOut:function(event){if(this.popupTimeout){clearTimeout(this.popupTimeout);delete this.popupTimeout;}
if(this.menu&&!this.popdownTimeout){var self=this;this.popdownTimeout=setTimeout(function(){self.menu.hide();delete self.popdownTimeout;},2500);}},popup:function(event){if(!this.menu){var menuId=this.forId+"_menu";if(Dom.get(menuId)){if(MachineMenu.menus[menuId]){MachineMenu.menus[menuId].destroy();delete MachineMenu.menus[menuId];}}
this.menu=new YAHOO.widget.ContextMenu(menuId,{trigger:this.forId,zIndex:20});this.menu.addItems([{text:"Find Availability...",onclick:{fn:this.onFindAvailability,scope:this}},{text:"Save",onclick:{fn:this.onSave,scope:this}},{text:"Delete",onclick:{fn:this.onDelete,scope:this}}]);this.saveItem=this.menu.getItem(1,0);this.deleteItem=this.menu.getItem(2,0);this.menu.setItemGroupTitle(this.machine.name,0);this.menu.render(document.body);MachineMenu.menus[menuId]=this.menu;this.menu._onTriggerContextMenu(event);if(Session.user&&this.machine.owner&&(Session.user.name==this.machine.owner.name)&&!this.machine.IS_ARCHIVED)
this.saveItem.cfg.setProperty("disabled",false);else
this.saveItem.cfg.setProperty("disabled",true);if(Session.user&&this.machine.owner&&(Session.user.name==this.machine.owner.name)&&this.machine.IS_ARCHIVED)
this.deleteItem.cfg.setProperty("disabled",false);else
this.deleteItem.cfg.setProperty("disabled",true);this.machine.saveSuccessEvent.subscribe(this._onSaveSuccess,this);this.machine.deleteSuccessEvent.subscribe(this._onDeleteSuccess,this);}
else{this.menu._onTriggerContextMenu(event);}},onFindAvailability:function(){new Availability({id:"availability",machine:this.machine});},onSave:function(){new SaveMachine({machine:this.machine});},_onSaveSuccess:function(type,args,self){self.onSaveSuccess(this);},onSaveSuccess:function(machine){if(this.menu){this.saveItem.cfg.setProperty("disabled",true);this.deleteItem.cfg.setProperty("disabled",false);}},onDelete:function(){new DeleteMachine({machine:this.machine});},_onDeleteSuccess:function(type,args,self){self.onDeleteSuccess(this);},onDeleteSuccess:function(machine){if(this.menu){this.saveItem.cfg.setProperty("disabled",false);this.deleteItem.cfg.setProperty("disabled",true);}},destroy:function(){if(this.menu)
this.menu.destroy();Event.purgeElement(this.forId);}};YAHOO.register("vmbed_machine_menu",YAHOO.vmbed.widget.MachineMenu,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.BookingMenu=function(userConfig){this.booking=userConfig.booking;this.forId=userConfig.forId;var me=this;YAHOO.util.Event.onContentReady(this.forId,function(){me.init();});};var BookingMenu=YAHOO.vmbed.widget.BookingMenu,CancelBooking=YAHOO.vmbed.widget.CancelBooking,Session=YAHOO.vmbed.Session,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;BookingMenu.menus={};BookingMenu.prototype={init:function(){if(Session.state==Session.LOGGED_IN)
this.activate();Session.stateChangeEvent.subscribe(this._onSessionChange,this);},_onSessionChange:function(type,args,me){me.onSessionChange();},onSessionChange:function(){if(Session.state==Session.LOGGED_IN)
this.activate();else
this.deactivate();},activate:function(){Dom.addClass(this.forId,"vmbed-mm");Event.on(this.forId,"mouseover",this.onMouseOver,this,true);Event.on(this.forId,"mouseout",this.onMouseOut,this,true);},deactivate:function(){Dom.removeClass(this.forId,"vmbed-mm");Event.removeListener(this.forId,"mouseover",this.onMouseOver);Event.removeListener(this.forId,"mouseout",this.onMouseOut);if(this.menu){this.menu.destroy();this.menu=null;}},onMouseOver:function(overEvent){if(this.popupTimeout){clearTimeout(this.popupTimeout);delete this.popupTimeout;}
if(YAHOO.env.ua.ie){this.popup(overEvent);}
else{var self=this;var copyEvent=overEvent;this.popupTimeout=setTimeout(function(){self.popup(copyEvent);delete this.popupTimeout;},500);}},onMouseOut:function(event){if(this.popupTimeout){clearTimeout(this.popupTimeout);delete this.popupTimeout;}
if(this.menu&&!this.popdownTimeout){var self=this;this.popdownTimeout=setTimeout(function(){self.menu.hide();delete self.popdownTimeout;},2500);}},popup:function(event){if(!this.menu){var menuId=this.forId+"_menu";if(Dom.get(menuId)){if(BookingMenu.menus[menuId]){BookingMenu.menus[menuId].destroy();delete BookingMenu.menus[menuId];}}
this.menu=new YAHOO.widget.ContextMenu(menuId,{trigger:this.forId,zIndex:20});this.menu.addItems([{text:"Cancel",onclick:{fn:this.onCancel,scope:this}}]);this.cancelItem=this.menu.getItem(0,0);this.menu.setItemGroupTitle(this.booking.machine.name,0);this.menu.render(document.body);BookingMenu.menus[menuId]=this.menu;this.menu._onTriggerContextMenu(event);if(this.booking)
this.cancelItem.cfg.setProperty("disabled",false);else
this.cancelItem.cfg.setProperty("disabled",true);}
else{this.menu._onTriggerContextMenu(event);}},onCancel:function(){new CancelBooking({booking:this.booking});},destroy:function(){if(this.menu)
this.menu.destroy();Event.purgeElement(this.forId);}};YAHOO.register("vmbed_booking_menu",YAHOO.vmbed.widget.BookingMenu,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Machine=function(id,userConfig){this.id=id;this.init(userConfig);};var Session=YAHOO.vmbed.Session,MachineMenu=YAHOO.vmbed.widget.MachineMenu,Machine=YAHOO.vmbed.widget.Machine,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;Machine.prototype={init:function(userConfig){if(userConfig.data){this.data=new YAHOO.vmbed.Machine(userConfig.data.name,userConfig.data);}
else{throw new Error("missing: data");}
this.chooser=userConfig.chooser;},render:function(appendToNode){var el=this.element=document.createElement('div');Dom.addClass(this.element,"vmbed-machine");appendToNode.appendChild(el);var ownership;if(this.data.owner&&Session.user&&(this.data.owner.name==Session.user.name)){Dom.addClass(this.element,"vmbed-machine-owned");ownership='your machine';}
else{Dom.addClass(this.element,"vmbed-machine-free");ownership='new machine';}
var c="<h3><span id=\""+this.id+"_title\">"+this.data.name+"</span> - "+ownership+"</h3>";c+='<div class="vmbed-machine-rhs">';c+='<p>'+this.data.os+'.</p><p>'+this.data.formattedTags+'</p>';c+='</div>';c+='<div class="vmbed-machine-lhs">';c+='<img src="'+this.data.imgSrc+'">';c+='<input id="'+this.id+'_rentit" type="submit" value="$'+this.data.rate.toFixed(2)+'/hr">';this.element.innerHTML=c;this.mm=new MachineMenu({machine:this.data,forId:this.id+"_title"});this.rentButton=new YAHOO.widget.Button(this.id+"_rentit");this.rentButton.on("click",this.onRentClick,this,true);if(this.data.busy){this.rentButton.set("disabled",true);this.rentButton.set("label","Busy");Dom.addClass(this.element,"vmbed-machine-busy");}
else{this.rentButtonTooltip=new YAHOO.widget.Tooltip(this.id+'_rentit_tt',{context:this.id+"_rentit",text:"Total reservation cost: $"+this.data.fullCost.toFixed(2)});}
return true;},onRentClick:function(){var rentit=new YAHOO.vmbed.widget.RentIt(this.data,this.chooser);rentit.render();},destroy:function(){if(this.mm)
this.mm.destroy();if(this.rentButtonTooltip)
this.rentButtonTooltip.destroy();if(this.rentButton)
this.rentButton.destroy();}};YAHOO.register("vmbed_machine_widget",YAHOO.vmbed.widget.Machine,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Machines=function(id,userConfig){this.id=id;this.init(userConfig);};var Machines=YAHOO.vmbed.widget.Machines,VMBed=YAHOO.vmbed.VMBed,Machine=YAHOO.vmbed.widget.Machine,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;Machines.prototype={init:function(userConfig){this.ready=false;if(userConfig.chooser){this.chooser=userConfig.chooser;this.chooser.resultChangeEvent.subscribe(this.onResultsChange,this,true);this.chooser.searchingEvent.subscribe(this.onSearching,this,true);}
else{throw new Error("missing: chooser");}
VMBed.machineRentedEvent.subscribe(this.onMachineEvent,this,true);VMBed.bookingCanceledEvent.subscribe(this.onMachineEvent,this,true);this.page=0;this.columns=2;var height=Dom.getViewportHeight();if(height)
this.rows=Math.floor((height-130)/118);if(!this.rows||this.rows<4)
this.rows=4;},onSearching:function(){this.clear();},onResultsChange:function(){if(this.ready){this.page=1;this.drawPage();}},onMachineEvent:function(){this.chooser.runQuery();},drawPage:function(){this._drawPage();},_drawPage:function(){this.clear();if(this.chooser.failureReason){var c='<div class="failure">';c+='<img src="images/dialog-warning.png">';c+='<p>'+this.chooser.failureReason+'</p>';c+='<div class="vmbed-clear"></div>';c+='</div>';this.element.innerHTML=c;this.chooser.cancelLoading();}
else if(this.chooser.result.length){var mPerPage=this.columns*this.rows;var start=(this.page-1)*mPerPage;this.lastRow=[];this._drawTile(start);}
else{var c='<div class="failure">';c+='<img src="images/dialog-warning.png">';c+='<p>No machines match your search criteria.</p>';c+='<div class="vmbed-clear"></div>';c+='</div>';this.element.innerHTML=c;this.chooser.cancelLoading();}},_drawTile:function(i){var machines=this.chooser.result;var mPerPage=this.columns*this.rows;var start=(this.page-1)*mPerPage;if((i<machines.length)&&(Math.floor((i-start)/this.columns)<this.rows)){var machine=machines[i];var column=i%this.columns;var args={data:machine,chooser:this.chooser};var machineWidget=new Machine(this.id+'_'+machine.name,args);machineWidget.render(this.element);this.machineWidgets.push(machineWidget);if(i>start&&!column){Dom.addClass(machineWidget.element,"vmbed-machine-row-start");}
if(column){Dom.addClass(machineWidget.element,"vmbed-machine-cell-next");}
if(i>=start+this.columns){Dom.addClass(machineWidget.element,"vmbed-machine-row-next");}
this.lastRow[column]=machineWidget;i++;this._drawTile(i);}
else{this.drawNext();this.chooser.cancelLoading();}},drawNext:function(){var mPerPage=this.columns*this.rows;var pages=Math.ceil(this.chooser.result.length/mPerPage);if(pages<=1)
return true;var links='';for(var page=1;page<=pages;page++){if(page==this.page){links+=page;}
else{links+='<a id="'+this.id+'_page_'+page+'"href="#">'+page+'</a>';}
if(page!=pages){links+=',&nbsp;';}}
var el=document.createElement('div');el.innerHTML=links;Dom.addClass(el,"vmbed-machine-links");this.element.appendChild(el);for(var page=1;page<=pages;page++){Event.purgeElement(this.id+"_page_"+page);Event.addListener(this.id+"_page_"+page,"click",this.onPageLinkClick,page,this);}
return true;},onPageLinkClick:function(e,page){this.page=page;this.drawPage();},render:function(appendToNode){var el=this.element=document.createElement('div');Dom.addClass(this.element,"vmbed-rent-results");appendToNode.appendChild(el);this.ready=true;},clear:function(){if(this.machineWidgets){for(var i=0;i<this.machineWidgets.length;i++){this.machineWidgets[i].destroy();}}
while(this.element.lastChild)
this.element.removeChild(this.element.lastChild);this.machineWidgets=[];}};YAHOO.register("vmbed_machines",YAHOO.vmbed.widget.Machines,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Rent=function(id,userConfig){this.id=id;this.init(userConfig);};var Rent=YAHOO.vmbed.widget.Rent,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;Rent.prototype={init:function(userConfig){var chooser=new YAHOO.vmbed.widget.Chooser("chooser",{parms:userConfig.parms});this.chooser=chooser;var machines=new YAHOO.vmbed.widget.Machines("results",{chooser:chooser,parms:userConfig.parms});this.machines=machines;},updateUserParms:function(parms){if(this.chooser.updateUserParms)
this.chooser.updateUserParms(parms);if(this.machines.updateUserParms)
this.machines.updateUserParms(parms);},render:function(appendToNode){this.chooser.render(appendToNode);this.machines.render(appendToNode);this.chooser.runQuery();}};YAHOO.register("vmbed_rent",YAHOO.vmbed.widget.Rent,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Subscribe=function(userConfig){this.container=userConfig.container;};var Subscribe=YAHOO.vmbed.widget.Subscribe,VMBed=YAHOO.vmbed.VMBed,Session=YAHOO.vmbed.Session,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;Subscribe.prototype={render:function(){Session.stateChangeEvent.subscribe(this.onSessionStateChange,this);this.queryPlans();return true;},onSessionStateChange:function(type,args,me){me.queryPlans();},queryPlans:function(){YAHOO.util.Connect.asyncRequest('POST',YAHOO.vmbed.VMBed.AJAX_URL+'/querySubscriptionPlans',{success:this.handleQueryResponse,failure:this.handleQueryResponse,timeout:10000,scope:this});return true;},handleQueryResponse:function(response){var el=Dom.get("subscribe-instructions");var error;var plans;if(!response||response.status!=200){error="Server error.";}
try{plans=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error.";}
if(error){el.innerHTML=error;return true;}
if(plans.failureReason){el.innerHTML=plans.failureReason;return true;}
this.plans=plans;this.drawState();return true;},drawState:function(){if(!this.plans||!this.plans.status){return true;}
this.helpTTdata=[];this.drawInstructions();this.drawCurrentPlan();this.drawAvailablePlans();if(this.helpTTwidgets){for(var i=0;i<this.helpTTwidgets.length;i++){this.helpTTwidgets[i].destroy();}}
this.helpTTwidgets=[];for(var i=0;i<this.helpTTdata.length;i++){this.helpTTwidgets.push(new YAHOO.widget.Tooltip(this.id+'-tt-id-'+i,this.helpTTdata[i]));}},drawInstructions:function(){var instructionsEl=Dom.get("subscribe-instructions");if(this.plans.status=='NOT_LOGGED_IN'){if(Session.isNewUser()){instructionsEl.innerHTML="You will need to sign up for a VMbed account before you can subscribe to one of the rental plans.";}
else{instructionsEl.innerHTML="You will need to log in to your VMbed account to view your subscription.";}}
else if(this.plans.status=='NOT_VERIFIED'){instructionsEl.innerHTML="You will need to verify your email address in order to choose a subscription plan.  "+"Check your email for a message from VMBed with instructions on how to complete the process.  "+"The email may have ended up in your spam folder.";}
else if(this.plans.status=='NEVER_SUBSCRIBED'){instructionsEl.innerHTML="Please choose one of the rental plans below.";}
else if(this.plans.status=='PENDING'){instructionsEl.innerHTML="Your subscription is pending. This status should be updated shortly. If it does not update within the next few minutes please <a href=\"?page/contact\">contact us</a>.";}
else if(this.plans.status=='CANCELED'){instructionsEl.innerHTML="Your subscription was canceled. Choose a new plan from the list below.";}
else if(this.plans.status=='SUBSCRIPTION_ERROR'){instructionsEl.innerHTML="There is a problem with your subscription. "+this.plans.subscriptionError;}
else{instructionsEl.innerHTML="";}
return true;},drawCurrentPlan:function(){var el=Dom.get("subscribe-current-plan");if(!this.plans||!this.plans.status||!this.plans.activeSubscription){el.innerHTML='<p>No plan.</p>';return true;}
var table=this.drawHeading(this.plans.activeSubscription.HAS_TRIAL,true,false);table+=this.drawRow(this.plans.activeSubscription,false);table=this._wrapTable(table);el.innerHTML=table;return true;},drawAvailablePlans:function(){var el=Dom.get("subscribe-available-plans");if(!this.plans.availableSubscriptions){el.innerHTML='<p>No plans available.</p>';return true;}
this.plans.availableHaveTrials=false;this.plans.availableHaveButtons=false;var roHelpIds=[];var rows=[];for(var i=0;i<this.plans.availableSubscriptions.length;i++){var sub=this.plans.availableSubscriptions[i];rows.push(this.drawRow(sub,true));}
var info="";if(this.plans.activeSubscription&&this.plans.availableHaveButtons){info="<p>You may change your existing plan without cancellation to one of these.</p>";}
var table=this.drawHeading(this.plans.availableHaveTrials,this.plans.availableHaveButtons,true);table+=rows.join("\n");table=this._wrapTable(table);el.innerHTML=info+table;return true;},drawRow:function(sub,available){var row='';row+=this._wrapCell(sub.name.replace(/ /g,'&nbsp;'));if(sub.trialPeriod&&sub.trialValue){row+=this._wrapCell('$'+sub.trialValue.toFixed(2)+" free credit for the first "+sub.trialPeriod+'.');if(available)
this.plans.availableHaveTrials=true;}
row+=this._wrapCell('<b>'+'$'+sub.cost.toFixed(2)+'</b>');row+=this._wrapCell('$'+(sub.value-sub.cost).toFixed(2));row+=this._wrapCell('<b>'+'$'+sub.value.toFixed(2)+'</b>');row+=this._wrapCell('$'+sub.rollover.toFixed(2));if(available&&sub.subscribeButtonHTML){row+=this._wrapCell(sub.subscribeButtonHTML);this.plans.availableHaveButtons=true;}
if(!available&&sub.cancelButtonHTML){row+=this._wrapCell(sub.cancelButtonHTML);}
return this._wrapRow(row);},drawHeading:function(hasTrials,hasButtons,showHelp){var heading="";heading+=this._wrapHdCell('Name');if(hasTrials){heading+=this._wrapHdCell('Free Trial!',showHelp,'Get this amount of free credit to try out VMbed with no obligation.');}
heading+=this._wrapHdCell('Cost',showHelp,'You will be charged this amount at the beginning of each monthly billing cycle.');heading+=this._wrapHdCell('+ Bonus!',showHelp,'VMbed gives you this bonus credit every month.');heading+=this._wrapHdCell('= Value',showHelp,'The credit added to your account every month.');heading+=this._wrapHdCell('Rollover',showHelp,'Any credit remaining at the end of your monthly<br>'+'billing cycle up to this amount will rollover to<br>'+'the next cycle.');if(hasButtons){heading+=this._wrapHdCell(' ');}
return this._wrapRow(heading);},_wrapTable:function(data){return'<table>'+data+'</table>';},_wrapRow:function(data){return'<tr>'+data+'</tr>';},_wrapCell:function(cellData){return'<td>'+cellData+'</td>';},_wrapHdCell:function(cellData,showHelp,helpText){cellData=cellData.replace(/ /g,'&nbsp;');if(showHelp&&helpText){var id=this.id+"-tt-"+this.helpTTdata.length;this.helpTTdata.push({context:id,text:helpText,zIndex:3});cellData+="&nbsp;&nbsp;<a href=\"#\" id=\""+id+"\">(?)</a>";}
return'<th>'+cellData+'</th>';}};YAHOO.register("vmbed_subscribe",YAHOO.vmbed.widget.Subscribe,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Topup=function(userConfig){this.id=userConfig.id;};var Topup=YAHOO.vmbed.widget.Topup,Session=YAHOO.vmbed.Session,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;Topup.prototype={init:function(){Event.onAvailable(this.id,this._onAvailable,this,true);Session.stateChangeEvent.subscribe(this._onSessionStateChange,this);this._queryTopups();},_queryTopups:function(){YAHOO.util.Connect.asyncRequest('POST',YAHOO.vmbed.VMBed.AJAX_URL+'/queryTopups',{success:this._onQueryResponse,failure:this._onQueryResponse,timeout:10000,scope:this});return true;},_onQueryResponse:function(response){var error;var options;if(!response||response.status!=200){error="Server error.";}
try{options=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error.";}
if(error){this.error=error;}
else if(options.failureReason){this.error=options.failureReason;return true;}
else{this.options=options;}
this._drawState();return true;},_onSessionStateChange:function(type,args,me){if(!this.options)
me._queryTopups();else
me._drawState();},_onAvailable:function(){this._drawState();},_drawState:function(){var el=Dom.get(this.id);if(!el)
return true;var reg=Dom.getRegion(el);if(!reg)
return true;if(this.error){el.innerHTML='<p>'+this.error+'</p>';return true;}
if(!this.options){el.innerHTML='<p>Loading options...</p>';return true;}
if(Session.state!=Session.LOGGED_IN){if(Session.isNewUser()){el.innerHTML="<p>You will need to sign up for a VMbed account before you can add credit.</p>";}
else{el.innerHTML="<p>You will need to log in first.</p>";}
return true;}
if(!Session.user||!Session.user.IS_VERIFIED){el.innerHTML="<p>You will need to verify your email address in order to add credit.  "+"Check your email for a message from VMBed with instructions on how to complete the process.  "+"The email may have ended up in your spam folder.<p>";return true;}
var rows=[];for(var i=0;i<this.options.length;i++){rows.push(this._drawRow(this.options[i]));}
var info="";var table=this._drawHeading();table+=rows.join("\n");table=this._wrapTable(table);el.innerHTML=info+table;return true;},_drawRow:function(option){var row='';row+=this._wrapCell(option.name.replace(/ /g,'&nbsp;'));row+=this._wrapCell('<b>'+'$'+option.amount.toFixed(2)+'</b>');row+=this._wrapCell(option.buynowButtonHTML);return this._wrapRow(row);},_drawHeading:function(){var heading="";heading+=this._wrapHdCell('Name');heading+=this._wrapHdCell('Amount');heading+=this._wrapHdCell(' ');return this._wrapRow(heading);},_wrapTable:function(data){return'<table>'+data+'</table>';},_wrapRow:function(data){return'<tr>'+data+'</tr>';},_wrapCell:function(cellData){return'<td>'+cellData+'</td>';},_wrapHdCell:function(cellData){cellData=cellData.replace(/ /g,'&nbsp;');return'<th>'+cellData+'</th>';}};YAHOO.register("vmbed_topup",YAHOO.vmbed.widget.Topup,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.OwnedMachines=function(userConfig){this.id=userConfig.id;};var MachineMenu=YAHOO.vmbed.widget.MachineMenu,OwnedMachines=YAHOO.vmbed.widget.OwnedMachines,Session=YAHOO.vmbed.Session,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;OwnedMachines.prototype={init:function(){Event.onAvailable(this.id,this._onAvailable,this,true);Session.stateChangeEvent.subscribe(this._onSessionStateChange,this);this._drawState();},_queryOwnedMachines:function(){var tzo=new Date().getTimezoneOffset();var data="tzo="+tzo;YAHOO.util.Connect.asyncRequest('POST',YAHOO.vmbed.VMBed.AJAX_URL+'/queryOwnedMachines',{success:this._onQueryResponse,failure:this._onQueryResponse,timeout:10000,scope:this},data);return true;},_onQueryResponse:function(response){var error;var data;if(!response||response.status!=200){error="Server error.";}
try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error.";}
if(error){this.error=error;}
else if(data.failureReason){this.error=data.failureReason;}
else{this.machines=[];for(var i=0;i<data.machines.length;i++){this.machines.push(new YAHOO.vmbed.Machine(data.machines[i].name,data.machines[i]));}
delete this.error;}
this._drawState();return true;},_onSessionStateChange:function(type,args,me){me._drawState();},_onAvailable:function(){this._drawState();},_drawState:function(){var el=Dom.get(this.id);if(!el)
return true;var reg=Dom.getRegion(el);if(!reg)
return true;if(Session.state!=Session.LOGGED_IN){if(Session.isNewUser()){el.innerHTML="<p>You will need to sign up for a VMbed account to save machines.</p>";}
else{el.innerHTML="<p>You will need to log in to view your saved machines.</p>";}
if(this.machines){for(var i=0;i<this.machines.length;i++){this.machines[i].saveSuccessEvent.unsubscribe(this._onSaveSuccess);}}
this.machines=null;return true;}
if(this.error){el.innerHTML='<p>'+this.error+'</p>';return true;}
if(!this.machines){el.innerHTML='<p>Loading machines...</p>';this._queryOwnedMachines();return true;}
if(!this.machines.length){el.innerHTML='<p>You have no machines saved at this time.</p>';return true;}
this.helpTTdata=[];var rows=[];for(var i=0;i<this.machines.length;i++){rows.push(this._drawRow(this.machines[i]));this.machines[i].saveSuccessEvent.subscribe(this._onSaveSuccess,this);this.machines[i].deleteSuccessEvent.subscribe(this._onDeleteSuccess,this);}
var info="";var table=this._drawHeading();table+=rows.join("\n");table=this._wrapTable(table);el.innerHTML=info+table;if(this.helpTTwidgets){for(var i=0;i<this.helpTTwidgets.length;i++){this.helpTTwidgets[i].destroy();}}
this.helpTTwidgets=[];for(var i=0;i<this.helpTTdata.length;i++){this.helpTTwidgets.push(new YAHOO.widget.Tooltip(this.id+'-tt-id-'+i,this.helpTTdata[i]));}
return true;},_drawRow:function(machine){var row='';var machineId=this.id+'_machine_'+machine.id;var name=machine.name.replace(/ /g,'&nbsp;');row+=this._wrapCell('<div id="'+machineId+'">'+name+'</div>');row+=this._wrapCell(machine.os+'<br>'+machine.formattedTags);row+=this._wrapCell(machine.firstUse);row+=this._wrapCell(machine.mostRecentUse);row+=this._wrapCell(machine.IS_ARCHIVED?"Yes":"No",machineId+"_archived");row+=this._wrapCell('$'+machine.storageCharge.toFixed(2)+'/week');new MachineMenu({machine:machine,forId:machineId});return this._wrapRow(row);},_drawHeading:function(){var heading="";heading+=this._wrapHdCell('Name');heading+=this._wrapHdCell(' ');heading+=this._wrapHdCell('First Use');heading+=this._wrapHdCell('Recent Use');heading+=this._wrapHdCell('Saved',true,'If "No" then this machine will be automatically deleted <br>'+'within 24 hours and you will not be charged for storage. Recently <br>'+'used machines will be automatically deleted unless you choose to <br>'+'save them. You can change this automatic behaviour by modifying <br>'+'your account settings.');heading+=this._wrapHdCell('Cost',true,'The weekly charge for holding on to this machine.');return this._wrapRow(heading);},_wrapTable:function(data){return'<table>'+data+'</table>';},_wrapRow:function(data){return'<tr>'+data+'</tr>';},_wrapCell:function(cellData,id){if(id)
id=" id=\""+id+"\"";else
id="";return'<td'+id+'>'+cellData+'</td>';},_wrapHdCell:function(cellData,showHelp,helpText){cellData=cellData.replace(/ /g,'&nbsp;');if(showHelp&&helpText){var id=this.id+"-tt-"+this.helpTTdata.length;this.helpTTdata.push({context:id,text:helpText,zIndex:3});cellData+="&nbsp;&nbsp;<a href=\"#\" id=\""+id+"\">(?)</a>";}
return'<th>'+cellData+'</th>';},_onSaveSuccess:function(type,args,self){self.onSaveSuccess(this);},onSaveSuccess:function(machine){this.setArchived(machine,"Yes");},_onDeleteSuccess:function(type,args,self){self.onDeleteSuccess(this);},onDeleteSuccess:function(machine){this.setArchived(machine,"No");},setArchived:function(machine,state){var elId=this.id+'_machine_'+machine.id+'_archived';var el=Dom.get(elId);if(el)
el.innerHTML=state;}};YAHOO.register("vmbed_owned_machines",YAHOO.vmbed.widget.OwnedMachines,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.History=function(userConfig){this.id=userConfig.id;this.node=userConfig.node;this.init();};var History=YAHOO.vmbed.widget.History,VMBed=YAHOO.vmbed.VMBed,Session=YAHOO.vmbed.Session,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;History.prototype={init:function(){VMBed.machineRentedEvent.subscribe(this.buildMenu,this,true);VMBed.machineSavedEvent.subscribe(this.buildMenu,this,true);VMBed.machineDeletedEvent.subscribe(this.buildMenu,this,true);VMBed.bookingCanceledEvent.subscribe(this.buildMenu,this,true);Session.stateChangeEvent.subscribe(this.drawSessionState,this,true);this.drawSessionState();},drawSessionState:function(){var bd=Dom.get(this.id+"-bd");if(Session.state==Session.LOGGED_IN){this.buildMenu();}
else{this.destroyMenu();bd.innerHTML="Please log in to view your account history";}},buildMenu:function(){if(this.menu)
this.destroyMenu();var bd=Dom.get(this.id+"-bd");bd.innerHTML="";this.getHistory();},getHistory:function(statementId){var data="";if(statementId){this.requestedStatementId=statementId;data="statementId="+statementId;}
var tzo=new Date().getTimezoneOffset();data+="&tzo="+tzo;YAHOO.util.Connect.asyncRequest('POST',YAHOO.vmbed.VMBed.AJAX_URL+'/getAccountHistory',{success:this.getHistoryResponseFn,failure:this.getHistoryResponseFn,timeout:10000,scope:this},data);return true;},getHistoryResponseFn:function(response){var error;var data;if(!response||response.status!=200){error="Server error.";}
try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error.";}
if(!error&&data.failureReason){error=data.failureReason;}
if(error){var bd=Dom.get(this.id+"-bd");bd.innerHTML=error;}
else{if(data.statements){this.history=data.statements;this.drawMenu();}
if(!this.requestedStatementId||(this.requestedStatementId==data.statementId)){this.statement=data.statement;this.transactions=data.transactions;var balance=0.0;for(var i=0;i<this.transactions.length;i++){if(this.transactions[i].is_credit)
balance+=this.transactions[i].amount;else
balance-=this.transactions[i].amount;this.transactions[i].balance=balance;}
this.drawStatement();}}
return true;},drawMenu:function(){var menu=new YAHOO.widget.MenuBar(this.id+'-menubar',{autosubmenudisplay:true,showdelay:50,hidedelay:750,lazyload:false});var years=[];for(var y=0;y<this.history.length;y++){var year=this.history[y].year;var statements=this.history[y].data;var menuData={id:this.id+'-menu-'+year,text:""+year,submenu:{id:this.id+'-submenu-'+year,itemdata:[]}};for(var i=0;i<statements.length;i++){var statement=statements[i];menuData.submenu.itemdata.push({id:this.id+'-menu-'+statement.id,text:statement.from+" to "+statement.to,onclick:{fn:this.onItemClick,scope:this,obj:statement.id}});}
years.push(menuData);}
menu.addItems(years);this.menu=menu;var menuEl=Dom.get(this.id+"-menu");menu.render(menuEl);},onItemClick:function(type,args,statementId){this.getHistory(statementId);},drawStatement:function(){var hd=Dom.get(this.id+"-hd");hd.innerHTML="Statement: "+this.statement;var bd=Dom.get(this.id+"-bd");this.helpTTdata=[];var rows=[];for(var i=0;i<this.transactions.length;i++){rows.push(this._drawRow(this.transactions[i]));}
var table=this._drawHeading();table+=rows.join("\n");table=this._wrapTable(table);bd.innerHTML=table;if(this.helpTTwidgets){for(var i=0;i<this.helpTTwidgets.length;i++){this.helpTTwidgets[i].destroy();}}
this.helpTTwidgets=[];for(var i=0;i<this.helpTTdata.length;i++){this.helpTTwidgets.push(new YAHOO.widget.Tooltip(this.id+'-tt-id-'+i,this.helpTTdata[i]));}
return true;},_drawRow:function(transaction){var row='';row+=this._wrapCell(transaction.ref);row+=this._wrapCell(transaction.occurred);row+=this._wrapCell(transaction.description);row+=this._wrapCell(transaction.is_credit?"$"+transaction.amount.toFixed(2):"&nbsp;");row+=this._wrapCell(transaction.is_credit?"&nbsp;":"$"+transaction.amount.toFixed(2));row+=this._wrapCell('$'+transaction.balance.toFixed(2));return this._wrapRow(row);},_drawHeading:function(){var heading="";heading+=this._wrapHdCell('Ref');heading+=this._wrapHdCell('Date');heading+=this._wrapHdCell('Transaction');heading+=this._wrapHdCell('Credit');heading+=this._wrapHdCell('Charge');heading+=this._wrapHdCell('Balance');return this._wrapRow(heading);},_wrapTable:function(data){return'<table>'+data+'</table>';},_wrapRow:function(data){return'<tr>'+data+'</tr>';},_wrapCell:function(cellData,id){if(id)
id=" id=\""+id+"\"";else
id="";return'<td'+id+'>'+cellData+'</td>';},_wrapHdCell:function(cellData,showHelp,helpText){cellData=cellData.replace(/ /g,'&nbsp;');if(showHelp&&helpText){var id=this.id+"-tt-"+this.helpTTdata.length;this.helpTTdata.push({context:id,text:helpText,zIndex:3});cellData+="&nbsp;&nbsp;<a href=\"#\" id=\""+id+"\">(?)</a>";}
return'<th>'+cellData+'</th>';},destroyMenu:function(){if(this.menu){this.menu.destroy();delete this.menu;}
var bd=Dom.get(this.id+"-bd");bd.innerHTML="";}};YAHOO.register("vmbed_history",YAHOO.vmbed.widget.History,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Content=function(userConfig){this.init(userConfig);};var Content=YAHOO.vmbed.widget.Content,Session=YAHOO.vmbed.Session,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event,Util=YAHOO.util;Content.prototype={init:function(userConfig){this.menuId=userConfig.menuId;this.bodyId=userConfig.bodyId;this.menuData=userConfig.menuData;this.pageData=userConfig.pageData;this.startPage=userConfig.startPage?userConfig.startPage:'';this.updateMenuData();this.contentRecord=[];this.pageRecord=[];this.savedUserParms=[];var href=document.location.href;var args=/\?page\/(\w*)/.exec(href);if(args){this.startPage=args[1];}},find:function(name,menuData){if(!menuData){for(var i=0;i<this.pageData.length;i++){var item=this.pageData[i];if(item.name==name){return item;}}
menuData=this.menuData;}
for(var i=0;i<menuData.length;i++){var item=menuData[i];if(item.name==name){return item;}
if(item.submenu){var found=this.find(name,item.submenu.itemdata);if(found)
return found;}}
return null;},hasCode:function(name){var item=this.find(name);if(!item)
throw new Error("Page "+name+" was not found");return item.hasCode?true:false;},updateMenuData:function(menuData,level){if(!menuData)
menuData=this.menuData;if(!level)
level=1;for(var i=0;i<menuData.length;i++){var item=menuData[i];item.id=this.menuId+"-l"+level+"-item-"+item.name;item.url="?page/"+item.name;item.onclick={fn:this.onItemClick,obj:this};if(item.submenu){item.submenu.id=this.menuId+"-l"+level+"-menu-"+item.submenu.name;this.updateMenuData(item.submenu.itemdata,level+1);}}
return true;},linkToNode:function(name,link,userParms){var parmsIndex='';if(userParms){this.savedUserParms.push(userParms);parmsIndex=', '+this.savedUserParms.length-1;}
return"<a href=\"#\" onclick=\"YAHOO.vmbed.Content.selectNode('"+name+"' "+parmsIndex+");\">"+link+"</a>";},onItemClick:function(type,args,obj){Event.preventDefault(args[0]);obj.selectNode(this.id);},selectNode:function(node,parms){var name;var nameMatch=/\-item\-(.*)/.exec(node);if(nameMatch)
name=nameMatch[1];else
name=node;var item=this.find(name);if(!item)
throw new Error("Page "+name+" does not exist");if(typeof parms!="undefined"){if(YAHOO.lang.isObject(parms)){this.selectedUserParms=parms;}
else{this.selectedUserParms=this.savedUserParms[parms];}}
else{this.selectedUserParms=null;}
var docTitle=document.title;var parts=/(.*) \- (.*) \- (.*)/.exec(docTitle);if(parts){document.title=parts[1]+' - '+parts[2]+' - '+(item.title?item.title:item.text);}
else{document.title=document.title+' - '+(item.title?item.title:item.text);}
if(this.selectedNode)
Dom.setStyle(this.selectedNode,"display","none");var contentId=this.bodyId+'-'+name;var node;if(!this.contentRecord[name]||item.alwaysReload){if(!this.contentRecord[name]){node=document.createElement('div');Dom.addClass(node,"vmbed-body-node");var bodyEl=Dom.get(this.bodyId);bodyEl.appendChild(node);}
else{node=this.contentRecord[name];Dom.setStyle(node,"display","block");}
node.innerHTML="Loading "+name+"...";this.contentRecord[name]=node;this.selectedNode=node;this.loadNodeData(name);}
else{node=this.contentRecord[name];Dom.setStyle(node,"display","block");this.selectedNode=node;var page=this.pageRecord[name];if(page&&page.updateUserParms&&this.selectedUserParms)
page.updateUserParms(this.selectedUserParms);}
return true;},loadNodeData:function(name){this.loadNodeDataRequest={request:YAHOO.util.Connect.asyncRequest('GET','pages/'+name+'.html',{success:this.onLoadNodeDataResponse,failure:this.onLoadNodeDataResponse,timeout:10000,argument:[this,name]}),name:name};return true;},onLoadNodeDataResponse:function(response){var me=response.argument[0];var name=response.argument[1];return me.handleLoadNodeDataResponse(response,name);},handleLoadNodeDataResponse:function(response,name){if(!response||response.status!=200)
return true;if(this.loadNodeDataRequest.name!=name)
return true;this.selectedNode.innerHTML=response.responseText;if(this.hasCode(name))
this.loadNodeCode(name);return true;},loadNodeCode:function(name){this.loadNodeCodeRequest={request:YAHOO.util.Connect.asyncRequest('GET','pages/'+name+'.js',{success:this.onLoadNodeCodeResponse,failure:this.onLoadNodeCodeResponse,timeout:10000,argument:[this,name]}),name:name};return true;},onLoadNodeCodeResponse:function(response){var me=response.argument[0];var name=response.argument[1];return me.handleLoadNodeCodeResponse(response,name);},handleLoadNodeCodeResponse:function(response,name){if(!response||response.status!=200)
return true;if(this.loadNodeCodeRequest.name!=name)
return true;var body=this.body;var node=this.selectedNode;var userParms=this.selectedUserParms;var page;eval(response.responseText);if(page){this.pageRecord[name]=page;}
return true;},render:function(moduleElement){var oMenuBar=new YAHOO.widget.MenuBar(this.menuId+'-bar',{autosubmenudisplay:true,showdelay:50,hidedelay:750,lazyload:true,zIndex:30});oMenuBar.addItems(this.menuData);this.menuBar=oMenuBar;oMenuBar.render(this.menuId);if(this.startPage)
this.selectNode(this.startPage);return true;}};YAHOO.register("vmbed_content",YAHOO.vmbed.widget.Content,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Authenticate=function(id){this.id=id;this.init();};var Authenticate=YAHOO.vmbed.widget.Authenticate,Session=YAHOO.vmbed.Session,Module=YAHOO.widget.Module,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event,Util=YAHOO.util;Authenticate.LOGIN_MODE="LOGIN_MODE";Authenticate.SIGNUP_MODE="SIGNUP_MODE";Authenticate.prototype={init:function(){if(/login/.test(this.id)){this.mode=Authenticate.LOGIN_MODE;this.allFields=["username","password"];}
else if(/signup/.test(this.id)){this.mode=Authenticate.SIGNUP_MODE;this.allFields=["username","password","verify","email","notify"];}
else{throw new Error("Cannot figure mode from element: "+this.id);}
Session.stateChangeEvent.subscribe(this.onSessionStateChange,this);var attrs={};switch(this.mode){case Authenticate.LOGIN_MODE:attrs.verify=false;attrs.email=false;attrs.promo=false;attrs.notify=false;attrs.title="Login";break;case Authenticate.SIGNUP_MODE:attrs.verify=true;attrs.email=true;attrs.promo=true;attrs.notify=true;attrs.title="Sign up";break;}
this.content='<div class="vmbed-gf vmbed-narrow">'+'  <fieldset>'+'    <legend>'+attrs.title+'</legend>'+'    <ol>'+'      <li>'+'        <label for="'+this.id+'_username">User Name:</label>'+'        <input type="text" id="'+this.id+'_username" name="'+this.id+'_username" maxlength=50>'+'      </li>'+'      <li>'+'        <label for="'+this.id+'_password">Password:</label>'+'        <input type="password" id="'+this.id+'_password" name="'+this.id+'_password" maxlength=50>'+'      </li>'+
(attrs.verify?'      <li>'+'        <label for="'+this.id+'_verify">Verify:</label>'+'        <input type="password" id="'+this.id+'_verify" name="'+this.id+'_verify" maxlength=50>'+'      </li>':"")+
(attrs.email?'      <li>'+'        <label for="'+this.id+'_email">Email:</label>'+'        <input type="text" id="'+this.id+'_email" name="'+this.id+'_email" maxlength=50>'+'      </li>':"")+
(attrs.promo?'      <li>'+'        <label for="'+this.id+'_promo">Code (optional):</label>'+'        <input type="text" id="'+this.id+'_promo" name="'+this.id+'_promo" maxlength=50>'+'      </li>':"")+
(attrs.notify?'      <li>'+'        <label for="'+this.id+'_notify">Notifications:</label>'+'        <input type="checkbox" id="'+this.id+'_notify" name="'+this.id+'_notify" checked=TRUE>'+'      </li>':"")+'    </ol>'+'  </fieldset>'+'  <fieldset class="submit">'+'    <input id="'+this.id+'_submit" type="submit" class="submit" value="'+attrs.title+'">'+'  </fieldset>'+'</div>'+'<p id="'+this.id+'_error" class="vmbed-error"></p>'+
((this.mode==Authenticate.LOGIN_MODE)?"<p>(need an account? click <a id=\""+this.id+"_switch\" href=\"#\">here</a> to sign up.)</p>":"<p>(Already have an account? click <a id=\""+this.id+"_switch\" href=\"#\">here</a> to login.)</p>");},onSessionStateChange:function(type,args,me){me.drawState();},drawState:function(){if(!this.ready)
return true;if((this.mode==Authenticate.SIGNUP_MODE)&&YAHOO.vmbed.VMBed.isFull)
return true;this.setError("");this.activate();if(!Session.state||(Session.state==Session.NO_USER)){}
else if(Session.state==Session.LOGGING_IN){this.deactivate();}
else if(Session.state==Session.FAILED){var errorMsg;if(Session.failureReason){errorMsg=Session.failureReason;}
else{errorMsg=(this.mode==Authenticate.LOGIN_MODE)?"Login failed.":"Account creation failed.";}
this.setError(errorMsg);if(this.mode==Authenticate.LOGIN_MODE){Dom.get(this.id+"_password").focus();Dom.get(this.id+"_password").select();}
else{Dom.get(this.id+"_username").focus();Dom.get(this.id+"_username").select();}}
else if((Session.state==Session.LOGGED_IN)||(Session.state==Session.LOGGED_OUT)){for(var i=0;i<this.allFields.length;i++){Dom.get(this.id+"_"+this.allFields[i]).value="";}}
else{throw new Error("Unexpected session state: "+Session.state);}
return true;},setError:function(msg){Dom.get(this.id+"_error").innerHTML=msg;},activate:function(){this.submitButton.set("disabled",false);for(var i=0;i<this.allFields.length;i++){Dom.get(this.id+"_"+this.allFields[i]).disabled=false;}},deactivate:function(){this.submitButton.set("disabled",true);for(var i=0;i<this.allFields.length;i++){Dom.get(this.id+"_"+this.allFields[i]).disabled=true;}},render:function(appendToNode){var el=this.element=document.createElement('div');Dom.addClass(this.element,"vmbed-account");appendToNode.appendChild(el);this.element.innerHTML="";if((this.mode==Authenticate.SIGNUP_MODE)&&(YAHOO.vmbed.VMBed.isFull)){this.element.innerHTML+="<h2>We Are Fully Allocated</h2>"+"<p>VMBed is not taking any new accounts at the moment. "+"We limit the number of active accounts to ensure a good service for our users. "+"If you would like to be added to our waiting list please "+
YAHOO.vmbed.Content.linkToNode("contact","contact us")+" "+"and we will let you know as soon as a free slot becomes available. "+"We are adding new servers all the time (or at least that is how it "+"feels some days).</p>Regards,<br>The VMBed Team.<br><br>"+"<p>"+"(Already have an account? click <a id=\""+this.id+"_switch\" href=\"#\">here</a> to login.)</p>";Event.addListener(this.id+"_switch","click",Session.triggerLoginMode);}
else{this.element.innerHTML+=this.content;if(this.mode==Authenticate.SIGNUP_MODE){this.element.innerHTML+="<p>("+YAHOO.vmbed.VMBed.availableAccounts+" accounts available.)</p>";}
Event.addListener(this.id+"_switch","click",(this.mode==Authenticate.LOGIN_MODE)?Session.triggerSignupMode:Session.triggerLoginMode);this.submitButton=new YAHOO.widget.Button(this.id+"_submit");this.submitButton.on("click",this.onSubmit,this,true);if(this.mode==Authenticate.LOGIN_MODE){this.usernameKeyL=new Util.KeyListener(this.id+"_username",{keys:13},{fn:this.onUsernameEnter,scope:this,correctScope:true});this.usernameKeyL.enable();this.passwordKeyL=new Util.KeyListener(this.id+"_password",{keys:13},{fn:this.onPasswordEnter,scope:this,correctScope:true});this.passwordKeyL.enable();}
this.renderHelp();}
this.ready=true;},renderHelp:function(){if(this.mode==Authenticate.SIGNUP_MODE){new YAHOO.widget.Tooltip(this.id+'_username_tt',{context:this.id+'_username',width:"300px",text:"The username must be between 4 and 16 characters and only use the characters 0-9, a-z and A-Z. This is to help ensure they are compatible with other systems account restrictions.",autodismissdelay:10000,zIndex:3});new YAHOO.widget.Tooltip(this.id+'_password_tt',{context:this.id+'_password',width:"300px",text:"The password must be between 8 and 16 characters and only use the characters 0-9, a-z and A-Z. This is to help ensure they are compatible with other systems password restrictions.",autodismissdelay:10000,zIndex:3});new YAHOO.widget.Tooltip(this.id+'_promo_tt',{context:this.id+'_promo',width:"300px",text:"Enter a promotional code here if you have one.",autodismissdelay:10000,zIndex:3});new YAHOO.widget.Tooltip(this.id+'_notify_tt',{context:this.id+'_notify',width:"300px",text:"Select to receive an email when your reservation is about to start or end.",autodismissdelay:10000,zIndex:3});}},onUsernameEnter:function(){Dom.get(this.id+"_password").focus();Event.preventDefault(e);return true;},onPasswordEnter:function(e){this.onSubmit();Event.preventDefault(e);return true;},onSubmit:function(){if(this.mode==Authenticate.LOGIN_MODE){Session.login(Dom.get(this.id+"_username").value,Dom.get(this.id+"_password").value);}
else{Session.signup(Dom.get(this.id+"_username").value,Dom.get(this.id+"_password").value,Dom.get(this.id+"_verify").value,Dom.get(this.id+"_email").value,Dom.get(this.id+"_promo").value,Dom.get(this.id+"_notify").checked);}}};YAHOO.register("vmbed_authenticate",YAHOO.vmbed.widget.Authenticate,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Booking=function(id,userConfig){this.id=id;this.init(userConfig);};var BookingMenu=YAHOO.vmbed.widget.BookingMenu,BookingWidget=YAHOO.vmbed.widget.Booking,Collapsible=YAHOO.vmbed.widget.Collapsible,Session=YAHOO.vmbed.Session,Booking=YAHOO.vmbed.Booking,BookingMgr=YAHOO.vmbed.BookingMgr,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;BookingWidget.prototype={init:function(userConfig){if(userConfig.booking)
this.booking=userConfig.booking;else
throw new Error("missing: booking");BookingMgr.bookingStateChangedEvent.subscribe(this._onBookingStateChanged,this);},_onBookingStateChanged:function(type,args,me){me.__onBookingStateChanged(args[0],args[1]);},__onBookingStateChanged:function(from,to){if(this.booking.id!=to.id)
return true;if(this.stateClass){if(this.stateIcon)
Dom.removeClass(this.stateIcon,this.stateClass+"-icon");if(this.stateDisplay)
Dom.removeClass(this.stateDisplay,this.stateClass+"-display");}
if(to.state=="CREATED")
this.stateClass="created";else if(to.state=="STARTED")
this.stateClass="booting";else if(to.state=="BOOTING")
this.stateClass="booting";else if(to.state=="READY")
this.stateClass="running";else if(to.state=="STOPPING")
this.stateClass="done";else if(to.state=="DONE"){if(to.IS_FAILURE)
this.stateClass="failure";else
this.stateClass="done";}
if(this.stateIcon)
Dom.addClass(this.stateIcon,this.stateClass+"-icon");if(this.stateDisplay){Dom.addClass(this.stateDisplay,this.stateClass+"-display");var displayText="";if(this.stateClass=="created")
displayText="Reserved.";else if(this.stateClass=="booting")
displayText="Booting...";else if(this.stateClass=="running"){displayText='Running.';var machine=this.booking.machine;if(machine.HAS_RDP){displayText+='<br><a href="rdp://'+machine.public_dnsname+'/">rdp://'+machine.public_dnsname+'/</a>';}
if(machine.HAS_VNC){displayText+='<br><a href="vnc://'+machine.public_dnsname+'/">vnc://'+machine.public_dnsname+'/</a>';}}
else if(this.stateClass=="done")
displayText="Completed";else if(this.stateClass=="failure")
displayText="Failed to start";this.stateDisplay.innerHTML=displayText;}
this.booking=to;},getAccessHelp:function(){var machine=this.booking.machine;var help='<ul>';var access=[];if(machine.HAS_RDP)
access.push('RDP');if(machine.HAS_VNC)
access.push('VNC');help+='<li>Access: '+access.join(', ')+'</li>';help+='<li>Login: "admin" or "user"</li>';help+='<li>Password: Your VMBed password.</li>';if(machine.public_dnsname){help+='<li>Host: '+machine.public_dnsname+'</li>';}
if(machine.public_ip_address){help+='<li>IP: '+machine.public_ip_address+'</li>';}
help+='<li>Visit the '+YAHOO.vmbed.Content.linkToNode('details','help page')+' to download remote access clients and get help using them.</li>';help+='<li>Cannot access the machine? - '+YAHOO.vmbed.Content.linkToNode('contact','contact us')+'.</li>';help+='</ul>';return help;},render:function(appendToNode){var el=this.element=document.createElement('div');Dom.addClass(this.element,"vmbed-booking");if(appendToNode)
appendToNode.appendChild(el);var c='<h3 class="vmbed-booking-title"><span id="'+this.id+'_title">'+this.booking.machine.title+'</span></h3>';c+='<span class="vmbed-booking-icon" id="'+this.id+'_icon">&#160;</span>';c+='<p>'+this.booking.start_time+' to <br>'+this.booking.end_time+'.</p>';c+='<span class="vmbed-booking-display" id="'+this.id+'_state">&#160;</span>';this.element.innerHTML=c;new BookingMenu({forId:this.id+'_title',booking:this.booking});var details=new Collapsible(this.id+"_details",{});details.setHeader("details...");var accessHelp=this.getAccessHelp();details.setBody((this.booking.machine.os?('<p>'+this.booking.machine.os+'.</p>'):"")+
(this.booking.machine.formattedTags?('<p>'+this.booking.machine.formattedTags+'</p>'):"")+
(accessHelp?('<p>'+accessHelp+'</p>'):""));details.render(this.element);Event.onAvailable(this.id+'_icon',function(){this.stateIcon=Dom.get(this.id+'_icon');this.__onBookingStateChanged(null,this.booking);},this,true);Event.onAvailable(this.id+'_state',function(){this.stateDisplay=Dom.get(this.id+'_state');this.__onBookingStateChanged(null,this.booking);},this,true);return true;},destroy:function(){BookingMgr.bookingStateChangedEvent.unsubscribe(this._onBookingStateChanged,this);}};YAHOO.register("vmbed_booking_widget",YAHOO.vmbed.widget.Booking,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Bookings=function(id){this.id=id;this.init();};var Bookings=YAHOO.vmbed.widget.Bookings,BookingWidget=YAHOO.vmbed.widget.Booking,BookingMgr=YAHOO.vmbed.BookingMgr,Session=YAHOO.vmbed.Session,Booking=YAHOO.vmbed.Booking,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;Bookings.prototype={init:function(){this.bookings=[];},_onSessionChange:function(){var creditValueEl=Dom.get("bookings_credit_value");if(creditValueEl){if(Session.user&&Session.user.availableCredit)
creditValueEl.innerHTML='$'+Session.user.availableCredit.toFixed(2);else
creditValueEl.innerHTML='$0.00';}},_onBookingAdded:function(type,args,me){me.__onBookingAdded(args[0],args[1],args[2]);},__onBookingAdded:function(booking,prev,next){var reg=Dom.getRegion(this.element);if(!reg)
throw new Error("Need to figure this out!!");if(this.bookings[booking.id])
throw new Error("booking already added");var nextWidget;if(next&&this.bookings[next.id]){nextWidget=this.bookings[next.id];}
var bookingWidget=new BookingWidget(this.id+"_"+booking.id,{booking:booking});if(nextWidget){bookingWidget.render();this.element.insertBefore(bookingWidget.element,nextWidget.element);}
else{bookingWidget.render(this.element);}
this.bookings[booking.id]=bookingWidget;Dom.setStyle(this.empty,"display","none");},_onBookingRemoved:function(type,args,me){me.__onBookingRemoved(args[0]);},__onBookingRemoved:function(booking){if(!this.bookings[booking.id])
throw new Error("booking already removed");var bookingWidget=this.bookings[booking.id];delete this.bookings[booking.id];this.element.removeChild(bookingWidget.element);bookingWidget.destroy();if(this.bookings.length==0)
Dom.setStyle(this.empty,"display","block");},render:function(appendToNode){var el=this.element=document.createElement('div');Dom.addClass(this.element,"vmbed-bookings");appendToNode.appendChild(el);this.credit=document.createElement('div');this.credit.innerHTML='Your Credit: <span id="bookings_credit_value">$0.00</span>  '+
YAHOO.vmbed.Content.linkToNode("topup","(add credit)");Dom.addClass(this.credit,"vmbed-notice");el.appendChild(this.credit);this.empty=document.createElement('div');this.empty.innerHTML="You have no machines reserved at the time. Click "+
YAHOO.vmbed.Content.linkToNode("rent","here")+" to rent some.";Dom.addClass(this.empty,"vmbed-notice");el.appendChild(this.empty);if(this.bookings.length==0)
Dom.setStyle(this.empty,"display","block");BookingMgr.bookingAddedEvent.subscribe(this._onBookingAdded,this);BookingMgr.bookingRemovedEvent.subscribe(this._onBookingRemoved,this);Session.stateChangeEvent.subscribe(this._onSessionChange,this,true);Session.creditChangeEvent.subscribe(this._onSessionChange,this,true);var update=BookingMgr.bookings;for(var i=0;i<update.length;i++){var prev,next;if(i!=0)
prev=update[i-1];if(i+1!=update.length)
next=update[i+1];this.__onBookingAdded(update[i],prev,next);}
this._onSessionChange();}};YAHOO.register("vmbed_bookings",YAHOO.vmbed.widget.Bookings,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.RHS=function(id){this.id=id;this.init();};var RHS=YAHOO.vmbed.widget.RHS,Authenticate=YAHOO.vmbed.widget.Authenticate,Bookings=YAHOO.vmbed.widget.Bookings,Session=YAHOO.vmbed.Session,Dom=YAHOO.util.Dom;RHS.prototype={init:function(){Session.stateChangeEvent.subscribe(this._onSessionStateChange,this);this.tiles=[];var tile=this.tiles.login=new Authenticate("rhs_login");tile=this.tiles.signup=new Authenticate("rhs_signup");tile=this.tiles.emailVerifyRequired=document.createElement('div');tile.id=this.id+'_verify_email';Dom.addClass(tile,"vmbed-notice");tile.innerHTML="<h2>Verify Your Email Address:</h2>"+"<p>Please check your <b id=\""+this.id+"_email\"></b> email account and follow the "+"instructions in an email from VMbed. It may take a few minutes for the email to arrive. Due "+"to filtering by some email providers it may also be diverted to your spam folder.</p>";tile=this.tiles.creditRequired=document.createElement('div');Dom.addClass(tile,"vmbed-notice");tile.innerHTML="<h2>Credit Your Account:</h2>"+"<p>Pick a "+YAHOO.vmbed.Content.linkToNode("subscribe","subscription plan")+" or "+YAHOO.vmbed.Content.linkToNode("topup","pay as you go")+" to ensure that your account has credit to rent machines.</p>";this.tiles.bookings=new Bookings("rhs_bookings");this.rendered=false;},_onSessionStateChange:function(type,args,me){me.__onSessionStateChange();},__onSessionStateChange:function(){if(!this.rendered)
return true;if((Session.state==Session.LOGGING_IN)||(Session.state==Session.FAILED))
return true;this.hideAll();this.draw();return true;},draw:function(){if(Session.isNewUser()){this.show(this.tiles.signup);}
else if(Session.isNewlySignedUp()){this.show(this.tiles.emailVerifyRequired);}
else if(Session.isNewlySignedUpAndVerified()){this.show(this.tiles.creditRequired);}
else if(Session.state==Session.LOGGED_OUT){this.show(this.tiles.login);}
else{if(Session.user&&!Session.user.IS_VERIFIED){this.show(this.tiles.emailVerifyRequired);}
if(Session.user&&(!Session.user.availableCredit||Session.user.availableCredit==0.0)){this.show(this.tiles.creditRequired);}
this.show(this.tiles.bookings);}
return true;},hideAll:function(){for(var i in this.tiles){if(this.tiles[i].element)
Dom.setStyle(this.tiles[i].element,"display","none");else
Dom.setStyle(this.tiles[i],"display","none");}
return true;},show:function(tile){if(tile.element)
Dom.setStyle(tile.element,"display","block");else
Dom.setStyle(tile,"display","block");return true;},render:function(){this.element=Dom.get(this.id);if(YAHOO.vmbed.VMBed.loaded)
this._render();else{YAHOO.vmbed.VMBed.configLoadedEvent.subscribe(this._onVMBedLoaded,this);}},_render:function(){this.element.appendChild(this.tiles.emailVerifyRequired);this.element.appendChild(this.tiles.creditRequired);for(var i in this.tiles){if(this.tiles[i].render)
this.tiles[i].render(this.element);}
this.hideAll();this.draw();this.rendered=true;},_onVMBedLoaded:function(type,args,me){me._render();}};YAHOO.register("vmbed_rhs",YAHOO.vmbed.widget.RHS,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Contact=function(){this.id="contact";};var Contact=YAHOO.vmbed.widget.Contact,VMBed=YAHOO.vmbed.VMBed,Session=YAHOO.vmbed.Session,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;Contact.URL=YAHOO.vmbed.VMBed.AJAX_URL+"/saveMessage";Contact.prototype={render:function(){this.sendButton=new YAHOO.widget.Button(this.id+"_submit");Event.addListener(this.id+"_submit","click",this.onSendClick,this,true);},onSendClick:function(ev){Event.stopEvent(ev);this.send();return true;},send:function(){var dialog=new YAHOO.widget.SimpleDialog("send",{width:"260px",effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.25},fixedcenter:true,visible:true,modal:true});dialog.setHeader("Sending...");dialog.cfg.queueProperty("buttons",[{text:"Ok",handler:function(){this.hide();var self=this;setTimeout(function(){self.destroy();},5000);},isDefault:true}]);dialog.render(document.body);dialog.show();var data="";var fields=["name","email","subject","message"];for(var i=0;i<fields.length;i++){if(data)
data+="&";data+=fields[i]+"="+Dom.get(this.id+"_"+fields[i]).value;}
this.request=YAHOO.util.Connect.asyncRequest
('POST',Contact.URL,{success:this.sendResponseFn,failure:this.sendResponseFn,timeout:10000,scope:this},data);this.sendDialog=dialog;return true;},sendResponseFn:function(response){var data;var error;try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error";}
if(YAHOO.lang.isObject(data)&&data.failureReason){error=data.failureReason;}
if(!YAHOO.lang.isObject(data)){error="Data error";}
dialog=this.sendDialog;if(error){dialog.setHeader("Your message could not be sent.");dialog.setBody("Please try sending an email directly to <a href=\"mailto:vmbed@vmbed.com\">vmbed@vmbed.com</a>.  We apologize for this incovenience.");}
else{dialog.setHeader("Thank you.");dialog.setBody("Your message has been sent. We shall get back to you shortly.");}
return true;}};YAHOO.register("vmbed_contact",YAHOO.vmbed.widget.Contact,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Settings=function(){this.id="settings";this.init();};var Settings=YAHOO.vmbed.widget.Settings,VMBed=YAHOO.vmbed.VMBed,Session=YAHOO.vmbed.Session,Dom=YAHOO.util.Dom,Event=YAHOO.util.Event;Settings.URL=YAHOO.vmbed.VMBed.AJAX_URL+"/saveSettings";Settings.prototype={init:function(){this.saveButton=new YAHOO.widget.Button(this.id+"_submit");Event.addListener(this.id+"_submit","click",this.onSaveClick,this,true);new YAHOO.widget.Tooltip(this.id+'_auto_save_tt',{context:this.id+'_auto_save',width:"300px",text:"Select this to automatically save machines that you rent.  If this is not checked then machines will be discarded after 24 hours. You can still choose to save them on the machines page.  Changing this setting does not affect existing saved or unsaved machines.",autodismissdelay:10000,zIndex:3});new YAHOO.widget.Tooltip(this.id+'_new_password_tt',{context:this.id+'_new_password',width:"300px",text:"The password must be between 8 and 16 characters and only use the characters 0-9, a-z and A-Z. This is to make them more compatible with other systems password restrictions.",autodismissdelay:10000,zIndex:3});new YAHOO.widget.Tooltip(this.id+'_old_password_tt',{context:this.id+'_old_password',width:"300px",text:"You will need to enter your old password to change it.",autodismissdelay:10000,zIndex:3});Session.stateChangeEvent.subscribe(this._onSessionChange,this);Event.onAvailable(this.id+"_error",this.drawState,this,true);},_onSessionChange:function(type,args,me){me.drawState();},drawState:function(){var emailEl=Dom.get(this.id+"_email");var autoSaveEl=Dom.get(this.id+"_auto_save");var startEmailEl=Dom.get(this.id+"_start_email");var endEmailEl=Dom.get(this.id+"_end_email");var errorEl=Dom.get(this.id+"_error");if(Session.state==Session.LOGGED_IN){emailEl.value=Session.user.emailAddress;autoSaveEl.checked=Session.user.WANTS_AUTO_ARCHIVE;startEmailEl.checked=Session.user.WANTS_START_EMAIL;endEmailEl.checked=Session.user.WANTS_END_EMAIL;this.saveButton.set("disabled",false);errorEl.innerHTML="";}
else{emailEl.value="";this.saveButton.set("disabled",true);errorEl.innerHTML="Please log in to change your account settings";}},onSaveClick:function(ev){Event.stopEvent(ev);this.save();return true;},save:function(){var errorEl=Dom.get(this.id+"_error");errorEl.innerHTML="";this.saveButton.set("disabled",true);var data="";var fields=["email","auto_save","start_email","end_email","old_password","new_password","verify_password"];for(var i=0;i<fields.length;i++){var fieldEl=Dom.get(this.id+"_"+fields[i]);if(data)
data+="&";data+=fields[i]+"=";if(fieldEl.type=="checkbox")
data+=fieldEl.checked;else
data+=fieldEl.value;var fieldErrorEl=Dom.get(this.id+"_"+fields[i]+"_error");fieldErrorEl.innerHTML="";}
this.request=YAHOO.util.Connect.asyncRequest
('POST',Settings.URL,{success:this.saveResponseFn,failure:this.saveResponseFn,timeout:10000,scope:this},data);return true;},saveResponseFn:function(response){this.saveButton.set("disabled",false);var data;var error;try{data=YAHOO.lang.JSON.parse(response.responseText);}
catch(e){error="Server error";}
if(YAHOO.lang.isObject(data)&&data.failureReason){error=data.failureReason;}
if(!YAHOO.lang.isObject(data)){error="Data error";}
var errorEl=Dom.get(this.id+"_error");if(error){errorEl.innerHTML=error;}
else{if(data.fieldErrors){for(var field in data.fieldErrors){var error=data.fieldErrors[field];var fieldErrorEl=Dom.get(this.id+"_"+field+"_error");fieldErrorEl.innerHTML=error;}}
else{errorEl.innerHTML="Changes saved";setTimeout(function(){errorEl.innerHTML="";},5000);var fields=["old_password","new_password","verify_password"];for(var i=0;i<fields.length;i++){var fieldEl=Dom.get(this.id+"_"+fields[i]);fieldEl.value="";}}}
return true;}};YAHOO.register("vmbed_settings",YAHOO.vmbed.widget.Settings,{version:"1",build:"0"});})();(function(){YAHOO.namespace("vmbed.widget");YAHOO.vmbed.widget.Title=function(id){this.id=id;this.init();};var VMBed=YAHOO.vmbed.VMBed,Title=YAHOO.vmbed.widget.Title,Session=YAHOO.vmbed.Session,Event=YAHOO.util.Event,Dom=YAHOO.util.Dom;Title.prototype={init:function(el,userConfig){Session.stateChangeEvent.subscribe(this.onSessionStateChange,this);this.drawState();Event.onAvailable(this.id,this.drawState,this,true);Event.onAvailable("title-link",function(){var link=Dom.get("title-link");link.href=VMBed.URL;});},onSessionStateChange:function(type,args,me){me.drawState();},drawState:function(){var state=Dom.get("header-session-state");if(state){if(!Session.state||(Session.state==Session.NO_USER)){state.innerHTML="Not logged in.";}
else if(Session.state==Session.LOGGING_IN){state.innerHTML="Logging in...";}
else if((Session.state==Session.LOGGED_IN)&&Session.user.name){state.innerHTML="Logged in as "+Session.user.name+".<br>"+"<a class=\"vmbed-hd-state-link\" id=\""+this.id+"_logout\"href=\"#\">[logout]</a>";Event.addListener(this.id+"_logout","click",Session.triggerLogout);}
else if(Session.state==Session.FAILED){state.innerHTML="Login error.";}
else{state.innerHTML="Not logged in.";}}},render:function(){}};YAHOO.register("vmbed_title",YAHOO.vmbed.widget.Title,{version:"1",build:"0"});})();