﻿// Crank Javascript Library
// Version: 1.3
// Last Update: December 3, 2008
// Author: Ross Dickinson of Eek! LLC.
// Copyright: Ross Dickinson
// Contact: ross@zeropointpromotion.com
//
// This library is to be used in conjunction with the CrankOS Framework for ASP.Net
// Otherwise it's pretty useless.
//
// 1.3 Changes
// -Added onenter event for any object.
// -getStyle() now works properly with both Firefox and IE

Function.prototype.closure = function(obj) {
    // Init object storage.
    if (!window.__objs) {
        window.__objs = [];
        window.__funs = [];
    }

    // For symmetry and clarity.
    var fun = this;

    // Make sure the object has an id and is stored in the object store.
    var objId = obj.__objId;
    if (!objId)
        __objs[objId = obj.__objId = __objs.length] = obj;

    // Make sure the function has an id and is stored in the function store.
    var funId = fun.__funId;
    if (!funId)
        __funs[funId = fun.__funId = __funs.length] = fun;

    // Init closure storage.
    if (!obj.__closures)
        obj.__closures = [];

    // See if we previously created a closure for this object/function pair.
    var closure = obj.__closures[funId];
    if (closure)
        return closure;

    // Clear references to keep them out of the closure scope.
    obj = null;
    fun = null;

    // Create the closure, store in cache and return result.
    return __objs[objId].__closures[funId] = function() {
        return __funs[funId].apply(__objs[objId], arguments);
    };
};



var Crank = {
    Cookie: {
        Add: function() { },
        Remove: function() { },
        Values: {}
    },
    Debugger: {
        _Window: null,
        IsOn: false,
        TurnOn: function() {
            $Crank.Debugger.IsOn = true;
            $Crank.Debugger._Window = $Crank.Op.CreateObj("DebugWindow");
            var Debug = $Crank.Debugger._Window;
            $Document.body.appendChild(Debug);
            Debug.style.position = "absolute";
            Debug.style.display = "block";
            Debug.style.border = "solid 1px silver";
            Debug.style.backgroundColor = "#f3f3f3";
            Debug.style.top = "0px";
            Debug.style.right = "0px";
            Debug.style.width = "250px";
            Debug.style.height = "125px";
            Debug.style.overflow = "auto";
            Debug.style.padding = "5px";
            Debug.style.zIndex = "999999999";
        },
        TurnOff: function() { $Crank.Debugger.IsOn = false; },
        Debug: function(DebugMessage) {
            var OldMessage = $Crank.Debugger._Window.innerHTML;
            $Crank.Debugger._Window.innerHTML = OldMessage + DebugMessage + "<br>";
            OldMessage = null;
        },
        Clear: function() { $Crank.Debugger._Window.innerHTML = ""; }
    },
    Desktop: {
        Document: window.parent.document,
        Window: window.parent.window
    },
    Objects: {},
    System: {
        IsDesktop: function() {
            var ID = (window.parent.location != window.location) ? false : true;
            try { return ID; }
            finally { ID = null; }
        },
        Register: {
            Namespace: function(Object) {
                Crank[Object.Namespace] = Object;
                if (Object.LoadEvents) { Object.LoadEvents(); }
            },
            Object: function(Object) {
                Crank.Objects[Object.Namespace] = Object;
            }
        }
    },
    Mouse: {
        IsIn: function(Object) {
            var Coords = Crank.Mouse.GetCoords(Object);
            var X = Doc.x;
            var Y = Doc.y;
            if (X > Coords.X1 && X < Coords.X2 && Y > Coords.Y1 && Y < Coords.Y2) { return true; }
            else { return false; }
        },
        GetCoords: function(Object) {
            var Coords = {
                X1: Object.offsetLeft,
                X2: GetWidth(Object) + Object.offsetLeft,
                Y1: Object.offsetTop,
                Y2: GetHeight(Object) + Object.offsetTop
            }
            try { return Coords; }
            finally { Coords = null; }
        }
    },
    Operators: {
        $keysIn: function(Object) {
            var keys = [];
            for (var key in Object) { keys.push(key); }
            try { return keys; } finally { keys = null; }
        },
        $hasTerm: function(id, term) {
            try {
                if (id.toString().indexOf(term.toString()) != -1) { return true; }
                else { return false; }
            }
            catch (Error) { return false; }
        }
    },
    Op: {
        Arrays: {
            AddTo: function(Arr, Value) { Arr[Arr.length] = Value; }
        },
        CreateObj: function(ObjectType, Optional_ObjectClass, Optional_ObjectID) {
            var NewObject = document.createElement(ObjectType);
            if (Optional_ObjectClass) { NewObject.className = Optional_ObjectClass; }
            if (Optional_ObjectID) { NewObject.id = Optional_ObjectID; }
            try { return $(NewObject); } finally { NewObject = null; }
        },
        DesktopTitle: function(Title) { $Crank.Op._DesktopTitle(Title); },
        _DesktopTitle: function(Title) { document.title = Title; }
    },
    Events: {
        Initialize: function() {
            var Yeah = function() { alert("YEAH"); } .closure(Yeah);
            window.onbeforeunload = Crank.Events._RunUnload();
        },
        _OnBeforeUnload: [],
        _AddUnload: function(EventObj) { Crank.Events._OnBeforeUnload.push(EventObj); },
        _RunUnload: function() {
            var Events = Crank.Events._OnBeforeUnload;
            for (var i = 0; i < Events.length; i++) {

            }
        },
        Add: function(Object, EventName, Function, Bubbles) {
            var Event = {
                Object: Object,
                EventName: EventName,
                Function: Function,
                Bubbles: Bubbles
            };

            Crank.Events._AddUnload(Event);

            if (!Crank.User.HasIE) { Object.addEventListener(EventName, Function, Bubbles); }
            else if (Crank.User.HasIE) { Object.attachEvent("on" + EventName, Function); }
            else { Object["on" + EventName] = Function; }
            try { return true; }
            finally { Event = null; }
        },
        Remove: function(Object, EventName, Function, Bubbles) {
            if (!Crank.User.HasIE) { Object.removeEventListener(EventName, Function, Bubbles); }
            else if (Crank.User.HasIE) { Object.detachEvent("on" + EventName, Function); }
            else { Object["on" + EventName] = false; }
            return true;
        },
        Event: function(e) {
            var Ev = (e) ? e : window.event;
            try { return Ev; }
            finally { Ev = null; }
        },
        Target: function(e) {
            var Ev = Crank.Events.Event(e);
            var Target = (e.target) ? e.target : e.srcElement;
            try { return Target; }
            finally { Ev = null; Target = null; }
        },
        KeyCode: function(e) {
            var Ev = Crank.Events.Event(e);
            try { return Ev.keyCode; }
            finally { Ev = null; }
        },
        LayerX: function(e) {
            var Ev = Crank.Events.Event(e);
            var X = (Ev.layerX) ? Ev.layerX : Ev.offsetX;
            try { return X; }
            finally { Ev = null; X = null; }
        },
        LayerY: function(e) {
            var Ev = Crank.Events.Event(e);
            var Y = (Ev.layerY) ? Ev.layerY : Ev.offsetY;
            try { return Y; }
            finally { Ev = null; Y = null; }
        },
        Type: function(e) {
            var Ev = Crank.Events.Event(e);
            try { return Ev.type; }
            finally { Ev = null; }
        },
        X: function(e) {
            var Ev = Crank.Events.Event(e);
            var X = (Ev.pageX) ? Ev.pageX : (Ev.clientX + Crank.Desktop.Document.body.scrollLeft - Crank.Desktop.Document.body.clientLeft);
            try { return X; }
            finally { Ev = null; X = null; }
        },
        Y: function(e) {
            var Ev = Crank.Events.Event(e);
            var Y = (Ev.pageY) ? Ev.pageY : (Ev.clientY + document.body.scrollTop - document.body.clientTop);
            try { return Y; }
            finally { Ev = null; Y = null; }
        }
    },
    Errors: {
        Throw: function(ErrorMessage) { throw "CRANK ERROR: " + ErrorMessage; }
    },
    Asp: {
        EventArgs: function(ArgsString) {
            var Input = $('__EVENTARGUMENT');
            if (Input) { Input.value = ArgsString; }
            else { Crank.Errors.Throw("AJAX not supported on this page."); }
        },
        DoPostBack: function(Control) { __doPostBack(Control.name, ''); }
    },
    UI: {
        Anchor: function(Object, ParentObject, TF, RF, BF, LF) {
            if (Object && ParentObject) {
                Object.style.position = "absolute";
                Object.style.top = "0px";
                Object.style.left = "0px";

                function AnchorTime() {
                    var Top = (typeof TF == "function") ? TF() : TF;
                    var Right = (typeof RF == "function") ? RF() : RF;
                    var Bottom = (typeof BF == "function") ? BF() : BF;
                    var Left = (typeof LF == "function") ? LF() : LF;

                    var PHeight, PWidth;

                    var T = parseInt(getStyle(Object, "border-top-width"));
                    var R = parseInt(getStyle(Object, "border-right-width"));
                    var B = parseInt(getStyle(Object, "border-bottom-width"));
                    var L = parseInt(getStyle(Object, "border-left-width"));

                    var ObjBTop = (T) ? T : 0;
                    var ObjBRight = (R) ? R : 0;
                    var ObjBBottom = (B) ? B : 0;
                    var ObjBLeft = (L) ? L : 0;


                    if (ParentObject == window) {
                        PHeight = Window.InnerHeight();
                        PWidth = Window.InnerWidth();
                    }
                    else {
                        PHeight = $(ParentObject).Height();
                        PWidth = $(ParentObject).Width();
                    }
                    var H = PHeight - Top - Bottom - ObjBTop - ObjBBottom;
                    H = (H < 0) ? 0 : H;
                    var W = PWidth - Right - Left - ObjBRight - ObjBLeft;
                    W = (W < 0) ? 0 : W;
                    Object.style.height = H + "px";
                    Object.style.width = W + "px";

                    Object.style.margin = Top + "px " + Right + "px " + Bottom + "px " + Left + "px";


                    Top = null; Right = null; Bottom = null; Left = null; PHeight = null; PWidth = null;
                    T = null; R = null; B = null; L = null; ObjBBottom = null; ObjBLeft = null; ObjBRight = null; ObjBTop = null; H = null; W = null;

                }
                Crank.Events.Add(window, "resize", AnchorTime, false);
                AnchorTime();
            }
        }
    }
};


var _CRNKMETH = {
    Namespace : "Methods", 
    RefreshDesktop : function() {
        Crank.Objects.Window.ReloadAllWindows(); 
        $Get('ctl00_ContentPlaceHolder1_btnRefreshDesktop').click(); 
    },  

    ParseObjectData : function(Object,Text) {
        var T = Text;        
        var FirstSnip, LastSnip;        
        for (var i=0; i<Text.length;i++) {
            if (Text.charAt(i) == "{") { FirstSnip = i; }
            if (Text.charAt(i) == "}") { LastSnip = i; i = Text.length; }
        }        
        var Property = T.substring(FirstSnip + 1,LastSnip);
        return Text.replace("{"+Property+"}",Object[Property]);        
    },
    
    ReloadMeNow : function(URL) { 
        if (!Crank.System.IsDesktop) { window.parent.Crank.Methods.ReloadMeNow(URL); }
        else {
            var Floaters = Crank.Methods.GetOpenWindows()
            var Test = "'" + URL + "'";
            for (var i=0; i<Floaters.length; i++) {
                if (Test.indexOf(Floaters[i].Content.src) != -1) {
                    Floaters[i].ReloadMeNow(); 
                }
            }    
        }
    },
    
    UnloadMe : function() { 
        try { PageMethods.UnloadMe();  }
        catch(Error) { 
            try { $('Crank_Body_UnloadMe').click(); }
            catch(Error) { return false; }
        }
    }
};
Crank.System.Register.Namespace(_CRNKMETH);


var _CRNKREG = function() {
    this.Namespace = "Register";
    var private_BodyHeight_Int;    
    
    // Register Ajax Tabbed Display
    
    this.public_sub_StretchToWindow = function() {
        try {
        document.body.style.height = GetBrowserHeight() + "px";
        private_BodyHeight_Int = document.body.style.height;
        }
        catch(Error) { return true; }
    }
    
    // Register Ajax Tabbed Display Panel
    this.public_sub_RADP = function(ID,HiddenFieldID,FillToHeight,FillToHeightControlID) {
        try {    
            ID = $(ID);
            var HiddenField = $(HiddenFieldID);
            if (FillToHeight) {
                var FTHC = $(FillToHeightControlID);
                var height;
                if (FTHC) { height = GetStyle(FTHC,"height") + "px"; }
                else { height = GetBrowserHeight() + "px"; }
                ID.style.height = height;
                HiddenField.value = height;
            }
        }
        catch(Error) { alert(Error); } 
    }

    // Register Toolbar 
    this.public_sub_RATD = function(ID) {
        
    }      
    return this;    
}
Crank.System.Register.Namespace(new _CRNKREG());



var _CRNKUSER = {
    Namespace : "User",
    Browser : navigator.userAgent,
    BrowserHeight : function() {    
        var BrowserHeight = 0;
        if (document.documentElement.clientHeight) { BrowserHeight = document.documentElement.clientHeight; }
        else { BrowserHeight = window.innerHeight; }
        return BrowserHeight;
    },
    BrowserWidth : function() {
        var BrowserWidth = 0;
        if (document.body.offsetWidth) { BrowserWidth = document.body.offsetWidth; }
        else { BrowserWidth = window.innerWidth; }

        return BrowserWidth;
    },  
    HasMozilla : HasTerm(navigator.userAgent,"Gecko"),
    HasIE7 : HasTerm(navigator.userAgent,"MSIE 7"),
    HasIE6 : HasTerm(navigator.userAgent,"MSIE 6"),
    HasIE : HasTerm(navigator.userAgent,"MSIE")    
};
Crank.System.Register.Namespace(_CRNKUSER);

var _CRNKCOLOR = {
    Namespace: "Colors",
    CrankBlue: "#7391bb",
    CrankDeepBlue: "#617191",
    CrankLightBlue: "#a0c0ec",
    Brightness: function(HexColor, Scale) {
        var r = Scale;
        var a;
        if (r < 0 || typeof (HexColor) != 'string') { return HexColor; }
        else {
            HexColor = HexColor.replace(/[^0-9a-f]+/ig, '');
            if (HexColor.length == 3) { a = HexColor.split(''); }
            else if (HexColor.length == 6) { a = HexColor.match(/(\w{2})/g); }
            else { return HexColor; }
            for (var i = 0; i < a.length; i++) {
                if (a[i].length == 2) { a[i] = parseInt(a[i], 16); }
                else { a[i] = parseInt(a[i], 16); a[i] = a[i] * 16 + a[i]; }
            }
        }

        var maxColor = parseInt('ff', 16);

        function relsize(a) {
            if (a == maxColor) { return Infinity; }
            else { return (a / (maxColor - a)); }
        }

        function relsizeinv(y) {
            if (y == Infinity) { return maxColor; }
            else { return (maxColor * y / (1 + y)); }
        }

        for (i = 0; i < a.length; i++) {
            a[i] = relsizeinv(relsize(a[i]) * r);
            a[i] = Math.floor(a[i]).toString(16);
            if (a[i].length == 1) { a[i] = '0' + a[i]; }
        }
        try { return a.join(''); }
        finally { delete a; }
    }
}
Crank.System.Register.Namespace(_CRNKCOLOR);


////////////////////////////////
////////PUBLIC SHORTCUTS////////
////////////////////////////////

var $ = function(ID) {
    var El = null;
    if (typeof ID == "string") { El = document.getElementById(ID); }
    else if (typeof ID == "object") { El = ID; }

    if (El) {
        if (typeof El == "object") {
            if (!El.CRegistered) {
                El.CRegistered = true;
                if (El.style) {
                    function Christ(Q, I) {
                        El[Q] = function(X) {
                            El.style[I] = X;
                            try { return El; }
                            finally { delete El; }
                        } .closure(El);
                    }

                    var Style = El.style;
                    for (var i in Style) {
                        var Jesus = i.toString();
                        var q = Jesus.substring(0, 1).toUpperCase() + Jesus.substring(1, Jesus.length);

                        Christ(q, i);
                    }

                }

                // Child's Play
                El.AddChild = function(Child, GivePropertyAccess) {
                    var X = Child
                    El.appendChild(X);
                    delete X, El;
                    if (GivePropertyAccess) { El[GivePropertyAccess] = Child; }
                } .closure(El);
                El.CreateChild = function(ObjectType, Optional_ObjectClass, Optional_ObjectID) {
                    var NewChild = CreateObj(ObjectType, Optional_ObjectClass, Optional_ObjectID);
                    El.appendChild(NewChild);
                    return NewChild;
                } .closure(El);

                El.RemoveChild = function(Child) { El.removeChild[Child]; } .closure(El);
                El.MakeOrphan = function() { El.parentNode.removeChild[El]; } .closure(El);

                El.HasTerm = function(String) {
                    var TextTest = El.innerHTML.indexOf(String);
                    if (TextTest > -1) { return true; }
                    else { return false; }
                } .closure(El);

                // Event Management
                El.Events = {
                    Bank: [],
                    Add: function(EventName, Function, Bubbles) {
                        var EventObj = { Object: El, EventName: EventName, Function: Function, Bubbles: Bubbles };
                        var Bank = El.Events.Bank;
                        for (var i = 0; i < Bank.length; i++) {
                            if (Bank[i].EventName == EventObj.EventName && Bank[i].Function == EventObj.Function && Bank[i].Bubbles == EventObj.Bubbles) {
                                //delete Bank[i];
                            }
                        }

                        Crank.Events.Add(El, EventName, Function, Bubbles);
                        El.Events.Bank.push(EventObj);

                        delete EventObj;
                    },
                    Remove: function(EventName, Function, Bubbles) {
                        var EventObj = { Object: El, EventName: EventName, Function: Function, Bubbles: Bubbles };
                        Crank.Events.Remove(El, EventName, Function, Bubbles);
                        var Bank = El.Events.Bank;
                        for (var i = 0; i < Bank.length; i++) {
                            alert(Bank[i]);
                            if (Bank[i].EventName == EventObj.EventName && Bank[i].Function == EventObj.Function && Bank[i].Bubbles == EventObj.Bubbles) {

                                delete Bank[i];
                            }
                        }
                        El.Events.Bank = Bank;
                    }

                };

                // Custom Events
                El.onenter = function(AsFunction) {

                    function EnterFunction(e) {
                        var Keycode = Crank.Events.KeyCode(e);
                        if (Keycode == 13) { AsFunction(); }
                        else { return true; }
                    }
                    Crank.Events.Add(El, "keypress", EnterFunction, false);
                } .closure(El);
                // Methods
                El.Anchor = function(Parent, Functions) { Crank.UI.Anchor(El, Parent, Functions.Top, Functions.Right, Functions.Bottom, Functions.Left); } .closure(El);
                El.DoPostBack = function() { Crank.Asp.DoPostBack(El); } .closure(El);

                // Style Properties
                if (El.style) {
                    El.AddCssClass = function(CssClass) {
                        if (!HasTerm(El.className, " " + CssClass + " ")) { El.className = El.className + " " + CssClass; }
                        return El;
                    } .closure(El);
                    El.RemoveCssClass = function(CssClass) {
                        if (HasTerm(El.className, " " + CssClass + " ")) { El.className = El.className.replace(" " + CssClass + " ", " "); }
                        return El;
                    } .closure(El);

                    El.Scroll = {
                        IsAtBottom: function() {
                            if (El.scrollTop > -1 && El.scrollTop < (El.scrollHeight - El.Height())) { return false; }
                            else { return true; }
                        } .closure(El),
                        ToBottom: function() {
                            El.Scroll.IsAtBottom();
                            El.scrollTop = El.scrollHeight;
                            return El;
                        } .closure(El)
                    };
                    El.Points = function() {
                        var Coords = {
                            X1: El.offsetLeft,
                            X2: (El.offsetLeft + El.offsetWidth),
                            Y1: El.offsetTop,
                            Y2: (El.offsetTop + El.offsetHeight)
                        };
                        return Coords;
                    };
                    El.Clear = function(ClearOption) {
                        if (ClearOption) {
                            ClearOption = ClearOption.toLowerCase(ClearOption);
                            if (ClearOption == "none" || ClearOption == "left" || ClearOption == "right" || ClearOption == "both") {
                                El.style.clear = ClearOption;
                            }
                            else { $FrameworkError("$('" + ID + "').Clear('" + ClearOption + "'): Property does not support this value."); }
                        }
                        else { return El.style.clear; }
                    }
                    El.Float = function(F) {
                        if (F) {
                            F = F.toLowerCase(F);
                            if (F == "none" || F == "left" || F == "right") {
                                if (Crank.User.HasIE) { El.style.styleFloat = F; if (Crank.User.HasIE6) { El.style.display = "inline"; } }
                                else { El.style.cssFloat = F; }
                            }
                            else { $FrameworkError("$('" + ID + "').Float('" + F + "'): Property does not support this value."); }
                        }
                        else {
                            var _float = (Crank.User.HasIE) ? El.style.styleFloat : El.style.cssFloat;
                            if (_float == "") { El.Current.Float = "none"; }
                            return _float;
                        }
                    };
                    El.Height = function() { return El.offsetHeight; };
                    El.Width = function() { return El.offsetWidth; };
                    El.SetHeightCalculated = function(Height) {

                    };
                };
            };
        }
        try { return El; }
        finally { delete El; }
    }
    else { return null; }
}

var $FrameworkError = function(ErrorText) {
    var NewErr = new Error();
    ErrorText = "CrankFramework Error: " + ErrorText;
    NewErr.description = ErrorText;
    NewErr.message = ErrorText;
    throw NewErr
};

var CreateObj = Crank.Op.CreateObj;

var Window = {
InnerHeight: function() { var H = (window.innerHeight) ? window.innerHeight : document.documentElement.clientHeight; return H; },
InnerWidth: function() { var W = (window.innerWidth) ? window.innerWidth : document.documentElement.clientWidth; return W; }
}
        
function HasTerm(id,term) { 
    try {
        if (id.toString().indexOf(term.toString()) != -1) { return true; }
        else { return false; }
    }
    catch(Error) {  }
}

function NewChild(id,child) { id.appendChild(child); }

function GetBrowserWidth() { 
    var BrowserWidth = 0;
    if (document.body.offsetWidth) { BrowserWidth = document.body.offsetWidth; }
    else { BrowserWidth = window.innerWidth; }
    
    return BrowserWidth;
}

function GetBrowserHeight() { 
    var BrowserHeight = 0;
    if (document.documentElement.clientHeight) { BrowserHeight = document.documentElement.clientHeight; }
    else { BrowserHeight = window.innerHeight; }
    return BrowserHeight;
}


function ClearDiv() { 
    var ClearDiv = document.createElement("div");
    ClearDiv.style.clear = "both";
    try { return ClearDiv; }
    finally { ClearDiv = null; }
}

// Gets current rendered properties for an element. Not from stylesheet class.
function getStyle(id, property) {
    if (Crank.User.HasIE) {
        for (var i = 0; i < property.length; i++) {
            if (property.substr(i, 1) == "-") {
                var S = property.substr(i, 2);
                var SReplace = property.substr(i + 1, 1).toUpperCase();
                property = property.replace(S, SReplace);
            }
        }
    }
    return (document.defaultView)? document.defaultView.getComputedStyle(id,null).getPropertyValue(property) : id.currentStyle[property];
}

function GetHeight(id) { 
    var Height = parseFloat(getStyle(id,"height"));
    
    if (isNaN(Height)) { Height = 0; }
    return Height;
}
function GetWidth(id) { return parseFloat(getStyle(id,"width")); }

function AddClass(id,classname) { id.className = id.className + " " + classname; try { return id; } finally { id = null; } }




// Mouse Coordinates stuff
Crank.Events.Add(Crank.Desktop.Document,"mousemove",mouseMove,false);

Doc = { x:'0', y:'0' }
function mouseMove(ev){
	ev = ev || Crank.Desktop.Window.event;
	try {Doc  = mouseCoords(ev); }
	catch(Error) { return false;  }
}


function mouseCoords(ev){
	if (ev.pageX || ev.pageY) { 
	    return { 
	        x:ev.pageX,
	        y:ev.pageY,
	        layerX:ev.layerX,
	        layerY:ev.layerY,
            testX:ev.clientX + Crank.Desktop.Window.scrollX,
            testY:ev.clientY + Crank.Desktop.Window.scrollY
	    };
    }
	try {
	    return {
		    x:ev.clientX + Crank.Desktop.Document.body.scrollLeft - Crank.Desktop.Document.body.clientLeft,
		    y:ev.clientY + document.body.scrollTop  - document.body.clientTop, 
            layerX:ev.offsetX,
            layerY:ev.offsetY,
            testX:ev.clientX + document.body.scrollLeft,
            testY:ev.clientY + document.body.scrollTop
	        };
    }
    catch(Error) { return true; }
}




var $Get = function(ObjectID) { return Crank.Desktop.Document.getElementById(ObjectID); }
var $GetByTag = function(TagName) { return Crank.Desktop.Document.getElementsByTagName(TagName); }
var $GetDesktopObject = function(ObjectName) { return Crank.Desktop.Window.Crank.Objects[ObjectName]; }
var $Window = Crank.Desktop.Window;
var $Document = Crank.Desktop.Document;
var $Crank = $Window.Crank; 

var $calcHeight = function(Obj) { return Obj.offsetHeight; };
var $calcWidth = function(Obj) { return Obj.offsetWidth; };

