# HG changeset patch # User wycc # Date 1232904964 -28800 # Node ID 01439f28d0bd4ed5204b3b0937c522a9e7a0ceac # Parent c39b24036a750061e84bce2cbb2a8592dd5898b7 Check-in primitive integrated madbuilder code. diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/README --- a/inkscape/firefox/README Fri Jan 23 23:15:04 2009 +0800 +++ b/inkscape/firefox/README Mon Jan 26 01:36:04 2009 +0800 @@ -15,3 +15,4 @@ # python testsoap.py PUBLISH + diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/empty.png Binary file inkscape/firefox/empty.png has changed diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/fill.png Binary file inkscape/firefox/fill.png has changed diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/jqSOAPClient.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/jqSOAPClient.js Mon Jan 26 01:36:04 2009 +0800 @@ -0,0 +1,159 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +//Singleton SOAP Client +var SOAPClient = { + Proxy: "", + SOAPServer: "", + ContentType: "text/xml", + CharSet: "utf-8", + ResponseXML: null, + ResponseText: "", + Status: 0, + ContentLength: 0, + Namespace: function(name, uri) { + return {"name":name, "uri":uri}; + }, + SendRequest: function(soapReq, callback) { + if(!!SOAPClient.Proxy) { + SOAPClient.ResponseText = ""; + SOAPClient.ResponseXML = null; + SOAPClient.Status = 0; + + var content = soapReq.toString(); + SOAPClient.ContentLength = content.length; + + function getResponse(xData) { + if(!!callback) { + SOAPClient.Status = xData.status; + SOAPClient.ResponseText = xData.responseText; + SOAPClient.ResponseXML = xData.responseXML; + var jsOut = $.xmlToJSON(xData.responseXML); + callback(jsOut); + } + } + $.ajax({ + type: "POST", + url: SOAPClient.Proxy, + dataType: "xml", + processData: false, + data: content, + complete: getResponse, + contentType: SOAPClient.ContentType + "; charset=\"" + SOAPClient.CharSet + "\"", + beforeSend: function(req) { + req.setRequestHeader("Method", "POST"); + req.setRequestHeader("Content-Length", SOAPClient.ContentLength); + req.setRequestHeader("SOAPServer", SOAPClient.SOAPServer); + req.setRequestHeader("SOAPAction", soapReq.Action); + } + }); + } + }, + ToXML: function(soapObj) { + var out = []; + var isNSObj=false; + try { + if(!!soapObj&&typeof(soapObj)==="object"&&soapObj.typeOf==="SOAPObject") { + //Namespaces + if(!!soapObj.ns) { + if(typeof(soapObj.ns)==="object") { + isNSObj=true; + out.push("<"+soapObj.ns.name+":"+soapObj.name); + out.push(" xmlns:"+soapObj.ns.name+"=\""+soapObj.ns.uri+"\""); + } else { + out.push("<"+soapObj.name); + out.push(" xmlns=\""+soapObj.ns+"\""); + } + } else { + out.push("<"+soapObj.name); + } + //Node Attributes + if(soapObj.attributes.length > 0) { + var cAttr; + var aLen=soapObj.attributes.length-1; + do { + cAttr=soapObj.attributes[aLen]; + if(isNSObj) { + out.push(" "+soapObj.ns.name+":"+cAttr.name+"=\""+cAttr.value+"\""); + } else { + out.push(" "+cAttr.name+"=\""+cAttr.value+"\""); + } + } while(aLen--); + } + out.push(">"); + //Node children + if(soapObj.hasChildren()) { + var cPos, cObj; + for(cPos in soapObj.children){ + cObj = soapObj.children[cPos]; + if(typeof(cObj)==="object"){out.push(SOAPClient.ToXML(cObj));} + } + } + //Node Value + if(!!soapObj.value){out.push(soapObj.value);} + //Close Tag + if(isNSObj){out.push("");} + else {out.push("");} + return out.join(""); + } + } catch(e){alert("Unable to process SOAPObject! Object must be an instance of SOAPObject");} + } +}; +//Soap request - this is what being sent using SOAPClient.SendRequest +var SOAPRequest=function(action, soapObj) { + this.Action=action; + var nss=[]; + var headers=[]; + var bodies=(!!soapObj)?[soapObj]:[]; + this.addNamespace=function(ns, uri){nss.push(new SOAPClient.Namespace(ns, uri));}; + this.addHeader=function(soapObj){headers.push(soapObj);}; + this.addBody=function(soapObj){bodies.push(soapObj);}; + this.toString=function() { + var soapEnv = new SOAPObject("soapenv:Envelope"); + soapEnv.attr("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/"); + //Add Namespace(s) + if(nss.length>0){ + var tNs, tNo; + for(tNs in nss){if(!nss.hasOwnProperty || nss.hasOwnProperty(tNs)){tNo=nss[tNs];if(typeof(tNo)==="object"){soapEnv.attr("xmlns:"+tNo.name, tNo.uri);}}} + } + //Add Header(s) + if(headers.length>0) { + var soapHeader = soapEnv.appendChild(new SOAPObject("soapenv:Header")); + var tHdr; + for(tHdr in headers){if(!headers.hasOwnProperty || headers.hasOwnProperty(tHdr)){soapHeader.appendChild(headers[tHdr]);}} + } + //Add Body(s) + if(bodies.length>0) { + var soapBody = soapEnv.appendChild(new SOAPObject("soapenv:Body")); + var tBdy; + for(tBdy in bodies){if(!bodies.hasOwnProperty || bodies.hasOwnProperty(tBdy)){soapBody.appendChild(bodies[tBdy]);}} + } + return soapEnv.toString(); + }; +}; + +//Soap Object - Used to build body envelope and other structures +var SOAPObject = function(name) { + this.typeOf="SOAPObject"; + this.ns=null; + this.name=name; + this.attributes=[]; + this.children=[]; + this.value=null; + this.attr=function(name, value){this.attributes.push({"name":name, "value":value});return this;}; + this.appendChild=function(obj){this.children.push(obj);return obj;}; + this.hasChildren=function(){return (this.children.length > 0)?true:false;}; + this.val=function(v){if(!v){return this.value;}else{this.value=v;return this;}}; + this.toString=function(){return SOAPClient.ToXML(this);}; +}; \ No newline at end of file diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/jqSOAPClient.pack.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/jqSOAPClient.pack.js Mon Jan 26 01:36:04 2009 +0800 @@ -0,0 +1,15 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +var SOAPClient={Proxy:"",SOAPServer:"",ContentType:"text/xml",CharSet:"utf-8",ResponseXML:null,ResponseText:"",Status:0,ContentLength:0,Namespace:function(a,b){return{"name":a,"uri":b}},SendRequest:function(c,d){if(!!SOAPClient.Proxy){SOAPClient.ResponseText="";SOAPClient.ResponseXML=null;SOAPClient.Status=0;var e=c.toString();SOAPClient.ContentLength=e.length;function getResponse(a){if(!!d){SOAPClient.Status=a.status;SOAPClient.ResponseText=a.responseText;SOAPClient.ResponseXML=a.responseXML;var b=$.xmlToJSON(a.responseXML);d(b)}}$.ajax({type:"POST",url:SOAPClient.Proxy,dataType:"xml",processData:false,data:e,complete:getResponse,contentType:SOAPClient.ContentType+"; charset=\""+SOAPClient.CharSet+"\"",beforeSend:function(a){a.setRequestHeader("Method","POST");a.setRequestHeader("Content-Length",SOAPClient.ContentLength);a.setRequestHeader("SOAPServer",SOAPClient.SOAPServer);a.setRequestHeader("SOAPAction",c.Action)}})}},ToXML:function(a){var b=[];var c=false;try{if(!!a&&typeof(a)==="object"&&a.typeOf==="SOAPObject"){if(!!a.ns){if(typeof(a.ns)==="object"){c=true;b.push("<"+a.ns.name+":"+a.name);b.push(" xmlns:"+a.ns.name+"=\""+a.ns.uri+"\"")}else{b.push("<"+a.name);b.push(" xmlns=\""+a.ns+"\"")}}else{b.push("<"+a.name)}if(a.attributes.length>0){var d;var f=a.attributes.length-1;do{d=a.attributes[f];if(c){b.push(" "+a.ns.name+":"+d.name+"=\""+d.value+"\"")}else{b.push(" "+d.name+"=\""+d.value+"\"")}}while(f--)}b.push(">");if(a.hasChildren()){var g,cObj;for(g in a.children){cObj=a.children[g];if(typeof(cObj)==="object"){b.push(SOAPClient.ToXML(cObj))}}}if(!!a.value){b.push(a.value)}if(c){b.push("")}else{b.push("")}return b.join("")}}catch(e){alert("Unable to process SOAPObject! Object must be an instance of SOAPObject")}}};var SOAPRequest=function(g,h){this.Action=g;var i=[];var j=[];var k=(!!h)?[h]:[];this.addNamespace=function(a,b){i.push(new SOAPClient.Namespace(a,b))};this.addHeader=function(a){j.push(a)};this.addBody=function(a){k.push(a)};this.toString=function(){var a=new SOAPObject("soapenv:Envelope");a.attr("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/");if(i.length>0){var b,tNo;for(b in i){if(!i.hasOwnProperty||i.hasOwnProperty(b)){tNo=i[b];if(typeof(tNo)==="object"){a.attr("xmlns:"+tNo.name,tNo.uri)}}}}if(j.length>0){var c=a.appendChild(new SOAPObject("soapenv:Header"));var d;for(d in j){if(!j.hasOwnProperty||j.hasOwnProperty(d)){c.appendChild(j[d])}}}if(k.length>0){var e=a.appendChild(new SOAPObject("soapenv:Body"));var f;for(f in k){if(!k.hasOwnProperty||k.hasOwnProperty(f)){e.appendChild(k[f])}}}return a.toString()}};var SOAPObject=function(c){this.typeOf="SOAPObject";this.ns=null;this.name=c;this.attributes=[];this.children=[];this.value=null;this.attr=function(a,b){this.attributes.push({"name":a,"value":b});return this};this.appendChild=function(a){this.children.push(a);return a};this.hasChildren=function(){return(this.children.length>0)?true:false};this.val=function(v){if(!v){return this.value}else{this.value=v;return this}};this.toString=function(){return SOAPClient.ToXML(this)}}; \ No newline at end of file diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/jqXMLUtils.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/jqXMLUtils.js Mon Jan 26 01:36:04 2009 +0800 @@ -0,0 +1,250 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +(function($) { + //Converts XML DOM to JSON + $.extend ({ + xmlToJSON: function(xdoc) { + try { + if(!xdoc){ return null; } + var tmpObj = {}; + tmpObj.typeOf = "JSXBObject"; + var xroot = (xdoc.nodeType == 9)?xdoc.documentElement:xdoc; + tmpObj.RootName = xroot.nodeName || ""; + if(xdoc.nodeType == 3 || xdoc.nodeType == 4) { + return xdoc.nodeValue; + } + var isNumeric = function(s) { + var testStr = ""; + if(s && typeof s == "string") { testStr = s; } + var pattern = /^((-)?([0-9]*)((\.{0,1})([0-9]+))?$)/; + return pattern.test(testStr); + }; + //Alters attribute and collection names to comply with JS + function formatName(name) { + var regEx = /-/g; + var tName = String(name).replace(regEx,"_"); + return tName; + } + //Set Attributes of an object + function setAttributes(obj, node) { + if(node.attributes.length > 0) { + var a = node.attributes.length-1; + var attName; + obj._attributes = []; + do { //Order is irrelevant (speed-up) + attName = String(formatName(node.attributes[a].name)); + obj._attributes.push(attName); + obj[attName] = $.trim(node.attributes[a].value); + } while(a--); + } + } + //Set collections + function setHelpers(grpObj) { + //Selects a node withing array where attribute = value + grpObj.getNodeByAttribute = function(attr, obj) { + if(this.length > 0) { + var cNode; + var maxLen = this.length -1; + try { + do { + cNode = this[maxLen]; + if(cNode[attr] == obj) { + return cNode; + } + } while(maxLen--); + } catch(e) {return false;} + return false; + } + }; + + grpObj.contains = function(attr, obj) { + if(this.length > 0) { + var maxLen = this.length -1; + try { + do { + if(this[maxLen][attr] == obj) { + return true; + } + } while(maxLen--); + } catch(e) {return false;} + return false; + } + }; + + grpObj.indexOf = function(attr, obj) { + var pos = -1; + if(this.length > 0) { + var maxLen = this.length -1; + try { + do { + if(this[maxLen][attr] == obj) { + pos = maxLen; + } + } while(maxLen--); + } catch(e) {return -1;} + return pos; + } + }; + + grpObj.SortByAttribute = function(col, dir) { + if(this.length) { + function getValue(pair, idx) { + var out = pair[idx]; + out = (isNumeric(out))?parseFloat(out):out; + return out; + } + function sortFn(a, b) { + var res = 0; + var tA, tB; + tA = getValue(a, col); + tB = getValue(b, col); + if(tA < tB) { res = -1; } else if(tB < tA) { res = 1; } + if(dir) { + res = (dir.toUpperCase() == "DESC")?(0 - res):res; + } + return res; + } + this.sort(sortFn); + } + }; + + grpObj.SortByValue = function(dir) { + if(this.length) { + function getValue(pair) { + var out = pair.Text; + out = (isNumeric(out))?parseFloat(out):out; + return out; + } + function sortFn(a, b) { + var res = 0; + var tA, tB; + tA = getValue(a); + tB = getValue(b); + if(tA < tB) { res = -1; } else if(tB < tA) { res = 1; } + if(dir) { + res = (dir.toUpperCase() == "DESC")?(0 - res):res; + } + return res; + } + this.sort(sortFn); + } + }; + grpObj.SortByNode = function(node, dir) { + if(this.length) { + function getValue(pair, node) { + var out = pair[node][0].Text; + out = (isNumeric(out))?parseFloat(out):out; + return out; + } + function sortFn(a, b) { + var res = 0; + var tA, tB; + tA = getValue(a, node); + tB = getValue(b, node); + if(tA < tB) { res = -1; } else if(tB < tA) { res = 1; } + if(dir) { + res = (dir.toUpperCase() == "DESC")?(0 - res):res; + } + return res; + } + this.sort(sortFn); + } + }; + } + //Recursive JSON Assembler + //Set Object Nodes + function setObjects(obj, node) { + var elemName; //Element name + var cnode; //Current Node + var tObj; //New subnode + var cName = ""; + if(!node) { return null; } + //Set node attributes if any + if(node.attributes.length > 0){setAttributes(obj, node);} + obj.Text = ""; + if(node.hasChildNodes()) { + var nodeCount = node.childNodes.length - 1; + var n = 0; + do { //Order is irrelevant (speed-up) + cnode = node.childNodes[n]; + switch(cnode.nodeType) { + case 1: //Node + //Process child nodes + obj._children = []; + //SOAP XML FIX to remove namespaces (i.e. soapenv:) + elemName = (cnode.localName)?cnode.localName:cnode.baseName; + elemName = formatName(elemName); + if(cName != elemName) { obj._children.push(elemName); } + //Create sub elemns array + if(!obj[elemName]) { + obj[elemName] = []; //Create Collection + } + tObj = {}; + obj[elemName].push(tObj); + if(cnode.attributes.length > 0) { + setAttributes(tObj, cnode); + } + //Set Helper functions (contains, indexOf, sort, etc); + if(!obj[elemName].contains) { + setHelpers(obj[elemName]); + } + cName = elemName; + if(cnode.hasChildNodes()) { + setObjects(tObj, cnode); //Recursive Call + } + break; + case 3: //Text Value + obj.Text += $.trim(cnode.nodeValue); + break; + case 4: //CDATA + obj.Text += (cnode.text)?$.trim(cnode.text):$.trim(cnode.nodeValue); + break; + } + } while(n++ < nodeCount); + } + } + //RUN + setObjects(tmpObj, xroot); + //Clean-up memmory + xdoc = null; + xroot = null; + return tmpObj; + + } catch(e) { + return null; + } + } + }); + + //Converts Text to XML DOM + $.extend({ + textToXML: function(strXML) { + var xmlDoc = null; + try { + xmlDoc = ($.browser.msie)?new ActiveXObject("Microsoft.XMLDOM"):new DOMParser(); + xmlDoc.async = false; + } catch(e) {throw new Error("XML Parser could not be instantiated");} + var out; + try { + if($.browser.msie) { + out = (xmlDoc.loadXML(strXML))?xmlDoc:false; + } else { + out = xmlDoc.parseFromString(strXML, "text/xml"); + } + } catch(e) { throw new Error("Error parsing XML string"); } + return out; + } + }); +})(jQuery); \ No newline at end of file diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/jquery-1.3.1.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/jquery-1.3.1.js Mon Jan 26 01:36:04 2009 +0800 @@ -0,0 +1,4241 @@ +/*! + * jQuery JavaScript Library v1.3.1 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-01-21 20:42:16 -0500 (Wed, 21 Jan 2009) + * Revision: 6158 + */ +(function(){ + +var + // Will speed up references to window, and allows munging its name. + window = this, + // Will speed up references to undefined, and allows munging its name. + undefined, + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + // Map over the $ in case of overwrite + _$ = window.$, + + jQuery = window.jQuery = window.$ = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); + }, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + this.context = selector; + return this; + } + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem && elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + var ret = jQuery( elem || [] ); + ret.context = document; + ret.selector = selector; + return ret; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document ).ready( selector ); + + // Make sure that old selector state is passed along + if ( selector.selector && selector.context ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return this.setArray(jQuery.makeArray(selector)); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.3.1", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num === undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) + ret.selector = this.selector + (this.selector ? " " : "") + selector; + else if ( name ) + ret.selector = this.selector + "." + name + "(" + selector + ")"; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( typeof name === "string" ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text !== "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).clone(); + + if ( this[0].parentNode ) + wrap.insertBefore( this[0] ); + + wrap.map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + // For internal use only. + // Behaves like an Array's .push method, not like a jQuery method. + push: [].push, + + find: function( selector ) { + if ( this.length === 1 && !/,/.test(selector) ) { + var ret = this.pushStack( [], "find", selector ); + ret.length = 0; + jQuery.find( selector, this[0], ret ); + return ret; + } else { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) ? + jQuery.unique( elems ) : + elems, "find", selector ); + } + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var clone = this.cloneNode(true), + container = document.createElement("div"); + container.appendChild(clone); + return jQuery.clean([container.innerHTML])[0]; + } else + return this.cloneNode(true); + }); + + // Need to set the expando to null on the cloned set if it exists + // removeData doesn't work here, IE removes it from the original as well + // this is primarily for IE but the data expando shouldn't be copied over in any browser + var clone = ret.find("*").andSelf().each(function(){ + if ( this[ expando ] !== undefined ) + this[ expando ] = null; + }); + + // Copy the events from the original to the clone + if ( events === true ) + this.find("*").andSelf().each(function(i){ + if (this.nodeType == 3) + return; + var events = jQuery.data( this, "events" ); + + for ( var type in events ) + for ( var handler in events[ type ] ) + jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); + }); + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ + return elem.nodeType === 1; + }) ), "filter", selector ); + }, + + closest: function( selector ) { + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null; + + return this.map(function(){ + var cur = this; + while ( cur && cur.ownerDocument ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) + return cur; + cur = cur.parentNode; + } + }); + }, + + not: function( selector ) { + if ( typeof selector === "string" ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector === "string" ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return !!selector && this.is( "." + selector ); + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if( jQuery.nodeName( elem, 'option' ) ) + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if ( typeof value === "number" ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value === undefined ? + (this[0] ? + this[0].innerHTML : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, +i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ), + "slice", Array.prototype.slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + domManip: function( args, table, callback ) { + if ( this[0] ) { + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), + first = fragment.firstChild, + extra = this.length > 1 ? fragment.cloneNode(true) : fragment; + + if ( first ) + for ( var i = 0, l = this.length; i < l; i++ ) + callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment ); + + if ( scripts ) + jQuery.each( scripts, evalScript ); + } + + return this; + + function root( elem, cur ) { + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +// exclude the following css properties to add px +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}, + toString = Object.prototype.toString; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + data = jQuery.trim( data ); + + if ( data ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.support.scriptEval ) + script.appendChild( document.createTextNode( data ) ); + else + script.text = data; + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length === undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length === undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames !== undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + var padding = 0, border = 0; + jQuery.each( which, function() { + padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + val -= Math.round(padding + border); + } + + if ( jQuery(elem).is(":visible") ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, val); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // We need to handle opacity special in IE + if ( name == "opacity" && !jQuery.support.opacity ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle ) + ret = computedStyle.getPropertyValue( name ); + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context, fragment ) { + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); + if ( match ) + return [ context.createElement( match[1] ) ]; + } + + var ret = [], scripts = [], div = context.createElement("div"); + + jQuery.each(elems, function(i, elem){ + if ( typeof elem === "number" ) + elem += ''; + + if ( !elem ) + return; + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = jQuery.trim( elem ).toLowerCase(); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "", "
" ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and + + + + +
+
+ +
+
+ + + diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/scene.mbsvg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inkscape/firefox/scene.mbsvg Mon Jan 26 01:36:04 2009 +0800 @@ -0,0 +1,105 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/scene.svg --- a/inkscape/firefox/scene.svg Fri Jan 23 23:15:04 2009 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff -r c39b24036a75 -r 01439f28d0bd inkscape/firefox/start.png Binary file inkscape/firefox/start.png has changed