| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 | // ******* Flyout MANAGER ******** //$axure.internal(function($ax) {    var _flyoutManager = $ax.flyoutManager = {};    var getFlyoutLabel = function(panelId) {        return panelId + '_flyout';    };    var _unregisterPanel = function(panelId, keepShown) {        $ax.geometry.unregister(getFlyoutLabel(panelId));        if(panelToSrc[panelId]) {            $ax.style.RemoveRolloverOverride(panelToSrc[panelId]);            delete panelToSrc[panelId];        }        if(!keepShown) {            $ax.action.addAnimation(panelId, $ax.action.queueTypes.fade, function() {                $ax('#' + panelId).hide();            });        }    };    _flyoutManager.unregisterPanel = _unregisterPanel;    var genPoint = $ax.geometry.genPoint;    var _updateFlyout = function(panelId) {        var label = getFlyoutLabel(panelId);        if(!$ax.geometry.polygonRegistered(label)) return;        var info = $ax.geometry.getPolygonInfo(label);        var rects = info && info.rects;        var targetWidget = $ax.getWidgetInfo(panelId);        rects.target = $ax.geometry.genRect(targetWidget);        // Src will stay the same, just updating        $ax.flyoutManager.registerFlyout(rects, panelId, panelToSrc[panelId]);        if(!$ax.geometry.checkInsideRegion(label)) _unregisterPanel(panelId);    };    _flyoutManager.updateFlyout = _updateFlyout;    var panelToSrc = {};    var _registerFlyout = function(rects, panelId, srcId) {        var label = _getFlyoutLabel(panelId);        var callback = function(info) {            // If leaving object or already outside it, then unregister, otherwise just return            if(!info.exiting && !info.outside) return;            _unregisterPanel(panelId);        };        var points = [];        var lastSrcId = panelToSrc[panelId];        if(lastSrcId != srcId) {            if(lastSrcId) $ax.style.RemoveRolloverOverride(lastSrcId);            if(srcId) {                $ax.style.AddRolloverOverride(srcId);                panelToSrc[panelId] = srcId;            } else delete panelToSrc[panelId];        }        // rects should be one or two rectangles        if(!rects.src) {            var rect = rects.target;            points.push(genPoint(rect.Left(), rect.Top()));            points.push(genPoint(rect.Right(), rect.Top()));            points.push(genPoint(rect.Right(), rect.Bottom()));            points.push(genPoint(rect.Left(), rect.Bottom()));        } else {            var r0 = rects.src;            var r1 = rects.target;            // Right left of right, left right of left, top below top, bottom above bottom            var rlr = r0.Right() <= r1.Right();            var lrl = r0.Left() >= r1.Left();            var tbt = r0.Top() >= r1.Top();            var bab = r0.Bottom() <= r1.Bottom();            var info = { rlr: rlr, lrl: lrl, tbt: tbt, bab: bab };            if((rlr && lrl) || (tbt && bab)) {                points = getSmallPolygon(r0, r1, info);            } else {                points = getLargePolygon(r0, r1, info);            }        }        $ax.geometry.registerPolygon(label, points, callback, { rects: rects });    };    _flyoutManager.registerFlyout = _registerFlyout;    var _getFlyoutLabel = function(panelId) {        return panelId + '_flyout';    };    var _reregisterAllFlyouts = function() {        for(var panelId in panelToSrc) _reregisterFlyout(panelId);    };    _flyoutManager.reregisterAllFlyouts = _reregisterAllFlyouts;    var _reregisterFlyout = function(panelId) {        var rects = $ax.geometry.getPolygonInfo(getFlyoutLabel(panelId)).rects;        _registerFlyout(rects, panelId, panelToSrc[panelId]);    };    // This is the reduced size polygon connecting r0 to r1 by means of horizontal or vertical lines.    var getSmallPolygon = function(r0, r1, info) {        var points = [];        // NOTE: currently I make the assumption that if horizontal/vertical connecting lines from the src hit the target        //        Meaning if horizontal, rlr and lrl are true, and if vertical, tbt and bab are true.        var r0Left = r0.Left();        var r0Right = r0.Right();        var r0Top = r0.Top();        var r0Bottom = r0.Bottom();        var r1Left = r1.Left();        var r1Right = r1.Right();        var r1Top = r1.Top();        var r1Bottom = r1.Bottom();        points.push(genPoint(r1Left, r1Top));        if(!info.tbt) {            points.push(genPoint(r0Left, r1Top));            points.push(genPoint(r0Left, r0Top));            points.push(genPoint(r0Right, r0Top));            points.push(genPoint(r0Right, r1Top));        }        points.push(genPoint(r1Right, r1Top));        if(!info.rlr) {            points.push(genPoint(r1Right, r0Top));            points.push(genPoint(r0Right, r0Top));            points.push(genPoint(r0Right, r0Bottom));            points.push(genPoint(r1Right, r0Bottom));        }        points.push(genPoint(r1Right, r1Bottom));        if(!info.bab) {            points.push(genPoint(r0Right, r1Bottom));            points.push(genPoint(r0Right, r0Bottom));            points.push(genPoint(r0Left, r0Bottom));            points.push(genPoint(r0Left, r1Bottom));        }        points.push(genPoint(r1Left, r1Bottom));        if(!info.lrl) {            points.push(genPoint(r1Left, r0Bottom));            points.push(genPoint(r0Left, r0Bottom));            points.push(genPoint(r0Left, r0Top));            points.push(genPoint(r1Left, r0Top));        }        return points;    };    // This is the original algorithm that connects the most extream corners to make polygon    var getLargePolygon = function(r0, r1, info) {        var points = [];        var r0Left = r0.Left();        var r0Right = r0.Right();        var r0Top = r0.Top();        var r0Bottom = r0.Bottom();        var r1Left = r1.Left();        var r1Right = r1.Right();        var r1Top = r1.Top();        var r1Bottom = r1.Bottom();        // Top lefts        if(info.tbt) {            if(!info.lrl) points.push(genPoint(r0Left, r0Top));            points.push(genPoint(r1Left, r1Top));        } else {            if(info.lrl) points.push(genPoint(r1Left, r1Top));            points.push(genPoint(r0Left, r0Top));        }        // Top rights        if(info.tbt) {            points.push(genPoint(r1Right, r1Top));            if(!info.rlr) points.push(genPoint(r0Right, r0Top));        } else {            points.push(genPoint(r0Right, r0Top));            if(info.rlr) points.push(genPoint(r1Right, r1Top));        }        // Bottom rights        if(info.bab) {            if(!info.rlr) points.push(genPoint(r0Right, r0Bottom));            points.push(genPoint(r1Right, r1Bottom));        } else {            if(info.rlr) points.push(genPoint(r1Right, r1Bottom));            points.push(genPoint(r0Right, r0Bottom));        }        // Bottom Lefts        if(info.bab) {            points.push(genPoint(r1Left, r1Bottom));            if(!info.lrl) points.push(genPoint(r0Left, r0Bottom));        } else {            points.push(genPoint(r0Left, r0Bottom));            if(info.lrl) points.push(genPoint(r1Left, r1Bottom));        }        return points;    };});// ******* Placeholder Manager ********* //$axure.internal(function($ax) {    var _placeholderManager = $ax.placeholderManager = {};    var idToPlaceholderInfo = {};    var _registerPlaceholder = function(elementId, text, password) {        idToPlaceholderInfo[elementId] = { text: text, password: password, active: false };    };    _placeholderManager.registerPlaceholder = _registerPlaceholder;    _placeholderManager.refreshPlaceholder = function (elementId) {        var info = idToPlaceholderInfo[elementId];        if (!info || !info.active) return;        $ax.style.SetWidgetPlaceholder(elementId, true, info.text, info.password);    }    var _updatePlaceholder = function(elementId, active, clearText) {        var inputId = $ax.repeater.applySuffixToElementId(elementId, '_input');        var info = idToPlaceholderInfo[elementId];        if(!info || info.active == active) return;        info.active = active;        if(active) var text = info.text;        else if(!ANDROID) text = clearText ? '' : document.getElementById(inputId).value;        else {            var currentText = document.getElementById(inputId).value;            if(!clearText) text = currentText;            else if(currentText == info.text) text = "";            else {                var lastIndex = currentText.lastIndexOf(info.text);                //here i am assuming the text is always inserted in front                text = currentText.substring(0, lastIndex);            }        }        $ax.style.SetWidgetPlaceholder(elementId, active, text, info.password);    };    _placeholderManager.updatePlaceholder = _updatePlaceholder;    var _isActive = function(elementId) {        var info = idToPlaceholderInfo[elementId];        return Boolean(info && info.active);    };    _placeholderManager.isActive = _isActive;    var _selectRange = function(elementId, start, end) {        $jobj(elementId).each(function() {            if(this.setSelectionRange) {                var validTypes = ["text", "search", "url", "tel", "password"];                if(this.tagName.toLowerCase() != "input" || validTypes.indexOf(this.type) > -1) {                    this.focus();                    this.setSelectionRange(start, end);                }            } else if(this.createTextRange) {                var range = this.createTextRange();                range.collapse(true);                range.moveEnd('character', end);                range.moveStart('character', start);                range.select();            }        });    };    _placeholderManager.selectRange = _selectRange;    var _moveCaret = function(id, index) {        var inputIndex = id.indexOf('_input');        if(inputIndex == -1) return;        var inputId = id.substring(0, inputIndex);        if(!_isActive(inputId)) return;        _selectRange(id, index, index);    };    _placeholderManager.moveCaret = _moveCaret;});
 |