window.dhtmlHistory.create({
    toJSON: function(o) {
        return JSON.stringify(o);
    }
    , fromJSON: function(s) {
        return JSON.parse(s);
    }
});

(function($) {
    SPA = {
        initialHash: null,
        initailArgs: { },
        historyChange: function(newLocation, historyData, first) {
            // if has first history, meaning ! is first load
            if (first) {
                dhtmlHistory.add(newLocation, historyData);
            } 
            else {
                // first page load
                if (historyStorage.hasKey(newLocation)) {
                    Jifty.update(historyStorage.get(newLocation), "");
                } 
                else {
                    // go back to initail hash or initail path
                    Jifty.update({ 
                             "continuation": {}, 
                                  "actions": {}, 
                         "action_arguments": {},
                                "fragments": [ { 
                                        "mode": "Replace", 
                                        "args": SPA.initailArgs , 
                                      "region": "__page", 
                                        "path": SPA.initialHash 
                                          } ] }, "");
                }
            }
        },
        _sp_submit_form: function(elt, event, submit_to) {
            if(event.ctrlKey||event.metaKey||event.altKey||event.shiftKey) return true;

            var form = Jifty.Form.Element.getForm(elt);
            var elements = Jifty.Form.getElements(form);

            // Three things need to get merged -- hidden defaults, defaults
            // from buttons, and form values.  Hence, we build up three lists
            // and then merge them.
            var hiddens = {};
            var buttons = {};
            var inputs = {};
            for (var i = 0; i < elements.length; i++) {
                var e = elements[i];
                var parsed = e.getAttribute("name").match(/^J:V-region-__page\.(.*)/);
                var extras = Jifty.Form.Element.buttonArguments(e);

                var extras_key_length = 0;
                $.each(extras, function() { extras_key_length++ });

                if (extras_key_length > 1) {
                    // Button with values
                    $.each(extras, function(k, v) {
                        if (k == 'extend') return;
                        parsed = k.match(/^J:V-region-__page\.(.*)/);
                        if ((parsed != null) && (parsed.length == 2)) {
                            buttons[ parsed[1] ] = v;
                        } else if (v.length > 0) {
                            inputs[ k ] = v;
                        }
                    });
                } else if ((parsed != null) && (parsed.length == 2)) {
                    // Hidden default
                    hiddens[ parsed[1] ] = $(e).val();
                } else if (e.name.length > 0) {
                    // Straight up values
                    inputs[ e.name ] = $(e).val();
                }
            }

            var args = $.extend({}, hiddens, buttons, inputs);

            return Jifty.update( {'continuation':{},'actions':null,'fragments':[
                        {'mode':'Replace','args':args,'region':'__page','path': submit_to
                    }]}, elt );
        }
    };

    // for page load event
    $(document).ready(function(){
        var hash = location.hash.slice(1);
        var search = location.search.slice(1);

        if( location.hash && ! location.search ) {
            if ( hash.indexOf('?') >= 0 ) {
                search = location.hash.slice(1);
                search = search.substring( search.indexOf('?') + 1 );
                hash = hash.substring( 0 , hash.indexOf('?') );
            }else {
                search = '';
            }

            var args = { } ;
            var gy = search.split("&");
            for (i=0; i<gy.length; i++) {
                var res =  gy[i].split("=");
                args[  res[0]  ] = res[1];
            }

            SPA.initailArgs = args;
            SPA.initialHash = hash;

        }
        else {
            SPA.initialHash = location.pathname + location.search; // /entrypoint
        }

        dhtmlHistory.initialize();
        dhtmlHistory.addListener(SPA.historyChange);

        // fire history event manually
        if( dhtmlHistory.isFirstLoad() && location.hash ) {
            dhtmlHistory.fireHistoryEvent( hash );
        }
    });
    
})(jQuery);