<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="chrome=1">
    <title>Css-element-queries test</title>
    <script src="mootools-core-full-nocompat.js"></script>
    <script src="mootools-more-yui-compressed.min.js"></script>
    <script src="../src/ResizeSensor.js"></script>
    <script src="../src/ElementQueries.js"></script>

    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <!--[if lt IE 9]>
    <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <script>
        'use strict';
        var ResizerDemo = new Class({
            y: null,
            initialize: function(container) {
                this.container = container;
                this.setupLayout();
            },

            setupLayout: function(){
                this.handler = new Element('div', {
                    'class': 'resizerDemo-handler'
                }).inject(this.container);

                this.container.makeResizable({
                    snap: 0,
                    handle: this.handler,
                    modifiers: {
                        'x': 'width',
                        'y': this.y
                    }
                });
            }
        });

        var ResizeDemoXY = new Class({
            Extends: ResizerDemo,
            y: 'height'
        });

        window.addEvent('domready', function(){
            $$('.examplesResizerDemos').each(function(resizer){
                new ResizerDemo(resizer);
            });
            $$('.examplesResizerDemosXY').each(function(resizer){
                new ResizeDemoXY(resizer);
            });
        });
    </script>
    <style type="text/css">
        .examplesResizerDemos,
        .examplesResizerDemosXY {
            background-color: white;
            width: 550px;
            margin: 15px;
            padding: 15px 0;
            position: relative;
            border-left: 1px dashed silver;
            border-bottom: 1px dashed silver;
        }

        .examplesResizerDemosXY {
            height: 150px;
        }

        .resizerDemo-handler {
            position: absolute;
            right: 0;
            top: 0;
            bottom: 0;
            width: 5px;
            padding: 0 1px;
            background-color: gray;
            cursor: ew-resize;
            line-height: 5px;
            font-size: 14px;
        }

        .resizerDemo-handler:before {
            content: '• • •';
            color: white;
            width: 5px;
            position: absolute;
            top: 50%;
            margin-top: -15px;
        }

        .example-1 {
            max-width: 400px;
            border: 1px solid silver;
            background-color: #eee;
            margin: auto;
            padding: 50px;
            text-align: center;
            min-width: 120px;
            transition:all .2s ease;
        }

        .example-1[max-width~="400px"] {
            padding: 5px;
        }

        .example-1[max-width~="200px"] {
            text-align: left;
            font-size: 12px;
        }

        .example-2 {
            border: 1px solid silver;
            margin: 25px;
            background-color: #eee;
        }

        .example-2-first,
        .example-2-second {
            background-color: black;
            color: white;
            padding: 2px;
            width: 45%;
            margin: 5px;
            float: left;
        }

        .example-2-second {
            float: right;
        }

        .example-2-box {
            background-color: gray;
            color: white;
            margin: 5px;
            padding: 2px;
        }

        .example-2[max-width~="300px"] .example-2-first,
        .example-2[max-width~="300px"] .example-2-second {
            float: none;
            background-color: #4186ff;
            width: auto;
        }

        .example-2[max-width~="350px"] .example-2-box {
            background-color: #ba9196;
        }

        .example-2[max-width~="300px"] .example-2-box {
            background-color: #ba6377;
        }

        .example-2[max-width~="200px"] .example-2-box {
            background-color: #ba4349;
        }

        .example-2[max-width~="100px"] .example-2-box {
            background-color: #ba000d;
        }

        .example-3,
        .example-4 {
            border: 1px solid silver;
            margin: 25px;
            background-color: #eee;
        }

        #example-5 {
            overflow: visible;
            position: relative;
            z-index: 150;
            text-align: center;
        }

        #example-3-box,
        #example-4-box {
            background-color: gray;
            color: white;
            margin: auto;
            width: 50%;
            padding: 50px;
        }

        .example-3-box-start,
        .example-4-box-start {
            animation-duration: 3s;
            -moz-animation-duration: 3s;
            -webkit-animation-duration: 3s;
            -moz-animation-name: anim;
            animation-name: anim;
            -webkit-animation-name: anim;
            animation-iteration-count: infinite;
            -webkit-animation-iteration-count: infinite;
        }

        .example-4-box-start {
            -moz-animation-name: animHeight;
            animation-name: animHeight;
            -webkit-animation-name: animHeight;
        }

        #example-3-log,
        #example-4-log {
            background-color: white;
            padding: 2px;
            margin: 5px;
        }

        @keyframes anim {
            0% {
                padding: 50px;
                width: 50%;
                background-color: gray;
            }

            50% {
                padding: 10px;
                width: 40%;
                background-color: #806522;
            }

            100% {
                padding: 50px;
                width: 50%;
                background-color: gray;
            }
        }

        @-webkit-keyframes anim {
            0% {
                padding: 50px;
                width: 50%;
                background-color: gray;
            }

            50% {
                padding: 10px;
                width: 40%;
                background-color: #806522;
            }

            100% {
                padding: 50px;
                width: 50%;
                background-color: gray;
            }
        }

        @-moz-keyframes anim {
            0% {
                padding: 50px;
                width: 50%;
                background-color: gray;
            }

            50% {
                padding: 10px;
                width: 40%;
                background-color: #806522;
            }

            100% {
                padding: 50px;
                width: 50%;
                background-color: gray;
            }
        }

        @keyframes animHeight {
            0% {
                padding: 50px;
                height: 50%;
                background-color: gray;
            }

            50% {
                padding: 10px;
                height: 40%;
                background-color: #806522;
            }

            100% {
                padding: 50px;
                height: 50%;
                background-color: gray;
            }
        }

        @-webkit-keyframes animHeight {
            0% {
                padding: 50px;
                height: 50%;
                background-color: gray;
            }

            50% {
                padding: 10px;
                height: 40%;
                background-color: #806522;
            }

            100% {
                padding: 50px;
                height: 50%;
                background-color: gray;
            }
        }

        @-moz-keyframes animHeight {
            0% {
                padding: 50px;
                height: 50%;
                background-color: gray;
            }

            50% {
                padding: 10px;
                height: 40%;
                background-color: #806522;
            }

            100% {
                padding: 50px;
                height: 50%;
                background-color: gray;
            }
        }

        .dynamicElement {
            margin: 50px;
            width: 50px;

            -moz-animation-name: animHeight;
            animation-name: animHeight;
            -webkit-animation-name: animHeight;

            animation-duration: 3s;
            -moz-animation-duration: 3s;
            -webkit-animation-duration: 3s;
            animation-iteration-count: infinite;
            -webkit-animation-iteration-count: infinite;

            display: inline-block;
            border: 1px solid #eee;
            background-color: #f9f9f9;
        }

        .dynamic {
            margin: 15px;
        }

    </style>
</head>
<body>    
    Drag the gray line at the right to see it in action.
    <div class="examples">
        <div class="examplesResizerDemos">
            <div class="example-1">
                <h2>Demo 1</h2>
                This is content from the first responsive demo without media queries. It uses the element queries provided by this library.
            </div>
        </div>
        <div class="examplesResizerDemos">
            <div class="example-2">
                <h2>Demo 2</h2>
                <div class="example-2-box">
                    Box
                </div>
                <div class="example-2-first">
                    First 1/2 box
                </div>
                <div class="example-2-second">
                    Second 1/2 box
                </div>
                <div class="breaker"></div>
            </div>
        </div>
        <div class="examplesResizerDemos">
            <div class="example-3">
                <h2>Demo 3 - width<button id="startStop3">Start/Stop</button></h2>
                <div id="example-3-box">
                    This box is animated through css transitions.
                    We attached a resize-listener to this box. See below.
                </div>
                <div id="example-3-log">
                    No changes.
                </div>
            </div>
        </div>
        <div class="examplesResizerDemos">
            <div class="example-4">
                <h2>Demo 4 - height<button id="startStop4">Start/Stop</button></h2>
                <div id="example-4-box">
                    This box is animated through css transitions.
                    We attached a resize-listener to this box. See below.
                </div>
                <div id="example-4-log">
                    No changes.
                </div>
            </div>
        </div>

        <div style="height: 200px">
            <div class="examplesResizerDemosXY">
                <div id="example-5">
                    0 changes
                </div>
            </div>
        </div>
        <script>
            'use strict';
            (function(){
                var logger = document.id('example-3-log');
                var box = document.id('example-3-box');
                document.id('startStop3').addEvent('click', function(){
                    if (box.hasClass('example-3-box-start')) {
                        box.removeClass('example-3-box-start');
                    } else {
                        box.addClass('example-3-box-start');
                    }
                });
                new ResizeSensor(box, function(el){
                    logger.set('html', 'Changed to ' + box.getSize().x+'px width.');
                });
            })();
        </script>
        <script>
            'use strict';
            (function(){
                var logger = document.id('example-4-log');
                var box = document.id('example-4-box');
                document.id('startStop4').addEvent('click', function(){
                    if (box.hasClass('example-4-box-start')) {
                        box.removeClass('example-4-box-start');
                    } else {
                        box.addClass('example-4-box-start');
                    }
                });
                new ResizeSensor(box, function(){
                    logger.set('html', 'Changed to ' + box.getSize().y+'px height.');
                });
            })();
        </script>
        <script>
            'use strict';
            (function(){
                var box = document.id('example-5');
                var changed = 0;
                new ResizeSensor(box.getParent(), function(){
                    box.innerHTML = (++changed) + ' changes. ' + box.getParent().getSize().x+'px/'+box.getParent().getSize().y+'px';
                });
            })();
        </script>
        <div class="dynamic">
            <input type="text" value="10" id="dynamicCount" />
            <button onclick="addDynamic()">Add</button>
            <button onclick="detachDynamic()">Detach</button>
            <button onclick="removeDynamic()">Remove</button>
            <div id="dynamicCounter"></div>
            <div id="dynamicContainer"></div>
        </div>
        <script>
            'use strict';
            var container = $('dynamicContainer');
            var dynamicCount = $('dynamicCount');
            var dynamicCounter = $('dynamicCounter');

            window.detachDynamic = function() {
                container.getChildren().each(function(element) {
                    ResizeSensor.detach(element);
                });
            };

            window.removeDynamic = function() {
                container.empty();
            };

            window.addDynamic = function() {
                container.empty();
                var i = 0, to = dynamicCount.value, div, counter = 0;
                for (; i < to; i++) {
                    div = new Element('div', {
                        'class': 'dynamicElement',
                        text: '#' + i
                    }).inject(container);

                    new ResizeSensor(div, function(){
                        counter++;
                        dynamicCounter.set('text', counter + ' changes.');
                    });
                }
            }
        </script>
    </div>
</body>
