- added /yacy/ui/yacyuisearch.html (stand alone version) git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@5534 6c8d7289-2bf4-0310-a012-ef5d649a1542pull/1/head
parent
6cbca1e508
commit
55dd15e344
@ -1,200 +0,0 @@
|
|||||||
/*
|
|
||||||
* jQuery Keyboard Navigation Plugin - Current
|
|
||||||
* http://www.amountaintop.com/projects/keynav/
|
|
||||||
*
|
|
||||||
* To use, download this file to your server, save as keynav.js,
|
|
||||||
* and add this HTML into the <head>...</head> of your web page:
|
|
||||||
* <script type="text/javascript" src="keynav.js"></script>
|
|
||||||
*
|
|
||||||
* Copyright (c) 2006 Mike Hostetler <http://www.amountaintop.com/>
|
|
||||||
* Licensed under the MIT License:
|
|
||||||
* http://www.opensource.org/licenses/mit-license.php
|
|
||||||
*/
|
|
||||||
$.keynav = new Object();
|
|
||||||
|
|
||||||
$.fn.keynav = function (onClass,offClass) {
|
|
||||||
//Initialization
|
|
||||||
var kn = $.keynav;
|
|
||||||
if(!kn.init) {
|
|
||||||
kn.el = new Array();
|
|
||||||
|
|
||||||
$(document).keydown(function(e) {
|
|
||||||
var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
|
|
||||||
switch(key) {
|
|
||||||
case 37:
|
|
||||||
$.keynav.goLeft();
|
|
||||||
break;
|
|
||||||
case 38:
|
|
||||||
$.keynav.goUp();
|
|
||||||
break;
|
|
||||||
case 39:
|
|
||||||
$.keynav.goRight();
|
|
||||||
break;
|
|
||||||
case 40:
|
|
||||||
$.keynav.goDown();
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
$.keynav.activate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
kn.init = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.each(function() {
|
|
||||||
$.keynav.reg(this,onClass,offClass);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
$.fn.keynav_sethover = function(onClass,offClass) {
|
|
||||||
return this.each(function() {
|
|
||||||
this.onClass = onClass;
|
|
||||||
this.offClass = offClass;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$.keynav.reset = function() {
|
|
||||||
var kn = $.keynav;
|
|
||||||
kn.el = new Array();
|
|
||||||
}
|
|
||||||
|
|
||||||
$.keynav.reg = function(e,onClass,offClass) {
|
|
||||||
var kn = $.keynav;
|
|
||||||
e.pos = $.keynav.getPos(e);
|
|
||||||
e.onClass = onClass;
|
|
||||||
e.offClass = offClass;
|
|
||||||
e.onmouseover = function (e) { $.keynav.setActive(this); };
|
|
||||||
kn.el.push(e);
|
|
||||||
}
|
|
||||||
$.keynav.setActive = function(e) {
|
|
||||||
var kn = $.keynav;
|
|
||||||
var cur = $.keynav.getCurrent();
|
|
||||||
$(cur).trigger('blur');
|
|
||||||
for(var i=0;i<kn.el.length;i++) {
|
|
||||||
var tmp = kn.el[i];
|
|
||||||
$(tmp).removeClass().addClass(tmp.offClass);
|
|
||||||
}
|
|
||||||
$(e).removeClass().addClass(e.onClass);
|
|
||||||
$(e).trigger('focus');
|
|
||||||
kn.currentEl = e;
|
|
||||||
}
|
|
||||||
$.keynav.getCurrent = function () {
|
|
||||||
var kn = $.keynav;
|
|
||||||
if(kn.currentEl) {
|
|
||||||
var cur = kn.currentEl;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var cur = kn.el[0];
|
|
||||||
}
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
$.keynav.quad = function(cur,fQuad) {
|
|
||||||
var kn = $.keynav;
|
|
||||||
var quad = Array();
|
|
||||||
for(i=0;i<kn.el.length;i++) {
|
|
||||||
var el = kn.el[i];
|
|
||||||
if(cur == el) continue;
|
|
||||||
if(fQuad((cur.pos.cx - el.pos.cx),(cur.pos.cy - el.pos.cy)))
|
|
||||||
quad.push(el);
|
|
||||||
}
|
|
||||||
return quad;
|
|
||||||
}
|
|
||||||
$.keynav.activateClosest = function(cur,quad) {
|
|
||||||
var closest;
|
|
||||||
var od = 1000000;
|
|
||||||
var nd = 0;
|
|
||||||
var found = false;
|
|
||||||
for(i=0;i<quad.length;i++) {
|
|
||||||
var e = quad[i];
|
|
||||||
nd = Math.sqrt(Math.pow(cur.pos.cx-e.pos.cx,2)+Math.pow(cur.pos.cy-e.pos.cy,2));
|
|
||||||
if(nd < od) {
|
|
||||||
closest = e;
|
|
||||||
od = nd;
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(found)
|
|
||||||
$.keynav.setActive(closest);
|
|
||||||
}
|
|
||||||
$.keynav.goLeft = function () {
|
|
||||||
var cur = $.keynav.getCurrent();
|
|
||||||
var quad = $.keynav.quad(cur,function (dx,dy) {
|
|
||||||
if((dy >= 0) && (Math.abs(dx) - dy) <= 0)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
$.keynav.activateClosest(cur,quad);
|
|
||||||
}
|
|
||||||
$.keynav.goRight = function () {
|
|
||||||
var cur = $.keynav.getCurrent();
|
|
||||||
var quad = $.keynav.quad(cur,function (dx,dy) {
|
|
||||||
if((dy <= 0) && (Math.abs(dx) + dy) <= 0)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
$.keynav.activateClosest(cur,quad);
|
|
||||||
}
|
|
||||||
|
|
||||||
$.keynav.goUp = function () {
|
|
||||||
var cur = $.keynav.getCurrent();
|
|
||||||
var quad = $.keynav.quad(cur,function (dx,dy) {
|
|
||||||
if((dx >= 0) && (Math.abs(dy) - dx) <= 0)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
$.keynav.activateClosest(cur,quad);
|
|
||||||
}
|
|
||||||
|
|
||||||
$.keynav.goDown = function () {
|
|
||||||
var cur = $.keynav.getCurrent();
|
|
||||||
var quad = $.keynav.quad(cur,function (dx,dy) {
|
|
||||||
if((dx <= 0) && (Math.abs(dy) + dx) <= 0)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
$.keynav.activateClosest(cur,quad);
|
|
||||||
}
|
|
||||||
|
|
||||||
$.keynav.activate = function () {
|
|
||||||
var kn = $.keynav;
|
|
||||||
$(kn.currentEl).trigger('click');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function was taken from Stefan's exellent interface plugin
|
|
||||||
* http://www.eyecon.ro/interface/
|
|
||||||
*
|
|
||||||
* I included it in this library's namespace because the functions aren't
|
|
||||||
* quite the same.
|
|
||||||
*/
|
|
||||||
$.keynav.getPos = function (e)
|
|
||||||
{
|
|
||||||
var l = 0;
|
|
||||||
var t = 0;
|
|
||||||
var w = $.intval($.css(e,'width'));
|
|
||||||
var h = $.intval($.css(e,'height'));
|
|
||||||
while (e.offsetParent){
|
|
||||||
l += e.offsetLeft + (e.currentStyle?$.intval(e.currentStyle.borderLeftWidth):0);
|
|
||||||
t += e.offsetTop + (e.currentStyle?$.intval(e.currentStyle.borderTopWidth):0);
|
|
||||||
e = e.offsetParent;
|
|
||||||
}
|
|
||||||
l += e.offsetLeft + (e.currentStyle?$.intval(e.currentStyle.borderLeftWidth):0);
|
|
||||||
t += e.offsetTop + (e.currentStyle?$.intval(e.currentStyle.borderTopWidth):0);
|
|
||||||
var cx = Math.round(t+(h/2));
|
|
||||||
var cy = Math.round(l+(w/2));
|
|
||||||
return {x:l, y:t, w:w, h:h, cx:cx, cy:cy};
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function was taken from Stefan's exellent interface plugin
|
|
||||||
* http://www.eyecon.ro/interface/
|
|
||||||
*/
|
|
||||||
$.intval = function (v)
|
|
||||||
{
|
|
||||||
v = parseInt(v);
|
|
||||||
return isNaN(v) ? 0 : v;
|
|
||||||
};
|
|
||||||
|
|
@ -1,166 +0,0 @@
|
|||||||
/**
|
|
||||||
* This jQuery plugin displays pagination links inside the selected elements.
|
|
||||||
*
|
|
||||||
* @author Gabriel Birke (birke *at* d-scribe *dot* de)
|
|
||||||
* @version 1.1
|
|
||||||
* @param {int} maxentries Number of entries to paginate
|
|
||||||
* @param {Object} opts Several options (see README for documentation)
|
|
||||||
* @return {Object} jQuery Object
|
|
||||||
*/
|
|
||||||
jQuery.fn.pagination = function(maxentries, opts){
|
|
||||||
opts = jQuery.extend({
|
|
||||||
items_per_page:10,
|
|
||||||
num_display_entries:10,
|
|
||||||
current_page:0,
|
|
||||||
num_edge_entries:0,
|
|
||||||
link_to:"#",
|
|
||||||
prev_text:"Prev",
|
|
||||||
next_text:"Next",
|
|
||||||
ellipse_text:"...",
|
|
||||||
prev_show_always:true,
|
|
||||||
next_show_always:true,
|
|
||||||
callback:function(){return false;}
|
|
||||||
},opts||{});
|
|
||||||
|
|
||||||
return this.each(function() {
|
|
||||||
/**
|
|
||||||
* Calculate the maximum number of pages
|
|
||||||
*/
|
|
||||||
function numPages() {
|
|
||||||
return Math.ceil(maxentries/opts.items_per_page);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculate start and end point of pagination links depending on
|
|
||||||
* current_page and num_display_entries.
|
|
||||||
* @return {Array}
|
|
||||||
*/
|
|
||||||
function getInterval() {
|
|
||||||
var ne_half = Math.ceil(opts.num_display_entries/2);
|
|
||||||
var np = numPages();
|
|
||||||
var upper_limit = np-opts.num_display_entries;
|
|
||||||
var start = current_page>ne_half?Math.max(Math.min(current_page-ne_half, upper_limit), 0):0;
|
|
||||||
var end = current_page>ne_half?Math.min(current_page+ne_half, np):Math.min(opts.num_display_entries, np);
|
|
||||||
return [start,end];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the event handling function for the pagination links.
|
|
||||||
* @param {int} page_id The new page number
|
|
||||||
*/
|
|
||||||
function pageSelected(page_id, evt){
|
|
||||||
current_page = page_id;
|
|
||||||
drawLinks();
|
|
||||||
var continuePropagation = opts.callback(page_id, panel);
|
|
||||||
if (!continuePropagation) {
|
|
||||||
if (evt.stopPropagation) {
|
|
||||||
evt.stopPropagation();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
evt.cancelBubble = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return continuePropagation;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function inserts the pagination links into the container element
|
|
||||||
*/
|
|
||||||
function drawLinks() {
|
|
||||||
panel.empty();
|
|
||||||
var interval = getInterval();
|
|
||||||
var np = numPages();
|
|
||||||
// This helper function returns a handler function that calls pageSelected with the right page_id
|
|
||||||
var getClickHandler = function(page_id) {
|
|
||||||
return function(evt){ return pageSelected(page_id,evt); }
|
|
||||||
}
|
|
||||||
// Helper function for generating a single link (or a span tag if it'S the current page)
|
|
||||||
var appendItem = function(page_id, appendopts){
|
|
||||||
page_id = page_id<0?0:(page_id<np?page_id:np-1); // Normalize page id to sane value
|
|
||||||
appendopts = jQuery.extend({text:page_id+1, classes:""}, appendopts||{});
|
|
||||||
if(page_id == current_page){
|
|
||||||
var lnk = $("<span class='current'>"+(appendopts.text)+"</span>");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var lnk = $("<a>"+(appendopts.text)+"</a>")
|
|
||||||
.bind("click", getClickHandler(page_id))
|
|
||||||
.attr('href', opts.link_to.replace(/__id__/,page_id));
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
if(appendopts.classes){lnk.addClass(appendopts.classes);}
|
|
||||||
panel.append(lnk);
|
|
||||||
}
|
|
||||||
// Generate "Previous"-Link
|
|
||||||
if(opts.prev_text && (current_page > 0 || opts.prev_show_always)){
|
|
||||||
appendItem(current_page-1,{text:opts.prev_text, classes:"prev"});
|
|
||||||
}
|
|
||||||
// Generate starting points
|
|
||||||
if (interval[0] > 0 && opts.num_edge_entries > 0)
|
|
||||||
{
|
|
||||||
var end = Math.min(opts.num_edge_entries, interval[0]);
|
|
||||||
for(var i=0; i<end; i++) {
|
|
||||||
appendItem(i);
|
|
||||||
}
|
|
||||||
if(opts.num_edge_entries < interval[0] && opts.ellipse_text)
|
|
||||||
{
|
|
||||||
jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Generate interval links
|
|
||||||
for(var i=interval[0]; i<interval[1]; i++) {
|
|
||||||
appendItem(i);
|
|
||||||
}
|
|
||||||
// Generate ending points
|
|
||||||
if (interval[1] < np && opts.num_edge_entries > 0)
|
|
||||||
{
|
|
||||||
if(np-opts.num_edge_entries > interval[1]&& opts.ellipse_text)
|
|
||||||
{
|
|
||||||
jQuery("<span>"+opts.ellipse_text+"</span>").appendTo(panel);
|
|
||||||
}
|
|
||||||
var begin = Math.max(np-opts.num_edge_entries, interval[1]);
|
|
||||||
for(var i=begin; i<np; i++) {
|
|
||||||
appendItem(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
// Generate "Next"-Link
|
|
||||||
if(opts.next_text && (current_page < np-1 || opts.next_show_always)){
|
|
||||||
appendItem(current_page+1,{text:opts.next_text, classes:"next"});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extract current_page from options
|
|
||||||
var current_page = opts.current_page;
|
|
||||||
// Create a sane value for maxentries and items_per_page
|
|
||||||
maxentries = (!maxentries || maxentries < 0)?1:maxentries;
|
|
||||||
opts.items_per_page = (!opts.items_per_page || opts.items_per_page < 0)?1:opts.items_per_page;
|
|
||||||
// Store DOM element for easy access from all inner functions
|
|
||||||
var panel = jQuery(this);
|
|
||||||
// Attach control functions to the DOM element
|
|
||||||
this.selectPage = function(page_id){ pageSelected(page_id);}
|
|
||||||
this.prevPage = function(){
|
|
||||||
if (current_page > 0) {
|
|
||||||
pageSelected(current_page - 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.nextPage = function(){
|
|
||||||
if(current_page < numPages()-1) {
|
|
||||||
pageSelected(current_page+1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// When all initialisation is done, draw the links
|
|
||||||
drawLinks();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,420 +0,0 @@
|
|||||||
/**
|
|
||||||
* xslTransform
|
|
||||||
* Tools for XSLT transformations; jQuery wrapper for Sarissa <http://sarissa.sourceforge.net/>.
|
|
||||||
* See jQuery.fn.log below for documentation on $.log().
|
|
||||||
* See jQuery.fn.getTransform below for documention on the $.getTransform().
|
|
||||||
* See var DEBUG below for turning debugging/logging on and off.
|
|
||||||
*
|
|
||||||
* @version 20071214
|
|
||||||
* @since 2006-07-05
|
|
||||||
* @copyright Copyright (c) 2006 Glyphix Studio, Inc. http://www.glyphix.com
|
|
||||||
* @author Brad Brizendine <brizbane@gmail.com>, Matt Antone <antone@glyphix.com>
|
|
||||||
* @license MIT http://www.opensource.org/licenses/mit-license.php
|
|
||||||
* @requires >= jQuery 1.0.3 http://jquery.com/
|
|
||||||
* @requires jquery.debug.js http://jquery.glyphix.com/
|
|
||||||
* @requires >= sarissa.js 0.9.7.6 http://sarissa.sourceforge.net/
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* var r = $.xsl.transform('path-to-xsl.xsl','path-to-xml.xml');
|
|
||||||
* @desc Perform a transformation and place the results in var r
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* var r = $.xsl.transform('path-to-xsl.xsl','path-to-xml.xml');
|
|
||||||
* var str = $.xsl.serialize( r );
|
|
||||||
* @desc Perform a transformation, then turn the result into a string
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* var doc = $.xsl.load('path-to-xml.xml');
|
|
||||||
* @desc Load an xml file and return a parsed xml object
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* var xml = '<xmldoc><foo>bar</foo></xmldoc>';
|
|
||||||
* var doc = $.xsl.load(xml);
|
|
||||||
* @desc Load an xml string and return a parsed xml object
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function($){
|
|
||||||
|
|
||||||
/*
|
|
||||||
* JQuery XSLT transformation plugin.
|
|
||||||
* Replaces all matched elements with the results of an XSLT transformation.
|
|
||||||
* See xslTransform above for more documentation.
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* @desc See the xslTransform-example/index.html
|
|
||||||
*
|
|
||||||
* @param xsl String the url to the xsl file
|
|
||||||
* @param xml String the url to the xml file
|
|
||||||
* @param options Object various switches you can send to this function
|
|
||||||
* + params: an object of key/value pairs to be sent to xsl as parameters
|
|
||||||
* + xpath: defines the root node within the provided xml file
|
|
||||||
* + eval: if true, will attempt to eval javascript found in the transformed result
|
|
||||||
* + callback: if a Function, evaluate it when transformation is complete
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
$.fn.getTransform = function( xsl, xml, options ){
|
|
||||||
var settings = {
|
|
||||||
params: {}, // object of key/value pairs ... parameters to send to the XSL stylesheet
|
|
||||||
xpath: '', // xpath, used to send only a portion of the XML file to the XSL stylesheet
|
|
||||||
eval: true, // evaluate <script> blocks found in the transformed result
|
|
||||||
callback: '' // callback function, to be run on completion of the transformation
|
|
||||||
};
|
|
||||||
// initialize options hash; override the defaults with supplied options
|
|
||||||
$.extend( settings, options );
|
|
||||||
$.log( 'getTransform: ' + xsl + '::' + xml + '::' + settings.toString() );
|
|
||||||
|
|
||||||
// must have both xsl and xml
|
|
||||||
if( !xsl || !xml ){
|
|
||||||
$.log( 'getTransform: missing xsl or xml' );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// run the jquery magic on all matched elements
|
|
||||||
return this.each( function(){
|
|
||||||
// perform the transformation
|
|
||||||
var trans = $.xsl.transform( xsl, xml, settings );
|
|
||||||
|
|
||||||
// make sure we have something
|
|
||||||
if( !trans.string ){
|
|
||||||
$.log('Received nothing from the transformation');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ie can fail if there's an xml declaration line in the returned result
|
|
||||||
var re = trans.string.match(/<\?xml.*?\?>/);
|
|
||||||
if( re ){
|
|
||||||
trans.string = trans.string.replace( re, '' );
|
|
||||||
$.log( 'getTransform(): found an xml declaration and removed it' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// place the result in the element
|
|
||||||
// 20070202: jquery 1.1.1 can get a "a.appendChild is not a function" error using html() sometimes ...
|
|
||||||
// no idea why yet, so adding a fallback to innerHTML
|
|
||||||
// ::warning:: ie6 has trouble with javascript events such as onclick assigned statically within the html when using innerHTML
|
|
||||||
try{
|
|
||||||
$(this).html( trans.string );
|
|
||||||
}catch(e){
|
|
||||||
$.log( 'getTransform: error placing results of transform into element, falling back to innerHTML: ' + e.toString() );
|
|
||||||
$(this)[0].innerHTML = trans.string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// there might not be a scripts property
|
|
||||||
if( settings.eval && trans.scripts ){
|
|
||||||
if( trans.scripts.length > 0 ){
|
|
||||||
$.log( 'Found text/javascript in transformed result' );
|
|
||||||
// use jquery's globaleval to avoid security issues in adobe air
|
|
||||||
$.globalEval( trans.scripts );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// run the callback if it's a native function
|
|
||||||
if( settings.callback && $.isFunction(settings.callback) ){
|
|
||||||
settings.callback.apply();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
// xsl scope
|
|
||||||
$.xsl = {
|
|
||||||
|
|
||||||
// version
|
|
||||||
version: 20071214,
|
|
||||||
|
|
||||||
// init ... test for requirements
|
|
||||||
init: function(){
|
|
||||||
// check for v1.0.4 / v1.1 or later of jQuery
|
|
||||||
try{
|
|
||||||
parseFloat($.fn.jquery) >= 1;
|
|
||||||
}catch(e){
|
|
||||||
alert('xslTransform requires jQuery 1.0.4 or greater ... please load it prior to xslTransform');
|
|
||||||
}
|
|
||||||
// check for Sarissa
|
|
||||||
try{
|
|
||||||
Sarissa;
|
|
||||||
}catch(e){
|
|
||||||
alert('Missing Sarissa ... please load it prior to xslTransform');
|
|
||||||
}
|
|
||||||
// if no log function, create a blank one
|
|
||||||
if( !$.log ){
|
|
||||||
$.log = function(){};
|
|
||||||
$.fn.debug = function(){};
|
|
||||||
}
|
|
||||||
// log the version
|
|
||||||
$.log( 'xslTransform:init(): version ' + this.version );
|
|
||||||
},
|
|
||||||
|
|
||||||
// initialize Sarissa's serializer
|
|
||||||
XMLSerializer: new XMLSerializer(),
|
|
||||||
|
|
||||||
/*
|
|
||||||
* serialize
|
|
||||||
* Turns the provided object into a string and returns it.
|
|
||||||
*
|
|
||||||
* @param data Mixed
|
|
||||||
* @returns String
|
|
||||||
*/
|
|
||||||
serialize: function( data ){
|
|
||||||
$.log( 'serialize(): received ' + typeof(data) );
|
|
||||||
// if it's already a string, no further processing required
|
|
||||||
if( typeof(data) == 'string' ){
|
|
||||||
$.log( 'data is already a string: ' + data );
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
return this.XMLSerializer.serializeToString( data );
|
|
||||||
},
|
|
||||||
|
|
||||||
/*
|
|
||||||
* xmlize
|
|
||||||
* Turns the provided javascript object into an xml document and returns it.
|
|
||||||
*
|
|
||||||
* @param data Mixed
|
|
||||||
* @returns String
|
|
||||||
*/
|
|
||||||
xmlize: function( data, root ){
|
|
||||||
$.log( 'xmlize(): received ' + typeof(data) );
|
|
||||||
root = root || 'root';
|
|
||||||
return Sarissa.xmlize(data,root);
|
|
||||||
},
|
|
||||||
|
|
||||||
/*
|
|
||||||
* load
|
|
||||||
* Attempts to load xml data by automatically sensing the type of the provided data.
|
|
||||||
*
|
|
||||||
* @param xml Mixed the xml data
|
|
||||||
* @returns Object
|
|
||||||
*/
|
|
||||||
load: function( xml ){
|
|
||||||
$.log( 'load(): received ' + typeof(xml) );
|
|
||||||
// the result
|
|
||||||
var r;
|
|
||||||
|
|
||||||
// if it's an object, assume it's already an XML object, so just return it
|
|
||||||
if( typeof(xml) == 'object' ){
|
|
||||||
return xml;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if it's a string, determine if it's xml data or a path
|
|
||||||
// assume that the first character is an opening caret if it's XML data
|
|
||||||
if( xml.substring(0,1) == '<' ){
|
|
||||||
r = this.loadString( xml );
|
|
||||||
}else{
|
|
||||||
r = this.loadFile( xml );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( r ){
|
|
||||||
// the following two lines are needed to get IE (msxml3) to run xpath ... set it on all xml data
|
|
||||||
r.setProperty( 'SelectionNamespaces', 'xmlns:xsl="http://www.w3.org/1999/XSL/Transform"' );
|
|
||||||
r.setProperty( 'SelectionLanguage', 'XPath' );
|
|
||||||
return r;
|
|
||||||
}else{
|
|
||||||
$.log( 'Unable to load ' + xml );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/*
|
|
||||||
* loadString
|
|
||||||
* Parses an XML string and returns the result.
|
|
||||||
*
|
|
||||||
* @param str String the xml string to turn into a parsed XML object
|
|
||||||
* @returns Object
|
|
||||||
*/
|
|
||||||
loadString: function( str ){
|
|
||||||
$.log( 'loadString(): ' + str + '::' + typeof(str) );
|
|
||||||
|
|
||||||
// use Sarissa to generate an XML doc
|
|
||||||
var p = new DOMParser();
|
|
||||||
var xml = p.parseFromString( str, 'text/xml' );
|
|
||||||
if( !xml ){
|
|
||||||
$.log( 'loadString(): parseFromString() failed' );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return xml;
|
|
||||||
},
|
|
||||||
|
|
||||||
/*
|
|
||||||
* loadFile
|
|
||||||
* Attempts to retrieve the requested path, specified by url.
|
|
||||||
* If url is an object, it's assumed it's already loaded, and just returns it.
|
|
||||||
*
|
|
||||||
* @param url Mixed
|
|
||||||
* @returns Object
|
|
||||||
*/
|
|
||||||
loadFile: function( url ){
|
|
||||||
$.log( 'loadFile(): ' + url + '::' + typeof(url) );
|
|
||||||
|
|
||||||
if( !url ){
|
|
||||||
$.log( 'ERROR: loadFile() missing url' );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// variable to hold ajax results
|
|
||||||
var doc;
|
|
||||||
/* ajax functionality provided by jQuery is commented, since it can't handle file:///
|
|
||||||
// function to receive data on successful download ... semicolon after brace is necessary for packing
|
|
||||||
this.xhrsuccess = function(data,str){
|
|
||||||
$.log( 'loadFile() completed successfully (' + str + ')' );
|
|
||||||
doc = data;
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
// function to handle downloading error ... semicolon after brace is necessary for packing
|
|
||||||
this.xhrerror = function(xhr,err){
|
|
||||||
// set debugging to true in order to force the display of this error
|
|
||||||
window.DEBUG = true;
|
|
||||||
$.log( 'loadFile() failed to load the requested file: (' + err + ') - xml: ' + xhr.responseXML + ' - text: ' + xhr.responseText );
|
|
||||||
doc = null;
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
// make asynchronous ajax call and call functions defined above on success/error
|
|
||||||
$.ajax({
|
|
||||||
type: 'GET',
|
|
||||||
url: url,
|
|
||||||
async: false,
|
|
||||||
success: this.xhrsuccess,
|
|
||||||
error: this.xhrerror
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
var xmlhttp = new XMLHttpRequest();
|
|
||||||
xmlhttp.open('GET', url, false);
|
|
||||||
xmlhttp.send('');
|
|
||||||
doc = xmlhttp.responseXML;
|
|
||||||
|
|
||||||
// check for total failure
|
|
||||||
if( !doc ){
|
|
||||||
$.log( 'ERROR: document ' + url + ' not found (404), or unable to load' );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// check for success but no data
|
|
||||||
if( doc.length == 0 ){
|
|
||||||
$.log( 'ERROR: document ' + url + ' loaded in loadFile() has no data' );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return doc;
|
|
||||||
},
|
|
||||||
|
|
||||||
/*
|
|
||||||
* transform
|
|
||||||
* Central transformation function: takes an xml doc and an xsl doc.
|
|
||||||
*
|
|
||||||
* @param xsl Mixed the xsl transformation document
|
|
||||||
* @param xml Mixed the xml document to be transformed
|
|
||||||
* @param options Object various switches you can send to this function
|
|
||||||
* + params: an object of key/value pairs to be sent to xsl as parameters
|
|
||||||
* + xpath: defines the root node within the provided xml file
|
|
||||||
* @returns Object the results of the transformation
|
|
||||||
* + xsl: the raw xsl doc
|
|
||||||
* + doc: the raw results of the transform
|
|
||||||
* + string: the serialized doc
|
|
||||||
*/
|
|
||||||
transform: function( xsl, xml, options ){
|
|
||||||
$.log( 'transform(): ' + xsl + '::' + xml + '::' + (options ? options.toString() : 'no options provided') );
|
|
||||||
|
|
||||||
// set up request and result
|
|
||||||
var request = {
|
|
||||||
// the source and loaded object for xml
|
|
||||||
xsl: {
|
|
||||||
source: xsl,
|
|
||||||
doc: null
|
|
||||||
},
|
|
||||||
// the source and loaded object for xsl
|
|
||||||
xml: {
|
|
||||||
source: xml,
|
|
||||||
doc: null
|
|
||||||
},
|
|
||||||
// the options
|
|
||||||
options: options || {},
|
|
||||||
// the result doc and string
|
|
||||||
result: {
|
|
||||||
doc: null,
|
|
||||||
string: '',
|
|
||||||
scripts: null,
|
|
||||||
error: ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// set up error handler
|
|
||||||
var err = function( what ){
|
|
||||||
var docerr = '', srcerr = '';
|
|
||||||
// build the src error string
|
|
||||||
srcerr = (typeof(request[what].source) == 'string') ? ' (' + what + ' loaded from provided path)' : ' (' + what + ' loaded from provided object)';
|
|
||||||
// build the text error string
|
|
||||||
docerr = (typeof(request[what].doc) == 'object') ? '[success]' : '[failure]';
|
|
||||||
// include the root node if we have a doc object and it's xml
|
|
||||||
if( what == 'xml' && typeof(request[what].doc) == 'object' ){
|
|
||||||
docerr += ' root node of "' + request[what].doc.getElementsByTagName('*')[0].nodeName + '"';
|
|
||||||
}
|
|
||||||
return docerr + ' ' + srcerr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// load the files
|
|
||||||
try{
|
|
||||||
request.xsl.doc = this.load(xsl);
|
|
||||||
request.xml.doc = this.load(xml);
|
|
||||||
}catch(e){
|
|
||||||
$.log('Unable to load either xsl [' + err('xsl') + '] or xml [' + err('xml') + ']');
|
|
||||||
throw( err('xsl') + '::' + err('xml') );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we have an xpath, replace xml.doc with the results of running it
|
|
||||||
// as of 2007-12-03, IE throws a "msxml6: the parameter is incorrect" error, so removing this
|
|
||||||
if( request.options.xpath && request.xml.doc && !jQuery.browser.msie ){
|
|
||||||
// run the xpath
|
|
||||||
request.xml.doc = request.xml.doc.selectSingleNode( request.options.xpath.toString() );
|
|
||||||
$.log( 'transform(): xpath has been run...resulting doc: ' + (this.serialize(request.xml.doc)) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// attach the processor
|
|
||||||
var processor = new XSLTProcessor();
|
|
||||||
// stylesheet must be imported before parameters can be added
|
|
||||||
processor.importStylesheet( request.xsl.doc );
|
|
||||||
// add parameters to the processor
|
|
||||||
if( request.options.params && processor ){
|
|
||||||
$.log( 'transform(): received xsl params: ' + request.options.params.toString() );
|
|
||||||
for( key in request.options.params ){
|
|
||||||
// name and value must be strings; first parameter is namespace
|
|
||||||
var p = request.options.params[key] ? request.options.params[key].toString() : request.options.params[key];
|
|
||||||
try{
|
|
||||||
processor.setParameter( null, key.toString(), p );
|
|
||||||
}catch(e){
|
|
||||||
$.log('Unable to set parameter "' + key + '"');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$.log( 'set parameter "' + key.toString() + '" to "' + p + '"' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// perform the transformation
|
|
||||||
try{
|
|
||||||
request.result.doc = processor.transformToDocument( request.xml.doc );
|
|
||||||
// handle transform error
|
|
||||||
request.result.error = Sarissa.getParseErrorText( request.result.doc );
|
|
||||||
if( request.result.error != Sarissa.PARSED_OK ){
|
|
||||||
// throw the error text
|
|
||||||
request.result.error = 'transform(): error in transformation: ' + request.result.error + ' :: using xsl: ' + err('xsl') + ' => xml: ' + err('xml');
|
|
||||||
$.log(request.result.error);
|
|
||||||
}
|
|
||||||
}catch(e){
|
|
||||||
request.result.error = 'Unable to perform transformation :: using xsl: ' + err('xsl') + ' => xml: ' + err('xml');
|
|
||||||
$.log(request.result.error);
|
|
||||||
throw(request.result.error);
|
|
||||||
return request.result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we made it this far, the transformation was successful
|
|
||||||
request.result.string = this.serialize( request.result.doc );
|
|
||||||
// store reference to all scripts found in the doc (not result.string)
|
|
||||||
request.result.scripts = jQuery('script',request.result.doc).text();
|
|
||||||
|
|
||||||
return request.result;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// initialize the $.xsl object
|
|
||||||
$.xsl.init();
|
|
||||||
|
|
||||||
})(jQuery);
|
|
File diff suppressed because it is too large
Load Diff
@ -1,220 +0,0 @@
|
|||||||
/**
|
|
||||||
* ====================================================================
|
|
||||||
* About
|
|
||||||
* ====================================================================
|
|
||||||
* Sarissa cross browser XML library - IE XPath Emulation
|
|
||||||
* @version 0.9.9.4
|
|
||||||
* @author: Copyright 2004-2007 Emmanouil Batsis, mailto: mbatsis at users full stop sourceforge full stop net
|
|
||||||
*
|
|
||||||
* This script emulates Internet Explorer's selectNodes and selectSingleNode
|
|
||||||
* for Mozilla. Associating namespace prefixes with URIs for your XPath queries
|
|
||||||
* is easy with IE's setProperty.
|
|
||||||
* USers may also map a namespace prefix to a default (unprefixed) namespace in the
|
|
||||||
* source document with Sarissa.setXpathNamespaces
|
|
||||||
*
|
|
||||||
* ====================================================================
|
|
||||||
* Licence
|
|
||||||
* ====================================================================
|
|
||||||
* Sarissa is free software distributed under the GNU GPL version 2 (see <a href="gpl.txt">gpl.txt</a>) or higher,
|
|
||||||
* GNU LGPL version 2.1 (see <a href="lgpl.txt">lgpl.txt</a>) or higher and Apache Software License 2.0 or higher
|
|
||||||
* (see <a href="asl.txt">asl.txt</a>). This means you can choose one of the three and use that if you like. If
|
|
||||||
* you make modifications under the ASL, i would appreciate it if you submitted those.
|
|
||||||
* In case your copy of Sarissa does not include the license texts, you may find
|
|
||||||
* them online in various formats at <a href="http://www.gnu.org">http://www.gnu.org</a> and
|
|
||||||
* <a href="http://www.apache.org">http://www.apache.org</a>.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
|
||||||
* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
||||||
* WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
||||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
if(Sarissa._SARISSA_HAS_DOM_FEATURE && document.implementation.hasFeature("XPath", "3.0")){
|
|
||||||
/**
|
|
||||||
* <p>SarissaNodeList behaves as a NodeList but is only used as a result to <code>selectNodes</code>,
|
|
||||||
* so it also has some properties IEs proprietery object features.</p>
|
|
||||||
* @private
|
|
||||||
* @constructor
|
|
||||||
* @argument i the (initial) list size
|
|
||||||
*/
|
|
||||||
SarissaNodeList = function (i){
|
|
||||||
this.length = i;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* <p>Set an Array as the prototype object</p>
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
SarissaNodeList.prototype = [];
|
|
||||||
/**
|
|
||||||
* <p>Inherit the Array constructor </p>
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
SarissaNodeList.prototype.constructor = Array;
|
|
||||||
/**
|
|
||||||
* <p>Returns the node at the specified index or null if the given index
|
|
||||||
* is greater than the list size or less than zero </p>
|
|
||||||
* <p><b>Note</b> that in ECMAScript you can also use the square-bracket
|
|
||||||
* array notation instead of calling <code>item</code>
|
|
||||||
* @argument i the index of the member to return
|
|
||||||
* @returns the member corresponding to the given index
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
SarissaNodeList.prototype.item = function(i) {
|
|
||||||
return (i < 0 || i >= this.length)?null:this[i];
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* <p>Emulate IE's expr property
|
|
||||||
* (Here the SarissaNodeList object is given as the result of selectNodes).</p>
|
|
||||||
* @returns the XPath expression passed to selectNodes that resulted in
|
|
||||||
* this SarissaNodeList
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
SarissaNodeList.prototype.expr = "";
|
|
||||||
/** dummy, used to accept IE's stuff without throwing errors */
|
|
||||||
if(window.XMLDocument && (!XMLDocument.prototype.setProperty)){
|
|
||||||
XMLDocument.prototype.setProperty = function(x,y){};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* <p>Programmatically control namespace URI/prefix mappings for XPath
|
|
||||||
* queries.</p>
|
|
||||||
* <p>This method comes especially handy when used to apply XPath queries
|
|
||||||
* on XML documents with a default namespace, as there is no other way
|
|
||||||
* of mapping that to a prefix.</p>
|
|
||||||
* <p>Using no namespace prefix in DOM Level 3 XPath queries, implies you
|
|
||||||
* are looking for elements in the null namespace. If you need to look
|
|
||||||
* for nodes in the default namespace, you need to map a prefix to it
|
|
||||||
* first like:</p>
|
|
||||||
* <pre>Sarissa.setXpathNamespaces(oDoc, "xmlns:myprefix'http://mynsURI'");</pre>
|
|
||||||
* <p><b>Note 1 </b>: Use this method only if the source document features
|
|
||||||
* a default namespace (without a prefix), otherwise just use IE's setProperty
|
|
||||||
* (moz will rezolve non-default namespaces by itself). You will need to map that
|
|
||||||
* namespace to a prefix for queries to work.</p>
|
|
||||||
* <p><b>Note 2 </b>: This method calls IE's setProperty method to set the
|
|
||||||
* appropriate namespace-prefix mappings, so you dont have to do that.</p>
|
|
||||||
* @param oDoc The target XMLDocument to set the namespace mappings for.
|
|
||||||
* @param sNsSet A whilespace-seperated list of namespace declarations as
|
|
||||||
* those would appear in an XML document. E.g.:
|
|
||||||
* <code>"xmlns:xhtml='http://www.w3.org/1999/xhtml'
|
|
||||||
* xmlns:'http://www.w3.org/1999/XSL/Transform'"</code>
|
|
||||||
* @throws An error if the format of the given namespace declarations is bad.
|
|
||||||
*/
|
|
||||||
Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
|
|
||||||
//oDoc._sarissa_setXpathNamespaces(sNsSet);
|
|
||||||
oDoc._sarissa_useCustomResolver = true;
|
|
||||||
var namespaces = sNsSet.indexOf(" ")>-1?sNsSet.split(" "):[sNsSet];
|
|
||||||
oDoc._sarissa_xpathNamespaces = [];
|
|
||||||
for(var i=0;i < namespaces.length;i++){
|
|
||||||
var ns = namespaces[i];
|
|
||||||
var colonPos = ns.indexOf(":");
|
|
||||||
var assignPos = ns.indexOf("=");
|
|
||||||
if(colonPos > 0 && assignPos > colonPos+1){
|
|
||||||
var prefix = ns.substring(colonPos+1, assignPos);
|
|
||||||
var uri = ns.substring(assignPos+2, ns.length-1);
|
|
||||||
oDoc._sarissa_xpathNamespaces[prefix] = uri;
|
|
||||||
}else{
|
|
||||||
throw "Bad format on namespace declaration(s) given";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @private Flag to control whether a custom namespace resolver should
|
|
||||||
* be used, set to true by Sarissa.setXpathNamespaces
|
|
||||||
*/
|
|
||||||
XMLDocument.prototype._sarissa_useCustomResolver = false;
|
|
||||||
/** @private */
|
|
||||||
XMLDocument.prototype._sarissa_xpathNamespaces = [];
|
|
||||||
/**
|
|
||||||
* <p>Extends the XMLDocument to emulate IE's selectNodes.</p>
|
|
||||||
* @argument sExpr the XPath expression to use
|
|
||||||
* @argument contextNode this is for internal use only by the same
|
|
||||||
* method when called on Elements
|
|
||||||
* @returns the result of the XPath search as a SarissaNodeList
|
|
||||||
* @throws An error if no namespace URI is found for the given prefix.
|
|
||||||
*/
|
|
||||||
XMLDocument.prototype.selectNodes = function(sExpr, contextNode, returnSingle){
|
|
||||||
var nsDoc = this;
|
|
||||||
var nsresolver;
|
|
||||||
if(this._sarissa_useCustomResolver){
|
|
||||||
nsresolver = function(prefix){
|
|
||||||
var s = nsDoc._sarissa_xpathNamespaces[prefix];
|
|
||||||
if(s){
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "No namespace URI found for prefix: '" + prefix+"'";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
nsresolver = this.createNSResolver(this.documentElement);
|
|
||||||
}
|
|
||||||
var result = null;
|
|
||||||
if(!returnSingle){
|
|
||||||
var oResult = this.evaluate(sExpr,
|
|
||||||
(contextNode?contextNode:this),
|
|
||||||
nsresolver,
|
|
||||||
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
|
|
||||||
var nodeList = new SarissaNodeList(oResult.snapshotLength);
|
|
||||||
nodeList.expr = sExpr;
|
|
||||||
for(var i=0;i<nodeList.length;i++){
|
|
||||||
nodeList[i] = oResult.snapshotItem(i);
|
|
||||||
}
|
|
||||||
result = nodeList;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = this.evaluate(sExpr,
|
|
||||||
(contextNode?contextNode:this),
|
|
||||||
nsresolver,
|
|
||||||
XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* <p>Extends the Element to emulate IE's selectNodes</p>
|
|
||||||
* @argument sExpr the XPath expression to use
|
|
||||||
* @returns the result of the XPath search as an (Sarissa)NodeList
|
|
||||||
* @throws An
|
|
||||||
* error if invoked on an HTML Element as this is only be
|
|
||||||
* available to XML Elements.
|
|
||||||
*/
|
|
||||||
Element.prototype.selectNodes = function(sExpr){
|
|
||||||
var doc = this.ownerDocument;
|
|
||||||
if(doc.selectNodes){
|
|
||||||
return doc.selectNodes(sExpr, this);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw "Method selectNodes is only supported by XML Elements";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* <p>Extends the XMLDocument to emulate IE's selectSingleNode.</p>
|
|
||||||
* @argument sExpr the XPath expression to use
|
|
||||||
* @argument contextNode this is for internal use only by the same
|
|
||||||
* method when called on Elements
|
|
||||||
* @returns the result of the XPath search as an (Sarissa)NodeList
|
|
||||||
*/
|
|
||||||
XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){
|
|
||||||
var ctx = contextNode?contextNode:null;
|
|
||||||
return this.selectNodes(sExpr, ctx, true);
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* <p>Extends the Element to emulate IE's selectSingleNode.</p>
|
|
||||||
* @argument sExpr the XPath expression to use
|
|
||||||
* @returns the result of the XPath search as an (Sarissa)NodeList
|
|
||||||
* @throws An error if invoked on an HTML Element as this is only be
|
|
||||||
* available to XML Elements.
|
|
||||||
*/
|
|
||||||
Element.prototype.selectSingleNode = function(sExpr){
|
|
||||||
var doc = this.ownerDocument;
|
|
||||||
if(doc.selectSingleNode){
|
|
||||||
return doc.selectSingleNode(sExpr, this);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw "Method selectNodes is only supported by XML Elements";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Sarissa.IS_ENABLED_SELECT_NODES = true;
|
|
||||||
}
|
|
@ -0,0 +1,154 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<link media="screen" type="text/css" href="css/jquery.flexigrid.css" rel="stylesheet" />
|
||||||
|
<link media="screen" type="text/css" href="css/base.css" rel="stylesheet" />
|
||||||
|
<script src="js/jquery-1.2.6.min.js" type="text/javascript"></script>
|
||||||
|
<script src="js/jquery.query.js" type="text/javascript""></script>
|
||||||
|
<script src="js/jquery.dimensions.min.js" type="text/javascript"></script>
|
||||||
|
<script src="js/jquery-faviconize-1.0.js" type="text/javascript"></script>
|
||||||
|
<script src="js/jquery-flexigrid.js" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
//<![CDATA[
|
||||||
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
var height = document.documentElement.clientHeight - 240;
|
||||||
|
var query = $.query.get('query');
|
||||||
|
$.query.REMOVE('query');
|
||||||
|
var url = '/yacysearch.json' + $.query.toString();
|
||||||
|
|
||||||
|
$(".yresult").flexigrid({
|
||||||
|
url: url,
|
||||||
|
dataType: 'json',
|
||||||
|
method: 'GET',
|
||||||
|
query: query,
|
||||||
|
colModel: [
|
||||||
|
{display: 'Hash', name : 'hash', width : 50, sortable : false, align: 'center', hide: true},
|
||||||
|
{display: '', name : 'public', width : 25, sortable : true, align: 'center'},
|
||||||
|
{display: 'Title', name : 'title', width : 550, sortable : true, align: 'left'},
|
||||||
|
{display: 'Date', name : 'date', width : 200, sortable : true, align: 'left'}
|
||||||
|
],
|
||||||
|
buttons: [
|
||||||
|
{name: 'Crawl', bclass: 'crawl', onpress: yaction},
|
||||||
|
{name: 'Open', bclass: 'pictures', onpress: yaction},
|
||||||
|
{separator: true},
|
||||||
|
{name: 'Bookmark', bclass: 'bookmark', onpress: yaction},
|
||||||
|
{name: 'Blacklist', bclass: 'blacklist', onpress: yaction},
|
||||||
|
{separator: true},
|
||||||
|
{name: 'Help', bclass: 'help', onpress:yaction},
|
||||||
|
],
|
||||||
|
useRp: true,
|
||||||
|
rp: 10,
|
||||||
|
usepager: true,
|
||||||
|
striped: true,
|
||||||
|
nowrap: false,
|
||||||
|
height: height,
|
||||||
|
autoload: true,
|
||||||
|
onSuccess: function() {
|
||||||
|
$("a.favicon").faviconize({
|
||||||
|
position: "before",
|
||||||
|
defaultImage: "img-2/article.png",
|
||||||
|
className: "favicon"
|
||||||
|
});
|
||||||
|
},
|
||||||
|
preProcess: function(data) {
|
||||||
|
var total = data.channels[0].totalResults.replace(/[,.]/,"");
|
||||||
|
var page = (data.channels[0].startIndex / data.channels[0].itemsPerPage) + 1;
|
||||||
|
var rows = {};
|
||||||
|
$.each (
|
||||||
|
data.channels[0].items,
|
||||||
|
function(i,item) {
|
||||||
|
if (item) {
|
||||||
|
var html = "<h3 class='linktitle'>"+item.title+"</h3><p class='desc'>"+item.description+"</p><p class='url'><a href='"+item.link+"'>"+item.link+"</a>"
|
||||||
|
var fav = "<a class='favicon' href='"+item.link+"'></a>";
|
||||||
|
rows[i] = {id: item.guid, cell: [item.guid, fav, html, item.pubDate]};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
var pdata = {
|
||||||
|
page: page,
|
||||||
|
total: total,
|
||||||
|
rows: rows
|
||||||
|
};
|
||||||
|
return pdata;
|
||||||
|
},
|
||||||
|
onSubmit: function() {
|
||||||
|
var p = this;
|
||||||
|
var g = $(".yresult");
|
||||||
|
|
||||||
|
$('.pPageStat',this.pDiv).html(p.procmsg);
|
||||||
|
$('.pReload',this.pDiv).addClass('loading');
|
||||||
|
if (g.bDiv) $(g.block).css({top:g.bDiv.offsetTop});
|
||||||
|
if (p.hideOnSubmit) $(this.gDiv).prepend(g.block); //$(t).hide();
|
||||||
|
if ($.browser.opera) $(t).css('visibility','hidden');
|
||||||
|
if (!p.newp) p.newp = 1;
|
||||||
|
if (p.page>p.pages) p.page = p.pages;
|
||||||
|
|
||||||
|
var offset = p.newp * p.rp -p.rp;
|
||||||
|
var param = [
|
||||||
|
{ name : 'startRecord', value : offset }
|
||||||
|
,{ name : 'maximumRecords', value : p.rp }
|
||||||
|
,{ name : 'search', value : p.query}
|
||||||
|
];
|
||||||
|
|
||||||
|
if (p.params) {
|
||||||
|
for (var pi = 0; pi < p.params.length; pi++) param[param.length] = p.params[pi];
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
type: p.method,
|
||||||
|
url: p.url,
|
||||||
|
data: param,
|
||||||
|
dataType: p.dataType,
|
||||||
|
success: function(data){
|
||||||
|
/* yacy limits itemsPerPage for unauthenticated users */
|
||||||
|
p.rp = parseInt(data.channels[0].itemsPerPage);
|
||||||
|
g.flexAddData(data);
|
||||||
|
},
|
||||||
|
error: function(data) {
|
||||||
|
try { if (p.onError) p.onError(data); } catch (e) {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
function yaction(com, grid) {
|
||||||
|
if (com == 'Bookmark') {
|
||||||
|
confirm('Add ' + $('.trSelected',grid).length + ' search results to bookmark(s)?')
|
||||||
|
$('.trSelected',grid).each(function(){
|
||||||
|
var url = $(this).find('.url').text();
|
||||||
|
var title = $(this).find('.linktitle').text();
|
||||||
|
var desc = $(this).find('.desc').text();
|
||||||
|
var tags = $.query.get('query');
|
||||||
|
var path = "/searchResults";
|
||||||
|
var pub = "private";
|
||||||
|
var query = "&url="+url+"&title="+title+"&description="+desc+"&tags="+tags+"&path="+path+"&public="+pub+"&add=create";
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: "/xml/bookmarks/posts/add_p.xml?login="+query,
|
||||||
|
dataType: "xml",
|
||||||
|
success: function(xml) {
|
||||||
|
alert("Debug: posted bookmark for: "+url);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else if (com =='Open') {
|
||||||
|
$('.trSelected',grid).each(function(){
|
||||||
|
var url = $(this).find('.url').text();
|
||||||
|
window.open(url);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
alert("Test!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//]]>
|
||||||
|
</script>
|
||||||
|
<title>YaCy-UI Search</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<table class="yresult">
|
||||||
|
<tbody></tbody>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in new issue