quick_script 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
1
  module QuickScript
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -27,6 +27,10 @@ String.prototype.truncate = (val)->
27
27
  ret = ret + "..." if this.length > val
28
28
  return ret
29
29
 
30
+ History.getRelativeUrl = ->
31
+ url = History.getState().url
32
+ "/#{url.replace(History.getRootUrl(), '')}"
33
+
30
34
  class @SelectOpts
31
35
  constructor : ->
32
36
  @options = []
@@ -25,6 +25,10 @@
25
25
  action.call(viewModel)
26
26
  return false
27
27
 
28
+ ko.bindingHandlers.touchstart =
29
+ init : (element, valueAccessor, bindingsAccessor, viewModel) ->
30
+ element.addEventListener('touchstart', valueAccessor().bind(viewModel))
31
+
28
32
  ko.bindingHandlers.validate =
29
33
  init : (element, valueAccessor) ->
30
34
  opts = valueAccessor()
@@ -70,34 +74,38 @@
70
74
 
71
75
  ko.bindingHandlers.carousel =
72
76
  init : (element, valueAccessor, bindingsAccessor, viewModel) ->
77
+ setTimeout ->
73
78
  idx = viewModel.getViewBoxIndex(viewModel.task())
74
- new_el = $(element).find('.slide-item-' + idx)
75
- new_el.addClass('active')
79
+ new_el = $(element).find('.slide-item-' + idx).first()
80
+ #new_el.addClass('active')
81
+ , 0
76
82
  update : (element, valueAccessor, bindingsAccessor, viewModel) ->
77
83
  opts = viewModel.transition.opts
78
84
  if viewModel.task() != null
79
- idx = viewModel.getViewBoxIndex(viewModel.task())
80
- console.log('updating slider to ' + idx)
81
- old_idx = opts.slide_index()
82
- new_el = $(element).find('.slide-item-' + idx)
83
- old_el = $(element).find('.slide-item-' + old_idx)
84
- if idx > old_idx
85
- new_el.addClass('next')
86
- new_el[0].offsetWidth if new_el[0]?
87
- new_el.addClass('left')
88
- old_el.addClass('left')
89
- else
90
- new_el.addClass('prev')
91
- new_el[0].offsetWidth if new_el[0]?
92
- new_el.addClass('right')
93
- old_el.addClass('right')
94
85
  setTimeout ->
95
- new_el.removeClass('next left prev right')
96
- old_el.removeClass('next left prev right')
97
- old_el.removeClass('active')
98
- new_el.addClass('active')
99
- , 600
100
- opts.slide_index(idx)
86
+ idx = viewModel.getViewBoxIndex(viewModel.task())
87
+ console.log(viewModel.name + ': updating slider to ' + idx)
88
+ old_idx = opts.slide_index()
89
+ new_el = $(element).find('.slide-item-' + idx).first()
90
+ old_el = $(element).find('.slide-item-' + old_idx).first()
91
+ if idx > old_idx
92
+ new_el.addClass('next')
93
+ new_el[0].offsetWidth if new_el[0]?
94
+ old_el.addClass('left')
95
+ new_el.addClass('left')
96
+ else
97
+ new_el.addClass('prev')
98
+ new_el[0].offsetWidth if new_el[0]?
99
+ old_el.addClass('right')
100
+ new_el.addClass('right')
101
+ setTimeout ->
102
+ new_el.removeClass('next left prev right')
103
+ old_el.removeClass('next left prev right')
104
+ old_el.removeClass('active')
105
+ new_el.addClass('active')
106
+ , 600
107
+ opts.slide_index(idx)
108
+ , 0
101
109
 
102
110
  ko.bindingHandlers.bindelem =
103
111
  init : (element, valueAccessor, bindingsAccessor, viewModel) ->
@@ -346,13 +354,13 @@ jQuery.ajax_qs = (opts)->
346
354
  resp = eval("(" + req.responseText + ")")
347
355
  opts.success(resp)
348
356
  else
349
- opts.error() if opts.error?
357
+ opts.error(req.status) if opts.error?
350
358
  req.upload.addEventListener('error', opts.error) if opts.error?
351
359
  if opts.progress?
352
360
  req.upload.addEventListener 'progress', (ev)->
353
361
  opts.progress(ev, Math.floor( ev.loaded / ev.total * 100 ))
354
362
  req.open opts.type, opts.url, true
355
- req.setRequestHeader 'X-CSRF-Token', jQuery('meta[name="csrf-token"]').attr('content')
363
+ req.setRequestHeader 'X-CSRF-Token', jQuery.CSRF_TOKEN
356
364
  req.send(data)
357
365
  return req
358
366
 
@@ -427,9 +435,11 @@ class @Model
427
435
  success : (resp)=>
428
436
  @handleData(resp.data)
429
437
  callback(resp) if callback?
430
- error : =>
431
- console.log("Save error encountered")
438
+ error : (err)=>
439
+ err = err || 'unknown'
440
+ console.log("Save error encountered [" + err + "]")
432
441
  @model_state(ko.modelStates.READY)
442
+ callback({meta : 500, data : ['An error occurred']}) if callback?
433
443
  @model_state(ko.modelStates.SAVING)
434
444
  reset : ->
435
445
  #@model_state(ko.modelStates.LOADING)
@@ -508,11 +518,11 @@ class @FileModel extends @Model
508
518
  @input = {}
509
519
  @input.files = ko.observable([])
510
520
  @input.file_uri = ko.observable('')
511
- @input.files.subscribe (val)->
512
- if val.length > 0
521
+ @input.files.subscribe (val)=>
522
+ if val.length > 0 && FileReader?
513
523
  @input.file_uri('')
514
524
  reader = new FileReader()
515
- reader.onload = (ev)=>
525
+ reader.onloadend = (ev)=>
516
526
  console.log('input loaded')
517
527
  @input.file_uri(ev.target.result)
518
528
  reader.readAsDataURL(val[0])
@@ -527,10 +537,10 @@ class @FileModel extends @Model
527
537
  if @input.present() then @input.file().name else ""
528
538
  , this
529
539
  @input.is_image = ko.computed ->
530
- if @input.present() then @input.file().type.match('image.*') else false
540
+ if (@input.present() && @input.file().type?) then @input.file().type.match('image.*') else false
531
541
  , this
532
542
  @input.clear = => @input.files([])
533
- reset : ->
543
+ reset : =>
534
544
  super
535
545
  @input.files([])
536
546
  toAPI : =>
@@ -589,6 +599,9 @@ class @Collection
589
599
  @hasItems = ko.dependentObservable ->
590
600
  @items().length > 0
591
601
  , this
602
+ @length = ko.computed ->
603
+ @items().length
604
+ , this
592
605
  @init()
593
606
  setScope : (scp, args) =>
594
607
  opts = args
@@ -698,6 +711,9 @@ class @Collection
698
711
  @page(1)
699
712
  @items([])
700
713
  @views([])
714
+ absorb : (model) =>
715
+ @reset()
716
+ @handleData(model.toJS())
701
717
  toJS : =>
702
718
  objs = []
703
719
  for item in @items()
@@ -816,12 +832,13 @@ class @View
816
832
  @views[keys[idx]]
817
833
  afterRender : =>
818
834
  if @transition.type == 'slide'
835
+ return
819
836
  setTimeout =>
820
837
  console.log('after render')
821
838
  idx = @getViewBoxIndex(@task())
822
839
  new_el = $(@element).find('.slide-item-' + idx)
823
840
  new_el.addClass('active')
824
- 500
841
+ , 500
825
842
  showAsOverlay : (tmp, opts, cls)=>
826
843
  Overlay.add(this, tmp, opts, cls)
827
844
  hideOverlay : =>
@@ -832,42 +849,35 @@ class @ModelAdapter
832
849
  @save_url = null
833
850
  @load_url = null
834
851
  @index_url = null
852
+ @host = ''
835
853
  for prop,val of opts
836
854
  @[prop] = val
837
855
  load : (opts)->
838
856
  opts.data["_cv"] = Date.now() if opts.data?
839
- $.getJSON @load_url, opts.data, (resp)->
857
+ $.getJSON (@host + @load_url), opts.data, (resp)->
840
858
  opts.success(resp)
841
859
  index : (opts)->
842
860
  opts.data["_cv"] = Date.now() if opts.data?
843
- $.getJSON (@index_url || @load_url), opts.data, (resp)->
861
+ $.getJSON (@host + (@index_url || @load_url)), opts.data, (resp)->
844
862
  opts.success(resp)
845
863
  save_old : (opts)->
846
864
  $.ajax
847
865
  type : 'POST'
848
- url : @save_url
866
+ url : @host + @save_url
849
867
  data : opts.data
850
868
  success : opts.success
851
869
  error : opts.error
852
870
  save : (opts)->
853
- $.ajax_qs
854
- type : 'POST'
855
- url : @save_url
856
- data : opts.data
857
- progress : opts.progress
858
- success : opts.success
859
- error : opts.error
871
+ opts.url = @save_url
872
+ @send opts
860
873
  send : (opts)->
861
- $.ajax_qs
862
- type : 'POST'
863
- url : opts.url
864
- data : opts.data
865
- success : opts.success
866
- error : opts.error
874
+ opts.type = 'POST' if !opts.type?
875
+ opts.url = @host + opts.url
876
+ $.ajax_qs opts
867
877
  delete : (opts)->
868
878
  $.ajax
869
879
  type : 'DELETE'
870
- url : @save_url
880
+ url : @host + @save_url
871
881
  data : opts.data
872
882
  success : opts.success
873
883
  error : opts.error
@@ -876,33 +886,43 @@ class @ModelAdapter
876
886
 
877
887
  class @AccountAdapter
878
888
  constructor : (opts)->
879
- @login_url = "/account/login"
880
- @register_url = "/account/register"
881
- @enter_code_url = "/account/enter_code"
882
- @reset_url = "/account/reset"
883
- @save_url = "/account/save"
884
- @load_url = "/account/load"
889
+ @login_url = "/api/account/login"
890
+ @logout_url = "/api/account/logout"
891
+ @register_url = "/api/account/register"
892
+ @enter_code_url = "/api/account/enter_code"
893
+ @reset_url = "/api/account/reset"
894
+ @save_url = "/api/account/save"
895
+ @load_url = "/api/account/load"
885
896
  @login_key = "email"
886
897
  @password_key = "password"
898
+ @host = ""
887
899
  for prop,val of opts
888
900
  @[prop] = val
889
901
  login : (username, password, callback)->
890
902
  opts = {}
891
903
  opts[@login_key] = username
892
904
  opts[@password_key] = password
893
- $.post @login_url, opts, (resp) =>
894
- callback(resp)
905
+ @send
906
+ url : @login_url
907
+ data : opts
908
+ success : (resp) =>
909
+ callback(resp)
910
+ logout : (callback)->
911
+ @send
912
+ url : @logout_url
913
+ success : (resp) =>
914
+ callback(resp)
895
915
  register : (opts, callback)->
896
- $.post @register_url, opts, (resp) =>
916
+ $.post (@host + @register_url), opts, (resp) =>
897
917
  callback(resp)
898
918
  sendInviteCode : (code, callback)->
899
- $.post @enter_code_url, {code : code}, (resp) =>
919
+ $.post (@host + @enter_code_url), {code : code}, (resp) =>
900
920
  callback(resp)
901
921
  save : (opts) ->
902
922
  opts ||= {}
903
923
  $.ajax_qs
904
924
  type : 'POST'
905
- url : @save_url
925
+ url : @host + @save_url
906
926
  data : opts.data
907
927
  progress : opts.progress
908
928
  success : opts.success
@@ -911,7 +931,7 @@ class @AccountAdapter
911
931
  opts ||= {}
912
932
  $.ajax_qs
913
933
  type : 'POST'
914
- url : @load_url
934
+ url : @host + @load_url
915
935
  data : opts.data
916
936
  progress : opts.progress
917
937
  success : opts.success
@@ -919,20 +939,22 @@ class @AccountAdapter
919
939
  resetPassword : (login, callback)->
920
940
  opts = {}
921
941
  opts[@login_key] = login
922
- $.post @reset_url, opts, (resp) =>
942
+ $.post (@host + @reset_url), opts, (resp) =>
923
943
  callback(resp) if callback?
924
944
  send : (opts)->
945
+ def_err_fn = ->
946
+ opts.success({meta : 500, data : ['An error occurred.']})
925
947
  $.ajax_qs
926
948
  type : 'POST'
927
- url : opts.url
949
+ url : @host + opts.url
928
950
  data : opts.data
929
951
  progress : opts.progress
930
952
  success : opts.success
931
- error : opts.error
953
+ error : opts.error || def_err_fn
932
954
  delete : (opts)->
933
955
  $.ajax_qs
934
956
  type : 'DELETE'
935
- url : opts.url
957
+ url : @host + opts.url
936
958
  data : opts.data
937
959
  progress : opts.progress
938
960
  success : opts.success
@@ -952,7 +974,7 @@ class @AppView extends @View
952
974
  </div>
953
975
  """
954
976
  ko.addTemplate "app-slide", """
955
- <div class="view-slider" data-bind="style : {width : transition.opts.width + 'px', height : transition.opts.height + 'px'}, carousel : true">
977
+ <div class="view-slider" data-bind="style : {width : transition.opts.width + 'px', height : transition.opts.height + 'px'}, carousel : task">
956
978
  <div data-bind='foreach : viewList()'>
957
979
  <div class="slide-item" data-bind="template : { name : getViewName }, attr : {id : templateID, class : 'slide-item slide-item-' + $index()}, css : {}, style : {width : owner.transition.opts.width + 'px', height : owner.transition.opts.height + 'px'}, bindelem : true"></div>
958
980
  </div>
@@ -974,7 +996,7 @@ class @AppView extends @View
974
996
  console.log(data)
975
997
  @current_user.handleData(data) if data != null
976
998
  redirectTo : (path) ->
977
- $.history.load(path)
999
+ History.pushState(null, null, path)
978
1000
 
979
1001
  @initApp = ->
980
1002
  appViewModel = @appViewModel
@@ -982,14 +1004,20 @@ class @AppView extends @View
982
1004
  appViewModel.setUser(@CURRENT_USER)
983
1005
 
984
1006
  # navigation
985
- $.history.init (hash) ->
986
- if hash == ""
987
- appViewModel.route('/')
988
- else
989
- appViewModel.route(hash)
990
- , { unescape : ",/" }
1007
+ History.Adapter.bind window, 'statechange', ->
1008
+ appViewModel.route(History.getRelativeUrl())
991
1009
 
992
1010
  # layout bindings
993
1011
  $('body').koBind(appViewModel)
994
1012
  appViewModel.afterRender()
995
1013
 
1014
+ # override links
1015
+ $('a').live 'click', ->
1016
+ if this.href.includes(History.getRootUrl())
1017
+ History.pushState null, null, this.href
1018
+ return false
1019
+ else
1020
+ return true
1021
+
1022
+ appViewModel.route(History.getRelativeUrl())
1023
+
@@ -1,195 +1 @@
1
- /*
2
- * jQuery history plugin
3
- *
4
- * The MIT License
5
- *
6
- * Copyright (c) 2006-2009 Taku Sano (Mikage Sawatari)
7
- * Copyright (c) 2010 Takayuki Miwa
8
- *
9
- * Permission is hereby granted, free of charge, to any person obtaining a copy
10
- * of this software and associated documentation files (the "Software"), to deal
11
- * in the Software without restriction, including without limitation the rights
12
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
- * copies of the Software, and to permit persons to whom the Software is
14
- * furnished to do so, subject to the following conditions:
15
- *
16
- * The above copyright notice and this permission notice shall be included in
17
- * all copies or substantial portions of the Software.
18
- *
19
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
- * THE SOFTWARE.
26
- */
27
-
28
- (function($) {
29
- var locationWrapper = {
30
- put: function(hash, win) {
31
- (win || window).location.hash = this.encoder(hash);
32
- },
33
- get: function(win) {
34
- var hash = ((win || window).location.hash).replace(/^#/, '');
35
- try {
36
- return $.browser.mozilla ? hash : decodeURIComponent(hash);
37
- }
38
- catch (error) {
39
- return hash;
40
- }
41
- },
42
- encoder: encodeURIComponent
43
- };
44
-
45
- var iframeWrapper = {
46
- id: "__jQuery_history",
47
- init: function() {
48
- var html = '<iframe id="'+ this.id +'" style="display:none" src="javascript:false;" />';
49
- $("body").prepend(html);
50
- return this;
51
- },
52
- _document: function() {
53
- return $("#"+ this.id)[0].contentWindow.document;
54
- },
55
- put: function(hash) {
56
- var doc = this._document();
57
- doc.open();
58
- doc.close();
59
- locationWrapper.put(hash, doc);
60
- },
61
- get: function() {
62
- return locationWrapper.get(this._document());
63
- }
64
- };
65
-
66
- function initObjects(options) {
67
- options = $.extend({
68
- unescape: false
69
- }, options || {});
70
-
71
- locationWrapper.encoder = encoder(options.unescape);
72
-
73
- function encoder(unescape_) {
74
- if(unescape_ === true) {
75
- return function(hash){ return hash; };
76
- }
77
- if(typeof unescape_ == "string" &&
78
- (unescape_ = partialDecoder(unescape_.split("")))
79
- || typeof unescape_ == "function") {
80
- return function(hash) { return unescape_(encodeURIComponent(hash)); };
81
- }
82
- return encodeURIComponent;
83
- }
84
-
85
- function partialDecoder(chars) {
86
- var re = new RegExp($.map(chars, encodeURIComponent).join("|"), "ig");
87
- return function(enc) { return enc.replace(re, decodeURIComponent); };
88
- }
89
- }
90
-
91
- var implementations = {};
92
-
93
- implementations.base = {
94
- callback: undefined,
95
- type: undefined,
96
-
97
- check: function() {},
98
- load: function(hash) {},
99
- init: function(callback, options) {
100
- initObjects(options);
101
- self.callback = callback;
102
- self._options = options;
103
- self._init();
104
- },
105
-
106
- _init: function() {},
107
- _options: {}
108
- };
109
-
110
- implementations.timer = {
111
- _appState: undefined,
112
- _init: function() {
113
- var current_hash = locationWrapper.get();
114
- self._appState = current_hash;
115
- self.callback(current_hash);
116
- setInterval(self.check, 100);
117
- },
118
- check: function() {
119
- var current_hash = locationWrapper.get();
120
- if(current_hash != self._appState) {
121
- self._appState = current_hash;
122
- self.callback(current_hash);
123
- }
124
- },
125
- load: function(hash) {
126
- if(hash != self._appState) {
127
- locationWrapper.put(hash);
128
- self._appState = hash;
129
- self.callback(hash);
130
- }
131
- }
132
- };
133
-
134
- implementations.iframeTimer = {
135
- _appState: undefined,
136
- _init: function() {
137
- var current_hash = locationWrapper.get();
138
- self._appState = current_hash;
139
- iframeWrapper.init().put(current_hash);
140
- self.callback(current_hash);
141
- setInterval(self.check, 100);
142
- },
143
- check: function() {
144
- var iframe_hash = iframeWrapper.get(),
145
- location_hash = locationWrapper.get();
146
-
147
- if (location_hash != iframe_hash) {
148
- if (location_hash == self._appState) { // user used Back or Forward button
149
- self._appState = iframe_hash;
150
- locationWrapper.put(iframe_hash);
151
- self.callback(iframe_hash);
152
- } else { // user loaded new bookmark
153
- self._appState = location_hash;
154
- iframeWrapper.put(location_hash);
155
- self.callback(location_hash);
156
- }
157
- }
158
- },
159
- load: function(hash) {
160
- if(hash != self._appState) {
161
- locationWrapper.put(hash);
162
- iframeWrapper.put(hash);
163
- self._appState = hash;
164
- self.callback(hash);
165
- }
166
- }
167
- };
168
-
169
- implementations.hashchangeEvent = {
170
- _init: function() {
171
- self.callback(locationWrapper.get());
172
- $(window).bind('hashchange', self.check);
173
- },
174
- check: function() {
175
- self.callback(locationWrapper.get());
176
- },
177
- load: function(hash) {
178
- locationWrapper.put(hash);
179
- }
180
- };
181
-
182
- var self = $.extend({}, implementations.base);
183
-
184
- if($.browser.msie && ($.browser.version < 8 || document.documentMode < 8)) {
185
- self.type = 'iframeTimer';
186
- } else if("onhashchange" in window) {
187
- self.type = 'hashchangeEvent';
188
- } else {
189
- self.type = 'timer';
190
- }
191
-
192
- $.extend(self, implementations[self.type]);
193
- $.history = self;
194
- })(jQuery);
195
-
1
+ window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c<f;c+=1)h[c]=str(c,i)||"null";return e=h.length===0?"[]":gap?"[\n"+gap+h.join(",\n"+gap)+"\n"+g+"]":"["+h.join(",")+"]",gap=g,e}if(rep&&typeof rep=="object"){f=rep.length;for(c=0;c<f;c+=1)d=rep[c],typeof d=="string"&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e))}else for(d in i)Object.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e));return e=h.length===0?"{}":gap?"{\n"+gap+h.join(",\n"+gap)+"\n"+g+"}":"{"+h.join(",")+"}",gap=g,e}}"use strict",typeof Date.prototype.toJSON!="function"&&(Date.prototype.toJSON=function(a){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(a){return this.valueOf()});var JSON=window.JSON,cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;typeof JSON.stringify!="function"&&(JSON.stringify=function(a,b,c){var d;gap="",indent="";if(typeof c=="number")for(d=0;d<c;d+=1)indent+=" ";else typeof c=="string"&&(indent=c);rep=b;if(!b||typeof b=="function"||typeof b=="object"&&typeof b.length=="number")return str("",{"":a});throw new Error("JSON.stringify")}),typeof JSON.parse!="function"&&(JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&typeof e=="object")for(c in e)Object.hasOwnProperty.call(e,c)&&(d=walk(e,c),d!==undefined?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),typeof reviver=="function"?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}(),function(a,b){"use strict";var c=a.History=a.History||{},d=a.jQuery;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){d(a).bind(b,c)},trigger:function(a,b,c){d(a).trigger(b,c)},extractEventData:function(a,c,d){var e=c&&c.originalEvent&&c.originalEvent[a]||d&&d[a]||b;return e},onDomLoad:function(a){d(a)}},typeof c.init!="undefined"&&c.init()}(window),function(a,b){"use strict";var c=a.document,d=a.setTimeout||d,e=a.clearTimeout||e,f=a.setInterval||f,g=a.History=a.History||{};if(typeof g.initHtml4!="undefined")throw new Error("History.js HTML4 Support has already been loaded...");g.initHtml4=function(){if(typeof g.initHtml4.initialized!="undefined")return!1;g.initHtml4.initialized=!0,g.enabled=!0,g.savedHashes=[],g.isLastHash=function(a){var b=g.getHashByIndex(),c;return c=a===b,c},g.saveHash=function(a){return g.isLastHash(a)?!1:(g.savedHashes.push(a),!0)},g.getHashByIndex=function(a){var b=null;return typeof a=="undefined"?b=g.savedHashes[g.savedHashes.length-1]:a<0?b=g.savedHashes[g.savedHashes.length+a]:b=g.savedHashes[a],b},g.discardedHashes={},g.discardedStates={},g.discardState=function(a,b,c){var d=g.getHashByState(a),e;return e={discardedState:a,backState:c,forwardState:b},g.discardedStates[d]=e,!0},g.discardHash=function(a,b,c){var d={discardedHash:a,backState:c,forwardState:b};return g.discardedHashes[a]=d,!0},g.discardedState=function(a){var b=g.getHashByState(a),c;return c=g.discardedStates[b]||!1,c},g.discardedHash=function(a){var b=g.discardedHashes[a]||!1;return b},g.recycleState=function(a){var b=g.getHashByState(a);return g.discardedState(a)&&delete g.discardedStates[b],!0},g.emulated.hashChange&&(g.hashChangeInit=function(){g.checkerFunction=null;var b="",d,e,h,i;return g.isInternetExplorer()?(d="historyjs-iframe",e=c.createElement("iframe"),e.setAttribute("id",d),e.style.display="none",c.body.appendChild(e),e.contentWindow.document.open(),e.contentWindow.document.close(),h="",i=!1,g.checkerFunction=function(){if(i)return!1;i=!0;var c=g.getHash()||"",d=g.unescapeHash(e.contentWindow.document.location.hash)||"";return c!==b?(b=c,d!==c&&(h=d=c,e.contentWindow.document.open(),e.contentWindow.document.close(),e.contentWindow.document.location.hash=g.escapeHash(c)),g.Adapter.trigger(a,"hashchange")):d!==h&&(h=d,g.setHash(d,!1)),i=!1,!0}):g.checkerFunction=function(){var c=g.getHash();return c!==b&&(b=c,g.Adapter.trigger(a,"hashchange")),!0},g.intervalList.push(f(g.checkerFunction,g.options.hashChangeInterval)),!0},g.Adapter.onDomLoad(g.hashChangeInit)),g.emulated.pushState&&(g.onHashChange=function(b){var d=b&&b.newURL||c.location.href,e=g.getHashByUrl(d),f=null,h=null,i=null,j;return g.isLastHash(e)?(g.busy(!1),!1):(g.doubleCheckComplete(),g.saveHash(e),e&&g.isTraditionalAnchor(e)?(g.Adapter.trigger(a,"anchorchange"),g.busy(!1),!1):(f=g.extractState(g.getFullUrl(e||c.location.href,!1),!0),g.isLastSavedState(f)?(g.busy(!1),!1):(h=g.getHashByState(f),j=g.discardedState(f),j?(g.getHashByIndex(-2)===g.getHashByState(j.forwardState)?g.back(!1):g.forward(!1),!1):(g.pushState(f.data,f.title,f.url,!1),!0))))},g.Adapter.bind(a,"hashchange",g.onHashChange),g.pushState=function(b,d,e,f){if(g.getHashByUrl(e))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(f!==!1&&g.busy())return g.pushQueue({scope:g,callback:g.pushState,args:arguments,queue:f}),!1;g.busy(!0);var h=g.createStateObject(b,d,e),i=g.getHashByState(h),j=g.getState(!1),k=g.getHashByState(j),l=g.getHash();return g.storeState(h),g.expectedStateId=h.id,g.recycleState(h),g.setTitle(h),i===k?(g.busy(!1),!1):i!==l&&i!==g.getShortUrl(c.location.href)?(g.setHash(i,!1),!1):(g.saveState(h),g.Adapter.trigger(a,"statechange"),g.busy(!1),!0)},g.replaceState=function(a,b,c,d){if(g.getHashByUrl(c))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(d!==!1&&g.busy())return g.pushQueue({scope:g,callback:g.replaceState,args:arguments,queue:d}),!1;g.busy(!0);var e=g.createStateObject(a,b,c),f=g.getState(!1),h=g.getStateByIndex(-2);return g.discardState(f,e,h),g.pushState(e.data,e.title,e.url,!1),!0}),g.emulated.pushState&&g.getHash()&&!g.emulated.hashChange&&g.Adapter.onDomLoad(function(){g.Adapter.trigger(a,"hashchange")})},typeof g.init!="undefined"&&g.init()}(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a<b.length;a++)j(b[a]);m.intervalList=null}},m.debug=function(){(m.options.debug||!1)&&m.log.apply(m,arguments)},m.log=function(){var a=typeof c!="undefined"&&typeof c.log!="undefined"&&typeof c.log.apply!="undefined",b=d.getElementById("log"),e,f,g,h,i;a?(h=Array.prototype.slice.call(arguments),e=h.shift(),typeof c.debug!="undefined"?c.debug.apply(c,[e,h]):c.log.apply(c,[e,h])):e="\n"+arguments[0]+"\n";for(f=1,g=arguments.length;f<g;++f){i=arguments[f];if(typeof i=="object"&&typeof k!="undefined")try{i=k.stringify(i)}catch(j){}e+="\n"+i+"\n"}return b?(b.value+=e+"\n-----\n",b.scrollTop=b.scrollHeight-b.clientHeight):a||l(e),!0},m.getInternetExplorerMajorVersion=function(){var a=m.getInternetExplorerMajorVersion.cached=typeof m.getInternetExplorerMajorVersion.cached!="undefined"?m.getInternetExplorerMajorVersion.cached:function(){var a=3,b=d.createElement("div"),c=b.getElementsByTagName("i");while((b.innerHTML="<!--[if gt IE "+ ++a+"]><i></i><![endif]-->")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","&lt;").replace(">","&gt;").replace(" & "," &amp; ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window)
@@ -0,0 +1,195 @@
1
+ /*
2
+ * jQuery history plugin
3
+ *
4
+ * The MIT License
5
+ *
6
+ * Copyright (c) 2006-2009 Taku Sano (Mikage Sawatari)
7
+ * Copyright (c) 2010 Takayuki Miwa
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in
17
+ * all copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
+ * THE SOFTWARE.
26
+ */
27
+
28
+ (function($) {
29
+ var locationWrapper = {
30
+ put: function(hash, win) {
31
+ (win || window).location.hash = this.encoder(hash);
32
+ },
33
+ get: function(win) {
34
+ var hash = ((win || window).location.hash).replace(/^#/, '');
35
+ try {
36
+ return $.browser.mozilla ? hash : decodeURIComponent(hash);
37
+ }
38
+ catch (error) {
39
+ return hash;
40
+ }
41
+ },
42
+ encoder: encodeURIComponent
43
+ };
44
+
45
+ var iframeWrapper = {
46
+ id: "__jQuery_history",
47
+ init: function() {
48
+ var html = '<iframe id="'+ this.id +'" style="display:none" src="javascript:false;" />';
49
+ $("body").prepend(html);
50
+ return this;
51
+ },
52
+ _document: function() {
53
+ return $("#"+ this.id)[0].contentWindow.document;
54
+ },
55
+ put: function(hash) {
56
+ var doc = this._document();
57
+ doc.open();
58
+ doc.close();
59
+ locationWrapper.put(hash, doc);
60
+ },
61
+ get: function() {
62
+ return locationWrapper.get(this._document());
63
+ }
64
+ };
65
+
66
+ function initObjects(options) {
67
+ options = $.extend({
68
+ unescape: false
69
+ }, options || {});
70
+
71
+ locationWrapper.encoder = encoder(options.unescape);
72
+
73
+ function encoder(unescape_) {
74
+ if(unescape_ === true) {
75
+ return function(hash){ return hash; };
76
+ }
77
+ if(typeof unescape_ == "string" &&
78
+ (unescape_ = partialDecoder(unescape_.split("")))
79
+ || typeof unescape_ == "function") {
80
+ return function(hash) { return unescape_(encodeURIComponent(hash)); };
81
+ }
82
+ return encodeURIComponent;
83
+ }
84
+
85
+ function partialDecoder(chars) {
86
+ var re = new RegExp($.map(chars, encodeURIComponent).join("|"), "ig");
87
+ return function(enc) { return enc.replace(re, decodeURIComponent); };
88
+ }
89
+ }
90
+
91
+ var implementations = {};
92
+
93
+ implementations.base = {
94
+ callback: undefined,
95
+ type: undefined,
96
+
97
+ check: function() {},
98
+ load: function(hash) {},
99
+ init: function(callback, options) {
100
+ initObjects(options);
101
+ self.callback = callback;
102
+ self._options = options;
103
+ self._init();
104
+ },
105
+
106
+ _init: function() {},
107
+ _options: {}
108
+ };
109
+
110
+ implementations.timer = {
111
+ _appState: undefined,
112
+ _init: function() {
113
+ var current_hash = locationWrapper.get();
114
+ self._appState = current_hash;
115
+ self.callback(current_hash);
116
+ setInterval(self.check, 100);
117
+ },
118
+ check: function() {
119
+ var current_hash = locationWrapper.get();
120
+ if(current_hash != self._appState) {
121
+ self._appState = current_hash;
122
+ self.callback(current_hash);
123
+ }
124
+ },
125
+ load: function(hash) {
126
+ if(hash != self._appState) {
127
+ locationWrapper.put(hash);
128
+ self._appState = hash;
129
+ self.callback(hash);
130
+ }
131
+ }
132
+ };
133
+
134
+ implementations.iframeTimer = {
135
+ _appState: undefined,
136
+ _init: function() {
137
+ var current_hash = locationWrapper.get();
138
+ self._appState = current_hash;
139
+ iframeWrapper.init().put(current_hash);
140
+ self.callback(current_hash);
141
+ setInterval(self.check, 100);
142
+ },
143
+ check: function() {
144
+ var iframe_hash = iframeWrapper.get(),
145
+ location_hash = locationWrapper.get();
146
+
147
+ if (location_hash != iframe_hash) {
148
+ if (location_hash == self._appState) { // user used Back or Forward button
149
+ self._appState = iframe_hash;
150
+ locationWrapper.put(iframe_hash);
151
+ self.callback(iframe_hash);
152
+ } else { // user loaded new bookmark
153
+ self._appState = location_hash;
154
+ iframeWrapper.put(location_hash);
155
+ self.callback(location_hash);
156
+ }
157
+ }
158
+ },
159
+ load: function(hash) {
160
+ if(hash != self._appState) {
161
+ locationWrapper.put(hash);
162
+ iframeWrapper.put(hash);
163
+ self._appState = hash;
164
+ self.callback(hash);
165
+ }
166
+ }
167
+ };
168
+
169
+ implementations.hashchangeEvent = {
170
+ _init: function() {
171
+ self.callback(locationWrapper.get());
172
+ $(window).bind('hashchange', self.check);
173
+ },
174
+ check: function() {
175
+ self.callback(locationWrapper.get());
176
+ },
177
+ load: function(hash) {
178
+ locationWrapper.put(hash);
179
+ }
180
+ };
181
+
182
+ var self = $.extend({}, implementations.base);
183
+
184
+ if($.browser.msie && ($.browser.version < 8 || document.documentMode < 8)) {
185
+ self.type = 'iframeTimer';
186
+ } else if("onhashchange" in window) {
187
+ self.type = 'hashchangeEvent';
188
+ } else {
189
+ self.type = 'timer';
190
+ }
191
+
192
+ $.extend(self, implementations[self.type]);
193
+ $.history = self;
194
+ })(jQuery);
195
+
@@ -169,9 +169,11 @@
169
169
  &.prev, &.next
170
170
  top: 0
171
171
  position: absolute
172
+ z-index: 1
172
173
  &.active.left
173
174
  left: -100%
174
175
  &.active.right
175
176
  left: 100%
176
177
  &.active
177
178
  left: 0px
179
+ z-index: 0
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quick_script
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 63
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 7
8
+ - 8
9
9
  - 0
10
- version: 0.7.0
10
+ version: 0.8.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alan Graham
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-07-09 00:00:00 Z
18
+ date: 2012-07-26 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
21
  description: Framework for single-page web applications
@@ -50,6 +50,7 @@ files:
50
50
  - vendor/assets/javascripts/quick_script/jquery-ui.min.js
51
51
  - vendor/assets/javascripts/quick_script/jquery.fileupload.js
52
52
  - vendor/assets/javascripts/quick_script/jquery.history.js
53
+ - vendor/assets/javascripts/quick_script/jquery.history.old.js
53
54
  - vendor/assets/javascripts/quick_script/jquery.iframe-transport.js
54
55
  - vendor/assets/javascripts/quick_script/jquery.min.js
55
56
  - vendor/assets/javascripts/quick_script/jquery.poshytip.min.js