/*
 System.js holds useful functions and framework wide variables and settings
 it acts as a config file as well as a library
*/
function instanceOf(instanceIdentifier, ClassPtr)
{
    return GLOBAL["SYSTEM"].instanceOf(instanceIdentifier, ClassPtr)
}

function getUnit(val)
{
    return GLOBAL["SYSTEM"].getUnit(val)
}



function copy(object)
{
    return GLOBAL["SYSTEM"].copy(object)
}

function getCursorPosition(mouseEvent)
{
    return GLOBAL["SYSTEM"].getCursorPosition(mouseEvent);
}

function getStyleFromHTMLNode(HTMLNode)
{
    return GLOBAL["SYSTEM"].getStyleFromHTMLNode(HTMLNode);
}
function getStyleFromExternalCSS(HTMLNode)
{
    return GLOBAL["SYSTEM"].getStyleFromExternalCSS(HTMLNode);
}

function System()
{
        this.colorMap = {
aliceblue:      "F0F8FF",
antiquewhite:   "FAEBD7",
aqua:           "00FFFF",
aquamarine:     "7FFFD4",
azure:          "F0FFFF",
beige:          "F5F5DC",
bisque:         "FFE4C4",
black:          "000000",
blanchedalmond: "FFEBCD",
blue:           "0000FF",
blueviolet:     "8A2BE2",
brown:          "A52A2A",
burlywood:      "DEB887",
cadetblue :	"5F9EA0",
chartreuse :	"7FFF00",
chocolate :	"D2691E",
coral :	        "FF7F50",
cornflowerblue:	"6495ED",
cornsilk :	"FFF8DC",
crimson :	"DC143C",
cyan :	        "00FFFF",
darkblue :	"00008B",
darkcyan :	"008B8B",
darkgoldenrod :	"B8860B",
darkgray :	"A9A9A9",
darkgreen :	"006400",
darkkhaki :	"BDB76B",
darkmagenta :	"8B008B",
darkolivegreen :"556B2F",
darkorange :	"FF8C00",
darkorchid :	"9932CC",
darkred :	"8B0000",
darksalmon :	"E9967A",
darkseagreen :	"8FBC8F",
darkslateblue :	"483D8B",
darkslategray :	"2F4F4F",
darkturquoise :	"00CED1",
darkviolet :	"9400D3",
deeppink :	"FF1493",
deepskyblue :	"00BFFF",
dimgray :	"696969",
dodgerblue :	"1E90FF",
firebrick :	"B22222",
floralwhite :	"FFFAF0",
forestgreen :	"228B22",
fuchsia :	"FF00FF",
gainsboro :	"DCDCDC",
ghostwhite :	"F8F8FF",
gold :	        "FFD700",
goldenrod :	"DAA520",
gray :	        "808080",
green :	        "008000",
greenyellow :	"ADFF2F",
honeydew :	"F0FFF0",
hotpink :	"FF69B4",
indianred:	"CD5C5C",
indigo:	        "4B0082",
ivory :	        "FFFFF0",
khaki :	        "F0E68C",
lavender :	"E6E6FA",
lavenderblush :	"FFF0F5",
lawngreen :	"7CFC00",
lemonchiffon :	"FFFACD",
lightblue :	"ADD8E6",
lightcoral :	"F08080",
lightcyan :	"E0FFFF",
lightgoldenrodyellow :	"FAFAD2",
lightgrey :	"D3D3D3",
lightgreen :	"90EE90",
lightpink :	"FFB6C1",
lightsalmon :	"FFA07A",
lightseagreen :	"20B2AA",
lightskyblue :	"87CEFA",
lightslategray:	"778899",
lightsteelblue:	"B0C4DE",
lightyellow :	"FFFFE0",
lime :	        "00FF00",
limegreen :	"32CD32",
linen :	        "FAF0E6",
magenta :	"FF00FF",
maroon :	"800000",
mediumaquamarine :	"66CDAA",
mediumblue :	"0000CD",
mediumorchid :	"BA55D3",
mediumpurple :	"9370D8",
mediumseagreen:	"3CB371",
mediumslateblue:	"7B68EE",
mediumspringgreen :	"00FA9A",
mediumturquoise:	"48D1CC",
mediumvioletred:	"C71585",
midnightblue :	"191970",
mintcream :	"F5FFFA",
mistyrose :	"FFE4E1",
moccasin :	"FFE4B5",
navajowhite :	"FFDEAD",
navy :	        "000080",
oldlace :	"FDF5E6",
olive :	        "808000",
olivedrab :	"6B8E23",
orange :	"FFA500",
orangered :	"FF4500",
orchid :	"DA70D6",
palegoldenrod :	"EEE8AA",
palegreen :	"98FB98",
paleturquoise :	"AFEEEE",
palevioletred :	"D87093",
papayawhip :	"FFEFD5",
peachpuff :	"FFDAB9",
peru :	        "CD853F",
pink :	        "FFC0CB",
plum :	        "DDA0DD",
powderblue :	"B0E0E6",
purple :	"800080",
red :	        "FF0000",
rosybrown :	"BC8F8F",
royalblue :	"4169E1",
saddlebrown :	"8B4513",
salmon :	"FA8072",
sandybrown :	"F4A460",
seagreen :	"2E8B57",
seashell :	"FFF5EE",
sienna :	"A0522D",
silver :	"C0C0C0",
skyblue :	"87CEEB",
slateblue :	"6A5ACD",
slategray :	"708090",
snow :	        "FFFAFA",
springgreen :	"00FF7F",
steelblue :	"4682B4",
tan :	        "D2B48C",
teal :	        "008080",
thistle :	"D8BFD8",
tomato :	"FF6347",
turquoise :	"40E0D0",
violet :	"EE82EE",
wheat :	        "F5DEB3",
white :	        "FFFFFF",
whitesmoke :	"F5F5F5",
yellow :	"FFFF00",
yellowgreen :	"9ACD32"
}
        this.getComputedStyle = getComputedStyle
        this.getUnit = getUnit
        this.instanceOf = instanceOf
        this.copy = copy
        this.convertColor = convertColor
        this.getCursorPosition = getCursorPosition
        this.getStyleFromExternalCSS = getStyleFromExternalCSS;
        this.getStyleFromHTMLNode = getStyleFromHTMLNode;
        var OSName=null;
        if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";
        if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";
        if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
        if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";
        this.toHex = toHex
        this.OS = OSName
        this.start = (new Date()).getTime()
        
        this.supportedStyleProperties = {position:"static",
                    left:"auto",
                    top:"auto",
                    bottom:"auto",
                    right:"auto",
                    width:"auto",
                    height:"auto",
                    backgroundColor:"transparent",
                    backgroundImage:"",
                    backgroundRepeat:"",
                    backgroundAttachment:"",
                    opacity:"1.0",
                    border:"",
                    borderTop:"",borderBottom:"",borderLeft:"",borderRight:"",
                    margin:"",
                    marginTop:"",marginRight:"",marginBottom:"",marginLeft:"",
                    padding:"",
                    paddingTop:"",paddingRight:"",paddingBottom:"",paddingLeft:"",
                    textAlign:"left",
                    verticalAlign:"",
                    textColor:"000000",
                    textDecoration:"",
                    textIndent:"",
                    fontFamily:"",
                    fontSize:"",
                    fontStyle:"",
                    fontWeight:"",
                    direction:"",
                    clip:"",
                    display:"",
                    cursor:"",
                    visibility:"visible",
                    zIndex:"auto",
                    force:"",
                    overflow:"visible",
                    lineHeight:"normal"}
        /*
            animation will change a lot, this will be changed most likey
            as the animation library becomes more advanced
        */
        this.animateableStyleProperties = {position:-1,
                      left:-1,
                      top:-1,
                      bottom:-1,
                      right:-1,
                      width:-1,
                      height:-1,
                      backgroundColor:-1,
                      textColor:-1,
                      opacity:-1,
                      borderStyle:-1,
                      borderWidth:-1,
                      borderColor:-1,
                      visibility:-1,
                      zIndex:-1,
                      margin:-1,
                      marginTop:-1,marginLeft:-1,marginBottom:-1,marginRight:-1}
        
        function convertColor(val)
        {
            if(val.indexOf("#") != -1)
                return val.substr(1,6);
            if(val.indexOf("rgb") != -1)
            {
                var str = val.split("(")[1]
                str = str.split(")")[0]
                str = str.split(",")
                r = parseInt(str[0]); g = parseInt(str[1]); b = parseInt(str[2])
                rgb = this.toHex(r)+this.toHex(g)+this.toHex(b)
                return rgb
            }
            else
            {
                //look up the value for the string rep.
                if(this.colorMap[val.toLowerCase()])
                {
                    return this.colorMap[val.toLowerCase()]
                }
                return "transparent"
            }
        }
        
        function getComputedStyle(el, cssprop)
        {
            if(el.HTMLNode)
            {
                el = el.HTMLNode
            }
            if(cssprop == "opacity" && el.currentStyle)
            {
                return parseInt(el.currentStyle["filter"].split("=")[1])/100.0;
            }
            if (el.currentStyle) //IE
             return el.currentStyle[cssprop]
            else if (document.defaultView && document.defaultView.getComputedStyle) //Firefox
             return document.defaultView.getComputedStyle(el, "")[cssprop]
            else //try and get inline style
             return el.style[cssprop]
        }
        
        function getUnit(val)
        {
            if(typeof(val) != "string") return null;
            if(val.indexOf("px") != -1)
            {
                return "px"
            }
            if(val.indexOf("em") != -1)
            {
                return "em";
            }
            if(val.indexOf("%") != -1)
            {
                return "%";
            }
            if(val.indexOf("in") != -1)
            {
                return "in"
            }
            if(val.indexOf("cm") != -1)
            {
                return "cm";
            }
            if(val.indexOf("mm") != -1)
            {
                return "mm";
            }
            if(val.indexOf("ex") != -1)
            {
                return "ex";
            }
            if(val.indexOf("pt") != -1)
            {
                return "pt";
            }
            if(val.indexOf("pc") != -1)
            {
                return "pc"
            }
            return "";
        }
        function toHex(num)
        {
            if (num==null) return "00";
            num=parseInt(num); if (num==0 || isNaN(num)) return "00";
            num=Math.max(0,num); num=Math.min(num,255); num=Math.round(num);
            return "0123456789ABCDEF".charAt((num-num%16)/16) + "0123456789ABCDEF".charAt(num%16);
        }
        function instanceOf(instanceIdentifier, ClassPtr)
        {
            if(instanceIdentifier == null)
            {
                return false;
            }
            
            if(ClassPtr == null || ClassPtr.type == "" || ClassPtr.type == null)
            {
                alert("The Class supplied is not set up correctly")
                return false;
            }
            if(instanceIdentifier.type == ClassPtr.type)
            {
                return true;
            }
            return false;
        }
        
        function copy(object)
        {
            if(typeof(object) != "object")
            {
                return object
            }
            var deepCopy = new Object()
            for(var member in object)
            {
               deepCopy[member] = object[member] 
            }
            return deepCopy
        }
        
        function getCursorPosition(e)
        {
            //input: mouse event parameter
            e = e || window.event;
            var cursor = {x:0, y:0};
            if (e.pageX || e.pageY)
            {
                cursor.x = e.pageX;
                cursor.y = e.pageY;
            } 
            else
            {
                cursor.x = e.clientX + 
                (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
                cursor.y = e.clientY + 
                (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
            }
            return cursor;
        }
        
    function getStyleFromHTMLNode(child)
    {
        var default_style = DOMNODE.style
        var child_style = new Object()
        for(var attrName in default_style)
        {
            attrName = attrName
            if(attrName == "force")
                attrName = "float"
            if(attrName == "textColor")
                attrName = "color"
            var val = child.style[attrName]
            if(attrName.indexOf("color") != -1 || attrName.indexOf("Color") != -1)
            {
                //convert from rgb(i,i,i) or ascii to hex
                if(val.indexOf("#") == -1)
                {
                   if(val != "transparent")
                        val = this.convertColor(val);
                    
                }
                else
                {
                    //it was found still need to strip the #
                    val = val.replace("#","")
                }
            }
            if(val)
                child_style[attrName] = val
        }
        return child_style;
    }
    
    function getStyleFromExternalCSS(child)
    {
        var default_style = DOMNODE.style
        var child_style = new Object()
        for(var attrName in default_style)
        {
            attrName = attrName
            if(attrName == "force")
                attrName = "float"
            if(attrName == "textColor")
                attrName = "color"
            var val = GLOBAL["SYSTEM"].getComputedStyle(child,attrName);
            if(attrName.indexOf("color") != -1 || attrName.indexOf("Color") != -1)
            {
                //convert from rgb(i,i,i) or ascii to hex
                if(val.indexOf("#") == -1)
                {
                    if(val != "transparent")
                        val = this.convertColor(val);
                }
                else
                {
                    //it was found still need to strip the #
                    val = val.replace("#","")
                }
            }
            if(val)
                child_style[attrName] = val
        }
        return child_style;
    }
}
