﻿
jQuery.extend({
    /* vraćanje parametara iz query stringa kao json objekt
    // npr.
    //		var query = 'http://www.com/index.php?param1=a&param2=b';
    //		query.param1 == 'a';
	*/
    unparam: function (query) {
        var query_string = {};
        if (query != null) {
            var vars = query.split("&");
            for (var i = 0; i < vars.length; i++) {
                var pair = vars[i].split("=");
                pair[0] = decodeURIComponent(pair[0]);
                pair[1] = decodeURIComponent(pair[1]);
                if (typeof query_string[pair[0]] === "undefined") {
                    query_string[pair[0]] = pair[1];
                } else if (typeof query_string[pair[0]] === "string") {
                    var arr = [query_string[pair[0]], pair[1]];
                    query_string[pair[0]] = arr;
                } else {
                    query_string[pair[0]].push(pair[1]);
                }
            }
        }
        return query_string;
    }
});

function EventTarget(name) {
    this._listeners = [];
}

EventTarget.prototype = {
    constructor: EventTarget,
    /* dodavanje funkcije koja će se okidati kod pozivanja eventa (event handler) */
    addListener: function (listener) {
        this._listeners.push(listener);
    },
    /* pozivanje eventa (raise) */
    fire: function (args) {
        if (this._listeners instanceof Array) {
            for (var i = 0, len = this._listeners.length; i < len; i++) {
                this._listeners[i].call(args);
            }
        }
    },
    /* micanje event handlera */
    removeListener: function (listener) {
        for (var i = 0, len = this._listeners.length; i < len; i++) {
            if (this._listeners[i] === listener) {
                this._listeners.splice(i, 1);
                break;
            }
        }
    }
};

var Fitness = {
    /* state se brine za detektiranje promjena stanja aplikacije
    // npr. ako želimo da se ajax pozivi sačuvaju u historyju browsera, onda ih treba pozivati preko Fitness.State.change(parametri);
    // Fitness.State.data i Fitness.State.current sadrže trenutni state i vezane podatke
    // u state spremati što manje podataka, jer se on prenosi preko url-a
    */
    State: {
        init: function () {
            $.History.bind(function (state) {
                var tmp = $.unparam(state);
                if (tmp && tmp.hstr_state) {
                    Fitness.State.current = tmp.hstr_state;
                    Fitness.State.data = tmp;
                }
                Fitness.State.changed.fire();
            });
        },
        change: function (state, saveInHistory, data) {
            if (!data) {
                data = {};
            }
            data.hstr_state = state;
            var encoded = $.param(data);
            if (saveInHistory) {
                $.History.go(encoded);
            } else {
                $.History.trigger(encoded);
            }
        },
        changed: new EventTarget(),
        data: null,
        current: null
    },
    Util: {
        setDefaultText: function (textbox, text) {
            /* podešavanje defaultnog texta u textbox (tekst koji se prikazuje ako ništa drugo nije upisano) */

            $(textbox).val(text)
            $(textbox).focus(function () {
                if ($(this).val() == text) $(this).val('');
            });
            $(textbox).blur(function () {
                if ($(this).val() == '') $(this).val(text);
            });
        },
        replaceAll: function (text, searchFor, replaceWith) {
            while (text.indexOf(searchFor) != -1) { text = text.replace(searchFor, replaceWith); }
            return text;
        }
    },
    Config: {
    }
};
Fitness.State.init();

