PageSourceSearch

https://www.changiexhibitioncentre.com/site/ctx/jquery/ctjq.js

js changiexhibitioncentre.com collected 2026-10-07 05:57:03 UTC 21,617 bytes, 664 lines download raw bytes

1/**
2 * @license Copyright (c) 2012 CommonTown Pte Ltd. All rights reserved. 
3 */
4// 2012-09-15 joel: attn and litebox  
5(function($){
6
7var detectbrowser=function() {
8  var matched, browser;
9  var uaMatch = function( ua ) {
10    ua = ua.toLowerCase();
11
12    var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
13      /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
14      /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
15      /(msie) ([\w.]+)/.exec( ua ) ||
16      ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
17      [];
18
19    return {
20browser: match[ 1 ] || "",
21           version: match[ 2 ] || "0"
22    };
23  };
24
25  matched = uaMatch( navigator.userAgent );
26  browser = {};
27
28  if ( matched.browser ) {
29    browser[ matched.browser ] = true;
30    browser.version = matched.version;
31  }
32
33  // Chrome is Webkit, but Webkit is also Safari.
34  if ( browser.chrome ) {
35    browser.webkit = true;
36  } else if ( browser.webkit ) {
37    browser.safari = true;
38  }
39
40  jQuery.browser = browser;
41};
42if (!$.browser) detectbrowser();
43
44
45// ----- ATTN / POINTER -----
46var $attn, $pointer;
47var msg_tmo_id; // timeout obj id
48$.extend({
49  attn: function(html,opt) {
50    opt = $.extend({
51      autoclose: 2000, //  close after msec
52      duration: 500, //  fadein in msec
53      close: false, // show close button
54      left: 'auto', //  x offset (auto=center)
55      top: 150, //  y offset 
56      width: 400,
57      height: 'auto',
58      bottom:'auto',
59      after_open: null,
60      point_at: null // XXX
61    }, opt || {});
62
63    if (typeof opt.autoclose!='number') opt.close=true;
64
65    if (msg_tmo_id) clearTimeout(msg_tmo_id);
66    if (!$attn) {
67      $('body').append($attn=$('<div class="ctjq_attn"><div class="content_"></div><div class="close_">Close</div></div>'));
68      $attn.hover(function(ev) {
69	if (ev.type=='mouseenter') {
70	  if (msg_tmo_id && opt.close) {
71	    if (opt.point_at) {
72	      $attn.pointer(opt.point_at);
73	      $attn.stop().fadeTo(0,.8);
74	    }
75	    clearTimeout(msg_tmo_id);
76	  }
77	}
78	else if (opt.point_at) opt.point_at.pointer();
79      }); 
80      $('.close_',$attn).css('opacity',0.7)
81        .hover(function(ev){ $(this).css('opacity',(ev.type=='mouseenter')?1:0.7); })
82	.click(function(){ $attn.fadeOut(opt.duration); });
83    } 
84
85    var css;
86    css={height:opt.height,left:'auto',top:'auto',bottom:'auto',right:'auto'};
87    css.bottom=opt.bottom;
88    css.top=opt.top;
89    css.width=opt.width;
90
91    $attn.css('width',css.width);
92    if (opt.right) css.right=opt.right;
93    else css.left=(opt.left=='auto')?($(window).width()-$attn.width())/2:opt.left;
94
95    if (html) {
96      $('.content_',$attn).html(html);
97      $attn.css(css).fadeIn(opt.duration,opt.after_open);
98      $('.close_',$attn).toggle(opt.close?true:false);
99      if (opt.autoclose) msg_tmo_id=setTimeout(function(){ $attn.fadeOut(1000); }, parseInt(opt.autoclose)); 
100    }
101    else $attn.fadeOut(opt.duration);
102    return this;
103  },
104
105  pointer: function($dest,opt) {
106    var opos,owidth,oheight,npos,nwidth,nheight;
107    if (!$pointer) {
108      $pointer=$('<div class="ctjq_pointer"></div>');
109      $('body').append($pointer);
110    }
111
112    if (!$dest||!$dest.length) { $pointer.hide(); return; }
113
114    opos=this.offset();
115    owidth=this.outerWidth();
116    oheight=this.outerHeight();
117    nwidth=$dest.outerWidth()+13;
118    nheight=$dest.outerHeight()+13;
119    npos=$dest.offset();
120
121    $pointer.css({top:opos.top,left:opos.left,width:owidth,height:oheight}).show();
122
123    $pointer.stop().animate({
124	width:nwidth,
125	height:nheight,
126	top: npos.top-11,
127	left: npos.left-11
128      },
129      {
130	duration:Math.round((Math.abs(opos.left-npos.left)+Math.abs(opos.top-npos.top))/1.2),
131	easing:'easeInOutExpo',
132	complete: function() {
133	  if (opt&&typeof(opt.callback)=='function') opt.callback.call(this);
134	}
135      }
136    );
137    return this;
138  }
139});
140
141// ----- LITEBOX -----
142var $lb_screen, $lb_dialog, $lb_loading;
143var lb_closefn;
144var lb_placefn;
145var lb_returnValue;
146var lb_args; // need this coz arrows click closure is the init closure
147var lb_compute_size=function(args) {
148  args.winw=$(window).width(), args.winh=$(window).height();
149  if (args.width) args.objw=args.width;
150  if (args.height) args.objh=args.height;
151  if (args.maximize || args.winw<args.objw+80) args.objw=args.winw-80;
152  if (args.maximize || args.winh<args.objh+80) args.objh=args.winh-80;
153  if (args.proportional) {
154    var wratio=args.objw/args.width;
155    var hratio=args.objh/args.height;
156    if (Math.abs(wratio-hratio)>.01) {
157      if (wratio>hratio) args.objw=args.width*hratio;
158      else args.objh=args.height*wratio;
159    }
160  }
161};
162var lb_frames_reconfig=function(assoc){
163  if (window.frameElement) {
164    var w=window;
165    var dv=(document.all?'parentWindow':'defaultView') ;
166    while(w&&w.frameElement&&w.frameElement.ownerDocument) {
167      w=w.frameElement.ownerDocument[dv];
168      $('frameset',w.document).each(function(i){
169	var $cur=$(this);
170	var cols,rows;
171	if (assoc&&assoc[this.id]) {
172	  if (cols=assoc[this.id].cols) $cur.data('rl_cols',$cur.attr('cols')).attr('cols',cols);
173	  if (rows=assoc[this.id].rows) $cur.data('rl_rows',$cur.attr('rows')).attr('rows',rows);
174	}
175	else {
176	  //revert
177	  if (cols=$cur.data('rl_cols')) $cur.attr('cols',cols);
178	  if (rows=$cur.data('rl_rows')) $cur.attr('rows',rows);
179	} 
180      });
181    }
182  }
183};
184
185$.extend({
186  litebox:function(args) {
187    //  url: 
188    // Optional args
189    //  type: image
190    //  title: string, width: number, height: number
191    //  X easy_close: true to close when click outside litebox
192
193    if (typeof args=='string') {
194      if (args=='close'&&lb_closefn) lb_closefn();
195      return;
196    }
197    if (typeof args.close=='undefined') args.close=true;
198    if (args.query) {
199      var oldok=args.ok;
200      args.title=args.query; 
201      if (typeof args.cancel=='undefined') args.cancel=true; 
202      if (typeof args.close=='undefined') args.close=false;
203      args.element='<input size="30" class="text_" value=""/>';
204      args.ok=function(dom){
205        if (typeof oldok=='function') oldok(dom.value);
206      }
207    }
208
209    if (args.url && !args.width) args.maximize=true;
210
211    $('#ive_helpline').fadeOut(); // hide helpline
212
213    // init dom and callbacks once
214    if (!$lb_screen) {
215      $lb_screen=$('<div class="ctjq_litebox_screen"><div class="loading_"></div></div>');
216      $lb_loading=$('.loading_',$lb_screen);
217      $('body').append($lb_screen);
218
219      $lb_dialog=$(
220'<div class="ctjq_litebox_dialog">'
221+'<div class="move_cover_"></div>'
222+'<div class="btn_close_"></div>'
223+'<div class="loading_"></div>'
224+'<div class="title_"></div>'
225+'<div class="content_"></div>'
226+'<div class="caption_"></div>'
227+'<div class="count_"></div>'
228+'<div class="arrow_ prev_"></div>'
229+'<div class="arrow_ next_"></div>'
230+'<div class="control_">'
231  +'<input type="button" class="btn_cancel_" value="Cancel"/>'
232  +'<input type="button" class="btn_ok_" value="OK"/>'
233+'</div>'
234+'</div>'
235);
236      $('body').append($lb_dialog);
237
238      lb_closefn=function(status){
239	$('.inner_',$lb_dialog).unbind('load.litebox');
240        $lb_dialog.stop().slideUp(200);
241	if (status=='success'&&lb_args.success&&(typeof lb_args.success=='function')) lb_args.success.call(this,lb_returnValue);
242
243	$lb_screen.stop().animate({opacity:0}
243,300,null,function(){
244	  $lb_screen.hide();
245	  // old dialog code set the returnValue to expect reload of page
246	  if ((lb_returnValue&&lb_returnValue.refresh) || window.returnValue=='full_refresh') document.location.reload();
247	});
248	if (!lb_args.background_scroll) 
249	  $('body').css('overflow','visible'); // reactivate scroll event
250
251	// 2013-08-16 joel: revert frames config 
252	if (window.frameElement&&lb_args.frames_reconfig) lb_frames_reconfig();
253      };
254
255      //$('.btn_close_',$lb_dialog).click(lb_closefn);
256
257      $('.btn_ok_,.btn_cancel_,.btn_close_',$lb_dialog).click(function(ev){
258        var $data=$('.content_ > *',$lb_dialog).detach();
259	var btnarg=this.className.replace(/.*btn_(\w+)_.*/,'$1');
260        if (lb_args[btnarg] && typeof lb_args[btnarg]=='function') lb_args[btnarg]($data.get(0));
261	lb_closefn();
262      });
263
264      $('.arrow_',$lb_dialog).hover(function(ev){ $(this).toggleClass('armed_'); });
265      $('.next_',$lb_dialog).click(function(ev){ 
266        if (typeof lb_args.next=='function') lb_args.next.call(this,ev);
267      });
268      $('.prev_',$lb_dialog).click(function(ev){ 
269        if (typeof lb_args.prev=='function') lb_args.prev.call(this,ev);
270      });
271
272      // 2012-07-26 joel: DIALOG DND
273      $lb_dialog
274	.mousedown(function(ev){
275	  var tgt=ev.srcElement||ev.target;
276	  // right click only and on dialog frame and title
277	  if (ev.button!=0||(tgt.className.indexOf('ctjq_litebox_dialog')<0&&tgt.className.indexOf('title_')<0)) return; 
278
279	  var overflow=$(tgt).css('overflow');
280	  if ('|INPUT|TEXTAREA|SELECT|OPTION|'.indexOf('|'+tgt.tagName+'|')>=0) return;
281	  if (overflow=='scroll'||overflow=='auto') return; // click on scrollbar will cause sticking problem
282
283	  if (tgt.className.indexOf('title_')>=0) tgt=$(tgt).closest('.ctjq_litebox_dialog').get(0);
284
285	  var $content=$('.content_',tgt);
286	  $('.move_cover_',tgt).height($content.height()).width($content.width()).show();
287
288	  var $obj=$(this);
289	  var pos={top:parseInt($obj.css('top')),left:parseInt($obj.css('left'))};
290	  // o: dialog original pos, d: mouse down pos
291	  var ox=pos.left, oy=pos.top;
292	  var dx=ev.pageX, dy=ev.pageY;
293
294	  var
295	    dmove=function(ev){
296	      // ev.which indicates the mouse button which is pressed. not used. now using the overflow detection above
297	      var newpos;
298	      $obj.css(newpos={left:ox+ev.pageX-dx,top:oy+ev.pageY-dy});
299	      ev.stopImmediatePropagation();
300	      return false;
301	    }
302	    ,dstop=function(ev){
303	      $('.move_cover_',tgt).hide();
304	      $(document).unbind('.ive_dialog');
305	      return false;
306	    };
307	  
308	  $(document).bind({'mousemove.ive_dialog':dmove,'mouseup.ive_dialog':dstop});
309	  ev.stopImmediatePropagation();
310	  return false;
311	})
312	// show the caption and count only when hover
313	/* 
314	.hover(function(ev){ 
315	  if (ev.type=='mouseenter') $('.caption_,.count_').fadeIn(300);
316	  else $('.caption_,.count_').fadeOut(300);
317	})
318	*/
319	;
320    }
321
322    // per call starts here
323    lb_args=args;
324    if (typeof lb_args.screen_opacity=='undefined') lb_args.screen_opacity=0.4;
325    if (typeof lb_args.background_scroll=='undefined') lb_args.background_scroll=false;
326    if (typeof lb_args.screen=='undefined') lb_args.screen='dark';
327
328    // 2013-08-16 joel: frames reconfig
329    if (window.frameElement&&lb_args.frames_reconfig) lb_frames_reconfig(lb_args.frames_reconfig);
330
331    lb_compute_size(lb_args); // compute size
332
333    if ($lb_loading) $lb_loading.css({top:lb_args.winh/3,left:(lb_args.winw-$lb_loading.width())/2}).show();
334
335    var serialcall=false; // called again while lb is active
336
337    // visibility
338    if (lb_args.screen=='dark' && !lb_args.background_scroll) 
339      $('body').css('overflow','hidden'); // block scroll event
340
341    if (lb_args.screen!='none') {
342      if ($lb_dialog.is(':visible')) 
343      //if ($lb_screen.is(':visible')) 
344      { 
345	serialcall=true;
346	$('.content_',$lb_dialog).slideUp(100); 
347//        $lb_dialog.animate({top:50},200); // JUMP ANIM
348      }
349      else $lb_screen.css('opacity',0).show().stop().animate({opacity:lb_args.screen_opacity},200); // show if not visible
350    }
351
352    if (lb_args.title) $('.title_',$lb_dialog).html(lb_args.title).show();
353    else $('.title_',$lb_dialog).hide();
354    $('.loading_',$lb_dialog).show();
355
356    $('.next_,.prev_',$lb_dialog).hide();
357
358    $('.caption_',$lb_dialog).html(lb_args.caption||'').hide();
359    $('.count_',$lb_dialog).html(lb_args.count||'').hide();
360
361    $('.control_',$lb_dialog).toggle(lb_args.ok?true:false);
362//    $('.btn_ok_',$lb_dialog).toggle(lb_args.ok?true:false);
363    $('.btn_close_',$lb_dialog).toggle(lb_args.close?true:false);
364
365    // logic
366    var contenthtml; // can be dom or html string
367    var css={};
368
369
370    // element: dom
371    if (lb_args.element) {
372      lb_args.type='dom';
373      contenthtml=$(lb_args.element).clone();
374    }
375
376    // url: image or iframe
377    var src=(typeof lb_args.url=='string'?lb_args.url:'');
378    if (src || lb_args.type=='iframe') {
379      if (!lb_args.type) lb_args.type='iframe'; // not set => use iframe
380      if (lb_args.type=='iframe') {
381	var sep=(src.indexOf('?')>=0)?'&':'?';
382	if (src&&src.indexOf('litebox=')<0) src+=sep+'litebox=1';
383      }
384
385      // contenthtml
386      if (true||src) {
387	if (lb_args.type=='image') {
388	  contenthtml='<img class="inner_" src="'+src+'" style="display:none"/>';
389	}
390	else if (lb_args.type=='iframe') {
391	  contenthtml='<iframe name="litebox_iframe" class="inner_" width="'+lb_args.objw+'" height="'+lb_args.objh+'" src="'+src+'" frameborder="0"></iframe>';
392	}
393      }
394    }
395
396    lb_placefn=function(){
397      var cb=function(){ 
398        $('input:text,textarea',$lb_dialog).filter(':visible:first').focus();
399        $('.inner_',$lb_dialog).slideDown(300);
400	if (lb_args.next) $('.next_',$lb_dialog).slideDown(200);
401	if (lb_args.prev) $('.prev_',$lb_dialog).slideDown(200);
402	if (lb_args.caption) $('.caption_',$lb_dialog).css({bottom:200,opacity:0}).show().animate({opacity:.5,bottom:0},{duration:400});
403	if (lb_args.count) $('.count_',$lb_dialog).css({bottom:50,opacity:0}).show().animate({opacity:.3,bottom:0},{duration:300});
404      };
405      // query box need to grab w/h here
406      if (typeof lb_args.objw=='undefined') lb_args.objw=$lb_dialog.width();
407      if (typeof lb_args.objh=='undefined') lb_args.objh=$lb_dialog.height();
408
409      var left,top;
410      if (lb_args.place_top) {
411        var hdiff=$lb_dialog.outerHeight()-$lb_dialog.height();
412        if (lb_args.place_top<0) 
413	  top=(lb_args.winh-lb_args.objh)-hdiff+lb_args.place_top;
414	else
415	  top=lb_args.place_top;
416      }
417      else {
418	// default: center
419	top=(lb_args.winh-lb_args.objh)/2;
420      }
421      if (lb_args.left)  left=lb_args.left;
422      else left=(lb_args.winw-lb_args.objw)/2;
423      $lb_dialog.animate({left:left,top:top}, { duration:100 });
424      if (serialcall) { 
425	$lb_dialog.show(); // 2013-06-19 joel: show again for sure, somehow catalog generates two click events (?!)
426        $('.content_',$lb_dialog).slideDown(300,cb); // fadein content_
427      }
428      else $lb_dialog.fadeIn(300,cb); // simple fadein
429//      console.log('win',lb_args.winw,lb_args.winh);
430    };
431
432    var lb_readyfn=function(ev){
433      if ($lb_loading) $lb_loading.hide(); // this is the one on the screen
434      $('.loading_',$lb_dialog).hide();  // this is the one in the litebox
435      if (this.tagName=='IMG') {
436	var newh,neww;
437        var natw=this.width||this.naturalWidth,nath=this.height||this.naturalHeight;
438	if (!natw) {
439	  var newimg=new Image();
440	  newimg.src=this.src;
441	  natw=newimg.width;
442	  nath=newimg.height;
443	}
444        newh=nath;
445        neww=natw;
446	// scale proportionally
447	if (natw>lb_args.objw || nath>lb_args.objh) {
448	  if (natw/lb_args.objw>nath/lb_args.objh) {
449	    $(this).width(lb_args.objw);
450	    newh=nath/(natw/lb_args.objw);
451	    neww=lb_args.objw;
452	  }
453	  else {
454	    $(this).height(lb_args.objh);
455	    newh=lb_args.objh;
456	    neww=natw/(nath/lb_args.objh);
457	  }
458	}
459	// arrows
460	$('.arrow_',$lb_dialog).height(newh);
461	lb_args.objw=neww;
462	lb_args.objh=newh;
463      }
464
465      if (typeof lb_args.ready=='function') lb_args.ready.call(this.contentDocument);
466      lb_placefn();
467      $(this).unbind('load.litebox'); // 2012-11-13  joel: drop it. Call it once only
468    };
469
470    if (contenthtml) {
471      $('.content_',$lb_dialog).html(contenthtml);
472
473      // ONLOAD callback
474      if (typeof contenthtml=='string') $('.inner_',$lb_dialog).bind('load.litebox',lb_readyfn);
475      else {
476        // must be dom, show content and call readyfn
477	$('.content_ > *',$lb_dialog).css('visibility','visible').show();
478        lb_readyfn();
479      }
480    }
481    // the form action cannot take obj as target, must be the iframe name
482    if (lb_args.type=='iframe') return 'litebox_iframe';
483    //if (lb_args.type=='iframe') return $('iframe:first',$lb_dialog).get(0); 
484  }
485
486  // place data for the 'success' callback to retrieve
487  // if data.refresh==true, parent will refresh
488  ,litebox_return:function(data,callparent) { 
489    // this is usually called from within the litebox which need to call the container window's litebox_return
490    if (typeof callparent=='undefined') window.parent.$.litebox_return(data,false);
491    else {
492      lb_returnValue=data; 
493      lb_closefn('success');
494    }
495  }
496
497  // resize the litebox, call parent's litebox unless callparent==false
498  ,litebox_resize:function(args,callparent) { 
499    if (typeof callparent=='undefined') return window.parent.$.litebox_resize(args,false);
500    else {
501      if (typeof lb_args!='object') return;
502      if (typeof args.maximize=='undefined') args.maximize=false;
503      lb_args.width=args.width;
504      lb_args.height=args.height;
505      lb_args.proportional=args.proportional;
506      lb_args.maximize=args.maximize;
507      lb_compute_size(lb_args);
508      $('.inner_',$lb_dialog).animate({width:lb_args.objw,height:lb_args.objh});
509      lb_placefn();
510      return {width: lb_args.objw, height:lb_args.objh};
511    }
512  }
513});
514
515
516// SEQTHESE
517var $seqtrash,$seqedit,$seqadd,$seqbtns;
518$.fn.seqthese=function(sel,opt){
519  var $ctr=this; // container
520  var $list=$(sel,$ctr);
521  if (sel=='stop') {
522    $seqbtns.hide();
523    $seqadd.hide();
524    return $ctr.off('.seqthese');
525    //return $list.unbind('.seqthese');
526  }
527
528  opt = $.extend({
529    edit:false
530    ,trash:false
531  }, opt || {});
532
533  // init once
534  if (!$seqbtns) {
535    var style='position:absolute; display:none; width:16px; height:16px; z-index:100; top:4px; cursor:pointer; ';
536    $seqedit=$('<div id="seqthese_edit" class="seqthese" style="background:url(/rs/action/edit.png) no-repeat; '+style+'right:0"></div>');
537    $seqtrash=$('<div id="seqthese_trash" class="seqthese" style="background:url(/rs/action/delete.png) no-repeat; '+style+'right:18px"></div>');
538    $seqadd=$('<div id="seqthese_add" class="seqthese" style="background:url(/rs/action/add.png) no-repeat; '+style+'left:0"></div>');
539    $seqbtns=$([$seqtrash.get(0),$seqedit.get(0)]);
540    $('body').append($seqbtns).append($seqadd);
541
542    $seqbtns.mousedown(function(ev){
543      ev.stopImmediatePropagation();
544    });
545
546    $seqedit.click(function(ev){
547      var $target=$seqedit.parent();
548      var urltail=$target.data('seqthese').urltail;
549      var lbopt={ url:opt.edit+urltail, screen_opacity:0.2, background_scroll:true , left:30};
550      $('body').append($seqbtns); // move buttons out of obj
551      if (typeof opt.onedit=='function') opt.onedit.call($target.get(0));
552      if (typeof opt.oneditdone=='function') lbopt.close=function(){ opt.oneditdone.call($target.get(0)); }
553      $.litebox(lbopt);
554    });
555    $seqtrash.click(function(ev){
556      var $target=$seqedit.parent();
557      var urltail=$target.data('seqthese').urltail;
558      $('body').append($seqbtns); // move buttons out of obj
559      if (confirm('Delete this channel?')) { 
560	$target.remove();
561	$.ajax({ url:opt.trash+urltail});
562      }
563    });
564
565    $seqadd.click(function(){
566      var lbopt={ url:opt.add, screen_opacity:0.2, background_scroll:true , left:30};
567      if (typeof opt.onadddone=='function') lbopt.close=function(){ opt.onadddone.call(); }
568      $.litebox(lbopt);
569    });
570  }
571
572  var $grabbed=false;
573  // add button
574  if ($list.lengt) $list.last().after($seqadd);
575  else $ctr.append($seqadd);
576  $seqadd.css({position:'relative',margin:'auto'}).show();
577
578//  $list.css('position','relative');
579  $ctr
580    .on('mousedown.seqthese',sel,function(ev){
581      if ($grabbed) $grabbed.removeClass('grabbed_');
582      $grabbed=$(this);
583      $grabbed.addClass('grabbed_');
584
585      $(document).bind('mouseup.seqthese',function(ev){
586	$grabbed.removeClass('grabbed_');
587	$grabbed=false;
588	$(document).unbind('.seqthese');
589	ev.stopImmediatePropagation();
590      });
591      ev.stopImmediatePropagation();
592      return false;
593    })
594    .on('mouseenter.seqthese',sel,function(ev){
595      if ($grabbed) return;
596      $seqbtns.show();
597      $(this).css('position','relative').append($seqtrash).append($seqedit); // only trash and edit button
598    })
599    .on('mouseleave.seqthese',sel,function(ev){
600      if ($grabbed&&($grabbed.get(0)!=this)) {
601	var $target=$(this);
602	var h=$target.height();
603        if (ev.offsetY/h>0.5) {
604	  $target.after($grabbed);
605	}
606	else {
607	  $target.before($grabbed);
608	}
609      }
610    })
611  ;
612
613};
614
615$.fn.linkto=function(opt){
616  if (opt.newwin) {
617    window.open(opt.url);
618  }
619  else {
620    document.location=opt.url;
621  }
622};
623
624// ----- MISC
625$.extend({
626  getcookie:function(name){
627    var start = document.cookie.indexOf(name+"=");
628    var len = start+name.length+1;
629    if ((!start) && (name != document.cookie.substring(0,name.length))) return null;
630    if (start == -1) return "";
631    var end = document.cookie.indexOf(";",len);
632    if (end == -1) end = document.cookie.length;
633    return unescape(document.cookie.substring(len,end));
634  }
635
636  ,setcookie:function(c_name,value,exdays) {
637    var exdate=new Date();
638    if (!exdays) exdays=3;
639    exdate.setDate(exdate.getDate() + exdays);
640    var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
641    document.cookie=c_name + "=" + c_value;
642  }
643
644  ,getCSS:function(fn){
645    var fstem=fn.match(/([\w\-]*)\.(\w*)$/)[1];
646    var id='getcss-'+fstem;
647    var $old=$('link.getcss#'+id);
648    if ($old.length) return $old.get(0);
649
650    var scrtag=document.createElement('link');
651    scrtag.rel='stylesheet';
652    scrtag.type = 'text/css';
653    scrtag.className = 'getcss';
654    scrtag.href = fn;
655    scrtag.id = id;
656
657    var head=document.head||document.getElementsByTagName('head')[0];
658    head.appendChild(scrtag);
659    return scrtag;
660  }
661});
662
663})(jQuery);
664

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.