import Qt 4.6

import "content"
import "fieldtext"

Item {
    id: WebBrowser

    property string urlString : "http://qt.nokia.com/"

    state: "Normal"

    width: 640
    height: 480

    Item {
        id: WebPanel
        anchors.fill: parent
        clip: true
        Rectangle {
            color: "#555555"
            anchors.fill: parent
        }
        Image {
            source: "content/pics/softshadow-bottom.png"
            width: WebPanel.width
            height: 16
        }
        Image {
            source: "content/pics/softshadow-top.png"
            width: WebPanel.width
            height: 16
            anchors.bottom: Footer.top
        }
        RectSoftShadow {
            x: -Flick.viewportX
            y: -Flick.viewportY
            width: MyWebView.width*MyWebView.scale
            height: Flick.y+MyWebView.height*MyWebView.scale
        }
        Item {
            id: HeaderSpace
            width: parent.width
            height: 60
            z: 1

            Rectangle {
                id: HeaderSpaceTint
                color: "black"
                opacity: 0
                anchors.fill: parent
             }

            Image {
                id: Header
                source: "content/pics/header.png"
                width: parent.width
                height: 64
                state: "Normal"
                x: Flick.viewportX < 0 ? -Flick.viewportX : Flick.viewportX > Flick.viewportWidth-Flick.width
                                         ? -Flick.viewportX+Flick.viewportWidth-Flick.width : 0
                y: Flick.viewportY < 0 ? -Flick.viewportY : progressOff*
                                        (Flick.viewportY>height?-height:-Flick.viewportY)
                Text {
                    id: HeaderText

                    text: MyWebView.title!='' || MyWebView.progress == 1.0 ? MyWebView.title : 'Loading...'
                    elide: "ElideRight"

                    color: "white"
                    styleColor: "black"
                    style: "Raised"

                    font.family: "Helvetica"
                    font.pointSize: 10
                    font.bold: true

                    anchors.left: Header.left
                    anchors.right: Header.right
                    anchors.leftMargin: 4
                    anchors.rightMargin: 4
                    anchors.top: Header.top
                    anchors.topMargin: 4
                    horizontalAlignment: "AlignHCenter"
                }
                Item {
                    width: parent.width
                    anchors.top: HeaderText.bottom
                    anchors.topMargin: 2
                    anchors.bottom: parent.bottom

                    Item {
                        id: UrlBox
                        height: 31
                        anchors.left: parent.left
                        anchors.leftMargin: 12
                        anchors.right: parent.right
                        anchors.rightMargin: 12
                        anchors.top: parent.top
                        clip: true
                        property bool mouseGrabbed: false

                        BorderImage {
                            source: "content/pics/addressbar.sci"
                            anchors.fill: UrlBox
                        }
                                                
                        BorderImage {
                            id: UrlBoxhl
                            source: "content/pics/addressbar-filled.sci"
                            width: parent.width*MyWebView.progress
                            height: parent.height
                            opacity: 1-Header.progressOff
                            clip: true
                        }

                        FieldText {
                            id: EditUrl
                            mouseGrabbed: parent.mouseGrabbed

                            text: WebBrowser.urlString
                            label: "url:"
                            onConfirmed: { WebBrowser.urlString = EditUrl.text; MyWebView.focus=true }
                            onCancelled: { MyWebView.focus=true }
                            onStartEdit: { MyWebView.focus=false }

                            anchors.left: UrlBox.left
                            anchors.right: UrlBox.right
                            anchors.leftMargin: 6
                            anchors.verticalCenter: UrlBox.verticalCenter
                            anchors.verticalCenterOffset: 1
                        }
                    }
                }

                property real progressOff : 1
                states: [
                    State {
                        name: "Normal"
                        when: MyWebView.progress == 1.0
                        PropertyChanges { target: Header; progressOff: 1 }
                    },
                    State {
                        name: "ProgressShown"
                        when: MyWebView.progress < 1.0
                        PropertyChanges { target: Header; progressOff: 0; }
                    }
                ]
                transitions: [
                    Transition {
                        NumberAnimation {
                            target: Header
                            properties: "progressOff"
                            easing: "easeInOutQuad"
                            duration: 300
                        }
                    }
                ]
            }
        }
        Flickable {
            id: Flick
            width: parent.width
            viewportWidth: Math.max(parent.width,MyWebView.width*MyWebView.scale)
            viewportHeight: Math.max(parent.height,MyWebView.height*MyWebView.scale)
            anchors.top: HeaderSpace.bottom
            anchors.bottom: Footer.top
            anchors.left: parent.left
            anchors.right: parent.right

            WebView {
                id: MyWebView
                pixelCacheSize: 4000000

                Script {
                    function fixUrl(url)
                    {
                        if (url == "") return url
                        if (url[0] == "/") return "file://"+url
                        if (url.indexOf(":")<0) {
                            if (url.indexOf(".")<0 || url.indexOf(" ")>=0) {
                                // Fall back to a search engine; hard-code Wikipedia
                                return "http://en.wikipedia.org/w/index.php?search="+url
                            } else {
                                return "http://"+url
                            }
                        }
                        return url
                    }
                }

                url: fixUrl(WebBrowser.urlString)
                smooth: true
                fillColor: "white"
                focus: true

                preferredWidth: Flick.width
                webPageWidth: 980

                onUrlChanged: { if (url != null) { WebBrowser.urlString = url.toString(); } }
                onDoubleClick: { heuristicZoom(clickX,clickY) }

                SequentialAnimation {
                    id: QuickZoom

                    PropertyAction {
                        target: MyWebView
                        property: "renderingEnabled"
                        value: false
                    }
                    ParallelAnimation {
                        NumberAnimation {
                            id: ScaleAnim
                            target: MyWebView
                            property: "scale"
                            from: 1
                            to: 0 // set before calling
                            easing: "easeLinear"
                            duration: 200
                        }
                        NumberAnimation {
                            id: FlickVX
                            target: Flick
                            property: "viewportX"
                            easing: "easeLinear"
                            duration: 200
                            from: 0 // set before calling
                            to: 0 // set before calling
                        }
                        NumberAnimation {
                            id: FlickVY
                            target: Flick
                            property: "viewportY"
                            easing: "easeLinear"
                            duration: 200
                            from: 0 // set before calling
                            to: 0 // set before calling
                        }
                    }
                    PropertyAction {
                        id: FinalZoom
                        target: MyWebView
                        property: "zoomFactor"
                    }
                    PropertyAction {
                        target: MyWebView
                        property: "scale"
                        value: 1.0
                    }
                    // Have to set the viewportXY, since the above 2
                    // size changes may have started a correction if
                    // zoomFactor < 1.0.
                    PropertyAction {
                        id: FinalX
                        target: Flick
                        property: "viewportX"
                        value: 0 // set before calling
                    }
                    PropertyAction {
                        id: FinalY
                        target: Flick
                        property: "viewportY"
                        value: 0 // set before calling
                    }
                    PropertyAction {
                        target: MyWebView
                        property: "renderingEnabled"
                        value: true
                    }
                }
                onZooming: {
                    if (centerX) {
                        sc = zoom/zoomFactor;
                        ScaleAnim.to = sc;
                        FlickVX.from = Flick.viewportX
                        FlickVX.to = Math.min(Math.max(0,centerX-Flick.width/2),MyWebView.width*sc-Flick.width)
                        FinalX.value = Math.min(Math.max(0,centerX-Flick.width/2),MyWebView.width*sc-Flick.width)
                        FlickVY.from = Flick.viewportY
                        FlickVY.to = Math.min(Math.max(0,centerY-Flick.height/2),MyWebView.height*sc-Flick.height)
                        FinalY.value = Math.min(Math.max(0,centerY-Flick.height/2),MyWebView.height*sc-Flick.height)
                        FinalZoom.value = zoom
                        QuickZoom.start()
                    }
                }
            }
            Rectangle {
                id: WebViewTint
                color: "black"
                opacity: 0
                anchors.fill: MyWebView
                /*MouseRegion {
                    anchors.fill: WebViewTint
                    onClicked: { proxy.focus=false }
                }*/
            }
        }
        BorderImage {
            id: Footer
            source: "content/pics/footer.sci"
            width: parent.width
            height: 43
            anchors.bottom: parent.bottom
            Rectangle {
                y: -1
                width: parent.width
                height: 1
                color: "#555555"
            }
            Item {
                id: backbutton
                width: back_e.width
                height: back_e.height
                anchors.right: reload.left
                anchors.rightMargin: 10
                anchors.verticalCenter: parent.verticalCenter
                Image {
                    id: back_e
                    source: "content/pics/back.png"
                    anchors.fill: parent
                }
                Image {
                    id: back_d
                    source: "content/pics/back-disabled.png"
                    anchors.fill: parent
                }
                states: [
                    State {
                        name: "Enabled"
                        when: MyWebView.back.enabled==true
                        PropertyChanges { target: back_e; opacity: 1 }
                        PropertyChanges { target: back_d; opacity: 0 }
                    },
                    State {
                        name: "Disabled"
                        when: MyWebView.back.enabled==false
                        PropertyChanges { target: back_e; opacity: 0 }
                        PropertyChanges { target: back_d; opacity: 1 }
                    }
                ]
                transitions: [
                    Transition {
                        NumberAnimation {
                            properties: "opacity"
                            easing: "easeInOutQuad"
                            duration: 300
                        }
                    }
                ]
                MouseRegion {
                    anchors.fill: back_e
                    onClicked: { if (MyWebView.back.enabled) MyWebView.back.trigger() }
                }
            }
            Image {
                id: reload
                source: "content/pics/reload.png"
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.verticalCenter: parent.verticalCenter
            }
            MouseRegion {
                anchors.fill: reload
                onClicked: { MyWebView.reload.trigger() }
            }
            Item {
                id: forwardbutton
                width: forward_e.width
                height: forward_e.height
                anchors.left: reload.right
                anchors.leftMargin: 10
                anchors.verticalCenter: parent.verticalCenter
                Image {
                    id: forward_e
                    source: "content/pics/forward.png"
                    anchors.fill: parent
                    anchors.verticalCenter: parent.verticalCenter
                }
                Image {
                    id: forward_d
                    source: "content/pics/forward-disabled.png"
                    anchors.fill: parent
                }
                states: [
                    State {
                        name: "Enabled"
                        when: MyWebView.forward.enabled==true
                        PropertyChanges { target: forward_e; opacity: 1 }
                        PropertyChanges { target: forward_d; opacity: 0 }
                    },
                    State {
                        name: "Disabled"
                        when: MyWebView.forward.enabled==false
                        PropertyChanges { target: forward_e; opacity: 0 }
                        PropertyChanges { target: forward_d; opacity: 1 }
                    }
                ]
                transitions: [
                    Transition {
                        NumberAnimation {
                            properties: "opacity"
                            easing: "easeInOutQuad"
                            duration: 320
                        }
                    }
                ]
                MouseRegion {
                    anchors.fill: parent
                    onClicked: { if (MyWebView.forward.enabled) MyWebView.forward.trigger() }
                }
            }
        }
    }
}