﻿/// <reference name="MicrosoftAjax.js"/>




Type.registerNamespace("GujaWebControls");

GujaWebControls.AnnouncementData = function(date, title,link) {
    this._date = date;
    this._title = title;
    this._link = link;
}
GujaWebControls.AnnouncementData.prototype = {
    set_date: function(value) {
        this._date = value;
    },

    get_date: function() {
        return this._date;
    },
    set_title: function(value) {
        this._title = value;
    },

    get_title: function() {
        return this._title;
    },
    set_link: function(value) {
    this._link = value;
    },

    get_link: function() {
    return this._link;
    }
    
}
GujaWebControls.AnnouncementData.registerClass('GujaWebControls.AnnouncementData');



GujaWebControls.AnnouncementItem = function(element, initPosition) {
    this._element = element;
    this._initPosition = initPosition;
    this._visibleFlag = true;
    
}
GujaWebControls.AnnouncementItem.prototype = {
    set_element: function(value) {
        this._element = value;
    },

    get_element: function() {
        return this._element;
    },
    set_initPosition: function(value) {
        this._initPosition = value;
    },

    get_initPosition: function() {
        return this._initPosition;
    },

    set_visibleFlag: function(value) {
    if (value) {
        
            if (Sys.Browser.agent == Sys.Browser.InternetExplorer) {

                this._element.style.visibility = "visible";

            }
        }
        
        
        
        
        
        else {
        
            if (Sys.Browser.agent == Sys.Browser.InternetExplorer) {

                this._element.style.visibility = "hidden";
                            
            }
           
        }
        this._visibleFlag = value;
    },

    get_visibleFlag: function() {
        return this._visibleFlag;
    }


}
GujaWebControls.AnnouncementItem.registerClass('GujaWebControls.AnnouncementItem');





GujaWebControls.AnnouncementControl = function(element) {


    this._directionUp2Down = false;

    this._normalRowCssClass = "normalRowNews";
    this._hoverRowCssClass = "hoverRowNews";
    this._dateClass = "najavedatum";


    this._move = false;
    this._divList = [];

    this._maxTop = 0;
    this._dateTextSeparator = "  - ";

    this._dateFormat = "dd.MM.";
    this._positionStyle = "relative";
    this._countItems = 0;

    this._rowHeight;

    this._itemPadding = 8;
    this._borderBottomWidth = 0;
    this._rowHeightDefined = 30;
    this._borderItemStyle = "dotted";

    this._borderItemColor = "green";

    this._intervalId = '';

    this._dataList = [];

    this._moveSpeed = '';

    this._elementsCollectionHeight = 0;

    this._moveValue = -1;

    this._moveInterval = 150;
    //Required Event Handlers    
    this._mouseOverHandler = null;
    this._mouseOutHandler = null;


    GujaWebControls.AnnouncementControl.initializeBase(this, [element]);

}






GujaWebControls.AnnouncementControl.prototype = {



    addData: function(record) {
        this._validateRecord(arguments);

        Array.add(this._dataList, record);
    },

    removeData: function(record) {
        this._validateRecord(arguments);

        Array.remove(this._dataList, record);
    },





    _addDivElement: function(element, position) {


        var divEl = new GujaWebControls.AnnouncementItem(element, position);
        Array.add(this._divList, divEl);


    },





    _validateRecord: function(args) {
        var e = Function._validateParams(args,
    [{ name: 'record', type: GujaWebControls.AnnouncementData, mayBeNull: false}]);

        if (e) throw e;
    },




    get_dataList: function() {
        return this._dataList;
    },

    //Setter for hoverImage Property
    set_dataList: function(value) {
        this._dataList = value;
    },

    _getInitPosition: function(element) {

        for (var i = 0; i < this._divList.length; i++) {
            try {
                if (this._divList[i].get_element().id == element.id) {
                    return this._divList[i].get_initPosition();
                }
            }
            catch (err)
            { }
        }
    },



    //funkcija koja stavlja elemente jedan ispod drugoga, bez obzira da li se oni vide ili ne te pokreće elemente odozdo prema gore
    showDownToUp: function() {

        try {
            var brOverFlout = 0;

            var target = this.get_element();

            target.style.overflow = "hidden";

            var br = this.get_dataList().length;
            var overFlowheight = 0;

            var dataObj = null;


            for (var i = 0; i < br; i++) {


                dataObj = this.get_dataList()[i];

                var title = dataObj.Title;

                var date = dataObj.Date;

                var link = dataObj.Link;

                var divContent = document.createElement('div')
                divContent.setAttribute('id', target.id + i);
                divContent.style.position = this._positionStyle;


                var text = this._createNewElement(date, title, link, this._dateTextSeparator);

                divContent.appendChild(text);

                divContent.className = this._normalRowCssClass;


                target.appendChild(divContent);

                this._addDivElement(divContent, this._elementsCollectionHeight);

                this._elementsCollectionHeight += parseInt(divContent.scrollHeight);

                //ako je trenutačna ukupna veličina svih elemenata + prosječna visina nekog elementa veća od kontejner tada ce se sve rotirati
                if (this._elementsCollectionHeight /*+ 30 */ >= parseInt(target.style.height)) {

                    this._move = true;
                }

                if (this._elementsCollectionHeight >= parseInt(target.style.height)) {

                    //this._divList[i].set_visibleFlag(false);



                }




                this._countItems++;
            }

            if (this._move) {

                this.startMoving();
            }

        }
        catch (err) {
            // alert(err);
        }


    },


    show: function() {


        try {
            var brOverFlout = 0;

            var target = this.get_element();

            target.style.overflow = "hidden";

            var br = this.get_dataList().length;
            var overFlowheight = 0;

            var dataObj = null;
            //varijabla koja broji koliko smo udaljeni od kraja polja
            var j = 0;

            for (var i = 0; i < br; i++) {




                if (!this._move) {
                    dataObj = this.get_dataList()[i];

                }

                //preostale elemente koji se ne vide treba uzeti u invertiranome poretku kako bi svi skupa bili ispravno sortirani
                else {

                    dataObj = this.get_dataList()[(br - 1) - j];
                    // alert(dataObj.Date + "..." + this._move);
                    j++;

                }

                var title = dataObj.Title;

                var date = dataObj.Date;






                var link = dataObj.Link;


                var divContent = document.createElement('div')
                divContent.setAttribute('id', target.id + i);
                divContent.style.position = this._positionStyle;


                var text = this._createNewElement(date, title, link, this._dateTextSeparator);

                divContent.appendChild(text);

                divContent.className = this._normalRowCssClass;


                target.appendChild(divContent);







                this._addDivElement(divContent, this._elementsCollectionHeight);

                this._elementsCollectionHeight += parseInt(divContent.scrollHeight);

                //kako bismo unaprijed znali da li ce biti potrebno invertirati dio polja podataka
                if (this._elementsCollectionHeight + 50 >= parseInt(target.style.height)) {

                    this._move = true;
                }

                if (this._elementsCollectionHeight >= parseInt(target.style.height)) {





                    divContent.style.top = ((-1) * (this._divList[i].get_initPosition() + parseInt(divContent.scrollHeight) + overFlowheight)) + "px";
                    overFlowheight += parseInt(divContent.scrollHeight);

                    this._divList[i].set_visibleFlag(false);



                }
                else {

                    divContent.style.top = 0 + "px";
                }



                this._countItems++;
            }

            if (this._move) {

                this.startMoving();
            }

        }
        catch (err) {
            // alert(err);
        }
    },


    _createNewElement: function(date, title, link, separator, htmlObject) {
        var rez = null;
        separator = "";
        if (htmlObject == undefined) {
            rez = document.createElement('a');
            rez.setAttribute('href', link);
            if (date == undefined || date == null) {
                date = "";

            }
            //var text = document.createTextNode(date + separator + title);
            
            var text = "<div><span class=" + this._dateClass + ">" + date + "</span></div>" + separator + title;

            rez.innerHTML = text;
            // rez.appendChild(text);
        }


        else {
            rez = document.createElement('div');
            rez.innerHTML = htmlObject;

        }
        return rez;
    },



    moveitBy: function(element, x, y) {


        if (element.style.left == "") {

            element.style.left = 0;
        }
        if (element.style.top == "") {


            element.style.top = 0;
        }


        element.style.left = parseInt(element.style.left) + x + "px";
        element.style.top = parseInt(element.style.top) + y + "px";








    },





    moveitTo: function(element, x, y) {

        //alert("move to " + element.id +"....top" +element.style.top+ " x, y"+x+":"+y);
        element.style.left = x + "px"
        element.style.top = y + "px"
        //alert("moved to " + element.id + "....top" + element.style.top);

    },




    startMoving: function() {


        var interval = this._moveInterval;

        this._intervalId = setInterval(Function.createDelegate(this, this.move), interval);



    },






    move: function() {




        var element = this.get_element()

        var thisChild = element.firstChild;

        while (thisChild != element.lastChild) {

            this._moveOneElement(thisChild);


            thisChild = thisChild.nextSibling;
        }

        //ostao je jos jedan za pomaknuti
        this._moveOneElement(thisChild);


        if (this._directionUp2Down) {
            this._checkPositionsCircularMode();
        }

        else {
            this._checkPositionsCircularMode2();

        }
    },



    _checkPositions: function() {

        //alert("checking");
        var element = this.get_element()

        var thisChild = element.firstChild;
        var elementHeight = parseInt(element.style.height);

        while (thisChild != element.lastChild) {


            var top = parseInt(thisChild.style.top);
            var globalTop = '';
            if (this._moveValue > 0) {
                globalTop = top + this._elementsCollectionHeight;
            }
            else {
                globalTop = top;
            }
            //došli smo do dna parent containera, trabamo se nastaviti gibati u suprotnome smijeru
            if (globalTop > elementHeight) {


                this.changeMoveDirection();
                break;


            }
            if (globalTop < 0) {


                this.changeMoveDirection();
                break;
            }

            thisChild = thisChild.nextSibling;
        }




    },



    // provjera za pomicanje elemenata odozdo prema gore
    _checkPositionsCircularMode2: function() {


        var element = this.get_element()

        var thisChild = null;
        var elementHeight = parseInt(element.style.height);

        var newYLocation = 0;

        var top;
        var br = 1;
        var pom1 = 0;
        var pom2 = 0;
        var temp = 0;
        var initPos = 0;
        var eldivheight = 0;
        //za svaki child element provjerimo da li je na kraju vidljivog područja
        for (var i = 0; i < element.childNodes.length; i++) {

            thisChild = element.childNodes[i];
            initPos = this._getInitPosition(thisChild);
            top = parseInt(thisChild.style.top);
            eldivheight = thisChild.scrollHeight;


            //element se nalazi na vrhu
            if ((-1) * top - eldivheight >= initPos) {

                thisChild.style.top = top + this._elementsCollectionHeight + "px";
                //this._divList[i].set_visibleFlag(false);

            }
            else {



                //element postaje vidljiv
                /*   if()
                {
            
            
                }
            
            */

                //samo pomakni element prema gore
                thisChild.style.top = top + this._moveValue + "px"; ;



            }










        }

    },






    _checkPositionsCircularMode: function() {


        var element = this.get_element()

        var thisChild = null;
        var elementHeight = parseInt(element.style.height);

        var newYLocation = 0;

        var top;
        var br = 1;
        var pom1 = 0;
        var pom2 = 0;
        var temp = 0;
        var initPos = 0;

        //za svaki child element provjerimo da li je na kraju vidljivog područja
        for (var i = 0; i < element.childNodes.length; i++) {

            thisChild = element.childNodes[i];
            initPos = this._getInitPosition(thisChild);


            //ovdje dodajem 20 iz žnj razloga...taj se problem javlja samo kad je ukupna duljina elemenata blizu visini konteinera

            if (elementHeight < this._elementsCollectionHeight + 20) {
                temp = (-1) * (initPos - elementHeight);
                newYLocation = (-1) * (this._elementsCollectionHeight + 20);

            }
            else {
                temp = elementHeight;
                newYLocation = (-1) * (elementHeight);
            }
            try {


                top = parseInt(thisChild.style.top);


                if ((top >= (-1) * initPos && top < temp)) {



                    if (!this._divList[i].get_visibleFlag()) {
                        this._divList[i].set_visibleFlag(true);

                    }


                }
                else {

                    if (this._divList[i].get_visibleFlag()) {


                        this.moveitBy(thisChild, 0, newYLocation);

                        this._divList[i].set_visibleFlag(false);



                    }
                }

            }

            catch (err) {
                continue;
            }

        }
















    },

    _moveOneElement: function(elementToMove, x, y) {

        if (elementToMove.nodeType == 1) {

            if (x == undefined || y == undefined) {

                this.moveitBy(elementToMove, 0, this._moveValue);

            }
            else {
                this.moveitTo(elementToMove, x, y);

            }

        }

    },



    changeMoveDirection: function() {

        this._moveValue = (-1) * this._moveValue;


    },




    stopMoving: function() {

        clearInterval(this._intervalId);

    },
















    //Getter for hoverImage Property    
    get_moveSpeed: function() {
        return this._moveSpeed;
    },

    //Setter for hoverImage Property
    set_moveSpeed: function(value) {
        this._moveSpeed = value;
    },



    initialize: function() {





        GujaWebControls.AnnouncementControl.callBaseMethod(this, 'initialize');


        // Add custom initialization here

        var target = this.get_element();

        this._mouseOverHandler = Function.createDelegate(this, this._onMouseOver);
        this._mouseOutHandler = Function.createDelegate(this, this._onMouseOut);


        //Attach the required event handlers    

        $addHandlers(target, { 'mouseover': this._mouseOverHandler,
            'mouseout': this._mouseOutHandler
        }, this);

        if (this._directionUp2Down) {
            this.show();
        }
        else {
            this.showDownToUp();
        }
    },










    dispose: function() {
        //Add custom dispose actions here
        $clearHandlers(this.get_element()); //Detach all event handlers    

        delete this._mouseOverHandler;
        delete this._mouseOutHandler;



        GujaWebControls.AnnouncementControl.callBaseMethod(this, 'dispose');
    },



    _onMouseOver: function(e) {

        this.stopMoving();
    },

    _onMouseOut: function(e) {
        if (this._move) {
            this.startMoving();
        }
    }




}
GujaWebControls.AnnouncementControl.registerClass('GujaWebControls.AnnouncementControl', Sys.UI.Control);

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();



