text: <<<<<<< HEAD
  ﻿
  $axure.internal(function($ax) {
      var funcs = {};
  
      var weekday = new Array(7);
      weekday[0] = "Sunday";
      weekday[1] = "Monday";
      weekday[2] = "Tuesday";
      weekday[3] = "Wednesday";
      weekday[4] = "Thursday";
      weekday[5] = "Friday";
      weekday[6] = "Saturday";
  
      funcs.getDayOfWeek = function() {
          return _getDayOfWeek(this.getDay());
      };
  
      var _getDayOfWeek = $ax.getDayOfWeek = function(day) {
          return weekday[day];
      };
  
      var month = new Array(12);
      month[0] = "January";
      month[1] = "February";
      month[2] = "March";
      month[3] = "April";
      month[4] = "May";
      month[5] = "June";
      month[6] = "July";
      month[7] = "August";
      month[8] = "September";
      month[9] = "October";
      month[10] = "November";
      month[11] = "December";
  
      funcs.getMonthName = function() {
          return _getMonthName(this.getMonth());
      };
  
      var _getMonthName = $ax.getMonthName = function(monthNum) {
          return month[monthNum];
      };
  
      funcs.getMonth = function() {
          return this.getMonth() + 1;
      };
  
      funcs.addYears = function(years) {
          var retVal = new Date(this.valueOf());
          retVal.setFullYear(this.getFullYear() + Number(years));
          return retVal;
      };
  
      funcs.addMonths = function(months) {
          var retVal = new Date(this.valueOf());
          retVal.setMonth(this.getMonth() + Number(months));
          return retVal;
      };
  
      funcs.addDays = function(days) {
          var retVal = new Date(this.valueOf());
          retVal.setDate(this.getDate() + Number(days));
          return retVal;
      };
  
      funcs.addHours = function(hours) {
          var retVal = new Date(this.valueOf());
          retVal.setHours(this.getHours() + Number(hours));
          return retVal;
      };
  
      funcs.addMinutes = function(minutes) {
          var retVal = new Date(this.valueOf());
          retVal.setMinutes(this.getMinutes() + Number(minutes));
          return retVal;
      };
  
      funcs.addSeconds = function(seconds) {
          var retVal = new Date(this.valueOf());
          retVal.setSeconds(this.getSeconds() + Number(seconds));
          return retVal;
      };
  
      funcs.addMilliseconds = function(milliseconds) {
          var retVal = new Date(this.valueOf());
          retVal.setMilliseconds(this.getMilliseconds() + Number(milliseconds));
          return retVal;
      };
  
      var _stoHandlers = {};
  
      _stoHandlers.literal = function(sto, scope, eventInfo) {
          return sto.value;
      };
  
      //need angle bracket syntax because var is a reserved word
      _stoHandlers['var'] = function(sto, scope, eventInfo) {
          // Can't us 'A || B' here, because the first value can be false, true, or empty string and still be valid.
          var retVal = scope.hasOwnProperty(sto.name) ? scope[sto.name]  : $ax.globalVariableProvider.getVariableValue(sto.name, eventInfo);
          // Handle desired type here?
          
          if(retVal && retVal.exprType) {
              retVal = $ax.expr.evaluateExpr(retVal, eventInfo);
          }
          
          if((sto.desiredType == 'int' || sto.desiredType == 'float')) {
              var num = new Number(retVal);
              retVal = isNaN(num.valueOf()) ? retVal : num;
          }
  
  
          return retVal;
      };
  
      //TODO: Perhaps repeaterId can be detirmined at generation, and stored in the sto info.
      _stoHandlers.item = function(sto, scope, eventInfo, prop) {
          prop = prop || (eventInfo.data ? 'data' : eventInfo.link ? 'url' : eventInfo.image ? 'img' : 'text');
          var id = sto.isTarget || !$ax.repeater.hasData(eventInfo.srcElement, sto.name) ? eventInfo.targetElement : eventInfo.srcElement;
          return getData(eventInfo, id, sto.name, prop);
      };
  
      var getData = function(eventInfo, id, name, prop) {
          var repeaterId = $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(id));
          var itemId = $ax.repeater.getItemIdFromElementId(id);
          return $ax.repeater.getData(eventInfo, repeaterId, itemId, name, prop);
      };
  
      _stoHandlers.paren = function(sto, scope, eventInfo) {
          return _evaluateSTO(sto.innerSTO, scope, eventInfo);
      };
  
      _stoHandlers.fCall = function(sto, scope, eventInfo) {
          //TODO: [mas] handle required type
          var thisObj = _evaluateSTO(sto.thisSTO, scope, eventInfo);
          if(sto.thisSTO.desiredType == 'string' && sto.thisSTO.computedType != 'string') thisObj = thisObj.toString();
          
          var args = [];
          for(var i = 0; i < sto.arguments.length; i++) {
              args[i] = _evaluateSTO(sto.arguments[i], scope, eventInfo);
          }
          var fn = (funcs.hasOwnProperty(sto.func) && funcs[sto.func]) || thisObj[sto.func];
          return fn.apply(thisObj, args);
      };
  
      _stoHandlers.propCall = function(sto, scope, eventInfo) {
          //TODO: [mas] handle required type
          if((sto.prop == 'url' || sto.prop == 'img') && sto.thisSTO.sto == 'item') return _stoHandlers.item(sto.thisSTO, scope, eventInfo, sto.prop);
          var thisObj = _evaluateSTO(sto.thisSTO, scope, eventInfo);
          return thisObj[sto.prop];
      };
  
      var _binOps = {};
      _binOps['+'] = function(left, right) {
          if(left instanceof Date) return addDayToDate(left, right);
          if(right instanceof Date) return addDayToDate(right, left);
  
          var num = Number(left) + Number(right);
          return isNaN(num) ? (String(left) + String(right)) : num;
      };
      _binOps['-'] = function(left, right) {
          if(left instanceof Date) return addDayToDate(left, -right);
          return left - right;
      };
      _binOps['*'] = function(left, right) { return Number(left) * Number(right); };
      _binOps['/'] = function(left, right) { return Number(left) / Number(right); };
      _binOps['%'] = function(left, right) { return Number(left) % Number(right); };
      _binOps['=='] = function(left, right) { return _getBool(left) == _getBool(right); };
      _binOps['!='] = function(left, right) { return _getBool(left) != _getBool(right); };
      _binOps['<'] = function(left, right) { return Number(left) < Number(right); };
      _binOps['<='] = function(left, right) { return Number(left) <= Number(right); };
      _binOps['>'] = function(left, right) { return Number(left) > Number(right); };
      _binOps['>='] = function(left, right) { return Number(left) >= Number(right); };
      _binOps['&&'] = function(left, right) { return _getBool(left) && _getBool(right); };
      _binOps['||'] = function(left, right) { return _getBool(left) || _getBool(right); };
  
      // TODO: Move this to generic place to be used.
      var addDayToDate = function(date, days) {
          var retVal = new Date(date.valueOf());
          retVal.setDate(date.getDate() + days);
          return retVal;
      };
  
      var _unOps = {};
      _unOps['+'] = function(arg) { return +arg; };
      _unOps['-'] = function(arg) { return -arg; };
      _unOps['!'] = function(arg) { return !_getBool(arg); };
  
      _stoHandlers.binOp = function(sto, scope, eventInfo) {
          var left = _evaluateSTO(sto.leftSTO, scope, eventInfo);
          var right = _evaluateSTO(sto.rightSTO, scope, eventInfo);
          return _binOps[sto.op](left, right);
      };
  
      _stoHandlers.unOp = function(sto, scope, eventInfo) {
          var input = _evaluateSTO(sto.inputSTO, scope, eventInfo);
          return _unOps[sto.op](input);
      };
  
      var _getBool = function(val) {
          var lowerVal = val.toLowerCase ? val.toLowerCase() : val;
          return lowerVal == "false" ? false : lowerVal == "true" ? true : val;
      };
      $ax.getBool = _getBool;
  
      var _evaluateSTO = function(sto, scope, eventInfo) {
          if(sto.sto == 'error') return undefined;
          return _tryEscapeRichText(castSto(_stoHandlers[sto.sto](sto, scope, eventInfo), sto), eventInfo);
      };
      $ax.evaluateSTO = _evaluateSTO;
  
      var castSto = function(val, sto) {
          var type = sto.computedType || sto.desiredType;
          if(type == 'string') val = String(val);
          else if(type == 'date' && !(val instanceof Date)) val = new Date(val);
          else if(type == 'int' || type == 'float') val = Number(val);
          else if(type == 'bool') val = Boolean(val);
  
          return val;
      };
  
      var _tryEscapeRichText = function(text, eventInfo) {
          return eventInfo.htmlLiteral ? _escapeRichText(text) : text;
      };
  
      var _escapeRichText = function(text) {
          if(typeof (text) != 'string') return text;
  
          return text.replace('<', '&lt;');
      };
  =======
  ﻿
  $axure.internal(function($ax) {
      var funcs = {};
  
      var weekday = new Array(7);
      weekday[0] = "Sunday";
      weekday[1] = "Monday";
      weekday[2] = "Tuesday";
      weekday[3] = "Wednesday";
      weekday[4] = "Thursday";
      weekday[5] = "Friday";
      weekday[6] = "Saturday";
  
      funcs.getDayOfWeek = function() {
          return _getDayOfWeek(this.getDay());
      };
  
      var _getDayOfWeek = $ax.getDayOfWeek = function(day) {
          return weekday[day];
      };
  
      var month = new Array(12);
      month[0] = "January";
      month[1] = "February";
      month[2] = "March";
      month[3] = "April";
      month[4] = "May";
      month[5] = "June";
      month[6] = "July";
      month[7] = "August";
      month[8] = "September";
      month[9] = "October";
      month[10] = "November";
      month[11] = "December";
  
      funcs.getMonthName = function() {
          return _getMonthName(this.getMonth());
      };
  
      var _getMonthName = $ax.getMonthName = function(monthNum) {
          return month[monthNum];
      };
  
      funcs.getMonth = function() {
          return this.getMonth() + 1;
      };
  
      funcs.addYears = function(years) {
          var retVal = new Date(this.valueOf());
          retVal.setFullYear(this.getFullYear() + Number(years));
          return retVal;
      };
  
      funcs.addMonths = function(months) {
          var retVal = new Date(this.valueOf());
          retVal.setMonth(this.getMonth() + Number(months));
          return retVal;
      };
  
      funcs.addDays = function(days) {
          var retVal = new Date(this.valueOf());
          retVal.setDate(this.getDate() + Number(days));
          return retVal;
      };
  
      funcs.addHours = function(hours) {
          var retVal = new Date(this.valueOf());
          retVal.setHours(this.getHours() + Number(hours));
          return retVal;
      };
  
      funcs.addMinutes = function(minutes) {
          var retVal = new Date(this.valueOf());
          retVal.setMinutes(this.getMinutes() + Number(minutes));
          return retVal;
      };
  
      funcs.addSeconds = function(seconds) {
          var retVal = new Date(this.valueOf());
          retVal.setSeconds(this.getSeconds() + Number(seconds));
          return retVal;
      };
  
      funcs.addMilliseconds = function(milliseconds) {
          var retVal = new Date(this.valueOf());
          retVal.setMilliseconds(this.getMilliseconds() + Number(milliseconds));
          return retVal;
      };
  
      var _stoHandlers = {};
  
      _stoHandlers.literal = function(sto, scope, eventInfo) {
          return sto.value;
      };
  
      //need angle bracket syntax because var is a reserved word
      _stoHandlers['var'] = function(sto, scope, eventInfo) {
          // Can't us 'A || B' here, because the first value can be false, true, or empty string and still be valid.
          var retVal = scope.hasOwnProperty(sto.name) ? scope[sto.name]  : $ax.globalVariableProvider.getVariableValue(sto.name, eventInfo);
          // Handle desired type here?
          
          if(retVal && retVal.exprType) {
              retVal = $ax.expr.evaluateExpr(retVal, eventInfo);
          }
          
          if((sto.desiredType == 'int' || sto.desiredType == 'float')) {
              var num = new Number(retVal);
              retVal = isNaN(num.valueOf()) ? retVal : num;
          }
  
  
          return retVal;
      };
  
      //TODO: Perhaps repeaterId can be detirmined at generation, and stored in the sto info.
      _stoHandlers.item = function(sto, scope, eventInfo, prop) {
          prop = prop || (eventInfo.data ? 'data' : eventInfo.link ? 'url' : eventInfo.image ? 'img' : 'text');
          var id = sto.isTarget || !$ax.repeater.hasData(eventInfo.srcElement, sto.name) ? eventInfo.targetElement : eventInfo.srcElement;
          return getData(eventInfo, id, sto.name, prop);
      };
  
      var getData = function(eventInfo, id, name, prop) {
          var repeaterId = $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(id));
          var itemId = $ax.repeater.getItemIdFromElementId(id);
          return $ax.repeater.getData(eventInfo, repeaterId, itemId, name, prop);
      };
  
      _stoHandlers.paren = function(sto, scope, eventInfo) {
          return _evaluateSTO(sto.innerSTO, scope, eventInfo);
      };
  
      _stoHandlers.fCall = function(sto, scope, eventInfo) {
          //TODO: [mas] handle required type
          var thisObj = _evaluateSTO(sto.thisSTO, scope, eventInfo);
          if(sto.thisSTO.desiredType == 'string' && sto.thisSTO.computedType != 'string') thisObj = thisObj.toString();
          
          var args = [];
          for(var i = 0; i < sto.arguments.length; i++) {
              args[i] = _evaluateSTO(sto.arguments[i], scope, eventInfo);
          }
          var fn = (funcs.hasOwnProperty(sto.func) && funcs[sto.func]) || thisObj[sto.func];
          return fn.apply(thisObj, args);
      };
  
      _stoHandlers.propCall = function(sto, scope, eventInfo) {
          //TODO: [mas] handle required type
          if((sto.prop == 'url' || sto.prop == 'img') && sto.thisSTO.sto == 'item') return _stoHandlers.item(sto.thisSTO, scope, eventInfo, sto.prop);
          var thisObj = _evaluateSTO(sto.thisSTO, scope, eventInfo);
          return thisObj[sto.prop];
      };
  
      var _binOps = {};
      _binOps['+'] = function(left, right) {
          if(left instanceof Date) return addDayToDate(left, right);
          if(right instanceof Date) return addDayToDate(right, left);
  
          var num = Number(left) + Number(right);
          return isNaN(num) ? (String(left) + String(right)) : num;
      };
      _binOps['-'] = function(left, right) {
          if(left instanceof Date) return addDayToDate(left, -right);
          return left - right;
      };
      _binOps['*'] = function(left, right) { return Number(left) * Number(right); };
      _binOps['/'] = function(left, right) { return Number(left) / Number(right); };
      _binOps['%'] = function(left, right) { return Number(left) % Number(right); };
      _binOps['=='] = function(left, right) { return _getBool(left) == _getBool(right); };
      _binOps['!='] = function(left, right) { return _getBool(left) != _getBool(right); };
      _binOps['<'] = function(left, right) { return Number(left) < Number(right); };
      _binOps['<='] = function(left, right) { return Number(left) <= Number(right); };
      _binOps['>'] = function(left, right) { return Number(left) > Number(right); };
      _binOps['>='] = function(left, right) { return Number(left) >= Number(right); };
      _binOps['&&'] = function(left, right) { return _getBool(left) && _getBool(right); };
      _binOps['||'] = function(left, right) { return _getBool(left) || _getBool(right); };
  
      // TODO: Move this to generic place to be used.
      var addDayToDate = function(date, days) {
          var retVal = new Date(date.valueOf());
          retVal.setDate(date.getDate() + days);
          return retVal;
      };
  
      var _unOps = {};
      _unOps['+'] = function(arg) { return +arg; };
      _unOps['-'] = function(arg) { return -arg; };
      _unOps['!'] = function(arg) { return !_getBool(arg); };
  
      _stoHandlers.binOp = function(sto, scope, eventInfo) {
          var left = _evaluateSTO(sto.leftSTO, scope, eventInfo);
          var right = _evaluateSTO(sto.rightSTO, scope, eventInfo);
          return _binOps[sto.op](left, right);
      };
  
      _stoHandlers.unOp = function(sto, scope, eventInfo) {
          var input = _evaluateSTO(sto.inputSTO, scope, eventInfo);
          return _unOps[sto.op](input);
      };
  
      var _getBool = function(val) {
          var lowerVal = val.toLowerCase ? val.toLowerCase() : val;
          return lowerVal == "false" ? false : lowerVal == "true" ? true : val;
      };
      $ax.getBool = _getBool;
  
      var _evaluateSTO = function(sto, scope, eventInfo) {
          if(sto.sto == 'error') return undefined;
          return _tryEscapeRichText(castSto(_stoHandlers[sto.sto](sto, scope, eventInfo), sto), eventInfo);
      };
      $ax.evaluateSTO = _evaluateSTO;
  
      var castSto = function(val, sto) {
          var type = sto.computedType || sto.desiredType;
          if(type == 'string') val = String(val);
          else if(type == 'date' && !(val instanceof Date)) val = new Date(val);
          else if(type == 'int' || type == 'float') val = Number(val);
          else if(type == 'bool') val = Boolean(val);
  
          return val;
      };
  
      var _tryEscapeRichText = function(text, eventInfo) {
          return eventInfo.htmlLiteral ? _escapeRichText(text) : text;
      };
  
      var _escapeRichText = function(text) {
          if(typeof (text) != 'string') return text;
  
          return text.replace('<', '&lt;');
      };
  >>>>>>> upstream/master
  });