picfinity-commit Mailing List for Picfinity
Status: Beta
Brought to you by:
espadav8
You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(15) |
Aug
(44) |
Sep
(12) |
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <esp...@us...> - 2008-03-13 14:57:44
|
Revision: 72 http://picfinity.svn.sourceforge.net/picfinity/?rev=72&view=rev Author: espadav8 Date: 2008-03-13 07:56:20 -0700 (Thu, 13 Mar 2008) Log Message: ----------- Check if the firstChild is null before trying to get it's value (if it is null, use an empty string) If the email/web address are empty don't set the attributes Modified Paths: -------------- trunk/.themes/db/db.js Modified: trunk/.themes/db/db.js =================================================================== --- trunk/.themes/db/db.js 2007-09-11 12:24:58 UTC (rev 71) +++ trunk/.themes/db/db.js 2008-03-13 14:56:20 UTC (rev 72) @@ -815,18 +815,18 @@ for (var j = 0; j < currentComment.childNodes.length; j++) { var currentNodeName = currentComment.childNodes[j].nodeName; - var currentNodeValue = currentComment.childNodes[j].firstChild.nodeValue; + var currentNodeValue = ( currentComment.childNodes[j].firstChild != null ) ? currentComment.childNodes[j].firstChild.nodeValue : ''; if (currentNodeName == "name") { commentOwnerAnchor.appendChild(document.createTextNode(currentNodeValue)); } - else if (currentNodeName == "www") + else if ( (currentNodeName == "www") && ( currentNodeValue != '') ) { commentOwnerWebAnchor.appendChild(document.createTextNode(currentNodeValue)); commentOwnerWebAnchor.setAttribute("href", "http://" + currentNodeValue); } - else if (currentNodeName == "email") + else if ( (currentNodeName == "email") && ( currentNodeValue != '') ) { commentOwnerAnchor.setAttribute("href", "mailto:" + currentNodeValue); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-11 12:24:56
|
Revision: 71 http://picfinity.svn.sourceforge.net/picfinity/?rev=71&view=rev Author: espadav8 Date: 2007-09-11 05:24:58 -0700 (Tue, 11 Sep 2007) Log Message: ----------- Update to jQuery 1.2 Modified Paths: -------------- trunk/.themes/clean/clean.xsl Added Paths: ----------- trunk/.themes/clean/jquery-1.2.js Modified: trunk/.themes/clean/clean.xsl =================================================================== --- trunk/.themes/clean/clean.xsl 2007-09-11 11:49:39 UTC (rev 70) +++ trunk/.themes/clean/clean.xsl 2007-09-11 12:24:58 UTC (rev 71) @@ -21,7 +21,7 @@ <xsl:attribute name="href"><xsl:value-of select="concat('.themes/', $themename, '/', $themename, '.css')" /></xsl:attribute> </link> <script type="text/javascript"> - <xsl:attribute name="src"><xsl:value-of select="concat('.themes/', $themename, '/jquery-1.1.4.js')" /></xsl:attribute> + <xsl:attribute name="src"><xsl:value-of select="concat('.themes/', $themename, '/jquery-1.2.js')" /></xsl:attribute> </script> <script type="text/javascript"> <xsl:attribute name="src"><xsl:value-of select="concat('.themes/', $themename, '/jquery.flydom-3.0.8.js')" /></xsl:attribute> Added: trunk/.themes/clean/jquery-1.2.js =================================================================== --- trunk/.themes/clean/jquery-1.2.js (rev 0) +++ trunk/.themes/clean/jquery-1.2.js 2007-09-11 12:24:58 UTC (rev 71) @@ -0,0 +1,2965 @@ +(function(){ +/* + * jQuery 1.2 - New Wave Javascript + * + * Copyright (c) 2007 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2007-09-10 15:45:49 -0400 (Mon, 10 Sep 2007) $ + * $Rev: 3219 $ + */ + +// Map over jQuery in case of overwrite +if ( typeof jQuery != "undefined" ) + var _jQuery = jQuery; + +var jQuery = window.jQuery = function(a,c) { + // If the context is global, return a new object + if ( window == this || !this.init ) + return new jQuery(a,c); + + return this.init(a,c); +}; + +// Map over the $ in case of overwrite +if ( typeof $ != "undefined" ) + var _$ = $; + +// Map the jQuery namespace to the '$' one +window.$ = jQuery; + +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/; + +jQuery.fn = jQuery.prototype = { + init: function(a,c) { + // Make sure that a selection was provided + a = a || document; + + // Handle HTML strings + if ( typeof a == "string" ) { + var m = quickExpr.exec(a); + if ( m && (m[1] || !c) ) { + // HANDLE: $(html) -> $(array) + if ( m[1] ) + a = jQuery.clean( [ m[1] ], c ); + + // HANDLE: $("#id") + else { + var tmp = document.getElementById( m[3] ); + if ( tmp ) + // Handle the case where IE and Opera return items + // by name instead of ID + if ( tmp.id != m[3] ) + return jQuery().find( a ); + else { + this[0] = tmp; + this.length = 1; + return this; + } + else + a = []; + } + + // HANDLE: $(expr) + } else + return new jQuery( c ).find( a ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction(a) ) + return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a ); + + return this.setArray( + // HANDLE: $(array) + a.constructor == Array && a || + + // HANDLE: $(arraylike) + // Watch for when an array-like object is passed as the selector + (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) || + + // HANDLE: $(*) + [ a ] ); + }, + + jquery: "1.2", + + size: function() { + return this.length; + }, + + length: 0, + + get: function( num ) { + return num == undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[num]; + }, + + pushStack: function( a ) { + var ret = jQuery(a); + ret.prevObject = this; + return ret; + }, + + setArray: function( a ) { + this.length = 0; + Array.prototype.push.apply( this, a ); + return this; + }, + + each: function( fn, args ) { + return jQuery.each( this, fn, args ); + }, + + index: function( obj ) { + var pos = -1; + this.each(function(i){ + if ( this == obj ) pos = i; + }); + return pos; + }, + + attr: function( key, value, type ) { + var obj = key; + + // Look for the case where we're accessing a style value + if ( key.constructor == String ) + if ( value == undefined ) + return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined; + else { + obj = {}; + obj[ key ] = value; + } + + // Check to see if we're setting style values + return this.each(function(index){ + // Set all the styles + for ( var prop in obj ) + jQuery.attr( + type ? this.style : this, + prop, jQuery.prop(this, obj[prop], type, index, prop) + ); + }); + }, + + css: function( key, value ) { + return this.attr( key, value, "curCSS" ); + }, + + text: function(e) { + if ( typeof e != "object" && e != null ) + return this.empty().append( document.createTextNode( e ) ); + + var t = ""; + jQuery.each( e || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + t += this.nodeType != 1 ? + this.nodeValue : jQuery.fn.text([ this ]); + }); + }); + return t; + }, + + wrapAll: function(html) { + if ( this[0] ) + // The elements to wrap the target around + jQuery(html, this[0].ownerDocument) + .clone() + .insertBefore(this[0]) + .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, 1, function(a){ + this.appendChild( a ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, -1, function(a){ + this.insertBefore( a, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, 1, function(a){ + this.parentNode.insertBefore( a, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, -1, function(a){ + this.parentNode.insertBefore( a, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery([]); + }, + + find: function(t) { + var data = jQuery.map(this, function(a){ return jQuery.find(t,a); }); + return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ? + jQuery.unique( data ) : data ); + }, + + clone: function(events) { + // Do the clone + var ret = this.map(function(){ + return this.outerHTML ? jQuery(this.outerHTML)[0] : this.cloneNode(true); + }); + + if (events === true) { + var clone = ret.find("*").andSelf(); + + this.find("*").andSelf().each(function(i) { + 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(t) { + return this.pushStack( + jQuery.isFunction( t ) && + jQuery.grep(this, function(el, index){ + return t.apply(el, [index]); + }) || + + jQuery.multiFilter(t,this) ); + }, + + not: function(t) { + return this.pushStack( + t.constructor == String && + jQuery.multiFilter(t, this, true) || + + jQuery.grep(this, function(a) { + return ( t.constructor == Array || t.jquery ) + ? jQuery.inArray( a, t ) < 0 + : a != t; + }) + ); + }, + + add: function(t) { + return this.pushStack( jQuery.merge( + this.get(), + t.constructor == String ? + jQuery(t).get() : + t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ? + t : [t] ) + ); + }, + + is: function(expr) { + return expr ? jQuery.multiFilter(expr,this).length > 0 : false; + }, + + hasClass: function(expr) { + return this.is("." + expr); + }, + + val: function( val ) { + if ( val == undefined ) { + if ( this.length ) { + var elem = this[0]; + + // We need to handle select boxes special + if ( jQuery.nodeName(elem, "select") ) { + var index = elem.selectedIndex, + a = [], + 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 + var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value; + + // We don't need an array for one selects + if ( one ) + return val; + + // Multi-Selects return an array + a.push(val); + } + } + + return a; + + // Everything else, we just grab the value + } else + return this[0].value.replace(/\r/g, ""); + } + } else + return this.each(function(){ + if ( val.constructor == Array && /radio|checkbox/.test(this.type) ) + this.checked = (jQuery.inArray(this.value, val) >= 0 || + jQuery.inArray(this.name, val) >= 0); + else if ( jQuery.nodeName(this, "select") ) { + var tmp = val.constructor == Array ? val : [val]; + + jQuery("option", this).each(function(){ + this.selected = (jQuery.inArray(this.value, tmp) >= 0 || + jQuery.inArray(this.text, tmp) >= 0); + }); + + if ( !tmp.length ) + this.selectedIndex = -1; + } else + this.value = val; + }); + }, + + html: function( val ) { + return val == undefined ? + ( this.length ? this[0].innerHTML : null ) : + this.empty().append( val ); + }, + + replaceWith: function( val ) { + return this.after( val ).remove(); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); + }, + + map: function(fn) { + return this.pushStack(jQuery.map( this, function(elem,i){ + return fn.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + domManip: function(args, table, dir, fn) { + var clone = this.length > 1, a; + + return this.each(function(){ + if ( !a ) { + a = jQuery.clean(args, this.ownerDocument); + if ( dir < 0 ) + a.reverse(); + } + + var obj = this; + + if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") ) + obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody")); + + jQuery.each( a, function(){ + if ( jQuery.nodeName(this, "script") ) { + if ( this.src ) + jQuery.ajax({ url: this.src, async: false, dataType: "script" }); + else + jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" ); + } else + fn.apply( obj, [ clone ? this.cloneNode(true) : this ] ); + }); + }); + } +}; + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false; + + // Handle a deep copy situation + if ( target.constructor == Boolean ) { + deep = target; + target = arguments[1] || {}; + } + + // extend jQuery itself if only one argument is passed + if ( al == 1 ) { + target = this; + a = 0; + } + + var prop; + + for ( ; a < al; a++ ) + // Only deal with non-null/undefined values + if ( (prop = arguments[a]) != null ) + // Extend the base object + for ( var i in prop ) { + // Prevent never-ending loop + if ( target == prop[i] ) + continue; + + // Recurse if we're merging object values + if ( deep && typeof prop[i] == 'object' && target[i] ) + jQuery.extend( target[i], prop[i] ); + + // Don't bring in undefined values + else if ( prop[i] != undefined ) + target[i] = prop[i]; + } + + // Return the modified object + return target; +}; + +var expando = "jQuery" + (new Date()).getTime(), uuid = 0, win = {}; + +jQuery.extend({ + noConflict: function(deep) { + window.$ = _$; + if ( deep ) + window.jQuery = _jQuery; + return jQuery; + }, + + // This may seem like some crazy code, but trust me when I say that this + // is the only cross-browser way to do this. --John + isFunction: function( fn ) { + return !!fn && typeof fn != "string" && !fn.nodeName && + fn.constructor != Array && /function/i.test( fn + "" ); + }, + + // check if an element is in a XML document + isXMLDoc: function(elem) { + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + }, + + // Evalulates a script in a global context + // Evaluates Async. in Safari 2 :-( + globalEval: function( data ) { + data = jQuery.trim( data ); + if ( data ) { + if ( window.execScript ) + window.execScript( data ); + else if ( jQuery.browser.safari ) + // safari doesn't provide a synchronous global eval + window.setTimeout( data, 0 ); + else + eval.call( window, data ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + cache: {}, + + data: function( elem, name, data ) { + elem = elem == window ? win : elem; + + var id = elem[ expando ]; + + // Compute a unique ID for the element + if ( !id ) + id = elem[ expando ] = ++uuid; + + // Only generate the data cache if we're + // trying to access or manipulate it + if ( name && !jQuery.cache[ id ] ) + jQuery.cache[ id ] = {}; + + // Prevent overriding the named cache with undefined values + if ( data != undefined ) + jQuery.cache[ id ][ name ] = data; + + // Return the named cache data, or the ID for the element + return name ? jQuery.cache[ id ][ name ] : id; + }, + + removeData: function( elem, name ) { + elem = elem == window ? win : elem; + + var id = elem[ expando ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( jQuery.cache[ id ] ) { + // Remove the section of cache data + delete jQuery.cache[ id ][ name ]; + + // If we've removed all the data, remove the element's cache + name = ""; + for ( name in jQuery.cache[ id ] ) break; + if ( !name ) + jQuery.removeData( elem ); + } + + // Otherwise, we want to remove all of the element's data + } else { + // Clean up the element expando + try { + delete elem[ expando ]; + } catch(e){ + // IE has trouble directly removing the expando + // but it's ok with using removeAttribute + if ( elem.removeAttribute ) + elem.removeAttribute( expando ); + } + + // Completely remove the data cache + delete jQuery.cache[ id ]; + } + }, + + // args is for internal usage only + each: function( obj, fn, args ) { + if ( args ) { + if ( obj.length == undefined ) + for ( var i in obj ) + fn.apply( obj[i], args ); + else + for ( var i = 0, ol = obj.length; i < ol; i++ ) + if ( fn.apply( obj[i], args ) === false ) break; + + // A special, fast, case for the most common use of each + } else { + if ( obj.length == undefined ) + for ( var i in obj ) + fn.call( obj[i], i, obj[i] ); + else + for ( var i = 0, ol = obj.length, val = obj[0]; + i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){} + } + + return obj; + }, + + prop: function(elem, value, type, index, prop){ + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, [index] ); + + // exclude the following css properties to add px + var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i; + + // Handle passing in a number to a CSS property + return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, c ){ + jQuery.each( (c || "").split(/\s+/), function(i, cur){ + if ( !jQuery.className.has( elem.className, cur ) ) + elem.className += ( elem.className ? " " : "" ) + cur; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, c ){ + elem.className = c != undefined ? + jQuery.grep( elem.className.split(/\s+/), function(cur){ + return !jQuery.className.has( c, cur ); + }).join(" ") : ""; + }, + + // internal only, use is(".class") + has: function( t, c ) { + return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1; + } + }, + + swap: function(e,o,f) { + for ( var i in o ) { + e.style["old"+i] = e.style[i]; + e.style[i] = o[i]; + } + f.apply( e, [] ); + for ( var i in o ) + e.style[i] = e.style["old"+i]; + }, + + css: function(e,p) { + if ( p == "height" || p == "width" ) { + var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"]; + + jQuery.each( d, function(){ + old["padding" + this] = 0; + old["border" + this + "Width"] = 0; + }); + + jQuery.swap( e, old, function() { + if ( jQuery(e).is(':visible') ) { + oHeight = e.offsetHeight; + oWidth = e.offsetWidth; + } else { + e = jQuery(e.cloneNode(true)) + .find(":radio").removeAttr("checked").end() + .css({ + visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0" + }).appendTo(e.parentNode)[0]; + + var parPos = jQuery.css(e.parentNode,"position") || "static"; + if ( parPos == "static" ) + e.parentNode.style.position = "relative"; + + oHeight = e.clientHeight; + oWidth = e.clientWidth; + + if ( parPos == "static" ) + e.parentNode.style.position = "static"; + + e.parentNode.removeChild(e); + } + }); + + return p == "height" ? oHeight : oWidth; + } + + return jQuery.curCSS( e, p ); + }, + + curCSS: function(elem, prop, force) { + var ret, stack = [], swap = []; + + // A helper method for determining if an element's values are broken + function color(a){ + if ( !jQuery.browser.safari ) + return false; + + var ret = document.defaultView.getComputedStyle(a,null); + return !ret || ret.getPropertyValue("color") == ""; + } + + if (prop == "opacity" && jQuery.browser.msie) { + ret = jQuery.attr(elem.style, "opacity"); + return ret == "" ? "1" : ret; + } + + if (prop.match(/float/i)) + prop = styleFloat; + + if (!force && elem.style[prop]) + ret = elem.style[prop]; + + else if (document.defaultView && document.defaultView.getComputedStyle) { + + if (prop.match(/float/i)) + prop = "float"; + + prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase(); + var cur = document.defaultView.getComputedStyle(elem, null); + + if ( cur && !color(elem) ) + ret = cur.getPropertyValue(prop); + + // If the element isn't reporting its values properly in Safari + // then some display: none elements are involved + else { + // Locate all of the parent display: none elements + for ( var a = elem; a && color(a); a = a.parentNode ) + stack.unshift(a); + + // Go through and make them visible, but in reverse + // (It would be better if we knew the exact display type that they had) + for ( a = 0; a < stack.length; a++ ) + if ( color(stack[a]) ) { + swap[a] = stack[a].style.display; + stack[a].style.display = "block"; + } + + // Since we flip the display style, we have to handle that + // one special, otherwise get the value + ret = prop == "display" && swap[stack.length-1] != null ? + "none" : + document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || ""; + + // Finally, revert the display styles back + for ( a = 0; a < swap.length; a++ ) + if ( swap[a] != null ) + stack[a].style.display = swap[a]; + } + + if ( prop == "opacity" && ret == "" ) + ret = "1"; + + } else if (elem.currentStyle) { + var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();}); + ret = elem.currentStyle[prop] || elem.currentStyle[newProp]; + + // 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) ) { + var style = elem.style.left; + var runtimeStyle = elem.runtimeStyle.left; + elem.runtimeStyle.left = elem.currentStyle.left; + elem.style.left = ret || 0; + ret = elem.style.pixelLeft + "px"; + elem.style.left = style; + elem.runtimeStyle.left = runtimeStyle; + } + } + + return ret; + }, + + clean: function(a, doc) { + var r = []; + doc = doc || document; + + jQuery.each( a, function(i,arg){ + if ( !arg ) return; + + if ( arg.constructor == Number ) + arg = arg.toString(); + + // Convert html string into DOM nodes + if ( typeof arg == "string" ) { + // Fix "XHTML"-style tags in all browsers + arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+"></"+tag+">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = []; + + var wrap = + // option or optgroup + !s.indexOf("<opt") && + [1, "<select>", "</select>"] || + + !s.indexOf("<leg") && + [1, "<fieldset>", "</fieldset>"] || + + s.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [1, "<table>", "</table>"] || + + !s.indexOf("<tr") && + [2, "<table><tbody>", "</tbody></table>"] || + + // <thead> matched above + (!s.indexOf("<td") || !s.indexOf("<th")) && + [3, "<table><tbody><tr>", "</tr></tbody></table>"] || + + !s.indexOf("<col") && + [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] || + + // IE can't serialize <link> and <script> tags normally + jQuery.browser.msie && + [1, "div<div>", "</div>"] || + + [0,"",""]; + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + arg + wrap[2]; + + // Move to the right depth + while ( wrap[0]-- ) + div = div.lastChild; + + // Remove IE's autoinserted <tbody> from table fragments + if ( jQuery.browser.msie ) { + + // String was a <table>, *may* have spurious <tbody> + if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) + tb = div.firstChild && div.firstChild.childNodes; + + // String was a bare <thead> or <tfoot> + else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 ) + tb = div.childNodes; + + for ( var n = tb.length-1; n >= 0 ; --n ) + if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length ) + tb[n].parentNode.removeChild(tb[n]); + + // IE completely kills leading whitespace when innerHTML is used + if ( /^\s/.test(arg) ) + div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild ); + + } + + arg = jQuery.makeArray( div.childNodes ); + } + + if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) ) + return; + + if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options ) + r.push( arg ); + else + r = jQuery.merge( r, arg ); + + }); + + return r; + }, + + attr: function(elem, name, value){ + var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props; + + // Safari mis-reports the default selected property of a hidden option + // Accessing the parent's selectedIndex property fixes it + if ( name == "selected" && jQuery.browser.safari ) + elem.parentNode.selectedIndex; + + // Certain attributes only work when accessed via the old DOM 0 way + if ( fix[name] ) { + if ( value != undefined ) elem[fix[name]] = value; + return elem[fix[name]]; + } else if ( jQuery.browser.msie && name == "style" ) + return jQuery.attr( elem.style, "cssText", value ); + + else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") ) + return elem.getAttributeNode(name).nodeValue; + + // IE elem.getAttribute passes even for style + else if ( elem.tagName ) { + + if ( value != undefined ) { + if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode ) + throw "type property can't be changed"; + elem.setAttribute( name, value ); + } + + if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) + return elem.getAttribute( name, 2 ); + + return elem.getAttribute( name ); + + // elem is actually elem.style ... set the style + } else { + // IE actually uses filters for opacity + if ( name == "opacity" && jQuery.browser.msie ) { + if ( value != undefined ) { + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + elem.zoom = 1; + + // Set the alpha filter to set the opacity + elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") + + (parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); + } + + return elem.filter ? + (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : ""; + } + name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();}); + if ( value != undefined ) elem[name] = value; + return elem[name]; + } + }, + + trim: function(t){ + return (t||"").replace(/^\s+|\s+$/g, ""); + }, + + makeArray: function( a ) { + var r = []; + + // Need to use typeof to fight Safari childNodes crashes + if ( typeof a != "array" ) + for ( var i = 0, al = a.length; i < al; i++ ) + r.push( a[i] ); + else + r = a.slice( 0 ); + + return r; + }, + + inArray: function( b, a ) { + for ( var i = 0, al = a.length; i < al; i++ ) + if ( a[i] == b ) + return i; + return -1; + }, + + merge: function(first, second) { + // We have to loop this way because IE & Opera overwrite the length + // expando of getElementsByTagName + + // Also, we need to make sure that the correct elements are being returned + // (IE returns comment nodes in a '*' query) + if ( jQuery.browser.msie ) { + for ( var i = 0; second[i]; i++ ) + if ( second[i].nodeType != 8 ) + first.push(second[i]); + } else + for ( var i = 0; second[i]; i++ ) + first.push(second[i]); + + return first; + }, + + unique: function(first) { + var r = [], done = {}; + + try { + for ( var i = 0, fl = first.length; i < fl; i++ ) { + var id = jQuery.data(first[i]); + if ( !done[id] ) { + done[id] = true; + r.push(first[i]); + } + } + } catch(e) { + r = first; + } + + return r; + }, + + grep: function(elems, fn, inv) { + // If a string is passed in for the function, make a function + // for it (a handy shortcut) + if ( typeof fn == "string" ) + fn = eval("false||function(a,i){return " + fn + "}"); + + var result = []; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, el = elems.length; i < el; i++ ) + if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) ) + result.push( elems[i] ); + + return result; + }, + + map: function(elems, fn) { + // If a string is passed in for the function, make a function + // for it (a handy shortcut) + if ( typeof fn == "string" ) + fn = eval("false||function(a){return " + fn + "}"); + + var result = []; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, el = elems.length; i < el; i++ ) { + var val = fn(elems[i],i); + + if ( val !== null && val != undefined ) { + if ( val.constructor != Array ) val = [val]; + result = result.concat( val ); + } + } + + return result; + } +}); + +var userAgent = navigator.userAgent.toLowerCase(); + +// Figure out what browser is being used +jQuery.browser = { + version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1], + safari: /webkit/.test(userAgent), + opera: /opera/.test(userAgent), + msie: /msie/.test(userAgent) && !/opera/.test(userAgent), + mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent) +}; + +var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat"; + +jQuery.extend({ + // Check to see if the W3C box model is being used + boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat", + + styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat", + + props: { + "for": "htmlFor", + "class": "className", + "float": styleFloat, + cssFloat: styleFloat, + styleFloat: styleFloat, + innerHTML: "innerHTML", + className: "className", + value: "value", + disabled: "disabled", + checked: "checked", + readonly: "readOnly", + selected: "selected", + maxlength: "maxLength" + } +}); + +jQuery.each({ + parent: "a.parentNode", + parents: "jQuery.dir(a,'parentNode')", + next: "jQuery.nth(a,2,'nextSibling')", + prev: "jQuery.nth(a,2,'previousSibling')", + nextAll: "jQuery.dir(a,'nextSibling')", + prevAll: "jQuery.dir(a,'previousSibling')", + siblings: "jQuery.sibling(a.parentNode.firstChild,a)", + children: "jQuery.sibling(a.firstChild)", + contents: "jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)" +}, function(i,n){ + jQuery.fn[ i ] = function(a) { + var ret = jQuery.map(this,n); + if ( a && typeof a == "string" ) + ret = jQuery.multiFilter(a,ret); + return this.pushStack( jQuery.unique(ret) ); + }; +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function(i,n){ + jQuery.fn[ i ] = function(){ + var a = arguments; + return this.each(function(){ + for ( var j = 0, al = a.length; j < al; j++ ) + jQuery(a[j])[n]( this ); + }); + }; +}); + +jQuery.each( { + removeAttr: function( key ) { + jQuery.attr( this, key, "" ); + this.removeAttribute( key ); + }, + addClass: function(c){ + jQuery.className.add(this,c); + }, + removeClass: function(c){ + jQuery.className.remove(this,c); + }, + toggleClass: function( c ){ + jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c); + }, + remove: function(a){ + if ( !a || jQuery.filter( a, [this] ).r.length ) { + jQuery.removeData( this ); + this.parentNode.removeChild( this ); + } + }, + empty: function() { + // Clean up the cache + jQuery("*", this).each(function(){ jQuery.removeData(this); }); + + while ( this.firstChild ) + this.removeChild( this.firstChild ); + } +}, function(i,n){ + jQuery.fn[ i ] = function() { + return this.each( n, arguments ); + }; +}); + +jQuery.each( [ "Height", "Width" ], function(i,name){ + var n = name.toLowerCase(); + + jQuery.fn[ n ] = function(h) { + return this[0] == window ? + jQuery.browser.safari && self["inner" + name] || + jQuery.boxModel && Math.max(document.documentElement["client" + name], document.body["client" + name]) || + document.body["client" + name] : + + this[0] == document ? + Math.max( document.body["scroll" + name], document.body["offset" + name] ) : + + h == undefined ? + ( this.length ? jQuery.css( this[0], n ) : null ) : + this.css( n, h.constructor == String ? h : h + "px" ); + }; +}); + +var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? + "(?:[\\w*_-]|\\\\.)" : + "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)", + quickChild = new RegExp("^>\\s*(" + chars + "+)"), + quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"), + quickClass = new RegExp("^([#.]?)(" + chars + "*)"); + +jQuery.extend({ + expr: { + "": "m[2]=='*'||jQuery.nodeName(a,m[2])", + "#": "a.getAttribute('id')==m[2]", + ":": { + // Position Checks + lt: "i<m[3]-0", + gt: "i>m[3]-0", + nth: "m[3]-0==i", + eq: "m[3]-0==i", + first: "i==0", + last: "i==r.length-1", + even: "i%2==0", + odd: "i%2", + + // Child Checks + "first-child": "a.parentNode.getElementsByTagName('*')[0]==a", + "last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a", + "only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')", + + // Parent Checks + parent: "a.firstChild", + empty: "!a.firstChild", + + // Text Check + contains: "(a.textContent||a.innerText||'').indexOf(m[3])>=0", + + // Visibility + visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"', + hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"', + + // Form attributes + enabled: "!a.disabled", + disabled: "a.disabled", + checked: "a.checked", + selected: "a.selected||jQuery.attr(a,'selected')", + + // Form elements + text: "'text'==a.type", + radio: "'radio'==a.type", + checkbox: "'checkbox'==a.type", + file: "'file'==a.type", + password: "'password'==a.type", + submit: "'submit'==a.type", + image: "'image'==a.type", + reset: "'reset'==a.type", + button: '"button"==a.type||jQuery.nodeName(a,"button")', + input: "/input|select|textarea|button/i.test(a.nodeName)", + + // :has() + has: "jQuery.find(m[3],a).length", + + // :header + header: "/h\\d/i.test(a.nodeName)", + + // :animated + animated: "jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length" + } + }, + + // The regular expressions that power the parsing engine + parse: [ + // Match: [@value='test'], [@foo] + /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/, + + // Match: :contains('foo') + /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, + + // Match: :even, :last-chlid, #id, .class + new RegExp("^([:.#]*)(" + chars + "+)") + ], + + multiFilter: function( expr, elems, not ) { + var old, cur = []; + + while ( expr && expr != old ) { + old = expr; + var f = jQuery.filter( expr, elems, not ); + expr = f.t.replace(/^\s*,\s*/, "" ); + cur = not ? elems = f.r : jQuery.merge( cur, f.r ); + } + + return cur; + }, + + find: function( t, context ) { + // Quickly handle non-string expressions + if ( typeof t != "string" ) + return [ t ]; + + // Make sure that the context is a DOM Element + if ( context && !context.nodeType ) + context = null; + + // Set the correct context (if none is provided) + context = context || document; + + // Initialize the search + var ret = [context], done = [], last; + + // Continue while a selector expression exists, and while + // we're no longer looping upon ourselves + while ( t && last != t ) { + var r = []; + last = t; + + t = jQuery.trim(t); + + var foundToken = false; + + // An attempt at speeding up child selectors that + // point to a specific element tag + var re = quickChild; + var m = re.exec(t); + + if ( m ) { + var nodeName = m[1].toUpperCase(); + + // Perform our own iteration and filter + for ( var i = 0; ret[i]; i++ ) + for ( var c = ret[i].firstChild; c; c = c.nextSibling ) + if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) ) + r.push( c ); + + ret = r; + t = t.replace( re, "" ); + if ( t.indexOf(" ") == 0 ) continue; + foundToken = true; + } else { + re = /^([>+~])\s*(\w*)/i; + + if ( (m = re.exec(t)) != null ) { + r = []; + + var nodeName = m[2], merge = {}; + m = m[1]; + + for ( var j = 0, rl = ret.length; j < rl; j++ ) { + var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild; + for ( ; n; n = n.nextSibling ) + if ( n.nodeType == 1 ) { + var id = jQuery.data(n); + + if ( m == "~" && merge[id] ) break; + + if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) { + if ( m == "~" ) merge[id] = true; + r.push( n ); + } + + if ( m == "+" ) break; + } + } + + ret = r; + + // And remove the token + t = jQuery.trim( t.replace( re, "" ) ); + foundToken = true; + } + } + + // See if there's still an expression, and that we haven't already + // matched a token + if ( t && !foundToken ) { + // Handle multiple expressions + if ( !t.indexOf(",") ) { + // Clean the result set + if ( context == ret[0] ) ret.shift(); + + // Merge the result sets + done = jQuery.merge( done, ret ); + + // Reset the context + r = ret = [context]; + + // Touch up the selector string + t = " " + t.substr(1,t.length); + + } else { + // Optimize for the case nodeName#idName + var re2 = quickID; + var m = re2.exec(t); + + // Re-organize the results, so that they're consistent + if ( m ) { + m = [ 0, m[2], m[3], m[1] ]; + + } else { + // Otherwise, do a traditional filter check for + // ID, class, and element selectors + re2 = quickClass; + m = re2.exec(t); + } + + m[2] = m[2].replace(/\\/g, ""); + + var elem = ret[ret.length-1]; + + // Try to do a global search by ID, where we can + if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) { + // Optimization for HTML document case + var oid = elem.getElementById(m[2]); + + // Do a quick check for the existence of the actual ID attribute + // to avoid selecting by the name attribute in IE + // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form + if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] ) + oid = jQuery('[@id="'+m[2]+'"]', elem)[0]; + + // Do a quick check for node name (where applicable) so + // that div#foo searches will be really fast + ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; + } else { + // We need to find all descendant elements + for ( var i = 0; ret[i]; i++ ) { + // Grab the tag name being searched for + var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2]; + + // Handle IE7 being really dumb about <object>s + if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" ) + tag = "param"; + + r = jQuery.merge( r, ret[i].getElementsByTagName( tag )); + } + + // It's faster to filter by class and be done with it + if ( m[1] == "." ) + r = jQuery.classFilter( r, m[2] ); + + // Same with ID filtering + if ( m[1] == "#" ) { + var tmp = []; + + // Try to find the element with the ID + for ( var i = 0; r[i]; i++ ) + if ( r[i].getAttribute("id") == m[2] ) { + tmp = [ r[i] ]; + break; + } + + r = tmp; + } + + ret = r; + } + + t = t.replace( re2, "" ); + } + + } + + // If a selector string still exists + if ( t ) { + // Attempt to filter it + var val = jQuery.filter(t,r); + ret = r = val.r; + t = jQuery.trim(val.t); + } + } + + // An error occurred with the selector; + // just return an empty set instead + if ( t ) + ret = []; + + // Remove the root context + if ( ret && context == ret[0] ) + ret.shift(); + + // And combine the results + done = jQuery.merge( done, ret ); + + return done; + }, + + classFilter: function(r,m,not){ + m = " " + m + " "; + var tmp = []; + for ( var i = 0; r[i]; i++ ) { + var pass = (" " + r[i].className + " ").indexOf( m ) >= 0; + if ( !not && pass || not && !pass ) + tmp.push( r[i] ); + } + return tmp; + }, + + filter: function(t,r,not) { + var last; + + // Look for common filter expressions + while ( t && t != last ) { + last = t; + + var p = jQuery.parse, m; + + for ( var i = 0; p[i]; i++ ) { + m = p[i].exec( t ); + + if ( m ) { + // Remove what we just matched + t = t.substring( m[0].length ); + + m[2] = m[2].replace(/\\/g, ""); + break; + } + } + + if ( !m ) + break; + + // :not() is a special case that can be optimized by + // keeping it out of the expression list + if ( m[1] == ":" && m[2] == "not" ) + r = jQuery.filter(m[3], r, true).r; + + // We can get a big speed boost by filtering by class here + else if ( m[1] == "." ) + r = jQuery.classFilter(r, m[2], not); + + else if ( m[1] == "[" ) { + var tmp = [], type = m[3]; + + for ( var i = 0, rl = r.length; i < rl; i++ ) { + var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ]; + + if ( z == null || /href|src|selected/.test(m[2]) ) + z = jQuery.attr(a,m[2]) || ''; + + if ( (type == "" && !!z || + type == "=" && z == m[5] || + type == "!=" && z != m[5] || + type == "^=" && z && !z.indexOf(m[5]) || + type == "$=" && z.substr(z.length - m[5].length) == m[5] || + (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not ) + tmp.push( a ); + } + + r = tmp; + + // We can get a speed boost by handling nth-child here + } else if ( m[1] == ":" && m[2] == "nth-child" ) { + var merge = {}, tmp = [], + test = /(\d*)n\+?(\d*)/.exec( + m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" || + !/\D/.test(m[3]) && "n+" + m[3] || m[3]), + first = (test[1] || 1) - 0, last = test[2] - 0; + + for ( var i = 0, rl = r.length; i < rl; i++ ) { + var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode); + + if ( !merge[id] ) { + var c = 1; + + for ( var n = parentNode.firstChild; n; n = n.nextSibling ) + if ( n.nodeType == 1 ) + n.nodeIndex = c++; + + merge[id] = true; + } + + var add = false; + + if ( first == 1 ) { + if ( last == 0 || node.nodeIndex == last ) + add = true; + } else if ( (node.nodeIndex + last) % first == 0 ) + add = true; + + if ( add ^ not ) + tmp.push( node ); + } + + r = tmp; + + // Otherwise, find the expression to execute + } else { + var f = jQuery.expr[m[1]]; + if ( typeof f != "string" ) + f = jQuery.expr[m[1]][m[2]]; + + // Build a custom macro to enclose it + f = eval("false||function(a,i){return " + f + "}"); + + // Execute it against the current filter + r = jQuery.grep( r, f, not ); + } + } + + // Return an array of filtered elements (r) + // and the modified expression string (t) + return { r: r, t: t }; + }, + + dir: function( elem, dir ){ + var matched = []; + var cur = elem[dir]; + while ( cur && cur != document ) { + if ( cur.nodeType == 1 ) + matched.push( cur ); + cur = cur[dir]; + } + return matched; + }, + + nth: function(cur,result,dir,elem){ + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) + if ( cur.nodeType == 1 && ++num == result ) + break; + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType == 1 && (!elem || n != elem) ) + r.push( n ); + } + + return r; + } +}); +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code orignated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function(element, type, handler, data) { + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.browser.msie && element.setInterval != undefined ) + element = window; + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) + handler.guid = this.guid++; + + // if data is passed, bind to handler + if( data != undefined ) { + // Create temporary function pointer to original handler + var fn = handler; + + // Create unique handler function, wrapped around original handler + handler = function() { + // Pass arguments and context to original handler + return fn.apply(this, arguments); + }; + + // Store data in unique handler + handler.data = data; + + // Set the guid of unique handler to the same of original handler, so it can be removed + handler.guid = fn.guid; + } + + // Namespaced event handlers + var parts = type.split("."); + type = parts[0]; + handler.type = parts[1]; + + // Init the element's event structure + var events = jQuery.data(element, "events") || jQuery.data(element, "events", {}); + + var handle = jQuery.data(element, "handle", function(){ + // returned undefined or false + var val; + + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + if ( typeof jQuery == "undefined" || jQuery.event.triggered ) + return val; + + val = jQuery.event.handle.apply(element, arguments); + + return val; + }); + + // Get the current list of functions bound to this event + var handlers = events[type]; + + // Init the event handler queue + if (!handlers) { + handlers = events[type] = {}; + + // And bind the global event handler to the element + if (element.addEventListener) + element.addEventListener(type, handle, false); + else + element.attachEvent("on" + type, handle); + } + + // Add the function to the element's handler list + handlers[handler.guid] = handler; + + // Keep track of which events have been used, for global triggering + this.global[type] = true; + }, + + guid: 1, + global: {}, + + // Detach an event or set of events from an element + remove: function(element, type, handler) { + var events = jQuery.data(element, "events"), ret, index; + + // Namespaced event handlers + if ( typeof type == "string" ) { + var parts = type.split("."); + type = parts[0]; + } + + if ( events ) { + // type is actually an event object here + if ( type && type.type ) { + handler = type.handler; + type = type.type; + } + + if ( !type ) { + for ( type in events ) + this.remove( element, type ); + + } else if ( events[type] ) { + // remove the given handler for the given type + if ( handler ) + delete events[type][handler.guid]; + + // remove all handlers for the given type + else + for ( handler in events[type] ) + // Handle the removal of namespaced events + if ( !parts[1] || events[type][handler].type == parts[1] ) + delete events[type][handler]; + + // remove generic event handler if no more handlers exist + for ( ret in events[type] ) break; + if ( !ret ) { + if (element.removeEventListener) + element.removeEventListener(type, jQuery.data(element, "handle"), false); + else + element.detachEvent("on" + type, jQuery.data(element, "handle")); + ret = null; + delete events[type]; + } + } + + // Remove the expando if it's no longer used + for ( ret in events ) break; + if ( !ret ) { + jQuery.removeData( element, "events" ); + jQuery.removeData( element, "handle" ); + } + } + }, + + trigger: function(type, data, element, donative, extra) { + // Clone the incoming data, if any + data = jQuery.makeArray(data || []); + + // Handle a global trigger + if ( !element ) { + // Only trigger if we've ever bound an event for it + if ( this.global[type] ) + jQuery("*").add([window, document]).trigger(type, data); + + // Handle triggering a single element + } else { + var val, ret, fn = jQuery.isFunction( element[ type ] || null ), + // Check to see if we need to provide a fake event, or not + evt = !data[0] || !data[0].preventDefault; + + // Pass along a fake event + if ( evt ) + data.unshift( this.fix({ type: type, target: element }) ); + + // Trigger the event + if ( jQuery.isFunction( jQuery.data(element, "handle") ) ) + val = jQuery.data(element, "handle").apply( element, data ); + + // Handle triggering native .onfoo handlers + if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false ) + val = false; + + // Extra functions don't get the custom event object + if ( evt ) + data.shift(); + + // Handle triggering of extra function + if ( extra && extra.apply( element, data ) === false ) + val = false; + + // Trigger the native events (except for clicks on links) + if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) { + this.triggered = true; + element[ type ](); + } + + this.triggered = false; + } + + return val; + }, + + handle: function(event) { + // returned undefined or false + var val; + + // Empty object is for triggered events with no data + event = jQuery.event.fix( event || window.event || {} ); + + // Namespaced event handlers + var parts = event.type.split("."); + event.type = parts[0]; + + var c = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 ); + args.unshift( event ); + + for ( var j in c ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + args[0].handler = c[j]; + args[0].data = c[j].data; + + // Filter the functions by class + if ( !parts[1] || c[j].type == parts[1] ) { + var tmp = c[j].apply( this, args ); + + if ( val !== false ) + val = tmp; + + if ( tmp === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + + // Clean up added properties in IE to prevent memory leak + if (jQuery.browser.msie) + event.target = event.preventDefault = event.stopPropagation = + event.handler = event.data = null; + + return val; + }, + + fix: function(event) { + // store a copy of the original event object + // and clone to set read-only properties + var originalEvent = event; + event = jQuery.extend({}, originalEvent); + + // add preventDefault and stopPropagation since + // they will not work on the clone + event.preventDefault = function() { + // if preventDefault exists run it on the original event + if (originalEvent.preventDefault) + originalEvent.preventDefault(); + // otherwise set the returnValue property of the original event to false (IE) + originalEvent.returnValue = false; + }; + event.stopPropagation = function() { + // if stopPropagation exists run it on the original event + if (originalEvent.stopPropagation) + originalEvent.stopPropagation(); + // otherwise set the cancelBubble property of the original event to true (IE) + originalEvent.cancelBubble = true; + }; + + // Fix target property, if necessary + if ( !event.target && event.srcElement ) + event.target = event.srcElement; + + // check if target is a textnode (safari) + if (jQuery.browser.safari && event.target.nodeType == 3) + event.target = originalEvent.target.parentNode; + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) + event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var e = document.documentElement, b = document.body; + event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0); + event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0); + } + + // Add which for key events + if ( !event.which && (event.charCode || event.keyCode) ) + event.which = event.charCode || event.keyCode; + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) + event.metaKey = event.ctrlKey; + + // Add which for click: 1 == left; 2 == middle; 3 == right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button ) + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + + return event; + } +}; + +jQuery.fn.extend({ + bind: function( type, data, fn ) { + return type == "unload" ? this.one(type, data, fn) : this.each(function(){ + jQuery.event.add( this, type, fn || data, fn && data ); + }); + }, + + one: function( type, data, fn ) { + return this.each(function(){ + jQuery.event.add( this, type, function(event) { + jQuery(this).unbind(event); + return (fn || data).apply( this, arguments); + }, fn && data); + }); + }, + + unbind: function( type, fn ) { + return this.each(function(){ + jQuery.event.remove( this, type, fn ); + }); + }, + + trigger: function( type, data, fn ) { + return this.each(function(){ + jQuery.event.trigger( type, data, this, true, fn ); + }); + }, + + triggerHandler: function( type, data, fn ) { + if ( this[0] ) + return jQuery.event.trigger( type, data, this[0], false, fn ); + }, + + toggle: function() { + // Save reference to arguments for access in closure + var a = arguments; + + return this.click(function(e) { + // Figure out which function to execute + this.lastToggle = 0 == this.lastToggle ? 1 : 0; + + // Make sure that clicks stop + e.preventDefault(); + + // and execute the function + return a[this.lastToggle].apply( this, [e] ) || false; + }); + }, + + hover: function(f,g) { + + // A private function for handling mouse 'hovering' + function handleHover(e) { + // Check if mouse(over|out) are still within the same parent element + var p = e.relatedTarget; + + // Traverse up the tree + while ( p && p != this ) try { p = p.parentNode; } catch(e) { p = this; }; + + // If we actually just moused on to a sub-element, ignore it + if ( p == this ) return false; + + // Execute the right function + return (e.type == "mouseover" ? f : g).apply(this, [e]); + } + + // Bind the function to the two event listeners + return this.mouseover(handleHover).mouseout(handleHover); + }, + + ready: function(f) { + // Attach the listeners + bindReady(); + + // If the DOM is already ready + if ( jQuery.isReady ) + // Execute the function immediately + f.apply( document, [jQuery] ); + + // Otherwise, remember the function for later + else + // Add the function to the wait list + jQuery.readyList.push( function() { return f.apply(this, [jQuery]); } ); + + return this; + } +}); + +jQuery.extend({ + /* + * All the code that makes DOM Ready work nicely. + */ + isReady: false, + readyList: [], + + // Handle when the DOM is ready + ready: function() { + // Make sure that the DOM is not already loaded + if ( !jQuery.isReady ) { + // Remember that the DOM is ready + jQuery.isReady = true; + + // If there are functions bound, to execute + if ( jQuery.readyList ) { + // Execute all of them + jQuery.each( jQuery.readyList, function(){ + this.apply( document ); + }); + + // Reset the list of functions + jQuery.readyList = null; + } + // Remove event listener to avoid memory leak + if ( jQuery.browser.mozilla || jQuery.browser.opera ) + document.removeEventListener( "DOMContentLoaded", jQuery.ready, false ); + + // Remove script element used by IE hack + if( !window.frames.length ) // don't remove if frames are present (#1187) + jQuery(window).load(function(){ jQuery("#__ie_init").remove(); }); + } + } +}); + +jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + + "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + + "submit,keydown,keypress,keyup,error").split(","), function(i,o){ + + // Handle event binding + jQuery.fn[o] = function(f){ + return f ? this.bind(o, f) : this.trigger(o); + }; +}); + +var readyBound = false; + +function bindReady(){ + if ( readyBound ) return; + readyBound = true; + + // If Mozilla is used + if ( jQuery.browser.mozilla || jQuery.browser.opera ) + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", jQuery.ready, false ); + + // If IE is used, use the excellent hack by Matthias Miller + // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited + else if ( jQuery.browser.msie ) { + + // Only works if you document.write() it + document.write("<scr" + "ipt id=__ie_init defer=true " + + "src=//:><\/script>"); + + // Use the defer script hack + var script = document.getElementById("__ie_init"); + + // script does not exist if jQuery is loaded dynamically + if ( script ) + script.onreadystatechange = function() { + if ( this.readyState != "complete" ) return; + jQuery.ready(); + }; + + // Clear from memory + script = null; + + // If Safari is used + } else if ( jQuery.browser.safari ) + // Continually check to see if the document.readyState is valid + jQuery.safariTimer = setInterval(function(){ + // loaded and complete are both valid states + if ( document.readyState == "loaded" || + document.readyState == "complete" ) { + + // If either one are found, remove the timer + clearInterval( jQuery.safariTimer ); + jQuery.safariTimer = null; + + // and execute any waiting functions + jQuery.ready(); + } + }, 10); + + // A fallback to window.onload, that will always work + jQuery.event.add( window, "load", jQuery.ready ); +} +jQuery.fn.extend({ + load: function( url, params, callback ) { + if ( jQuery.isFunction( url ) ) + return this.bind("load", url); + + var off = url.indexOf(" "); + if ( off >= 0 ) { + var selector = url.slice(off, url.length); + url = url.slice(0, off); + } + + callback = callback || function(){}; + + // Default to a GET request + var type = "GET"; + + // If the second parameter was provided + if ( params ) + // If it's a function + if ( jQuery.isFunction( params ) ) { + // We assume that it's the callback + callback = params; + params = null; + + // Otherwise, build a param string + } else { + params = jQuery.param( params ); + type = "POST"; + } + + var self = this; + + // Request the remote document + jQuery.ajax({ + url: url, + type: type, + data: params, + complete: function(res, status){ + // If successful, inject the HTML into all the matched elements + if ( status == "success" || status == "notmodified" ) + // See if a selector was specified + self.html( selector ? + // Create a dummy div to hold the results + jQuery("<div/>") + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, "")) + + // Locate the specified elements + .find(selector) : + + // If not, just inject the full result + res.responseText ); + + // Add delay to account for Safari's delay in globalEval + setTimeout(function(){ + self.each( callback, [res.responseText, status, res] ); + }, 13); + } + }); + return this; + }, + + serialize: function() { + return jQuery.param(this.serializeArray()); + }, + serializeArray: function() { + return this.map(function(){ + return jQuery.nodeName(this, "form") ? + jQuery.makeArray(this.elements) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + (this.checked || /select|textarea/i.test(this.nodeName) || + /text|hidden|password/i.test(this.type)); + }) + .map(function(i, elem){ + var val = jQuery(this).val(); + return val == null ? null : + val.constructor == Array ? + jQuery.map( val, function(i, val){ + return {name: elem.name, value: val}; + }) : + {name: elem.name, value: val}; + }).get(); + } +}); + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ + jQuery.fn[o] = function(f){ + return this.bind(o, f); + }; +}); + +var jsc = (new Date).getTime(); + +jQuery.extend({ + get: function( url, data, callback, type ) { + // shift arguments if data argument was ommited + if ( jQuery.isFunction( data ) ) { + callback = data; + data = null; + } + + return jQuery.ajax({ + type: "GET", + url: url, + data: data, + success: callback, + dataType: type + }); + }, + + getScript: function( url, callback ) { + return jQuery.get(url, null, callback, "script"); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get(url, data, callback, "json"); + }, + + post: function( url, data, callback, type ) { + if ( jQuery.isFun... [truncated message content] |
From: <esp...@us...> - 2007-09-11 11:49:37
|
Revision: 70 http://picfinity.svn.sourceforge.net/picfinity/?rev=70&view=rev Author: espadav8 Date: 2007-09-11 04:49:39 -0700 (Tue, 11 Sep 2007) Log Message: ----------- Import initial jQuery theme (clean) Added Paths: ----------- trunk/.themes/clean/ trunk/.themes/clean/addComment.php trunk/.themes/clean/backgrounds.css trunk/.themes/clean/borders.css trunk/.themes/clean/clean.css trunk/.themes/clean/clean.js trunk/.themes/clean/clean.xsl trunk/.themes/clean/colours.css trunk/.themes/clean/empty.png trunk/.themes/clean/emptyicon.png trunk/.themes/clean/folder.png trunk/.themes/clean/foldericon.png trunk/.themes/clean/getComments.php trunk/.themes/clean/jquery-1.1.4.js trunk/.themes/clean/jquery.flydom-3.0.8.js trunk/.themes/clean/loadingAnimation.gif trunk/.themes/clean/plus.png trunk/.themes/clean/plus.svg trunk/.themes/clean/thickbox-3.1.css trunk/.themes/clean/thickbox-3.1.js Added: trunk/.themes/clean/addComment.php =================================================================== --- trunk/.themes/clean/addComment.php (rev 0) +++ trunk/.themes/clean/addComment.php 2007-09-11 11:49:39 UTC (rev 70) @@ -0,0 +1,62 @@ +<?php + require_once('../../db.inc'); + + $image_md5 = mysql_real_escape_string($_POST['image_id']); + $ajax = mysql_real_escape_string($_POST['ajax']); + $name = mysql_real_escape_string($_POST['name']); + $email = mysql_real_escape_string($_POST['email']); + $web = mysql_real_escape_string($_POST['web']); + $comment = mysql_real_escape_string($_POST['comment']); + $user_ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']); + $approved = "1"; + + $query = "SELECT image_id FROM images WHERE image_md5 = '$image_md5'"; + $select_result = mysql_query($query); + + if ($select_result) + { + $image_id = mysql_fetch_row($select_result); + + $query = " + INSERT INTO comments + ( image_id + , user_name + , user_www + , user_email + , user_comment + , user_ip + , comment_rating + , approved + ) + VALUES + ( $image_id[0] + , '$name' + , '$web' + , '$email' + , '$comment' + , '$user_ip' + , 0 + , $approved + )"; + + $insert_result = mysql_query($query); + if ($insert_result) + { + header('Content-Type: text/xml'); + echo "<success><message>Comment added successfully</message></success>"; + } + else + { + header('Content-Type: text/xml'); + echo "<error><message>Error inserting comment</message>\n" + ."<message>".mysql_error()."</message>\n" + ."<message>".$query."</message>\n</error>"; + } + } + else + { + header('Content-Type: text/xml'); + echo "<error><message>Image md5 doesn't exist</message></error>"; + } + +?> Added: trunk/.themes/clean/backgrounds.css =================================================================== --- trunk/.themes/clean/backgrounds.css (rev 0) +++ trunk/.themes/clean/backgrounds.css 2007-09-11 11:49:39 UTC (rev 70) @@ -0,0 +1,33 @@ +.folder a:hover, +.thumbnail a:hover, +.background1 +{ + background: #BCC557; +} + +#nav, +#welcomehelp, +#album, +#TB_window, +.background2 +{ + background: #CDE660; +} + +#nav li a:hover, +.background3 +{ + background: #FFD91B; +} + + +.background4 +{ + background: #F6C031; +} + +body, +.background5 +{ + background: #768047; +} \ No newline at end of file Added: trunk/.themes/clean/borders.css =================================================================== --- trunk/.themes/clean/borders.css (rev 0) +++ trunk/.themes/clean/borders.css 2007-09-11 11:49:39 UTC (rev 70) @@ -0,0 +1,63 @@ +#nav, +#welcomehelp, +#album, +#TB_window, +.border1 +{ + border: #BCC557 solid 2px; +} + +.border2 +{ + border: #CDE660 solid 2px; +} + +.border3 +{ + border: #FFD91B solid 2px; +} + +.border4 +{ + border: #F6C031 solid 2px; +} + +.border5 +{ + border: #768047 solid 2px; +} + + + +#nav li a, +.border1.thin +{ + border: #BCC557 solid 1px; +} + +.border2.thin +{ + border: #CDE660 solid 1px; +} + +.border3.thin +{ + border: #FFD91B solid 1px; +} + +.border4.thin +{ + border: #F6C031 solid 1px; +} + +.folder, +.thumbnail, +.border5.thin +{ + border: #768047 solid 1px; +} + +.title +{ + border-top: #768047 solid 1px; +} \ No newline at end of file Added: trunk/.themes/clean/clean.css =================================================================== --- trunk/.themes/clean/clean.css (rev 0) +++ trunk/.themes/clean/clean.css 2007-09-11 11:49:39 UTC (rev 70) @@ -0,0 +1,134 @@ +@import "thickbox-3.1.css"; +@import "colours.css"; +@import "borders.css"; +@import "backgrounds.css"; + +* +{ + padding: 0; + margin: 0; +} + +img +{ + display: block; + border: 0; +} + +h1 +{ + margin-bottom: 0.3em; + font-size: 2em; + text-align: center; +} + +#nav +{ + float: left; + padding: 0.2em; + width: 9em; + margin: 0 0.3em; +} + +#nav ul +{ + list-style: none; + font-size: 0.7em; +} + +#nav ul ul +{ + padding-left: 0.5em; + font-size: 1em; + display: none; +} + +#nav li +{ + padding: 0.1em 0; +} + +#nav li img +{ + float: left; + margin: 0.3em 0 0 0; +} + +#nav li img:hover +{ + cursor: pointer; +} + +#nav li a +{ + font-weight: bold; + text-decoration: none; + display: block; + margin-left: 12px; + padding: 0 0.3em; +} + +#album, +#welcomehelp +{ + overflow: hidden; + padding: 0.3em; + margin: 0 0.3em 0 0; +} + +#album +{ + display: none; +} + +.folder a, +.thumbnail a +{ + display: block; + height: 1.5em; + text-decoration: none; +} + + +.folder, +.thumbnail +{ + width: 9.5em; + height: 9.5em; + overflow: hidden; + text-align: center; + float: left; + margin: 0.3em 0.3em 0 0; +} + +.image img +{ + margin: 0 auto; +} + +.image +{ + width: 9.5em; + height: 8em; + display: block; + overflow: hidden; +} + +.image a +{ + padding: 0.3em 0 0 0; + width: 9.5em; + height: 7.7em; + display: block; +} + +.title +{ + display: block; + font-size: 0.8em; +} + +.title a +{ + padding: 0.3em 0 0 0; +} \ No newline at end of file Added: trunk/.themes/clean/clean.js =================================================================== --- trunk/.themes/clean/clean.js (rev 0) +++ trunk/.themes/clean/clean.js 2007-09-11 11:49:39 UTC (rev 70) @@ -0,0 +1,250 @@ +var galleryXML; +var aniSpeed = 1000; + +$(document).ready( function() { + $.get("gallery.xml", + null, + function(xml) { + galleryXML = xml; + runSetup(); + preloadThumbnailImages(); + } + ); +}); + +function runSetup() +{ + $("body h1 a").click( function() + { + showWelcome(); + return false; + } + ); + + $("#nav a").click( function() + { + openFolder( $(this).parent().attr("id") ); + return false; + } + ); + + if ( $("#nav li img").length > 0 ) + { + $("#nav li img").click( function() + { + toggleFolder( $(this).parent().attr("id") ); + } + ); + } + else + { + $("#nav li a").css("margin-left", 0); + } +} + +function openFolder(folderID) +{ + var node = $("#"+folderID, galleryXML); + + if ( $("#welcomehelp").is(":visible") ) + { + $("#welcomehelp").slideUp(aniSpeed, function() { showFolder(folderID); } ); + } + else + { + showFolder(folderID); + } + + return false; +} + +function showFolder(folderID) +{ + // fade out the old album if one exists + if ($("#album").length > 0) + { + $("#album").slideUp(aniSpeed, function() { + $("#album").remove(); + showFolder(folderID); + }); + return; + } + + // show the sub-folders if there are any and hidden + if ( ($("#" + folderID + " ul").length > 0) && ( $("#" + folderID + " ul").is(":hidden") ) ) + { + toggleFolder(folderID); + } + + // get the node from the XML file + var galleryXmlNode = $("#"+folderID, galleryXML); + // get the name of the node (folder) + var folderName = galleryXmlNode.attr("name"); + // get the number of sub-folders + var folderChildren = galleryXmlNode.children("folder").length; + // get the number of images + var imageChildren = galleryXmlNode.children("image").length; + + // append the album div + $(document.body).createAppend( + 'div', { id: 'album' }, [ + 'p', { id: 'albumtitle' }, folderName + ] + ); + + // if we have any folders then append them + if ( folderChildren > 0 ) + { + // get a list of the folders + var child = galleryXmlNode.children("folder"); + + for (var i = 0; i < folderChildren; i++) + { + var folderId = child.attr("id"); + var folderName = child.attr("name"); + // append the folder to the album div + $("#album").createAppend( + 'div', { className: "folder" }, [ + 'p', { }, [ + 'a', { + href: "index.php?id="+folderId, + onclick: function() { openFolder( folderId ); return false; } + }, folderName + ] + ] + ); + + // move on to the next one + child = child.next(); + } + } + + // if we have any image then append them + if ( imageChildren > 0 ) + { + // get a list of the folders + var child = galleryXmlNode.children("image"); + + for (var i = 0; i < imageChildren; i++) + { + var imageFile = child.attr("file"); + var imageId = child.attr("id"); + var imageLoc = getImageFilePath( imageId ); + var imageThumbLoc = "./.thumbs/" + imageLoc; + var folderId = child.parent().attr("id"); + + // append the folder to the album div + $("#album").createAppend( + 'div', { className: "thumbnail" }, [ + 'span', { className: "image" }, [ + 'a', { + href: imageLoc, + className: "thickbox", + rel: "" + folderId + }, [ + 'img', { src: imageThumbLoc, alt: imageFile }, "", + ] + ], + 'span', { className: "title" }, [ + 'a', { + href: imageLoc, + onclick: function() { openImage( imageId ); return false; } + }, imageFile + ] + ] + ); + + // move on to the next one + child = child.next(); + } + } + + $("#album .folder a").click( function() + { + openFolder( $(this).parent().attr("id") ); + return false; + } + ); + + tb_init('a.thickbox'); + + $("#album").slideDown(aniSpeed); + return; +} + +function openImage(imageId) +{ + alert( getImageFilePath(imageId) ); +} + +function getImageFilePath(imageId) +{ + var imageNode = $("#"+imageId, galleryXML); + var parentNodes = imageNode.parents("folder"); + + var imageFilePath = ""; + + for (var i = 0; i < parentNodes.length; i++) + { + imageFilePath = $(parentNodes[i]).attr("name") + "/" + imageFilePath; + } + + imageFilePath = imageFilePath + imageNode.attr("file"); + imageFilePath = escape( imageFilePath ); + + return imageFilePath; +} + +function toggleFolder(folderID) +{ + if ( $("#" + folderID + " ul").is(":visible") ) + { + $("#" + folderID + " ul").slideUp(aniSpeed); + $("#" + folderID).removeClass("open"); + } + else + { + $("#" + folderID + " ul").slideDown(aniSpeed); + $("#" + folderID).addClass("open"); + } +} + +function showWelcome() +{ + if ( $("#album").length > 0 ) + { + $("#album").slideUp(aniSpeed, function() { + $("#album").remove(); + showWelcome(); + }); + } + else if ( $("#welcomehelp").is(":hidden") ) + { + $("#welcomehelp").slideDown(aniSpeed); + } + + return; +} + +function preloadThumbnailImages() +{ + var galleryImages = $("image", galleryXML); + var galleryImageFiles = Array(); + + for (var i = 0; i < galleryImages.length; i++) + { + var gall = $(galleryImages[i]); + var imageFilePath = "./.thumbs/" + getImageFilePath( gall.attr("id") ); + galleryImageFiles.push( imageFilePath ); + } + + $(document.createElement('img')).bind('load', + function() + { + if(galleryImageFiles[0]) + { + this.src = galleryImageFiles.shift(); + } + } + ).trigger('load'); +} Added: trunk/.themes/clean/clean.xsl =================================================================== --- trunk/.themes/clean/clean.xsl (rev 0) +++ trunk/.themes/clean/clean.xsl 2007-09-11 11:49:39 UTC (rev 70) @@ -0,0 +1,136 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> + <xsl:output + method="xml" + omit-xml-declaration="yes" + indent="yes" + doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" + doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" + /> + + <xsl:param name="title" /> + <xsl:param name="post_id" /> + <xsl:param name="themename">clean</xsl:param> + + <xsl:template match="/"> + <html> + <head> + <title><xsl:value-of select="$title" /></title> + + <link rel="stylesheet" type="text/css"> + <xsl:attribute name="href"><xsl:value-of select="concat('.themes/', $themename, '/', $themename, '.css')" /></xsl:attribute> + </link> + <script type="text/javascript"> + <xsl:attribute name="src"><xsl:value-of select="concat('.themes/', $themename, '/jquery-1.1.4.js')" /></xsl:attribute> + </script> + <script type="text/javascript"> + <xsl:attribute name="src"><xsl:value-of select="concat('.themes/', $themename, '/jquery.flydom-3.0.8.js')" /></xsl:attribute> + </script> + <script type="text/javascript"> + <xsl:attribute name="src"><xsl:value-of select="concat('.themes/', $themename, '/thickbox-3.1.js')" /></xsl:attribute> + </script> + <script type="text/javascript"> + <xsl:attribute name="src"><xsl:value-of select="concat('.themes/', $themename, '/', $themename, '.js')" /></xsl:attribute> + </script> + </head> + + <body> + <h1> + <a href="index.php"> + <xsl:value-of select="$title" /> + </a> + </h1> + + <xsl:apply-templates select="layout" mode="nav" /> + + <xsl:choose> + <xsl:when test="$post_id = 0"> + <xsl:apply-templates select="layout" /> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="layout" mode="post"/> + </xsl:otherwise> + </xsl:choose> + </body> + </html> + </xsl:template> + + <xsl:template match="layout"> + <div id="welcomehelp"> + <p> + Welcome to the <xsl:value-of select="$title" /> image gallery. To the left you'll see + all the main folders in this gallery, to look inside one please just click on the name. + This will open up the folder in this space as well as expanding the folder structure + should there be any sub-folders. If you just wish to expand the folder just click on the + [+] next to the folder name. + </p> + <p> + Enjoy looking around. + </p> + </div> + </xsl:template> + + <xsl:template name="replaceCharsInString"> + <xsl:param name="stringIn"/> + <xsl:param name="charsIn"/> + <xsl:param name="charsOut"/> + <xsl:choose> + <xsl:when test="contains($stringIn,$charsIn)"> + <xsl:value-of select="concat(substring-before($stringIn,$charsIn),$charsOut)"/> + <xsl:call-template name="replaceCharsInString"> + <xsl:with-param name="stringIn" select="substring-after($stringIn,$charsIn)"/> + <xsl:with-param name="charsIn" select="$charsIn"/> + <xsl:with-param name="charsOut" select="$charsOut"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$stringIn"/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template name="nl2br"> + <xsl:param name="contents" /> + <xsl:choose> + <xsl:when test="contains($contents, ' ')"> + <xsl:value-of select="substring-before($contents, ' ')" /> + <br /> + <xsl:call-template name="nl2br"> + <xsl:with-param name="contents" select="substring-after($contents, ' ')" /> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$contents" /> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match="layout" mode="nav"> + <div id="nav"> + <ul> + <xsl:apply-templates select="folder" mode="nav" /> + </ul> + </div> + </xsl:template> + + <xsl:template match="folder" mode="nav"> + <li> + <xsl:attribute name="id"><xsl:value-of select="@id" /></xsl:attribute> + <xsl:if test="count(folder) > 0"> + <img alt="Expand folder"> + <xsl:attribute name="src"><xsl:value-of select="concat('.themes/', $themename, '/plus.png')" /></xsl:attribute> + </img> + </xsl:if> + <a> + <xsl:attribute name="href">index.php?id=<xsl:value-of select="@id" /></xsl:attribute> + <xsl:value-of select="@name" /> + </a> + <xsl:if test="count(folder) > 0"> + <ul> + <xsl:apply-templates select="folder" mode="nav" /> + </ul> + </xsl:if> + </li> + </xsl:template> + +</xsl:stylesheet> Property changes on: trunk/.themes/clean/clean.xsl ___________________________________________________________________ Name: svn:executable + * Added: trunk/.themes/clean/colours.css =================================================================== --- trunk/.themes/clean/colours.css (rev 0) +++ trunk/.themes/clean/colours.css 2007-09-11 11:49:39 UTC (rev 70) @@ -0,0 +1,25 @@ +.colour1 +{ + color: #BCC557; +} + +.colour2 +{ + color: #CDE660; +} + +h1 a, +.colour3 +{ + color: #FFD91B; +} + +.colour4 +{ + color: #F6C031; +} + +.colour5 +{ + color: #768047; +} \ No newline at end of file Added: trunk/.themes/clean/empty.png =================================================================== (Binary files differ) Property changes on: trunk/.themes/clean/empty.png ___________________________________________________________________ Name: svn:executable + * Name: svn:mime-type + application/octet-stream Added: trunk/.themes/clean/emptyicon.png =================================================================== (Binary files differ) Property changes on: trunk/.themes/clean/emptyicon.png ___________________________________________________________________ Name: svn:executable + * Name: svn:mime-type + application/octet-stream Added: trunk/.themes/clean/folder.png =================================================================== (Binary files differ) Property changes on: trunk/.themes/clean/folder.png ___________________________________________________________________ Name: svn:executable + * Name: svn:mime-type + application/octet-stream Added: trunk/.themes/clean/foldericon.png =================================================================== (Binary files differ) Property changes on: trunk/.themes/clean/foldericon.png ___________________________________________________________________ Name: svn:executable + * Name: svn:mime-type + application/octet-stream Added: trunk/.themes/clean/getComments.php =================================================================== --- trunk/.themes/clean/getComments.php (rev 0) +++ trunk/.themes/clean/getComments.php 2007-09-11 11:49:39 UTC (rev 70) @@ -0,0 +1,48 @@ +<?php + require_once('../../db.inc'); + + header('Content-Type: text/xml'); + header("Cache-Control: no-cache, must-revalidate"); + + $image_md5 = mysql_real_escape_string($_GET['md5']); + + $query = " + SELECT user_name + , user_www + , user_email + , user_comment + , comment_rating + , date_added + FROM comments + INNER JOIN images + WHERE images.image_id = comments.image_id + AND images.image_md5 = '$image_md5' + ORDER BY date_added DESC"; + + $result = mysql_query($query); + + if ($result) + { + $comments_xml = "<?xml version=\"1.0\"?>" + . "<comments>"; + while ($row = mysql_fetch_assoc($result)) + { + $comments_xml .= "<comment>" + . "<name>".stripslashes($row['user_name'])."</name>" + . "<www>".stripslashes($row['user_www'])."</www>" + . "<email>".stripslashes($row['user_email'])."</email>" + . "<comment_text>".stripslashes($row['user_comment'])."</comment_text>" + . "<rating>".stripslashes($row['comment_rating'])."</rating>" + . "<added>".stripslashes($row['date_added'])."</added>" + . "</comment>"; + } + $comments_xml .= "</comments>"; + + echo $comments_xml; + } + else + { + + echo "<error><message>Error in getting the results</message></error>"; + } +?> Added: trunk/.themes/clean/jquery-1.1.4.js =================================================================== --- trunk/.themes/clean/jquery-1.1.4.js (rev 0) +++ trunk/.themes/clean/jquery-1.1.4.js 2007-09-11 11:49:39 UTC (rev 70) @@ -0,0 +1,2508 @@ +(function(){ +/* + * jQuery 1.1.4 - New Wave Javascript + * + * Copyright (c) 2007 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2007-08-23 21:49:27 -0400 (Thu, 23 Aug 2007) $ + * $Rev: 2862 $ + */ +// Map over jQuery in case of overwrite +if ( typeof jQuery != "undefined" ) + var _jQuery = jQuery; + +var jQuery = window.jQuery = function(a,c) { + // If the context is global, return a new object + if ( window == this || !this.init ) + return new jQuery(a,c); + + return this.init(a,c); +}; + +// Map over the $ in case of overwrite +if ( typeof $ != "undefined" ) + var _$ = $; + +// Map the jQuery namespace to the '$' one +window.$ = jQuery; + +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/; + +jQuery.fn = jQuery.prototype = { + init: function(a,c) { + // Make sure that a selection was provided + a = a || document; + + // Handle HTML strings + if ( typeof a == "string" ) { + var m = quickExpr.exec(a); + if ( m && (m[1] || !c) ) { + // HANDLE: $(html) -> $(array) + if ( m[1] ) + a = jQuery.clean( [ m[1] ] ); + + // HANDLE: $("#id") + else { + var tmp = document.getElementById( m[3] ); + if ( tmp ) + // Handle the case where IE and Opera return items + // by name instead of ID + if ( tmp.id != m[3] ) + return jQuery().find( a ); + else { + this[0] = tmp; + this.length = 1; + return this; + } + else + a = []; + } + + // HANDLE: $(expr) + } else + return new jQuery( c ).find( a ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction(a) ) + return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a ); + + return this.setArray( + // HANDLE: $(array) + a.constructor == Array && a || + + // HANDLE: $(arraylike) + // Watch for when an array-like object is passed as the selector + (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) || + + // HANDLE: $(*) + [ a ] ); + }, + jquery: "1.1.4", + + size: function() { + return this.length; + }, + + length: 0, + + get: function( num ) { + return num == undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[num]; + }, + pushStack: function( a ) { + var ret = jQuery(a); + ret.prevObject = this; + return ret; + }, + setArray: function( a ) { + this.length = 0; + Array.prototype.push.apply( this, a ); + return this; + }, + each: function( fn, args ) { + return jQuery.each( this, fn, args ); + }, + index: function( obj ) { + var pos = -1; + this.each(function(i){ + if ( this == obj ) pos = i; + }); + return pos; + }, + + attr: function( key, value, type ) { + var obj = key; + + // Look for the case where we're accessing a style value + if ( key.constructor == String ) + if ( value == undefined ) + return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined; + else { + obj = {}; + obj[ key ] = value; + } + + // Check to see if we're setting style values + return this.each(function(index){ + // Set all the styles + for ( var prop in obj ) + jQuery.attr( + type ? this.style : this, + prop, jQuery.prop(this, obj[prop], type, index, prop) + ); + }); + }, + + css: function( key, value ) { + return this.attr( key, value, "curCSS" ); + }, + + text: function(e) { + if ( typeof e != "object" && e != null ) + return this.empty().append( document.createTextNode( e ) ); + + var t = ""; + jQuery.each( e || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + t += this.nodeType != 1 ? + this.nodeValue : jQuery.fn.text([ this ]); + }); + }); + return t; + }, + + wrap: function() { + // The elements to wrap the target around + var a, args = arguments; + + // Wrap each of the matched elements individually + return this.each(function(){ + if ( !a ) + a = jQuery.clean(args, this.ownerDocument); + + // Clone the structure that we're using to wrap + var b = a[0].cloneNode(true); + + // Insert it before the element to be wrapped + this.parentNode.insertBefore( b, this ); + + // Find the deepest point in the wrap structure + while ( b.firstChild ) + b = b.firstChild; + + // Move the matched element to within the wrap structure + b.appendChild( this ); + }); + }, + append: function() { + return this.domManip(arguments, true, 1, function(a){ + this.appendChild( a ); + }); + }, + prepend: function() { + return this.domManip(arguments, true, -1, function(a){ + this.insertBefore( a, this.firstChild ); + }); + }, + before: function() { + return this.domManip(arguments, false, 1, function(a){ + this.parentNode.insertBefore( a, this ); + }); + }, + after: function() { + return this.domManip(arguments, false, -1, function(a){ + this.parentNode.insertBefore( a, this.nextSibling ); + }); + }, + end: function() { + return this.prevObject || jQuery([]); + }, + find: function(t) { + var data = jQuery.map(this, function(a){ return jQuery.find(t,a); }); + return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ? + jQuery.unique( data ) : data ); + }, + clone: function(deep) { + deep = deep != undefined ? deep : true; + var $this = this.add(this.find("*")); + if (jQuery.browser.msie) { + // Need to remove events on the element and its descendants + $this.each(function() { + this._$events = {}; + for (var type in this.$events) + this._$events[type] = jQuery.extend({},this.$events[type]); + }).unbind(); + } + + // Do the clone + var r = this.pushStack( jQuery.map( this, function(a){ + return a.cloneNode( deep ); + }) ); + + if (jQuery.browser.msie) { + $this.each(function() { + // Add the events back to the original and its descendants + var events = this._$events; + for (var type in events) + for (var handler in events[type]) + jQuery.event.add(this, type, events[type][handler], events[type][handler].data); + this._$events = null; + }); + } + + // copy form values over + if (deep) { + var inputs = r.add(r.find('*')).filter('select,input[@type=checkbox]'); + $this.filter('select,input[@type=checkbox]').each(function(i) { + if (this.selectedIndex) + inputs[i].selectedIndex = this.selectedIndex; + if (this.checked) + inputs[i].checked = true; + }); + } + + // Return the cloned set + return r; + }, + + filter: function(t) { + return this.pushStack( + jQuery.isFunction( t ) && + jQuery.grep(this, function(el, index){ + return t.apply(el, [index]); + }) || + + jQuery.multiFilter(t,this) ); + }, + + not: function(t) { + return this.pushStack( + t.constructor == String && + jQuery.multiFilter(t, this, true) || + + jQuery.grep(this, function(a) { + return ( t.constructor == Array || t.jquery ) + ? jQuery.inArray( a, t ) < 0 + : a != t; + }) + ); + }, + + add: function(t) { + return this.pushStack( jQuery.merge( + this.get(), + t.constructor == String ? + jQuery(t).get() : + t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ? + t : [t] ) + ); + }, + is: function(expr) { + return expr ? jQuery.multiFilter(expr,this).length > 0 : false; + }, + + val: function( val ) { + return val == undefined ? + ( this.length ? this[0].value : null ) : + this.attr( "value", val ); + }, + + html: function( val ) { + return val == undefined ? + ( this.length ? this[0].innerHTML : null ) : + this.empty().append( val ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); + }, + domManip: function(args, table, dir, fn){ + var clone = this.length > 1, a; + + return this.each(function(){ + if ( !a ) { + a = jQuery.clean(args, this.ownerDocument); + if ( dir < 0 ) + a.reverse(); + } + + var obj = this; + + if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") ) + obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody")); + + jQuery.each( a, function(){ + if ( jQuery.nodeName(this, "script") ) { + if ( this.src ) + jQuery.ajax({ url: this.src, async: false, dataType: "script" }); + else + jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" ); + } else + fn.apply( obj, [ clone ? this.cloneNode(true) : this ] ); + }); + }); + } +}; + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false; + + // Handle a deep copy situation + if ( target.constructor == Boolean ) { + deep = target; + target = arguments[1] || {}; + } + + // extend jQuery itself if only one argument is passed + if ( al == 1 ) { + target = this; + a = 0; + } + + var prop; + + for ( ; a < al; a++ ) + // Only deal with non-null/undefined values + if ( (prop = arguments[a]) != null ) + // Extend the base object + for ( var i in prop ) { + // Prevent never-ending loop + if ( target == prop[i] ) + continue; + + // Recurse if we're merging object values + if ( deep && typeof prop[i] == 'object' && target[i] ) + jQuery.extend( target[i], prop[i] ); + + // Don't bring in undefined values + else if ( prop[i] != undefined ) + target[i] = prop[i]; + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function(deep) { + window.$ = _$; + if ( deep ) + window.jQuery = _jQuery; + return jQuery; + }, + + // This may seem like some crazy code, but trust me when I say that this + // is the only cross-browser way to do this. --John + isFunction: function( fn ) { + return !!fn && typeof fn != "string" && !fn.nodeName && + fn.constructor != Array && /function/i.test( fn + "" ); + }, + + // check if an element is in a XML document + isXMLDoc: function(elem) { + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + }, + + // Evalulates a script in a global context + // Evaluates Async. in Safari 2 :-( + globalEval: function( data ) { + data = jQuery.trim( data ); + if ( data ) { + if ( window.execScript ) + window.execScript( data ); + else if ( jQuery.browser.safari ) + // safari doesn't provide a synchronous global eval + window.setTimeout( data, 0 ); + else + eval.call( window, data ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + // args is for internal usage only + each: function( obj, fn, args ) { + if ( args ) { + if ( obj.length == undefined ) + for ( var i in obj ) + fn.apply( obj[i], args ); + else + for ( var i = 0, ol = obj.length; i < ol; i++ ) + if ( fn.apply( obj[i], args ) === false ) break; + + // A special, fast, case for the most common use of each + } else { + if ( obj.length == undefined ) + for ( var i in obj ) + fn.call( obj[i], i, obj[i] ); + else + for ( var i = 0, ol = obj.length, val = obj[0]; + i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){} + } + + return obj; + }, + + prop: function(elem, value, type, index, prop){ + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, [index] ); + + // exclude the following css properties to add px + var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i; + + // Handle passing in a number to a CSS property + return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, c ){ + jQuery.each( (c || "").split(/\s+/), function(i, cur){ + if ( !jQuery.className.has( elem.className, cur ) ) + elem.className += ( elem.className ? " " : "" ) + cur; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, c ){ + elem.className = c != undefined ? + jQuery.grep( elem.className.split(/\s+/), function(cur){ + return !jQuery.className.has( c, cur ); + }).join(" ") : ""; + }, + + // internal only, use is(".class") + has: function( t, c ) { + return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1; + } + }, + swap: function(e,o,f) { + for ( var i in o ) { + e.style["old"+i] = e.style[i]; + e.style[i] = o[i]; + } + f.apply( e, [] ); + for ( var i in o ) + e.style[i] = e.style["old"+i]; + }, + + css: function(e,p) { + if ( p == "height" || p == "width" ) { + var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"]; + + jQuery.each( d, function(){ + old["padding" + this] = 0; + old["border" + this + "Width"] = 0; + }); + + jQuery.swap( e, old, function() { + if ( jQuery(e).is(':visible') ) { + oHeight = e.offsetHeight; + oWidth = e.offsetWidth; + } else { + e = jQuery(e.cloneNode(true)) + .find(":radio").removeAttr("checked").end() + .css({ + visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0" + }).appendTo(e.parentNode)[0]; + + var parPos = jQuery.css(e.parentNode,"position") || "static"; + if ( parPos == "static" ) + e.parentNode.style.position = "relative"; + + oHeight = e.clientHeight; + oWidth = e.clientWidth; + + if ( parPos == "static" ) + e.parentNode.style.position = "static"; + + e.parentNode.removeChild(e); + } + }); + + return p == "height" ? oHeight : oWidth; + } + + return jQuery.curCSS( e, p ); + }, + + curCSS: function(elem, prop, force) { + var ret, stack = [], swap = []; + + // A helper method for determining if an element's values are broken + function color(a){ + if ( !jQuery.browser.safari ) + return false; + + var ret = document.defaultView.getComputedStyle(a,null); + return !ret || ret.getPropertyValue("color") == ""; + } + + if (prop == "opacity" && jQuery.browser.msie) { + ret = jQuery.attr(elem.style, "opacity"); + return ret == "" ? "1" : ret; + } + + if (prop.match(/float/i)) + prop = styleFloat; + + if (!force && elem.style[prop]) + ret = elem.style[prop]; + + else if (document.defaultView && document.defaultView.getComputedStyle) { + + if (prop.match(/float/i)) + prop = "float"; + + prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase(); + var cur = document.defaultView.getComputedStyle(elem, null); + + if ( cur && !color(elem) ) + ret = cur.getPropertyValue(prop); + + // If the element isn't reporting its values properly in Safari + // then some display: none elements are involved + else { + // Locate all of the parent display: none elements + for ( var a = elem; a && color(a); a = a.parentNode ) + stack.unshift(a); + + // Go through and make them visible, but in reverse + // (It would be better if we knew the exact display type that they had) + for ( a = 0; a < stack.length; a++ ) + if ( color(stack[a]) ) { + swap[a] = stack[a].style.display; + stack[a].style.display = "block"; + } + + // Since we flip the display style, we have to handle that + // one special, otherwise get the value + ret = prop == "display" && swap[stack.length-1] != null ? + "none" : + document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || ""; + + // Finally, revert the display styles back + for ( a = 0; a < swap.length; a++ ) + if ( swap[a] != null ) + stack[a].style.display = swap[a]; + } + + if ( prop == "opacity" && ret == "" ) + ret = "1"; + + } else if (elem.currentStyle) { + var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();}); + ret = elem.currentStyle[prop] || elem.currentStyle[newProp]; + } + + return ret; + }, + + clean: function(a, doc) { + var r = []; + doc = doc || document; + + jQuery.each( a, function(i,arg){ + if ( !arg ) return; + + if ( arg.constructor == Number ) + arg = arg.toString(); + + // Convert html string into DOM nodes + if ( typeof arg == "string" ) { + // Trim whitespace, otherwise indexOf won't work as expected + var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = []; + + var wrap = + // option or optgroup + !s.indexOf("<opt") && + [1, "<select>", "</select>"] || + + !s.indexOf("<leg") && + [1, "<fieldset>", "</fieldset>"] || + + s.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [1, "<table>", "</table>"] || + + !s.indexOf("<tr") && + [2, "<table><tbody>", "</tbody></table>"] || + + // <thead> matched above + (!s.indexOf("<td") || !s.indexOf("<th")) && + [3, "<table><tbody><tr>", "</tr></tbody></table>"] || + + !s.indexOf("<col") && + [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] || + + // IE can't serialize <link> and <script> tags normally + jQuery.browser.msie && + [1, "div<div>", "</div>"] || + + [0,"",""]; + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + arg + wrap[2]; + + // Move to the right depth + while ( wrap[0]-- ) + div = div.lastChild; + + // Remove IE's autoinserted <tbody> from table fragments + if ( jQuery.browser.msie ) { + + // String was a <table>, *may* have spurious <tbody> + if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) + tb = div.firstChild && div.firstChild.childNodes; + + // String was a bare <thead> or <tfoot> + else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 ) + tb = div.childNodes; + + for ( var n = tb.length-1; n >= 0 ; --n ) + if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length ) + tb[n].parentNode.removeChild(tb[n]); + + // IE completely kills leading whitespace when innerHTML is used + if ( /^\s/.test(arg) ) + div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild ); + + } + + arg = jQuery.makeArray( div.childNodes ); + } + + if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) ) + return; + + if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options ) + r.push( arg ); + else + r = jQuery.merge( r, arg ); + + }); + + return r; + }, + + attr: function(elem, name, value){ + var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props; + + // Safari mis-reports the default selected property of a hidden option + // Accessing the parent's selectedIndex property fixes it + if ( name == "selected" && jQuery.browser.safari ) + elem.parentNode.selectedIndex; + + // Certain attributes only work when accessed via the old DOM 0 way + if ( fix[name] ) { + if ( value != undefined ) elem[fix[name]] = value; + return elem[fix[name]]; + } else if ( jQuery.browser.msie && name == "style" ) + return jQuery.attr( elem.style, "cssText", value ); + + else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") ) + return elem.getAttributeNode(name).nodeValue; + + // IE elem.getAttribute passes even for style + else if ( elem.tagName ) { + + if ( value != undefined ) elem.setAttribute( name, value ); + if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) + return elem.getAttribute( name, 2 ); + return elem.getAttribute( name ); + + // elem is actually elem.style ... set the style + } else { + // IE actually uses filters for opacity + if ( name == "opacity" && jQuery.browser.msie ) { + if ( value != undefined ) { + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + elem.zoom = 1; + + // Set the alpha filter to set the opacity + elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") + + (parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); + } + + return elem.filter ? + (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : ""; + } + name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();}); + if ( value != undefined ) elem[name] = value; + return elem[name]; + } + }, + trim: function(t){ + return (t||"").replace(/^\s+|\s+$/g, ""); + }, + + makeArray: function( a ) { + var r = []; + + // Need to use typeof to fight Safari childNodes crashes + if ( typeof a != "array" ) + for ( var i = 0, al = a.length; i < al; i++ ) + r.push( a[i] ); + else + r = a.slice( 0 ); + + return r; + }, + + inArray: function( b, a ) { + for ( var i = 0, al = a.length; i < al; i++ ) + if ( a[i] == b ) + return i; + return -1; + }, + merge: function(first, second) { + // We have to loop this way because IE & Opera overwrite the length + // expando of getElementsByTagName + + // Also, we need to make sure that the correct elements are being returned + // (IE returns comment nodes in a '*' query) + if ( jQuery.browser.msie ) { + for ( var i = 0; second[i]; i++ ) + if ( second[i].nodeType != 8 ) + first.push(second[i]); + } else + for ( var i = 0; second[i]; i++ ) + first.push(second[i]); + + return first; + }, + unique: function(first) { + var r = [], num = jQuery.mergeNum++; + + try { + for ( var i = 0, fl = first.length; i < fl; i++ ) + if ( num != first[i].mergeNum ) { + first[i].mergeNum = num; + r.push(first[i]); + } + } catch(e) { + r = first; + } + + return r; + }, + + mergeNum: 0, + grep: function(elems, fn, inv) { + // If a string is passed in for the function, make a function + // for it (a handy shortcut) + if ( typeof fn == "string" ) + fn = eval("false||function(a,i){return " + fn + "}"); + + var result = []; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, el = elems.length; i < el; i++ ) + if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) ) + result.push( elems[i] ); + + return result; + }, + map: function(elems, fn) { + // If a string is passed in for the function, make a function + // for it (a handy shortcut) + if ( typeof fn == "string" ) + fn = eval("false||function(a){return " + fn + "}"); + + var result = []; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, el = elems.length; i < el; i++ ) { + var val = fn(elems[i],i); + + if ( val !== null && val != undefined ) { + if ( val.constructor != Array ) val = [val]; + result = result.concat( val ); + } + } + + return result; + } +}); + +/* + * Whether the W3C compliant box model is being used. + * + * @property + * @name $.boxModel + * @type Boolean + * @cat JavaScript + */ +var userAgent = navigator.userAgent.toLowerCase(); + +// Figure out what browser is being used +jQuery.browser = { + version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1], + safari: /webkit/.test(userAgent), + opera: /opera/.test(userAgent), + msie: /msie/.test(userAgent) && !/opera/.test(userAgent), + mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent) +}; + +var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat"; + +jQuery.extend({ + // Check to see if the W3C box model is being used + boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat", + + styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat", + + props: { + "for": "htmlFor", + "class": "className", + "float": styleFloat, + cssFloat: styleFloat, + styleFloat: styleFloat, + innerHTML: "innerHTML", + className: "className", + value: "value", + disabled: "disabled", + checked: "checked", + readonly: "readOnly", + selected: "selected", + maxlength: "maxLength" + } +}); + +jQuery.each({ + parent: "a.parentNode", + parents: "jQuery.parents(a)", + next: "jQuery.nth(a,2,'nextSibling')", + prev: "jQuery.nth(a,2,'previousSibling')", + siblings: "jQuery.sibling(a.parentNode.firstChild,a)", + children: "jQuery.sibling(a.firstChild)" +}, function(i,n){ + jQuery.fn[ i ] = function(a) { + var ret = jQuery.map(this,n); + if ( a && typeof a == "string" ) + ret = jQuery.multiFilter(a,ret); + return this.pushStack( jQuery.unique(ret) ); + }; +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after" +}, function(i,n){ + jQuery.fn[ i ] = function(){ + var a = arguments; + return this.each(function(){ + for ( var j = 0, al = a.length; j < al; j++ ) + jQuery(a[j])[n]( this ); + }); + }; +}); + +jQuery.each( { + removeAttr: function( key ) { + jQuery.attr( this, key, "" ); + this.removeAttribute( key ); + }, + addClass: function(c){ + jQuery.className.add(this,c); + }, + removeClass: function(c){ + jQuery.className.remove(this,c); + }, + toggleClass: function( c ){ + jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c); + }, + remove: function(a){ + if ( !a || jQuery.filter( a, [this] ).r.length ) + this.parentNode.removeChild( this ); + }, + empty: function() { + while ( this.firstChild ) + this.removeChild( this.firstChild ); + } +}, function(i,n){ + jQuery.fn[ i ] = function() { + return this.each( n, arguments ); + }; +}); + +// DEPRECATED +jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){ + jQuery.fn[ n ] = function(num,fn) { + return this.filter( ":" + n + "(" + num + ")", fn ); + }; +}); + +jQuery.each( [ "height", "width" ], function(i,n){ + jQuery.fn[ n ] = function(h) { + return h == undefined ? + ( this.length ? jQuery.css( this[0], n ) : null ) : + this.css( n, h.constructor == String ? h : h + "px" ); + }; +}); + +var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? + "(?:[\\w*_-]|\\\\.)" : + "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)", + quickChild = new RegExp("^[/>]\\s*(" + chars + "+)"), + quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"), + quickClass = new RegExp("^([#.]?)(" + chars + "*)"); + +jQuery.extend({ + expr: { + "": "m[2]=='*'||jQuery.nodeName(a,m[2])", + "#": "a.getAttribute('id')==m[2]", + ":": { + // Position Checks + lt: "i<m[3]-0", + gt: "i>m[3]-0", + nth: "m[3]-0==i", + eq: "m[3]-0==i", + first: "i==0", + last: "i==r.length-1", + even: "i%2==0", + odd: "i%2", + + // Child Checks + "first-child": "a.parentNode.getElementsByTagName('*')[0]==a", + "last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a", + "only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')", + + // Parent Checks + parent: "a.firstChild", + empty: "!a.firstChild", + + // Text Check + contains: "(a.textContent||a.innerText||'').indexOf(m[3])>=0", + + // Visibility + visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"', + hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"', + + // Form attributes + enabled: "!a.disabled", + disabled: "a.disabled", + checked: "a.checked", + selected: "a.selected||jQuery.attr(a,'selected')", + + // Form elements + text: "'text'==a.type", + radio: "'radio'==a.type", + checkbox: "'checkbox'==a.type", + file: "'file'==a.type", + password: "'password'==a.type", + submit: "'submit'==a.type", + image: "'image'==a.type", + reset: "'reset'==a.type", + button: '"button"==a.type||jQuery.nodeName(a,"button")', + input: "/input|select|textarea|button/i.test(a.nodeName)", + + // :has() + has: "jQuery.find(m[3],a).length" + }, + // DEPRECATED + "[": "jQuery.find(m[2],a).length" + }, + + // The regular expressions that power the parsing engine + parse: [ + // Match: [@value='test'], [@foo] + /^\[ *(@)([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/, + + // DEPRECATED + // Match: [div], [div p] + /^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/, + + // Match: :contains('foo') + /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, + + // Match: :even, :last-chlid, #id, .class + new RegExp("^([:.#]*)(" + chars + "+)") + ], + + multiFilter: function( expr, elems, not ) { + var old, cur = []; + + while ( expr && expr != old ) { + old = expr; + var f = jQuery.filter( expr, elems, not ); + expr = f.t.replace(/^\s*,\s*/, "" ); + cur = not ? elems = f.r : jQuery.merge( cur, f.r ); + } + + return cur; + }, + find: function( t, context ) { + // Quickly handle non-string expressions + if ( typeof t != "string" ) + return [ t ]; + + // Make sure that the context is a DOM Element + if ( context && !context.nodeType ) + context = null; + + // Set the correct context (if none is provided) + context = context || document; + + // DEPRECATED + // Handle the common XPath // expression + if ( !t.indexOf("//") ) { + //context = context.documentElement; + t = t.substr(2,t.length); + + // DEPRECATED + // And the / root expression + } else if ( !t.indexOf("/") && !context.ownerDocument ) { + context = context.documentElement; + t = t.substr(1,t.length); + if ( t.indexOf("/") >= 1 ) + t = t.substr(t.indexOf("/"),t.length); + } + + // Initialize the search + var ret = [context], done = [], last; + + // Continue while a selector expression exists, and while + // we're no longer looping upon ourselves + while ( t && last != t ) { + var r = []; + last = t; + + // DEPRECATED + t = jQuery.trim(t).replace( /^\/\//, "" ); + + var foundToken = false; + + // An attempt at speeding up child selectors that + // point to a specific element tag + var re = quickChild; + var m = re.exec(t); + + if ( m ) { + var nodeName = m[1].toUpperCase(); + + // Perform our own iteration and filter + for ( var i = 0; ret[i]; i++ ) + for ( var c = ret[i].firstChild; c; c = c.nextSibling ) + if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) ) + r.push( c ); + + ret = r; + t = t.replace( re, "" ); + if ( t.indexOf(" ") == 0 ) continue; + foundToken = true; + } else { + // (.. and /) DEPRECATED + re = /^((\/?\.\.)|([>\/+~]))\s*(\w*)/i; + + if ( (m = re.exec(t)) != null ) { + r = []; + + var nodeName = m[4], mergeNum = jQuery.mergeNum++; + m = m[1]; + + for ( var j = 0, rl = ret.length; j < rl; j++ ) + if ( m.indexOf("..") < 0 ) { + var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild; + for ( ; n; n = n.nextSibling ) + if ( n.nodeType == 1 ) { + if ( m == "~" && n.mergeNum == mergeNum ) break; + + if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) { + if ( m == "~" ) n.mergeNum = mergeNum; + r.push( n ); + } + + if ( m == "+" ) break; + } + // DEPRECATED + } else + r.push( ret[j].parentNode ); + + ret = r; + + // And remove the token + t = jQuery.trim( t.replace( re, "" ) ); + foundToken = true; + } + } + + // See if there's still an expression, and that we haven't already + // matched a token + if ( t && !foundToken ) { + // Handle multiple expressions + if ( !t.indexOf(",") ) { + // Clean the result set + if ( context == ret[0] ) ret.shift(); + + // Merge the result sets + done = jQuery.merge( done, ret ); + + // Reset the context + r = ret = [context]; + + // Touch up the selector string + t = " " + t.substr(1,t.length); + + } else { + // Optimize for the case nodeName#idName + var re2 = quickID; + var m = re2.exec(t); + + // Re-organize the results, so that they're consistent + if ( m ) { + m = [ 0, m[2], m[3], m[1] ]; + + } else { + // Otherwise, do a traditional filter check for + // ID, class, and element selectors + re2 = quickClass; + m = re2.exec(t); + } + + m[2] = m[2].replace(/\\/g, ""); + + var elem = ret[ret.length-1]; + + // Try to do a global search by ID, where we can + if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) { + // Optimization for HTML document case + var oid = elem.getElementById(m[2]); + + // Do a quick check for the existence of the actual ID attribute + // to avoid selecting by the name attribute in IE + // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form + if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] ) + oid = jQuery('[@id="'+m[2]+'"]', elem)[0]; + + // Do a quick check for node name (where applicable) so + // that div#foo searches will be really fast + ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; + } else { + // We need to find all descendant elements + for ( var i = 0; ret[i]; i++ ) { + // Grab the tag name being searched for + var tag = m[1] != "" || m[0] == "" ? "*" : m[2]; + + // Handle IE7 being really dumb about <object>s + if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" ) + tag = "param"; + + r = jQuery.merge( r, ret[i].getElementsByTagName( tag )); + } + + // It's faster to filter by class and be done with it + if ( m[1] == "." ) + r = jQuery.classFilter( r, m[2] ); + + // Same with ID filtering + if ( m[1] == "#" ) { + var tmp = []; + + // Try to find the element with the ID + for ( var i = 0; r[i]; i++ ) + if ( r[i].getAttribute("id") == m[2] ) { + tmp = [ r[i] ]; + break; + } + + r = tmp; + } + + ret = r; + } + + t = t.replace( re2, "" ); + } + + } + + // If a selector string still exists + if ( t ) { + // Attempt to filter it + var val = jQuery.filter(t,r); + ret = r = val.r; + t = jQuery.trim(val.t); + } + } + + // An error occurred with the selector; + // just return an empty set instead + if ( t ) + ret = []; + + // Remove the root context + if ( ret && context == ret[0] ) + ret.shift(); + + // And combine the results + done = jQuery.merge( done, ret ); + + return done; + }, + + classFilter: function(r,m,not){ + m = " " + m + " "; + var tmp = []; + for ( var i = 0; r[i]; i++ ) { + var pass = (" " + r[i].className + " ").indexOf( m ) >= 0; + if ( !not && pass || not && !pass ) + tmp.push( r[i] ); + } + return tmp; + }, + + filter: function(t,r,not) { + var last; + + // Look for common filter expressions + while ( t && t != last ) { + last = t; + + var p = jQuery.parse, m; + + for ( var i = 0; p[i]; i++ ) { + m = p[i].exec( t ); + + if ( m ) { + // Remove what we just matched + t = t.substring( m[0].length ); + + m[2] = m[2].replace(/\\/g, ""); + break; + } + } + + if ( !m ) + break; + + // :not() is a special case that can be optimized by + // keeping it out of the expression list + if ( m[1] == ":" && m[2] == "not" ) + r = jQuery.filter(m[3], r, true).r; + + // We can get a big speed boost by filtering by class here + else if ( m[1] == "." ) + r = jQuery.classFilter(r, m[2], not); + + else if ( m[1] == "@" ) { + var tmp = [], type = m[3]; + + for ( var i = 0, rl = r.length; i < rl; i++ ) { + var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ]; + + if ( z == null || /href|src|selected/.test(m[2]) ) + z = jQuery.attr(a,m[2]) || ''; + + if ( (type == "" && !!z || + type == "=" && z == m[5] || + type == "!=" && z != m[5] || + type == "^=" && z && !z.indexOf(m[5]) || + type == "$=" && z.substr(z.length - m[5].length) == m[5] || + (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not ) + tmp.push( a ); + } + + r = tmp; + + // We can get a speed boost by handling nth-child here + } else if ( m[1] == ":" && m[2] == "nth-child" ) { + var num = jQuery.mergeNum++, tmp = [], + test = /(\d*)n\+?(\d*)/.exec( + m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" || + !/\D/.test(m[3]) && "n+" + m[3] || m[3]), + first = (test[1] || 1) - 0, last = test[2] - 0; + + for ( var i = 0, rl = r.length; i < rl; i++ ) { + var node = r[i], parentNode = node.parentNode; + + if ( num != parentNode.mergeNum ) { + var c = 1; + + for ( var n = parentNode.firstChild; n; n = n.nextSibling ) + if ( n.nodeType == 1 ) + n.nodeIndex = c++; + + parentNode.mergeNum = num; + } + + var add = false; + + if ( first == 1 ) { + if ( last == 0 || node.nodeIndex == last ) + add = true; + } else if ( (node.nodeIndex + last) % first == 0 ) + add = true; + + if ( add ^ not ) + tmp.push( node ); + } + + r = tmp; + + // Otherwise, find the expression to execute + } else { + var f = jQuery.expr[m[1]]; + if ( typeof f != "string" ) + f = jQuery.expr[m[1]][m[2]]; + + // Build a custom macro to enclose it + f = eval("false||function(a,i){return " + f + "}"); + + // Execute it against the current filter + r = jQuery.grep( r, f, not ); + } + } + + // Return an array of filtered elements (r) + // and the modified expression string (t) + return { r: r, t: t }; + }, + parents: function( elem ){ + var matched = []; + var cur = elem.parentNode; + while ( cur && cur != document ) { + matched.push( cur ); + cur = cur.parentNode; + } + return matched; + }, + nth: function(cur,result,dir,elem){ + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) + if ( cur.nodeType == 1 && ++num == result ) + break; + + return cur; + }, + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType == 1 && (!elem || n != elem) ) + r.push( n ); + } + + return r; + } +}); +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code orignated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function(element, type, handler, data) { + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.browser.msie && element.setInterval != undefined ) + element = window; + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) + handler.guid = this.guid++; + + // if data is passed, bind to handler + if( data != undefined ) { + // Create temporary function pointer to original handler + var fn = handler; + + // Create unique handler function, wrapped around original handler + handler = function() { + // Pass arguments and context to original handler + return fn.apply(this, arguments); + }; + + // Store data in unique handler + handler.data = data; + + // Set the guid of unique handler to the same of original handler, so it can be removed + handler.guid = fn.guid; + } + + // Init the element's event structure + if (!element.$events) + element.$events = {}; + + if (!element.$handle) + element.$handle = function() { + // returned undefined or false + var val; + + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + if ( typeof jQuery == "undefined" || jQuery.event.triggered ) + return val; + + val = jQuery.event.handle.apply(element, arguments); + + return val; + }; + + // Get the current list of functions bound to this event + var handlers = element.$events[type]; + + // Init the event handler queue + if (!handlers) { + handlers = element.$events[type] = {}; + + // And bind the global event handler to the element + if (element.addEventListener) + element.addEventListener(type, element.$handle, false); + else + element.attachEvent("on" + type, element.$handle); + } + + // Add the function to the element's handler list + handlers[handler.guid] = handler; + + // Keep track of which events have been used, for global triggering + this.global[type] = true; + }, + + guid: 1, + global: {}, + + // Detach an event or set of events from an eleme... [truncated message content] |
From: <esp...@us...> - 2007-09-11 11:47:36
|
Revision: 69 http://picfinity.svn.sourceforge.net/picfinity/?rev=69&view=rev Author: espadav8 Date: 2007-09-11 04:47:39 -0700 (Tue, 11 Sep 2007) Log Message: ----------- Ignore my image folders Property Changed: ---------------- trunk/ Property changes on: trunk ___________________________________________________________________ Name: svn:ignore + Accident .thumbs Cornwall .cache Buff Misc Beard Take Two Beard This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-06 10:26:33
|
Revision: 68 http://picfinity.svn.sourceforge.net/picfinity/?rev=68&view=rev Author: espadav8 Date: 2007-09-06 03:26:33 -0700 (Thu, 06 Sep 2007) Log Message: ----------- Move all the config options to the top Add the option 'rescan_folders' if this is set to false, and the gallery.xml file exists, then just load the xml file to pass to the xsl if set to false, or the gallery.xml file doesn't exist, run as normal and recreate the whole xml, saving it if needed Add 'default_theme' as a option as well, to save having to look for the right place to change the string Modified Paths: -------------- trunk/index.php Modified: trunk/index.php =================================================================== --- trunk/index.php 2007-09-02 17:52:28 UTC (rev 67) +++ trunk/index.php 2007-09-06 10:26:33 UTC (rev 68) @@ -2,6 +2,37 @@ // site options $site_name = "Picfinity"; + // default theme + $deault_theme = "clean"; + + // create thumbnails for images that don't have one already + $create_thumbnails = true; + + // create a flat HTML version of the page + $create_html = false; + + // rescan the folders (and thus recreate the XML for each page request) + $rescan_folders = false; + + // create the gallery.xml file (for use by themes) + $create_xml = true; + + // Allow the users to change the theme + // this needs the PHP version of the page + $enable_themes = true; + + // thumbnail sizes + $thumbnail_width = 100; + $thumbnail_height = 100; + + // use the database + $use_db = true; + + // valid images to be shown + $valid_image_formats = array('png', 'gif', 'jpg', 'jpeg', 'bmp'); + + + // here we either get the theme posted in // or if there's one stored in the cookie use that one // otherwise use the default one @@ -17,7 +48,7 @@ else { // set the name of the default theme here - $theme = "db" ; + $theme = $deault_theme; } if ($_GET['id']) @@ -29,72 +60,63 @@ $post_id = 0; } - // create thumbnails for images that don't have one already - $create_thumbnails = true; - - // create a flat HTML version of the page - $create_html = false; - - // create the gallery.xml file (for use by themes - $create_xml = true; - - // Allow the users to change the theme - // this needs the PHP version of the page - $enable_themes = true; - - // thumbnail sizes - $thumbnail_width = 100; - $thumbnail_height = 100; - - // use the database - $use_db = true; - - if ($use_db) + if (($rescan_folders) || !file_exists("gallery.xml")) { - require_once ('db.inc'); - if (!$db_connection) + if ($use_db) { - $use_db = false; - } - else - { - if ($selected_table) + require_once ('db.inc'); + if (!$db_connection) { - $result = mysql_query("SELECT image_md5 FROM images"); - if (!$result) + $use_db = false; + } + else + { + if ($selected_table) { - echo 'Invalid query: ' . mysql_error() . "\n"; - echo 'Whole query: ' . $query; - $use_db = false; + $result = mysql_query("SELECT image_md5 FROM images"); + if (!$result) + { + echo 'Invalid query: ' . mysql_error() . "\n"; + echo 'Whole query: ' . $query; + $use_db = false; + } + else + { + $current_images = array(); + while ($row = mysql_fetch_row($result)) + { + $current_images[] = $row[0]; + } + mysql_free_result($result); + } } else { - $current_images = array(); - while ($row = mysql_fetch_row($result)) - { - $current_images[] = $row[0]; - } - mysql_free_result($result); + $use_db = false; } } - else - { - $use_db = false; - } } - } - // valid images to be shown - $valid_image_formats = array('png', 'gif', 'jpg', 'jpeg', 'bmp'); + // get the layout of the current dir + $site_layout_xml = create_folder_layout('.'); - // get the layout of the current dir - $site_layout_xml = create_folder_layout('.'); + // create the XML file if we've been told to + if ($create_xml) + { + $fh = fopen("gallery.xml", "w"); + fwrite($fh, $site_layout_xml); + fclose($fh); + } - // create the XML file if we've been told to - if ($create_xml) + if ($use_db) + { + mysql_close($db_connection); + } + } + else { - $fh = fopen("gallery.xml", "w"); - fwrite($fh, $site_layout_xml); + $fh = fopen("gallery.xml", "r"); + $site_layout_xml = fread($fh, filesize("gallery.xml")); fclose($fh); } @@ -109,11 +131,6 @@ fclose($fh); } - if ($use_db) - { - mysql_close($db_connection); - } - // echo the HTML to the screen echo $html; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-02 17:52:26
|
Revision: 67 http://picfinity.svn.sourceforge.net/picfinity/?rev=67&view=rev Author: espadav8 Date: 2007-09-02 10:52:28 -0700 (Sun, 02 Sep 2007) Log Message: ----------- Tag 0.11 release Added Paths: ----------- tags/0.11/ Copied: tags/0.11 (from rev 66, trunk) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-02 17:51:24
|
Revision: 66 http://picfinity.svn.sourceforge.net/picfinity/?rev=66&view=rev Author: espadav8 Date: 2007-09-02 10:51:23 -0700 (Sun, 02 Sep 2007) Log Message: ----------- Remove the alerts when creating xmlHttp's Don't use document.all to check for IE, now using window.ActiveXObject Make createFormInput a bit nicer to read Modified Paths: -------------- trunk/.themes/db/db.js Modified: trunk/.themes/db/db.js =================================================================== --- trunk/.themes/db/db.js 2007-09-02 17:30:38 UTC (rev 65) +++ trunk/.themes/db/db.js 2007-09-02 17:51:23 UTC (rev 66) @@ -43,22 +43,15 @@ { if (window.XMLHttpRequest) { - alert("returning window.XMLHttpRequest"); return new XMLHttpRequest(); } else if (document.implementation && document.implementation.createDocument) { - alert("returning document.implementation.createDocument"); return document.implementation.createDocument("", "layout", null); } else if (window.ActiveXObject) { - alert("returning ActiveXObject(\"Microsoft.XMLHTTP\")"); - var tmpHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); - // tmpHttpReq.validateOnParse = false; - // tmpHttpReq.resolveExternals = false; - - return tmpHttpReq; + return new ActiveXObject("Microsoft.XMLHTTP"); } else { @@ -476,20 +469,20 @@ function createFormInput(inputType, inputName, spanText) { + if (window.ActiveXObject) + { + var tmpInput = document.createElement("<input name=\"" + inputName + "\">"); + } + else + { + var tmpInput = document.createElement("input"); + tmpInput.name = inputName; + } + if (inputType == "hidden") { - if (document.all) - { - var tmpInput = document.createElement("<input name=\"" + inputName + "\">"); - } - else - { - var tmpInput = document.createElement("input"); - tmpInput.name = inputName; - } tmpInput.type = inputType; tmpInput.value = spanText; - return tmpInput; } else @@ -497,15 +490,7 @@ var tmpLabel = document.createElement("label"); var tmpSpan = document.createElement("span"); tmpSpan.appendChild(document.createTextNode(spanText)); - if (document.all) - { - var tmpInput = document.createElement("<input name=\"" + inputName + "\">"); - } - else - { - var tmpInput = document.createElement("input"); - tmpInput.name = inputName; - } + tmpInput.type = inputType; tmpInput.value = ""; @@ -520,7 +505,7 @@ var tmpLabel = document.createElement("label"); var tmpSpan = document.createElement("span"); tmpSpan.appendChild(document.createTextNode(spanText)); - if (document.all) + if (window.ActiveXObject) { var tmpTextarea = document.createElement("<textarea name=\"" + textareaName + "\">"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-02 17:31:09
|
Revision: 65 http://picfinity.svn.sourceforge.net/picfinity/?rev=65&view=rev Author: espadav8 Date: 2007-09-02 10:30:38 -0700 (Sun, 02 Sep 2007) Log Message: ----------- Move the creation of xmlHttp's to a function This now allows the commenting system to work in IE6/7 Modified Paths: -------------- trunk/.themes/db/db.js Modified: trunk/.themes/db/db.js =================================================================== --- trunk/.themes/db/db.js 2007-09-02 17:29:00 UTC (rev 64) +++ trunk/.themes/db/db.js 2007-09-02 17:30:38 UTC (rev 65) @@ -25,9 +25,9 @@ function importLayout() { - if (window.XMLHttpRequest) + var xmlHttp = createHttpRequest(); + if (xmlHttp) { - var xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) { @@ -35,24 +35,35 @@ } } xmlHttp.open("GET", "gallery.xml", true); - xmlHttp.send(null) + xmlHttp.send(null); } +} + +function createHttpRequest() +{ + if (window.XMLHttpRequest) + { + alert("returning window.XMLHttpRequest"); + return new XMLHttpRequest(); + } else if (document.implementation && document.implementation.createDocument) { - xmlDoc = document.implementation.createDocument("", "layout", null); - xmlDoc.load("gallery.xml"); + alert("returning document.implementation.createDocument"); + return document.implementation.createDocument("", "layout", null); } else if (window.ActiveXObject) { - xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.validateOnParse = false; - xmlDoc.resolveExternals = false; - xmlDoc.load("gallery.xml"); + alert("returning ActiveXObject(\"Microsoft.XMLHTTP\")"); + var tmpHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); + // tmpHttpReq.validateOnParse = false; + // tmpHttpReq.resolveExternals = false; + + return tmpHttpReq; } else { alert('Your browser can\'t handle this script'); - return; + return null; } } @@ -759,11 +770,12 @@ function getCommentsXML(imageID) { - if (window.XMLHttpRequest) + xmlHttp = createHttpRequest(); + + if (xmlHttp) { - xmlHttp = new XMLHttpRequest(); - // xmlHttp.onprogress = commentsProgress; - xmlHttp.onreadystatechange = function() { + xmlHttp.onreadystatechange = function() + { if (xmlHttp.readyState == 4) { createCommentsSection(); @@ -887,8 +899,10 @@ function addNewComment() { - if (window.XMLHttpRequest) - { + xmlHttp = createHttpRequest(); + + if(xmlHttp) + { var commentForm = document.getElementById("commentform").getElementsByTagName("form")[0]; var postData = "image_id=" + commentForm.image_id.value + "&" @@ -897,8 +911,6 @@ + "email=" + commentForm.user_email.value + "&" + "web=" + commentForm.user_web.value + "&" + "comment=" + encodeURIComponent(commentForm.user_comment.value); - - xmlHttp = new XMLHttpRequest(); xmlHttp.open("POST", ".themes/db/addComment.php", true); xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); @@ -911,9 +923,8 @@ } } xmlHttp.send(postData); - return false; } - return true; + return false; } function checkAddedCommentReply(imageID) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-02 17:29:15
|
Revision: 64 http://picfinity.svn.sourceforge.net/picfinity/?rev=64&view=rev Author: espadav8 Date: 2007-09-02 10:29:00 -0700 (Sun, 02 Sep 2007) Log Message: ----------- Set the header so the page doesn't get cached Modified Paths: -------------- trunk/.themes/db/getcomments.php Modified: trunk/.themes/db/getcomments.php =================================================================== --- trunk/.themes/db/getcomments.php 2007-09-01 18:00:46 UTC (rev 63) +++ trunk/.themes/db/getcomments.php 2007-09-02 17:29:00 UTC (rev 64) @@ -1,6 +1,9 @@ <?php require_once('../../db.inc'); + header('Content-Type: text/xml'); + header("Cache-Control: no-cache, must-revalidate"); + $image_md5 = mysql_real_escape_string($_GET['md5']); $query = " @@ -20,7 +23,6 @@ if ($result) { - header('Content-Type: text/xml'); $comments_xml = "<?xml version=\"1.0\"?>" . "<comments>"; while ($row = mysql_fetch_assoc($result)) @@ -40,7 +42,7 @@ } else { - header('Content-Type: text/xml'); + echo "<error><message>Error in getting the results</message></error>"; } ?> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-02 08:12:02
|
Revision: 58 http://picfinity.svn.sourceforge.net/picfinity/?rev=58&view=rev Author: espadav8 Date: 2007-08-25 08:04:21 -0700 (Sat, 25 Aug 2007) Log Message: ----------- A lot of changes to get the comments working JS -- Add the functions to get the comments and post new comments Create the form when we view an image When a new comment is posted, reload the comments addComment.php -- get the data via a POST and make sure it's been real_escaped Return either a success or error message to be handled getcomments.php -- Strip any slashes out that were added when the comment was added CSS -- A bit of clean up Add all the comment and commentform CSS (this needs cleaning up) XSL -- If there are comments for the selected image then show them Modified Paths: -------------- trunk/.themes/db/borders.css trunk/.themes/db/colours.css trunk/.themes/db/db.css trunk/.themes/db/db.js trunk/.themes/db/db.xsl trunk/.themes/db/getcomments.php Added Paths: ----------- trunk/.themes/db/addComment.php Added: trunk/.themes/db/addComment.php =================================================================== --- trunk/.themes/db/addComment.php (rev 0) +++ trunk/.themes/db/addComment.php 2007-08-25 15:04:21 UTC (rev 58) @@ -0,0 +1,62 @@ +<?php + require_once('../../db.inc'); + + $image_md5 = mysql_real_escape_string($_POST['image_id']); + $ajax = mysql_real_escape_string($_POST['ajax']); + $name = mysql_real_escape_string($_POST['name']); + $email = mysql_real_escape_string($_POST['email']); + $web = mysql_real_escape_string($_POST['web']); + $comment = mysql_real_escape_string($_POST['comment']); + $user_ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']); + $approved = "1"; + + $query = "SELECT image_id FROM images WHERE image_md5 = '$image_md5'"; + $select_result = mysql_query($query); + + if ($select_result) + { + $image_id = mysql_fetch_row($select_result); + + $query = " + INSERT INTO comments + ( image_id + , user_name + , user_www + , user_email + , user_comment + , user_ip + , comment_rating + , approved + ) + VALUES + ( $image_id[0] + , '$name' + , '$web' + , '$email' + , '$comment' + , '$user_ip' + , 0 + , $approved + )"; + + $insert_result = mysql_query($query); + if ($insert_result) + { + header('Content-Type: text/xml'); + echo "<success><message>Comment added successfully</message></success>"; + } + else + { + header('Content-Type: text/xml'); + echo "<error><message>Error inserting comment</message>\n" + ."<message>".mysql_error()."</message>\n" + ."<message>".$query."</message>\n</error>"; + } + } + else + { + header('Content-Type: text/xml'); + echo "<error><message>Image md5 doesn't exist</message></error>"; + } + +?> Modified: trunk/.themes/db/borders.css =================================================================== --- trunk/.themes/db/borders.css 2007-08-25 14:55:36 UTC (rev 57) +++ trunk/.themes/db/borders.css 2007-08-25 15:04:21 UTC (rev 58) @@ -4,11 +4,6 @@ border: 0; } -.image a -{ - border-bottom: 1px solid #ccc; -} - .folder, .thumbnail, #expandedimage, @@ -19,13 +14,22 @@ border: 1px solid #ccc; } +#commentform, #expandedimagespan { border-top: 1px solid #ccc; +} + +.image a, +#loadingspan, +#expandedimagespan +{ border-bottom: 1px solid #ccc; } -#loadingspan +#commentform input, +#commentform textarea, +#commentform button { - border-bottom: 1px solid #ccc; + border: 1px solid #000; } \ No newline at end of file Modified: trunk/.themes/db/colours.css =================================================================== --- trunk/.themes/db/colours.css 2007-08-25 14:55:36 UTC (rev 57) +++ trunk/.themes/db/colours.css 2007-08-25 15:04:21 UTC (rev 58) @@ -19,7 +19,10 @@ .comment.odd a, .comment .date, -.comment .rating +.comment .rating, +input, +textarea, +button { color: #000000; } @@ -30,6 +33,7 @@ html, .selected a, #linktospan a:hover, +#addcomment a:hover, #breadcrumbtrail ul li a:hover, #breadcrumbtrail ul li ul li.selected { @@ -48,6 +52,7 @@ #linktospan a, .image a:hover, .comment.odd, +#commentform, #breadcrumbtrail ul li ul li a:hover { background-color: #707070; Modified: trunk/.themes/db/db.css =================================================================== --- trunk/.themes/db/db.css 2007-08-25 14:55:36 UTC (rev 57) +++ trunk/.themes/db/db.css 2007-08-25 15:04:21 UTC (rev 58) @@ -89,7 +89,8 @@ .name, #loadingspan, -#linktospan a +#linktospan a, +#addcomment a { font-weight: bold; padding: 3px 0; @@ -217,10 +218,40 @@ clear: both; } - .comment .commenttext { clear: both; float: left; margin: 5px 0 0 0; -} \ No newline at end of file +} + + +#commentform form +{ + padding: 0 5px 5px 5px +} + +#commentform button, +#commentform label span +{ + font-size: 0.9em; +} + +#commentform label, +#commentform label span, +#commentform button +{ + float: left; + clear: both; +} + +#commentform label +{ + margin-bottom: 5px; +} + +#commentform button, +#commentform label span +{ + width: 100px; +} Modified: trunk/.themes/db/db.js =================================================================== --- trunk/.themes/db/db.js 2007-08-25 14:55:36 UTC (rev 57) +++ trunk/.themes/db/db.js 2007-08-25 15:04:21 UTC (rev 58) @@ -397,10 +397,13 @@ imageNameDiv.className = "name"; imageNameDiv.appendChild(document.createTextNode(imageNode.getAttribute("file"))); + var commentForm = createCommentForm(imageNode.getAttribute("id")); + expandedImageDiv.appendChild(linkToDiv); expandedImageDiv.appendChild(loadingDiv); expandedImageDiv.appendChild(imageDiv); expandedImageDiv.appendChild(imageNameDiv); + expandedImageDiv.appendChild(commentForm); var expandedImage = new Image(); expandedImage.onload = function() @@ -414,6 +417,100 @@ return expandedImageDiv; } +function createCommentForm(imageID) +{ + var commentFormDiv = document.createElement("div") + commentFormDiv.setAttribute("id", "commentform"); + + var addCommentSpan = document.createElement("div"); + addCommentSpan.setAttribute("id", "addcomment"); + + var addCommentAnchor = document.createElement("a"); + addCommentSpan.setAttribute("href", "#"); + addCommentAnchor.appendChild(document.createTextNode("Add Comment")); + addCommentAnchor.onclick = toggleCommentsForm; + addCommentSpan.appendChild(addCommentAnchor); + + var commentForm = document.createElement("form"); + commentForm.onsubmit = addNewComment; + commentForm.action = ".themes/db/postComment.php"; + commentForm.style.display = "none"; + + var commentFormFieldset = document.createElement("fieldset"); + + var ajaxInput = document.createElement("input"); + ajaxInput.type = "hidden"; + ajaxInput.value = "0"; + ajaxInput.name = "ajax"; + + var imageIDInput = document.createElement("input"); + imageIDInput.type = "hidden"; + imageIDInput.value = imageID; + imageIDInput.name = "image_id"; + + var nameLabel = createFormInput("user_name", "Name:"); + var emailLabel = createFormInput("user_email", "Email:"); + var webLabel = createFormInput("user_web", "Web:"); + var commentLabel = createFormTextarea("user_comment", "Comment:"); + var submitButton = createFormButton("submit", "Submit"); + + commentFormFieldset.appendChild(ajaxInput); + commentFormFieldset.appendChild(imageIDInput); + commentFormFieldset.appendChild(nameLabel); + commentFormFieldset.appendChild(emailLabel); + commentFormFieldset.appendChild(webLabel); + commentFormFieldset.appendChild(commentLabel); + commentFormFieldset.appendChild(submitButton); + + commentForm.appendChild(commentFormFieldset); + + commentFormDiv.appendChild(addCommentSpan); + commentFormDiv.appendChild(commentForm); + + return commentFormDiv; +} + +function createFormInput(inputName, spanText) +{ + var tmpLabel = document.createElement("label"); + var tmpSpan = document.createElement("span"); + tmpSpan.appendChild(document.createTextNode(spanText)); + var tmpInput = document.createElement("input"); + tmpInput.type = "text"; + tmpInput.value = ""; + tmpInput.name = inputName; + + tmpLabel.appendChild(tmpSpan); + tmpLabel.appendChild(tmpInput); + + return tmpLabel; +} + +function createFormTextarea(textareaName, spanText) +{ + var tmpLabel = document.createElement("label"); + var tmpSpan = document.createElement("span"); + tmpSpan.appendChild(document.createTextNode(spanText)); + var tmpTextarea = document.createElement("textarea"); + tmpTextarea.name = textareaName; + tmpTextarea.rows = 3; + tmpTextarea.cols = 50; + + tmpLabel.appendChild(tmpSpan); + tmpLabel.appendChild(tmpTextarea); + + return tmpLabel; +} + +function createFormButton(buttonType, buttonText) +{ + var tmpButton = document.createElement("button"); + tmpButton.appendChild(document.createTextNode(buttonText)); + tmpButton.type = buttonType; + + return tmpButton; +} + function createBreadcrumbTrail(element) { var breadcrumbTrailDiv = document.createElement("div"); @@ -726,11 +823,82 @@ commentsDiv.appendChild(comment); } - document.getElementById("expandedimage").parentNode.insertBefore(commentsDiv, document.getElementById("expandedimage").nextSibling); + if (document.getElementById("comments")) + { + document.getElementById("comments").parentNode.replaceChild(commentsDiv, document.getElementById("comments")); + } + else + { + document.getElementById("expandedimage").parentNode.insertBefore(commentsDiv, document.getElementById("expandedimage").nextSibling); + } } +function toggleCommentsForm() +{ + var commentForm = document.getElementById("commentform").getElementsByTagName("form")[0]; + if (commentForm.style.display != "none") + commentForm.style.display = "none"; + else + { + commentForm.style.display = ""; + commentForm.getElementsByTagName("input")[0].focus(); + } +} +function resetCommentsForm() +{ + var commentForm = document.getElementById("commentform").getElementsByTagName("form")[0]; + commentForm.reset(); +} + +function addNewComment() +{ + if (window.XMLHttpRequest) + { + var commentForm = document.getElementById("commentform").getElementsByTagName("form")[0]; + + var postData = "image_id=" + commentForm.image_id.value + "&" + + "ajax=1&" + + "name=" + commentForm.user_name.value + "&" + + "email=" + commentForm.user_email.value + "&" + + "web=" + commentForm.user_web.value + "&" + + "comment=" + encodeURIComponent(commentForm.user_comment.value); + + xmlHttp = new XMLHttpRequest(); + xmlHttp.open("POST", ".themes/db/addComment.php", true); + + xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xmlHttp.setRequestHeader("Content-length", postData.length); + xmlHttp.setRequestHeader("Connection", "close"); + + xmlHttp.onreadystatechange = function() { + if (xmlHttp.readyState == 4) + { + checkAddedCommentReply(commentForm.image_id.value) + } + } + xmlHttp.send(postData); + return false; + } + else + { + return true; + } +} + +function checkAddedCommentReply(imageID) +{ + var insertReply = xmlHttp.responseXML.documentElement; + + if (insertReply.nodeName == "success") + { + resetCommentsForm(); + toggleCommentsForm(); + getCommentsXML(imageID); + } +} + function getCookie(name) { var start = document.cookie.indexOf( name + "=" ); var len = start + name.length + 1; Modified: trunk/.themes/db/db.xsl =================================================================== --- trunk/.themes/db/db.xsl 2007-08-25 14:55:36 UTC (rev 57) +++ trunk/.themes/db/db.xsl 2007-08-25 15:04:21 UTC (rev 58) @@ -295,6 +295,40 @@ </a> </div> <div class="name"><xsl:value-of select="@file" /></div> +<div id="commentform"> + <div id="addcomment"> + <a href="#" onclick="toggleCommentsForm(); return false;">Add Comment</a> + </div> + <form action=".themes/db/postComment.php" method="post" style="display: none;" onsubmit="return addNewComment();"> + <fieldset> + <input type="hidden" name="ajax" value="0" /> + <input type="hidden" name="image_id"> + <xsl:attribute name="value"><xsl:value-of select="@id" /></xsl:attribute> + </input> + <label> + <span>Name: </span> + <input type="text" name="user_name"/> + </label> + + <label> + <span>E-mail: </span> + <input type="text" name="user_email"/> + </label> + + <label> + <span>Web: </span> + <input type="text" name="user_web"/> + </label> + + <label> + <span>Comment: </span> + <textarea cols="50" rows="3" name="user_comment"/> + </label> + + <button type="submit">Submit</button> + </fieldset> + </form> +</div> </div> <xsl:if test="count(comment) > 0"> @@ -350,7 +384,9 @@ </xsl:choose> </span> <span class="commenttext"> - <xsl:value-of select="comment_text" /> + <xsl:call-template name="nl2br"> + <xsl:with-param name="contents" select="comment_text" /> + </xsl:call-template> </span> <span class="rating"> <xsl:value-of select="rating" /> @@ -381,4 +417,20 @@ </xsl:choose> </xsl:template> + <xsl:template name="nl2br"> + <xsl:param name="contents" /> + <xsl:choose> + <xsl:when test="contains($contents, ' ')"> + <xsl:value-of select="substring-before($contents, ' ')" /> + <br /> + <xsl:call-template name="nl2br"> + <xsl:with-param name="contents" select="substring-after($contents, ' ')" /> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$contents" /> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + </xsl:stylesheet> Modified: trunk/.themes/db/getcomments.php =================================================================== --- trunk/.themes/db/getcomments.php 2007-08-25 14:55:36 UTC (rev 57) +++ trunk/.themes/db/getcomments.php 2007-08-25 15:04:21 UTC (rev 58) @@ -26,12 +26,12 @@ while ($row = mysql_fetch_assoc($result)) { $comments_xml .= "<comment>" - . "<name>$row[user_name]</name>" - . "<www>$row[user_www]</www>" - . "<email>$row[user_email]</email>" - . "<comment_text>$row[user_comment]</comment_text>" - . "<rating>$row[comment_rating]</rating>" - . "<added>$row[date_added]</added>" + . "<name>".stripslashes($row['user_name'])."</name>" + . "<www>".stripslashes($row['user_www'])."</www>" + . "<email>".stripslashes($row['user_email'])."</email>" + . "<comment_text>".stripslashes($row['user_comment'])."</comment_text>" + . "<rating>".stripslashes($row['comment_rating'])."</rating>" + . "<added>".stripslashes($row['date_added'])."</added>" . "</comment>"; } $comments_xml .= "</comments>"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-01 18:00:45
|
Revision: 63 http://picfinity.svn.sourceforge.net/picfinity/?rev=63&view=rev Author: espadav8 Date: 2007-09-01 11:00:46 -0700 (Sat, 01 Sep 2007) Log Message: ----------- Forgot to set the button type to 'button' for browsers that support it Modified Paths: -------------- trunk/.themes/db/db.js Modified: trunk/.themes/db/db.js =================================================================== --- trunk/.themes/db/db.js 2007-09-01 17:59:43 UTC (rev 62) +++ trunk/.themes/db/db.js 2007-09-01 18:00:46 UTC (rev 63) @@ -444,7 +444,7 @@ var emailLabel = createFormInput("text", "user_email", "Email:"); var webLabel = createFormInput("text", "user_web", "Web:"); var commentLabel = createFormTextarea("user_comment", "Comment:"); - var submitButton = createFormButton("submit", "Submit"); + var submitButton = createFormButton("button", "Submit"); submitButton.onclick = addNewComment; commentFormFieldset.appendChild(ajaxInput); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-01 17:59:42
|
Revision: 62 http://picfinity.svn.sourceforge.net/picfinity/?rev=62&view=rev Author: espadav8 Date: 2007-09-01 10:59:43 -0700 (Sat, 01 Sep 2007) Log Message: ----------- Allow createFormInput to create other input types by passing in the type required In IE use the IE-only way to set the name of the form inputs Since IE doesn't allow buttons to set the type in JS, the button now has an onclick instead which runs the addNewComment function Remove the form action and onsubmit from the JS since it's not needed now Modified Paths: -------------- trunk/.themes/db/db.js Modified: trunk/.themes/db/db.js =================================================================== --- trunk/.themes/db/db.js 2007-09-01 16:16:32 UTC (rev 61) +++ trunk/.themes/db/db.js 2007-09-01 17:59:43 UTC (rev 62) @@ -433,27 +433,19 @@ addCommentSpan.appendChild(addCommentAnchor); var commentForm = document.createElement("form"); - commentForm.onsubmit = addNewComment; - commentForm.action = ".themes/db/addComment.php"; commentForm.style.display = "none"; var commentFormFieldset = document.createElement("fieldset"); - var ajaxInput = document.createElement("input"); - ajaxInput.type = "hidden"; - ajaxInput.value = "0"; - ajaxInput.name = "ajax"; + var ajaxInput = createFormInput("hidden", "ajax", "0"); + var imageIDInput = createFormInput("hidden", "image_id", imageID); - var imageIDInput = document.createElement("input"); - imageIDInput.type = "hidden"; - imageIDInput.value = imageID; - imageIDInput.name = "image_id"; - - var nameLabel = createFormInput("user_name", "Name:"); - var emailLabel = createFormInput("user_email", "Email:"); - var webLabel = createFormInput("user_web", "Web:"); + var nameLabel = createFormInput("text", "user_name", "Name:"); + var emailLabel = createFormInput("text", "user_email", "Email:"); + var webLabel = createFormInput("text", "user_web", "Web:"); var commentLabel = createFormTextarea("user_comment", "Comment:"); var submitButton = createFormButton("submit", "Submit"); + submitButton.onclick = addNewComment; commentFormFieldset.appendChild(ajaxInput); commentFormFieldset.appendChild(imageIDInput); @@ -471,20 +463,45 @@ return commentFormDiv; } -function createFormInput(inputName, spanText) +function createFormInput(inputType, inputName, spanText) { - var tmpLabel = document.createElement("label"); - var tmpSpan = document.createElement("span"); - tmpSpan.appendChild(document.createTextNode(spanText)); - var tmpInput = document.createElement("input"); - tmpInput.type = "text"; - tmpInput.value = ""; - tmpInput.name = inputName; + if (inputType == "hidden") + { + if (document.all) + { + var tmpInput = document.createElement("<input name=\"" + inputName + "\">"); + } + else + { + var tmpInput = document.createElement("input"); + tmpInput.name = inputName; + } + tmpInput.type = inputType; + tmpInput.value = spanText; - tmpLabel.appendChild(tmpSpan); - tmpLabel.appendChild(tmpInput); + return tmpInput; + } + else + { + var tmpLabel = document.createElement("label"); + var tmpSpan = document.createElement("span"); + tmpSpan.appendChild(document.createTextNode(spanText)); + if (document.all) + { + var tmpInput = document.createElement("<input name=\"" + inputName + "\">"); + } + else + { + var tmpInput = document.createElement("input"); + tmpInput.name = inputName; + } + tmpInput.type = inputType; + tmpInput.value = ""; - return tmpLabel; + tmpLabel.appendChild(tmpSpan); + tmpLabel.appendChild(tmpInput); + return tmpLabel; + } } function createFormTextarea(textareaName, spanText) @@ -492,8 +509,15 @@ var tmpLabel = document.createElement("label"); var tmpSpan = document.createElement("span"); tmpSpan.appendChild(document.createTextNode(spanText)); - var tmpTextarea = document.createElement("textarea"); - tmpTextarea.name = textareaName; + if (document.all) + { + var tmpTextarea = document.createElement("<textarea name=\"" + textareaName + "\">"); + } + else + { + var tmpTextarea = document.createElement("textarea"); + tmpTextarea.name = textareaName; + } tmpTextarea.rows = 3; tmpTextarea.cols = 50; @@ -863,7 +887,6 @@ function addNewComment() { - alert("Adding a comment"); if (window.XMLHttpRequest) { var commentForm = document.getElementById("commentform").getElementsByTagName("form")[0]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-09-01 16:16:32
|
Revision: 61 http://picfinity.svn.sourceforge.net/picfinity/?rev=61&view=rev Author: espadav8 Date: 2007-09-01 09:16:32 -0700 (Sat, 01 Sep 2007) Log Message: ----------- Set the correct action for the comments form Only set up the comments div if there are comments returned Use .firstChild.nodeValue instead if .textContent since IE doesn't support that If the comments div already exists then replace it (used to reload the comments when a new one has been posted) Modified Paths: -------------- trunk/.themes/db/db.js Modified: trunk/.themes/db/db.js =================================================================== --- trunk/.themes/db/db.js 2007-08-26 11:16:59 UTC (rev 60) +++ trunk/.themes/db/db.js 2007-09-01 16:16:32 UTC (rev 61) @@ -434,7 +434,7 @@ var commentForm = document.createElement("form"); commentForm.onsubmit = addNewComment; - commentForm.action = ".themes/db/postComment.php"; + commentForm.action = ".themes/db/addComment.php"; commentForm.style.display = "none"; var commentFormFieldset = document.createElement("fieldset"); @@ -746,7 +746,7 @@ } } xmlHttp.open("GET", ".themes/db/getcomments.php?md5=" + imageID, true); - xmlHttp.send(null) + xmlHttp.send(null); } } @@ -759,85 +759,88 @@ { var comments = xmlHttp.responseXML.documentElement; - var commentsDiv = document.createElement("div"); - commentsDiv.setAttribute("id", "comments"); - - for (var i = 0; i < comments.childNodes.length; i++) + if (comments.childNodes.length > 0) { - var currentComment = comments.childNodes[i]; + var commentsDiv = document.createElement("div"); + commentsDiv.setAttribute("id", "comments"); - var comment = document.createElement("div"); - comment.className = "comment"; - if (i % 2) comment.className += " odd"; + for (var i = 0; i < comments.childNodes.length; i++) + { + var currentComment = comments.childNodes[i]; - var commentOwner = document.createElement("span"); - commentOwner.className = "name"; - var commentOwnerAnchor = document.createElement("a"); - commentOwner.appendChild(commentOwnerAnchor); + var comment = document.createElement("div"); + comment.className = "comment"; + if (i % 2) comment.className += " odd"; - var commentOwnerWeb = document.createElement("span"); - commentOwnerWeb.className = "web"; - var commentOwnerWebAnchor = document.createElement("a"); - commentOwnerWeb.appendChild(commentOwnerWebAnchor); + var commentOwner = document.createElement("span"); + commentOwner.className = "name"; + var commentOwnerAnchor = document.createElement("a"); + commentOwner.appendChild(commentOwnerAnchor); - var commentRating = document.createElement("span"); - commentRating.className = "rating"; + var commentOwnerWeb = document.createElement("span"); + commentOwnerWeb.className = "web"; + var commentOwnerWebAnchor = document.createElement("a"); + commentOwnerWeb.appendChild(commentOwnerWebAnchor); - var commentContents = document.createElement("span"); - commentContents.className = "commenttext"; + var commentRating = document.createElement("span"); + commentRating.className = "rating"; - var commentDate = document.createElement("span"); - commentDate.className = "date"; + var commentContents = document.createElement("span"); + commentContents.className = "commenttext"; - for (var j = 0; j < currentComment.childNodes.length; j++) - { - var currentNodeName = currentComment.childNodes[j].nodeName; - var currentNodeValue = currentComment.childNodes[j].textContent; + var commentDate = document.createElement("span"); + commentDate.className = "date"; - if (currentNodeName == "name") + for (var j = 0; j < currentComment.childNodes.length; j++) { - commentOwnerAnchor.appendChild(document.createTextNode(currentNodeValue)); + var currentNodeName = currentComment.childNodes[j].nodeName; + var currentNodeValue = currentComment.childNodes[j].firstChild.nodeValue; + + if (currentNodeName == "name") + { + commentOwnerAnchor.appendChild(document.createTextNode(currentNodeValue)); + } + else if (currentNodeName == "www") + { + commentOwnerWebAnchor.appendChild(document.createTextNode(currentNodeValue)); + commentOwnerWebAnchor.setAttribute("href", "http://" + currentNodeValue); + } + else if (currentNodeName == "email") + { + commentOwnerAnchor.setAttribute("href", "mailto:" + currentNodeValue); + } + else if (currentNodeName == "rating") + { + commentRating.appendChild(document.createTextNode(currentNodeValue)); + } + else if (currentNodeName == "comment_text") + { + commentContents.appendChild(document.createTextNode(currentNodeValue)); + } + else if (currentNodeName == "added") + { + commentDate.appendChild(document.createTextNode(currentNodeValue)); + } } - else if (currentNodeName == "www") - { - commentOwnerWebAnchor.appendChild(document.createTextNode(currentNodeValue)); - commentOwnerWebAnchor.setAttribute("href", "http://" + currentNodeValue); - } - else if (currentNodeName == "email") - { - commentOwnerAnchor.setAttribute("href", "mailto:" + currentNodeValue); - } - else if (currentNodeName == "rating") - { - commentRating.appendChild(document.createTextNode(currentNodeValue)); - } - else if (currentNodeName == "comment_text") - { - commentContents.appendChild(document.createTextNode(currentNodeValue)); - } - else if (currentNodeName == "added") - { - commentDate.appendChild(document.createTextNode(currentNodeValue)); - } - } - comment.appendChild(commentDate); - comment.appendChild(commentOwner); - comment.appendChild(commentOwnerWeb); - comment.appendChild(commentContents); - comment.appendChild(commentRating); + comment.appendChild(commentDate); + comment.appendChild(commentOwner); + comment.appendChild(commentOwnerWeb); + comment.appendChild(commentContents); + comment.appendChild(commentRating); - commentsDiv.appendChild(comment); - } + commentsDiv.appendChild(comment); + } - if (document.getElementById("comments")) - { - document.getElementById("comments").parentNode.replaceChild(commentsDiv, document.getElementById("comments")); + if (document.getElementById("comments")) + { + document.getElementById("comments").parentNode.replaceChild(commentsDiv, document.getElementById("comments")); + } + else + { + document.getElementById("expandedimage").parentNode.insertBefore(commentsDiv, document.getElementById("expandedimage").nextSibling); + } } - else - { - document.getElementById("expandedimage").parentNode.insertBefore(commentsDiv, document.getElementById("expandedimage").nextSibling); - } } function toggleCommentsForm() @@ -860,6 +863,7 @@ function addNewComment() { + alert("Adding a comment"); if (window.XMLHttpRequest) { var commentForm = document.getElementById("commentform").getElementsByTagName("form")[0]; @@ -875,7 +879,6 @@ xmlHttp.open("POST", ".themes/db/addComment.php", true); xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); - xmlHttp.setRequestHeader("Content-length", postData.length); xmlHttp.setRequestHeader("Connection", "close"); xmlHttp.onreadystatechange = function() { @@ -887,10 +890,7 @@ xmlHttp.send(postData); return false; } - else - { - return true; - } + return true; } function checkAddedCommentReply(imageID) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-27 20:02:29
|
Revision: 59 http://picfinity.svn.sourceforge.net/picfinity/?rev=59&view=rev Author: espadav8 Date: 2007-08-25 08:31:09 -0700 (Sat, 25 Aug 2007) Log Message: ----------- Tagging the 0.10 release Added Paths: ----------- tags/0.10/ Copied: tags/0.10 (from rev 58, trunk) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-27 16:30:10
|
Revision: 57 http://picfinity.svn.sourceforge.net/picfinity/?rev=57&view=rev Author: espadav8 Date: 2007-08-25 07:55:36 -0700 (Sat, 25 Aug 2007) Log Message: ----------- Make some possible inputs safe Modified Paths: -------------- trunk/index.php Modified: trunk/index.php =================================================================== --- trunk/index.php 2007-08-25 10:27:14 UTC (rev 56) +++ trunk/index.php 2007-08-25 14:55:36 UTC (rev 57) @@ -131,7 +131,7 @@ // create the XML if ($name == "") - $folder_layout_xml = "<?xml version=\"1.0\"?>\n" + $folder_layout_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" . "<!DOCTYPE layout PUBLIC \"-//picfinity//Gallery Layout//EN\" \"http://www.espadav8.co.uk/gallery/gallery.dtd\">\n" . "<layout id=\"$folder_id\" name=\"\">\n"; else @@ -189,7 +189,7 @@ add_image_to_db($image_id); } - if (($use_db) && ($image_id == $post_id)) + if (($use_db) && ($image_id === $post_id)) { $folder_layout_xml .= "\t<image id=\"$image_id\" file=\"$folder_entry\">\n" . get_comments($image_id) @@ -242,14 +242,14 @@ { while ($row = mysql_fetch_assoc($result)) { - $comments_xml .= "<comment>" - . "<name>$row[user_name]</name>" - . "<www>$row[user_www]</www>" - . "<email>$row[user_email]</email>" - . "<comment_text>$row[user_comment]</comment_text>" - . "<rating>$row[comment_rating]</rating>" - . "<added>$row[date_added]</added>" - . "</comment>"; + $comments_xml .= "<comment>\n" + . "<name>$row[user_name]</name>\n" + . "<www>$row[user_www]</www>\n" + . "<email>$row[user_email]</email>\n" + . "<comment_text>".htmlspecialchars($row['user_comment'])."</comment_text>\n" + . "<rating>$row[comment_rating]</rating>\n" + . "<added>$row[date_added]</added>\n" + . "</comment>\n"; } return $comments_xml; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-26 11:16:56
|
Revision: 60 http://picfinity.svn.sourceforge.net/picfinity/?rev=60&view=rev Author: espadav8 Date: 2007-08-26 04:16:59 -0700 (Sun, 26 Aug 2007) Log Message: ----------- Use setAttribute for the buttons type, fixes a bug in Opera Remove a few unneeded vars When closing an image, only try and remove the comments if they exist Don't give focus to the first input on the form since it's a hidden input Modified Paths: -------------- trunk/.themes/db/db.js Modified: trunk/.themes/db/db.js =================================================================== --- trunk/.themes/db/db.js 2007-08-25 15:31:09 UTC (rev 59) +++ trunk/.themes/db/db.js 2007-08-26 11:16:59 UTC (rev 60) @@ -415,6 +415,7 @@ expandedImage.src = imageThumbPath; return expandedImageDiv; + } function createCommentForm(imageID) @@ -506,7 +507,7 @@ { var tmpButton = document.createElement("button"); tmpButton.appendChild(document.createTextNode(buttonText)); - tmpButton.type = buttonType; + tmpButton.setAttribute("type", buttonType); return tmpButton; } @@ -684,12 +685,8 @@ function showImage(imageID) { - var siblingNodes = getChildNodesByTagName(getLayoutNode(imageID).parentNode, "image"); - var expandedImage = createExpandedImage(getLayoutNode(imageID)); - // var imageComments = createComments(siblingNodes[i]); - if (document.getElementById("expandedimage")) { document.getElementById("expandedimage").parentNode.replaceChild(expandedImage, document.getElementById("expandedimage")); @@ -701,7 +698,9 @@ // remove the old comments if (document.getElementById("comments")) + { document.getElementById("comments").parentNode.removeChild(document.getElementById("comments")); + } getCommentsXML(imageID); @@ -717,13 +716,21 @@ function closeImage() { - document.getElementById("expandedimage").parentNode.removeChild(document.getElementById("expandedimage")); - document.getElementById("comments").parentNode.removeChild(document.getElementById("comments")); + if (document.getElementById("expandedimage")) + { + document.getElementById("expandedimage").parentNode.removeChild(document.getElementById("expandedimage")); + } + if (document.getElementById("comments")) + { + document.getElementById("comments").parentNode.removeChild(document.getElementById("comments")); + } var lastSelectedImage = getElementsByClassName("selected", "div", document); if (lastSelectedImage) + { lastSelectedImage[0].className = "thumbnail"; + } } function getCommentsXML(imageID) @@ -731,7 +738,7 @@ if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); - xmlHttp.onprogress = commentsProgress; + // xmlHttp.onprogress = commentsProgress; xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) { @@ -842,7 +849,6 @@ else { commentForm.style.display = ""; - commentForm.getElementsByTagName("input")[0].focus(); } } @@ -940,4 +946,4 @@ ((path) ? ';path=' + path : '') + ((domain) ? ';domain=' + domain : '') + ';expires=Thu, 01-Jan-1970 00:00:01 GMT'; -} \ No newline at end of file +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-26 11:14:07
|
Revision: 55 http://picfinity.svn.sourceforge.net/picfinity/?rev=55&view=rev Author: espadav8 Date: 2007-08-25 03:06:01 -0700 (Sat, 25 Aug 2007) Log Message: ----------- Show the comments for an image if any are passed in Modified Paths: -------------- trunk/.themes/db/db.xsl Modified: trunk/.themes/db/db.xsl =================================================================== --- trunk/.themes/db/db.xsl 2007-08-25 10:04:59 UTC (rev 54) +++ trunk/.themes/db/db.xsl 2007-08-25 10:06:01 UTC (rev 55) @@ -284,11 +284,6 @@ <a> <xsl:attribute name="href">index.php?id=<xsl:value-of select="@id" /></xsl:attribute> <xsl:text>Link to this image</xsl:text> -<!-- - <img alt="Link to this image"> - <xsl:attribute name="src"><xsl:value-of select="concat('.themes/', $themename, '/link.png')" /></xsl:attribute> - </img> ---> </a> </div> <div id="expandedimagespan"> @@ -302,6 +297,12 @@ <div class="name"><xsl:value-of select="@file" /></div> </div> + <xsl:if test="count(comment) > 0"> + <div id="comments"> + <xsl:apply-templates select="comment" /> + </div> + </xsl:if> + <div id="selectedalbum"> <xsl:apply-templates select="parent::*/folder" /> <xsl:apply-templates select="parent::*/image"> @@ -312,6 +313,51 @@ </div> </xsl:template> + <xsl:template match="comment"> + <div class="comment"> + <xsl:choose> + <xsl:when test="position() mod 2 = 0"> + <xsl:attribute name="class">comment odd</xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="class">comment</xsl:attribute> + </xsl:otherwise> + </xsl:choose> + <span class="date"><xsl:value-of select="added" /></span> + <span class="name"> + <xsl:choose> + <xsl:when test="email != ''"> + <a> + <xsl:attribute name="href">mailto:<xsl:value-of select="email" /></xsl:attribute> + <xsl:value-of select="name" /> + </a> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="user_name" /> + </xsl:otherwise> + </xsl:choose> + </span> + <span class="web"> + <xsl:choose> + <xsl:when test="www != ''"> + <a> + <xsl:attribute name="href">http://<xsl:value-of select="www" /></xsl:attribute> + <xsl:value-of select="www" /> + </a> + </xsl:when> + <xsl:otherwise> + </xsl:otherwise> + </xsl:choose> + </span> + <span class="commenttext"> + <xsl:value-of select="comment_text" /> + </span> + <span class="rating"> + <xsl:value-of select="rating" /> + </span> + </div> + </xsl:template> + <xsl:template match="folder" mode="getpath"> <xsl:value-of select="concat(@name, '/')" /> </xsl:template> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-26 11:13:34
|
Revision: 54 http://picfinity.svn.sourceforge.net/picfinity/?rev=54&view=rev Author: espadav8 Date: 2007-08-25 03:04:59 -0700 (Sat, 25 Aug 2007) Log Message: ----------- Remove the use of a PEAR module to create the XML, it complicated things more than needed Add any comments to the image xml if an id was passed in Update the dtd to show this (and correct an error with the themes entry) Modified Paths: -------------- trunk/gallery.dtd trunk/index.php Modified: trunk/gallery.dtd =================================================================== --- trunk/gallery.dtd 2007-08-19 11:55:45 UTC (rev 53) +++ trunk/gallery.dtd 2007-08-25 10:04:59 UTC (rev 54) @@ -1,9 +1,17 @@ -<!ELEMENT layout (themes,folder*)> +<!ELEMENT layout (themes?,folder*)> <!ELEMENT folder (folder*,image*)> <!ELEMENT themes (theme*)> -<!ELEMENT image EMPTY> +<!ELEMENT image (comment*)> <!ELEMENT theme EMPTY> +<!ELEMENT comment (name,www,email,comment_text,rating,added)> +<!ELEMENT name (#CDATA)> +<!ELEMENT www (#CDATA)> +<!ELEMENT email (#CDATA)> +<!ELEMENT comment_text (#CDATA)> +<!ELEMENT rating (#CDATA)> +<!ELEMENT added (#CDATA)> + <!ATTLIST layout id ID #IMPLIED> <!ATTLIST layout name CDATA #REQUIRED> @@ -17,4 +25,4 @@ <!ATTLIST theme name CDATA #REQUIRED> <!ATTLIST image id ID #IMPLIED> -<!ATTLIST image file CDATA #REQUIRED> \ No newline at end of file +<!ATTLIST image file CDATA #REQUIRED> Modified: trunk/index.php =================================================================== --- trunk/index.php 2007-08-19 11:55:45 UTC (rev 53) +++ trunk/index.php 2007-08-25 10:04:59 UTC (rev 54) @@ -38,9 +38,6 @@ // create the gallery.xml file (for use by themes $create_xml = true; - // use the PEAR module to create the XML - $use_pear = false; - // Allow the users to change the theme // this needs the PHP version of the page $enable_themes = true; @@ -91,25 +88,18 @@ $valid_image_formats = array('png', 'gif', 'jpg', 'jpeg', 'bmp'); // get the layout of the current dir - $site_layout = create_folder_layout('.'); + $site_layout_xml = create_folder_layout('.'); - // create the XML of the layout - // if we're not using the PEAR module then the XML will have already been returned - if ($use_pear) - $xml = array_to_xml($site_layout); - else - $xml = $site_layout; - // create the XML file if we've been told to if ($create_xml) { $fh = fopen("gallery.xml", "w"); - fwrite($fh, $xml); + fwrite($fh, $site_layout_xml); fclose($fh); } // pass the XML to the theme and get the HTML back - $html = xml_to_xhtml($xml, ".themes/$theme/$theme.xsl", array('title' => $site_name, 'post_id' => $post_id)); + $html = xml_to_xhtml($site_layout_xml, ".themes/$theme/$theme.xsl", array('title' => $site_name, 'post_id' => $post_id)); // create the flat version if we need to if ($create_html) @@ -127,10 +117,11 @@ // echo the HTML to the screen echo $html; + // this function takes a folder path and creates a layout of the folder and sub folders function create_folder_layout($folder) { - global $valid_image_formats, $create_thumbnails, $use_pear, $enable_themes, $use_db, $current_images; + global $valid_image_formats, $create_thumbnails, $enable_themes, $use_db, $current_images, $post_id; // get the name of the folder or '' if it's the root $name = substr($folder, strrpos($folder, '/') + 1); @@ -138,15 +129,10 @@ // create a folder ID $folder_id = "id" . md5($folder); - // add the folder to the Array (for use by the PEAR route) - $layout = array('name' => $name, 'id' => $folder_id); - - // create the non-PEAR XML + // create the XML if ($name == "") - $folder_layout_xml = "<?xml version=\"1.0\"?>" - . "\n" - . "<!DOCTYPE layout PUBLIC \"-//picfinity//Gallery Layout//EN\" \"http://www.espadav8.co.uk/gallery/gallery.dtd\">" - . "\n" + $folder_layout_xml = "<?xml version=\"1.0\"?>\n" + . "<!DOCTYPE layout PUBLIC \"-//picfinity//Gallery Layout//EN\" \"http://www.espadav8.co.uk/gallery/gallery.dtd\">\n" . "<layout id=\"$folder_id\" name=\"\">\n"; else $folder_layout_xml = "<folder id=\"$folder_id\" name=\"$name\">\n"; @@ -162,15 +148,12 @@ // for each entry while (list(,$folder_entry) = each($folder_contents)) { - // if it's a folder and the path of it is ./.themes then create the list of themes + // if it's a folder and the path of it is ./.themes then create the list of themes if ((($folder . '/' . $folder_entry) == "./.themes") && (is_dir('./themes')) && $enable_themes) { - if ($use_pear) - $layout['themes'] = create_themes_layout(); - else - $folder_layout_xml .= create_themes_layout(); + $folder_layout_xml .= create_themes_layout(); } // else if it starts with a . ignore it @@ -183,10 +166,7 @@ else if (is_dir($folder . '/' . $folder_entry)) { // get a list of it's files and check/create thumbnail(s) - if ($use_pear) - $layout['folder'][] = create_folder_layout($folder . '/' . $folder_entry); - else - $folder_layout_xml .= create_folder_layout($folder . '/' . $folder_entry); + $folder_layout_xml .= create_folder_layout($folder . '/' . $folder_entry); } // otherwise check to see if it's an image @@ -201,45 +181,96 @@ { create_thumbnail($folder, $folder_entry, $ext); } + $image_id = "id" . md5($folder . '/' . $folder_entry); - $layout['image'][] = array('id' => $image_id, 'file' => $folder_entry); - $folder_layout_xml .= "\t<image id=\"$image_id\" file=\"$folder_entry\" />\n"; - if (($use_db) && (!in_array($image_id, $current_images))) + if (!in_array($image_id, $current_images)) { - $query = "INSERT INTO images (image_md5) VALUES ('$image_id')"; - $result = mysql_query($query); - if (!$result) - { - die (mysql_error()); - } + add_image_to_db($image_id); } + + if (($use_db) && ($image_id == $post_id)) + { + $folder_layout_xml .= "\t<image id=\"$image_id\" file=\"$folder_entry\">\n" + . get_comments($image_id) + . "\t</image>\n"; + } + else + { + $folder_layout_xml .= "\t<image id=\"$image_id\" file=\"$folder_entry\" />\n"; + } } } } - // close up the hand-coded XML + // close up the XML if ($name == "") $folder_layout_xml .= "</layout>\n"; else $folder_layout_xml .= "</folder>\n"; - // return the correct layout (XML or Array) - if ($use_pear) return $layout; - else return $folder_layout_xml; + // return the XML + return $folder_layout_xml; } - function create_themes_layout() + function add_image_to_db($image_id) { - global $use_pear; + $query = "INSERT INTO images (image_md5) VALUES ('$image_id')"; + $result = mysql_query($query); + if (!$result) + { + // die (mysql_error()); + } + } + function get_comments($image_id) + { + $query = " + SELECT user_name + , user_www + , user_email + , user_comment + , comment_rating + , date_added + FROM comments + INNER JOIN images + WHERE images.image_id = comments.image_id + AND images.image_md5 = '$image_id' + ORDER BY date_added DESC"; + + $result = mysql_query($query); + + if (mysql_num_rows($result) > 0) + { + while ($row = mysql_fetch_assoc($result)) + { + $comments_xml .= "<comment>" + . "<name>$row[user_name]</name>" + . "<www>$row[user_www]</www>" + . "<email>$row[user_email]</email>" + . "<comment_text>$row[user_comment]</comment_text>" + . "<rating>$row[comment_rating]</rating>" + . "<added>$row[date_added]</added>" + . "</comment>"; + } + + return $comments_xml; + } + else + { + return ""; + } + } + + function create_themes_layout() + { $themes_id = "id" . md5(".themes"); // create the themes node - $layout = array('name' => '.themes', 'id' => $themes_id); $theme_xml = "<themes id=\"$themes_id\" name=\".themes\">\n"; // get the themes $dh = opendir(".themes"); - while (false !== ($filename = readdir($dh))) { + while (false !== ($filename = readdir($dh))) + { $folder_contents[] = $filename; } @@ -257,15 +288,13 @@ else if (is_dir(".themes/" . $folder_entry)) { $theme_id = md5(".themes/" . $folder_entry); - $layout['theme'][] = array('name' => $folder_entry, 'id' => $theme_id); $theme_xml .= "\t<theme id=\"$theme_id\" name=\"$folder_entry\" />\n"; } } $theme_xml .= "</themes>\n"; - if ($use_pear) return $layout; - else return $theme_xml; + return $theme_xml; } function create_thumbnail($folder, $image, $ext) @@ -303,15 +332,18 @@ $old_x = imageSX($src_img); $old_y = imageSY($src_img); - if ($old_x > $old_y) { + if ($old_x > $old_y) + { $thumb_w = $thumbnail_width; $thumb_h = $old_y * ($thumbnail_height/$old_x); } - else if ($old_x < $old_y) { + else if ($old_x < $old_y) + { $thumb_w = $old_x * ($thumbnail_width/$old_y); $thumb_h = $thumbnail_height; } - else if ($old_x == $old_y) { + else if ($old_x == $old_y) + { $thumb_w = $thumbnail_width; $thumb_h = $thumbnail_height; } @@ -342,45 +374,6 @@ return; } - function array_to_xml(&$array, $tag_name = 'image', $headless = false) - { - error_reporting(E_ALL ^ E_NOTICE); - - // Include XML_Serializer - require_once 'XML/Serializer.php'; - - // An array of serializer options - $serializer_options = array ( - 'addDecl' => !$headless, - 'addDoctype' => true, - 'encoding' => 'ISO-8859-1', - 'indent' => ' ', - 'indentAttributes' => '_auto', - 'rootName' => 'layout', - 'defaultTagName' => $tag_name, - 'mode' => 'simplexml', - 'scalarAsAttributes' => true, - 'doctype' => array ( - 'id' => '-//picfinity//Gallery Layout//EN', - 'uri' => 'http://www.espadav8.co.uk/gallery/gallery.dtd' - ) - ); - - // Instantiate the serializer with the options - $Serializer = &new XML_Serializer($serializer_options); - - // Serialize the data structure - $status = $Serializer->serialize($array); - - // Check whether serialization worked - if (PEAR::isError($status)) { - die($status->getMessage()); - } - - // return the XML document - return $Serializer->getSerializedData(); - } - function xml_to_xhtml($xml, $xsl_file, $params = array()) { $ver = explode( '.', PHP_VERSION ); @@ -390,7 +383,7 @@ { $arguments = array('/_xml' => $xml); $xsltproc = xslt_create(); - $html = xslt_process($xsltproc, 'arg:/_xml', $xsl_file, NULL, $arguments); + $html = xslt_process($xsltproc, 'arg:/_xml', $xsl_file, NULL, $arguments); if (empty($html)) { die('XSLT processing error: '. xslt_error($xsltproc)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-26 11:10:31
|
Revision: 56 http://picfinity.svn.sourceforge.net/picfinity/?rev=56&view=rev Author: espadav8 Date: 2007-08-25 03:27:14 -0700 (Sat, 25 Aug 2007) Log Message: ----------- XML DTD wasn't correct, XML now validates Modified Paths: -------------- trunk/gallery.dtd Modified: trunk/gallery.dtd =================================================================== --- trunk/gallery.dtd 2007-08-25 10:06:01 UTC (rev 55) +++ trunk/gallery.dtd 2007-08-25 10:27:14 UTC (rev 56) @@ -1,28 +1,27 @@ -<!ELEMENT layout (themes?,folder*)> -<!ELEMENT folder (folder*,image*)> -<!ELEMENT themes (theme*)> -<!ELEMENT image (comment*)> -<!ELEMENT theme EMPTY> +<!ELEMENT layout (themes?,folder*)> +<!ELEMENT folder (folder*,image*)> +<!ELEMENT themes (theme*)> +<!ELEMENT image (comment*,#PCDATA)> +<!ELEMENT theme EMPTY> +<!ELEMENT comment (name,www,email,comment_text,rating,added)> +<!ELEMENT name (#PCDATA)> +<!ELEMENT www (#PCDATA)> +<!ELEMENT email (#PCDATA)> +<!ELEMENT comment_text (#PCDATA)> +<!ELEMENT rating (#PCDATA)> +<!ELEMENT added (#PCDATA)> -<!ELEMENT comment (name,www,email,comment_text,rating,added)> -<!ELEMENT name (#CDATA)> -<!ELEMENT www (#CDATA)> -<!ELEMENT email (#CDATA)> -<!ELEMENT comment_text (#CDATA)> -<!ELEMENT rating (#CDATA)> -<!ELEMENT added (#CDATA)> +<!ATTLIST layout id ID #IMPLIED> +<!ATTLIST layout name CDATA #REQUIRED> -<!ATTLIST layout id ID #IMPLIED> -<!ATTLIST layout name CDATA #REQUIRED> +<!ATTLIST folder id ID #IMPLIED> +<!ATTLIST folder name CDATA #REQUIRED> -<!ATTLIST folder id ID #IMPLIED> -<!ATTLIST folder name CDATA #REQUIRED> +<!ATTLIST themes id ID #IMPLIED> +<!ATTLIST themes name CDATA #REQUIRED> -<!ATTLIST themes id ID #IMPLIED> -<!ATTLIST themes name CDATA #REQUIRED> +<!ATTLIST theme id ID #IMPLIED> +<!ATTLIST theme name CDATA #REQUIRED> -<!ATTLIST theme id ID #IMPLIED> -<!ATTLIST theme name CDATA #REQUIRED> - -<!ATTLIST image id ID #IMPLIED> -<!ATTLIST image file CDATA #REQUIRED> +<!ATTLIST image id ID #IMPLIED> +<!ATTLIST image file CDATA #REQUIRED> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-19 11:55:42
|
Revision: 53 http://picfinity.svn.sourceforge.net/picfinity/?rev=53&view=rev Author: espadav8 Date: 2007-08-19 04:55:45 -0700 (Sun, 19 Aug 2007) Log Message: ----------- Fix the comments box problem Modified Paths: -------------- trunk/.themes/db/db.css Modified: trunk/.themes/db/db.css =================================================================== --- trunk/.themes/db/db.css 2007-08-19 11:47:34 UTC (rev 52) +++ trunk/.themes/db/db.css 2007-08-19 11:55:45 UTC (rev 53) @@ -189,8 +189,6 @@ clear: both; } - - .comment .date, .comment .name, .comment .web @@ -216,7 +214,6 @@ { display: block; text-align: right; - float: right; clear: both; } @@ -225,5 +222,5 @@ { clear: both; float: left; - margin: 5px 0; + margin: 5px 0 0 0; } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-19 11:47:31
|
Revision: 52 http://picfinity.svn.sourceforge.net/picfinity/?rev=52&view=rev Author: espadav8 Date: 2007-08-19 04:47:34 -0700 (Sun, 19 Aug 2007) Log Message: ----------- Missed 2 CSS files Added Paths: ----------- trunk/.themes/db/borders.css trunk/.themes/db/colours.css Added: trunk/.themes/db/borders.css =================================================================== --- trunk/.themes/db/borders.css (rev 0) +++ trunk/.themes/db/borders.css 2007-08-19 11:47:34 UTC (rev 52) @@ -0,0 +1,31 @@ +*, +#breadcrumbtrail ul li ul li +{ + border: 0; +} + +.image a +{ + border-bottom: 1px solid #ccc; +} + +.folder, +.thumbnail, +#expandedimage, +#breadcrumbtrail ul li, +#breadcrumbtrail ul li ul, +.comment +{ + border: 1px solid #ccc; +} + +#expandedimagespan +{ + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +#loadingspan +{ + border-bottom: 1px solid #ccc; +} \ No newline at end of file Added: trunk/.themes/db/colours.css =================================================================== --- trunk/.themes/db/colours.css (rev 0) +++ trunk/.themes/db/colours.css 2007-08-19 11:47:34 UTC (rev 52) @@ -0,0 +1,60 @@ +/*** TEXT COLOURS ***/ +* +{ + color: #f0f0f0; +} + +h1, +h1 a +{ + color: #d0d0d0; +} + +.comment a, +.comment.odd .date, +.comment.odd .rating +{ + color: #c0c0c0; +} + +.comment.odd a, +.comment .date, +.comment .rating +{ + color: #000000; +} + + +/*** BACKGROUND COLOURS ***/ + +html, +.selected a, +#linktospan a:hover, +#breadcrumbtrail ul li a:hover, +#breadcrumbtrail ul li ul li.selected +{ + background-color: #303030; +} + +.folder, +.thumbnail, +.comment, +#expandedimage, +#breadcrumbtrail ul li +{ + background-color: #505050; +} + +#linktospan a, +.image a:hover, +.comment.odd, +#breadcrumbtrail ul li ul li a:hover +{ + background-color: #707070; +} + + +#loadingspan +{ + background-color: #cc0022; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-19 11:36:28
|
Revision: 51 http://picfinity.svn.sourceforge.net/picfinity/?rev=51&view=rev Author: espadav8 Date: 2007-08-19 04:36:32 -0700 (Sun, 19 Aug 2007) Log Message: ----------- Initial import of the SQL to create the database for the comments (likely to change) Added Paths: ----------- trunk/picfinity_db.sql Added: trunk/picfinity_db.sql =================================================================== --- trunk/picfinity_db.sql (rev 0) +++ trunk/picfinity_db.sql 2007-08-19 11:36:32 UTC (rev 51) @@ -0,0 +1,24 @@ +CREATE DATABASE IF NOT EXISTS picfinity; + +CREATE TABLE IF NOT EXISTS picfinity.images ( + image_id INT UNSIGNED NOT NULL AUTO_INCREMENT KEY, + image_md5 CHAR(34), + title CHAR(255), + description TEXT, + views INT UNSIGNED DEFAULT 0, + rating INT DEFAULT 0 +) ENGINE = InnoDB; + +CREATE TABLE IF NOT EXISTS picfinity.comments ( + comment_id INT UNSIGNED NOT NULL AUTO_INCREMENT KEY, + image_id INT UNSIGNED NOT NULL, + user_comment TEXT, + user_ip INT(15) NOT NULL DEFAULT 0, + user_name CHAR(255), + user_email CHAR(255), + user_www CHAR(255), + comment_rating INT DEFAULT 0, + approved TINYINT(1) DEFAULT 0, + date_added TIMESTAMP, + FOREIGN KEY (image_id) REFERENCES images(image_id) ON DELETE CASCADE + ) ENGINE = InnoDB; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-19 11:35:30
|
Revision: 50 http://picfinity.svn.sourceforge.net/picfinity/?rev=50&view=rev Author: espadav8 Date: 2007-08-19 04:35:33 -0700 (Sun, 19 Aug 2007) Log Message: ----------- Various updates to the new theme First workings of a comment system No way to add new comments yet though Modified Paths: -------------- trunk/.themes/db/db.css trunk/.themes/db/db.js trunk/.themes/db/getcomments.php Modified: trunk/.themes/db/db.css =================================================================== --- trunk/.themes/db/db.css 2007-08-18 20:36:55 UTC (rev 49) +++ trunk/.themes/db/db.css 2007-08-19 11:35:33 UTC (rev 50) @@ -1,3 +1,6 @@ +@import "colours.css"; +@import "borders.css"; + * { padding: 0; @@ -2,3 +5,2 @@ margin: 0; - border: 0; } @@ -25,11 +27,9 @@ { font-size: 1.2em; text-align: center; - color: #d0d0d0; } - /* --- ids --- */ #themes @@ -39,6 +39,13 @@ right: 10px; } + +#comments +{ + float: left; + clear: both; +} + #selectedalbum { margin-top: 5px; @@ -54,7 +61,6 @@ width: 100px; display: block; padding: 14px 25px; - border-bottom: 1px solid #ccc; } .folder, @@ -65,7 +71,6 @@ display: block; float: left; margin: 0 5px 5px 0; - border: 1px solid #ccc; position: relative; } @@ -86,7 +91,6 @@ #loadingspan, #linktospan a { - color: #f0f0f0; font-weight: bold; padding: 3px 0; text-align: center; @@ -112,7 +116,6 @@ #expandedimage { - border: 1px solid #ccc; float: left; clear: both; margin-top: 5px; @@ -120,15 +123,12 @@ #expandedimagespan { - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; padding: 5px; } #loadingspan { padding: 3px 5px; - border-bottom: 1px solid #ccc; } /* --- hover actions --- */ @@ -139,40 +139,6 @@ cursor: pointer; } - -/*** BACKGROUND ***/ - -html, -.selected a, -#linktospan a:hover, -#breadcrumbtrail ul li a:hover, -#breadcrumbtrail ul li ul li.selected -{ - background-color: #303030; -} - -.folder, -.thumbnail, -#expandedimage, -#breadcrumbtrail ul li -{ - background-color: #505050; -} - -#linktospan a, -.image a:hover, -#breadcrumbtrail ul li ul li a:hover -{ - background-color: #707070; -} - - -#loadingspan -{ - background-color: #cc0022; -} - - /*** BREADCRUMB TRAIL ***/ #breadcrumbtrail ul @@ -196,26 +162,68 @@ margin-right: 5px; float: left; width: 150px; - border: 1px solid #ccc; } + #breadcrumbtrail ul li ul { - border: 1px solid #ccc; left: -999em; position: absolute; width: 150px; z-index: 10; } +#breadcrumbtrail ul li.over ul, +#breadcrumbtrail ul li:hover ul +{ + left: auto; + margin-left: -1px; +} -#breadcrumbtrail ul li ul li + +/*** COMMENTS ***/ + +.comment { - border: none; + padding: 5px; + margin-top: 5px; + clear: both; } -#breadcrumbtrail ul li.over ul, -#breadcrumbtrail ul li:hover ul + + +.comment .date, +.comment .name, +.comment .web { - left: auto; - margin-left: -1px; + font-size: 0.8em; + float: left; + text-align: right; + font-weight: normal; + padding: 0; +} + +.comment .date +{ + float: right; +} + +.comment .web +{ + margin-left: 10px; +} + +.comment .rating +{ + display: block; + text-align: right; + float: right; + clear: both; +} + + +.comment .commenttext +{ + clear: both; + float: left; + margin: 5px 0; } \ No newline at end of file Modified: trunk/.themes/db/db.js =================================================================== --- trunk/.themes/db/db.js 2007-08-18 20:36:55 UTC (rev 49) +++ trunk/.themes/db/db.js 2007-08-19 11:35:33 UTC (rev 50) @@ -2,6 +2,7 @@ addEvent(window, 'load', IE6navhover, false); var xmlDoc; +var xmlHttp; function IE6navhover() { @@ -601,6 +602,12 @@ document.getElementById("selectedalbum").parentNode.insertBefore(expandedImage, document.getElementById("selectedalbum")); } + // remove the old comments + if (document.getElementById("comments")) + document.getElementById("comments").parentNode.removeChild(document.getElementById("comments")); + + getCommentsXML(imageID); + var lastSelectedImage = getElementsByClassName("selected", "div", document); if (lastSelectedImage) @@ -614,6 +621,7 @@ function closeImage() { document.getElementById("expandedimage").parentNode.removeChild(document.getElementById("expandedimage")); + document.getElementById("comments").parentNode.removeChild(document.getElementById("comments")); var lastSelectedImage = getElementsByClassName("selected", "div", document); @@ -621,10 +629,108 @@ lastSelectedImage[0].className = "thumbnail"; } +function getCommentsXML(imageID) +{ + if (window.XMLHttpRequest) + { + xmlHttp = new XMLHttpRequest(); + xmlHttp.onprogress = commentsProgress; + xmlHttp.onreadystatechange = function() { + if (xmlHttp.readyState == 4) + { + createCommentsSection(); + } + } + xmlHttp.open("GET", ".themes/db/getcomments.php?md5=" + imageID, true); + xmlHttp.send(null) + } +} +function commentsProgress(e) +{ +} +function createCommentsSection() +{ + var comments = xmlHttp.responseXML.documentElement; + var commentsDiv = document.createElement("div"); + commentsDiv.setAttribute("id", "comments"); + + for (var i = 0; i < comments.childNodes.length; i++) + { + var currentComment = comments.childNodes[i]; + + var comment = document.createElement("div"); + comment.className = "comment"; + if (i % 2) comment.className += " odd"; + + var commentOwner = document.createElement("span"); + commentOwner.className = "name"; + var commentOwnerAnchor = document.createElement("a"); + commentOwner.appendChild(commentOwnerAnchor); + + var commentOwnerWeb = document.createElement("span"); + commentOwnerWeb.className = "web"; + var commentOwnerWebAnchor = document.createElement("a"); + commentOwnerWeb.appendChild(commentOwnerWebAnchor); + + var commentRating = document.createElement("span"); + commentRating.className = "rating"; + + var commentContents = document.createElement("span"); + commentContents.className = "commenttext"; + + var commentDate = document.createElement("span"); + commentDate.className = "date"; + + for (var j = 0; j < currentComment.childNodes.length; j++) + { + var currentNodeName = currentComment.childNodes[j].nodeName; + var currentNodeValue = currentComment.childNodes[j].textContent; + + if (currentNodeName == "name") + { + commentOwnerAnchor.appendChild(document.createTextNode(currentNodeValue)); + } + else if (currentNodeName == "www") + { + commentOwnerWebAnchor.appendChild(document.createTextNode(currentNodeValue)); + commentOwnerWebAnchor.setAttribute("href", "http://" + currentNodeValue); + } + else if (currentNodeName == "email") + { + commentOwnerAnchor.setAttribute("href", "mailto:" + currentNodeValue); + } + else if (currentNodeName == "rating") + { + commentRating.appendChild(document.createTextNode(currentNodeValue)); + } + else if (currentNodeName == "comment_text") + { + commentContents.appendChild(document.createTextNode(currentNodeValue)); + } + else if (currentNodeName == "added") + { + commentDate.appendChild(document.createTextNode(currentNodeValue)); + } + } + + comment.appendChild(commentDate); + comment.appendChild(commentOwner); + comment.appendChild(commentOwnerWeb); + comment.appendChild(commentContents); + comment.appendChild(commentRating); + + commentsDiv.appendChild(comment); + } + + document.getElementById("expandedimage").parentNode.insertBefore(commentsDiv, document.getElementById("expandedimage").nextSibling); +} + + + function getCookie(name) { var start = document.cookie.indexOf( name + "=" ); var len = start + name.length + 1; Modified: trunk/.themes/db/getcomments.php =================================================================== --- trunk/.themes/db/getcomments.php 2007-08-18 20:36:55 UTC (rev 49) +++ trunk/.themes/db/getcomments.php 2007-08-19 11:35:33 UTC (rev 50) @@ -12,29 +12,35 @@ , date_added FROM comments INNER JOIN images - ON images.image_id - WHERE image_md5 = '$image_md5'"; + WHERE images.image_id = comments.image_id + AND images.image_md5 = '$image_md5' + ORDER BY date_added DESC"; $result = mysql_query($query); if ($result) { - $comments_xml = "<?xml version=\"1.0\"?>\n" + header('Content-Type: text/xml'); + $comments_xml = "<?xml version=\"1.0\"?>" . "<comments>"; while ($row = mysql_fetch_assoc($result)) { - $comments_xml .= " - <comment> - <name>$row[user_name]</name> - <www>$row[user_www]</www> - <email>$row[user_email]</email> - <comment_text>$row[user_comment]</comment_text> - <rating>$row[comment_rating]</rating> - <added>$row[date_added]</added> - </comment>"; + $comments_xml .= "<comment>" + . "<name>$row[user_name]</name>" + . "<www>$row[user_www]</www>" + . "<email>$row[user_email]</email>" + . "<comment_text>$row[user_comment]</comment_text>" + . "<rating>$row[comment_rating]</rating>" + . "<added>$row[date_added]</added>" + . "</comment>"; } - $comments_xml .= "\n</comments>\n"; + $comments_xml .= "</comments>"; echo $comments_xml; } + else + { + header('Content-Type: text/xml'); + echo "<error><message>Error in getting the results</message></error>"; + } ?> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-18 20:37:16
|
Revision: 49 http://picfinity.svn.sourceforge.net/picfinity/?rev=49&view=rev Author: espadav8 Date: 2007-08-18 13:36:55 -0700 (Sat, 18 Aug 2007) Log Message: ----------- Always one you forget Added Paths: ----------- trunk/.themes/db/db.css Removed Paths: ------------- trunk/.themes/db/ajax.css Deleted: trunk/.themes/db/ajax.css =================================================================== --- trunk/.themes/db/ajax.css 2007-08-18 20:35:54 UTC (rev 48) +++ trunk/.themes/db/ajax.css 2007-08-18 20:36:55 UTC (rev 49) @@ -1,221 +0,0 @@ -* -{ - padding: 0; - margin: 0; - border: 0; -} - -a -{ - text-decoration: none; -} - -img -{ - display: block; -} - -html -{ - padding: 10px; -} - -h1, -h1 a -{ - font-size: 1.2em; - text-align: center; - color: #d0d0d0; -} - - - -/* --- ids --- */ - -#themes -{ - position: absolute; - top: 10px; - right: 10px; -} - -#selectedalbum -{ - margin-top: 5px; - clear: both; - float: left; -} - -/* --- folders --- */ - -.image a -{ - height: 100px; - width: 100px; - display: block; - padding: 14px 25px; - border-bottom: 1px solid #ccc; -} - -.folder, -.thumbnail -{ - height: 150px; - width: 150px; - display: block; - float: left; - margin: 0 5px 5px 0; - border: 1px solid #ccc; - position: relative; -} - - -/* --- icons --- */ - -.icon -{ - position: absolute; - top: 4px; - left: 15px; -} - - -/* --- image names --- */ - -.name, -#loadingspan, -#linktospan a -{ - color: #f0f0f0; - font-weight: bold; - padding: 3px 0; - text-align: center; - display: block; - overflow: hidden; - font-size: 0.7em; -} - -/* --- expanded image --- */ - -#linktospan a -{ - padding: 4px 0; -} - -#linktospan a img -{ - position: absolute; - top: 2px; - left: 3px; -} - - -#expandedimage -{ - border: 1px solid #ccc; - float: left; - clear: both; - margin-top: 5px; -} - -#expandedimagespan -{ - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; - padding: 5px; -} - -#loadingspan -{ - padding: 3px 5px; - border-bottom: 1px solid #ccc; -} - -/* --- hover actions --- */ - -a:hover, -#breadcrumbtrail ul li a:hover -{ - cursor: pointer; -} - - -/*** BACKGROUND ***/ - -html, -.selected a, -#linktospan a:hover, -#breadcrumbtrail ul li a:hover, -#breadcrumbtrail ul li ul li.selected -{ - background-color: #303030; -} - -.folder, -.thumbnail, -#expandedimage, -#breadcrumbtrail ul li -{ - background-color: #505050; -} - -#linktospan a, -.image a:hover, -#breadcrumbtrail ul li ul li a:hover -{ - background-color: #707070; -} - - -#loadingspan -{ - background-color: #cc0022; -} - - -/*** BREADCRUMB TRAIL ***/ - -#breadcrumbtrail ul -{ - list-style: none; -} - -#breadcrumbtrail a -{ - display: block; - width: 150px; -} - -#breadcrumbtrail img -{ - display: none; -} - -#breadcrumbtrail ul li -{ - margin-right: 5px; - float: left; - width: 150px; - border: 1px solid #ccc; -} -#breadcrumbtrail ul li ul -{ - border: 1px solid #ccc; - left: -999em; - position: absolute; - width: 150px; - z-index: 10; -} - - -#breadcrumbtrail ul li ul li -{ - border: none; -} - -#breadcrumbtrail ul li.over ul, -#breadcrumbtrail ul li:hover ul -{ - left: auto; - margin-left: -1px; -} \ No newline at end of file Copied: trunk/.themes/db/db.css (from rev 45, trunk/.themes/db/ajax.css) =================================================================== --- trunk/.themes/db/db.css (rev 0) +++ trunk/.themes/db/db.css 2007-08-18 20:36:55 UTC (rev 49) @@ -0,0 +1,221 @@ +* +{ + padding: 0; + margin: 0; + border: 0; +} + +a +{ + text-decoration: none; +} + +img +{ + display: block; +} + +html +{ + padding: 10px; +} + +h1, +h1 a +{ + font-size: 1.2em; + text-align: center; + color: #d0d0d0; +} + + + +/* --- ids --- */ + +#themes +{ + position: absolute; + top: 10px; + right: 10px; +} + +#selectedalbum +{ + margin-top: 5px; + clear: both; + float: left; +} + +/* --- folders --- */ + +.image a +{ + height: 100px; + width: 100px; + display: block; + padding: 14px 25px; + border-bottom: 1px solid #ccc; +} + +.folder, +.thumbnail +{ + height: 150px; + width: 150px; + display: block; + float: left; + margin: 0 5px 5px 0; + border: 1px solid #ccc; + position: relative; +} + + +/* --- icons --- */ + +.icon +{ + position: absolute; + top: 4px; + left: 15px; +} + + +/* --- image names --- */ + +.name, +#loadingspan, +#linktospan a +{ + color: #f0f0f0; + font-weight: bold; + padding: 3px 0; + text-align: center; + display: block; + overflow: hidden; + font-size: 0.7em; +} + +/* --- expanded image --- */ + +#linktospan a +{ + padding: 4px 0; +} + +#linktospan a img +{ + position: absolute; + top: 2px; + left: 3px; +} + + +#expandedimage +{ + border: 1px solid #ccc; + float: left; + clear: both; + margin-top: 5px; +} + +#expandedimagespan +{ + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; + padding: 5px; +} + +#loadingspan +{ + padding: 3px 5px; + border-bottom: 1px solid #ccc; +} + +/* --- hover actions --- */ + +a:hover, +#breadcrumbtrail ul li a:hover +{ + cursor: pointer; +} + + +/*** BACKGROUND ***/ + +html, +.selected a, +#linktospan a:hover, +#breadcrumbtrail ul li a:hover, +#breadcrumbtrail ul li ul li.selected +{ + background-color: #303030; +} + +.folder, +.thumbnail, +#expandedimage, +#breadcrumbtrail ul li +{ + background-color: #505050; +} + +#linktospan a, +.image a:hover, +#breadcrumbtrail ul li ul li a:hover +{ + background-color: #707070; +} + + +#loadingspan +{ + background-color: #cc0022; +} + + +/*** BREADCRUMB TRAIL ***/ + +#breadcrumbtrail ul +{ + list-style: none; +} + +#breadcrumbtrail a +{ + display: block; + width: 150px; +} + +#breadcrumbtrail img +{ + display: none; +} + +#breadcrumbtrail ul li +{ + margin-right: 5px; + float: left; + width: 150px; + border: 1px solid #ccc; +} +#breadcrumbtrail ul li ul +{ + border: 1px solid #ccc; + left: -999em; + position: absolute; + width: 150px; + z-index: 10; +} + + +#breadcrumbtrail ul li ul li +{ + border: none; +} + +#breadcrumbtrail ul li.over ul, +#breadcrumbtrail ul li:hover ul +{ + left: auto; + margin-left: -1px; +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <esp...@us...> - 2007-08-18 20:36:08
|
Revision: 48 http://picfinity.svn.sourceforge.net/picfinity/?rev=48&view=rev Author: espadav8 Date: 2007-08-18 13:35:54 -0700 (Sat, 18 Aug 2007) Log Message: ----------- Add the first parts of the DB backend in (likely to change a fair bit) Modified Paths: -------------- trunk/index.php Added Paths: ----------- trunk/db.inc Added: trunk/db.inc =================================================================== --- trunk/db.inc (rev 0) +++ trunk/db.inc 2007-08-18 20:35:54 UTC (rev 48) @@ -0,0 +1,23 @@ +<?php + $db_host = "www.espadav8.co.uk"; + $db_user = "espadav8_picfin"; + $db_pass = "picfin_pass"; + $db_name = "espadav8_picfinity"; + + $db_connection = mysql_pconnect($db_host, $db_user, $db_pass); + + if (!$db_connection) + { + echo "Couldn't connect to the DB, disabling"; + die(); + } + else + { + $selected_table = mysql_select_db($db_name); + if (!$selected_table) + { + echo "Couldn't select table"; + die(); + } + } +?> Modified: trunk/index.php =================================================================== --- trunk/index.php 2007-08-18 20:34:19 UTC (rev 47) +++ trunk/index.php 2007-08-18 20:35:54 UTC (rev 48) @@ -1,14 +1,14 @@ <?php // site options $site_name = "Picfinity"; - + // here we either get the theme posted in // or if there's one stored in the cookie use that one // otherwise use the default one if ($_POST['theme']) { setcookie("theme", $_POST['theme']); - $theme = $_POST['theme']; + $theme = $_POST['theme']; } else if ($_COOKIE['theme']) { @@ -17,9 +17,9 @@ else { // set the name of the default theme here - $theme = "ajax" ; + $theme = "db" ; } - + if ($_GET['id']) { $post_id = $_GET['id']; @@ -28,40 +28,78 @@ { $post_id = 0; } - + // create thumbnails for images that don't have one already $create_thumbnails = true; - + // create a flat HTML version of the page $create_html = false; - + // create the gallery.xml file (for use by themes $create_xml = true; - + // use the PEAR module to create the XML $use_pear = false; - + // Allow the users to change the theme - // this needs the PHP version of the page + // this needs the PHP version of the page $enable_themes = true; - + // thumbnail sizes $thumbnail_width = 100; $thumbnail_height = 100; + // use the database + $use_db = true; + + if ($use_db) + { + require_once ('db.inc'); + if (!$db_connection) + { + $use_db = false; + } + else + { + if ($selected_table) + { + $result = mysql_query("SELECT image_md5 FROM images"); + if (!$result) + { + echo 'Invalid query: ' . mysql_error() . "\n"; + echo 'Whole query: ' . $query; + $use_db = false; + } + else + { + $current_images = array(); + while ($row = mysql_fetch_row($result)) + { + $current_images[] = $row[0]; + } + mysql_free_result($result); + } + } + else + { + $use_db = false; + } + } + } + // valid images to be shown $valid_image_formats = array('png', 'gif', 'jpg', 'jpeg', 'bmp'); - + // get the layout of the current dir $site_layout = create_folder_layout('.'); - + // create the XML of the layout // if we're not using the PEAR module then the XML will have already been returned if ($use_pear) $xml = array_to_xml($site_layout); else $xml = $site_layout; - + // create the XML file if we've been told to if ($create_xml) { @@ -69,10 +107,10 @@ fwrite($fh, $xml); fclose($fh); } - + // pass the XML to the theme and get the HTML back $html = xml_to_xhtml($xml, ".themes/$theme/$theme.xsl", array('title' => $site_name, 'post_id' => $post_id)); - + // create the flat version if we need to if ($create_html) { @@ -80,27 +118,29 @@ fwrite($fh, $html); fclose($fh); } - + + if ($use_db) + { + mysql_close($db_connection); + } + // echo the HTML to the screen echo $html; - + // this function takes a folder path and creates a layout of the folder and sub folders function create_folder_layout($folder) { - global $valid_image_formats; - global $create_thumbnails; - global $use_pear; - global $enable_themes; - + global $valid_image_formats, $create_thumbnails, $use_pear, $enable_themes, $use_db, $current_images; + // get the name of the folder or '' if it's the root $name = substr($folder, strrpos($folder, '/') + 1); - + // create a folder ID $folder_id = "id" . md5($folder); - + // add the folder to the Array (for use by the PEAR route) $layout = array('name' => $name, 'id' => $folder_id); - + // create the non-PEAR XML if ($name == "") $folder_layout_xml = "<?xml version=\"1.0\"?>" @@ -110,15 +150,15 @@ . "<layout id=\"$folder_id\" name=\"\">\n"; else $folder_layout_xml = "<folder id=\"$folder_id\" name=\"$name\">\n"; - + // get a listing of the files/folder $dh = opendir($folder); while (false !== ($filename = readdir($dh))) { $folder_contents[] = $filename; } - + sort($folder_contents); - + // for each entry while (list(,$folder_entry) = each($folder_contents)) { @@ -132,13 +172,13 @@ else $folder_layout_xml .= create_themes_layout(); } - + // else if it starts with a . ignore it else if (strpos($folder_entry, '.') === 0) { continue; } - + // if it's a directory and doesn't start with a . then create a folder layout for it else if (is_dir($folder . '/' . $folder_entry)) { @@ -148,12 +188,12 @@ else $folder_layout_xml .= create_folder_layout($folder . '/' . $folder_entry); } - + // otherwise check to see if it's an image else { $ext = strtolower(substr($folder_entry, strrpos($folder_entry, '.') + 1)); - + if (in_array($ext, $valid_image_formats)) { // create a thumbnail if we've been told to @@ -164,37 +204,47 @@ $image_id = "id" . md5($folder . '/' . $folder_entry); $layout['image'][] = array('id' => $image_id, 'file' => $folder_entry); $folder_layout_xml .= "\t<image id=\"$image_id\" file=\"$folder_entry\" />\n"; + + if (($use_db) && (!in_array($image_id, $current_images))) + { + $query = "INSERT INTO images (image_md5) VALUES ('$image_id')"; + $result = mysql_query($query); + if (!$result) + { + die (mysql_error()); + } + } } } } - + // close up the hand-coded XML if ($name == "") $folder_layout_xml .= "</layout>\n"; else $folder_layout_xml .= "</folder>\n"; - + // return the correct layout (XML or Array) if ($use_pear) return $layout; else return $folder_layout_xml; } - + function create_themes_layout() { global $use_pear; - + $themes_id = "id" . md5(".themes"); - + // create the themes node $layout = array('name' => '.themes', 'id' => $themes_id); $theme_xml = "<themes id=\"$themes_id\" name=\".themes\">\n"; - + // get the themes $dh = opendir(".themes"); while (false !== ($filename = readdir($dh))) { $folder_contents[] = $filename; } - + sort($folder_contents); - + // for each entry while (list(,$folder_entry) = each($folder_contents)) { @@ -203,7 +253,7 @@ { continue; } - // otherwise if it's a dir assume it's a theme and add it to the list + // otherwise if it's a dir assume it's a theme and add it to the list else if (is_dir(".themes/" . $folder_entry)) { $theme_id = md5(".themes/" . $folder_entry); @@ -211,24 +261,24 @@ $theme_xml .= "\t<theme id=\"$theme_id\" name=\"$folder_entry\" />\n"; } } - + $theme_xml .= "</themes>\n"; - + if ($use_pear) return $layout; else return $theme_xml; } - + function create_thumbnail($folder, $image, $ext) { global $thumbnail_width; global $thumbnail_height; - + if (!is_dir('.thumbs/'.$folder)) { MakeDirectory('.thumbs/'.$folder, 0777); chmod('.thumbs/'.$folder, 0777); } - + $src_img; switch ($ext) { @@ -249,10 +299,10 @@ return; break; } - + $old_x = imageSX($src_img); $old_y = imageSY($src_img); - + if ($old_x > $old_y) { $thumb_w = $thumbnail_width; $thumb_h = $old_y * ($thumbnail_height/$old_x); @@ -265,10 +315,10 @@ $thumb_w = $thumbnail_width; $thumb_h = $thumbnail_height; } - + $dst_img = ImageCreateTrueColor($thumb_w, $thumb_h); imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y); - + switch ($ext) { case 'png': @@ -285,13 +335,13 @@ imagebmp($dst_img, '.thumbs/'.$folder.'/'.$image); break; } - + imagedestroy($dst_img); imagedestroy($src_img); - + return; } - + function array_to_xml(&$array, $tag_name = 'image', $headless = false) { error_reporting(E_ALL ^ E_NOTICE); @@ -330,7 +380,7 @@ // return the XML document return $Serializer->getSerializedData(); } - + function xml_to_xhtml($xml, $xsl_file, $params = array()) { $ver = explode( '.', PHP_VERSION ); @@ -362,7 +412,7 @@ return $xsl->transformToXML($doc); } } - + function MakeDirectory($dir, $mode = 0755) { if (is_dir($dir) || @mkdir($dir,$mode)) return TRUE; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |