| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | $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);        var prop = thisObj[sto.prop] instanceof Function ? thisObj[sto.prop]() : thisObj[sto.prop];        return 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('<', '<');    };});
 |