﻿


var Constants =
 {
     Screen:
     {
         
         AvailHeight: "SAH",
         AvailWidth: "SAW",
         Height: "SCH",
         Width: "SCW",
         ColorDepth: "SCD"
     },

     Browser:
     {
         
         ClientHeight: "BRH",
         ClientWidth: "BRW"
     },

     Modernizr:
    {
        
        CSS3Common: "",
        CSS3Anim: "",
        HTML5: "",
        HTML5InputTypes: "",
        HTML5InputAttributes: "",
        MISC: "",

        
        Properties:
        {
            
        },

        
        PropNames:
        {
            HTML5InputTypes: "inputtypes",
            HTML5InputAttributes: "input"
        }
    }
 };


 var ModernizrHelper = (function () {

    
    var _modProperties = Constants.Modernizr.Properties;
    var _modPropNames = Constants.Modernizr.PropNames;

    
    var _setProperties = function (_strPropertyPrefix, _arrEnumsValues)
    {
        
        _modProperties[_strPropertyPrefix] = new Object;

        
        var _arrValues = _arrEnumsValues.split(',');

        
        for (var _index in _arrValues)
        {
            
            var _splittedItem = _arrValues[_index].split('=');
            if (_splittedItem && _splittedItem.length == 2)
            {
                
                _modProperties[_strPropertyPrefix][_splittedItem[0].toLowerCase()] = _splittedItem[1];
            }
        }
    }

    
    var _strEnumsValues = "None=0,Agnostic=1,FontFace=2,BackgroundSize=4,BorderImage=8,BorderRadius=16,BoxShadow=32,Flexbox=64,Hsla=128,Multiplebgs=256,Opacity=512,Rgba=1024,TextShadow=2048,CSSAnimations=4096,CSSColumns=8192,GeneratedContent=16384,CSSGradients=32768,CSSReflections=65536,CSSTransforms=131072,CSSTransforms3d=262144,CSSTransitions=524288,Empty=-1|None=0,Agnostic=1,ApplicationCache=2,Canvas=4,CanvasText=8,DragAndDrop=16,Hashchange=32,History=64,Audio=128,Video=256,IndexedDB=512,LocalStorage=1024,PostMessage=2048,SessionStorage=4096,WebSockets=8192,WebSQLDatabase=16384,WebWorkers=32768,Empty=-1|None=0,Agnostic=1,Geolocation=2,InlineSVG=4,SMIL=8,SVG=16,SVFClipPaths=32,Touch=64,WebGL=128,PngSupport=256,ScrollbarSupport=512,VirtualKeyboardPopupOnFocus=1024,Empty=-1";

    var _arrEnumsValues = _strEnumsValues.split('|');

    _setProperties('CSS3', _arrEnumsValues[0]);
    _setProperties('HTML5', _arrEnumsValues[1]);
    _setProperties('MISC', _arrEnumsValues[2]);

    var _resolveProperty = function (key, objKeyDefer)
    {
        switch (key)
        {
            case "scrollbarsupport":
                if (document)
                {
                    
                    var objDivElement = document.createElement("DIV");
                    objDivElement.style.cssText = "overflow:scroll;width:50px;height:50px;";
                    document.body.appendChild(objDivElement);

                    
                    var blnIsScrollbarSupported = (objDivElement.clientWidth != objDivElement.offsetWidth || objDivElement.clientHeight != objDivElement.offsetHeight);

                    
                    document.body.removeChild(objDivElement);

                    
                    objKeyDefer.resolve([blnIsScrollbarSupported, key]);
                }
                break;
            case "virtualkeyboardpopuponfocus":
                var s521 = $("#input");

                
                s521.blur();
                setTimeout(function ()
                {
                    
                    var intHeightBefore = $(window).height();
                    s521.focus();

                    setTimeout(function ()
                    {
                        
                        var intHeightAfter = $(window).height();

                        
                        var blnIsVirtualKeyboardPopupOnFocus = intHeightBefore !== intHeightAfter;

                        
                        objKeyDefer.resolve([blnIsVirtualKeyboardPopupOnFocus, key]);
                    }, 400);
                }, 400);
                break;
            default:
                
                objKeyDefer.resolve(false);
                break;
        }
    };

    var _getFlagsCombo = function (flagsSetID, modObject, objFlagsDefer)
    {
        var supported = [];

        if (_modProperties)
        {
            var arrAllKeysDefers = [];
            for (var key in _modProperties[flagsSetID])
            {
                var objKeyDefer = new $.Deferred();
                arrAllKeysDefers.push(objKeyDefer);
                var value = modObject[key]; 

                if (value)
                {
                    supported.push(key);
                    objKeyDefer.resolve();
                }
                else
                {
                    objKeyDefer.done(function (resultArray)
                    {
                        if (resultArray && resultArray[0])
                        {
                            supported.push(resultArray[1]);
                        }
                    });

                    _resolveProperty(key, objKeyDefer);
                }
            }

            $.when.apply(null, arrAllKeysDefers).done(function ()
            {
                var result = 0;
                var len = supported.length;
                for (var i = 0; i < len; i++)
                {
                    result = result | _modProperties[flagsSetID][supported[i]];
                }

                objFlagsDefer.resolve(result);
            });
        }
    };

    var getFlagsCombo = function (flagsSetID, objFlagsDefer)
    {
        var modObject = Modernizr;
        if (flagsSetID in _modPropNames)
        {
            modObject = modObject[_modPropNames[flagsSetID]];
        }

        if (modObject)
        {
            return _getFlagsCombo(flagsSetID, modObject, objFlagsDefer);
        }
    };

    return {

        getFlagsCombo: getFlagsCombo
    }

}());
